@sapui5/sap.fe.navigation 1.120.16 → 1.120.18
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
CHANGED
|
@@ -580,11 +580,8 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
580
580
|
oMyDeferred.resolve(oAppStateData, oStartupParameters, navType);
|
|
581
581
|
};
|
|
582
582
|
const failureHandlerHybridState = function (error, _ref, navType) {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
_ref,
|
|
586
|
-
navType
|
|
587
|
-
});
|
|
583
|
+
error = oNavHandler._createTechnicalError("NavigationHandler.getAppState.failed");
|
|
584
|
+
oMyDeferred.reject(error, _ref, navType);
|
|
588
585
|
};
|
|
589
586
|
if (hybridIAppStateKeyParams !== undefined && iAppStateHybridDeferred !== undefined) {
|
|
590
587
|
iAppStateHybridDeferred.done(successHandlerHybridState);
|
|
@@ -2259,4 +2256,4 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
2259
2256
|
const NavigationHandlerUI5Class = BaseObject.extend("sap.fe.navigation.NavigationHandler", NavigationHandler.prototype);
|
|
2260
2257
|
return NavigationHandlerUI5Class;
|
|
2261
2258
|
}, false);
|
|
2262
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwib0NvbnRyb2xsZXIiLCJzTW9kZSIsInNQYXJhbUhhbmRsaW5nTW9kZSIsIl9hVGVjaG5pY2FsUGFyYW1hdGVycyIsIl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhIiwic0FwcFN0YXRlS2V5Iiwib0FwcERhdGEiLCJpQ2FjaGVIaXQiLCJpQ2FjaGVNaXNzIiwiX3JJQXBwU3RhdGVPbGQiLCJSZWdFeHAiLCJfcklBcHBTdGF0ZU9sZEF0U3RhcnQiLCJfcklBcHBTdGF0ZU5ldyIsIk5hdkVycm9yIiwiVUlDb21wb25lbnQiLCJvUm91dGVyIiwiZ2V0Um91dGVyIiwib0NvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50IiwiX2dldFJvdXRlciIsImdldEFwcENvbXBvbmVudCIsImdldENvbXBvbmVudERhdGEiLCJVUkxQYXJhbVdpbnMiLCJJbnNlcnRJblNlbE9wdCIsIlNlbFZhcldpbnMiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlIiwic2FwIiwidXNoZWxsIiwiQ29udGFpbmVyIiwiZ2V0U2VydmljZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jIiwiZ2V0U2VydmljZUFzeW5jIiwidGhlbiIsIm9Dcm9zc0FwcE5hdlNlcnZpY2UiLCJjYXRjaCIsIkxvZyIsImVycm9yIiwiZ2V0Um91dGVyRm9yIiwicmVnaXN0ZXJOYXZpZ2F0ZUNhbGxiYWNrIiwiZm5DYWxsYmFjayIsIl9uYXZpZ2F0ZUNhbGxiYWNrIiwibmF2aWdhdGUiLCJzU2VtYW50aWNPYmplY3QiLCJzQWN0aW9uTmFtZSIsInZOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm9Jbm5lckFwcERhdGEiLCJmbk9uRXJyb3IiLCJvRXh0ZXJuYWxBcHBEYXRhIiwic05hdk1vZGUiLCJzU2VsZWN0aW9uVmFyaWFudCIsIm1QYXJhbWV0ZXJzIiwib1hBcHBEYXRhT2JqIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwiYkV4UGxhY2UiLCJvVG1wRGF0YSIsIm9OYXZIYW5kbGVyIiwib0NvbXBvbmVudERhdGEiLCJzdGFydHVwUGFyYW1ldGVycyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm9FbnJpY2hlZFNlbFZhciIsIl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyIsIlNlbGVjdGlvblZhcmlhbnQiLCJvTmF2aWdhdGlvblNlbFZhciIsInRvSlNPTlN0cmluZyIsInNlbGVjdGlvblZhcmlhbnQiLCJfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyIsInRvSlNPTk9iamVjdCIsIl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiIsIl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50Iiwib05hdkFyZ3VtZW50cyIsInRhcmdldCIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwicGFyYW1zIiwiZm5OYXZpZ2F0ZSIsImZuTmF2RXhwbGFjZSIsInNOZXdIcmVmUHJvbWlzZSIsImhyZWZGb3JFeHRlcm5hbEFzeW5jIiwic05ld0hyZWYiLCJvcGVuV2luZG93Iiwib0Vycm9yIiwiX2ZuU2F2ZUFwcFN0YXRlQXN5bmMiLCJvU2F2ZUFwcFN0YXRlUmV0dXJuIiwiYXBwU3RhdGVLZXkiLCJwdG9FeHQiLCJ0b0V4dGVybmFsIiwiZm5TdG9yZUFuZE5hdmlnYXRlIiwic3RvcmVJbm5lckFwcFN0YXRlQXN5bmMiLCJyZXBsYWNlSGFzaCIsIm9TdXBwb3J0ZWRQcm9taXNlIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwiZG9uZSIsIm9UYXJnZXRzIiwic3VwcG9ydGVkIiwiZmFpbCIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiYklzWGFwcFN0YXRlTmF2aWdhdGlvbiIsInRoYXQiLCJvU3RhcnR1cFByb21pc2UiLCJnZXRTdGFydHVwQXBwU3RhdGUiLCJvQXBwU3RhdGUiLCJnZXREYXRhIiwic3RyaW5naWZ5IiwieCIsInByb21pc2UiLCJvU2VsVmFyIiwiVVJMUGFyYW1zIiwic2V0VGVjaG5pY2FsUGFyYW1ldGVycyIsImFUZWNobmljYWxQYXJhbWV0ZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0VGVjaG5pY2FsUGFyYW1ldGVycyIsImNvbmNhdCIsIl9pc1RlY2huaWNhbFBhcmFtZXRlciIsInNQYXJhbWV0ZXJOYW1lIiwidG9Mb3dlckNhc2UiLCJpbmRleE9mIiwiX2lzRkVQYXJhbWV0ZXIiLCJzUHJvcE5hbWUiLCJpIiwiYVNlbFZhclByb3BOYW1lcyIsImdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzIiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwib1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldFBhcmFtZXRlck5hbWVzIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsImdldFZhbHVlIiwiX2FkZFBhcmFtZXRlclZhbHVlcyIsImFQcm9wTmFtZXMiLCJvU2VsVmFyaWFudCIsInNTaWduIiwic09wdGlvbiIsIm9WYWx1ZXMiLCJhZGRTZWxlY3RPcHRpb24iLCJvSGFzaENoYW5nZXIiLCJzQXBwSGFzaE9sZCIsInNBcHBIYXNoTmV3IiwiX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5IiwibUlubmVyQXBwRGF0YSIsImJJbW1lZGlhdGVIYXNoUmVwbGFjZSIsImJTa2lwSGFzaFJlcGxhY2UiLCJmblJlcGxhY2VIYXNoIiwiaXNFbXB0eU9iamVjdCIsInNBcHBTdGF0ZUtleUNhY2hlZCIsImJJbm5lckFwcERhdGFFcXVhbCIsImZuT25BZnRlclNhdmUiLCJfc2F2ZUFwcFN0YXRlQXN5bmMiLCJzdG9yZUlubmVyQXBwU3RhdGUiLCJfc2F2ZUFwcFN0YXRlIiwic3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybiIsIm9BcHBTdGF0ZVByb21pc2UiLCJwcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zIiwib1RhYmxlRXZlbnRQYXJhbWV0ZXJzIiwibVNlbWFudGljQXR0cmlidXRlcyIsInNlbWFudGljQXR0cmlidXRlcyIsImZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4iLCJtU3ViU2VtYW50aWNBdHRyaWJ1dGVzIiwic1N1YlNlbGVjdGlvblZhcmlhbnQiLCJpU3VwcHJlc3Npb25CZWhhdmlvciIsInJhaXNlRXJyb3JPbk51bGwiLCJyYWlzZUVycm9yT25VbmRlZmluZWQiLCJvTWl4ZWRTZWxWYXIiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsImZuT25Db250YWluZXJTYXZlIiwic2V0U2VtYW50aWNBdHRyaWJ1dGVzIiwic2V0QXBwU3RhdGVLZXkiLCJvcGVuIiwib1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UiLCJfZ2V0QXBwU3RhdGVLZXlBbmRVcmxQYXJhbWV0ZXJzIiwiX2dldEFwcFNwZWNpZmljSGFzaCIsImFwcEhhc2giLCJjcm9zc0FwcFNlcnZpY2UiLCJocmVmRm9yQXBwU3BlY2lmaWNIYXNoQXN5bmMiLCJtZXNzYWdlIiwiRXJyb3IiLCJTdHJpbmciLCJfbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudCIsInNQcm9wZXJ0eU5hbWUiLCJ2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSIsIkRhdGUiLCJ0b0pTT04iLCJ0b1N0cmluZyIsImlnbm9yZUVtcHR5U3RyaW5nIiwiaW5mbyIsInZTZW1hbnRpY0F0dHJpYnV0ZXMiLCJvTmV3U2VsVmFyaWFudCIsImZpbHRlclVybCIsImdldEZpbHRlckNvbnRleHRVcmwiLCJzZXRGaWx0ZXJDb250ZXh0VXJsIiwiY29udGV4dFVybCIsImdldFBhcmFtZXRlckNvbnRleHRVcmwiLCJzZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwiZm9yRWFjaCIsImFQYXJhbWV0ZXJzIiwiZ2V0U2VsZWN0T3B0aW9uIiwiZ2V0UGFyYW1ldGVyIiwiYVNlbE9wdGlvbk5hbWVzIiwiYVNlbGVjdE9wdGlvbiIsImoiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiSGlnaCIsIl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nIiwidlNlbGVjdGlvblZhcmlhbnQiLCJ2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCIsIl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZSIsIm9SZXR1cm4iLCJfc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybiIsIl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJnZXRLZXkiLCJvQXBwRGF0YUZvclNhdmUiLCJfZmV0Y2hBcHBEYXRhRm9yU2F2ZSIsInNldERhdGEiLCJvU2F2ZVByb21pc2UiLCJzYXZlIiwiZXh0ZW5kIiwidGFibGVWYXJpYW50SWQiLCJjdXN0b21EYXRhIiwicHJlc2VudGF0aW9uVmFyaWFudCIsInZhbHVlVGV4dHMiLCJzZW1hbnRpY0RhdGVzIiwib0FwcERhdGFDbG9uZSIsIk9iamVjdCIsImFzc2lnbiIsIm1lcmdlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZUFzeW5jIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsIm9EZWZlcnJlZCIsImdldEFwcFN0YXRlIiwib0FwcERhdGFMb2FkZWQiLCJkYXRhIiwiYU1hdGNoZXMiLCJleGVjIiwic05ld0lBcHBTdGF0ZSIsImZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciIsInNTdWJBcHBIYXNoIiwidGVzdCIsInJlcGxhY2UiLCJzTmVlZGxlIiwiZm5SZXBsYWNlT2xkQXBwcm9hY2giLCJyT2xkQXBwcm9hY2giLCJhc3NlcnQiLCJtVVJMUGFyYW1ldGVycyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiYVNlbGVjdE9wdGlvbnMiLCJhUGFyYW1ldGVyTmFtZXMiLCJzUGFyYW1ldGVyVmFsdWUiLCJzRXJyb3JDb2RlIiwic2V0TW9kZWwiLCJvTW9kZWwiLCJfb01vZGVsIiwiX2dldE1vZGVsIiwiZ2V0TW9kZWwiLCJfcmVtb3ZlQWxsUHJvcGVydGllcyIsIm9EYXRhIiwiX3JlbW92ZVByb3BlcnRpZXMiLCJhRmlsdGVyTmFtZSIsImFQYXJhbWV0ZXJOYW1lIiwic05hbWUiLCJTZWxlY3RPcHRpb25zIiwic29tZSIsIm9WYWx1ZSIsIm5JZHgiLCJQcm9wZXJ0eU5hbWUiLCJzcGxpY2UiLCJUZXh0cyIsIm9UZXh0cyIsIlByb3BlcnR5VGV4dHMiLCJEYXRlcyIsIm9EYXRlcyIsIlBhcmFtZXRlcnMiLCJfaXNUZXJtVHJ1ZSIsIm9Qcm9wZXJ0eSIsInNUZXJtIiwiZklzVGVybURlZmF1bHRUcnVlIiwib1Rlcm0iLCJCb29sIiwiX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQiLCJfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsIl9pc01lYXN1cmVQcm9wZXJ0eSIsIl9pc1RvQmVFeGNsdWRlZCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJzRW50aXR5U2V0TmFtZSIsIl9jb25zdHJ1Y3RDb250ZXh0VXJsIiwic1NlcnZlclVybCIsImlzQSIsIl9nZXRTZXJ2ZXJVcmwiLCJvU2VydmljZVVSSSIsIlVSSSIsImdldFNlcnZpY2VVcmwiLCJhYnNvbHV0ZVRvIiwiZG9jdW1lbnQiLCJiYXNlVVJJIiwibGFzdEluZGV4T2YiLCJzdWJzdHIiLCJzU2VydmljZVVybCIsIm9BZGFwdGVkRGF0YSIsIkZpbHRlckNvbnRleHRVcmwiLCJQYXJhbWV0ZXJDb250ZXh0VXJsIiwiYVNlbnNpdGl2ZUZpbHRlck5hbWUiLCJhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSIsIm9FbnRpdHlTZXQiLCJvRW50aXR5RGVmIiwib1N1YkVudGl0eURlZiIsIm9FbmRSb2xlIiwiYUZpbHRlckNvbnRleHRQYXJ0IiwiYVBhcmFtQ29udGV4dFBhcnQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0U2VydmljZU1ldGFkYXRhIiwic3BsaXQiLCJnZXRPRGF0YUVudGl0eVNldCIsImdldE9EYXRhRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eSIsInB1c2giLCJuYW1lIiwibmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZCIsInR5cGUiLCJtdWx0aXBsaWNpdHkiLCJfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyIsImFNZWFzdXJlRmlsdGVyTmFtZSIsImFNZWFzdXJlUGFyYW1ldGVyTmFtZSIsImJNZWFzdXJlIiwib1NWIiwiZ2V0T2JqZWN0Iiwic0VudGl0eVNldCIsImFQcm9wZXJ0eU5hbWVzIiwiZ2V0UHJvcGVydHlOYW1lcyIsImZuSXNTZW5zaXRpdmVEYXRhIiwic1Byb3AiLCJlc05hbWUiLCJhUHJvcGVydHlBbm5vdGF0aW9ucyIsIl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhIiwib0ZpZWxkQ29udHJvbCIsImsiLCJzUHJvcGVydHkiLCJnZXRJQXBwU3RhdGVLZXkiLCJCYXNlT2JqZWN0IiwiTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyIsInByb3RvdHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTmF2aWdhdGlvbkhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJzYXAvYmFzZS9hc3NlcnRcIjtcbmltcG9ydCBleHRlbmQgZnJvbSBcInNhcC9iYXNlL3V0aWwvZXh0ZW5kXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBVSUNvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvVUlDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgSGFzaENoYW5nZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvSGFzaENoYW5nZXJcIjtcbmltcG9ydCBWMk9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92Mi9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgVjRPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9qcXVlcnlcIjtcbmltcG9ydCBvcGVuV2luZG93IGZyb20gXCJzYXAvdWkvdXRpbC9vcGVuV2luZG93XCI7XG5pbXBvcnQgTmF2RXJyb3IgZnJvbSBcIi4vTmF2RXJyb3JcIjtcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgTmF2TGlicmFyeSBmcm9tIFwiLi9saWJyYXJ5XCI7XG5cbi8qKlxuICogU3RydWN0dXJlIG9mIHN0b3JlZCBhcHAgc3RhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5uZXJBcHBEYXRhIHtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0LyoqXG5cdCAqIFNyaW5naWZpZWQgSlNPTiBvYmplY3QgYXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCBmcm9tIGdldERhdGFTdWl0ZUZvcm1hdCgpIG9mIHRoZSBTbWFydEZpbHRlckJhciBjb250cm9sXG5cdCAqL1xuXHRzZWxlY3Rpb25WYXJpYW50Pzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJRCBvZiB0aGUgU21hcnRUYWJsZSB2YXJpYW50LlxuXHQgKi9cblx0dGFibGVWYXJpYW50SWQ/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFyYml0cmFyeSBkYXRhLlxuXHQgKi9cblx0Y3VzdG9tRGF0YT86IG9iamVjdDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgc3RhdGUgb2YgdGhlIGFwcC5cblx0ICovXG5cdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucy5cblx0ICovXG5cdHZhbHVlVGV4dHM/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHNlbWFudGljRGF0ZXMgZmlsdGVyIGluZm9ybWF0aW9uLlxuXHQgKi9cblx0c2VtYW50aWNEYXRlcz86IG9iamVjdDtcbn1cblxuLy8gc2hvcnRjdXRzIGZvciBzYXAudWkuZ2VuZXJpYy5hcHAgZW51bXNcbmNvbnN0IE5hdlR5cGUgPSBOYXZMaWJyYXJ5Lk5hdlR5cGU7XG5jb25zdCBQYXJhbUhhbmRsaW5nTW9kZSA9IE5hdkxpYnJhcnkuUGFyYW1IYW5kbGluZ01vZGU7XG5jb25zdCBTdXBwcmVzc2lvbkJlaGF2aW9yID0gTmF2TGlicmFyeS5TdXBwcmVzc2lvbkJlaGF2aW9yO1xuY29uc3QgTW9kZSA9IE5hdkxpYnJhcnkuTW9kZTtcblxuY29uc3QgSUFQUF9TVEFURSA9IFwic2FwLWlhcHAtc3RhdGVcIjtcbmNvbnN0IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkgPSBcInNhcC11c2hlbGwtZGVmYXVsdGVkUGFyYW1ldGVyTmFtZXNcIjtcbmNvbnN0IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSA9IFwibmhIeWJyaWRJQXBwU3RhdGVLZXlcIjtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzdWNjZXNzb3Igb2Yge0BsaW5rIHNhcC51aS5nZW5lcmljLmFwcC5uYXZpZ2F0aW9uLnNlcnZpY2UuTmF2aWdhdGlvbkhhbmRsZXJ9Ljxicj4gQ3JlYXRlcyBhIG5ldyBOYXZpZ2F0aW9uSGFuZGxlciBjbGFzcyBieSBwcm92aWRpbmcgdGhlIHJlcXVpcmVkIGVudmlyb25tZW50LiA8YnI+XG4gKiBUaGUgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXI8L2NvZGU+IHN1cHBvcnRzIHRoZSB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBBbGwgcHJvcGVydGllcyB0aGF0IGFyZSBwYXJ0IG9mXG4gKiA8Y29kZT5zZWxlY3Rpb25WYXJpYW50PC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUZXh0czwvY29kZT4gd2lsbCBiZSB2ZXJpZmllZCBpZiB0aGV5IGFyZSBhbm5vdGF0ZWQgYXNcbiAqIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlPC9jb2RlPiBvclxuICogPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dDwvY29kZT4gYW5kIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIGRhdGEgaXMgcGVyc2lzdGVkIGFzIHRoZSBhcHBcbiAqIHN0YXRlLjxicj5cbiAqIEFsc28sIGFsbCBwcm9wZXJ0aWVzIGFubm90YXRlZCBhcyA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZTwvY29kZT4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGEgc3RvcmVkIGFzIHRoZVxuICogeGFwcCBzdGF0ZS48YnI+XG4gKiBUbyB2ZXJpZnkgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHJlbW92ZWQsIHRoZSA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlcjwvY29kZT4gcmVxdWlyZXMgYW4gdW5uYW1lZCBtb2RlbCBvZiB0eXBlXG4gKiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWx9IG9uIGNvbXBvbmVudCBsZXZlbC4gSXQgaXMgcG9zc2libGUgdG8gc2V0IHN1Y2ggYSBtb2RlbCB1c2luZyB0aGUgPGNvZGU+c2V0TW9kZWw8L2NvZGU+XG4gKiBtZXRob2QuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoZSBjaGVjayBmb3IgZXhjbHVkZWQgZGF0YSByZXF1aXJlcyB0aGF0IHRoZSBPRGF0YSBtZXRhZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBjb21wbGV0ZWx5Ljxicj5cbiAqIElmIHRoZSBPRGF0YSBtZXRhZGF0YSBtb2RlbCBoYXMgbm90IGJlZW4gbG9hZGVkIGNvbXBsZXRlbHksIGFsbCBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgcmVxdWlyZXMgdGhhdCB0aGUgVVNoZWxsIHtAbGluayBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9ufSBpcyBhdmFpbGFibGUgYW5kIGluaXRpYWxpemVkLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgc2FwLnVpLmJhc2UuT2JqZWN0XG4gKiBAc2luY2UgMS44My4wXG4gKiBAbmFtZSBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkhhbmRsZXIgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0cHJpdmF0ZSBvUm91dGVyOiBhbnk7XG5cblx0cHJpdmF0ZSBvQ29tcG9uZW50OiBhbnk7XG5cblx0cHJpdmF0ZSBfb01vZGVsOiBhbnk7XG5cblx0cHJpdmF0ZSBzUGFyYW1IYW5kbGluZ01vZGU6IHN0cmluZztcblxuXHRwcml2YXRlIF9zTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8vIGxpc3Qgb2YgdGVjaG5pY2FsIHBhcmFtZXRlcnNcblx0cHJpdmF0ZSBfYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBbXCJoY3BBcHBsaWNhdGlvbklkXCJdO1xuXG5cdHByaXZhdGUgX29MYXN0U2F2ZWRJbm5lckFwcERhdGE6IGFueSA9IHtcblx0XHRzQXBwU3RhdGVLZXk6IFwiXCIsXG5cdFx0b0FwcERhdGE6IHt9LFxuXHRcdGlDYWNoZUhpdDogMCxcblx0XHRpQ2FjaGVNaXNzOiAwXG5cdH07XG5cblx0Lypcblx0ICogVGhlcmUgZXhpc3RzIGEgZ2VuZXJhdGlvbiBvZiBcIm9sZFwiIHNhcC1pYXBwLXN0YXRlcyB3aGljaCBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBVUkwgc2NoZW1hOlxuXHQgKiAjU2VtT2JqLWFjdGlvbiYvcm91dGUvc2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggVGhlIG5ldyBVUkwgc2NoZW1hIGlzOiAjU2VtT2JqLWFjdGlvbiYvcm91dGU/c2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggKG1pbmQgdGhlXG5cdCAqIGRpZmZlcmVuY2UgYmV0d2VlbiAvIGFuZCA/IGFib3ZlKSwgaS5lLiB0aGUgc2FwLWlhcHAtc3RhdGUgaGFzIGJlY29tZSBhIHBhcmFtZXRlciBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHNlY3Rpb24gaW4gdGhlIEFwcEhhc2ggc3RyaW5nLlxuXHQgKiBZZXQsIHRoaXMgdG9vbCBzaGFsbCBiZSBhYmxlIHRvIGRlYWwgZXZlbiB3aXRoIG9sZCBzYXAtaWFwcC1zdGF0ZXMuIFRoZXJlZm9yZSwgd2UgdXNlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIChySUFwcFN0YXRlT2xkIGFuZFxuXHQgKiBySUFwcFN0YXRlT2xkQXRTdGFydCkgYXMgZGVmaW5lZCBiZWxvdyB0byBzY2FuIGZvciB0aGVzZSBvbGQgdmFyaWFudHMuIFRoZSBuZXcgdmFyaWFudCBpcyBiZWluZyBzY2FubmVkIHVzaW5nIHJJQXBwU3RhdGVOZXcgYXMgUmVndWxhclxuXHQgKiBFeHByZXNzaW9uIHNlYXJjaCBzdHJpbmcuIENvbXBhdGliaWxpdHkgaXMgY2VudHJhbGx5IGVuc3VyZWQgYnkgdGhlIHR3byBtZXRob2RzIF9nZXRJbm5lckFwcFN0YXRlS2V5IGFuZCBfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkgKHNlZVxuXHQgKiBiZWxvdykuIE5ldmVyIHVzZSB0aGVzZSBSZWdFeHAgaW4gYSBtZXRob2Qgb24geW91ciBvd24sIGFzIGl0IHR5cGljYWxseSBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2lsbCBmYWxsIGludG8gdGhlIGNvbXBhdGliaWxpdHkgdHJhcCFcblx0ICovXG5cdC8vIFdhcm5pbmchIERvIG5vdCB1c2UgR0xPQkFMIGZsYWdzIGhlcmU7IFJlZ0V4cCBpbiBHTE9CQUwgbW9kZSBzdG9yZSB0aGUgbGFzdEluZGV4IHZhbHVlXG5cdC8vIFRoZXJlZm9yZSwgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIFJlZ0V4cCB3aWxsIHRoZW4gb25seSBzdGFydCBiZWdpbm5pbmcgd2l0aCB0aGF0IHN0b3JlZFxuXHQvLyBsYXN0SW5kZXguIFRodXMsIG11bHRpcGxlIGNhbGxzIHRoZXJlZm9yZSBjb3VsZCB5aWVsZCBzdHJhbmdlIHJlc3VsdHMuXG5cdC8vIE1vcmVvdmVyLCB0aGVyZSBzaGFsbCBvbmx5IGJlIGV4YWN0bHkgb25lIElBUFBfU1RBVEUgcGVyIFJlZ0V4cCBpbiBhbiBBcHBIYXNoLlxuXHQvLyBUaGVyZWZvcmUsIEdMT0JBTCBzZWFyY2ggc2hvdWxkIGJlIHN1cGVyZmx1b3VzLlxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkID0gbmV3IFJlZ0V4cChcIi9cIiArIElBUFBfU1RBVEUgKyBcIj0oW14vP10rKVwiKTtcblxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkQXRTdGFydCA9IG5ldyBSZWdFeHAoXCJeXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteLz9dKylcIik7XG5cblx0Lypcblx0ICogUmVndWxhciBFeHByZXNzaW9uIGluIHdvcmRzOiBTZWFyY2ggZm9yIHNvbWV0aGluZyB0aGF0IGVpdGhlciBzdGFydHMgd2l0aCA/IG9yICYsIGZvbGxvd2VkIGJ5IHRoZSB0ZXJtIFwic2FwLWlhcHAtc3RhdGVcIi4gVGhhdCBvbmUgaXNcblx0ICogZm9sbG93ZWQgYnkgYW4gZXF1YWwgc2lnbiAoPSkuIFRoZSBzdHVmZiB0aGF0IGlzIGFmdGVyIHRoZSBlcXVhbCBzaWduIGZvcm1zIHRoZSBmaXJzdCByZWdleHAgZ3JvdXAuIFRoaXMgZ3JvdXAgY29uc2lzdHMgb2YgYXQgbGVhc3Qgb25lXG5cdCAqIChvciBhcmJpdHJhcnkgbWFueSkgY2hhcmFjdGVycywgYXMgbG9uZyBhcyBpdCBpcyBub3QgYW4gYW1wZXJzYW5kIHNpZ24gKCYpLiBDaGFyYWN0ZXJzIGFmdGVyIHN1Y2ggYW4gYW1wZXJzYW5kIHdvdWxkIGJlIGlnbm9yZWQgYW5kIGRvXG5cdCAqIG5vdCBiZWxvbmcgdG8gdGhlIGdyb3VwLiBBbHRlcm5hdGl2ZWx5LCB0aGUgc3RyaW5nIGFsc28gbWF5IGVuZC5cblx0ICovXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVOZXcgPSBuZXcgUmVnRXhwKFwiWz8mXVwiICsgSUFQUF9TVEFURSArIFwiPShbXiZdKylcIik7XG5cblx0cHJpdmF0ZSBfbmF2aWdhdGVDYWxsYmFjazogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRlbXBvcmFyaWx5IGFkZGVkIGFnYWluIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gd2FzIChpbGxlZ2lhbGx5KSByZWx5aW5nIG9uIGl0LiBTaG91bGQgYmUgcmVtb3ZlZCBhZ2Fpbiwgb25jZSB0aGUgYXBwIGlzIGNvcnJlY3RlZFxuXHQgKi9cblx0cHJpdmF0ZSBJQVBQX1NUQVRFID0gSUFQUF9TVEFURTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IgcmVxdWlyaW5nIGEgY29udHJvbGxlci9jb21wb25lbnQgb3duaW5nIHRoZSBuYXZpZ2F0aW9uIGhhbmRsZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlciBVSTUgY29udHJvbGxlciB0aGF0IGNvbnRhaW5zIGEgcm91dGVyIGFuZCBhIGNvbXBvbmVudDsgdHlwaWNhbGx5IHRoZSBtYWluIGNvbnRyb2xsZXIgb2YgeW91ciBhcHBsaWNhdGlvbiwgZm9yXG5cdCAqICAgICAgICBleGFtcGxlLCBhIHN1YmNsYXNzIG9mIHRoZSBzYXAuY2Euc2NmbGQubWQuY29udHJvbGxlci5CYXNlRnVsbHNjcmVlbkNvbnRyb2xsZXIgaWYgc2NhZmZvbGRpbmcgaXMgdXNlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NNb2RlPXNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWNF0gTW9kZSB0byBiZSB1c2VkIHRvIGluZGljYXRlcyB0aGUgT2RhdGEgdmVyc2lvbiB1c2VkIGZvciBydW5ubmluZyB0aGUgTmF2aWdhdGlvbiBIYW5kbGVyLFxuXHQgKiAgICAgICAgc2VlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5Nb2RlfS48YnI+XG5cdCAqIFx0XHQgIE5vdGU6IE1vZGUgaGFzIHRvIGJlIHNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWMiB3aGVuZXZlciB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIE9EYXRhIFYyIGJhc2VkIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc1BhcmFtSGFuZGxpbmdNb2RlPVNlbFZhcldpbnNdIE1vZGUgdG8gYmUgdXNlZCB0byBoYW5kbGUgY29uZmxpY3RzIHdoZW4gbWVyZ2luZyBVUkwgcGFyYW1ldGVycyBhbmQgdGhlIFNlbGVjdGlvblZhcmlhbnQgY2xhc3MsXG5cdCAqICAgICAgICBzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlBhcmFtSGFuZGxpbmdNb2RlfVxuXHQgKiBAdGhyb3dzIEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaW4gY2FzZSBvZiBpbnB1dCBlcnJvcnMuIFZhbGlkIGVycm9yIGNvZGVzIGFyZTogPHRhYmxlPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGggYWxpZ249XCJsZWZ0XCI+TmF2RXJyb3IgY29kZTwvdGg+XG5cdCAqICAgICAgICAgPHRoIGFsaWduPVwibGVmdFwiPkRlc2NyaXB0aW9uPC90aD5cblx0ICogICAgICAgICA8L3RyPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGQ+TmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVDwvdGQ+XG5cdCAqICAgICAgICAgPHRkPkluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgaW52YWxpZDwvdGQ+XG5cdCAqICAgICAgICAgPC90cj5cblx0ICogICAgICAgICA8L3RhYmxlPlxuXHQgKi9cblx0Y29uc3RydWN0b3Iob0NvbnRyb2xsZXI6IENvbnRyb2xsZXIgfCBVSUNvbXBvbmVudCwgc01vZGU/OiBzdHJpbmcsIHNQYXJhbUhhbmRsaW5nTW9kZT86IHN0cmluZykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFvQ29udHJvbGxlcikge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRpZiAob0NvbnRyb2xsZXIgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gb0NvbnRyb2xsZXIuZ2V0Um91dGVyKCk7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGVvZiBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMuX2dldFJvdXRlcihvQ29udHJvbGxlcik7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCgpO1xuXHRcdH1cblxuXHRcdC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFNtYXJ0VGVtcGxhdGVzXG5cdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiB0aGlzLm9Db21wb25lbnQuZ2V0QXBwQ29tcG9uZW50KSB7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSB0aGlzLm9Db21wb25lbnQuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dHlwZW9mIHRoaXMub1JvdXRlciA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudCA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhICE9PSBcImZ1bmN0aW9uXCJcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuVVJMUGFyYW1XaW5zIHx8IHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuSW5zZXJ0SW5TZWxPcHQpIHtcblx0XHRcdHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlID0gc1BhcmFtSGFuZGxpbmdNb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSA9IFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM7IC8vIGRlZmF1bHRcblx0XHR9XG5cdFx0aWYgKHNNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdHRoaXMuX3NNb2RlID0gc01vZGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgc2hlbGwgbmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgTmF2aWdhdGlvbiBzZXJ2aWNlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2UoKSB7XG5cdFx0cmV0dXJuIHNhcC51c2hlbGwuQ29udGFpbmVyLmdldFNlcnZpY2UoXCJDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvblwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHNoZWxsIG5hdmlnYXRpb24gc2VydmljZS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIE5hdmlnYXRpb24gc2VydmljZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKSB7XG5cdFx0cmV0dXJuIHNhcC51c2hlbGwuQ29udGFpbmVyLmdldFNlcnZpY2VBc3luYyhcIkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXCIpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBpcyBub3QgYXZhaWxhYmxlLlwiKTtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuTk8uWEFQUFNFUlZJQ0VcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm91dGVyIG9iamVjdCBmb3IgbmF2aWdhdGlvbiBmb3IgdGhpcyBnaXZlbiBDb250cm9sbGVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgQ29udHJvbGxlciBmb3Igd2hpY2ggdGhlIFJvdXRlciBpbnN0YW5jZSBzaGFsbCBiZSBkZXRlcm1pbmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgUm91dGVyIGZvciB0aGUgZ2l2ZW4gQ29udHJvbGxlclxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFJvdXRlcihvQ29udHJvbGxlcjogQ29udHJvbGxlcikge1xuXHRcdHJldHVybiBVSUNvbXBvbmVudC5nZXRSb3V0ZXJGb3Iob0NvbnRyb2xsZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIHVzZWQgb25seSBieSBGRSBWMiB0byBnZXQgYWNjZXNzIHRvIHRvRXh0ZXJuYWwgcHJvbWlzZS5cblx0ICpcblx0ICogQHBhcmFtIGZuQ2FsbGJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJ5ICduYXZpZ2F0ZScgbWV0aG9kIGluIGNhc2Ugb2YgdG9FeHRlcm5hbCBpcyB1c2VkIHRvIG5hdmlnYXRlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVnaXN0ZXJOYXZpZ2F0ZUNhbGxiYWNrKGZuQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG5cdFx0dGhpcy5fbmF2aWdhdGVDYWxsYmFjayA9IGZuQ2FsbGJhY2s7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcnMgYSBjcm9zcy1hcHAgbmF2aWdhdGlvbiBhZnRlciBzYXZpbmcgdGhlIGlubmVyIGFuZCB0aGUgY3Jvc3MtYXBwIHN0YXRlcy4gVGhlIG5hdmlnYXRpb24gbW9kZSBiYXNlZCBvblxuXHQgKiA8Y29kZT5zYXAtdXNoZWxsLW5leHQtbmF2bW9kZTwvY29kZT4gaXMgdGFrZW4gaW50byBhY2NvdW50LiBJZiBzZXQgdG8gPGNvZGU+ZXhwbGFjZTwvY29kZT4gdGhlIGlubmVyIGFwcCBzdGF0ZSB3aWxsIG5vdCBiZSBjaGFuZ2VkLlxuXHQgKiA8Yj5Ob3RlOjwvYj4gVGhlIDxjb2RlPnNOYXZNb2RlPC9jb2RlPiBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBvdmVyd3JpdGUgdGhlIFNBUCBGaW9yaSBsYXVuY2hwYWQgZGVmYXVsdCBuYXZpZ2F0aW9uIGZvciBvcGVuaW5nIGEgVVJMXG5cdCAqIGluLXBsYWNlIG9yIGV4LXBsYWNlLlxuXHQgKiA8YnI+XG5cdCAqIDxiPk5vZGU6PC9iPiBJZiB0aGUgPGNvZGU+b0V4dGVybmFsQXBwRGF0YTwvY29kZT4gcGFyYW1ldGVyIGlzIG5vdCBzdXBwbGllZCwgdGhlIGV4dGVybmFsIGFwcCBkYXRhIHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvblxuXHQgKiB0aGUgPGNvZGU+b0lubmVyQXBwRGF0YTwvY29kZT4gZGF0YS48YnI+XG5cdCAqIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2wgPGI+UGFyYW1ldGVyczo8L2I+IDx0YWJsZT5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57b2JqZWN0fTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3I8L2I+PC90ZD5cblx0ICogPHRkPk5hdkVycm9yIG9iamVjdCAoaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSkgdGhhdCBkZXNjcmliZXMgd2hpY2gga2luZCBvZiBlcnJvciBvY2N1cnJlZDwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e3N0cmluZ308L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLmVycm9yQ29kZTwvYj48L3RkPlxuXHQgKiA8dGQ+Q29kZSB0byBpZGVudGlmeSB0aGUgZXJyb3I8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntzdHJpbmd9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvci50eXBlPC9iPjwvdGQ+XG5cdCAqIDx0ZD5TZXZlcml0eSBvZiB0aGUgZXJyb3IgKGluZm8vd2FybmluZy9lcnJvcik8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPnthcnJheX08L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLnBhcmFtczwvYj48L3RkPlxuXHQgKiA8dGQ+QW4gYXJyYXkgb2Ygb2JqZWN0cyAodHlwaWNhbGx5IHN0cmluZ3MpIHRoYXQgZGVzY3JpYmUgYWRkaXRpb25hbCB2YWx1ZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBnZW5lcmF0aW5nIHRoZSBtZXNzYWdlPC90ZD5cblx0ICogPC90YWJsZT4uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICogQGZ1bmN0aW9uIG5hdmlnYXRlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5wcm90b3R5cGVcblx0ICogQHBhcmFtIHNTZW1hbnRpY09iamVjdCBOYW1lIG9mIHRoZSBzZW1hbnRpYyBvYmplY3Qgb2YgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvbiBvZiB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gdk5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVycyBhcyBhbiBvYmplY3Qgd2l0aCBrZXkvdmFsdWUgcGFpcnMgb3IgYXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygc3VjaCBhbiBvYmplY3QuIElmIHBhc3NlZCBhcyBhbiBvYmplY3QsIHRoZSBwcm9wZXJ0aWVzIGFyZSBub3QgY2hlY2tlZCBhZ2FpbnN0IHRoZSA8Y29kZT5Jc1BvdGVudGlhbFNlbnNpdGl2ZTwvY29kZT4gb3IgPGNvZGU+TWVhc3VyZTwvY29kZT4gdHlwZS5cblx0ICogQHBhcmFtIG9Jbm5lckFwcERhdGEgT2JqZWN0IGZvciBzdG9yaW5nIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gZm5PbkVycm9yIENhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbmF2aWdhdGlvbiA8YnI+XG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhIE9iamVjdCBmb3Igc3RvcmluZyB0aGUgc3RhdGUgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgc3RhdGUgb2YgdGhlIGFwcCB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGVcblx0ICogICAgICAgIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnZhbHVlVGV4dHMgT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgZGVzY3JpcHRpb25zIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50IFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0LCB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4gSWYgbm90XG5cdCAqICAgICAgICBwcm92aWRlZCB0aGUgc2VsZWN0aW9uVmFyaWFudCB3aWxsIGJlIGNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSB2TmF2aWdhdGlvblBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBzTmF2TW9kZSBBcmd1bWVudCBpcyB1c2VkIHRvIG92ZXJ3cml0ZSB0aGUgRkxQLWNvbmZpZ3VyZWQgdGFyZ2V0IGZvciBvcGVuaW5nIGEgVVJMLiBJZiB1c2VkLCBvbmx5IHRoZVxuXHQgKiAgICAgICAgPGNvZGU+ZXhwbGFjZTwvY29kZT4gb3IgPGNvZGU+aW5wbGFjZTwvY29kZT4gdmFsdWVzIGFyZSBhbGxvd2VkLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBsZWFkIHRvIGFuIGV4Y2VwdGlvblxuXHQgKiAgICAgICAgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9OQVZfTU9ERTwvY29kZT4uXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIHNTZW1hbnRpY09iamVjdCA9IFwiU2FsZXNPcmRlclwiO1xuXHQgKiBcdHZhciBzQWN0aW9uTmFtZSA9IFwiY3JlYXRlXCI7XG5cdCAqXG5cdCAqIFx0Ly9zaW1wbGUgcGFyYW1ldGVycyBhcyBPYmplY3Rcblx0ICogXHR2YXIgdk5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHQgKiBcdFx0Q29tcGFueUNvZGUgOiBcIjAwMDFcIixcblx0ICogXHRcdEN1c3RvbWVyIDogXCJDMDAwMVwiXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHQvL29yIGFzIHNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICpcdCBvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ3VzdG9tZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCJDMDAwMVwiKTtcblx0ICogXHR2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHQvL29yIGRpcmVjdGx5IGZyb20gU21hcnRGaWx0ZXJCYXJcblx0ICogXHR2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCk7XG5cdCAqXG5cdCAqIFx0Ly9hcHAgc3RhdGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuXHQgKlx0IHZhciBvSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdC8vIGNhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3JzXG5cdCAqIFx0dmFyIGZuT25FcnJvciA9IGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHR2YXIgb2kxOG4gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpMThuXCIpLmdldFJlc291cmNlQnVuZGxlKCk7XG5cdCAqIFx0XHRvRXJyb3Iuc2V0VUlUZXh0KHtvaTE4biA6IG9pMThuLCBzVGV4dEtleSA6IFwiT1VUQk9VTkRfTkFWX0VSUk9SXCJ9KTtcblx0ICogXHRcdG9FcnJvci5zaG93TWVzc2FnZUJveCgpO1xuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0b05hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbk5hbWUsIHZOYXZpZ2F0aW9uUGFyYW1ldGVycywgb0lubmVyQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdG5hdmlnYXRlKFxuXHRcdHNTZW1hbnRpY09iamVjdDogc3RyaW5nLFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzOiBvYmplY3QgfCBzdHJpbmcsXG5cdFx0b0lubmVyQXBwRGF0YT86IElubmVyQXBwRGF0YSxcblx0XHRmbk9uRXJyb3I/OiBGdW5jdGlvbixcblx0XHRvRXh0ZXJuYWxBcHBEYXRhPzoge1xuXHRcdFx0dmFsdWVUZXh0cz86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0c05hdk1vZGU/OiBzdHJpbmdcblx0KSB7XG5cdFx0bGV0IHNTZWxlY3Rpb25WYXJpYW50OiBhbnksXG5cdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdG9YQXBwRGF0YU9iajogYW55LFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLFxuXHRcdFx0YkV4UGxhY2UgPSBmYWxzZSxcblx0XHRcdG9UbXBEYXRhOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvTmF2SGFuZGxlcjogTmF2aWdhdGlvbkhhbmRsZXIgPSB0aGlzO1xuXG5cdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSB0aGlzLm9Db21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIHNvbWUgcmFjZSBjb25kaXRpb25zIHdoZXJlIHRoZSBvQ29tcG9uZW50RGF0YSBtYXkgbm90IGJlIHNldCwgZm9yIGV4YW1wbGUgaW4gY2FzZSB0aGUgVVNoZWxsIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuIFRvXG5cdFx0ICogbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IGR1bXAgaGVyZSB3aXRoIGFuIGV4Y2VwdGlvbiwgd2UgdGFrZSB0aGlzIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3I6XG5cdFx0ICovXG5cdFx0aWYgKG9Db21wb25lbnREYXRhKSB7XG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycztcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl0gJiZcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl0ubGVuZ3RoID4gMFxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIGJFeFBsYWNlID0gKEpTT04ucGFyc2Uob1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl1bMF0pID09PSBcImV4cGxhY2VcIik7XG5cdFx0XHRcdGJFeFBsYWNlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl1bMF0gPT09IFwiZXhwbGFjZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIG9ubHkgbmF2LW1vZGUgJ2lucGxhY2UnIG9yICdleHBsYWNlJyBhcmUgc3VwcG9ydGVkLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBsZWFkIHRvIGFuIGV4Y2VwdGlvbi5cblx0XHRpZiAoc05hdk1vZGUgJiYgKHNOYXZNb2RlID09PSBcImlucGxhY2VcIiB8fCBzTmF2TW9kZSA9PT0gXCJleHBsYWNlXCIpKSB7XG5cdFx0XHRiRXhQbGFjZSA9IHNOYXZNb2RlID09PSBcImV4cGxhY2VcIjtcblx0XHR9IGVsc2UgaWYgKHNOYXZNb2RlKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX05BVl9NT0RFXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvRXh0ZXJuYWxBcHBEYXRhID09PSB1bmRlZmluZWQgfHwgb0V4dGVybmFsQXBwRGF0YSA9PT0gbnVsbCkge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0ge307XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9FeHRlcm5hbEFwcERhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gZm9yIG5hdmlnYXRpb24gd2UgbmVlZCBVUkwgcGFyYW1ldGVycyAobGVnYWN5IG5hdmlnYXRpb24pIGFuZCBzYXAteGFwcC1zdGF0ZSwgdGhlcmVmb3JlIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBtaXNzaW5nIG9uZSBmcm9tIHRoZVxuXHRcdC8vIHBhc3NlZCBvbmVcblx0XHRpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSB2TmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRjb25zdCBvRW5yaWNoZWRTZWxWYXIgPSB0aGlzLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0bmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRbXVxuXHRcdFx0KS5vTmF2aWdhdGlvblNlbFZhcjtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gb0VucmljaGVkU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0aWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSB0aGlzLl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH1cblx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCAmJiBvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpO1xuXHRcdG9UbXBEYXRhID0gdGhpcy5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1RtcERhdGEpOyAvLyByZW1vdmUgZXZlbnR1YWwgbWVhc3VyZXNcblx0XHRvVG1wRGF0YSA9IHRoaXMuX2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvVG1wRGF0YSk7IC8vIHJlbW92ZSBldmVudHVhbCBzZW5zaXRpdmUgZGF0YVxuXG5cdFx0aWYgKG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0gdGhpcy5fZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpKTtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkudG9KU09OU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge307XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb05hdkFyZ3VtZW50czogYW55ID0ge1xuXHRcdFx0dGFyZ2V0OiB7XG5cdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdGFjdGlvbjogc0FjdGlvbk5hbWVcblx0XHRcdH0sXG5cdFx0XHRwYXJhbXM6IG1QYXJhbWV0ZXJzIHx8IHt9XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuTmF2aWdhdGUgPSBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRpZiAoIW9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50ID0gc1NlbGVjdGlvblZhcmlhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZuTmF2RXhwbGFjZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgc05ld0hyZWZQcm9taXNlID0gb0Nyb3NzQXBwTmF2U2VydmljZS5ocmVmRm9yRXh0ZXJuYWxBc3luYyhvTmF2QXJndW1lbnRzLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0c05ld0hyZWZQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNOZXdIcmVmOiBhbnkpIHtcblx0XHRcdFx0XHRcdG9wZW5XaW5kb3coc05ld0hyZWYpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0aXJldmluZyBocmVmRm9yRXh0ZXJuYWwgOiBcIiArIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRvWEFwcERhdGFPYmogPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1hBcHBEYXRhT2JqKTtcblx0XHRcdHJldHVybiBvTmF2SGFuZGxlci5fZm5TYXZlQXBwU3RhdGVBc3luYyhvWEFwcERhdGFPYmosIGZuT25FcnJvcikudGhlbihmdW5jdGlvbiAob1NhdmVBcHBTdGF0ZVJldHVybjogYW55KSB7XG5cdFx0XHRcdGlmIChvU2F2ZUFwcFN0YXRlUmV0dXJuKSB7XG5cdFx0XHRcdFx0b05hdkFyZ3VtZW50cy5hcHBTdGF0ZUtleSA9IG9TYXZlQXBwU3RhdGVSZXR1cm4uYXBwU3RhdGVLZXk7XG5cblx0XHRcdFx0XHQvLyBSZW1hcms6XG5cdFx0XHRcdFx0Ly8gVGhlIENyb3NzIEFwcCBTZXJ2aWNlIHRha2VzIGNhcmUgb2YgZW5jb2RpbmcgcGFyYW1ldGVyIGtleXMgYW5kIHZhbHVlcy4gRXhhbXBsZTpcblx0XHRcdFx0XHQvLyBtUGFyYW1zID0geyBcIiRAJVwiIDogXCImLz1cIiB9IHJlc3VsdHMgaW4gdGhlIFVSTCBwYXJhbWV0ZXIgJTI1MjQlMjU0MCUyNTI1PSUyNTI2JTI1MkYlMjUzRFxuXHRcdFx0XHRcdC8vIE5vdGUgdGhlIGRvdWJsZSBlbmNvZGluZywgdGhpcyBpcyBjb3JyZWN0LlxuXG5cdFx0XHRcdFx0Ly8gdG9FeHRlcm5hbCBzZXRzIHNhcC14YXBwLXN0YXRlIGluIHRoZSBVUkwgaWYgYXBwU3RhdGVLZXkgaXMgcHJvdmlkZWQgaW4gb05hdkFyZ3VtZW50c1xuXHRcdFx0XHRcdC8vIHRvRXh0ZXJuYWwgaGFzIGlzc3VlcyBvbiBzdGlja3kgYXBwcyBGSU9SSVRFQ0hQMS0xNDQwMCwgdGVtcCBmaXggdXNpbmcgaHJlZkZvckV4dGVybmFsXG5cdFx0XHRcdFx0aWYgKHNOYXZNb2RlID09IFwiZXhwbGFjZVwiKSB7XG5cdFx0XHRcdFx0XHRmbk5hdkV4cGxhY2UoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHRvRXh0ID0gb0Nyb3NzQXBwTmF2U2VydmljZS50b0V4dGVybmFsKG9OYXZBcmd1bWVudHMsIG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0XHRcdFx0Ly8gVE9ETzogVGhpcyBpcyBqdXN0IGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGFsbG93IEZFIFYyIHRvIHVzZSB0b0V4dGVybmFsIHByb21pc2UuXG5cdFx0XHRcdFx0XHRpZiAob05hdkhhbmRsZXIuX25hdmlnYXRlQ2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdFx0b05hdkhhbmRsZXIuX25hdmlnYXRlQ2FsbGJhY2socHRvRXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gLy8gZWxzZSA6IGVycm9yIHdhcyBhbHJlYWR5IHJlcG9ydGVkXG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuU3RvcmVBbmROYXZpZ2F0ZSA9IGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdG9OYXZIYW5kbGVyXG5cdFx0XHRcdC5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhvSW5uZXJBcHBEYXRhIGFzIGFueSwgdHJ1ZSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKHNBcHBTdGF0ZUtleSkge1xuXHRcdFx0XHRcdFx0b05hdkhhbmRsZXIucmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZuTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cdFx0aWYgKHNOYXZNb2RlKSB7XG5cdFx0XHRvTmF2QXJndW1lbnRzLnBhcmFtc1tcInNhcC11c2hlbGwtbmF2bW9kZVwiXSA9IGJFeFBsYWNlID8gXCJleHBsYWNlXCIgOiBcImlucGxhY2VcIjtcblx0XHR9XG5cdFx0b05hdkhhbmRsZXJcblx0XHRcdC5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9TdXBwb3J0ZWRQcm9taXNlID0gb0Nyb3NzQXBwTmF2U2VydmljZS5pc05hdmlnYXRpb25TdXBwb3J0ZWQoW29OYXZBcmd1bWVudHNdLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0b1N1cHBvcnRlZFByb21pc2UuZG9uZShmdW5jdGlvbiAob1RhcmdldHM6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0c1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGlmICghYkV4UGxhY2UpIHtcblx0XHRcdFx0XHRcdFx0Zm5TdG9yZUFuZE5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Zm5OYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gaW50ZW50IGlzIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmlzSW50ZW50U3VwcG9ydGVkLm5vdFN1cHBvcnRlZFwiKTtcblx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdG9TdXBwb3J0ZWRQcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gdGVjaG5pY2FsIGVycm9yOiBjb3VsZCBub3QgZGV0ZXJtaW5lIGlmIGludGVudCBpcyBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmlzSW50ZW50U3VwcG9ydGVkLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgaW5jb21pbmcgVVJMIGFuZCByZXR1cm5zIGEgUHJvbWlzZS4gSWYgdGhpcyBtZXRob2QgZGV0ZWN0cyBhIGJhY2sgbmF2aWdhdGlvbiwgdGhlIGlubmVyIGFwcCBzdGF0ZSBpcyByZXR1cm5lZCBpbiB0aGUgcmVzb2x2ZWRcblx0ICogUHJvbWlzZS4gT3RoZXJ3aXNlIHN0YXJ0dXAgcGFyYW1ldGVycyB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBhcHAgc3RhdGUgcHJvdmlkZWQgYnkgY3Jvc3MgYXBwIG5hdmlnYXRpb24sIGFuZCBhIGNvbWJpbmVkIGFwcCBzdGF0ZSB3aWxsIGJlXG5cdCAqIHJldHVybmVkLiBUaGUgY29uZmxpY3QgcmVzb2x1dGlvbiBjYW4gYmUgaW5mbHVlbmNlZCB3aXRoIHNQYXJhbUhhbmRsaW5nTW9kZSBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3Rvci5cblx0ICpcblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQuIElmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGV4dHJhY3RlZCBhcHAgc3RhdGUsIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMsIGFuZCB0aGUgdHlwZSBvZiBuYXZpZ2F0aW9uIGFyZSByZXR1cm5lZCwgc2VlIGFsc28gdGhlIGV4YW1wbGUgYWJvdmUuIFRoZSBhcHAgc3RhdGUgaXNcblx0ICogICAgICAgICAgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjpcblx0ICogICAgICAgICAgPHVsPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH1cblx0ICogICAgICAgICAgY29udGFpbmluZyBvbmx5IHBhcmFtZXRlcnMvc2VsZWN0IG9wdGlvbnMgdGhhdCBhcmUgcmVsYXRlZCB0byBuYXZpZ2F0aW9uPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBUaGUgbmF2aWdhdGlvbi1yZWxhdGVkIHNlbGVjdGlvbiB2YXJpYW50IGFzIGEgSlNPTi1mb3JtYXR0ZWQgc3RyaW5nPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50PC9jb2RlPjogQW4gaW5zdGFuY2Ugb2Zcblx0ICogICAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9IGNvbnRhaW5pbmcgb25seSB0aGUgcGFyYW1ldGVycy9zZWxlY3Qgb3B0aW9ucyB0aGF0IGFyZSBzZXQgYnkgdXNlclxuXHQgKiAgICAgICAgICBkZWZhdWx0IGRhdGE8L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTwvY29kZT46IEEgQm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgb25seSBkZWZhdWx0ZWQgcGFyYW1ldGVycyBhbmQgbm9cblx0ICogICAgICAgICAgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50Ljxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIG5vIG5hdmlnYXRpb24gcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLCA8Y29kZT5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sXG5cdCAqICAgICAgICAgIGV2ZW4gdGhvdWdoIHBhcmFtZXRlcnMgd2l0aG91dCBkZWZhdWx0IG1pZ2h0IGJlIGF2YWlsYWJsZSBhcyB3ZWxsLjwvbGk+XG5cdCAqICAgICAgICAgIDwvdWw+XG5cdCAqICAgICAgICAgIElmIHRoZSBuYXZpZ2F0aW9uLXJlbGF0ZWQgc2VsZWN0aW9uIHZhcmlhbnQgaXMgZW1wdHksIGl0IGlzIHJlcGxhY2VkIGJ5IGEgY29weSBvZiB0aGUgZGVmYXVsdGVkIHNlbGVjdGlvbiB2YXJpYW50Ljxicj5cblx0ICogICAgICAgICAgVGhlIG5hdmlnYXRpb24gdHlwZSBpcyBhbiBlbnVtZXJhdGlvbiB0eXBlIG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGV9IChwb3NzaWJsZSB2YWx1ZXMgYXJlXG5cdCAqICAgICAgICAgIGluaXRpYWwsIFVSTFBhcmFtcywgeEFwcFN0YXRlLCBhbmQgaUFwcFN0YXRlKS48YnI+XG5cdCAqICAgICAgICAgIDxiPk5vdGU6PC9iPiBJZiB0aGUgbmF2aWdhdGlvbiB0eXBlIGlzIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlLmlBcHBTdGF0ZX0gb0FwcERhdGEgaGFzIHR3b1xuXHQgKiAgICAgICAgICBhZGRpdGlvbmFsIHByb3BlcnRpZXNcblx0ICogICAgICAgICAgPHVsPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEudGFibGVWYXJpYW50SWQ8L2NvZGU+PC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLmN1c3RvbURhdGE8L2NvZGU+PC9saT5cblx0ICogICAgICAgICAgPC91bD5cblx0ICogICAgICAgICAgd2hpY2ggcmV0dXJuIHRoZSBpbm5lciBhcHAgZGF0YSBhcyBzdG9yZWQgaW4ge0BsaW5rICMubmF2aWdhdGUgbmF2aWdhdGV9IG9yIHtAbGluayAjLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jIHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfS5cblx0ICogICAgICAgICAgPGNvZGU+b0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+IGlzIGFuIGVtcHR5IHNlbGVjdGlvbiB2YXJpYW50IGFuZFxuXHQgKiAgICAgICAgICA8Y29kZT5vQXBwRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4gaW4gdGhpcyBjYXNlLjxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIHRoZSBuYXZpZ2F0aW9uIHR5cGUgaXMge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGUuaW5pdGlhbH0gb0FwcERhdGEgaXMgYW4gZW1wdHkgb2JqZWN0ITxicj5cblx0ICogICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9LCBVUkwgcGFyYW1ldGVycyAoaWYgYXZhaWxhYmxlKVxuXHQgKiAgICAgICAgICBhbmQgdGhlIHR5cGUgb2YgbmF2aWdhdGlvbiBhcmUgcmV0dXJuZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBvUGFyc2VOYXZpZ2F0aW9uUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5wYXJzZU5hdmlnYXRpb24oKTtcblx0ICpcblx0ICogXHRvUGFyc2VOYXZpZ2F0aW9uUHJvbWlzZS5kb25lKGZ1bmN0aW9uKG9BcHBEYXRhLCBvU3RhcnR1cFBhcmFtZXRlcnMsIHNOYXZUeXBlKXtcblx0ICogXHRcdFx0b1NtYXJ0RmlsdGVyQmFyLnNldERhdGFTdWl0ZUZvcm1hdChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0ICogXHRcdFx0Ly8gb0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgY2FuIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgc2VsZWN0aW9uIHZhcmlhbnRcblx0ICogXHRcdFx0Ly8gb0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgY29udGFpbnMgdGhlIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHNldCBieSB1c2VyIGRlZmF1bHRzXG5cdCAqIFx0XHRcdC8vIG9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgaW5kaWNhdGVzIHdoZXRoZXIgb25seSBkZWZhdWx0ZWQgcGFyYW1ldGVycyBhbmQgbm8gbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50XG5cdCAqIFx0fSk7XG5cdCAqIFx0b1BhcnNlTmF2aWdhdGlvblByb21pc2UuZmFpbChmdW5jdGlvbihvRXJyb3IsIG9VUkxQYXJhbWV0ZXJzLCBzTmF2VHlwZSl7XG5cdCAqIFx0XHQvLyBpZiBlLmcuIHRoZSB4YXBwIHN0YXRlIGNvdWxkIG5vdCBiZSBsb2FkZWQsIG5ldmVydGhlbGVzcyB0aGVyZSBtYXkgYmUgVVJMIHBhcmFtZXRlcnMgYXZhaWxhYmxlXG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHBhcnNlTmF2aWdhdGlvbigpOiBvYmplY3Qge1xuXHRcdGNvbnN0IHNBcHBIYXNoID0gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdFx0Lypcblx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGwgaXNcblx0XHQgKiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc0lBcHBTdGF0ZSA9IHRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpO1xuXG5cdFx0bGV0IG9Db21wb25lbnREYXRhID0gdGhpcy5vQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHQvKlxuXHRcdCAqIFRoZXJlIGFyZSBzb21lIHJhY2UgY29uZGl0aW9ucyB3aGVyZSB0aGUgb0NvbXBvbmVudERhdGEgbWF5IG5vdCBiZSBzZXQsIGZvciBleGFtcGxlIGluIGNhc2UgdGhlIFVTaGVsbCB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiBUb1xuXHRcdCAqIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBkdW1wIGhlcmUgd2l0aCBhbiBleGNlcHRpb24sIHdlIHRha2UgdGhpcyBzcGVjaWFsIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yOlxuXHRcdCAqL1xuXHRcdGlmIChvQ29tcG9uZW50RGF0YSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRMb2cud2FybmluZyhcIlRoZSBuYXZpZ2F0aW9uIENvbXBvbmVudCdzIGRhdGEgd2FzIG5vdCBzZXQgcHJvcGVybHk7IGFzc3VtaW5nIGluc3RlYWQgdGhhdCBubyBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC5cIik7XG5cdFx0XHRvQ29tcG9uZW50RGF0YSA9IHt9O1xuXHRcdH1cblxuXHRcdC8vIFJlbWFyazpcblx0XHQvLyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzIGFyZSBhbHJlYWR5IGRlY29kZWQuIEV4YW1wbGU6XG5cdFx0Ly8gVGhlIG9yaWdpbmFsIFVSTCBwYXJhbWV0ZXIgJTI1MjQlMjU0MCUyNTI1PSUyNTI2JTI1MkYlMjUzRCByZXN1bHRzIGluIG9TdGFydHVwUGFyYW1ldGVycyA9IHsgXCIkQCVcIiA6IFwiJi89XCIgfVxuXHRcdC8vIE5vdGUgdGhlIGRvdWJsZSBlbmNvZGluZyBpbiB0aGUgVVJMLCB0aGlzIGlzIGNvcnJlY3QuIEFuIFVSTCBwYXJhbWV0ZXIgbGlrZSB4eXo9JTI1IGNhdXNlcyBhbiBcIlVSSSBtYWxmb3JtZWRcIiBlcnJvci5cblx0XHQvLyBJZiB0aGUgZGVjb2RlZCB2YWx1ZSBzaG91bGQgYmUgZS5nLiBcIiUyNVwiLCB0aGUgcGFyYW1ldGVyIGluIHRoZSBVUkwgbmVlZHMgdG8gYmU6IHh5ej0lMjUyNTI1XG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzID0gb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnM7XG5cdFx0Y29uc3QgaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvU3RhcnR1cFBhcmFtZXRlcnM/LltIWUJSSURfSUFQUF9TVEFURV9LRVldPy5bMF07XG5cdFx0Y29uc3QgaHlicmlkRGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblx0XHRsZXQgaUFwcFN0YXRlSHlicmlkRGVmZXJyZWQ6IGpRdWVyeS5EZWZlcnJlZCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkID0gdGhpcy5fbG9hZEFwcFN0YXRlKGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtcywgaHlicmlkRGVmZXJyZWQsIE5hdlR5cGUuaHlicmlkKTtcblx0XHR9XG5cblx0XHRsZXQgYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFueSA9IFtdO1xuXHRcdGlmIChcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWV0ubGVuZ3RoID4gMFxuXHRcdCkge1xuXHRcdFx0YURlZmF1bHRlZFBhcmFtZXRlcnMgPSBKU09OLnBhcnNlKG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXVswXSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBwYXJzZVVybFBhcmFtcyA9IGZ1bmN0aW9uIChvU3ViU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgYVN1YkRlZmF1bHRlZFBhcmFtZXRlcnM6IGFueSwgb1N1Yk15RGVmZXJyZWQ6IGFueSwgc05hdlR5cGU6IGFueSkge1xuXHRcdFx0Ly8gc3RhbmRhcmQgVVJMIG5hdmlnYXRpb25cblx0XHRcdGNvbnN0IG9TZWxWYXJzID0gb05hdkhhbmRsZXIuX3NwbGl0SW5ib3VuZE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdFx0XHRuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRvU3ViU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRcdGFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzXG5cdFx0XHQpO1xuXHRcdFx0Ly8gRm9yIHNjZW5hcmlvLCB3aGVyZSBvbmx5IGh5YnJpZElBcHBTdGF0ZUtleSBpcyBwYXJ0IG9mIHVybFBhcmFtcywgd2UgaWdub3JlIHRoaXMgY29uZGl0aW9uXG5cdFx0XHRpZiAob1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXIuaXNFbXB0eSgpICYmIG9TZWxWYXJzLm9EZWZhdWx0ZWRTZWxWYXIuaXNFbXB0eSgpICYmIHNOYXZUeXBlICE9PSBOYXZUeXBlLmh5YnJpZCkge1xuXHRcdFx0XHQvLyBTdGFydHVwIHBhcmFtZXRlcnMgY29udGFpbiBvbmx5IHRlY2huaWNhbCBwYXJhbWV0ZXJzIChTQVAgc3lzdGVtKSB3aGljaCB3ZXJlIGZpbHRlcmVkIG91dC5cblx0XHRcdFx0Ly8gb05hdmlnYXRpb25TZWxWYXIgYW5kIG9EZWZhdWx0ZWRTZWxWYXIgYXJlIGVtcHR5LlxuXHRcdFx0XHQvLyBUaHVzLCBjb25zaWRlciB0aGlzIHR5cGUgb2YgbmF2aWdhdGlvbiBhcyBhbiBpbml0aWFsIG5hdmlnYXRpb24uXG5cdFx0XHRcdGlmIChzTmF2VHlwZSA9PT0gTmF2VHlwZS54QXBwU3RhdGUpIHtcblx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCBvU3ViU3RhcnR1cFBhcmFtZXRlcnMgfHwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZXNvbHZlKHt9LCBvU3ViU3RhcnR1cFBhcmFtZXRlcnMsIE5hdlR5cGUuaW5pdGlhbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBTdGF0ZURhdGE6IGFueSA9IHt9O1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhcjtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gb1NlbFZhcnMuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTtcblxuXHRcdFx0XHQvLyBubyBzYXAteGFwcC1zdGF0ZSBidXQgbmF2VHlwZSBpcyBoeWJyaWQsIGV4dHJhY3QgdGhlIElBcHBTdGF0ZURhdGFcblx0XHRcdFx0aWYgKHNOYXZUeXBlID09PSBOYXZUeXBlLmh5YnJpZCkge1xuXHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUgPSBmdW5jdGlvbiAoaUFwcFN0YXRlRGF0YTogb2JqZWN0LCBfcmVmOiBvYmplY3QsIG5hdlR5cGU6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5pQXBwU3RhdGUgPSBpQXBwU3RhdGVEYXRhO1xuXHRcdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVzb2x2ZShvQXBwU3RhdGVEYXRhLCBvU3RhcnR1cFBhcmFtZXRlcnMsIG5hdlR5cGUpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChvRXJyb3I6IG9iamVjdCwgX3JlZjogb2JqZWN0LCBuYXZUeXBlOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlamVjdChvRXJyb3IsIF9yZWYsIG5hdlR5cGUpO1xuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAoaUFwcFN0YXRlSHlicmlkRGVmZXJyZWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZG9uZShzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkLmZhaWwoZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N1YlN0YXJ0dXBQYXJhbWV0ZXJzLCBzTmF2VHlwZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChzSUFwcFN0YXRlKSB7XG5cdFx0XHQvLyBpbm5lciBhcHAgc3RhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBBcHBIYXNoIChiYWNrIG5hdmlnYXRpb24pOyBleHRyYWN0IHRoZSBwYXJhbWV0ZXIgdmFsdWVcblx0XHRcdHRoaXMuX2xvYWRBcHBTdGF0ZShzSUFwcFN0YXRlLCBvTXlEZWZlcnJlZCwgTmF2VHlwZS5pQXBwU3RhdGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBubyBiYWNrIG5hdmlnYXRpb25cblx0XHRcdGNvbnN0IGJJc1hhcHBTdGF0ZU5hdmlnYXRpb24gPSBvQ29tcG9uZW50RGF0YVtcInNhcC14YXBwLXN0YXRlXCJdICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoYklzWGFwcFN0YXRlTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRcdFx0Ly8gaW5uZXIgYXBwIHN0YXRlIHdhcyBub3QgZm91bmQgaW4gdGhlIEFwcEhhc2gsIGJ1dCB4YXBwIHN0YXRlID0+IHRyeSB0byByZWFkIHRoZSB4YXBwIHN0YXRlXG5cdFx0XHRcdHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdGFydHVwUHJvbWlzZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0U3RhcnR1cEFwcFN0YXRlKHRoYXQub0NvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHRvU3RhcnR1cFByb21pc2UuZG9uZShmdW5jdGlvbiAob0FwcFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0IGFwcCBzdGF0ZSBmcm9tIHNhcC14YXBwLXN0YXRlLFxuXHRcdFx0XHRcdFx0XHQvLyBjcmVhdGUgYSBjb3B5LCBub3Qgb25seSBhIHJlZmVyZW5jZSwgYmVjYXVzZSB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGxldCBvQXBwU3RhdGVEYXRhID0gb0FwcFN0YXRlLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0bGV0IG9FcnJvcjtcblx0XHRcdFx0XHRcdFx0aWYgKG9BcHBTdGF0ZURhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0FwcFN0YXRlRGF0YSkpO1xuXHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLkFwcFN0YXRlRGF0YS5wYXJzZUVycm9yXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvQXBwU3RhdGVEYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1NlbFZhciA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9BcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFycyA9IG9OYXZIYW5kbGVyLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0XHRcdFx0XHRcdG9TZWxWYXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IG9TZWxWYXJzLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLmlBcHBTdGF0ZSA9IGlBcHBTdGF0ZURhdGE7XG5cdFx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgbmF2VHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKGVycm9yOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3QoeyBlcnJvciwgX3JlZiwgbmF2VHlwZSB9KTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGlmIChoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCAmJiBpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5kb25lKHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZmFpbChmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9BcHBTdGF0ZURhdGFbSFlCUklEX0lBUFBfU1RBVEVfS0VZXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhhdC5fbG9hZEFwcFN0YXRlKG9BcHBTdGF0ZURhdGFbSFlCUklEX0lBUFBfU1RBVEVfS0VZXSwgaHlicmlkRGVmZXJyZWQsIE5hdlR5cGUuaHlicmlkKS5kb25lKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvU3RhcnR1cFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXJzZVVybFBhcmFtcyhvU3RhcnR1cFBhcmFtZXRlcnMsIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLCBvTXlEZWZlcnJlZCwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHNhcC14YXBwLXN0YXRlIG5hdmlnYXRpb24sIGJ1dCBJRCBoYXMgYWxyZWFkeSBleHBpcmVkLCBidXQgVVJMIHBhcmFtZXRlcnMgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdFx0b0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0RGF0YUZyb21BcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzIHx8IHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b1N0YXJ0dXBQcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXRTdGFydHVwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1N0YXJ0dXBQcm9taXNlO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0XHQvLyBubyBzYXAteGFwcC1zdGF0ZVxuXHRcdFx0XHRwYXJzZVVybFBhcmFtcyhcblx0XHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YURlZmF1bHRlZFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0b015RGVmZXJyZWQsXG5cdFx0XHRcdFx0aHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zICE9PSB1bmRlZmluZWQgPyBOYXZUeXBlLmh5YnJpZCA6IE5hdlR5cGUuVVJMUGFyYW1zXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBpbml0aWFsIG5hdmlnYXRpb25cblx0XHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZSh7fSwge30sIE5hdlR5cGUuaW5pdGlhbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0ZWNobmljYWwgcGFyYW1ldGVycy4gVGVjaG5pY2FsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHBhc3NlZCB0byB0aGVcblx0ICogYXBwbGljYXRpb24uIEFzIGEgZGVmYXVsdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyczpcblx0ICogPHVsPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXN5c3RlbTwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lczwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+XCJoY3BBcHBsaWNhdGlvbklkXCI8L2NvZGU+PC9saT5cblx0ICogPC91bD4uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICogQGZ1bmN0aW9uIHNldFRlY2huaWNhbFBhcmFtZXRlcnNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnByb3RvdHlwZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhVGVjaG5pY2FsUGFyYW1ldGVycyBMaXN0IG9mIHBhcmFtZXRlciBuYW1lcyB0byBiZSBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXJzLiA8Y29kZT5udWxsPC9jb2RlPiBvclxuXHQgKiAgICAgICAgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBtYXkgYmUgdXNlZCB0byByZXNldCB0aGUgY29tcGxldGUgbGlzdC5cblx0ICovXG5cdHNldFRlY2huaWNhbFBhcmFtZXRlcnMoYVRlY2huaWNhbFBhcmFtZXRlcnM/OiBhbnlbXSkge1xuXHRcdGlmICghYVRlY2huaWNhbFBhcmFtZXRlcnMpIHtcblx0XHRcdGFUZWNobmljYWxQYXJhbWV0ZXJzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KGFUZWNobmljYWxQYXJhbWV0ZXJzKSkge1xuXHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IHBhcmFtZXRlciBpbmNvcnJlY3QsIGFycmF5IG9mIHN0cmluZ3MgZXhwZWN0ZWRcIik7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2FUZWNobmljYWxQYXJhbWF0ZXJzID0gYVRlY2huaWNhbFBhcmFtZXRlcnM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWMgdGVjaG5pY2FsIHBhcmFtZXRlcnMuIFRlY2huaWNhbCBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBwYXNzZWQgdG8gdGhlXG5cdCAqIGFwcGxpY2F0aW9uLiBBcyBhIGRlZmF1bHQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlcnM6XG5cdCAqIDx1bD5cblx0ICogPGxpPjxjb2RlPnNhcC1zeXN0ZW08L2NvZGU+PC9saT5cblx0ICogPGxpPjxjb2RlPnNhcC11c2hlbGwtZGVmYXVsdGVkUGFyYW1ldGVyTmFtZXM8L2NvZGU+PC9saT5cblx0ICogPGxpPjxjb2RlPlwiaGNwQXBwbGljYXRpb25JZFwiPC9jb2RlPjwvbGk+XG5cdCAqIDwvdWw+LlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqIEBmdW5jdGlvbiBnZXRUZWNobmljYWxQYXJhbWV0ZXJzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5wcm90b3R5cGVcblx0ICogQHJldHVybnMge0FycmF5fSBDb250YWluaW5nIHRoZSB0ZWNobmljYWwgcGFyYW1ldGVycy5cblx0ICovXG5cdGdldFRlY2huaWNhbFBhcmFtZXRlcnMoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiB0aGlzLl9hVGVjaG5pY2FsUGFyYW1hdGVycy5jb25jYXQoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGEgcmVxdWVzdCBwYXJhbWV0ZXIsIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlci5cblx0ICogQHJldHVybnMgSW5kaWNhdGVzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyIG9yIG5vdC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9pc1RlY2huaWNhbFBhcmFtZXRlcihzUGFyYW1ldGVyTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKHNQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCEoXG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLXZhcmlhbnQtaWRcIiB8fFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS10YWJsZS12YXJpYW50LWlkXCIgfHxcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtY2hhcnQtdmFyaWFudC1pZFwiIHx8XG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLWZpbHRlcmJhci12YXJpYW50LWlkXCJcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGlmIChzUGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJzYXAtXCIpID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMuaW5kZXhPZihzUGFyYW1ldGVyTmFtZSkgPj0gMCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdF9pc0ZFUGFyYW1ldGVyKHNQYXJhbWV0ZXJOYW1lOiBhbnkpIHtcblx0XHRyZXR1cm4gc1BhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FwLXVpLWZlXCIpID09PSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJtb3ZlcyBpZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudCBTZWxlY3Rpb24gVmFyaWFudCB3aGljaCBjb25zaXN0cyBvZiB0ZWNobmljYWwgUGFyYW1ldGVycy5cblx0ICogQHJldHVybnMgU2VsZWN0aW9uIFZhcmlhbnQgd2l0aG91dCB0ZWNobmljYWwgUGFyYW1ldGVycy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0bGV0IHNQcm9wTmFtZSwgaTtcblx0XHRjb25zdCBhU2VsVmFyUHJvcE5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbFZhclByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1Byb3BOYW1lID0gYVNlbFZhclByb3BOYW1lc1tpXTtcblx0XHRcdGlmICh0aGlzLl9pc1RlY2huaWNhbFBhcmFtZXRlcihzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzUHJvcE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblxuXHQvKipcblx0ICogU3BsaXRzIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIGR1cmluZyBpbmJvdW5kIG5hdmlnYXRpb24gYW5kIHNlcGFyYXRlcyB0aGUgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBiZXR3ZWVuIGRlZmF1bHRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFuZFxuXHQgKiBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudCBJbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH0gY29udGFpbmluZyBuYXZpZ2F0aW9uIGRhdGEgb2Zcblx0ICogICAgICAgIHRoZSBhcHBcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyBzdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcCAoZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQpXG5cdCAqIEBwYXJhbSBhRGVmYXVsdGVkUGFyYW1ldGVycyBBcnJheSBjb250YWluaW5nIGRlZmF1bHRlZCBwYXJhbWV0ZXIgbmFtZXNcblx0ICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdHdvIFNlbGVjdGlvblZhcmlhbnRzLCBvbmUgZm9yIG5hdmlnYXRpb24gKG9OYXZpZ2F0aW9uU2VsVmFyKSBhbmQgb25lIGZvciBkZWZhdWx0ZWQgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqICAgICAgICAgIChvRGVmYXVsdGVkU2VsVmFyKSwgYW5kIGEgZmxhZyAoYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSkgaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBwYXJhbWV0ZXJzIHdlcmUgZGVmYXVsdGVkLiBUaGUgZnVuY3Rpb24gaXNcblx0ICogICAgICAgICAgaGFuZGVkIHR3byBvYmplY3RzIGNvbnRhaW5pbmcgcGFyYW1ldGVycyAobmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb1NlbGVjdGlvblZhcmlhbnQgYW5kIG9TdGFydHVwUGFyYW1ldGVycy4gQVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgY291bGQgYmUgc3RvcmVkIGluIGp1c3Qgb25lIG9mIHRoZXNlIHR3byBvYmplY3RzIG9yIGluIGJvdGggb2YgdGhlbSBzaW11bHRhbmVvdXNseS4gQmVjYXVzZSBvZiB0aGUgbGF0dGVyIGNhc2UgYVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgY291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGNvbmZsaWN0aW5nIHZhbHVlcyBhbmQgaXQgaXMgdGhlIGpvYiBvZiB0aGlzIGZ1bmN0aW9uIHRvIHJlc29sdmUgYW55IHN1Y2ggY29uZmxpY3QuIFBhcmFtZXRlcnNcblx0ICogICAgICAgICAgYXJlIGFzc2lnbmVkIHRvIHRoZSB0d28gcmV0dXJuZWQgU2VsZWN0aW9uVmFyaWFudHMsIG9OYXZpZ2F0aW9uU2VsVmFyIGFuZCBvRGVmYXVsdGVkU2VsVmFyLCBhcyBmb2xsb3dzOiB8IHBhcmFtZXRlciBOT1QgaW4gfFxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgaW4gfCBvU2VsZWN0aW9uVmFyaWFudCB8IG9TZWxlY3Rpb25WYXJpYW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0gcGFyYW1ldGVyIE5PVCBpbiB8XG5cdCAqICAgICAgICAgIG5vdGhpbmcgdG8gZG8gfCBBZGQgcGFyYW1ldGVyIG9TdGFydHVwUGFyYW1ldGVycyB8IGhlcmUgfCAoc2VlIGJlbG93KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBpbiB8IEFkZCBwYXJhbWV0ZXIgfCBDb25mbGljdCByZXNvbHV0aW9uIG9TdGFydHVwUGFyYW1ldGVycyB8IChzZWUgYmVsb3cpIHwgKHNlZSBiZWxvdykgQWRkIHBhcmFtZXRlcjogaWYgcGFyYW1ldGVyIGluXG5cdCAqICAgICAgICAgIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhZGQgcGFyYW1ldGVyIHRvIG9EZWZhdWx0ZWRTZWxWYXIgZWxzZTogYWRkIHBhcmFtZXRlciB0byBvTmF2aWdhdGlvblNlbFZhciBDb25mbGljdCByZXNvbHV0aW9uOiBpZiBwYXJhbWV0ZXJcblx0ICogICAgICAgICAgaW4gYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvU2VsZWN0aW9uVmFyaWFudCB0byBvTmF2aWdhdGlvblNlbFZhciBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb21cblx0ICogICAgICAgICAgb1N0YXJ0dXBQYXJhbWV0ZXJzIHRvIG9EZWZhdWx0ZWRTZWxWYXIgTm90ZTogVGhpcyBjYXNlIG9ubHkgb2NjdXJzIGluIFVJNSAxLjMyLiBJbiBsYXRlciB2ZXJzaW9ucyBVU2hlbGwgc3RvcmVzIGFueSBkZWZhdWx0ZWRcblx0ICogICAgICAgICAgcGFyYW1ldGVyIGVpdGhlciBpbiBvU2VsZWN0aW9uVmFyaWFudCBvciBvU3RhcnR1cFBhcmFtZXRlcnMgYnV0IG5ldmVyIHNpbXVsdGFuZW91c2x5IGluIGJvdGguIGVsc2U6IENob29zZSAxIG9mIHRoZSBmb2xsb3dpbmdcblx0ICogICAgICAgICAgb3B0aW9ucyBiYXNlZCBvbiBnaXZlbiBoYW5kbGluZyBtb2RlICh0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSkuIC0+IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvU3RhcnR1cFBhcmFtZXRlcnMgdG9cblx0ICogICAgICAgICAgb05hdmlnYXRpb25TZWxWYXIgfCAtPiBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb20gb0FwcFN0YXRlLnNlbGVjdGlvblZhcmlhbnQgdG8gb05hdmlnYXRpb25TZWxWYXIgLT4gYWRkIGJvdGggcGFyYW1ldGVyIHZhbHVlcyB0b1xuXHQgKiAgICAgICAgICBuYXZpZ2F0aW9uU2VsVmFyIElmIG5hdmlnYXRpb25TZWxWYXIgaXMgc3RpbGwgZW1wdHkgYXQgdGhlIGVuZCBvZiBleGVjdXRpb24sIG5hdmlnYXRpb25TZWxWYXIgaXMgcmVwbGFjZWQgYnkgYSBjb3B5IG9mXG5cdCAqICAgICAgICAgIG9EZWZhdWx0ZWRTZWxWYXIgYW5kIHRoZSBmbGFnIGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgaXMgc2V0IHRvIHRydWUuIFRoZSBzZWxlY3Rpb24gdmFyaWFudCBvRGVmYXVsdGVkU2VsVmFyIGl0c2VsZiBpcyBhbHdheXNcblx0ICogICAgICAgICAgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0b1NlbGVjdGlvblZhcmlhbnQ6IEluc3RhbmNlVHlwZTx0eXBlb2YgU2VsZWN0aW9uVmFyaWFudD4sXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuXHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhbnlbXVxuXHQpIHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYURlZmF1bHRlZFBhcmFtZXRlcnMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdGxldCBzUHJvcE5hbWUsIGk7XG5cdFx0Ly8gRmlyc3Qgd2UgZG8gc29tZSBwYXJzaW5nIG9mIHRoZSBTdGFydFVwIFBhcmFtZXRlcnMuXG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblx0XHRmb3IgKHNQcm9wTmFtZSBpbiBvU3RhcnR1cFBhcmFtZXRlcnMpIHtcblx0XHRcdGlmICghb1N0YXJ0dXBQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGlmIChzUHJvcE5hbWUgPT09IFNBUF9TWVNURU1fUFJPUEVSVFkgfHwgc1Byb3BOYW1lID09PSBERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZKSB7XG5cdFx0XHRpZiAodGhpcy5faXNUZWNobmljYWxQYXJhbWV0ZXIoc1Byb3BOYW1lKSB8fCB0aGlzLl9pc0ZFUGFyYW1ldGVyKHNQcm9wTmFtZSkgfHwgc1Byb3BOYW1lID09PSBIWUJSSURfSUFQUF9TVEFURV9LRVkpIHtcblx0XHRcdFx0Ly8gRG8gbm90IGFkZCB0aGUgU0FQIHN5c3RlbSBwYXJhbWV0ZXIgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IGFzIGl0IGlzIGEgdGVjaG5pY2FsIHBhcmFtZXRlclxuXHRcdFx0XHQvLyBub3QgcmVsZXZhbnQgZm9yIHRoZSBzZWxlY3Rpb24gdmFyaWFudC5cblx0XHRcdFx0Ly8gRG8gbm90IGFkZCB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgZm9yIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudC4gVGhlIGluZm9ybWF0aW9uLCB3aGljaCBwYXJhbWV0ZXJzXG5cdFx0XHRcdC8vIGFyZSBkZWZhdWx0ZWQsIGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdGVkIHNlbGVjdGlvbiB2YXJpYW50LlxuXHRcdFx0XHQvLyBJbiBjYXNlLCBGRSBQYXJhbWV0ZXJzIHdlIHNoYWxsIHNraXAgaXQuKHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBmZXRjaCBpdCBmcm9tIFVSTCBwYXJhbXMpXG5cdFx0XHRcdC8vIFNraXAgdGhlIGh5YnJpZElBcHBTdGF0ZUtleSBwcmVzZW50IGFzIHBhcnQgb2YgJ0h5YnJpZCcgbmF2aWdhdGlvbiB0eXBlIG5vdCByZWxldmFudCBmb3IgdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBzdXBwb3J0IHBhcmFtZXRlcnMgYXMgYSBtYXAgd2l0aCBzdHJpbmdzIGFuZCBhcyBhIG1hcCB3aXRoIHZhbHVlIGFycmF5c1xuXHRcdFx0aWYgKHR5cGVvZiBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0pICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV1bMF07IC8vIHNpbmdsZS12YWx1ZWQgcGFyYW1ldGVyc1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdKSAmJiBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXTsgLy8gbXVsdGktdmFsdWVkIHBhcmFtZXRlcnNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29uc3RydWN0IHR3byBzZWxlY3Rpb24gdmFyaWFudHMgZm9yIGRlZmF1bHRzIGFuZCBuYXZpZ2F0aW9uIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi5cblx0XHRjb25zdCBvRGVmYXVsdGVkU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvblNlbFZhciA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cblx0XHRjb25zdCBhU2VsVmFyUHJvcE5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyTmFtZXMoKS5jb25jYXQob1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKSk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxWYXJQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNQcm9wTmFtZSA9IGFTZWxWYXJQcm9wTmFtZXNbaV07XG5cdFx0XHRpZiAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkKSB7XG5cdFx0XHRcdC8vIFJlc29sdmUgY29uZmxpY3QuXG5cdFx0XHRcdGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmRleE9mKHNQcm9wTmFtZSkgPiAtMSkge1xuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHRcdFx0dGhpcy5fYWRkUGFyYW1ldGVyVmFsdWVzKG9EZWZhdWx0ZWRTZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3dpdGNoICh0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBQYXJhbUhhbmRsaW5nTW9kZS5TZWxWYXJXaW5zOlxuXHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgUGFyYW1IYW5kbGluZ01vZGUuVVJMUGFyYW1XaW5zOlxuXHRcdFx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob05hdmlnYXRpb25TZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBQYXJhbUhhbmRsaW5nTW9kZS5JbnNlcnRJblNlbE9wdDpcblx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkUGFyYW1ldGVyVmFsdWVzKG9OYXZpZ2F0aW9uU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLmluZGV4T2Yoc1Byb3BOYW1lKSA+IC0xKSB7XG5cdFx0XHRcdC8vIHBhcmFtZXRlciBvbmx5IGluIFNlbFZhclxuXHRcdFx0XHRvRGVmYXVsdGVkU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkKSB7XG5cdFx0XHQvLyBUaGUgY2FzZSB3aGVyZSB0aGUgcGFyYW1ldGVyIGFwcGVhcnMgdHdpY2UgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mIGFib3ZlIHNvIHdlIHNraXAgaXQgaGVyZS5cblx0XHRcdGlmIChhU2VsVmFyUHJvcE5hbWVzLmluZGV4T2Yoc1Byb3BOYW1lKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5kZXhPZihzUHJvcE5hbWUpID4gLTEpIHtcblx0XHRcdFx0dGhpcy5fYWRkUGFyYW1ldGVyVmFsdWVzKG9EZWZhdWx0ZWRTZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob05hdmlnYXRpb25TZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHVzZWQgZm9yIG5hdmlnYXRpb24gc2hvdWxkIGJlIGZpbGxlZCB3aXRoIGRlZmF1bHRzIGluIGNhc2UgdGhhdCBvbmx5IGRlZmF1bHRzIGV4aXN0XG5cdFx0bGV0IGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSBmYWxzZTtcblx0XHRpZiAob05hdmlnYXRpb25TZWxWYXIuaXNFbXB0eSgpKSB7XG5cdFx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gdHJ1ZTtcblx0XHRcdGNvbnN0IGFQcm9wTmFtZXMgPSBvRGVmYXVsdGVkU2VsVmFyLmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgYVByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKGFQcm9wTmFtZXNbaV0sIG9EZWZhdWx0ZWRTZWxWYXIuZ2V0VmFsdWUoYVByb3BOYW1lc1tpXSkhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b05hdmlnYXRpb25TZWxWYXI6IG9OYXZpZ2F0aW9uU2VsVmFyLFxuXHRcdFx0b0RlZmF1bHRlZFNlbFZhcjogb0RlZmF1bHRlZFNlbFZhcixcblx0XHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk6IGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHlcblx0XHR9O1xuXHR9XG5cblx0X2FkZFBhcmFtZXRlclZhbHVlcyhvU2VsVmFyaWFudDogYW55LCBzUHJvcE5hbWU6IGFueSwgc1NpZ246IGFueSwgc09wdGlvbjogYW55LCBvVmFsdWVzOiBhbnkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShvVmFsdWVzKSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9TZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIHNTaWduLCBzT3B0aW9uLCBvVmFsdWVzW2ldKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0b1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgc1NpZ24sIHNPcHRpb24sIG9WYWx1ZXMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBVUkwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNBcHBTdGF0ZUtleS4gQXMgYW4gcmVhY3Rpb24gcm91dGUgY2hhbmdlIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBuZXcgYXBwIHN0YXRlIGtleS5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0cmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBvSGFzaENoYW5nZXIgPSB0aGlzLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gdGhpcy5vUm91dGVyLm9IYXNoQ2hhbmdlciA6IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdC8qXG5cdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsIGlzXG5cdFx0ICogbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdCAqL1xuXHRcdGNvbnN0IHNBcHBIYXNoTmV3ID0gdGhpcy5fcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2hPbGQsIHNBcHBTdGF0ZUtleSk7XG5cdFx0b0hhc2hDaGFuZ2VyLnJlcGxhY2VIYXNoKHNBcHBIYXNoTmV3KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBVUkwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGFwcCBzdGF0ZSBhbmQgc3RvcmVzIHRoZSBhcHAgc3RhdGUgZm9yIGxhdGVyIHJldHJpZXZhbC5cblx0ICpcblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gYkltbWVkaWF0ZUhhc2hSZXBsYWNlIElmIHNldCB0byBmYWxzZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIHVudGlsIHN0b3JpbmcgaXMgc3VjY2Vzc2Z1bDsgZG8gbm90XG5cdCAqICAgICAgICBzZXQgdG8gZmFsc2UgaWYgeW91IGNhbm5vdCByZWFjdCB0byB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgUHJvbWlzZSwgZm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyB0aGUgYmVmb3JlTGlua1ByZXNzZWQgZXZlbnRcblx0ICogQHBhcmFtIGJTa2lwSGFzaFJlcGxhY2UgSWYgc2V0IHRvIHRydWUsIHRoZSBpbm5lciBhcHAgaGFzaCB3aWxsIG5vdCBiZSByZXBsYWNlZCBpbiB0aGUgc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMuIEFsc28gdGhlIGJJbW1lZGlhdGVIYXNoUmVwbGFjZVxuXHQgKiBcdFx0ICB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCB0aGUgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkOyBpZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBhcHAgc3RhdGUga2V5IGlzIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIG9iamVjdCBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXNcblx0ICogICAgICAgICAgcmV0dXJuZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG1Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0dmFyIG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKG1Jbm5lckFwcERhdGEpO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmRvbmUoZnVuY3Rpb24oc0FwcFN0YXRlS2V5KXtcblx0ICogXHRcdC8veW91ciBpbm5lciBhcHAgc3RhdGUgaXMgc2F2ZWQgbm93LCBzQXBwU3RhdGVLZXkgd2FzIGFkZGVkIHRvIFVSTFxuXHQgKiBcdFx0Ly9wZXJmb3JtIGFjdGlvbnMgdGhhdCBtdXN0IHJ1biBhZnRlciBzYXZlXG5cdCAqIFx0fSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZmFpbChmdW5jdGlvbihvRXJyb3Ipe1xuXHQgKiBcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0fSk7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHRzdG9yZUlubmVyQXBwU3RhdGVBc3luYyhcblx0XHRtSW5uZXJBcHBEYXRhOiBJbm5lckFwcERhdGEsXG5cdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlPzogYm9vbGVhbixcblx0XHRiU2tpcEhhc2hSZXBsYWNlPzogYm9vbGVhblxuXHQpOiBqUXVlcnkuUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAodHlwZW9mIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSAhPT0gXCJib29sZWFuXCIpIHtcblx0XHRcdGJJbW1lZGlhdGVIYXNoUmVwbGFjZSA9IHRydWU7IC8vIGRlZmF1bHRcblx0XHR9XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdGNvbnN0IG9NeURlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHRjb25zdCBmblJlcGxhY2VIYXNoID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHRjb25zdCBvSGFzaENoYW5nZXIgPSBvTmF2SGFuZGxlci5vUm91dGVyLm9IYXNoQ2hhbmdlciA/IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyIDogSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRcdGNvbnN0IHNBcHBIYXNoT2xkID0gb0hhc2hDaGFuZ2VyLmdldEhhc2goKTtcblx0XHRcdC8qXG5cdFx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGxcblx0XHRcdCAqIGlzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hOZXcgPSBvTmF2SGFuZGxlci5fcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2hPbGQsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRvSGFzaENoYW5nZXIucmVwbGFjZUhhc2goc0FwcEhhc2hOZXcpO1xuXHRcdH07XG5cblx0XHQvLyBpbiBjYXNlIG1Jbm5lckFwcFN0YXRlIGlzIGVtcHR5LCBkbyBub3Qgb3ZlcndyaXRlIHRoZSBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0aWYgKGlzRW1wdHlPYmplY3QobUlubmVyQXBwRGF0YSBhcyBvYmplY3QpKSB7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKFwiXCIpO1xuXHRcdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0XHR9XG5cblx0XHQvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IHNhdmVkIHRoZSBzYW1lIGRhdGFcblx0XHRjb25zdCBzQXBwU3RhdGVLZXlDYWNoZWQgPSB0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleTtcblxuXHRcdGNvbnN0IGJJbm5lckFwcERhdGFFcXVhbCA9IEpTT04uc3RyaW5naWZ5KG1Jbm5lckFwcERhdGEpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhKTtcblx0XHRpZiAoYklubmVyQXBwRGF0YUVxdWFsICYmIHNBcHBTdGF0ZUtleUNhY2hlZCkge1xuXHRcdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBmb3VuZCBpbiBjYWNoZVxuXHRcdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVIaXQrKztcblxuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIGNhY2hlZCBhcHBTdGF0ZUtleSBpbiB1cmwgKGp1c3QgaW4gY2FzZSB0aGUgYXBwIGhhcyBjaGFuZ2VkIHRoZSBoYXNoIGluIG1lYW50aW1lKVxuXHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXlDYWNoZWQpO1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShzQXBwU3RhdGVLZXlDYWNoZWQpO1xuXHRcdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0XHR9XG5cblx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIG5vdCBmb3VuZCBpbiBjYWNoZVxuXHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlTWlzcysrO1xuXG5cdFx0Y29uc3QgZm5PbkFmdGVyU2F2ZSA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdGlmICghYlNraXBIYXNoUmVwbGFjZSAmJiAhYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVtZW1iZXIgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdFx0b05hdkhhbmRsZXIuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEgPSBtSW5uZXJBcHBEYXRhO1xuXHRcdFx0b05hdkhhbmRsZXIuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5ID0gc0FwcFN0YXRlS2V5O1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShzQXBwU3RhdGVLZXkpO1xuXHRcdH07XG5cblx0XHRjb25zdCBmbk9uRXJyb3IgPSBmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdH07XG5cblx0XHR0aGlzLl9zYXZlQXBwU3RhdGVBc3luYyhtSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdFx0LyogTm90ZSB0aGF0IF9zYXBBcHBTdGF0ZSBtYXkgcmV0dXJuICd1bmRlZmluZWQnIGluIGNhc2UgdGhhdCB0aGUgcGFyc2luZyBoYXMgZmFpbGVkLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgcmVwbGFjZW1lbnRcblx0XHRcdFx0ICogb2YgdGhlIEFwcCBIYXNoIHdpdGggdGhlIGdlbmVyYXRlZCBrZXksIGFzIHRoZSBjb250YWluZXIgd2FzIG5vdCB3cml0dGVuIGJlZm9yZS4gTm90ZSBhcyB3ZWxsIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBhbHJlYWR5XG5cdFx0XHRcdCAqIGhhcHBlbmVkIGJlZm9yZSBieSBtYWtpbmcgdGhlIG9NeURlZmVycmVkIHByb21pc2UgZmFpbCAoc2VlIGZuT25FcnJvciBhYm92ZSkuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAoc0FwcFN0YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0XHRcdC8vIG5vdGU6IHdlIGRvIG5vdCB3YWl0IGZvciB0aGUgc2F2ZSB0byBiZSBjb21wbGV0ZWQ6IHRoaXMgYXN5bmNocm9ub3VzbHkgYmVoYXZpb3VyIGlzIG5lY2Vzc2FyeSBpZlxuXHRcdFx0XHRcdC8vIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBlLmcuIGluIGEgb25MaW5rUHJlc3NlZCBldmVudCB3aXRoIG5vIHBvc3NpYmlsaXR5IHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJlc29sdXRpb25cblx0XHRcdFx0XHRpZiAoIWJTa2lwSGFzaFJlcGxhY2UgJiYgYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX3NhdmVBcHBTdGF0ZUFzeW5jIGZhaWxlZFwiKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBVUkwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGFwcCBzdGF0ZSBhbmQgc3RvcmVzIHRoZSBhcHAgc3RhdGUgZm9yIGxhdGVyIHJldHJpZXZhbC5cblx0ICpcblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gYkltbWVkaWF0ZUhhc2hSZXBsYWNlIElmIHNldCB0byBmYWxzZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIHVudGlsIHN0b3JpbmcgaXMgc3VjY2Vzc2Z1bDsgZG8gbm90XG5cdCAqICAgICAgICBzZXQgdG8gZmFsc2UgaWYgeW91IGNhbm5vdCByZWFjdCB0byB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgUHJvbWlzZSwgZm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyB0aGUgYmVmb3JlTGlua1ByZXNzZWQgZXZlbnRcblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGFwcCBzdGF0ZSBrZXkgaXMgcmV0dXJuZWQ7IGlmIGFuIGVycm9yIG9jY3VycywgYW4gb2JqZWN0IG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpc1xuXHQgKiAgICAgICAgICByZXR1cm5lZFxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlKG1Jbm5lckFwcERhdGEpO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmRvbmUoZnVuY3Rpb24oc0FwcFN0YXRlS2V5KXtcblx0ICogXHRcdC8veW91ciBpbm5lciBhcHAgc3RhdGUgaXMgc2F2ZWQgbm93LCBzQXBwU3RhdGVLZXkgd2FzIGFkZGVkIHRvIFVSTFxuXHQgKiBcdFx0Ly9wZXJmb3JtIGFjdGlvbnMgdGhhdCBtdXN0IHJ1biBhZnRlciBzYXZlXG5cdCAqIFx0fSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZmFpbChmdW5jdGlvbihvRXJyb3Ipe1xuXHQgKiBcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0fSk7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqIEBkZXByZWNhdGVkc2luY2UgMS4xMDRcblx0ICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmN9IGluc3RlYWQuXG5cdCAqL1xuXHRzdG9yZUlubmVyQXBwU3RhdGUobUlubmVyQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBiSW1tZWRpYXRlSGFzaFJlcGxhY2U/OiBib29sZWFuKTogalF1ZXJ5LlByb21pc2U8c3RyaW5nPiB7XG5cdFx0TG9nLmVycm9yKFxuXHRcdFx0XCJEZXByZWNhdGVkIEFQSSBjYWxsIG9mICdzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGUnLiBQbGVhc2UgdXNlICdzdG9yZUlubmVyQXBwU3RhdGVBc3luYycgaW5zdGVhZFwiLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XCJzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclwiXG5cdFx0KTtcblx0XHRpZiAodHlwZW9mIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSAhPT0gXCJib29sZWFuXCIpIHtcblx0XHRcdGJJbW1lZGlhdGVIYXNoUmVwbGFjZSA9IHRydWU7IC8vIGRlZmF1bHRcblx0XHR9XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdGNvbnN0IG9NeURlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHRjb25zdCBmblJlcGxhY2VIYXNoID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHRjb25zdCBvSGFzaENoYW5nZXIgPSBvTmF2SGFuZGxlci5vUm91dGVyLm9IYXNoQ2hhbmdlciA/IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyIDogSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRcdGNvbnN0IHNBcHBIYXNoT2xkID0gb0hhc2hDaGFuZ2VyLmdldEhhc2goKTtcblx0XHRcdC8qXG5cdFx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGxcblx0XHRcdCAqIGlzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hOZXcgPSBvTmF2SGFuZGxlci5fcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2hPbGQsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRvSGFzaENoYW5nZXIucmVwbGFjZUhhc2goc0FwcEhhc2hOZXcpO1xuXHRcdH07XG5cblx0XHQvLyBpbiBjYXNlIG1Jbm5lckFwcFN0YXRlIGlzIGVtcHR5LCBkbyBub3Qgb3ZlcndyaXRlIHRoZSBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0aWYgKGlzRW1wdHlPYmplY3QobUlubmVyQXBwRGF0YSBhcyBvYmplY3QpKSB7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKFwiXCIpO1xuXHRcdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0XHR9XG5cblx0XHQvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IHNhdmVkIHRoZSBzYW1lIGRhdGFcblx0XHRjb25zdCBzQXBwU3RhdGVLZXlDYWNoZWQgPSB0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleTtcblxuXHRcdGNvbnN0IGJJbm5lckFwcERhdGFFcXVhbCA9IEpTT04uc3RyaW5naWZ5KG1Jbm5lckFwcERhdGEpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhKTtcblx0XHRpZiAoYklubmVyQXBwRGF0YUVxdWFsICYmIHNBcHBTdGF0ZUtleUNhY2hlZCkge1xuXHRcdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBmb3VuZCBpbiBjYWNoZVxuXHRcdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVIaXQrKztcblxuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIGNhY2hlZCBhcHBTdGF0ZUtleSBpbiB1cmwgKGp1c3QgaW4gY2FzZSB0aGUgYXBwIGhhcyBjaGFuZ2VkIHRoZSBoYXNoIGluIG1lYW50aW1lKVxuXHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXlDYWNoZWQpO1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShzQXBwU3RhdGVLZXlDYWNoZWQpO1xuXHRcdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0XHR9XG5cblx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIG5vdCBmb3VuZCBpbiBjYWNoZVxuXHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlTWlzcysrO1xuXG5cdFx0Y29uc3QgZm5PbkFmdGVyU2F2ZSA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdGlmICghYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVtZW1iZXIgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdFx0b05hdkhhbmRsZXIuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEgPSBtSW5uZXJBcHBEYXRhO1xuXHRcdFx0b05hdkhhbmRsZXIuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5ID0gc0FwcFN0YXRlS2V5O1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShzQXBwU3RhdGVLZXkpO1xuXHRcdH07XG5cblx0XHRjb25zdCBmbk9uRXJyb3IgPSBmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdH07XG5cblx0XHRjb25zdCBzQXBwU3RhdGVLZXkgPSB0aGlzLl9zYXZlQXBwU3RhdGUobUlubmVyQXBwRGF0YSwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHQvKlxuXHRcdCAqIE5vdGUgdGhhdCBfc2FwQXBwU3RhdGUgbWF5IHJldHVybiAndW5kZWZpbmVkJyBpbiBjYXNlIHRoYXQgdGhlIHBhcnNpbmcgaGFzIGZhaWxlZC4gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgbm90IHRyaWdnZXIgdGhlIHJlcGxhY2VtZW50XG5cdFx0ICogb2YgdGhlIEFwcCBIYXNoIHdpdGggdGhlIGdlbmVyYXRlZCBrZXksIGFzIHRoZSBjb250YWluZXIgd2FzIG5vdCB3cml0dGVuIGJlZm9yZS4gTm90ZSBhcyB3ZWxsIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBhbHJlYWR5XG5cdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHQgKi9cblx0XHRpZiAoc0FwcFN0YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHQvLyBub3RlOiB3ZSBkbyBub3Qgd2FpdCBmb3IgdGhlIHNhdmUgdG8gYmUgY29tcGxldGVkOiB0aGlzIGFzeW5jaHJvbm91c2x5IGJlaGF2aW91ciBpcyBuZWNlc3NhcnkgaWZcblx0XHRcdC8vIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBlLmcuIGluIGEgb25MaW5rUHJlc3NlZCBldmVudCB3aXRoIG5vIHBvc3NpYmlsaXR5IHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJlc29sdXRpb25cblx0XHRcdGlmIChiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBhcHAgc3RhdGUgYW5kIHN0b3JlcyB0aGUgYXBwIHN0YXRlIGZvciBsYXRlciByZXRyaWV2YWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBtSW5uZXJBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSBJZiBzZXQgdG8gZmFsc2UsIHRoZSBpbm5lciBhcHAgaGFzaCB3aWxsIG5vdCBiZSByZXBsYWNlZCB1bnRpbCBzdG9yaW5nIGlzIHN1Y2Nlc3NmdWw7IGRvIG5vdFxuXHQgKiAgICAgICAgc2V0IHRvIGZhbHNlIGlmIHlvdSBjYW5ub3QgcmVhY3QgdG8gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UsIGZvciBleGFtcGxlLCB3aGVuIGNhbGxpbmcgdGhlIGJlZm9yZUxpbmtQcmVzc2VkIGV2ZW50LiA8Yj5Ob3RlOjwvYj5JZlxuXHQgKiAgICAgICAgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBzZXQgdG8gZmFsc2UuIDxiPk5vdGU6PC9iPklmIHNldCB0byB0cnVlLCB0aGUgY2FsbGluZyBpbnN0YW5jZSBoYXMgdG8gZW5zdXJlIHRoYXQgYSBmb2xsb3ctb25cblx0ICogICAgICAgIGNhbGwgdG8gPGNvZGU+cmVwbGFjZUhhc2g8L2NvZGU+IHdpbGwgdGFrZSBwbGFjZSFcblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFwcFN0YXRlSWQgYW5kIGEgcHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCB0aGUgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuXG5cdCAqICAgICAgICAgIGV4ZWN1dGVkOyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhcHBTdGF0ZUtleSBtYXkgYmUgdW5kZWZpbmVkIG9yIGVtcHR5LlxuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG1Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0dmFyIG9TdG9yZUlubmVyQXBwU3RhdGUgPSBzdG9yZUlubmVyQXBwU3RhdGVXaXRoTm9uRGVsYXllZFJldHVybihtSW5uZXJBcHBEYXRhKTtcblx0ICogXHR2YXIgc0FwcFN0YXRlS2V5ID0gb1N0b3JlSW5uZXJBcHBTdGF0ZS5hcHBTdGF0ZUtleTtcblx0ICogXHRpZiAoIXNBcHBTdGF0ZUtleSkge1xuXHQgKiAgICAvLyBubyBhcHBTdGF0ZUtleSBvYnRhaW5lZC4uLlxuXHQgKiBcdH07XG5cdCAqIFx0dmFyIG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gb1N0b3JlSW5uZXJBcHBTdGF0ZS5wcm9taXNlO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmRvbmUoZnVuY3Rpb24oc0FwcFN0YXRlS2V5KXtcblx0ICogXHRcdC8veW91ciBpbm5lciBhcHAgc3RhdGUgaXMgc2F2ZWQgbm93LCBzQXBwU3RhdGVLZXkgd2FzIGFkZGVkIHRvIFVSTFxuXHQgKiBcdFx0Ly9wZXJmb3JtIGFjdGlvbnMgdGhhdCBtdXN0IHJ1biBhZnRlciBzYXZlXG5cdCAqIFx0fSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZmFpbChmdW5jdGlvbihvRXJyb3Ipe1xuXHQgKiBcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0fSk7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqIEBwdWJsaWNcblx0ICogQGRlcHJlY2F0ZWRzaW5jZSAxLjEwNFxuXHQgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVBc3luY30gaW5zdGVhZC5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4obUlubmVyQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBiSW1tZWRpYXRlSGFzaFJlcGxhY2U/OiBib29sZWFuKTogb2JqZWN0IHtcblx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcIkRlcHJlY2F0ZWQgQVBJIGNhbGwgb2YgJ3NhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4nLiBQbGVhc2UgdXNlICdzdG9yZUlubmVyQXBwU3RhdGVBc3luYycgaW5zdGVhZFwiLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XCJzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclwiXG5cdFx0KTtcblx0XHRpZiAodHlwZW9mIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSAhPT0gXCJib29sZWFuXCIpIHtcblx0XHRcdGJJbW1lZGlhdGVIYXNoUmVwbGFjZSA9IGZhbHNlOyAvLyBkZWZhdWx0XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdGNvbnN0IG9BcHBTdGF0ZVByb21pc2UgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YXBwU3RhdGVLZXk6IFwiXCIsXG5cdFx0XHRcdHByb21pc2U6IG9BcHBTdGF0ZVByb21pc2UucmVzb2x2ZShcIlwiKVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IHNhdmVkIHRoZSBzYW1lIGRhdGFcblx0XHRjb25zdCBzQXBwU3RhdGVLZXlDYWNoZWQgPSB0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleTtcblxuXHRcdGNvbnN0IGJJbm5lckFwcERhdGFFcXVhbCA9IEpTT04uc3RyaW5naWZ5KG1Jbm5lckFwcERhdGEpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhKTtcblx0XHRpZiAoYklubmVyQXBwRGF0YUVxdWFsICYmIHNBcHBTdGF0ZUtleUNhY2hlZCkge1xuXHRcdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBmb3VuZCBpbiBjYWNoZVxuXHRcdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVIaXQrKztcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXlDYWNoZWQsXG5cdFx0XHRcdHByb21pc2U6IG9BcHBTdGF0ZVByb21pc2UucmVzb2x2ZShzQXBwU3RhdGVLZXlDYWNoZWQpXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgbm90IGZvdW5kIGluIGNhY2hlXG5cdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVNaXNzKys7XG5cblx0XHRjb25zdCBmbk9uQWZ0ZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0aWYgKCFiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0b05hdkhhbmRsZXIucmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVtZW1iZXIgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdFx0b05hdkhhbmRsZXIuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEgPSBtSW5uZXJBcHBEYXRhO1xuXHRcdFx0b05hdkhhbmRsZXIuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5ID0gc0FwcFN0YXRlS2V5O1xuXHRcdFx0b0FwcFN0YXRlUHJvbWlzZS5yZXNvbHZlKHNBcHBTdGF0ZUtleSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0b0FwcFN0YXRlUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gdGhpcy5fc2F2ZUFwcFN0YXRlKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0Lypcblx0XHQgKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdCAqIG9mIHRoZSBBcHAgSGFzaCB3aXRoIHRoZSBnZW5lcmF0ZWQga2V5LCBhcyB0aGUgY29udGFpbmVyIHdhcyBub3Qgd3JpdHRlbiBiZWZvcmUuIE5vdGUgYXMgd2VsbCB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBoYXMgYWxyZWFkeVxuXHRcdCAqIGhhcHBlbmVkIGJlZm9yZSBieSBtYWtpbmcgdGhlIG9NeURlZmVycmVkIHByb21pc2UgZmFpbCAoc2VlIGZuT25FcnJvciBhYm92ZSkuXG5cdFx0ICovXG5cdFx0Ly8gaWYgKHNBcHBTdGF0ZUtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gLy9yZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdC8vIC8vbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0Ly8gLy90aGlzIG1ldGhvZCBpcyBjYWxsZWQgZS5nLiBpbiBhIG9uTGlua1ByZXNzZWQgZXZlbnQgd2l0aCBubyBwb3NzaWJpbGl0eSB0byB3YWl0IGZvciB0aGUgcHJvbWlzZSByZXNvbHV0aW9uXG5cdFx0Ly8gaWYgKGJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdC8vIGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHQvLyB9XG5cdFx0Ly8gfVxuXHRcdHJldHVybiB7XG5cdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0cHJvbWlzZTogb0FwcFN0YXRlUHJvbWlzZS5wcm9taXNlKClcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3NlcyBuYXZpZ2F0aW9uLXJlbGF0ZWQgdGFza3MgcmVsYXRlZCB0byBiZWZvcmVQb3BvdmVyT3BlbnMgZXZlbnQgaGFuZGxpbmcgZm9yIHRoZSBTbWFydExpbmsgY29udHJvbCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0LiBJblxuXHQgKiBwYXJ0aWN1bGFyLCB0aGUgZm9sbG93aW5nIHRhc2tzIGFyZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBTbWFydExpbmsgcG9wb3ZlciBjYW4gYmUgb3BlbmVkOlxuXHQgKiA8dWw+XG5cdCAqIDxsaT5JZiA8Y29kZT5tSW5uZXJBcHBEYXRhPC9jb2RlPiBpcyBwcm92aWRlZCwgdGhpcyBpbm5lciBhcHAgc3RhdGUgaXMgc2F2ZWQgZm9yIGJhY2sgbmF2aWdhdGlvbiBhdCBhIGxhdGVyIHRpbWUuPC9saT5cblx0ICogPGxpPlRoZSB0YWJsZSBldmVudCBwYXJhbWV0ZXJzIChzZW1hbnRpYyBhdHRyaWJ1dGVzKSBhbmQgdGhlIHNlbGVjdGlvbiB2YXJpYW50IGRhdGEgYXJlIGNvbWJpbmVkIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZFxuXHQgKiB7QGxpbmsgIy5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCBtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudH0uPC9saT5cblx0ICogPGxpPlRoZSBjb21iaW5lZCBkYXRhIGlzIHNhdmVkIGFzIHRoZSBjcm9zcyBhcHAgc3RhdGUgdG8gYmUgaGFuZGVkIG92ZXIgdG8gdGhlIHRhcmdldCBhcHAsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzYXAteGFwcC1zdGF0ZSBrZXkgaXMgc2V0XG5cdCAqIGluIHRoZSBVUkwuPC9saT5cblx0ICogPGxpPkFsbCBzaW5nbGUgc2VsZWN0aW9ucyAoXCJpbmNsdWRpbmcgZXF1YWxcIikgb2YgdGhlIGNvbWJpbmVkIHNlbGVjdGlvbiBkYXRhIGFyZSBwYXNzZWQgdG8gdGhlIFNtYXJ0TGluayBwb3BvdmVyIGFzIHNlbWFudGljIGF0dHJpYnV0ZXMuPC9saT5cblx0ICogPGxpPlRoZSBtZXRob2QgPGNvZGU+b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLm9wZW4oKTwvY29kZT4gaXMgY2FsbGVkLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCByZWFsbHkgb3BlbiB0aGUgcG9wb3ZlciwgYnV0IHRoZSBTbWFydExpbmtcblx0ICogY29udHJvbCBwcm9jZWVkcyB3aXRoIGZpcmluZyB0aGUgZXZlbnQgPGNvZGU+bmF2aWdhdGlvblRhcmdldHNPYnRhaW5lZDwvY29kZT4uPC9saT5cblx0ICogPC91bD4uXG5cdCAqIDxicj5cblx0ICogPGI+Tm9kZTo8L2I+IElmIHRoZSA8Y29kZT5vRXh0ZXJuYWxBcHBEYXRhPC9jb2RlPiBwYXJhbWV0ZXIgaXMgbm90IHN1cHBsaWVkLCB0aGUgZXh0ZXJuYWwgYXBwIGRhdGEgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uXG5cdCAqIHRoZSA8Y29kZT5tSW5uZXJBcHBEYXRhPC9jb2RlPiBkYXRhLjxicj4uXG5cdCAqXG5cdCAqIEBwYXJhbSBvVGFibGVFdmVudFBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnMgbWFkZSBhdmFpbGFibGUgYnkgdGhlIFNtYXJ0VGFibGUgY29udHJvbCB3aGVuIHRoZSBTbWFydExpbmsgY29udHJvbCBoYXMgYmVlbiBjbGlja2VkLFxuXHQgKiAgICAgICAgYW4gaW5zdGFuY2Ugb2YgYSBQb3BPdmVyIG9iamVjdFxuXHQgKiBAcGFyYW0gc1NlbGVjdGlvblZhcmlhbnQgU3RyaW5naWZpZWQgSlNPTiBvYmplY3QgYXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCBmcm9tIGdldERhdGFTdWl0ZUZvcm1hdCgpIG9mIHRoZSBTbWFydEZpbHRlckJhciBjb250cm9sXG5cdCAqIEBwYXJhbSBtSW5uZXJBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHAuIElmIHByb3ZpZGVkLCBvcGVuaW5nIHRoZSBQb3BvdmVyIGlzIGRlZmVycmVkIHVudGlsIHRoZVxuXHQgKiAgICAgICAgaW5uZXIgYXBwIGRhdGEgaXMgc2F2ZWQgaW4gYSBjb25zaXN0ZW50IHdheS5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0YXJnZXQgc2NyZWVuLlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50IE9iamVjdCBjb250YWluaW5nIHNlbGVjdGlvblZhcmlhbnQsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0YXJnZXQgc2NyZWVuLiBJZiBub3Rcblx0ICogICAgICAgIHNldCB0aGUgc1NlbGVjdGlvblZhcmlhbnQgd2lsbCBiZSB1c2VkLlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50IE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHVpIHByZXNlbnRhdGlvblZhcmlhbnQgb2YgdGhlIGFwcCwgd2hpY2ggd2lsbCBiZVxuXHQgKiAgICAgICAgcGFzc2VkIHRvIHRoZSB0YXJnZXQgc2NyZWVuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnZhbHVlVGV4dHMgT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgZGVzY3JpcHRpb25zLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGFyZ2V0IHNjcmVlblxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkOyBpZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBtb2RpZmllZCBvVGFibGVFdmVudFBhcmFtZXRlcnMgaXMgcmV0dXJuZWQ7IGlmIGFuIGVycm9yIG9jY3VycywgYW4gZXJyb3Igb2JqZWN0IG9mIHR5cGVcblx0ICogICAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpcyByZXR1cm5lZFxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0Ly9ldmVudCBoYW5kbGVyIGZvciB0aGUgc21hcnQgbGluayBldmVudCBcImJlZm9yZVBvcG92ZXJPcGVuc1wiXG5cdCAqIFx0XHRvbkJlZm9yZVBvcG92ZXJPcGVuczogZnVuY3Rpb24ob0V2ZW50KSB7XG5cdCAqIFx0XHRcdHZhciBvVGFibGVFdmVudFBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVycygpO1xuXHQgKlxuXHQgKiBcdFx0XHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0XHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0XHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0XHRcdH07XG5cdCAqXG5cdCAqIFx0XHRcdHZhciBvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdCAqIFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkNvbXBhbnlDb2RlXCIsIFwiSVwiLCBcIkVRXCIsIFwiMDAwMVwiKTtcblx0ICogXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ3VzdG9tZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCJDMDAwMVwiKTtcblx0ICogXHRcdFx0dmFyIHNTZWxlY3Rpb25WYXJpYW50PSBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHRcdFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0XHRcdHZhciBvU21hcnRMaW5rUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5wcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zKG9UYWJsZUV2ZW50UGFyYW1ldGVycywgc1NlbGVjdGlvblZhcmlhbnQsIG1Jbm5lckFwcERhdGEpO1xuXHQgKlxuXHQgKiBcdFx0XHRvU21hcnRMaW5rUHJvbWlzZS5kb25lKGZ1bmN0aW9uKG9UYWJsZUV2ZW50UGFyYW1ldGVycyl7XG5cdCAqIFx0XHRcdFx0Ly8gaGVyZSB5b3UgY2FuIGFkZCBjb2RpbmcgdGhhdCBzaG91bGQgcnVuIGFmdGVyIGFsbCBhcHAgc3RhdGVzIGFyZSBzYXZlZCBhbmQgdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgYXJlIHNldFxuXHQgKiBcdFx0XHR9KTtcblx0ICpcblx0ICogXHRcdFx0b1NtYXJ0TGlua1Byb21pc2UuZmFpbChmdW5jdGlvbihvRXJyb3Ipe1xuXHQgKiBcdFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHRcdFx0fSk7XG5cdCAqIFx0XHR9O1xuXHQgKiBcdH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHRwcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zKFxuXHRcdG9UYWJsZUV2ZW50UGFyYW1ldGVyczogYW55LFxuXHRcdHNTZWxlY3Rpb25WYXJpYW50OiBzdHJpbmcsXG5cdFx0bUlubmVyQXBwRGF0YT86IElubmVyQXBwRGF0YSxcblx0XHRvRXh0ZXJuYWxBcHBEYXRhPzoge1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3Q7XG5cdFx0XHR2YWx1ZVRleHRzPzogb2JqZWN0O1xuXHRcdH1cblx0KTogSlF1ZXJ5LlByb21pc2U8YW55LCBhbnksIGFueT4ge1xuXHRcdGNvbnN0IG9NeURlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cdFx0bGV0IG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueTtcblx0XHRpZiAob1RhYmxlRXZlbnRQYXJhbWV0ZXJzICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0bVNlbWFudGljQXR0cmlidXRlcyA9IG9UYWJsZUV2ZW50UGFyYW1ldGVycy5zZW1hbnRpY0F0dHJpYnV0ZXM7XG5cdFx0fVxuXG5cdFx0bGV0IG9YQXBwRGF0YU9iajogYW55O1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyOiBOYXZpZ2F0aW9uSGFuZGxlciA9IHRoaXM7XG5cblx0XHRpZiAob0V4dGVybmFsQXBwRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0gb0V4dGVybmFsQXBwRGF0YTtcblx0XHR9XG5cblx0XHRjb25zdCBmblN0b3JlWGFwcEFuZENhbGxPcGVuID0gZnVuY3Rpb24gKG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSwgc1N1YlNlbGVjdGlvblZhcmlhbnQ6IGFueSkge1xuXHRcdFx0Ly8gbWl4IHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIChlLmcuIGZyb20gdGhlIHJvdyBsaW5lKSB3aXRoIHRoZSBzZWxlY3Rpb24gdmFyaWFudCAoZS5nLiBmcm9tIHRoZSBmaWx0ZXIgYmFyKVxuXHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQgPSBvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCB8fCBzU3ViU2VsZWN0aW9uVmFyaWFudCB8fCBcInt9XCI7XG5cblx0XHRcdGNvbnN0IGlTdXBwcmVzc2lvbkJlaGF2aW9yID0gU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25OdWxsIHwgU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25VbmRlZmluZWQ7XG5cdFx0XHQvKlxuXHRcdFx0ICogY29tcGF0aWJsaXR5OiBVbnRpbCBTQVBVSTUgMS4yOC41IChvciBldmVuIGxhdGVyKSB0aGUgU21hcnQgTGluayBpbiBhIFNtYXJ0IFRhYmxlIGlzIGZpbHRlcmluZyBhbGwgbnVsbC0gYW5kIHVuZGVmaW5lZCB2YWx1ZXMuXG5cdFx0XHQgKiBUaGVyZWZvcmUsIG1TZW1hbnRpY0F0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcmVkdWNlZCBhcHByb3ByaWF0ZWx5IC0tIHRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSBkb25lIGJ5XG5cdFx0XHQgKiBtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCBhZ2Fpbi4gVG8gZW5zdXJlIHRoYXQgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIGJlaGF2aW91ciAoaS5lLiBhbiBOYXZFcnJvciBpcyByYWlzZWQgaW4gY2FzZSB0aGF0XG5cdFx0XHQgKiBiZWhhdmlvdXIgb2YgdGhlIFNtYXJ0IExpbmsgY29udHJvbCBoYXMgY2hhbmdlZCksIHRoZSBcIm9sZFwiIFN1cHByZXNzaW9uIEJlaGF2aW91ciBpcyByZXRhaW5lZC5cblx0XHRcdCAqL1xuXG5cdFx0XHRjb25zdCBvTWl4ZWRTZWxWYXIgPSBvTmF2SGFuZGxlci5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChcblx0XHRcdFx0bVN1YlNlbWFudGljQXR0cmlidXRlcyxcblx0XHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdGlTdXBwcmVzc2lvbkJlaGF2aW9yXG5cdFx0XHQpO1xuXHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQgPSBvTWl4ZWRTZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cblx0XHRcdC8vIGVucmljaCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyB3aXRoIHNpbmdsZSBzZWxlY3Rpb25zIGZyb20gdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0XHRsZXQgb1RtcERhdGE6IGFueSA9IHt9O1xuXHRcdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9NaXhlZFNlbFZhci50b0pTT05PYmplY3QoKTtcblxuXHRcdFx0b1RtcERhdGEgPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1RtcERhdGEpO1xuXG5cdFx0XHRvVG1wRGF0YSA9IG9OYXZIYW5kbGVyLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1RtcERhdGEpO1xuXG5cdFx0XHRtU3ViU2VtYW50aWNBdHRyaWJ1dGVzID0gb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudFxuXHRcdFx0XHQ/IG9OYXZIYW5kbGVyLl9nZXRVUkxQYXJhbWV0ZXJzRnJvbVNlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkpXG5cdFx0XHRcdDoge307XG5cblx0XHRcdGNvbnN0IGZuT25Db250YWluZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHRcdGlmIChvVGFibGVFdmVudFBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIElmIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBpcyB1bmRlZmluZWQsIHJldHVybiBib3RoIHNlbWFudGljQXR0cmlidXRlcyBhbmQgYXBwU3RhdGVrZXlcblx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gc2V0IHRoZSBzdG9yZWQgZGF0YSBpbiBwb3BvdmVyIGFuZCBjYWxsIG9wZW4oKVxuXHRcdFx0XHRcdG9UYWJsZUV2ZW50UGFyYW1ldGVycy5zZXRTZW1hbnRpY0F0dHJpYnV0ZXMobVN1YlNlbWFudGljQXR0cmlidXRlcyk7XG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLnNldEFwcFN0YXRlS2V5KHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLm9wZW4oKTsgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gTm90ZSB0aGF0IFwib3BlblwiIGRvZXMgbm90IG9wZW4gdGhlIHBvcG92ZXIsIGJ1dCBwcm9jZWVkc1xuXHRcdFx0XHRcdC8vIHdpdGggZmlyaW5nIHRoZSBvbk5hdlRhcmdldHNPYnRhaW5lZCBldmVudC5cblx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9UYWJsZUV2ZW50UGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH07XG5cblx0XHRcdG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50ID0gc1N1YlNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9OYXZIYW5kbGVyLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvWEFwcERhdGFPYmopO1xuXG5cdFx0XHRvTmF2SGFuZGxlci5fc2F2ZUFwcFN0YXRlQXN5bmMob1hBcHBEYXRhT2JqLCBmbk9uQ29udGFpbmVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHR9O1xuXG5cdFx0aWYgKG1Jbm5lckFwcERhdGEpIHtcblx0XHRcdGNvbnN0IG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gdGhpcy5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhtSW5uZXJBcHBEYXRhLCB0cnVlKTtcblxuXHRcdFx0Ly8gaWYgdGhlIGlubmVyIGFwcCBzdGF0ZSB3YXMgc3VjY2Vzc2Z1bGx5IHN0b3JlZCwgc3RvcmUgYWxzbyB0aGUgeGFwcC1zdGF0ZVxuXHRcdFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4obVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRoZXJlIGlzIG5vIGlubmVyIGFwcCBzdGF0ZSB0byBzYXZlLCBqdXN0IHB1dCB0aGUgcGFyYW1ldGVycyBpbnRvIHhhcHAtc3RhdGVcblx0XHRcdGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4obVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIHNlbGVjdGlvblZhcmlhbnQgc3RyaW5nIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgKHNlbWFudGljQXR0cmlidXRlcyBhbmQgQXBwU3RhdGVLZXkpLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbGVjdGlvblZhcmlhbnQgU3RyaW5naWZpZWQgSlNPTiBvYmplY3Rcblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgc2VtYW50aWNBdHRyaWJ1dGVzIGFzIHdlbGwgYXMgdGhlIGFwcFN0YXRlS2V5IGFyZSByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZVxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzIHJldHVybmVkXG5cdCAqIDxicj5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHRcdHZhciBvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdCAqIFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdFx0dmFyIHNTZWxlY3Rpb25WYXJpYW50PSBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHRcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdFx0dmFyIG9Qcm9taXNlT2JqZWN0ID0gb05hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBTdGF0ZUtleUFuZFVybFBhcmFtZXRlcnMoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHQgKlxuXHQgKiBcdFx0b1Byb21pc2VPYmplY3QuZG9uZShmdW5jdGlvbihvU2VtYW50aWNBdHRyaWJ1dGVzLCBzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0XHQvLyBoZXJlIHlvdSBjYW4gYWRkIGNvZGluZyB0aGF0IHNob3VsZCBydW4gYWZ0ZXIgYWxsIGFwcCBzdGF0ZSBhbmQgdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHJldHVybmVkLlxuXHQgKiBcdFx0fSk7XG5cdCAqXG5cdCAqIFx0XHRvUHJvbWlzZU9iamVjdC5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdFx0fSk7XG5cdCAqXHR9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRBcHBTdGF0ZUtleUFuZFVybFBhcmFtZXRlcnMoc1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnModW5kZWZpbmVkLCBzU2VsZWN0aW9uVmFyaWFudCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBBcHAgc3BlY2lmaWMgaGFzaC5cblx0ICpcblx0ICogQHBhcmFtIGFwcEhhc2ggVGhlIHBhdGggc3RyaW5nXG5cdCAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyBiYXNlIHBhdGhcblx0ICpcblx0ICovXG5cdGFzeW5jIF9nZXRBcHBTcGVjaWZpY0hhc2goYXBwSGFzaDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY3Jvc3NBcHBTZXJ2aWNlID0gYXdhaXQgdGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpO1xuXHRcdFx0cmV0dXJuIGNyb3NzQXBwU2VydmljZS5ocmVmRm9yQXBwU3BlY2lmaWNIYXNoQXN5bmMoYXBwSGFzaCk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHRMb2cuZXJyb3IoYEZFIDogQ2FuIG5vdCBmZXRjaCBBcHAgc2VwY2lmaWMgVVJMIDogJHttZXNzYWdlfWApO1xuXHRcdFx0dGhyb3cgRXJyb3IobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0X21peEF0dHJpYnV0ZXNUb1NlbFZhcmlhbnQobVNlbWFudGljQXR0cmlidXRlczogYW55LCBvU2VsVmFyaWFudDogYW55LCBpU3VwcHJlc3Npb25CZWhhdmlvcjogYW55KSB7XG5cdFx0Ly8gYWRkIGFsbCBzZW1hbnRpYyBhdHRyaWJ1dGVzIHRvIHRoZSBtaXhlZCBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdGZvciAoY29uc3Qgc1Byb3BlcnR5TmFtZSBpbiBtU2VtYW50aWNBdHRyaWJ1dGVzKSB7XG5cdFx0XHRpZiAobVNlbWFudGljQXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShzUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHQvLyBBIHZhbHVlIG9mIGEgc2VtYW50aWMgYXR0cmlidXRlIG1heSBub3QgYmUgYSBzdHJpbmcsIGJ1dCBjYW4gYmUgZS5nLiBhIGRhdGUuXG5cdFx0XHRcdC8vIFNpbmNlIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhY2NlcHRzIG9ubHkgYSBzdHJpbmcsIHdlIGhhdmUgdG8gY29udmVydCBpdCBpbiBkZXBlbmRlbmNlIG9mIHRoZSB0eXBlLlxuXHRcdFx0XHRsZXQgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSBtU2VtYW50aWNBdHRyaWJ1dGVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBzYW1lIGNvbnZlcnNpb24gbWV0aG9kIGZvciBkYXRlcyBhcyB0aGUgU21hcnRGaWx0ZXJCYXI6IHRvSlNPTigpXG5cdFx0XHRcdFx0dlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZS50b0pTT04oKTtcblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRBcnJheS5pc0FycmF5KHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlKSB8fFxuXHRcdFx0XHRcdCh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSAmJiB0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwib2JqZWN0XCIpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gSlNPTi5zdHJpbmdpZnkodlNlbWFudGljQXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdFx0dlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0aWYgKGlTdXBwcmVzc2lvbkJlaGF2aW9yICYgU3VwcHJlc3Npb25CZWhhdmlvci5pZ25vcmVFbXB0eVN0cmluZykge1xuXHRcdFx0XHRcdFx0TG9nLmluZm8oXG5cdFx0XHRcdFx0XHRcdFwiU2VtYW50aWMgYXR0cmlidXRlIFwiICtcblx0XHRcdFx0XHRcdFx0XHRzUHJvcGVydHlOYW1lICtcblx0XHRcdFx0XHRcdFx0XHRcIiBpcyBhbiBlbXB0eSBzdHJpbmcgYW5kIGR1ZSB0byB0aGUgY2hvc2VuIFN1cHByZXNzaW9uIEJlaGlhdm91ciBpcyBiZWluZyBpZ25vcmVkLlwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0aWYgKGlTdXBwcmVzc2lvbkJlaGF2aW9yICYgU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25OdWxsKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIlNlbWFudGljIGF0dHJpYnV0ZSBcIiArIHNQcm9wZXJ0eU5hbWUgKyBcIiBpcyBudWxsIGFuZCBpZ25vcmVkIGZvciBtaXggaW4gdG8gc2VsZWN0aW9uIHZhcmlhbnRcIik7XG5cdFx0XHRcdFx0XHRjb250aW51ZTsgLy8gaWdub3JlIVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGlTdXBwcmVzc2lvbkJlaGF2aW9yICYgU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25VbmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFwiU2VtYW50aWMgYXR0cmlidXRlIFwiICsgc1Byb3BlcnR5TmFtZSArIFwiIGlzIHVuZGVmaW5lZCBhbmQgaWdub3JlZCBmb3IgbWl4IGluIHRvIHNlbGVjdGlvbiB2YXJpYW50XCIpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykge1xuXHRcdFx0XHRcdG9TZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihzUHJvcGVydHlOYW1lLCBcIklcIiwgXCJFUVwiLCB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NlbFZhcmlhbnQ7XG5cdH1cblxuXHQvKipcblx0ICogQ29tYmluZXMgdGhlIGdpdmVuIHBhcmFtZXRlcnMgYW5kIHNlbGVjdGlvbiB2YXJpYW50IGludG8gYSBuZXcgc2VsZWN0aW9uIHZhcmlhbnQgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZyb20gYm90aCwgd2l0aCB0aGUgcGFyYW1ldGVyc1xuXHQgKiBvdmVycmlkaW5nIGV4aXN0aW5nIHByb3BlcnRpZXMgaW4gdGhlIHNlbGVjdGlvbiB2YXJpYW50LiBUaGUgbmV3IHNlbGVjdGlvbiB2YXJpYW50IGRvZXMgbm90IGNvbnRhaW4gYW55IHBhcmFtZXRlcnMuIEFsbCBwYXJhbWV0ZXJzIGFyZVxuXHQgKiBtZXJnZWQgaW50byBzZWxlY3Qgb3B0aW9ucy4gVGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uLCBjb252ZXJ0ZWQgdG8gYSBKU09OIHN0cmluZywgY2FuIGJlIHVzZWQgZm9yIHRoZVxuXHQgKiB7QGxpbmsgIy5uYXZpZ2F0ZSBOYXZpZ2F0aW9uSGFuZGxlci5uYXZpZ2F0ZX0gbWV0aG9kLlxuXHQgKlxuXHQgKiBAcGFyYW0gdlNlbWFudGljQXR0cmlidXRlcyBPYmplY3QvKEFycmF5IG9mIE9iamVjdHMpIGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzXG5cdCAqIEBwYXJhbSBzU2VsZWN0aW9uVmFyaWFudCBUaGUgc2VsZWN0aW9uIHZhcmlhbnQgaW4gc3RyaW5nIGZvcm1hdCBhcyBwcm92aWRlZCBieSB0aGUgU21hcnRGaWx0ZXJCYXIgY29udHJvbFxuXHQgKiBAcGFyYW0gW2lTdXBwcmVzc2lvbkJlaGF2aW9yPXNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3Iuc3RhbmRhcmRdIEluZGljYXRlcyB3aGV0aGVyIHNlbWFudGljXG5cdCAqICAgICAgICBhdHRyaWJ1dGVzIHdpdGggc3BlY2lhbCB2YWx1ZXMgKHNlZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU3VwcHJlc3Npb25CZWhhdmlvciBzdXBwcmVzc2lvbiBiZWhhdmlvcn0pIG11c3QgYmVcblx0ICogICAgICAgIHN1cHByZXNzZWQgYmVmb3JlIHRoZXkgYXJlIGNvbWJpbmVkIHdpdGggdGhlIHNlbGVjdGlvbiB2YXJpYW50OyBzZXZlcmFsXG5cdCAqICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU3VwcHJlc3Npb25CZWhhdmlvciBzdXBwcmVzc2lvbiBiZWhhdmlvcnN9IGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBiaXR3aXNlIE9SIG9wZXJhdG9yXG5cdCAqICAgICAgICAofClcblx0ICogQHJldHVybnMgSW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9XG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHR2YXIgdlNlbWFudGljQXR0cmlidXRlcyA9IHsgXCJDdXN0b21lclwiIDogXCJDMDAwMVwiIH07XG5cdCAqIFx0b3Jcblx0ICogXHR2YXIgdlNlbWFudGljQXR0cmlidXRlcyA9IFt7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDFcIiB9LHsgXCJDdXN0b21lclwiIDogXCJDMDAwMlwiIH1dO1xuXHQgKiBcdHZhciBzU2VsZWN0aW9uVmFyaWFudCA9IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKTtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgc05hdmlnYXRpb25TZWxlY3Rpb25WYXJpYW50ID0gb05hdmlnYXRpb25IYW5kbGVyLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KHZTZW1hbnRpY0F0dHJpYnV0ZXMsIHNTZWxlY3Rpb25WYXJpYW50KS50b0pTT05TdHJpbmcoKTtcblx0ICogXHQvLyBJbiBjYXNlIG9mIGFuIHZTZW1hbnRpY0F0dHJpYnV0ZXMgYmVpbmcgYW4gYXJyYXksIHRoZSBzZW1hbnRpY0F0dHJpYnV0ZXMgYXJlIG1lcmdlZCB0byBhIHNpbmdsZSBTViBhbmQgY29tcGFyZWQgYWdhaW5zdCB0aGUgc1NlbGVjdGlvblZhcmlhbnQoc2Vjb25kIGFncnVtZW50KS5cblx0ICogXHQvLyBPcHRpb25hbGx5LCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIHNldmVyYWwgc3VwcHJlc3Npb24gYmVoYXZpb3JzLiBTZXZlcmFsIHN1cHByZXNzaW9uIGJlaGF2aW9ycyBhcmUgY29tYmluZWQgd2l0aCB0aGUgYml0d2lzZSBPUiBvcGVyYXRvciwgZS5nLlxuXHQgKiBcdC8vIHZhciBpU3VwcHJlc3Npb25CZWhhdmlvciA9IHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uTnVsbCB8IHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uVW5kZWZpbmVkO1xuXHQgKiBcdC8vIHZhciBzTmF2aWdhdGlvblNlbGVjdGlvblZhcmlhbnQgPSBvTmF2aWdhdGlvbkhhbmRsZXIubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQobVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQsIGlTdXBwcmVzc2lvbkJlaGF2aW9yKS50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHRvTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGUoXCJTYWxlc09yZGVyXCIsIFwiY3JlYXRlXCIsIHNOYXZpZ2F0aW9uU2VsZWN0aW9uVmFyaWFudCk7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHRtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChcblx0XHR2U2VtYW50aWNBdHRyaWJ1dGVzOiBvYmplY3QgfCBhbnlbXSxcblx0XHRzU2VsZWN0aW9uVmFyaWFudDogc3RyaW5nIHwgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQsXG5cdFx0aVN1cHByZXNzaW9uQmVoYXZpb3I/OiBudW1iZXJcblx0KTogU2VsZWN0aW9uVmFyaWFudCB7XG5cdFx0Y29uc3Qgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0Y29uc3Qgb05ld1NlbFZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblxuXHRcdGNvbnN0IGZpbHRlclVybCA9IG9TZWxlY3Rpb25WYXJpYW50LmdldEZpbHRlckNvbnRleHRVcmwoKTtcblx0XHRpZiAoZmlsdGVyVXJsKSB7XG5cdFx0XHRvTmV3U2VsVmFyaWFudC5zZXRGaWx0ZXJDb250ZXh0VXJsKGZpbHRlclVybCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29udGV4dFVybCA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlckNvbnRleHRVcmwoKTtcblx0XHRpZiAoY29udGV4dFVybCkge1xuXHRcdFx0b05ld1NlbFZhcmlhbnQuc2V0UGFyYW1ldGVyQ29udGV4dFVybChjb250ZXh0VXJsKTtcblx0XHR9XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodlNlbWFudGljQXR0cmlidXRlcykpIHtcblx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAobVNlbWFudGljQXR0cmlidXRlczogYW55KSB7XG5cdFx0XHRcdG9OYXZIYW5kbGVyLl9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50KG1TZW1hbnRpY0F0dHJpYnV0ZXMsIG9OZXdTZWxWYXJpYW50LCBpU3VwcHJlc3Npb25CZWhhdmlvcik7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudCh2U2VtYW50aWNBdHRyaWJ1dGVzLCBvTmV3U2VsVmFyaWFudCwgaVN1cHByZXNzaW9uQmVoYXZpb3IpO1xuXHRcdH1cblxuXHRcdC8vIGFkZCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBvTmV3U2VsVmFyaWFudCB5ZXRcblx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlck5hbWVzKCk7XG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoIW9OZXdTZWxWYXJpYW50LmdldFNlbGVjdE9wdGlvbihhUGFyYW1ldGVyc1tpXSkpIHtcblx0XHRcdFx0b05ld1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKGFQYXJhbWV0ZXJzW2ldLCBcIklcIiwgXCJFUVwiLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXIoYVBhcmFtZXRlcnNbaV0pKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhZGQgc2VsT3B0aW9ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb05ld1NlbFZhcmlhbnQgeWV0XG5cdFx0Y29uc3QgYVNlbE9wdGlvbk5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbE9wdGlvbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHQvLyBhZGQgc2VsT3B0aW9ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb05ld1NlbFZhcmlhbnQgeWV0XG5cdFx0XHRjb25zdCBhU2VsZWN0T3B0aW9uOiBhbnlbXSA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsT3B0aW9uTmFtZXNbaV0pITtcblx0XHRcdGlmICghb05ld1NlbFZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKGFTZWxPcHRpb25OYW1lc1tpXSkpIHtcblx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhU2VsZWN0T3B0aW9uLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0b05ld1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFxuXHRcdFx0XHRcdFx0YVNlbE9wdGlvbk5hbWVzW2ldLFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5TaWduLFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5PcHRpb24sXG5cdFx0XHRcdFx0XHRhU2VsZWN0T3B0aW9uW2pdLkxvdyxcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uSGlnaFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb05ld1NlbFZhcmlhbnQ7XG5cdH1cblxuXHRfZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyh2U2VsZWN0aW9uVmFyaWFudDogYW55KSB7XG5cdFx0Lypcblx0XHQgKiBUaGVyZSBhcmUgbGVnYWN5IEFwcFN0YXRlcyB3aGVyZSB0aGUgU2VsZWN0aW9uVmFyaWFudCBpcyBiZWluZyBzdG9yZWQgYXMgYSBzdHJpbmcuIEhvd2V2ZXIsIHRoYXQgaXMgbm90IGNvbXBsaWFudCB0byB0aGUgc3BlY2lmaWNhdGlvbixcblx0XHQgKiB3aGljaCBzdGF0ZXMgdGhhdCBhIHN0YW5kYXJkIEpTIG9iamVjdCBzaGFsbCBiZSBwcm92aWRlZC4gSW50ZXJuYWxseSwgaG93ZXZlciwgdGhlIHNlbGVjdGlvblZhcmlhbnQgaXMgYWx3YXlzIG9mIHR5cGUgc3RyaW5nLiBTaXR1YXRpb25cblx0XHQgKiBQZXJzaXN0ZW5jeSBpbnRlcm5hbCBBUEkgLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxlZ2FjeSBzdHJpbmcgc3RyaW5nIG5ldyBhcHByb2FjaCAoSlNPTikgb2JqZWN0XG5cdFx0ICogc3RyaW5nXG5cdFx0ICovXG5cblx0XHRpZiAodlNlbGVjdGlvblZhcmlhbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRsZXQgdkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQgPSB2U2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdGlmICh0eXBlb2YgdlNlbGVjdGlvblZhcmlhbnQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdHZDb252ZXJ0ZWRTZWxlY3Rpb25WYXJpYW50ID0gSlNPTi5zdHJpbmdpZnkodlNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXG5cdF9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZShvUmV0dXJuOiBhbnksIGZuT25BZnRlclNhdmU6IGFueSwgZm5PbkVycm9yOiBhbnkpIHtcblx0XHRvUmV0dXJuLnByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoZm5PbkFmdGVyU2F2ZSkge1xuXHRcdFx0XHRmbk9uQWZ0ZXJTYXZlKG9SZXR1cm4uYXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdFx0b1JldHVybi5wcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5BcHBTdGF0ZVNhdmUuZmFpbGVkXCIpO1xuXHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF9zYXZlQXBwU3RhdGVBc3luYyhvQXBwRGF0YTogYW55LCBmbk9uQWZ0ZXJTYXZlOiBhbnksIGZuT25FcnJvcjogYW55KSB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdHJldHVybiB0aGlzLl9mblNhdmVBcHBTdGF0ZUFzeW5jKG9BcHBEYXRhLCBmbk9uRXJyb3IpLnRoZW4oZnVuY3Rpb24gKG9SZXR1cm46IGFueSkge1xuXHRcdFx0aWYgKG9SZXR1cm4pIHtcblx0XHRcdFx0b05hdkhhbmRsZXIuX2ZuSGFuZGxlQXBwU3RhdGVQcm9taXNlKG9SZXR1cm4sIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0XHRcdHJldHVybiBvUmV0dXJuLmFwcFN0YXRlS2V5O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXHR9XG5cblx0X3NhdmVBcHBTdGF0ZShvQXBwRGF0YTogYW55LCBmbk9uQWZ0ZXJTYXZlOiBhbnksIGZuT25FcnJvcjogYW55KSB7XG5cdFx0Y29uc3Qgb1JldHVybiA9IHRoaXMuX3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIGZuT25FcnJvcik7XG5cdFx0aWYgKG9SZXR1cm4pIHtcblx0XHRcdHRoaXMuX2ZuSGFuZGxlQXBwU3RhdGVQcm9taXNlKG9SZXR1cm4sIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0XHRyZXR1cm4gb1JldHVybi5hcHBTdGF0ZUtleTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0X2ZuU2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YTogYW55LCBvQXBwU3RhdGU6IGFueSwgZm5PbkVycm9yOiBhbnkpIHtcblx0XHRjb25zdCBzQXBwU3RhdGVLZXkgPSBvQXBwU3RhdGUuZ2V0S2V5KCk7XG5cdFx0Y29uc3Qgb0FwcERhdGFGb3JTYXZlID0gdGhpcy5fZmV0Y2hBcHBEYXRhRm9yU2F2ZShvQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0XHRpZiAoIW9BcHBEYXRhRm9yU2F2ZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0b0FwcFN0YXRlLnNldERhdGEob0FwcERhdGFGb3JTYXZlKTtcblx0XHRjb25zdCBvU2F2ZVByb21pc2UgPSBvQXBwU3RhdGUuc2F2ZSgpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRwcm9taXNlOiBvU2F2ZVByb21pc2UucHJvbWlzZSgpXG5cdFx0fTtcblx0fVxuXG5cdF9mZXRjaEFwcERhdGFGb3JTYXZlKG9BcHBEYXRhOiBJbm5lckFwcERhdGEsIGZuT25FcnJvcjogYW55KSB7XG5cdFx0bGV0IG9BcHBEYXRhRm9yU2F2ZTogUGFydGlhbDxJbm5lckFwcERhdGE+ID0ge307XG5cblx0XHRpZiAob0FwcERhdGEuaGFzT3duUHJvcGVydHkoXCJzZWxlY3Rpb25WYXJpYW50XCIpKSB7XG5cdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VsZWN0aW9uVmFyaWFudCA9IG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRcdGlmIChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdCAqIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IFNlbGVjdGlvbiBWYXJpYW50cyBuZWVkIHRvIGJlIEpTT04gb2JqZWN0cy4gSG93ZXZlciwgaW50ZXJuYWxseSwgd2Ugd29yayB3aXRoIHN0cmluZ3MgZm9yXG5cdFx0XHRcdCAqIFwic2VsZWN0aW9uVmFyaWFudFwiLiBUaGVyZWZvcmUsIGluIGNhc2UgdGhhdCB0aGlzIGlzIGEgc3RyaW5nLCB3ZSBuZWVkIHRvIEpTT04tcGFyc2UgdGhlIGRhdGEuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAodHlwZW9mIG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnBhcnNlKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IHRoaXMuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVTYXZlLnBhcnNlRXJyb3JcIik7XG5cdFx0XHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5fc01vZGUgPT09IE1vZGUuT0RhdGFWMikge1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gZXh0ZW5kKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudDoge30sXG5cdFx0XHRcdFx0dGFibGVWYXJpYW50SWQ6IFwiXCIsXG5cdFx0XHRcdFx0Y3VzdG9tRGF0YToge31cblx0XHRcdFx0fSxcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlXG5cdFx0XHQpIGFzIElubmVyQXBwRGF0YTtcblxuXHRcdFx0aWYgKG9BcHBEYXRhLnRhYmxlVmFyaWFudElkKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS50YWJsZVZhcmlhbnRJZCA9IG9BcHBEYXRhLnRhYmxlVmFyaWFudElkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLmN1c3RvbURhdGEpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLmN1c3RvbURhdGEgPSBvQXBwRGF0YS5jdXN0b21EYXRhO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnByZXNlbnRhdGlvblZhcmlhbnQgPSBvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnZhbHVlVGV4dHMgPSBvQXBwRGF0YS52YWx1ZVRleHRzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbWFudGljRGF0ZXMgPSBvQXBwRGF0YS5zZW1hbnRpY0RhdGVzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQXBwRGF0YUNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgb0FwcERhdGEpO1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gbWVyZ2Uob0FwcERhdGFDbG9uZSwgb0FwcERhdGFGb3JTYXZlKTtcblx0XHR9XG5cdFx0b0FwcERhdGFGb3JTYXZlID0gdGhpcy5fY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0cmV0dXJuIG9BcHBEYXRhRm9yU2F2ZTtcblx0fVxuXG5cdF9mblNhdmVBcHBTdGF0ZUFzeW5jKG9BcHBEYXRhOiBhbnksIGZuT25FcnJvcj86IGFueSkge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmNyZWF0ZUVtcHR5QXBwU3RhdGVBc3luYyhvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0FwcFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9OYXZIYW5kbGVyLl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIG9BcHBTdGF0ZSwgZm5PbkVycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHRfc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YTogYW55LCBmbk9uRXJyb3I/OiBhbnkpIHtcblx0XHRjb25zdCBvQXBwU3RhdGUgPSB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSgpLmNyZWF0ZUVtcHR5QXBwU3RhdGUodGhpcy5vQ29tcG9uZW50KTtcblx0XHRyZXR1cm4gdGhpcy5fZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhLCBvQXBwU3RhdGUsIGZuT25FcnJvcik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsb2FkZWQgSUFwcCBTdGF0ZSBhbmQgbmF2aWdhdGlvbiB0eXBlIG9uY2UgcmVzb2x2ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIElBcHBTdGF0ZUtleSB0byByZXRyaWV2ZSB0aGUgQXBwU3RhdGUgZGF0YS5cblx0ICogQHBhcmFtIG9EZWZlcnJlZCBKcXVlcnkgZGVmZXJyZWQgb2JqZWN0IHRvIHJlc29sdmUgdGhlIEFwcFN0YXRlIGRhdGEuXG5cdCAqIEBwYXJhbSBuYXZUeXBlIE5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggQXBwU3RhdGUgaXMgcmV0cmlldmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgZGVmZXJyZWQgb2JqZWN0IHdoaWNoIGlzIHJlc29sdmVkIHdpdGggbG9hZGVkIGFwcCBzdGF0ZSBkYXRhXG5cdCBhbmQgbmF2aWdhdGlvbiB0eXBlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2xvYWRBcHBTdGF0ZShzQXBwU3RhdGVLZXk6IHN0cmluZywgb0RlZmVycmVkOiBqUXVlcnkuRGVmZXJyZWQsIG5hdlR5cGU6IHN0cmluZyk6IGpRdWVyeS5EZWZlcnJlZCB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvQXBwU3RhdGVQcm9taXNlID0gb0Nyb3NzQXBwTmF2U2VydmljZS5nZXRBcHBTdGF0ZShvTmF2SGFuZGxlci5vQ29tcG9uZW50LCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0XHRvQXBwU3RhdGVQcm9taXNlLmRvbmUoZnVuY3Rpb24gKG9BcHBTdGF0ZTogYW55KSB7XG5cdFx0XHRcdFx0bGV0IG9BcHBEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRjb25zdCBvQXBwRGF0YUxvYWRlZCA9IG9BcHBTdGF0ZS5nZXREYXRhKCk7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIG9BcHBEYXRhTG9hZGVkID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChvTmF2SGFuZGxlci5fc01vZGUgPT09IE1vZGUuT0RhdGFWMikge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEgPSB7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IFwie31cIixcblx0XHRcdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0XHRcdG9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRcdFx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0dGFibGVWYXJpYW50SWQ6IFwiXCIsXG5cdFx0XHRcdFx0XHRcdGN1c3RvbURhdGE6IHt9LFxuXHRcdFx0XHRcdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0XHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50OiB7fSxcblx0XHRcdFx0XHRcdFx0dmFsdWVUZXh0czoge30sXG5cdFx0XHRcdFx0XHRcdHNlbWFudGljRGF0ZXM6IHt9LFxuXHRcdFx0XHRcdFx0XHRkYXRhOiB7fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0XHRcdCAqIEluIGNhc2UgdGhhdCB3ZSBnZXQgYW4gb2JqZWN0IGZyb20gdGhlIHN0b3JlZCBBcHBEYXRhICg9cGVyc2lzdGVuY3kpLCB3ZSBuZWVkIHRvIHN0cmluZ2lmeSB0aGUgSlNPTiBvYmplY3QuXG5cdFx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb05hdkhhbmRsZXIuX2Vuc3VyZVNlbGVjdGlvblZhcmlhbnRGb3JtYXRTdHJpbmcob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQudGFibGVWYXJpYW50SWQpIHtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEudGFibGVWYXJpYW50SWQgPSBvQXBwRGF0YUxvYWRlZC50YWJsZVZhcmlhbnRJZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5jdXN0b21EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLmN1c3RvbURhdGEgPSBvQXBwRGF0YUxvYWRlZC5jdXN0b21EYXRhO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnByZXNlbnRhdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCA9IG9BcHBEYXRhTG9hZGVkLnByZXNlbnRhdGlvblZhcmlhbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQudmFsdWVUZXh0cykge1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS52YWx1ZVRleHRzID0gb0FwcERhdGFMb2FkZWQudmFsdWVUZXh0cztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLnNlbWFudGljRGF0ZXMgPSBvQXBwRGF0YUxvYWRlZC5zZW1hbnRpY0RhdGVzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LyogSW4gVjIgY2FzZSwgd2UgbmVlZCB0aGUgZGF0YSBpbiB0aGUgYmVsb3cgZm9ybWF0IGZvciBoeWJyaWQgY2FzZSAqL1xuXHRcdFx0XHRcdFx0aWYgKG5hdlR5cGUgPT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLmRhdGEgPSBvQXBwRGF0YUxvYWRlZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEgPSBtZXJnZShvQXBwRGF0YSwgb0FwcERhdGFMb2FkZWQpO1xuXHRcdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvTmF2SGFuZGxlci5fZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyhvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyByZXNvbHZlIGlzIGNhbGxlZCBvbiBwYXNzZWQgRGVmZXJyZWQgb2JqZWN0IHRvIHRyaWdnZXIgYSBjYWxsIG9mIHRoZSBkb25lIG1ldGhvZCwgaWYgaW1wbGVtZW50ZWRcblx0XHRcdFx0XHQvLyB0aGUgZG9uZSBtZXRob2Qgd2lsbCByZWNlaXZlIHRoZSBsb2FkZWQgYXBwU3RhdGUgYW5kIHRoZSBuYXZpZ2F0aW9uIHR5cGUgYXMgcGFyYW1ldGVyc1xuXHRcdFx0XHRcdG9EZWZlcnJlZC5yZXNvbHZlKG9BcHBEYXRhLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldEFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIG9BcHBTdGF0ZVByb21pc2U7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMuZmFpbGVkXCIpO1xuXHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb0RlZmVycmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSAodGhlIGludGVybmFsIGFwcHMpIGZyb20gdGhlIEFwcEhhc2ggc3RyaW5nLiBJdCBhdXRvbWF0aWNhbGx5IHRha2VzIGNhcmUgYWJvdXRcblx0ICogY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBvbGQgYW5kIHRoZSBuZXcgYXBwcm9hY2ggb2YgdGhlIHNhcC1pYXBwLXN0YXRlLiBQcmVjZWRlbmNlIGlzIHRoYXQgdGhlIG5ldyBhcHByb2FjaCBpcyBmYXZvdXJlZCBhZ2FpbnN0IHRoZSBvbGRcblx0ICogYXBwcm9hY2guXG5cdCAqXG5cdCAqIEBwYXJhbSBzQXBwSGFzaCBUaGUgQXBwSGFzaCwgd2hpY2ggbWF5IGNvbnRhaW4gYSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgKGJvdGggb2xkIGFuZC9vciBuZXcgYXBwcm9hY2gpXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiBzYXAtaWFwcC1zdGF0ZSAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzKSwgb3IgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBpblxuXHQgKiAgICAgICAgIGNhc2UgdGhhdCBubyBzYXAtaWFwcC1zdGF0ZSB3YXMgZm91bmQgaW4gPGNvZGU+c0FwcEhhc2g8L2NvZGU+LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2g6IHN0cmluZykge1xuXHRcdC8vIHRyaXZpYWwgY2FzZTogbm8gYXBwIGhhc2ggYXZhaWxhYmxlIGF0IGFsbC5cblx0XHRpZiAoIXNBcHBIYXNoKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8qIG5ldyBhcHByb2FjaDogc2VwYXJhdGVkIHZpYSBxdWVzdGlvbiBtYXJrIC8gcGFydCBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIG9mIHRoZSBBcHBIYXNoICovXG5cdFx0bGV0IGFNYXRjaGVzID0gdGhpcy5fcklBcHBTdGF0ZU5ldy5leGVjKHNBcHBIYXNoKTtcblxuXHRcdC8qIG9sZCBhcHByb2FjaDogc3BlYXJhdGVkIHZpYSBzbGFzaGVzIC8gaS5lLiBwYXJ0IG9mIHRoZSByb3V0ZSBpdHNlbGYgKi9cblx0XHRpZiAoYU1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdGFNYXRjaGVzID0gdGhpcy5fcklBcHBTdGF0ZU9sZC5leGVjKHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHQvKlxuXHRcdCAqIG9sZCBhcHByb2FjaDogc3BlY2lhbCBjYXNlOiBpZiB0aGVyZSBpcyBubyBkZWVwIHJvdXRlL2tleSBkZWZpbmVkLCB0aGUgc2FwLWlhcHAtc3RhdGUgbWF5IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywgd2l0aG91dFxuXHRcdCAqIGFueSBzZXBhcmF0aW9uIHdpdGggdGhlIHNsYXNoZXNcblx0XHQgKi9cblx0XHRpZiAoYU1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdGFNYXRjaGVzID0gdGhpcy5fcklBcHBTdGF0ZU9sZEF0U3RhcnQuZXhlYyhzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBubyAodmFsaWQpIHNhcC1pYXBwLXN0YXRlIGluIHRoZSBBcHAgSGFzaFxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYU1hdGNoZXNbMV07XG5cdH1cblxuXHQvKipcblx0ICogUmVwbGFjZXMgKG9yIGluc2VydHMpIGEgcGFyYW1ldGVyIHZhbHVlIChhbiBBcHBTdGF0ZUtleSkgZm9yIHRoZSBzYXAtaWFwcC1zdGF0ZSBpbnRvIGFuIGV4aXN0aW5nIEFwcEhhc2ggc3RyaW5nLiBPdGhlciByb3V0ZXMvcGFyYW1ldGVyc1xuXHQgKiBhcmUgaWdub3JlZCBhbmQgcmV0dXJuZWQgd2l0aG91dCBtb2RpZmljYXRpb24gKFwiZW52aXJvbm1lbnRhbCBhZ25vc3RpY1wiIHByb3BlcnR5KS4gT25seSB0aGUgbmV3IGFwcHJvYWNoIChzYXAtaWFwcC1zdGF0ZSBhcyBxdWVyeSBwYXJhbWV0ZXJcblx0ICogaW4gdGhlIEFwcEhhc2gpIGlzIGJlaW5nIGlzc3VlZC5cblx0ICpcblx0ICogQHBhcmFtIHNBcHBIYXNoIFRoZSBBcHBIYXNoIGludG8gd2hpY2ggdGhlIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciBzaGFsbCBiZSBtYWRlIGF2YWlsYWJsZVxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBrZXkgdmFsdWUgb2YgdGhlIEFwcFN0YXRlIHdoaWNoIHNoYWxsIGJlIHN0b3JlZCBhcyBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlIHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc0FwcEhhc2ggc3RyaW5nLCBzdWNoIHRoYXQgdGhlIHNhcC1pYXBwLXN0YXRlIGhhcyBiZWVuIHNldCBiYXNlZCBvbiB0aGUgbmV3IChxdWVyeSBvcHRpb24tYmFzZWQpXG5cdCAqICAgICAgICAgc2FwLWlhcHAtc3RhdGUuIElmIGEgc2FwLWlhcHAtc3RhdGUgaGFzIGJlZW4gc3BlY2lmaWVkIGJlZm9yZSwgdGhlIGtleSBpcyByZXBsYWNlZC4gSWYgPGNvZGU+c0FwcEhhc2g8L2NvZGU+IHdhcyBvZiB0aGUgb2xkXG5cdCAqICAgICAgICAgZm9ybWF0IChzYXAtaWFwcC1zdGF0ZSBhcyBwYXJ0IG9mIHRoZSBrZXlzL3JvdXRlKSwgdGhlIGZvcm1hdCBpcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBmb3JtYXQgYmVmb3JlIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2g6IHN0cmluZywgc0FwcFN0YXRlS2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBzTmV3SUFwcFN0YXRlID0gSUFQUF9TVEFURSArIFwiPVwiICsgc0FwcFN0YXRlS2V5O1xuXG5cdFx0Lypcblx0XHQgKiBnZW5lcmF0ZSBzYXAtaWFwcC1zdGF0ZXMgd2l0aCB0aGUgbmV3IHdheVxuXHRcdCAqL1xuXHRcdGlmICghc0FwcEhhc2gpIHtcblx0XHRcdC8vIHRoZXJlJ3Mgbm8gc0FwcEhhc2gga2V5IHlldFxuXHRcdFx0cmV0dXJuIFwiP1wiICsgc05ld0lBcHBTdGF0ZTtcblx0XHR9XG5cblx0XHRjb25zdCBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbiAoc1N1YkFwcEhhc2g6IGFueSkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgYW4gQXBwSGFzaCBhdmFpbGFibGUsIGJ1dCBpdCBkb2VzIG5vdCBjb250YWluIGEgc2FwLWlhcHAtc3RhdGUgcGFyYW1ldGVyIHlldCAtIHdlIG5lZWQgdG8gYXBwZW5kIG9uZVxuXG5cdFx0XHQvLyBuZXcgYXBwcm9hY2g6IHdlIG5lZWQgdG8gY2hlY2ssIGlmIGEgc2V0IG9mIHF1ZXJ5IHBhcmFtZXRlcnMgaXMgYWxyZWFkeSBhdmFpbGFibGVcblx0XHRcdGlmIChzU3ViQXBwSGFzaC5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcblx0XHRcdFx0Ly8gdGhlcmUgYXJlIGFscmVhZHkgcXVlcnkgcGFyYW1ldGVycyBhdmFpbGFibGUgLSBhcHBlbmQgaXQgYXMgYW5vdGhlciBwYXJhbWV0ZXJcblx0XHRcdFx0cmV0dXJuIHNTdWJBcHBIYXNoICsgXCImXCIgKyBzTmV3SUFwcFN0YXRlO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdGhlcmUgYXJlIG5vIGEgcXVlcnkgcGFyYW1ldGVycyBhdmFpbGFibGUgeWV0OyBjcmVhdGUgYSBzZXQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXJcblx0XHRcdHJldHVybiBzU3ViQXBwSGFzaCArIFwiP1wiICsgc05ld0lBcHBTdGF0ZTtcblx0XHR9O1xuXG5cdFx0aWYgKCF0aGlzLl9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlcihzQXBwSGFzaCk7XG5cdFx0fVxuXHRcdC8vIFRoZXJlIGlzIGFuIEFwcEhhc2ggYXZhaWxhYmxlIGFuZCB0aGVyZSBpcyBhbHJlYWR5IGFuIHNhcC1pYXBwLXN0YXRlIGluIHRoZSBBcHBIYXNoXG5cblx0XHRpZiAodGhpcy5fcklBcHBTdGF0ZU5ldy50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0Ly8gdGhlIG5ldyBhcHByb2FjaCBpcyBiZWluZyB1c2VkXG5cdFx0XHRyZXR1cm4gc0FwcEhhc2gucmVwbGFjZSh0aGlzLl9ySUFwcFN0YXRlTmV3LCBmdW5jdGlvbiAoc05lZWRsZTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBzTmVlZGxlLnJlcGxhY2UoL1s9XS4qL2dpLCBcIj1cIiArIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIEFwcEhhc2ggZW50aXJlbHkgYW5kIHJlcGxhY2UgaXQgd2l0aCBhIG5ldyBvbmUuXG5cblx0XHRjb25zdCBmblJlcGxhY2VPbGRBcHByb2FjaCA9IGZ1bmN0aW9uIChyT2xkQXBwcm9hY2g6IGFueSwgc1N1YkFwcEhhc2g6IGFueSkge1xuXHRcdFx0c1N1YkFwcEhhc2ggPSBzU3ViQXBwSGFzaC5yZXBsYWNlKHJPbGRBcHByb2FjaCwgXCJcIik7XG5cdFx0XHRyZXR1cm4gZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyKHNTdWJBcHBIYXNoKTtcblx0XHR9O1xuXG5cdFx0aWYgKHRoaXMuX3JJQXBwU3RhdGVPbGQudGVzdChzQXBwSGFzaCkpIHtcblx0XHRcdHJldHVybiBmblJlcGxhY2VPbGRBcHByb2FjaCh0aGlzLl9ySUFwcFN0YXRlT2xkLCBzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5SZXBsYWNlT2xkQXBwcm9hY2godGhpcy5fcklBcHBTdGF0ZU9sZEF0U3RhcnQsIHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHRhc3NlcnQoZmFsc2UsIFwiaW50ZXJuYWwgaW5jb25zaXN0ZW5jeTogQXBwcm9hY2ggb2Ygc2FwLWlhcHAtc3RhdGUgbm90IGtub3duLCBidXQgX2dldElubmVyQXBwU3RhdGVLZXkgcmV0dXJuZWQgaXRcIik7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF9nZXRVUkxQYXJhbWV0ZXJzRnJvbVNlbGVjdGlvblZhcmlhbnQodlNlbGVjdGlvblZhcmlhbnQ6IGFueSkge1xuXHRcdGNvbnN0IG1VUkxQYXJhbWV0ZXJzOiBhbnkgPSB7fTtcblx0XHRsZXQgaSA9IDA7XG5cdFx0bGV0IG9TZWxlY3Rpb25WYXJpYW50O1xuXG5cdFx0aWYgKHR5cGVvZiB2U2VsZWN0aW9uVmFyaWFudCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCh2U2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdlNlbGVjdGlvblZhcmlhbnQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gdlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIFVSTHMgcGFyYW1ldGVycyBmcm9tIFNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyAoaWYgc2luZ2xlIHZhbHVlKVxuXHRcdGNvbnN0IGFTZWxlY3RQcm9wZXJ0aWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbGVjdFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGFTZWxlY3RPcHRpb25zID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKGFTZWxlY3RQcm9wZXJ0aWVzW2ldKTtcblx0XHRcdGlmIChhU2VsZWN0T3B0aW9ucy5sZW5ndGggPT09IDEgJiYgYVNlbGVjdE9wdGlvbnNbMF0uU2lnbiA9PT0gXCJJXCIgJiYgYVNlbGVjdE9wdGlvbnNbMF0uT3B0aW9uID09PSBcIkVRXCIpIHtcblx0XHRcdFx0bVVSTFBhcmFtZXRlcnNbYVNlbGVjdFByb3BlcnRpZXNbaV1dID0gYVNlbGVjdE9wdGlvbnNbMF0uTG93O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGFkZCBwYXJhbWV0ZXJzIGZyb20gU2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzXG5cdFx0Y29uc3QgYVBhcmFtZXRlck5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyTmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzUGFyYW1ldGVyVmFsdWUgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXIoYVBhcmFtZXRlck5hbWVzW2ldKTtcblxuXHRcdFx0bVVSTFBhcmFtZXRlcnNbYVBhcmFtZXRlck5hbWVzW2ldXSA9IHNQYXJhbWV0ZXJWYWx1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIG1VUkxQYXJhbWV0ZXJzO1xuXHR9XG5cblx0X2NyZWF0ZVRlY2huaWNhbEVycm9yKHNFcnJvckNvZGU6IGFueSkge1xuXHRcdHJldHVybiBuZXcgTmF2RXJyb3Ioc0Vycm9yQ29kZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbW9kZWwgdGhhdCBpcyB1c2VkIGZvciB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBJZiB0aGUgbW9kZWwgaXMgbm90IHNldCwgdGhlIHVubmFtZWQgY29tcG9uZW50IG1vZGVsIGlzIHVzZWQgZm9yIHRoZVxuXHQgKiB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSBvTW9kZWwgRm9yIGNoZWNraW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvblxuXHQgKi9cblx0c2V0TW9kZWwob01vZGVsOiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwpIHtcblx0XHR0aGlzLl9vTW9kZWwgPSBvTW9kZWw7XG5cdH1cblxuXHRfZ2V0TW9kZWwoKTogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5fb01vZGVsIHx8IHRoaXMub0NvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHR9XG5cblx0X3JlbW92ZUFsbFByb3BlcnRpZXMob0RhdGE6IGFueSkge1xuXHRcdGlmIChvRGF0YSkge1xuXHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRGF0YS52YWx1ZVRleHRzKSB7XG5cdFx0XHRcdG9EYXRhLnZhbHVlVGV4dHMgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0RhdGEuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlUHJvcGVydGllcyhhRmlsdGVyTmFtZTogYW55LCBhUGFyYW1ldGVyTmFtZTogYW55LCBvRGF0YTogYW55KSB7XG5cdFx0aWYgKGFGaWx0ZXJOYW1lLmxlbmd0aCAmJiBvRGF0YSAmJiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCB8fCBvRGF0YS52YWx1ZVRleHRzIHx8IG9EYXRhLnNlbWFudGljRGF0ZXMpKSB7XG5cdFx0XHRhRmlsdGVyTmFtZS5mb3JFYWNoKGZ1bmN0aW9uIChzTmFtZTogYW55KSB7XG5cdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMpIHtcblx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0RhdGEudmFsdWVUZXh0cyAmJiBvRGF0YS52YWx1ZVRleHRzLlRleHRzKSB7XG5cdFx0XHRcdFx0b0RhdGEudmFsdWVUZXh0cy5UZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChvVGV4dHM6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9UZXh0cy5Qcm9wZXJ0eVRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0cy5Qcm9wZXJ0eVRleHRzLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9UZXh0cy5Qcm9wZXJ0eVRleHRzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0RhdGEuc2VtYW50aWNEYXRlcyAmJiBvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzKSB7XG5cdFx0XHRcdFx0b0RhdGEuc2VtYW50aWNEYXRlcy5EYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0ZXM6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9EYXRlcy5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0b0RhdGEuc2VtYW50aWNEYXRlcy5EYXRlcy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChhUGFyYW1ldGVyTmFtZS5sZW5ndGggJiYgb0RhdGEgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMpIHtcblx0XHRcdGFQYXJhbWV0ZXJOYW1lLmZvckVhY2goZnVuY3Rpb24gKHNOYW1lOiBhbnkpIHtcblx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUgfHwgXCIkUGFyYW1ldGVyLlwiICsgc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X2lzVGVybVRydWUob1Byb3BlcnR5OiBhbnksIHNUZXJtOiBhbnkpIHtcblx0XHRjb25zdCBmSXNUZXJtRGVmYXVsdFRydWUgPSBmdW5jdGlvbiAob1Rlcm06IGFueSkge1xuXHRcdFx0aWYgKG9UZXJtKSB7XG5cdFx0XHRcdHJldHVybiBvVGVybS5Cb29sID8gb1Rlcm0uQm9vbCAhPT0gXCJmYWxzZVwiIDogdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuICEhb1Byb3BlcnR5W3NUZXJtXSAmJiBmSXNUZXJtRGVmYXVsdFRydWUob1Byb3BlcnR5W3NUZXJtXSk7XG5cdH1cblxuXHRfaXNFeGNsdWRlZEZyb21OYXZpZ2F0aW9uQ29udGV4dChvUHJvcGVydHk6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0XCIpO1xuXHR9XG5cblx0X2lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5faXNUZXJtVHJ1ZShvUHJvcGVydHksIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmVcIik7XG5cdH1cblxuXHRfaXNNZWFzdXJlUHJvcGVydHkob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5faXNUZXJtVHJ1ZShvUHJvcGVydHksIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIik7XG5cdH1cblxuXHRfaXNUb0JlRXhjbHVkZWQob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5faXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvUHJvcGVydHkpIHx8IHRoaXMuX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQob1Byb3BlcnR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIGNyZWF0ZXMgYSBjb250ZXh0IHVybCBiYXNlZCBvbiBwcm92aWRlZCBkYXRhLiBUaGlzIGNvbnRleHQgdXJsIGNhbiBlaXRoZXIgYmUgdXNlZCBhc1xuXHQgKiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIjc2V0UGFyYW1ldGVyQ29udGV4dFVybCBQYXJhbWV0ZXJDb250ZXh0VXJsfSBvclxuXHQgKiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIjc2V0RmlsdGVyQ29udGV4dFVybCBGaWx0ZXJDb250ZXh0VXJsfS5cblx0ICpcblx0ICogQHBhcmFtIHNFbnRpdHlTZXROYW1lIFVzZWQgZm9yIHVybCBkZXRlcm1pbmF0aW9uXG5cdCAqIEBwYXJhbSBbb01vZGVsXSBVc2VkIGZvciB1cmwgZGV0ZXJtaW5hdGlvbi4gSWYgb21pdHRlZCwgdGhlIE5hdmlnYXRpb25IYW5kbGVyIG1vZGVsIGlzIHVzZWQuXG5cdCAqIEB0aHJvd3MgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpbiBjYXNlIG9mIG1pc3Npbmcgb3Igd3JvbmcgcGFzc2VkIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQgdXJsIGZvciB0aGUgZ2l2ZW4gZW50aXRpZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0Y29uc3RydWN0Q29udGV4dFVybChzRW50aXR5U2V0TmFtZTogc3RyaW5nLCBvTW9kZWw/OiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdGlmICghc0VudGl0eVNldE5hbWUpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLk5PX0VOVElUWV9TRVRfUFJPVklERURcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG9Nb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkgKyBcIiNcIiArIHNFbnRpdHlTZXROYW1lO1xuXHR9XG5cblx0X2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsOiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdGxldCBzU2VydmVyVXJsO1xuXG5cdFx0aWYgKG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRzU2VydmVyVXJsID0gb01vZGVsLl9nZXRTZXJ2ZXJVcmwoKTtcblx0XHR9IGVsc2UgaWYgKG9Nb2RlbC5pc0E8VjRPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRjb25zdCBvU2VydmljZVVSSSA9IG5ldyBVUkkob01vZGVsLmdldFNlcnZpY2VVcmwoKSkuYWJzb2x1dGVUbyhkb2N1bWVudC5iYXNlVVJJKTtcblx0XHRcdHNTZXJ2ZXJVcmwgPSBuZXcgVVJJKFwiL1wiKS5hYnNvbHV0ZVRvKG9TZXJ2aWNlVVJJKS50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdGlmIChzU2VydmVyVXJsICYmIHNTZXJ2ZXJVcmwubGFzdEluZGV4T2YoXCIvXCIpID09PSBzU2VydmVyVXJsLmxlbmd0aCAtIDEpIHtcblx0XHRcdHNTZXJ2ZXJVcmwgPSBzU2VydmVyVXJsLnN1YnN0cigwLCBzU2VydmVyVXJsLmxlbmd0aCAtIDEpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzU2VydmVyVXJsICsgb01vZGVsLnNTZXJ2aWNlVXJsICsgXCIvJG1ldGFkYXRhXCI7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB2ZXJpZmllcywgaWYgYW55IG9mIHRoZSBwYXNzZWQgcGFyYW1ldGVycy9maWx0ZXJzIGFyZSBtYXJrZWQgYXMgc2Vuc2l0aXZlLCBhbmQgaWYgdGhpcyBpcyB0aGUgY2FzZSByZW1vdmUgdGhvc2UgZnJvbSB0aGUgYXBwXG5cdCAqIGRhdGEuIDxiPk5vdGU6PC9iPiBUbyB1c2UgdGhpcyBtZXRob2QsIHRoZSBtZXRhZGF0YSBtdXN0IGJlIGxvYWRlZCBmaXJzdC5cblx0ICpcblx0ICogQHBhcmFtIG9EYXRhIFdpdGggcG90ZW50aWFsIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIE9EYXRhLCBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB1c2luZ1xuXHQgKiA8Y29kZT5vU2VsZWN0aW9uVmFyaWFudC50b0pTT05PYmplY3QoKTwvY29kZT4gbXVzdCBiZSB1c2VkKSwgd2l0aCB0aGUgPGNvZGU+RmlsdGVyQ29udGV4dFVybDwvY29kZT4gb3Jcblx0ICogPGNvZGU+UGFyYW1ldGVyQ29udGV4dFVybDwvY29kZT4gcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIERhdGEgd2l0aG91dCBwcm9wZXJ0aWVzIG1hcmtlZCBhcyBzZW5zaXRpdmUgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBPRGF0YSBtZXRhZGF0YSBpcyBub3QgZnVsbHkgbG9hZGVkIHlldFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvRGF0YTogYW55KSB7XG5cdFx0bGV0IG9BZGFwdGVkRGF0YSA9IG9EYXRhO1xuXHRcdGlmIChcblx0XHRcdG9EYXRhICYmXG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmXG5cdFx0XHQoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMpIHx8XG5cdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzKSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0XHRpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBPFYyT0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRjb25zdCBhU2Vuc2l0aXZlRmlsdGVyTmFtZSA9IFtdO1xuXHRcdFx0XHRjb25zdCBhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSA9IFtdO1xuXHRcdFx0XHRsZXQgaSxcblx0XHRcdFx0XHRvRW50aXR5U2V0OiBhbnksXG5cdFx0XHRcdFx0b0VudGl0eURlZjogYW55LFxuXHRcdFx0XHRcdG9TdWJFbnRpdHlEZWY6IGFueSxcblx0XHRcdFx0XHRvRW5kUm9sZTogYW55LFxuXHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IFtdLFxuXHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0ID0gW107XG5cblx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0aWYgKG9Nb2RlbC5nZXRTZXJ2aWNlTWV0YWRhdGEoKSAmJiBvTWV0YU1vZGVsPy5vTW9kZWwpIHtcblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYUZpbHRlckNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmICYmIG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVGaWx0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FbmRSb2xlID0gb01ldGFNb2RlbC5nZXRPRGF0YUFzc29jaWF0aW9uRW5kKG9FbnRpdHlEZWYsIG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvRW5kUm9sZSB8fCBvRW5kUm9sZS50eXBlID09PSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgZW5kIHJvbGUgaGFzIGNhcmRpbmFsaXR5IDAuLjEgb3IgMVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIxXCIgfHwgb0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjAuLjFcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvU3ViRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VuZFJvbGUudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvU3ViRW50aXR5RGVmICYmIG9TdWJFbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG9TdWJFbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlRmlsdGVyTmFtZS5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUgKyBcIi5cIiArIG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0ubmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYVBhcmFtQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhUGFyYW1Db250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChhU2Vuc2l0aXZlRmlsdGVyTmFtZS5sZW5ndGggfHwgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvQWRhcHRlZERhdGEgPSBleHRlbmQodHJ1ZSBhcyBhbnksIHt9LCBvQWRhcHRlZERhdGEpO1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0aWVzKGFTZW5zaXRpdmVGaWx0ZXJOYW1lLCBhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSwgb0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYW5ub3RhdGlvbnMgYXJlIG5vdCBsb2FkZWRcblxuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUFsbFByb3BlcnRpZXMob0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogb01ldGFkYXRhIGFyZSBub3QgZnVsbHkgbG9hZGVkIVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQob0FkYXB0ZWREYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb0FkYXB0ZWREYXRhO1xuXHR9XG5cblx0X3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9BcHBEYXRhOiBhbnkpIHtcblx0XHRsZXQgb0FwcERhdGFGb3JTYXZlID0gb0FwcERhdGE7XG5cblx0XHRpZiAob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0Lypcblx0XHRcdCAqIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IFNlbGVjdGlvbiBWYXJpYW50cyBuZWVkIHRvIGJlIEpTT04gb2JqZWN0cy4gSG93ZXZlciwgaW50ZXJuYWxseSwgd2Ugd29yayB3aXRoIHN0cmluZ3MgZm9yXG5cdFx0XHQgKiBcInNlbGVjdGlvblZhcmlhbnRcIi4gVGhlcmVmb3JlLCBpbiBjYXNlIHRoYXQgdGhpcyBpcyBhIHN0cmluZywgd2UgbmVlZCB0byBKU09OLXBhcnNlIHRoZSBkYXRhLlxuXHRcdFx0ICovXG5cdFx0XHRpZiAodHlwZW9mIG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VsZWN0aW9uVmFyaWFudCA9IEpTT04ucGFyc2Uob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uIHBhcnNlIGVycm9yXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMob0FwcERhdGFGb3JTYXZlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0FwcERhdGFGb3JTYXZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdmVyaWZpZXMgaWYgYW55IG9mIHRoZSBwYXNzZWQgcGFyYW1ldGVycy9maWx0ZXJzIGFyZSBtYXJrZWQgYXMgYSBtZWFzdXJlLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhlIHhhcHBcblx0ICogYXBwIGRhdGEuIDxiPk5vdGU6PC9iPiBUbyB1c2UgdGhpcyBtZXRob2QsIHRoZSBtZXRhZGF0YSBtdXN0IGJlIGxvYWRlZCBmaXJzdC5cblx0ICpcblx0ICogQHBhcmFtIG9EYXRhIFdpdGggcG90ZW50aWFsIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIE9EYXRhLCBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB1c2luZ1xuXHQgKiA8Y29kZT5vU2VsZWN0aW9uVmFyaWFudC50b0pTT05PYmplY3QoKTwvY29kZT4gbXVzdCBiZSB1c2VkKSwgd2l0aCB0aGUgPGNvZGU+RmlsdGVyQ29udGV4dFVybDwvY29kZT4gb3Jcblx0ICogPGNvZGU+UGFyYW1ldGVyQ29udGV4dFVybDwvY29kZT4gcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIERhdGEgd2l0aG91dCBwcm9wZXJ0aWVzIG1hcmtlZCBhcyBtZWFzdXJlcyBvciBhbiBlbXB0eSBvYmplY3QgaWYgdGhlIE9EYXRhIG1ldGFkYXRhIGlzIG5vdCBmdWxseSBsb2FkZWQgeWV0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyhvRGF0YTogYW55KSB7XG5cdFx0bGV0IG9BZGFwdGVkRGF0YSA9IG9EYXRhO1xuXHRcdGNvbnN0IGFNZWFzdXJlRmlsdGVyTmFtZSA9IFtdO1xuXHRcdGNvbnN0IGFNZWFzdXJlUGFyYW1ldGVyTmFtZSA9IFtdO1xuXHRcdGxldCBpLFxuXHRcdFx0b01vZGVsLFxuXHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdG9FbnRpdHlTZXQ6IGFueSxcblx0XHRcdG9FbnRpdHlEZWY6IGFueSxcblx0XHRcdG9TdWJFbnRpdHlEZWY6IGFueSxcblx0XHRcdG9FbmRSb2xlOiBhbnksXG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBbXSxcblx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0ID0gW107XG5cblx0XHRpZiAoXG5cdFx0XHRvRGF0YSAmJlxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJlxuXHRcdFx0KChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fFxuXHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycykpXG5cdFx0KSB7XG5cdFx0XHRvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0aWYgKG9Nb2RlbC5nZXRTZXJ2aWNlTWV0YWRhdGEoKSAmJiBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwub01vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZiAmJiBvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc01lYXN1cmVQcm9wZXJ0eShvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVhc3VyZUZpbHRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0VuZFJvbGUgPSBvTWV0YU1vZGVsLmdldE9EYXRhQXNzb2NpYXRpb25FbmQob0VudGl0eURlZiwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW9FbmRSb2xlIHx8IG9FbmRSb2xlLnR5cGUgPT09IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBlbmQgcm9sZSBoYXMgY2FyZGluYWxpdHkgMC4uMSBvciAxXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjFcIiB8fCBvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMC4uMVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TdWJFbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW5kUm9sZS50eXBlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9TdWJFbnRpdHlEZWYgJiYgb1N1YkVudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgb1N1YkVudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlRmlsdGVyTmFtZS5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUgKyBcIi5cIiArIG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0ubmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYVBhcmFtQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhUGFyYW1Db250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVQYXJhbWV0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoYU1lYXN1cmVGaWx0ZXJOYW1lLmxlbmd0aCB8fCBhTWVhc3VyZVBhcmFtZXRlck5hbWUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvLyBUUTogbmVlZHMgYXR0ZW50aW9uXG5cdFx0XHRcdFx0XHRvQWRhcHRlZERhdGEgPSBleHRlbmQodHJ1ZSBhcyBhbnksIHt9LCBvQWRhcHRlZERhdGEpO1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0aWVzKGFNZWFzdXJlRmlsdGVyTmFtZSwgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lLCBvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhbm5vdGF0aW9ucyBhcmUgbm90IGxvYWRlZFxuXG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQWxsUHJvcGVydGllcyhvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvQWRhcHRlZERhdGEsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb0FkYXB0ZWREYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgc2Vuc2l0aXZlIGRhdGEgZnJvbSB0aGUgbmF2aWdhdGlvbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0RhdGEgU2VsZWN0aW9uIHZhcmlhbnRcblx0ICogQHBhcmFtIGJNZWFzdXJlIFNob3VsZCBtZWFzdXJlcyBiZSByZW1vdmVkXG5cdCAqIEByZXR1cm5zIFRoZSBzZWxlY3Rpb24gdmFyaWFudCBhZnRlciBzZW5zaXRpdmUgZGF0YSBoYXMgYmVlbiByZW1vdmVkXG5cdCAqL1xuXHRfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQob0RhdGE6IGFueSwgYk1lYXN1cmU/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzLFxuXHRcdFx0b1NWID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCksXG5cdFx0XHRvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdGxldCBhRmlsdGVyQ29udGV4dFBhcnQ6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCFvTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KFwiL1wiKSkge1xuXHRcdFx0Ly8gYW5ub3RhdGlvbnMgYXJlIG5vdCBsb2FkZWRcblx0XHRcdHRoaXMuX3JlbW92ZUFsbFByb3BlcnRpZXMob0RhdGEpO1xuXHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRyZXR1cm4gb0RhdGE7XG5cdFx0fVxuXG5cdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQ/Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0KSB7XG5cdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLmNvbnRleHRcIik7XG5cdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLm1ldGFkYXRhRXRhZ1wiKTtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJTQVBfX01lc3NhZ2VzXCIpO1xuXG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gYUZpbHRlckNvbnRleHRQYXJ0WzFdLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRhUHJvcGVydHlOYW1lcyA9IG9TVi5nZXRQcm9wZXJ0eU5hbWVzKCkgfHwgW10sXG5cdFx0XHRcdGZuSXNTZW5zaXRpdmVEYXRhID0gZnVuY3Rpb24gKHNQcm9wOiBhbnksIGVzTmFtZTogYW55KSB7XG5cdFx0XHRcdFx0ZXNOYW1lID0gZXNOYW1lIHx8IHNFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0Y29uc3QgYVByb3BlcnR5QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIiArIGVzTmFtZSArIFwiL1wiICsgc1Byb3AgKyBcIkBcIik7XG5cdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eUFubm90YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdChiTWVhc3VyZSAmJiBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiXSkgfHxcblx0XHRcdFx0XHRcdFx0b05hdkhhbmRsZXIuX2NoZWNrUHJvcGVydHlBbm5vdGF0aW9uc0ZvclNlbnNpdGl2ZURhdGEoYVByb3BlcnR5QW5ub3RhdGlvbnMpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl0pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udHJvbCA9IGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl07XG5cdFx0XHRcdFx0XHRcdGlmIChvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0gJiYgb0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdLnNwbGl0KFwiL1wiKVsxXSA9PT0gXCJJbmFwcGxpY2FibGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fTtcblxuXHRcdFx0Zm9yIChsZXQgayA9IDA7IGsgPCBhUHJvcGVydHlOYW1lcy5sZW5ndGg7IGsrKykge1xuXHRcdFx0XHRjb25zdCBzUHJvcGVydHkgPSBhUHJvcGVydHlOYW1lc1trXTtcblx0XHRcdFx0Ly8gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHNldFxuXHRcdFx0XHRpZiAoZm5Jc1NlbnNpdGl2ZURhdGEoc1Byb3BlcnR5LCBzRW50aXR5U2V0KSkge1xuXHRcdFx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oc1Byb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9TVi50b0pTT05PYmplY3QoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9EYXRhO1xuXHR9XG5cblx0X2NoZWNrUHJvcGVydHlBbm5vdGF0aW9uc0ZvclNlbnNpdGl2ZURhdGEoYVByb3BlcnR5QW5ub3RhdGlvbnM6IGFueSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiXSB8fFxuXHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiXVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlICh0aGUgaW50ZXJuYWwgYXBwcykgZnJvbSB0aGUgQXBwSGFzaCBzdHJpbmcuIEl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBhYm91dFxuXHQgKiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIG5ldyBhcHByb2FjaCBvZiB0aGUgc2FwLWlhcHAtc3RhdGUuIFByZWNlZGVuY2UgaXMgdGhhdCB0aGUgbmV3IGFwcHJvYWNoIGlzIGZhdm91cmVkIGFnYWluc3QgdGhlIG9sZFxuXHQgKiBhcHByb2FjaC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHNhcC1pYXBwLXN0YXRlIChpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMpLCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGluXG5cdCAqICAgICAgICAgY2FzZSB0aGF0IG5vIHNhcC1pYXBwLXN0YXRlIHdhcyBmb3VuZCBpbiA8Y29kZT5zQXBwSGFzaDwvY29kZT4uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRnZXRJQXBwU3RhdGVLZXkoKSB7XG5cdFx0Y29uc3Qgc0FwcEhhc2ggPSBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKTtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCk7XG5cdH1cbn1cblxuLy8gRXhwb3J0aW5nIHRoZSBjbGFzcyBhcyBwcm9wZXJseSB0eXBlZCBVSTVDbGFzc1xuXG5jb25zdCBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzID0gQmFzZU9iamVjdC5leHRlbmQoXG5cdFwic2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJcIixcblx0TmF2aWdhdGlvbkhhbmRsZXIucHJvdG90eXBlIGFzIGFueVxuKSBhcyB0eXBlb2YgTmF2aWdhdGlvbkhhbmRsZXI7XG50eXBlIE5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3MgPSBJbnN0YW5jZVR5cGU8dHlwZW9mIE5hdmlnYXRpb25IYW5kbGVyPjtcbmV4cG9ydCBkZWZhdWx0IE5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3M7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7RUF1REE7RUFDQSxNQUFNQSxPQUFPLEdBQUdDLFVBQVUsQ0FBQ0QsT0FBTztFQUNsQyxNQUFNRSxpQkFBaUIsR0FBR0QsVUFBVSxDQUFDQyxpQkFBaUI7RUFDdEQsTUFBTUMsbUJBQW1CLEdBQUdGLFVBQVUsQ0FBQ0UsbUJBQW1CO0VB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
|
|
2259
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwib0NvbnRyb2xsZXIiLCJzTW9kZSIsInNQYXJhbUhhbmRsaW5nTW9kZSIsIl9hVGVjaG5pY2FsUGFyYW1hdGVycyIsIl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhIiwic0FwcFN0YXRlS2V5Iiwib0FwcERhdGEiLCJpQ2FjaGVIaXQiLCJpQ2FjaGVNaXNzIiwiX3JJQXBwU3RhdGVPbGQiLCJSZWdFeHAiLCJfcklBcHBTdGF0ZU9sZEF0U3RhcnQiLCJfcklBcHBTdGF0ZU5ldyIsIk5hdkVycm9yIiwiVUlDb21wb25lbnQiLCJvUm91dGVyIiwiZ2V0Um91dGVyIiwib0NvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50IiwiX2dldFJvdXRlciIsImdldEFwcENvbXBvbmVudCIsImdldENvbXBvbmVudERhdGEiLCJVUkxQYXJhbVdpbnMiLCJJbnNlcnRJblNlbE9wdCIsIlNlbFZhcldpbnMiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlIiwic2FwIiwidXNoZWxsIiwiQ29udGFpbmVyIiwiZ2V0U2VydmljZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jIiwiZ2V0U2VydmljZUFzeW5jIiwidGhlbiIsIm9Dcm9zc0FwcE5hdlNlcnZpY2UiLCJjYXRjaCIsIkxvZyIsImVycm9yIiwiZ2V0Um91dGVyRm9yIiwicmVnaXN0ZXJOYXZpZ2F0ZUNhbGxiYWNrIiwiZm5DYWxsYmFjayIsIl9uYXZpZ2F0ZUNhbGxiYWNrIiwibmF2aWdhdGUiLCJzU2VtYW50aWNPYmplY3QiLCJzQWN0aW9uTmFtZSIsInZOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm9Jbm5lckFwcERhdGEiLCJmbk9uRXJyb3IiLCJvRXh0ZXJuYWxBcHBEYXRhIiwic05hdk1vZGUiLCJzU2VsZWN0aW9uVmFyaWFudCIsIm1QYXJhbWV0ZXJzIiwib1hBcHBEYXRhT2JqIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwiYkV4UGxhY2UiLCJvVG1wRGF0YSIsIm9OYXZIYW5kbGVyIiwib0NvbXBvbmVudERhdGEiLCJzdGFydHVwUGFyYW1ldGVycyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm9FbnJpY2hlZFNlbFZhciIsIl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyIsIlNlbGVjdGlvblZhcmlhbnQiLCJvTmF2aWdhdGlvblNlbFZhciIsInRvSlNPTlN0cmluZyIsInNlbGVjdGlvblZhcmlhbnQiLCJfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyIsInRvSlNPTk9iamVjdCIsIl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiIsIl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50Iiwib05hdkFyZ3VtZW50cyIsInRhcmdldCIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwicGFyYW1zIiwiZm5OYXZpZ2F0ZSIsImZuTmF2RXhwbGFjZSIsInNOZXdIcmVmUHJvbWlzZSIsImhyZWZGb3JFeHRlcm5hbEFzeW5jIiwic05ld0hyZWYiLCJvcGVuV2luZG93Iiwib0Vycm9yIiwiX2ZuU2F2ZUFwcFN0YXRlQXN5bmMiLCJvU2F2ZUFwcFN0YXRlUmV0dXJuIiwiYXBwU3RhdGVLZXkiLCJwdG9FeHQiLCJ0b0V4dGVybmFsIiwiZm5TdG9yZUFuZE5hdmlnYXRlIiwic3RvcmVJbm5lckFwcFN0YXRlQXN5bmMiLCJyZXBsYWNlSGFzaCIsIm9TdXBwb3J0ZWRQcm9taXNlIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwiZG9uZSIsIm9UYXJnZXRzIiwic3VwcG9ydGVkIiwiZmFpbCIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiYklzWGFwcFN0YXRlTmF2aWdhdGlvbiIsInRoYXQiLCJvU3RhcnR1cFByb21pc2UiLCJnZXRTdGFydHVwQXBwU3RhdGUiLCJvQXBwU3RhdGUiLCJnZXREYXRhIiwic3RyaW5naWZ5IiwieCIsInByb21pc2UiLCJvU2VsVmFyIiwiVVJMUGFyYW1zIiwic2V0VGVjaG5pY2FsUGFyYW1ldGVycyIsImFUZWNobmljYWxQYXJhbWV0ZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0VGVjaG5pY2FsUGFyYW1ldGVycyIsImNvbmNhdCIsIl9pc1RlY2huaWNhbFBhcmFtZXRlciIsInNQYXJhbWV0ZXJOYW1lIiwidG9Mb3dlckNhc2UiLCJpbmRleE9mIiwiX2lzRkVQYXJhbWV0ZXIiLCJzUHJvcE5hbWUiLCJpIiwiYVNlbFZhclByb3BOYW1lcyIsImdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzIiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwib1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldFBhcmFtZXRlck5hbWVzIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsImdldFZhbHVlIiwiX2FkZFBhcmFtZXRlclZhbHVlcyIsImFQcm9wTmFtZXMiLCJvU2VsVmFyaWFudCIsInNTaWduIiwic09wdGlvbiIsIm9WYWx1ZXMiLCJhZGRTZWxlY3RPcHRpb24iLCJvSGFzaENoYW5nZXIiLCJzQXBwSGFzaE9sZCIsInNBcHBIYXNoTmV3IiwiX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5IiwibUlubmVyQXBwRGF0YSIsImJJbW1lZGlhdGVIYXNoUmVwbGFjZSIsImJTa2lwSGFzaFJlcGxhY2UiLCJmblJlcGxhY2VIYXNoIiwiaXNFbXB0eU9iamVjdCIsInNBcHBTdGF0ZUtleUNhY2hlZCIsImJJbm5lckFwcERhdGFFcXVhbCIsImZuT25BZnRlclNhdmUiLCJfc2F2ZUFwcFN0YXRlQXN5bmMiLCJzdG9yZUlubmVyQXBwU3RhdGUiLCJfc2F2ZUFwcFN0YXRlIiwic3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybiIsIm9BcHBTdGF0ZVByb21pc2UiLCJwcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zIiwib1RhYmxlRXZlbnRQYXJhbWV0ZXJzIiwibVNlbWFudGljQXR0cmlidXRlcyIsInNlbWFudGljQXR0cmlidXRlcyIsImZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4iLCJtU3ViU2VtYW50aWNBdHRyaWJ1dGVzIiwic1N1YlNlbGVjdGlvblZhcmlhbnQiLCJpU3VwcHJlc3Npb25CZWhhdmlvciIsInJhaXNlRXJyb3JPbk51bGwiLCJyYWlzZUVycm9yT25VbmRlZmluZWQiLCJvTWl4ZWRTZWxWYXIiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsImZuT25Db250YWluZXJTYXZlIiwic2V0U2VtYW50aWNBdHRyaWJ1dGVzIiwic2V0QXBwU3RhdGVLZXkiLCJvcGVuIiwib1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UiLCJfZ2V0QXBwU3RhdGVLZXlBbmRVcmxQYXJhbWV0ZXJzIiwiX2dldEFwcFNwZWNpZmljSGFzaCIsImFwcEhhc2giLCJjcm9zc0FwcFNlcnZpY2UiLCJocmVmRm9yQXBwU3BlY2lmaWNIYXNoQXN5bmMiLCJtZXNzYWdlIiwiRXJyb3IiLCJTdHJpbmciLCJfbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudCIsInNQcm9wZXJ0eU5hbWUiLCJ2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSIsIkRhdGUiLCJ0b0pTT04iLCJ0b1N0cmluZyIsImlnbm9yZUVtcHR5U3RyaW5nIiwiaW5mbyIsInZTZW1hbnRpY0F0dHJpYnV0ZXMiLCJvTmV3U2VsVmFyaWFudCIsImZpbHRlclVybCIsImdldEZpbHRlckNvbnRleHRVcmwiLCJzZXRGaWx0ZXJDb250ZXh0VXJsIiwiY29udGV4dFVybCIsImdldFBhcmFtZXRlckNvbnRleHRVcmwiLCJzZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwiZm9yRWFjaCIsImFQYXJhbWV0ZXJzIiwiZ2V0U2VsZWN0T3B0aW9uIiwiZ2V0UGFyYW1ldGVyIiwiYVNlbE9wdGlvbk5hbWVzIiwiYVNlbGVjdE9wdGlvbiIsImoiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiSGlnaCIsIl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nIiwidlNlbGVjdGlvblZhcmlhbnQiLCJ2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCIsIl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZSIsIm9SZXR1cm4iLCJfc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybiIsIl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJnZXRLZXkiLCJvQXBwRGF0YUZvclNhdmUiLCJfZmV0Y2hBcHBEYXRhRm9yU2F2ZSIsInNldERhdGEiLCJvU2F2ZVByb21pc2UiLCJzYXZlIiwiZXh0ZW5kIiwidGFibGVWYXJpYW50SWQiLCJjdXN0b21EYXRhIiwicHJlc2VudGF0aW9uVmFyaWFudCIsInZhbHVlVGV4dHMiLCJzZW1hbnRpY0RhdGVzIiwib0FwcERhdGFDbG9uZSIsIk9iamVjdCIsImFzc2lnbiIsIm1lcmdlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZUFzeW5jIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsIm9EZWZlcnJlZCIsImdldEFwcFN0YXRlIiwib0FwcERhdGFMb2FkZWQiLCJkYXRhIiwiYU1hdGNoZXMiLCJleGVjIiwic05ld0lBcHBTdGF0ZSIsImZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciIsInNTdWJBcHBIYXNoIiwidGVzdCIsInJlcGxhY2UiLCJzTmVlZGxlIiwiZm5SZXBsYWNlT2xkQXBwcm9hY2giLCJyT2xkQXBwcm9hY2giLCJhc3NlcnQiLCJtVVJMUGFyYW1ldGVycyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiYVNlbGVjdE9wdGlvbnMiLCJhUGFyYW1ldGVyTmFtZXMiLCJzUGFyYW1ldGVyVmFsdWUiLCJzRXJyb3JDb2RlIiwic2V0TW9kZWwiLCJvTW9kZWwiLCJfb01vZGVsIiwiX2dldE1vZGVsIiwiZ2V0TW9kZWwiLCJfcmVtb3ZlQWxsUHJvcGVydGllcyIsIm9EYXRhIiwiX3JlbW92ZVByb3BlcnRpZXMiLCJhRmlsdGVyTmFtZSIsImFQYXJhbWV0ZXJOYW1lIiwic05hbWUiLCJTZWxlY3RPcHRpb25zIiwic29tZSIsIm9WYWx1ZSIsIm5JZHgiLCJQcm9wZXJ0eU5hbWUiLCJzcGxpY2UiLCJUZXh0cyIsIm9UZXh0cyIsIlByb3BlcnR5VGV4dHMiLCJEYXRlcyIsIm9EYXRlcyIsIlBhcmFtZXRlcnMiLCJfaXNUZXJtVHJ1ZSIsIm9Qcm9wZXJ0eSIsInNUZXJtIiwiZklzVGVybURlZmF1bHRUcnVlIiwib1Rlcm0iLCJCb29sIiwiX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQiLCJfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsIl9pc01lYXN1cmVQcm9wZXJ0eSIsIl9pc1RvQmVFeGNsdWRlZCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJzRW50aXR5U2V0TmFtZSIsIl9jb25zdHJ1Y3RDb250ZXh0VXJsIiwic1NlcnZlclVybCIsImlzQSIsIl9nZXRTZXJ2ZXJVcmwiLCJvU2VydmljZVVSSSIsIlVSSSIsImdldFNlcnZpY2VVcmwiLCJhYnNvbHV0ZVRvIiwiZG9jdW1lbnQiLCJiYXNlVVJJIiwibGFzdEluZGV4T2YiLCJzdWJzdHIiLCJzU2VydmljZVVybCIsIm9BZGFwdGVkRGF0YSIsIkZpbHRlckNvbnRleHRVcmwiLCJQYXJhbWV0ZXJDb250ZXh0VXJsIiwiYVNlbnNpdGl2ZUZpbHRlck5hbWUiLCJhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSIsIm9FbnRpdHlTZXQiLCJvRW50aXR5RGVmIiwib1N1YkVudGl0eURlZiIsIm9FbmRSb2xlIiwiYUZpbHRlckNvbnRleHRQYXJ0IiwiYVBhcmFtQ29udGV4dFBhcnQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0U2VydmljZU1ldGFkYXRhIiwic3BsaXQiLCJnZXRPRGF0YUVudGl0eVNldCIsImdldE9EYXRhRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eSIsInB1c2giLCJuYW1lIiwibmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZCIsInR5cGUiLCJtdWx0aXBsaWNpdHkiLCJfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyIsImFNZWFzdXJlRmlsdGVyTmFtZSIsImFNZWFzdXJlUGFyYW1ldGVyTmFtZSIsImJNZWFzdXJlIiwib1NWIiwiZ2V0T2JqZWN0Iiwic0VudGl0eVNldCIsImFQcm9wZXJ0eU5hbWVzIiwiZ2V0UHJvcGVydHlOYW1lcyIsImZuSXNTZW5zaXRpdmVEYXRhIiwic1Byb3AiLCJlc05hbWUiLCJhUHJvcGVydHlBbm5vdGF0aW9ucyIsIl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhIiwib0ZpZWxkQ29udHJvbCIsImsiLCJzUHJvcGVydHkiLCJnZXRJQXBwU3RhdGVLZXkiLCJCYXNlT2JqZWN0IiwiTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyIsInByb3RvdHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTmF2aWdhdGlvbkhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJzYXAvYmFzZS9hc3NlcnRcIjtcbmltcG9ydCBleHRlbmQgZnJvbSBcInNhcC9iYXNlL3V0aWwvZXh0ZW5kXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBVSUNvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvVUlDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgSGFzaENoYW5nZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvSGFzaENoYW5nZXJcIjtcbmltcG9ydCBWMk9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92Mi9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgVjRPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9qcXVlcnlcIjtcbmltcG9ydCBvcGVuV2luZG93IGZyb20gXCJzYXAvdWkvdXRpbC9vcGVuV2luZG93XCI7XG5pbXBvcnQgTmF2RXJyb3IgZnJvbSBcIi4vTmF2RXJyb3JcIjtcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgTmF2TGlicmFyeSBmcm9tIFwiLi9saWJyYXJ5XCI7XG5cbi8qKlxuICogU3RydWN0dXJlIG9mIHN0b3JlZCBhcHAgc3RhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5uZXJBcHBEYXRhIHtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0LyoqXG5cdCAqIFNyaW5naWZpZWQgSlNPTiBvYmplY3QgYXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCBmcm9tIGdldERhdGFTdWl0ZUZvcm1hdCgpIG9mIHRoZSBTbWFydEZpbHRlckJhciBjb250cm9sXG5cdCAqL1xuXHRzZWxlY3Rpb25WYXJpYW50Pzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJRCBvZiB0aGUgU21hcnRUYWJsZSB2YXJpYW50LlxuXHQgKi9cblx0dGFibGVWYXJpYW50SWQ/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFyYml0cmFyeSBkYXRhLlxuXHQgKi9cblx0Y3VzdG9tRGF0YT86IG9iamVjdDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgc3RhdGUgb2YgdGhlIGFwcC5cblx0ICovXG5cdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucy5cblx0ICovXG5cdHZhbHVlVGV4dHM/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHNlbWFudGljRGF0ZXMgZmlsdGVyIGluZm9ybWF0aW9uLlxuXHQgKi9cblx0c2VtYW50aWNEYXRlcz86IG9iamVjdDtcbn1cblxuLy8gc2hvcnRjdXRzIGZvciBzYXAudWkuZ2VuZXJpYy5hcHAgZW51bXNcbmNvbnN0IE5hdlR5cGUgPSBOYXZMaWJyYXJ5Lk5hdlR5cGU7XG5jb25zdCBQYXJhbUhhbmRsaW5nTW9kZSA9IE5hdkxpYnJhcnkuUGFyYW1IYW5kbGluZ01vZGU7XG5jb25zdCBTdXBwcmVzc2lvbkJlaGF2aW9yID0gTmF2TGlicmFyeS5TdXBwcmVzc2lvbkJlaGF2aW9yO1xuY29uc3QgTW9kZSA9IE5hdkxpYnJhcnkuTW9kZTtcblxuY29uc3QgSUFQUF9TVEFURSA9IFwic2FwLWlhcHAtc3RhdGVcIjtcbmNvbnN0IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkgPSBcInNhcC11c2hlbGwtZGVmYXVsdGVkUGFyYW1ldGVyTmFtZXNcIjtcbmNvbnN0IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSA9IFwibmhIeWJyaWRJQXBwU3RhdGVLZXlcIjtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzdWNjZXNzb3Igb2Yge0BsaW5rIHNhcC51aS5nZW5lcmljLmFwcC5uYXZpZ2F0aW9uLnNlcnZpY2UuTmF2aWdhdGlvbkhhbmRsZXJ9Ljxicj4gQ3JlYXRlcyBhIG5ldyBOYXZpZ2F0aW9uSGFuZGxlciBjbGFzcyBieSBwcm92aWRpbmcgdGhlIHJlcXVpcmVkIGVudmlyb25tZW50LiA8YnI+XG4gKiBUaGUgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXI8L2NvZGU+IHN1cHBvcnRzIHRoZSB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBBbGwgcHJvcGVydGllcyB0aGF0IGFyZSBwYXJ0IG9mXG4gKiA8Y29kZT5zZWxlY3Rpb25WYXJpYW50PC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUZXh0czwvY29kZT4gd2lsbCBiZSB2ZXJpZmllZCBpZiB0aGV5IGFyZSBhbm5vdGF0ZWQgYXNcbiAqIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlPC9jb2RlPiBvclxuICogPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dDwvY29kZT4gYW5kIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIGRhdGEgaXMgcGVyc2lzdGVkIGFzIHRoZSBhcHBcbiAqIHN0YXRlLjxicj5cbiAqIEFsc28sIGFsbCBwcm9wZXJ0aWVzIGFubm90YXRlZCBhcyA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZTwvY29kZT4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGEgc3RvcmVkIGFzIHRoZVxuICogeGFwcCBzdGF0ZS48YnI+XG4gKiBUbyB2ZXJpZnkgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHJlbW92ZWQsIHRoZSA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlcjwvY29kZT4gcmVxdWlyZXMgYW4gdW5uYW1lZCBtb2RlbCBvZiB0eXBlXG4gKiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWx9IG9uIGNvbXBvbmVudCBsZXZlbC4gSXQgaXMgcG9zc2libGUgdG8gc2V0IHN1Y2ggYSBtb2RlbCB1c2luZyB0aGUgPGNvZGU+c2V0TW9kZWw8L2NvZGU+XG4gKiBtZXRob2QuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoZSBjaGVjayBmb3IgZXhjbHVkZWQgZGF0YSByZXF1aXJlcyB0aGF0IHRoZSBPRGF0YSBtZXRhZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBjb21wbGV0ZWx5Ljxicj5cbiAqIElmIHRoZSBPRGF0YSBtZXRhZGF0YSBtb2RlbCBoYXMgbm90IGJlZW4gbG9hZGVkIGNvbXBsZXRlbHksIGFsbCBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgcmVxdWlyZXMgdGhhdCB0aGUgVVNoZWxsIHtAbGluayBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9ufSBpcyBhdmFpbGFibGUgYW5kIGluaXRpYWxpemVkLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgc2FwLnVpLmJhc2UuT2JqZWN0XG4gKiBAc2luY2UgMS44My4wXG4gKiBAbmFtZSBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkhhbmRsZXIgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0cHJpdmF0ZSBvUm91dGVyOiBhbnk7XG5cblx0cHJpdmF0ZSBvQ29tcG9uZW50OiBhbnk7XG5cblx0cHJpdmF0ZSBfb01vZGVsOiBhbnk7XG5cblx0cHJpdmF0ZSBzUGFyYW1IYW5kbGluZ01vZGU6IHN0cmluZztcblxuXHRwcml2YXRlIF9zTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8vIGxpc3Qgb2YgdGVjaG5pY2FsIHBhcmFtZXRlcnNcblx0cHJpdmF0ZSBfYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBbXCJoY3BBcHBsaWNhdGlvbklkXCJdO1xuXG5cdHByaXZhdGUgX29MYXN0U2F2ZWRJbm5lckFwcERhdGE6IGFueSA9IHtcblx0XHRzQXBwU3RhdGVLZXk6IFwiXCIsXG5cdFx0b0FwcERhdGE6IHt9LFxuXHRcdGlDYWNoZUhpdDogMCxcblx0XHRpQ2FjaGVNaXNzOiAwXG5cdH07XG5cblx0Lypcblx0ICogVGhlcmUgZXhpc3RzIGEgZ2VuZXJhdGlvbiBvZiBcIm9sZFwiIHNhcC1pYXBwLXN0YXRlcyB3aGljaCBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBVUkwgc2NoZW1hOlxuXHQgKiAjU2VtT2JqLWFjdGlvbiYvcm91dGUvc2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggVGhlIG5ldyBVUkwgc2NoZW1hIGlzOiAjU2VtT2JqLWFjdGlvbiYvcm91dGU/c2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggKG1pbmQgdGhlXG5cdCAqIGRpZmZlcmVuY2UgYmV0d2VlbiAvIGFuZCA/IGFib3ZlKSwgaS5lLiB0aGUgc2FwLWlhcHAtc3RhdGUgaGFzIGJlY29tZSBhIHBhcmFtZXRlciBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHNlY3Rpb24gaW4gdGhlIEFwcEhhc2ggc3RyaW5nLlxuXHQgKiBZZXQsIHRoaXMgdG9vbCBzaGFsbCBiZSBhYmxlIHRvIGRlYWwgZXZlbiB3aXRoIG9sZCBzYXAtaWFwcC1zdGF0ZXMuIFRoZXJlZm9yZSwgd2UgdXNlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIChySUFwcFN0YXRlT2xkIGFuZFxuXHQgKiBySUFwcFN0YXRlT2xkQXRTdGFydCkgYXMgZGVmaW5lZCBiZWxvdyB0byBzY2FuIGZvciB0aGVzZSBvbGQgdmFyaWFudHMuIFRoZSBuZXcgdmFyaWFudCBpcyBiZWluZyBzY2FubmVkIHVzaW5nIHJJQXBwU3RhdGVOZXcgYXMgUmVndWxhclxuXHQgKiBFeHByZXNzaW9uIHNlYXJjaCBzdHJpbmcuIENvbXBhdGliaWxpdHkgaXMgY2VudHJhbGx5IGVuc3VyZWQgYnkgdGhlIHR3byBtZXRob2RzIF9nZXRJbm5lckFwcFN0YXRlS2V5IGFuZCBfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkgKHNlZVxuXHQgKiBiZWxvdykuIE5ldmVyIHVzZSB0aGVzZSBSZWdFeHAgaW4gYSBtZXRob2Qgb24geW91ciBvd24sIGFzIGl0IHR5cGljYWxseSBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2lsbCBmYWxsIGludG8gdGhlIGNvbXBhdGliaWxpdHkgdHJhcCFcblx0ICovXG5cdC8vIFdhcm5pbmchIERvIG5vdCB1c2UgR0xPQkFMIGZsYWdzIGhlcmU7IFJlZ0V4cCBpbiBHTE9CQUwgbW9kZSBzdG9yZSB0aGUgbGFzdEluZGV4IHZhbHVlXG5cdC8vIFRoZXJlZm9yZSwgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIFJlZ0V4cCB3aWxsIHRoZW4gb25seSBzdGFydCBiZWdpbm5pbmcgd2l0aCB0aGF0IHN0b3JlZFxuXHQvLyBsYXN0SW5kZXguIFRodXMsIG11bHRpcGxlIGNhbGxzIHRoZXJlZm9yZSBjb3VsZCB5aWVsZCBzdHJhbmdlIHJlc3VsdHMuXG5cdC8vIE1vcmVvdmVyLCB0aGVyZSBzaGFsbCBvbmx5IGJlIGV4YWN0bHkgb25lIElBUFBfU1RBVEUgcGVyIFJlZ0V4cCBpbiBhbiBBcHBIYXNoLlxuXHQvLyBUaGVyZWZvcmUsIEdMT0JBTCBzZWFyY2ggc2hvdWxkIGJlIHN1cGVyZmx1b3VzLlxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkID0gbmV3IFJlZ0V4cChcIi9cIiArIElBUFBfU1RBVEUgKyBcIj0oW14vP10rKVwiKTtcblxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkQXRTdGFydCA9IG5ldyBSZWdFeHAoXCJeXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteLz9dKylcIik7XG5cblx0Lypcblx0ICogUmVndWxhciBFeHByZXNzaW9uIGluIHdvcmRzOiBTZWFyY2ggZm9yIHNvbWV0aGluZyB0aGF0IGVpdGhlciBzdGFydHMgd2l0aCA/IG9yICYsIGZvbGxvd2VkIGJ5IHRoZSB0ZXJtIFwic2FwLWlhcHAtc3RhdGVcIi4gVGhhdCBvbmUgaXNcblx0ICogZm9sbG93ZWQgYnkgYW4gZXF1YWwgc2lnbiAoPSkuIFRoZSBzdHVmZiB0aGF0IGlzIGFmdGVyIHRoZSBlcXVhbCBzaWduIGZvcm1zIHRoZSBmaXJzdCByZWdleHAgZ3JvdXAuIFRoaXMgZ3JvdXAgY29uc2lzdHMgb2YgYXQgbGVhc3Qgb25lXG5cdCAqIChvciBhcmJpdHJhcnkgbWFueSkgY2hhcmFjdGVycywgYXMgbG9uZyBhcyBpdCBpcyBub3QgYW4gYW1wZXJzYW5kIHNpZ24gKCYpLiBDaGFyYWN0ZXJzIGFmdGVyIHN1Y2ggYW4gYW1wZXJzYW5kIHdvdWxkIGJlIGlnbm9yZWQgYW5kIGRvXG5cdCAqIG5vdCBiZWxvbmcgdG8gdGhlIGdyb3VwLiBBbHRlcm5hdGl2ZWx5LCB0aGUgc3RyaW5nIGFsc28gbWF5IGVuZC5cblx0ICovXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVOZXcgPSBuZXcgUmVnRXhwKFwiWz8mXVwiICsgSUFQUF9TVEFURSArIFwiPShbXiZdKylcIik7XG5cblx0cHJpdmF0ZSBfbmF2aWdhdGVDYWxsYmFjazogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRlbXBvcmFyaWx5IGFkZGVkIGFnYWluIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gd2FzIChpbGxlZ2lhbGx5KSByZWx5aW5nIG9uIGl0LiBTaG91bGQgYmUgcmVtb3ZlZCBhZ2Fpbiwgb25jZSB0aGUgYXBwIGlzIGNvcnJlY3RlZFxuXHQgKi9cblx0cHJpdmF0ZSBJQVBQX1NUQVRFID0gSUFQUF9TVEFURTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IgcmVxdWlyaW5nIGEgY29udHJvbGxlci9jb21wb25lbnQgb3duaW5nIHRoZSBuYXZpZ2F0aW9uIGhhbmRsZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlciBVSTUgY29udHJvbGxlciB0aGF0IGNvbnRhaW5zIGEgcm91dGVyIGFuZCBhIGNvbXBvbmVudDsgdHlwaWNhbGx5IHRoZSBtYWluIGNvbnRyb2xsZXIgb2YgeW91ciBhcHBsaWNhdGlvbiwgZm9yXG5cdCAqICAgICAgICBleGFtcGxlLCBhIHN1YmNsYXNzIG9mIHRoZSBzYXAuY2Euc2NmbGQubWQuY29udHJvbGxlci5CYXNlRnVsbHNjcmVlbkNvbnRyb2xsZXIgaWYgc2NhZmZvbGRpbmcgaXMgdXNlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NNb2RlPXNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWNF0gTW9kZSB0byBiZSB1c2VkIHRvIGluZGljYXRlcyB0aGUgT2RhdGEgdmVyc2lvbiB1c2VkIGZvciBydW5ubmluZyB0aGUgTmF2aWdhdGlvbiBIYW5kbGVyLFxuXHQgKiAgICAgICAgc2VlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5Nb2RlfS48YnI+XG5cdCAqIFx0XHQgIE5vdGU6IE1vZGUgaGFzIHRvIGJlIHNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWMiB3aGVuZXZlciB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIE9EYXRhIFYyIGJhc2VkIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc1BhcmFtSGFuZGxpbmdNb2RlPVNlbFZhcldpbnNdIE1vZGUgdG8gYmUgdXNlZCB0byBoYW5kbGUgY29uZmxpY3RzIHdoZW4gbWVyZ2luZyBVUkwgcGFyYW1ldGVycyBhbmQgdGhlIFNlbGVjdGlvblZhcmlhbnQgY2xhc3MsXG5cdCAqICAgICAgICBzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlBhcmFtSGFuZGxpbmdNb2RlfVxuXHQgKiBAdGhyb3dzIEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaW4gY2FzZSBvZiBpbnB1dCBlcnJvcnMuIFZhbGlkIGVycm9yIGNvZGVzIGFyZTogPHRhYmxlPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGggYWxpZ249XCJsZWZ0XCI+TmF2RXJyb3IgY29kZTwvdGg+XG5cdCAqICAgICAgICAgPHRoIGFsaWduPVwibGVmdFwiPkRlc2NyaXB0aW9uPC90aD5cblx0ICogICAgICAgICA8L3RyPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGQ+TmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVDwvdGQ+XG5cdCAqICAgICAgICAgPHRkPkluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgaW52YWxpZDwvdGQ+XG5cdCAqICAgICAgICAgPC90cj5cblx0ICogICAgICAgICA8L3RhYmxlPlxuXHQgKi9cblx0Y29uc3RydWN0b3Iob0NvbnRyb2xsZXI6IENvbnRyb2xsZXIgfCBVSUNvbXBvbmVudCwgc01vZGU/OiBzdHJpbmcsIHNQYXJhbUhhbmRsaW5nTW9kZT86IHN0cmluZykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFvQ29udHJvbGxlcikge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRpZiAob0NvbnRyb2xsZXIgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gb0NvbnRyb2xsZXIuZ2V0Um91dGVyKCk7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGVvZiBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMuX2dldFJvdXRlcihvQ29udHJvbGxlcik7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCgpO1xuXHRcdH1cblxuXHRcdC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFNtYXJ0VGVtcGxhdGVzXG5cdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiB0aGlzLm9Db21wb25lbnQuZ2V0QXBwQ29tcG9uZW50KSB7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSB0aGlzLm9Db21wb25lbnQuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dHlwZW9mIHRoaXMub1JvdXRlciA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudCA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhICE9PSBcImZ1bmN0aW9uXCJcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuVVJMUGFyYW1XaW5zIHx8IHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuSW5zZXJ0SW5TZWxPcHQpIHtcblx0XHRcdHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlID0gc1BhcmFtSGFuZGxpbmdNb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSA9IFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM7IC8vIGRlZmF1bHRcblx0XHR9XG5cdFx0aWYgKHNNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdHRoaXMuX3NNb2RlID0gc01vZGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgc2hlbGwgbmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgTmF2aWdhdGlvbiBzZXJ2aWNlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2UoKSB7XG5cdFx0cmV0dXJuIHNhcC51c2hlbGwuQ29udGFpbmVyLmdldFNlcnZpY2UoXCJDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvblwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHNoZWxsIG5hdmlnYXRpb24gc2VydmljZS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIE5hdmlnYXRpb24gc2VydmljZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKSB7XG5cdFx0cmV0dXJuIHNhcC51c2hlbGwuQ29udGFpbmVyLmdldFNlcnZpY2VBc3luYyhcIkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXCIpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBpcyBub3QgYXZhaWxhYmxlLlwiKTtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuTk8uWEFQUFNFUlZJQ0VcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm91dGVyIG9iamVjdCBmb3IgbmF2aWdhdGlvbiBmb3IgdGhpcyBnaXZlbiBDb250cm9sbGVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgQ29udHJvbGxlciBmb3Igd2hpY2ggdGhlIFJvdXRlciBpbnN0YW5jZSBzaGFsbCBiZSBkZXRlcm1pbmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgUm91dGVyIGZvciB0aGUgZ2l2ZW4gQ29udHJvbGxlclxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFJvdXRlcihvQ29udHJvbGxlcjogQ29udHJvbGxlcikge1xuXHRcdHJldHVybiBVSUNvbXBvbmVudC5nZXRSb3V0ZXJGb3Iob0NvbnRyb2xsZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIHVzZWQgb25seSBieSBGRSBWMiB0byBnZXQgYWNjZXNzIHRvIHRvRXh0ZXJuYWwgcHJvbWlzZS5cblx0ICpcblx0ICogQHBhcmFtIGZuQ2FsbGJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJ5ICduYXZpZ2F0ZScgbWV0aG9kIGluIGNhc2Ugb2YgdG9FeHRlcm5hbCBpcyB1c2VkIHRvIG5hdmlnYXRlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVnaXN0ZXJOYXZpZ2F0ZUNhbGxiYWNrKGZuQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG5cdFx0dGhpcy5fbmF2aWdhdGVDYWxsYmFjayA9IGZuQ2FsbGJhY2s7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcnMgYSBjcm9zcy1hcHAgbmF2aWdhdGlvbiBhZnRlciBzYXZpbmcgdGhlIGlubmVyIGFuZCB0aGUgY3Jvc3MtYXBwIHN0YXRlcy4gVGhlIG5hdmlnYXRpb24gbW9kZSBiYXNlZCBvblxuXHQgKiA8Y29kZT5zYXAtdXNoZWxsLW5leHQtbmF2bW9kZTwvY29kZT4gaXMgdGFrZW4gaW50byBhY2NvdW50LiBJZiBzZXQgdG8gPGNvZGU+ZXhwbGFjZTwvY29kZT4gdGhlIGlubmVyIGFwcCBzdGF0ZSB3aWxsIG5vdCBiZSBjaGFuZ2VkLlxuXHQgKiA8Yj5Ob3RlOjwvYj4gVGhlIDxjb2RlPnNOYXZNb2RlPC9jb2RlPiBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBvdmVyd3JpdGUgdGhlIFNBUCBGaW9yaSBsYXVuY2hwYWQgZGVmYXVsdCBuYXZpZ2F0aW9uIGZvciBvcGVuaW5nIGEgVVJMXG5cdCAqIGluLXBsYWNlIG9yIGV4LXBsYWNlLlxuXHQgKiA8YnI+XG5cdCAqIDxiPk5vZGU6PC9iPiBJZiB0aGUgPGNvZGU+b0V4dGVybmFsQXBwRGF0YTwvY29kZT4gcGFyYW1ldGVyIGlzIG5vdCBzdXBwbGllZCwgdGhlIGV4dGVybmFsIGFwcCBkYXRhIHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvblxuXHQgKiB0aGUgPGNvZGU+b0lubmVyQXBwRGF0YTwvY29kZT4gZGF0YS48YnI+XG5cdCAqIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2wgPGI+UGFyYW1ldGVyczo8L2I+IDx0YWJsZT5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57b2JqZWN0fTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3I8L2I+PC90ZD5cblx0ICogPHRkPk5hdkVycm9yIG9iamVjdCAoaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSkgdGhhdCBkZXNjcmliZXMgd2hpY2gga2luZCBvZiBlcnJvciBvY2N1cnJlZDwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e3N0cmluZ308L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLmVycm9yQ29kZTwvYj48L3RkPlxuXHQgKiA8dGQ+Q29kZSB0byBpZGVudGlmeSB0aGUgZXJyb3I8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntzdHJpbmd9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvci50eXBlPC9iPjwvdGQ+XG5cdCAqIDx0ZD5TZXZlcml0eSBvZiB0aGUgZXJyb3IgKGluZm8vd2FybmluZy9lcnJvcik8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPnthcnJheX08L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLnBhcmFtczwvYj48L3RkPlxuXHQgKiA8dGQ+QW4gYXJyYXkgb2Ygb2JqZWN0cyAodHlwaWNhbGx5IHN0cmluZ3MpIHRoYXQgZGVzY3JpYmUgYWRkaXRpb25hbCB2YWx1ZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBnZW5lcmF0aW5nIHRoZSBtZXNzYWdlPC90ZD5cblx0ICogPC90YWJsZT4uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICogQGZ1bmN0aW9uIG5hdmlnYXRlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5wcm90b3R5cGVcblx0ICogQHBhcmFtIHNTZW1hbnRpY09iamVjdCBOYW1lIG9mIHRoZSBzZW1hbnRpYyBvYmplY3Qgb2YgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvbiBvZiB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gdk5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVycyBhcyBhbiBvYmplY3Qgd2l0aCBrZXkvdmFsdWUgcGFpcnMgb3IgYXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygc3VjaCBhbiBvYmplY3QuIElmIHBhc3NlZCBhcyBhbiBvYmplY3QsIHRoZSBwcm9wZXJ0aWVzIGFyZSBub3QgY2hlY2tlZCBhZ2FpbnN0IHRoZSA8Y29kZT5Jc1BvdGVudGlhbFNlbnNpdGl2ZTwvY29kZT4gb3IgPGNvZGU+TWVhc3VyZTwvY29kZT4gdHlwZS5cblx0ICogQHBhcmFtIG9Jbm5lckFwcERhdGEgT2JqZWN0IGZvciBzdG9yaW5nIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gZm5PbkVycm9yIENhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbmF2aWdhdGlvbiA8YnI+XG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhIE9iamVjdCBmb3Igc3RvcmluZyB0aGUgc3RhdGUgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgc3RhdGUgb2YgdGhlIGFwcCB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGVcblx0ICogICAgICAgIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnZhbHVlVGV4dHMgT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgZGVzY3JpcHRpb25zIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50IFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0LCB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4gSWYgbm90XG5cdCAqICAgICAgICBwcm92aWRlZCB0aGUgc2VsZWN0aW9uVmFyaWFudCB3aWxsIGJlIGNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSB2TmF2aWdhdGlvblBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBzTmF2TW9kZSBBcmd1bWVudCBpcyB1c2VkIHRvIG92ZXJ3cml0ZSB0aGUgRkxQLWNvbmZpZ3VyZWQgdGFyZ2V0IGZvciBvcGVuaW5nIGEgVVJMLiBJZiB1c2VkLCBvbmx5IHRoZVxuXHQgKiAgICAgICAgPGNvZGU+ZXhwbGFjZTwvY29kZT4gb3IgPGNvZGU+aW5wbGFjZTwvY29kZT4gdmFsdWVzIGFyZSBhbGxvd2VkLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBsZWFkIHRvIGFuIGV4Y2VwdGlvblxuXHQgKiAgICAgICAgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9OQVZfTU9ERTwvY29kZT4uXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIHNTZW1hbnRpY09iamVjdCA9IFwiU2FsZXNPcmRlclwiO1xuXHQgKiBcdHZhciBzQWN0aW9uTmFtZSA9IFwiY3JlYXRlXCI7XG5cdCAqXG5cdCAqIFx0Ly9zaW1wbGUgcGFyYW1ldGVycyBhcyBPYmplY3Rcblx0ICogXHR2YXIgdk5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHQgKiBcdFx0Q29tcGFueUNvZGUgOiBcIjAwMDFcIixcblx0ICogXHRcdEN1c3RvbWVyIDogXCJDMDAwMVwiXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHQvL29yIGFzIHNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICpcdCBvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ3VzdG9tZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCJDMDAwMVwiKTtcblx0ICogXHR2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHQvL29yIGRpcmVjdGx5IGZyb20gU21hcnRGaWx0ZXJCYXJcblx0ICogXHR2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCk7XG5cdCAqXG5cdCAqIFx0Ly9hcHAgc3RhdGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuXHQgKlx0IHZhciBvSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdC8vIGNhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3JzXG5cdCAqIFx0dmFyIGZuT25FcnJvciA9IGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHR2YXIgb2kxOG4gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpMThuXCIpLmdldFJlc291cmNlQnVuZGxlKCk7XG5cdCAqIFx0XHRvRXJyb3Iuc2V0VUlUZXh0KHtvaTE4biA6IG9pMThuLCBzVGV4dEtleSA6IFwiT1VUQk9VTkRfTkFWX0VSUk9SXCJ9KTtcblx0ICogXHRcdG9FcnJvci5zaG93TWVzc2FnZUJveCgpO1xuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0b05hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbk5hbWUsIHZOYXZpZ2F0aW9uUGFyYW1ldGVycywgb0lubmVyQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdG5hdmlnYXRlKFxuXHRcdHNTZW1hbnRpY09iamVjdDogc3RyaW5nLFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzOiBvYmplY3QgfCBzdHJpbmcsXG5cdFx0b0lubmVyQXBwRGF0YT86IElubmVyQXBwRGF0YSxcblx0XHRmbk9uRXJyb3I/OiBGdW5jdGlvbixcblx0XHRvRXh0ZXJuYWxBcHBEYXRhPzoge1xuXHRcdFx0dmFsdWVUZXh0cz86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0c05hdk1vZGU/OiBzdHJpbmdcblx0KSB7XG5cdFx0bGV0IHNTZWxlY3Rpb25WYXJpYW50OiBhbnksXG5cdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdG9YQXBwRGF0YU9iajogYW55LFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLFxuXHRcdFx0YkV4UGxhY2UgPSBmYWxzZSxcblx0XHRcdG9UbXBEYXRhOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvTmF2SGFuZGxlcjogTmF2aWdhdGlvbkhhbmRsZXIgPSB0aGlzO1xuXG5cdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSB0aGlzLm9Db21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIHNvbWUgcmFjZSBjb25kaXRpb25zIHdoZXJlIHRoZSBvQ29tcG9uZW50RGF0YSBtYXkgbm90IGJlIHNldCwgZm9yIGV4YW1wbGUgaW4gY2FzZSB0aGUgVVNoZWxsIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuIFRvXG5cdFx0ICogbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IGR1bXAgaGVyZSB3aXRoIGFuIGV4Y2VwdGlvbiwgd2UgdGFrZSB0aGlzIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3I6XG5cdFx0ICovXG5cdFx0aWYgKG9Db21wb25lbnREYXRhKSB7XG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycztcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl0gJiZcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl0ubGVuZ3RoID4gMFxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIGJFeFBsYWNlID0gKEpTT04ucGFyc2Uob1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl1bMF0pID09PSBcImV4cGxhY2VcIik7XG5cdFx0XHRcdGJFeFBsYWNlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl1bMF0gPT09IFwiZXhwbGFjZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIG9ubHkgbmF2LW1vZGUgJ2lucGxhY2UnIG9yICdleHBsYWNlJyBhcmUgc3VwcG9ydGVkLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBsZWFkIHRvIGFuIGV4Y2VwdGlvbi5cblx0XHRpZiAoc05hdk1vZGUgJiYgKHNOYXZNb2RlID09PSBcImlucGxhY2VcIiB8fCBzTmF2TW9kZSA9PT0gXCJleHBsYWNlXCIpKSB7XG5cdFx0XHRiRXhQbGFjZSA9IHNOYXZNb2RlID09PSBcImV4cGxhY2VcIjtcblx0XHR9IGVsc2UgaWYgKHNOYXZNb2RlKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX05BVl9NT0RFXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvRXh0ZXJuYWxBcHBEYXRhID09PSB1bmRlZmluZWQgfHwgb0V4dGVybmFsQXBwRGF0YSA9PT0gbnVsbCkge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0ge307XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9FeHRlcm5hbEFwcERhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gZm9yIG5hdmlnYXRpb24gd2UgbmVlZCBVUkwgcGFyYW1ldGVycyAobGVnYWN5IG5hdmlnYXRpb24pIGFuZCBzYXAteGFwcC1zdGF0ZSwgdGhlcmVmb3JlIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBtaXNzaW5nIG9uZSBmcm9tIHRoZVxuXHRcdC8vIHBhc3NlZCBvbmVcblx0XHRpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSB2TmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRjb25zdCBvRW5yaWNoZWRTZWxWYXIgPSB0aGlzLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0bmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRbXVxuXHRcdFx0KS5vTmF2aWdhdGlvblNlbFZhcjtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gb0VucmljaGVkU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0aWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSB0aGlzLl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH1cblx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCAmJiBvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpO1xuXHRcdG9UbXBEYXRhID0gdGhpcy5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1RtcERhdGEpOyAvLyByZW1vdmUgZXZlbnR1YWwgbWVhc3VyZXNcblx0XHRvVG1wRGF0YSA9IHRoaXMuX2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvVG1wRGF0YSk7IC8vIHJlbW92ZSBldmVudHVhbCBzZW5zaXRpdmUgZGF0YVxuXG5cdFx0aWYgKG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0gdGhpcy5fZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpKTtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkudG9KU09OU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge307XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb05hdkFyZ3VtZW50czogYW55ID0ge1xuXHRcdFx0dGFyZ2V0OiB7XG5cdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdGFjdGlvbjogc0FjdGlvbk5hbWVcblx0XHRcdH0sXG5cdFx0XHRwYXJhbXM6IG1QYXJhbWV0ZXJzIHx8IHt9XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuTmF2aWdhdGUgPSBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRpZiAoIW9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50ID0gc1NlbGVjdGlvblZhcmlhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZuTmF2RXhwbGFjZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgc05ld0hyZWZQcm9taXNlID0gb0Nyb3NzQXBwTmF2U2VydmljZS5ocmVmRm9yRXh0ZXJuYWxBc3luYyhvTmF2QXJndW1lbnRzLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0c05ld0hyZWZQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNOZXdIcmVmOiBhbnkpIHtcblx0XHRcdFx0XHRcdG9wZW5XaW5kb3coc05ld0hyZWYpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0aXJldmluZyBocmVmRm9yRXh0ZXJuYWwgOiBcIiArIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRvWEFwcERhdGFPYmogPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1hBcHBEYXRhT2JqKTtcblx0XHRcdHJldHVybiBvTmF2SGFuZGxlci5fZm5TYXZlQXBwU3RhdGVBc3luYyhvWEFwcERhdGFPYmosIGZuT25FcnJvcikudGhlbihmdW5jdGlvbiAob1NhdmVBcHBTdGF0ZVJldHVybjogYW55KSB7XG5cdFx0XHRcdGlmIChvU2F2ZUFwcFN0YXRlUmV0dXJuKSB7XG5cdFx0XHRcdFx0b05hdkFyZ3VtZW50cy5hcHBTdGF0ZUtleSA9IG9TYXZlQXBwU3RhdGVSZXR1cm4uYXBwU3RhdGVLZXk7XG5cblx0XHRcdFx0XHQvLyBSZW1hcms6XG5cdFx0XHRcdFx0Ly8gVGhlIENyb3NzIEFwcCBTZXJ2aWNlIHRha2VzIGNhcmUgb2YgZW5jb2RpbmcgcGFyYW1ldGVyIGtleXMgYW5kIHZhbHVlcy4gRXhhbXBsZTpcblx0XHRcdFx0XHQvLyBtUGFyYW1zID0geyBcIiRAJVwiIDogXCImLz1cIiB9IHJlc3VsdHMgaW4gdGhlIFVSTCBwYXJhbWV0ZXIgJTI1MjQlMjU0MCUyNTI1PSUyNTI2JTI1MkYlMjUzRFxuXHRcdFx0XHRcdC8vIE5vdGUgdGhlIGRvdWJsZSBlbmNvZGluZywgdGhpcyBpcyBjb3JyZWN0LlxuXG5cdFx0XHRcdFx0Ly8gdG9FeHRlcm5hbCBzZXRzIHNhcC14YXBwLXN0YXRlIGluIHRoZSBVUkwgaWYgYXBwU3RhdGVLZXkgaXMgcHJvdmlkZWQgaW4gb05hdkFyZ3VtZW50c1xuXHRcdFx0XHRcdC8vIHRvRXh0ZXJuYWwgaGFzIGlzc3VlcyBvbiBzdGlja3kgYXBwcyBGSU9SSVRFQ0hQMS0xNDQwMCwgdGVtcCBmaXggdXNpbmcgaHJlZkZvckV4dGVybmFsXG5cdFx0XHRcdFx0aWYgKHNOYXZNb2RlID09IFwiZXhwbGFjZVwiKSB7XG5cdFx0XHRcdFx0XHRmbk5hdkV4cGxhY2UoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHRvRXh0ID0gb0Nyb3NzQXBwTmF2U2VydmljZS50b0V4dGVybmFsKG9OYXZBcmd1bWVudHMsIG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0XHRcdFx0Ly8gVE9ETzogVGhpcyBpcyBqdXN0IGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGFsbG93IEZFIFYyIHRvIHVzZSB0b0V4dGVybmFsIHByb21pc2UuXG5cdFx0XHRcdFx0XHRpZiAob05hdkhhbmRsZXIuX25hdmlnYXRlQ2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdFx0b05hdkhhbmRsZXIuX25hdmlnYXRlQ2FsbGJhY2socHRvRXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gLy8gZWxzZSA6IGVycm9yIHdhcyBhbHJlYWR5IHJlcG9ydGVkXG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuU3RvcmVBbmROYXZpZ2F0ZSA9IGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdG9OYXZIYW5kbGVyXG5cdFx0XHRcdC5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhvSW5uZXJBcHBEYXRhIGFzIGFueSwgdHJ1ZSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKHNBcHBTdGF0ZUtleSkge1xuXHRcdFx0XHRcdFx0b05hdkhhbmRsZXIucmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZuTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cdFx0aWYgKHNOYXZNb2RlKSB7XG5cdFx0XHRvTmF2QXJndW1lbnRzLnBhcmFtc1tcInNhcC11c2hlbGwtbmF2bW9kZVwiXSA9IGJFeFBsYWNlID8gXCJleHBsYWNlXCIgOiBcImlucGxhY2VcIjtcblx0XHR9XG5cdFx0b05hdkhhbmRsZXJcblx0XHRcdC5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9TdXBwb3J0ZWRQcm9taXNlID0gb0Nyb3NzQXBwTmF2U2VydmljZS5pc05hdmlnYXRpb25TdXBwb3J0ZWQoW29OYXZBcmd1bWVudHNdLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0b1N1cHBvcnRlZFByb21pc2UuZG9uZShmdW5jdGlvbiAob1RhcmdldHM6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0c1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGlmICghYkV4UGxhY2UpIHtcblx0XHRcdFx0XHRcdFx0Zm5TdG9yZUFuZE5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Zm5OYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gaW50ZW50IGlzIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmlzSW50ZW50U3VwcG9ydGVkLm5vdFN1cHBvcnRlZFwiKTtcblx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdG9TdXBwb3J0ZWRQcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Ly8gdGVjaG5pY2FsIGVycm9yOiBjb3VsZCBub3QgZGV0ZXJtaW5lIGlmIGludGVudCBpcyBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmlzSW50ZW50U3VwcG9ydGVkLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgaW5jb21pbmcgVVJMIGFuZCByZXR1cm5zIGEgUHJvbWlzZS4gSWYgdGhpcyBtZXRob2QgZGV0ZWN0cyBhIGJhY2sgbmF2aWdhdGlvbiwgdGhlIGlubmVyIGFwcCBzdGF0ZSBpcyByZXR1cm5lZCBpbiB0aGUgcmVzb2x2ZWRcblx0ICogUHJvbWlzZS4gT3RoZXJ3aXNlIHN0YXJ0dXAgcGFyYW1ldGVycyB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBhcHAgc3RhdGUgcHJvdmlkZWQgYnkgY3Jvc3MgYXBwIG5hdmlnYXRpb24sIGFuZCBhIGNvbWJpbmVkIGFwcCBzdGF0ZSB3aWxsIGJlXG5cdCAqIHJldHVybmVkLiBUaGUgY29uZmxpY3QgcmVzb2x1dGlvbiBjYW4gYmUgaW5mbHVlbmNlZCB3aXRoIHNQYXJhbUhhbmRsaW5nTW9kZSBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3Rvci5cblx0ICpcblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQuIElmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGV4dHJhY3RlZCBhcHAgc3RhdGUsIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMsIGFuZCB0aGUgdHlwZSBvZiBuYXZpZ2F0aW9uIGFyZSByZXR1cm5lZCwgc2VlIGFsc28gdGhlIGV4YW1wbGUgYWJvdmUuIFRoZSBhcHAgc3RhdGUgaXNcblx0ICogICAgICAgICAgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjpcblx0ICogICAgICAgICAgPHVsPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH1cblx0ICogICAgICAgICAgY29udGFpbmluZyBvbmx5IHBhcmFtZXRlcnMvc2VsZWN0IG9wdGlvbnMgdGhhdCBhcmUgcmVsYXRlZCB0byBuYXZpZ2F0aW9uPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBUaGUgbmF2aWdhdGlvbi1yZWxhdGVkIHNlbGVjdGlvbiB2YXJpYW50IGFzIGEgSlNPTi1mb3JtYXR0ZWQgc3RyaW5nPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50PC9jb2RlPjogQW4gaW5zdGFuY2Ugb2Zcblx0ICogICAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9IGNvbnRhaW5pbmcgb25seSB0aGUgcGFyYW1ldGVycy9zZWxlY3Qgb3B0aW9ucyB0aGF0IGFyZSBzZXQgYnkgdXNlclxuXHQgKiAgICAgICAgICBkZWZhdWx0IGRhdGE8L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTwvY29kZT46IEEgQm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgb25seSBkZWZhdWx0ZWQgcGFyYW1ldGVycyBhbmQgbm9cblx0ICogICAgICAgICAgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50Ljxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIG5vIG5hdmlnYXRpb24gcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLCA8Y29kZT5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sXG5cdCAqICAgICAgICAgIGV2ZW4gdGhvdWdoIHBhcmFtZXRlcnMgd2l0aG91dCBkZWZhdWx0IG1pZ2h0IGJlIGF2YWlsYWJsZSBhcyB3ZWxsLjwvbGk+XG5cdCAqICAgICAgICAgIDwvdWw+XG5cdCAqICAgICAgICAgIElmIHRoZSBuYXZpZ2F0aW9uLXJlbGF0ZWQgc2VsZWN0aW9uIHZhcmlhbnQgaXMgZW1wdHksIGl0IGlzIHJlcGxhY2VkIGJ5IGEgY29weSBvZiB0aGUgZGVmYXVsdGVkIHNlbGVjdGlvbiB2YXJpYW50Ljxicj5cblx0ICogICAgICAgICAgVGhlIG5hdmlnYXRpb24gdHlwZSBpcyBhbiBlbnVtZXJhdGlvbiB0eXBlIG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGV9IChwb3NzaWJsZSB2YWx1ZXMgYXJlXG5cdCAqICAgICAgICAgIGluaXRpYWwsIFVSTFBhcmFtcywgeEFwcFN0YXRlLCBhbmQgaUFwcFN0YXRlKS48YnI+XG5cdCAqICAgICAgICAgIDxiPk5vdGU6PC9iPiBJZiB0aGUgbmF2aWdhdGlvbiB0eXBlIGlzIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlLmlBcHBTdGF0ZX0gb0FwcERhdGEgaGFzIHR3b1xuXHQgKiAgICAgICAgICBhZGRpdGlvbmFsIHByb3BlcnRpZXNcblx0ICogICAgICAgICAgPHVsPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEudGFibGVWYXJpYW50SWQ8L2NvZGU+PC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLmN1c3RvbURhdGE8L2NvZGU+PC9saT5cblx0ICogICAgICAgICAgPC91bD5cblx0ICogICAgICAgICAgd2hpY2ggcmV0dXJuIHRoZSBpbm5lciBhcHAgZGF0YSBhcyBzdG9yZWQgaW4ge0BsaW5rICMubmF2aWdhdGUgbmF2aWdhdGV9IG9yIHtAbGluayAjLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jIHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfS5cblx0ICogICAgICAgICAgPGNvZGU+b0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+IGlzIGFuIGVtcHR5IHNlbGVjdGlvbiB2YXJpYW50IGFuZFxuXHQgKiAgICAgICAgICA8Y29kZT5vQXBwRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4gaW4gdGhpcyBjYXNlLjxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIHRoZSBuYXZpZ2F0aW9uIHR5cGUgaXMge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGUuaW5pdGlhbH0gb0FwcERhdGEgaXMgYW4gZW1wdHkgb2JqZWN0ITxicj5cblx0ICogICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9LCBVUkwgcGFyYW1ldGVycyAoaWYgYXZhaWxhYmxlKVxuXHQgKiAgICAgICAgICBhbmQgdGhlIHR5cGUgb2YgbmF2aWdhdGlvbiBhcmUgcmV0dXJuZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBvUGFyc2VOYXZpZ2F0aW9uUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5wYXJzZU5hdmlnYXRpb24oKTtcblx0ICpcblx0ICogXHRvUGFyc2VOYXZpZ2F0aW9uUHJvbWlzZS5kb25lKGZ1bmN0aW9uKG9BcHBEYXRhLCBvU3RhcnR1cFBhcmFtZXRlcnMsIHNOYXZUeXBlKXtcblx0ICogXHRcdFx0b1NtYXJ0RmlsdGVyQmFyLnNldERhdGFTdWl0ZUZvcm1hdChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0ICogXHRcdFx0Ly8gb0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgY2FuIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgc2VsZWN0aW9uIHZhcmlhbnRcblx0ICogXHRcdFx0Ly8gb0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgY29udGFpbnMgdGhlIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHNldCBieSB1c2VyIGRlZmF1bHRzXG5cdCAqIFx0XHRcdC8vIG9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgaW5kaWNhdGVzIHdoZXRoZXIgb25seSBkZWZhdWx0ZWQgcGFyYW1ldGVycyBhbmQgbm8gbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50XG5cdCAqIFx0fSk7XG5cdCAqIFx0b1BhcnNlTmF2aWdhdGlvblByb21pc2UuZmFpbChmdW5jdGlvbihvRXJyb3IsIG9VUkxQYXJhbWV0ZXJzLCBzTmF2VHlwZSl7XG5cdCAqIFx0XHQvLyBpZiBlLmcuIHRoZSB4YXBwIHN0YXRlIGNvdWxkIG5vdCBiZSBsb2FkZWQsIG5ldmVydGhlbGVzcyB0aGVyZSBtYXkgYmUgVVJMIHBhcmFtZXRlcnMgYXZhaWxhYmxlXG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHBhcnNlTmF2aWdhdGlvbigpOiBvYmplY3Qge1xuXHRcdGNvbnN0IHNBcHBIYXNoID0gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdFx0Lypcblx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGwgaXNcblx0XHQgKiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc0lBcHBTdGF0ZSA9IHRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpO1xuXG5cdFx0bGV0IG9Db21wb25lbnREYXRhID0gdGhpcy5vQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHQvKlxuXHRcdCAqIFRoZXJlIGFyZSBzb21lIHJhY2UgY29uZGl0aW9ucyB3aGVyZSB0aGUgb0NvbXBvbmVudERhdGEgbWF5IG5vdCBiZSBzZXQsIGZvciBleGFtcGxlIGluIGNhc2UgdGhlIFVTaGVsbCB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiBUb1xuXHRcdCAqIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBkdW1wIGhlcmUgd2l0aCBhbiBleGNlcHRpb24sIHdlIHRha2UgdGhpcyBzcGVjaWFsIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yOlxuXHRcdCAqL1xuXHRcdGlmIChvQ29tcG9uZW50RGF0YSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRMb2cud2FybmluZyhcIlRoZSBuYXZpZ2F0aW9uIENvbXBvbmVudCdzIGRhdGEgd2FzIG5vdCBzZXQgcHJvcGVybHk7IGFzc3VtaW5nIGluc3RlYWQgdGhhdCBubyBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC5cIik7XG5cdFx0XHRvQ29tcG9uZW50RGF0YSA9IHt9O1xuXHRcdH1cblxuXHRcdC8vIFJlbWFyazpcblx0XHQvLyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzIGFyZSBhbHJlYWR5IGRlY29kZWQuIEV4YW1wbGU6XG5cdFx0Ly8gVGhlIG9yaWdpbmFsIFVSTCBwYXJhbWV0ZXIgJTI1MjQlMjU0MCUyNTI1PSUyNTI2JTI1MkYlMjUzRCByZXN1bHRzIGluIG9TdGFydHVwUGFyYW1ldGVycyA9IHsgXCIkQCVcIiA6IFwiJi89XCIgfVxuXHRcdC8vIE5vdGUgdGhlIGRvdWJsZSBlbmNvZGluZyBpbiB0aGUgVVJMLCB0aGlzIGlzIGNvcnJlY3QuIEFuIFVSTCBwYXJhbWV0ZXIgbGlrZSB4eXo9JTI1IGNhdXNlcyBhbiBcIlVSSSBtYWxmb3JtZWRcIiBlcnJvci5cblx0XHQvLyBJZiB0aGUgZGVjb2RlZCB2YWx1ZSBzaG91bGQgYmUgZS5nLiBcIiUyNVwiLCB0aGUgcGFyYW1ldGVyIGluIHRoZSBVUkwgbmVlZHMgdG8gYmU6IHh5ej0lMjUyNTI1XG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzID0gb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnM7XG5cdFx0Y29uc3QgaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvU3RhcnR1cFBhcmFtZXRlcnM/LltIWUJSSURfSUFQUF9TVEFURV9LRVldPy5bMF07XG5cdFx0Y29uc3QgaHlicmlkRGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblx0XHRsZXQgaUFwcFN0YXRlSHlicmlkRGVmZXJyZWQ6IGpRdWVyeS5EZWZlcnJlZCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkID0gdGhpcy5fbG9hZEFwcFN0YXRlKGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtcywgaHlicmlkRGVmZXJyZWQsIE5hdlR5cGUuaHlicmlkKTtcblx0XHR9XG5cblx0XHRsZXQgYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFueSA9IFtdO1xuXHRcdGlmIChcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWV0ubGVuZ3RoID4gMFxuXHRcdCkge1xuXHRcdFx0YURlZmF1bHRlZFBhcmFtZXRlcnMgPSBKU09OLnBhcnNlKG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXVswXSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBwYXJzZVVybFBhcmFtcyA9IGZ1bmN0aW9uIChvU3ViU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgYVN1YkRlZmF1bHRlZFBhcmFtZXRlcnM6IGFueSwgb1N1Yk15RGVmZXJyZWQ6IGFueSwgc05hdlR5cGU6IGFueSkge1xuXHRcdFx0Ly8gc3RhbmRhcmQgVVJMIG5hdmlnYXRpb25cblx0XHRcdGNvbnN0IG9TZWxWYXJzID0gb05hdkhhbmRsZXIuX3NwbGl0SW5ib3VuZE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdFx0XHRuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRvU3ViU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRcdGFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzXG5cdFx0XHQpO1xuXHRcdFx0Ly8gRm9yIHNjZW5hcmlvLCB3aGVyZSBvbmx5IGh5YnJpZElBcHBTdGF0ZUtleSBpcyBwYXJ0IG9mIHVybFBhcmFtcywgd2UgaWdub3JlIHRoaXMgY29uZGl0aW9uXG5cdFx0XHRpZiAob1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXIuaXNFbXB0eSgpICYmIG9TZWxWYXJzLm9EZWZhdWx0ZWRTZWxWYXIuaXNFbXB0eSgpICYmIHNOYXZUeXBlICE9PSBOYXZUeXBlLmh5YnJpZCkge1xuXHRcdFx0XHQvLyBTdGFydHVwIHBhcmFtZXRlcnMgY29udGFpbiBvbmx5IHRlY2huaWNhbCBwYXJhbWV0ZXJzIChTQVAgc3lzdGVtKSB3aGljaCB3ZXJlIGZpbHRlcmVkIG91dC5cblx0XHRcdFx0Ly8gb05hdmlnYXRpb25TZWxWYXIgYW5kIG9EZWZhdWx0ZWRTZWxWYXIgYXJlIGVtcHR5LlxuXHRcdFx0XHQvLyBUaHVzLCBjb25zaWRlciB0aGlzIHR5cGUgb2YgbmF2aWdhdGlvbiBhcyBhbiBpbml0aWFsIG5hdmlnYXRpb24uXG5cdFx0XHRcdGlmIChzTmF2VHlwZSA9PT0gTmF2VHlwZS54QXBwU3RhdGUpIHtcblx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCBvU3ViU3RhcnR1cFBhcmFtZXRlcnMgfHwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZXNvbHZlKHt9LCBvU3ViU3RhcnR1cFBhcmFtZXRlcnMsIE5hdlR5cGUuaW5pdGlhbCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBTdGF0ZURhdGE6IGFueSA9IHt9O1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhcjtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gb1NlbFZhcnMuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTtcblxuXHRcdFx0XHQvLyBubyBzYXAteGFwcC1zdGF0ZSBidXQgbmF2VHlwZSBpcyBoeWJyaWQsIGV4dHJhY3QgdGhlIElBcHBTdGF0ZURhdGFcblx0XHRcdFx0aWYgKHNOYXZUeXBlID09PSBOYXZUeXBlLmh5YnJpZCkge1xuXHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUgPSBmdW5jdGlvbiAoaUFwcFN0YXRlRGF0YTogb2JqZWN0LCBfcmVmOiBvYmplY3QsIG5hdlR5cGU6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5pQXBwU3RhdGUgPSBpQXBwU3RhdGVEYXRhO1xuXHRcdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVzb2x2ZShvQXBwU3RhdGVEYXRhLCBvU3RhcnR1cFBhcmFtZXRlcnMsIG5hdlR5cGUpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3QgZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChvRXJyb3I6IG9iamVjdCwgX3JlZjogb2JqZWN0LCBuYXZUeXBlOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlamVjdChvRXJyb3IsIF9yZWYsIG5hdlR5cGUpO1xuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAoaUFwcFN0YXRlSHlicmlkRGVmZXJyZWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZG9uZShzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkLmZhaWwoZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N1YlN0YXJ0dXBQYXJhbWV0ZXJzLCBzTmF2VHlwZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChzSUFwcFN0YXRlKSB7XG5cdFx0XHQvLyBpbm5lciBhcHAgc3RhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBBcHBIYXNoIChiYWNrIG5hdmlnYXRpb24pOyBleHRyYWN0IHRoZSBwYXJhbWV0ZXIgdmFsdWVcblx0XHRcdHRoaXMuX2xvYWRBcHBTdGF0ZShzSUFwcFN0YXRlLCBvTXlEZWZlcnJlZCwgTmF2VHlwZS5pQXBwU3RhdGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBubyBiYWNrIG5hdmlnYXRpb25cblx0XHRcdGNvbnN0IGJJc1hhcHBTdGF0ZU5hdmlnYXRpb24gPSBvQ29tcG9uZW50RGF0YVtcInNhcC14YXBwLXN0YXRlXCJdICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoYklzWGFwcFN0YXRlTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCB0aGF0ID0gdGhpcztcblx0XHRcdFx0Ly8gaW5uZXIgYXBwIHN0YXRlIHdhcyBub3QgZm91bmQgaW4gdGhlIEFwcEhhc2gsIGJ1dCB4YXBwIHN0YXRlID0+IHRyeSB0byByZWFkIHRoZSB4YXBwIHN0YXRlXG5cdFx0XHRcdHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdGFydHVwUHJvbWlzZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0U3RhcnR1cEFwcFN0YXRlKHRoYXQub0NvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHRvU3RhcnR1cFByb21pc2UuZG9uZShmdW5jdGlvbiAob0FwcFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0IGFwcCBzdGF0ZSBmcm9tIHNhcC14YXBwLXN0YXRlLFxuXHRcdFx0XHRcdFx0XHQvLyBjcmVhdGUgYSBjb3B5LCBub3Qgb25seSBhIHJlZmVyZW5jZSwgYmVjYXVzZSB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgb2JqZWN0XG5cdFx0XHRcdFx0XHRcdGxldCBvQXBwU3RhdGVEYXRhID0gb0FwcFN0YXRlLmdldERhdGEoKTtcblx0XHRcdFx0XHRcdFx0bGV0IG9FcnJvcjtcblx0XHRcdFx0XHRcdFx0aWYgKG9BcHBTdGF0ZURhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0FwcFN0YXRlRGF0YSkpO1xuXHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLkFwcFN0YXRlRGF0YS5wYXJzZUVycm9yXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvQXBwU3RhdGVEYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1NlbFZhciA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9BcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFycyA9IG9OYXZIYW5kbGVyLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0XHRcdFx0XHRcdG9TZWxWYXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IG9TZWxWYXJzLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLmlBcHBTdGF0ZSA9IGlBcHBTdGF0ZURhdGE7XG5cdFx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgbmF2VHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKGVycm9yOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldEFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChlcnJvciwgX3JlZiwgbmF2VHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zICE9PSB1bmRlZmluZWQgJiYgaUFwcFN0YXRlSHlicmlkRGVmZXJyZWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZG9uZShzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkLmZhaWwoZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvQXBwU3RhdGVEYXRhW0hZQlJJRF9JQVBQX1NUQVRFX0tFWV0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoYXQuX2xvYWRBcHBTdGF0ZShvQXBwU3RhdGVEYXRhW0hZQlJJRF9JQVBQX1NUQVRFX0tFWV0sIGh5YnJpZERlZmVycmVkLCBOYXZUeXBlLmh5YnJpZCkuZG9uZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShvQXBwU3RhdGVEYXRhLCBvU3RhcnR1cFBhcmFtZXRlcnMsIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGFyc2VVcmxQYXJhbXMob1N0YXJ0dXBQYXJhbWV0ZXJzLCBhRGVmYXVsdGVkUGFyYW1ldGVycywgb015RGVmZXJyZWQsIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBzYXAteGFwcC1zdGF0ZSBuYXZpZ2F0aW9uLCBidXQgSUQgaGFzIGFscmVhZHkgZXhwaXJlZCwgYnV0IFVSTCBwYXJhbWV0ZXJzIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRcdG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIG9TdGFydHVwUGFyYW1ldGVycyB8fCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9TdGFydHVwUHJvbWlzZS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0U3RhcnR1cFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9TdGFydHVwUHJvbWlzZTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYy5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIGlmIChvU3RhcnR1cFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Ly8gbm8gc2FwLXhhcHAtc3RhdGVcblx0XHRcdFx0cGFyc2VVcmxQYXJhbXMoXG5cdFx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdG9NeURlZmVycmVkLFxuXHRcdFx0XHRcdGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtcyAhPT0gdW5kZWZpbmVkID8gTmF2VHlwZS5oeWJyaWQgOiBOYXZUeXBlLlVSTFBhcmFtc1xuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gaW5pdGlhbCBuYXZpZ2F0aW9uXG5cdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoe30sIHt9LCBOYXZUeXBlLmluaXRpYWwpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWMgdGVjaG5pY2FsIHBhcmFtZXRlcnMuIFRlY2huaWNhbCBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBwYXNzZWQgdG8gdGhlXG5cdCAqIGFwcGxpY2F0aW9uLiBBcyBhIGRlZmF1bHQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlcnM6XG5cdCAqIDx1bD5cblx0ICogPGxpPjxjb2RlPnNhcC1zeXN0ZW08L2NvZGU+PC9saT5cblx0ICogPGxpPjxjb2RlPnNhcC11c2hlbGwtZGVmYXVsdGVkUGFyYW1ldGVyTmFtZXM8L2NvZGU+PC9saT5cblx0ICogPGxpPjxjb2RlPlwiaGNwQXBwbGljYXRpb25JZFwiPC9jb2RlPjwvbGk+XG5cdCAqIDwvdWw+LlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqIEBmdW5jdGlvbiBzZXRUZWNobmljYWxQYXJhbWV0ZXJzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5wcm90b3R5cGVcblx0ICogQHBhcmFtIHtBcnJheX0gYVRlY2huaWNhbFBhcmFtZXRlcnMgTGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXMgdG8gYmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVycy4gPGNvZGU+bnVsbDwvY29kZT4gb3Jcblx0ICogICAgICAgIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gbWF5IGJlIHVzZWQgdG8gcmVzZXQgdGhlIGNvbXBsZXRlIGxpc3QuXG5cdCAqL1xuXHRzZXRUZWNobmljYWxQYXJhbWV0ZXJzKGFUZWNobmljYWxQYXJhbWV0ZXJzPzogYW55W10pIHtcblx0XHRpZiAoIWFUZWNobmljYWxQYXJhbWV0ZXJzKSB7XG5cdFx0XHRhVGVjaG5pY2FsUGFyYW1ldGVycyA9IFtdO1xuXHRcdH1cblxuXHRcdGlmICghQXJyYXkuaXNBcnJheShhVGVjaG5pY2FsUGFyYW1ldGVycykpIHtcblx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBwYXJhbWV0ZXIgaW5jb3JyZWN0LCBhcnJheSBvZiBzdHJpbmdzIGV4cGVjdGVkXCIpO1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHR0aGlzLl9hVGVjaG5pY2FsUGFyYW1hdGVycyA9IGFUZWNobmljYWxQYXJhbWV0ZXJzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljIHRlY2huaWNhbCBwYXJhbWV0ZXJzLiBUZWNobmljYWwgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgcGFzc2VkIHRvIHRoZVxuXHQgKiBhcHBsaWNhdGlvbi4gQXMgYSBkZWZhdWx0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXJzOlxuXHQgKiA8dWw+XG5cdCAqIDxsaT48Y29kZT5zYXAtc3lzdGVtPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5zYXAtdXNoZWxsLWRlZmF1bHRlZFBhcmFtZXRlck5hbWVzPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5cImhjcEFwcGxpY2F0aW9uSWRcIjwvY29kZT48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAZnVuY3Rpb24gZ2V0VGVjaG5pY2FsUGFyYW1ldGVyc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIucHJvdG90eXBlXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQ29udGFpbmluZyB0aGUgdGVjaG5pY2FsIHBhcmFtZXRlcnMuXG5cdCAqL1xuXHRnZXRUZWNobmljYWxQYXJhbWV0ZXJzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gdGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMuY29uY2F0KFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhcmFtZXRlck5hbWUgTmFtZSBvZiBhIHJlcXVlc3QgcGFyYW1ldGVyLCBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqIEByZXR1cm5zIEluZGljYXRlcyBpZiB0aGUgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlciBvciBub3QuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaXNUZWNobmljYWxQYXJhbWV0ZXIoc1BhcmFtZXRlck5hbWU6IHN0cmluZykge1xuXHRcdGlmIChzUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhKFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS12YXJpYW50LWlkXCIgfHxcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtdGFibGUtdmFyaWFudC1pZFwiIHx8XG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLWNoYXJ0LXZhcmlhbnQtaWRcIiB8fFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS1maWx0ZXJiYXItdmFyaWFudC1pZFwiXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRpZiAoc1BhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FwLVwiKSA9PT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2FUZWNobmljYWxQYXJhbWF0ZXJzLmluZGV4T2Yoc1BhcmFtZXRlck5hbWUpID49IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRfaXNGRVBhcmFtZXRlcihzUGFyYW1ldGVyTmFtZTogYW55KSB7XG5cdFx0cmV0dXJuIHNQYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInNhcC11aS1mZVwiKSA9PT0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSbW92ZXMgaWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1NlbGVjdGlvblZhcmlhbnQgU2VsZWN0aW9uIFZhcmlhbnQgd2hpY2ggY29uc2lzdHMgb2YgdGVjaG5pY2FsIFBhcmFtZXRlcnMuXG5cdCAqIEByZXR1cm5zIFNlbGVjdGlvbiBWYXJpYW50IHdpdGhvdXQgdGVjaG5pY2FsIFBhcmFtZXRlcnMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGxldCBzUHJvcE5hbWUsIGk7XG5cdFx0Y29uc3QgYVNlbFZhclByb3BOYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxWYXJQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNQcm9wTmFtZSA9IGFTZWxWYXJQcm9wTmFtZXNbaV07XG5cdFx0XHRpZiAodGhpcy5faXNUZWNobmljYWxQYXJhbWV0ZXIoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5yZW1vdmVTZWxlY3RPcHRpb24oc1Byb3BOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9TZWxlY3Rpb25WYXJpYW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIFNwbGl0cyB0aGUgcGFyYW1ldGVycyBwcm92aWRlZCBkdXJpbmcgaW5ib3VuZCBuYXZpZ2F0aW9uIGFuZCBzZXBhcmF0ZXMgdGhlIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gYmV0d2VlbiBkZWZhdWx0ZWQgcGFyYW1ldGVyIHZhbHVlcyBhbmRcblx0ICogbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1NlbGVjdGlvblZhcmlhbnQgSW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9IGNvbnRhaW5pbmcgbmF2aWdhdGlvbiBkYXRhIG9mXG5cdCAqICAgICAgICB0aGUgYXBwXG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgc3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHAgKGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50KVxuXHQgKiBAcGFyYW0gYURlZmF1bHRlZFBhcmFtZXRlcnMgQXJyYXkgY29udGFpbmluZyBkZWZhdWx0ZWQgcGFyYW1ldGVyIG5hbWVzXG5cdCAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHR3byBTZWxlY3Rpb25WYXJpYW50cywgb25lIGZvciBuYXZpZ2F0aW9uIChvTmF2aWdhdGlvblNlbFZhcikgYW5kIG9uZSBmb3IgZGVmYXVsdGVkIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHQgKiAgICAgICAgICAob0RlZmF1bHRlZFNlbFZhciksIGFuZCBhIGZsYWcgKGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkpIGluZGljYXRpbmcgd2hldGhlciBhbGwgcGFyYW1ldGVycyB3ZXJlIGRlZmF1bHRlZC4gVGhlIGZ1bmN0aW9uIGlzXG5cdCAqICAgICAgICAgIGhhbmRlZCB0d28gb2JqZWN0cyBjb250YWluaW5nIHBhcmFtZXRlcnMgKG5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyksIG9TZWxlY3Rpb25WYXJpYW50IGFuZCBvU3RhcnR1cFBhcmFtZXRlcnMuIEFcblx0ICogICAgICAgICAgcGFyYW1ldGVyIGNvdWxkIGJlIHN0b3JlZCBpbiBqdXN0IG9uZSBvZiB0aGVzZSB0d28gb2JqZWN0cyBvciBpbiBib3RoIG9mIHRoZW0gc2ltdWx0YW5lb3VzbHkuIEJlY2F1c2Ugb2YgdGhlIGxhdHRlciBjYXNlIGFcblx0ICogICAgICAgICAgcGFyYW1ldGVyIGNvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBjb25mbGljdGluZyB2YWx1ZXMgYW5kIGl0IGlzIHRoZSBqb2Igb2YgdGhpcyBmdW5jdGlvbiB0byByZXNvbHZlIGFueSBzdWNoIGNvbmZsaWN0LiBQYXJhbWV0ZXJzXG5cdCAqICAgICAgICAgIGFyZSBhc3NpZ25lZCB0byB0aGUgdHdvIHJldHVybmVkIFNlbGVjdGlvblZhcmlhbnRzLCBvTmF2aWdhdGlvblNlbFZhciBhbmQgb0RlZmF1bHRlZFNlbFZhciwgYXMgZm9sbG93czogfCBwYXJhbWV0ZXIgTk9UIGluIHxcblx0ICogICAgICAgICAgcGFyYW1ldGVyIGluIHwgb1NlbGVjdGlvblZhcmlhbnQgfCBvU2VsZWN0aW9uVmFyaWFudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tIHBhcmFtZXRlciBOT1QgaW4gfFxuXHQgKiAgICAgICAgICBub3RoaW5nIHRvIGRvIHwgQWRkIHBhcmFtZXRlciBvU3RhcnR1cFBhcmFtZXRlcnMgfCBoZXJlIHwgKHNlZSBiZWxvdykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgaW4gfCBBZGQgcGFyYW1ldGVyIHwgQ29uZmxpY3QgcmVzb2x1dGlvbiBvU3RhcnR1cFBhcmFtZXRlcnMgfCAoc2VlIGJlbG93KSB8IChzZWUgYmVsb3cpIEFkZCBwYXJhbWV0ZXI6IGlmIHBhcmFtZXRlciBpblxuXHQgKiAgICAgICAgICBhRGVmYXVsdGVkUGFyYW1ldGVyczogYWRkIHBhcmFtZXRlciB0byBvRGVmYXVsdGVkU2VsVmFyIGVsc2U6IGFkZCBwYXJhbWV0ZXIgdG8gb05hdmlnYXRpb25TZWxWYXIgQ29uZmxpY3QgcmVzb2x1dGlvbjogaWYgcGFyYW1ldGVyXG5cdCAqICAgICAgICAgIGluIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb20gb1NlbGVjdGlvblZhcmlhbnQgdG8gb05hdmlnYXRpb25TZWxWYXIgYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tXG5cdCAqICAgICAgICAgIG9TdGFydHVwUGFyYW1ldGVycyB0byBvRGVmYXVsdGVkU2VsVmFyIE5vdGU6IFRoaXMgY2FzZSBvbmx5IG9jY3VycyBpbiBVSTUgMS4zMi4gSW4gbGF0ZXIgdmVyc2lvbnMgVVNoZWxsIHN0b3JlcyBhbnkgZGVmYXVsdGVkXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBlaXRoZXIgaW4gb1NlbGVjdGlvblZhcmlhbnQgb3Igb1N0YXJ0dXBQYXJhbWV0ZXJzIGJ1dCBuZXZlciBzaW11bHRhbmVvdXNseSBpbiBib3RoLiBlbHNlOiBDaG9vc2UgMSBvZiB0aGUgZm9sbG93aW5nXG5cdCAqICAgICAgICAgIG9wdGlvbnMgYmFzZWQgb24gZ2l2ZW4gaGFuZGxpbmcgbW9kZSAodGhpcy5zUGFyYW1IYW5kbGluZ01vZGUpLiAtPiBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb20gb1N0YXJ0dXBQYXJhbWV0ZXJzIHRvXG5cdCAqICAgICAgICAgIG9OYXZpZ2F0aW9uU2VsVmFyIHwgLT4gYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG9BcHBTdGF0ZS5zZWxlY3Rpb25WYXJpYW50IHRvIG9OYXZpZ2F0aW9uU2VsVmFyIC0+IGFkZCBib3RoIHBhcmFtZXRlciB2YWx1ZXMgdG9cblx0ICogICAgICAgICAgbmF2aWdhdGlvblNlbFZhciBJZiBuYXZpZ2F0aW9uU2VsVmFyIGlzIHN0aWxsIGVtcHR5IGF0IHRoZSBlbmQgb2YgZXhlY3V0aW9uLCBuYXZpZ2F0aW9uU2VsVmFyIGlzIHJlcGxhY2VkIGJ5IGEgY29weSBvZlxuXHQgKiAgICAgICAgICBvRGVmYXVsdGVkU2VsVmFyIGFuZCB0aGUgZmxhZyBiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5IGlzIHNldCB0byB0cnVlLiBUaGUgc2VsZWN0aW9uIHZhcmlhbnQgb0RlZmF1bHRlZFNlbFZhciBpdHNlbGYgaXMgYWx3YXlzXG5cdCAqICAgICAgICAgIHJldHVybmVkIGFzIGlzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3NwbGl0SW5ib3VuZE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdG9TZWxlY3Rpb25WYXJpYW50OiBJbnN0YW5jZVR5cGU8dHlwZW9mIFNlbGVjdGlvblZhcmlhbnQ+LFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcblx0XHRhRGVmYXVsdGVkUGFyYW1ldGVyczogYW55W11cblx0KSB7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KGFEZWZhdWx0ZWRQYXJhbWV0ZXJzKSkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRsZXQgc1Byb3BOYW1lLCBpO1xuXHRcdC8vIEZpcnN0IHdlIGRvIHNvbWUgcGFyc2luZyBvZiB0aGUgU3RhcnRVcCBQYXJhbWV0ZXJzLlxuXHRcdGNvbnN0IG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG5cdFx0Zm9yIChzUHJvcE5hbWUgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoIW9TdGFydHVwUGFyYW1ldGVycy5oYXNPd25Qcm9wZXJ0eShzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZiAoc1Byb3BOYW1lID09PSBTQVBfU1lTVEVNX1BST1BFUlRZIHx8IHNQcm9wTmFtZSA9PT0gREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSkge1xuXHRcdFx0aWYgKHRoaXMuX2lzVGVjaG5pY2FsUGFyYW1ldGVyKHNQcm9wTmFtZSkgfHwgdGhpcy5faXNGRVBhcmFtZXRlcihzUHJvcE5hbWUpIHx8IHNQcm9wTmFtZSA9PT0gSFlCUklEX0lBUFBfU1RBVEVfS0VZKSB7XG5cdFx0XHRcdC8vIERvIG5vdCBhZGQgdGhlIFNBUCBzeXN0ZW0gcGFyYW1ldGVyIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhcyBpdCBpcyBhIHRlY2huaWNhbCBwYXJhbWV0ZXJcblx0XHRcdFx0Ly8gbm90IHJlbGV2YW50IGZvciB0aGUgc2VsZWN0aW9uIHZhcmlhbnQuXG5cdFx0XHRcdC8vIERvIG5vdCBhZGQgdGhlIHN0YXJ0dXAgcGFyYW1ldGVyIGZvciBkZWZhdWx0IHZhbHVlcyB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQuIFRoZSBpbmZvcm1hdGlvbiwgd2hpY2ggcGFyYW1ldGVyc1xuXHRcdFx0XHQvLyBhcmUgZGVmYXVsdGVkLCBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHRlZCBzZWxlY3Rpb24gdmFyaWFudC5cblx0XHRcdFx0Ly8gSW4gY2FzZSwgRkUgUGFyYW1ldGVycyB3ZSBzaGFsbCBza2lwIGl0Lih0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gZmV0Y2ggaXQgZnJvbSBVUkwgcGFyYW1zKVxuXHRcdFx0XHQvLyBTa2lwIHRoZSBoeWJyaWRJQXBwU3RhdGVLZXkgcHJlc2VudCBhcyBwYXJ0IG9mICdIeWJyaWQnIG5hdmlnYXRpb24gdHlwZSBub3QgcmVsZXZhbnQgZm9yIHRoZSBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2Ugc3VwcG9ydCBwYXJhbWV0ZXJzIGFzIGEgbWFwIHdpdGggc3RyaW5ncyBhbmQgYXMgYSBtYXAgd2l0aCB2YWx1ZSBhcnJheXNcblx0XHRcdGlmICh0eXBlb2Ygb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSA9IG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdKSAmJiBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSA9IG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdWzBdOyAvLyBzaW5nbGUtdmFsdWVkIHBhcmFtZXRlcnNcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXSkgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0ubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV07IC8vIG11bHRpLXZhbHVlZCBwYXJhbWV0ZXJzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVjdCB0d28gc2VsZWN0aW9uIHZhcmlhbnRzIGZvciBkZWZhdWx0cyBhbmQgbmF2aWdhdGlvbiB0byBiZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uXG5cdFx0Y29uc3Qgb0RlZmF1bHRlZFNlbFZhciA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25TZWxWYXIgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXG5cdFx0Y29uc3QgYVNlbFZhclByb3BOYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlck5hbWVzKCkuY29uY2F0KG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCkpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhU2VsVmFyUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzUHJvcE5hbWUgPSBhU2VsVmFyUHJvcE5hbWVzW2ldO1xuXHRcdFx0aWYgKHNQcm9wTmFtZSBpbiBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZCkge1xuXHRcdFx0XHQvLyBSZXNvbHZlIGNvbmZsaWN0LlxuXHRcdFx0XHRpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5kZXhPZihzUHJvcE5hbWUpID4gLTEpIHtcblx0XHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvRGVmYXVsdGVkU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN3aXRjaCAodGhpcy5zUGFyYW1IYW5kbGluZ01vZGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgUGFyYW1IYW5kbGluZ01vZGUuU2VsVmFyV2luczpcblx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLlVSTFBhcmFtV2luczpcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkUGFyYW1ldGVyVmFsdWVzKG9OYXZpZ2F0aW9uU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgUGFyYW1IYW5kbGluZ01vZGUuSW5zZXJ0SW5TZWxPcHQ6XG5cdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmRleE9mKHNQcm9wTmFtZSkgPiAtMSkge1xuXHRcdFx0XHQvLyBwYXJhbWV0ZXIgb25seSBpbiBTZWxWYXJcblx0XHRcdFx0b0RlZmF1bHRlZFNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKHNQcm9wTmFtZSBpbiBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZCkge1xuXHRcdFx0Ly8gVGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmFtZXRlciBhcHBlYXJzIHR3aWNlIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZiBhYm92ZSBzbyB3ZSBza2lwIGl0IGhlcmUuXG5cdFx0XHRpZiAoYVNlbFZhclByb3BOYW1lcy5pbmRleE9mKHNQcm9wTmFtZSkgPiAtMSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLmluZGV4T2Yoc1Byb3BOYW1lKSA+IC0xKSB7XG5cdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvRGVmYXVsdGVkU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fYWRkUGFyYW1ldGVyVmFsdWVzKG9OYXZpZ2F0aW9uU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHRoZSBzZWxlY3Rpb24gdmFyaWFudCB1c2VkIGZvciBuYXZpZ2F0aW9uIHNob3VsZCBiZSBmaWxsZWQgd2l0aCBkZWZhdWx0cyBpbiBjYXNlIHRoYXQgb25seSBkZWZhdWx0cyBleGlzdFxuXHRcdGxldCBiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gZmFsc2U7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uU2VsVmFyLmlzRW1wdHkoKSkge1xuXHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IHRydWU7XG5cdFx0XHRjb25zdCBhUHJvcE5hbWVzID0gb0RlZmF1bHRlZFNlbFZhci5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGFQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihhUHJvcE5hbWVzW2ldLCBvRGVmYXVsdGVkU2VsVmFyLmdldFZhbHVlKGFQcm9wTmFtZXNbaV0pISk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyOiBvTmF2aWdhdGlvblNlbFZhcixcblx0XHRcdG9EZWZhdWx0ZWRTZWxWYXI6IG9EZWZhdWx0ZWRTZWxWYXIsXG5cdFx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5XG5cdFx0fTtcblx0fVxuXG5cdF9hZGRQYXJhbWV0ZXJWYWx1ZXMob1NlbFZhcmlhbnQ6IGFueSwgc1Byb3BOYW1lOiBhbnksIHNTaWduOiBhbnksIHNPcHRpb246IGFueSwgb1ZhbHVlczogYW55KSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkob1ZhbHVlcykpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb1ZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBzU2lnbiwgc09wdGlvbiwgb1ZhbHVlc1tpXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9TZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIHNTaWduLCBzT3B0aW9uLCBvVmFsdWVzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzQXBwU3RhdGVLZXkuIEFzIGFuIHJlYWN0aW9uIHJvdXRlIGNoYW5nZSBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cblx0ICpcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgbmV3IGFwcCBzdGF0ZSBrZXkuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0hhc2hDaGFuZ2VyID0gdGhpcy5vUm91dGVyLm9IYXNoQ2hhbmdlciA/IHRoaXMub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGNvbnN0IHNBcHBIYXNoT2xkID0gb0hhc2hDaGFuZ2VyLmdldEhhc2goKTtcblx0XHQvKlxuXHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbCBpc1xuXHRcdCAqIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS5cblx0XHQgKi9cblx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IHRoaXMuX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoT2xkLCBzQXBwU3RhdGVLZXkpO1xuXHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBhcHAgc3RhdGUgYW5kIHN0b3JlcyB0aGUgYXBwIHN0YXRlIGZvciBsYXRlciByZXRyaWV2YWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBtSW5uZXJBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSBJZiBzZXQgdG8gZmFsc2UsIHRoZSBpbm5lciBhcHAgaGFzaCB3aWxsIG5vdCBiZSByZXBsYWNlZCB1bnRpbCBzdG9yaW5nIGlzIHN1Y2Nlc3NmdWw7IGRvIG5vdFxuXHQgKiAgICAgICAgc2V0IHRvIGZhbHNlIGlmIHlvdSBjYW5ub3QgcmVhY3QgdG8gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UsIGZvciBleGFtcGxlLCB3aGVuIGNhbGxpbmcgdGhlIGJlZm9yZUxpbmtQcmVzc2VkIGV2ZW50XG5cdCAqIEBwYXJhbSBiU2tpcEhhc2hSZXBsYWNlIElmIHNldCB0byB0cnVlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgaW4gdGhlIHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jLiBBbHNvIHRoZSBiSW1tZWRpYXRlSGFzaFJlcGxhY2Vcblx0ICogXHRcdCAgd2lsbCBiZSBpZ25vcmVkLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgYXBwIHN0YXRlIGtleSBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzXG5cdCAqICAgICAgICAgIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhtSW5uZXJBcHBEYXRhKTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uKHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHQvL3lvdXIgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIG5vdywgc0FwcFN0YXRlS2V5IHdhcyBhZGRlZCB0byBVUkxcblx0ICogXHRcdC8vcGVyZm9ybSBhY3Rpb25zIHRoYXQgbXVzdCBydW4gYWZ0ZXIgc2F2ZVxuXHQgKiBcdH0pO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlQXN5bmMoXG5cdFx0bUlubmVyQXBwRGF0YTogSW5uZXJBcHBEYXRhLFxuXHRcdGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4sXG5cdFx0YlNraXBIYXNoUmVwbGFjZT86IGJvb2xlYW5cblx0KTogalF1ZXJ5LlByb21pc2U8c3RyaW5nPiB7XG5cdFx0aWYgKHR5cGVvZiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgIT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2UgPSB0cnVlOyAvLyBkZWZhdWx0XG5cdFx0fVxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Y29uc3QgZm5SZXBsYWNlSGFzaCA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0hhc2hDaGFuZ2VyID0gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgPyBvTmF2SGFuZGxlci5vUm91dGVyLm9IYXNoQ2hhbmdlciA6IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0XHQvKlxuXHRcdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsXG5cdFx0XHQgKiBpcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNBcHBIYXNoTmV3ID0gb05hdkhhbmRsZXIuX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoT2xkLCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0b0hhc2hDaGFuZ2VyLnJlcGxhY2VIYXNoKHNBcHBIYXNoTmV3KTtcblx0XHR9O1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEgYXMgb2JqZWN0KSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShcIlwiKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gY2hlY2sgaWYgd2UgYWxyZWFkeSBzYXZlZCB0aGUgc2FtZSBkYXRhXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5Q2FjaGVkID0gdGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXk7XG5cblx0XHRjb25zdCBiSW5uZXJBcHBEYXRhRXF1YWwgPSBKU09OLnN0cmluZ2lmeShtSW5uZXJBcHBEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSk7XG5cdFx0aWYgKGJJbm5lckFwcERhdGFFcXVhbCAmJiBzQXBwU3RhdGVLZXlDYWNoZWQpIHtcblx0XHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgZm91bmQgaW4gY2FjaGVcblx0XHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlSGl0Kys7XG5cblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBjYWNoZWQgYXBwU3RhdGVLZXkgaW4gdXJsIChqdXN0IGluIGNhc2UgdGhlIGFwcCBoYXMgY2hhbmdlZCB0aGUgaGFzaCBpbiBtZWFudGltZSlcblx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJTa2lwSGFzaFJlcGxhY2UgJiYgIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHR9O1xuXG5cdFx0dGhpcy5fc2F2ZUFwcFN0YXRlQXN5bmMobUlubmVyQXBwRGF0YSwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHRcdC8qIE5vdGUgdGhhdCBfc2FwQXBwU3RhdGUgbWF5IHJldHVybiAndW5kZWZpbmVkJyBpbiBjYXNlIHRoYXQgdGhlIHBhcnNpbmcgaGFzIGZhaWxlZC4gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgbm90IHRyaWdnZXIgdGhlIHJlcGxhY2VtZW50XG5cdFx0XHRcdCAqIG9mIHRoZSBBcHAgSGFzaCB3aXRoIHRoZSBnZW5lcmF0ZWQga2V5LCBhcyB0aGUgY29udGFpbmVyIHdhcyBub3Qgd3JpdHRlbiBiZWZvcmUuIE5vdGUgYXMgd2VsbCB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBoYXMgYWxyZWFkeVxuXHRcdFx0XHQgKiBoYXBwZW5lZCBiZWZvcmUgYnkgbWFraW5nIHRoZSBvTXlEZWZlcnJlZCBwcm9taXNlIGZhaWwgKHNlZSBmbk9uRXJyb3IgYWJvdmUpLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKHNBcHBTdGF0ZUtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdFx0XHQvLyBub3RlOiB3ZSBkbyBub3Qgd2FpdCBmb3IgdGhlIHNhdmUgdG8gYmUgY29tcGxldGVkOiB0aGlzIGFzeW5jaHJvbm91c2x5IGJlaGF2aW91ciBpcyBuZWNlc3NhcnkgaWZcblx0XHRcdFx0XHQvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZS5nLiBpbiBhIG9uTGlua1ByZXNzZWQgZXZlbnQgd2l0aCBubyBwb3NzaWJpbGl0eSB0byB3YWl0IGZvciB0aGUgcHJvbWlzZSByZXNvbHV0aW9uXG5cdFx0XHRcdFx0aWYgKCFiU2tpcEhhc2hSZXBsYWNlICYmIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9zYXZlQXBwU3RhdGVBc3luYyBmYWlsZWRcIik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBhcHAgc3RhdGUgYW5kIHN0b3JlcyB0aGUgYXBwIHN0YXRlIGZvciBsYXRlciByZXRyaWV2YWwuXG5cdCAqXG5cdCAqIEBwYXJhbSBtSW5uZXJBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSBJZiBzZXQgdG8gZmFsc2UsIHRoZSBpbm5lciBhcHAgaGFzaCB3aWxsIG5vdCBiZSByZXBsYWNlZCB1bnRpbCBzdG9yaW5nIGlzIHN1Y2Nlc3NmdWw7IGRvIG5vdFxuXHQgKiAgICAgICAgc2V0IHRvIGZhbHNlIGlmIHlvdSBjYW5ub3QgcmVhY3QgdG8gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UsIGZvciBleGFtcGxlLCB3aGVuIGNhbGxpbmcgdGhlIGJlZm9yZUxpbmtQcmVzc2VkIGV2ZW50XG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCB0aGUgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkOyBpZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBhcHAgc3RhdGUga2V5IGlzIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIG9iamVjdCBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXNcblx0ICogICAgICAgICAgcmV0dXJuZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG1Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0dmFyIG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZShtSW5uZXJBcHBEYXRhKTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uKHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHQvL3lvdXIgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIG5vdywgc0FwcFN0YXRlS2V5IHdhcyBhZGRlZCB0byBVUkxcblx0ICogXHRcdC8vcGVyZm9ybSBhY3Rpb25zIHRoYXQgbXVzdCBydW4gYWZ0ZXIgc2F2ZVxuXHQgKiBcdH0pO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAZGVwcmVjYXRlZHNpbmNlIDEuMTA0XG5cdCAqIEBkZXByZWNhdGVkIFVzZSB0aGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlKG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSwgYkltbWVkaWF0ZUhhc2hSZXBsYWNlPzogYm9vbGVhbik6IGpRdWVyeS5Qcm9taXNlPHN0cmluZz4ge1xuXHRcdExvZy5lcnJvcihcblx0XHRcdFwiRGVwcmVjYXRlZCBBUEkgY2FsbCBvZiAnc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlJy4gUGxlYXNlIHVzZSAnc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMnIGluc3RlYWRcIixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFwic2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJcIlxuXHRcdCk7XG5cdFx0aWYgKHR5cGVvZiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgIT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2UgPSB0cnVlOyAvLyBkZWZhdWx0XG5cdFx0fVxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Y29uc3QgZm5SZXBsYWNlSGFzaCA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0hhc2hDaGFuZ2VyID0gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgPyBvTmF2SGFuZGxlci5vUm91dGVyLm9IYXNoQ2hhbmdlciA6IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0XHQvKlxuXHRcdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsXG5cdFx0XHQgKiBpcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNBcHBIYXNoTmV3ID0gb05hdkhhbmRsZXIuX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoT2xkLCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0b0hhc2hDaGFuZ2VyLnJlcGxhY2VIYXNoKHNBcHBIYXNoTmV3KTtcblx0XHR9O1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEgYXMgb2JqZWN0KSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShcIlwiKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gY2hlY2sgaWYgd2UgYWxyZWFkeSBzYXZlZCB0aGUgc2FtZSBkYXRhXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5Q2FjaGVkID0gdGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXk7XG5cblx0XHRjb25zdCBiSW5uZXJBcHBEYXRhRXF1YWwgPSBKU09OLnN0cmluZ2lmeShtSW5uZXJBcHBEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSk7XG5cdFx0aWYgKGJJbm5lckFwcERhdGFFcXVhbCAmJiBzQXBwU3RhdGVLZXlDYWNoZWQpIHtcblx0XHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgZm91bmQgaW4gY2FjaGVcblx0XHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlSGl0Kys7XG5cblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBjYWNoZWQgYXBwU3RhdGVLZXkgaW4gdXJsIChqdXN0IGluIGNhc2UgdGhlIGFwcCBoYXMgY2hhbmdlZCB0aGUgaGFzaCBpbiBtZWFudGltZSlcblx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gdGhpcy5fc2F2ZUFwcFN0YXRlKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0Lypcblx0XHQgKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdCAqIG9mIHRoZSBBcHAgSGFzaCB3aXRoIHRoZSBnZW5lcmF0ZWQga2V5LCBhcyB0aGUgY29udGFpbmVyIHdhcyBub3Qgd3JpdHRlbiBiZWZvcmUuIE5vdGUgYXMgd2VsbCB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBoYXMgYWxyZWFkeVxuXHRcdCAqIGhhcHBlbmVkIGJlZm9yZSBieSBtYWtpbmcgdGhlIG9NeURlZmVycmVkIHByb21pc2UgZmFpbCAoc2VlIGZuT25FcnJvciBhYm92ZSkuXG5cdFx0ICovXG5cdFx0aWYgKHNBcHBTdGF0ZUtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0Ly8gbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0XHQvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZS5nLiBpbiBhIG9uTGlua1ByZXNzZWQgZXZlbnQgd2l0aCBubyBwb3NzaWJpbGl0eSB0byB3YWl0IGZvciB0aGUgcHJvbWlzZSByZXNvbHV0aW9uXG5cdFx0XHRpZiAoYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudC4gPGI+Tm90ZTo8L2I+SWZcblx0ICogICAgICAgIG5vdCBwcm92aWRlZCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgc2V0IHRvIGZhbHNlLiA8Yj5Ob3RlOjwvYj5JZiBzZXQgdG8gdHJ1ZSwgdGhlIGNhbGxpbmcgaW5zdGFuY2UgaGFzIHRvIGVuc3VyZSB0aGF0IGEgZm9sbG93LW9uXG5cdCAqICAgICAgICBjYWxsIHRvIDxjb2RlPnJlcGxhY2VIYXNoPC9jb2RlPiB3aWxsIHRha2UgcGxhY2UhXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBhcHBTdGF0ZUlkIGFuZCBhIHByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlblxuXHQgKiAgICAgICAgICBleGVjdXRlZDsgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYXBwU3RhdGVLZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBlbXB0eS5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlID0gc3RvcmVJbm5lckFwcFN0YXRlV2l0aE5vbkRlbGF5ZWRSZXR1cm4obUlubmVyQXBwRGF0YSk7XG5cdCAqIFx0dmFyIHNBcHBTdGF0ZUtleSA9IG9TdG9yZUlubmVyQXBwU3RhdGUuYXBwU3RhdGVLZXk7XG5cdCAqIFx0aWYgKCFzQXBwU3RhdGVLZXkpIHtcblx0ICogICAgLy8gbm8gYXBwU3RhdGVLZXkgb2J0YWluZWQuLi5cblx0ICogXHR9O1xuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IG9TdG9yZUlubmVyQXBwU3RhdGUucHJvbWlzZTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uKHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHQvL3lvdXIgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIG5vdywgc0FwcFN0YXRlS2V5IHdhcyBhZGRlZCB0byBVUkxcblx0ICogXHRcdC8vcGVyZm9ybSBhY3Rpb25zIHRoYXQgbXVzdCBydW4gYWZ0ZXIgc2F2ZVxuXHQgKiBcdH0pO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAcHVibGljXG5cdCAqIEBkZXByZWNhdGVkc2luY2UgMS4xMDRcblx0ICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmN9IGluc3RlYWQuXG5cdCAqL1xuXHRzdG9yZUlubmVyQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSwgYkltbWVkaWF0ZUhhc2hSZXBsYWNlPzogYm9vbGVhbik6IG9iamVjdCB7XG5cdFx0TG9nLmVycm9yKFxuXHRcdFx0XCJEZXByZWNhdGVkIEFQSSBjYWxsIG9mICdzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuJy4gUGxlYXNlIHVzZSAnc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMnIGluc3RlYWRcIixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFwic2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJcIlxuXHRcdCk7XG5cdFx0aWYgKHR5cGVvZiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgIT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2UgPSBmYWxzZTsgLy8gZGVmYXVsdFxuXHRcdH1cblxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBvQXBwU3RhdGVQcm9taXNlID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHQvLyBpbiBjYXNlIG1Jbm5lckFwcFN0YXRlIGlzIGVtcHR5LCBkbyBub3Qgb3ZlcndyaXRlIHRoZSBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0aWYgKGlzRW1wdHlPYmplY3QobUlubmVyQXBwRGF0YSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGFwcFN0YXRlS2V5OiBcIlwiLFxuXHRcdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnJlc29sdmUoXCJcIilcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gY2hlY2sgaWYgd2UgYWxyZWFkeSBzYXZlZCB0aGUgc2FtZSBkYXRhXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5Q2FjaGVkID0gdGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXk7XG5cblx0XHRjb25zdCBiSW5uZXJBcHBEYXRhRXF1YWwgPSBKU09OLnN0cmluZ2lmeShtSW5uZXJBcHBEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSk7XG5cdFx0aWYgKGJJbm5lckFwcERhdGFFcXVhbCAmJiBzQXBwU3RhdGVLZXlDYWNoZWQpIHtcblx0XHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgZm91bmQgaW4gY2FjaGVcblx0XHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlSGl0Kys7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5Q2FjaGVkLFxuXHRcdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIG5vdCBmb3VuZCBpbiBjYWNoZVxuXHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlTWlzcysrO1xuXG5cdFx0Y29uc3QgZm5PbkFmdGVyU2F2ZSA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdGlmICghYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdG9OYXZIYW5kbGVyLnJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9BcHBTdGF0ZVByb21pc2UucmVzb2x2ZShzQXBwU3RhdGVLZXkpO1xuXHRcdH07XG5cblx0XHRjb25zdCBmbk9uRXJyb3IgPSBmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdG9BcHBTdGF0ZVByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleSA9IHRoaXMuX3NhdmVBcHBTdGF0ZShtSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdC8qXG5cdFx0ICogTm90ZSB0aGF0IF9zYXBBcHBTdGF0ZSBtYXkgcmV0dXJuICd1bmRlZmluZWQnIGluIGNhc2UgdGhhdCB0aGUgcGFyc2luZyBoYXMgZmFpbGVkLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgcmVwbGFjZW1lbnRcblx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHQgKiBoYXBwZW5lZCBiZWZvcmUgYnkgbWFraW5nIHRoZSBvTXlEZWZlcnJlZCBwcm9taXNlIGZhaWwgKHNlZSBmbk9uRXJyb3IgYWJvdmUpLlxuXHRcdCAqL1xuXHRcdC8vIGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIC8vcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHQvLyAvL25vdGU6IHdlIGRvIG5vdCB3YWl0IGZvciB0aGUgc2F2ZSB0byBiZSBjb21wbGV0ZWQ6IHRoaXMgYXN5bmNocm9ub3VzbHkgYmVoYXZpb3VyIGlzIG5lY2Vzc2FyeSBpZlxuXHRcdC8vIC8vdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdC8vIGlmIChiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHQvLyBmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0Ly8gfVxuXHRcdC8vIH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleSxcblx0XHRcdHByb21pc2U6IG9BcHBTdGF0ZVByb21pc2UucHJvbWlzZSgpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzZXMgbmF2aWdhdGlvbi1yZWxhdGVkIHRhc2tzIHJlbGF0ZWQgdG8gYmVmb3JlUG9wb3Zlck9wZW5zIGV2ZW50IGhhbmRsaW5nIGZvciB0aGUgU21hcnRMaW5rIGNvbnRyb2wgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdC4gSW5cblx0ICogcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB0YXNrcyBhcmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgU21hcnRMaW5rIHBvcG92ZXIgY2FuIGJlIG9wZW5lZDpcblx0ICogPHVsPlxuXHQgKiA8bGk+SWYgPGNvZGU+bUlubmVyQXBwRGF0YTwvY29kZT4gaXMgcHJvdmlkZWQsIHRoaXMgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIGZvciBiYWNrIG5hdmlnYXRpb24gYXQgYSBsYXRlciB0aW1lLjwvbGk+XG5cdCAqIDxsaT5UaGUgdGFibGUgZXZlbnQgcGFyYW1ldGVycyAoc2VtYW50aWMgYXR0cmlidXRlcykgYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBkYXRhIGFyZSBjb21iaW5lZCBieSBjYWxsaW5nIHRoZSBtZXRob2Rcblx0ICoge0BsaW5rICMubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQgbWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnR9LjwvbGk+XG5cdCAqIDxsaT5UaGUgY29tYmluZWQgZGF0YSBpcyBzYXZlZCBhcyB0aGUgY3Jvc3MgYXBwIHN0YXRlIHRvIGJlIGhhbmRlZCBvdmVyIHRvIHRoZSB0YXJnZXQgYXBwLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2FwLXhhcHAtc3RhdGUga2V5IGlzIHNldFxuXHQgKiBpbiB0aGUgVVJMLjwvbGk+XG5cdCAqIDxsaT5BbGwgc2luZ2xlIHNlbGVjdGlvbnMgKFwiaW5jbHVkaW5nIGVxdWFsXCIpIG9mIHRoZSBjb21iaW5lZCBzZWxlY3Rpb24gZGF0YSBhcmUgcGFzc2VkIHRvIHRoZSBTbWFydExpbmsgcG9wb3ZlciBhcyBzZW1hbnRpYyBhdHRyaWJ1dGVzLjwvbGk+XG5cdCAqIDxsaT5UaGUgbWV0aG9kIDxjb2RlPm9UYWJsZUV2ZW50UGFyYW1ldGVycy5vcGVuKCk8L2NvZGU+IGlzIGNhbGxlZC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcmVhbGx5IG9wZW4gdGhlIHBvcG92ZXIsIGJ1dCB0aGUgU21hcnRMaW5rXG5cdCAqIGNvbnRyb2wgcHJvY2VlZHMgd2l0aCBmaXJpbmcgdGhlIGV2ZW50IDxjb2RlPm5hdmlnYXRpb25UYXJnZXRzT2J0YWluZWQ8L2NvZGU+LjwvbGk+XG5cdCAqIDwvdWw+LlxuXHQgKiA8YnI+XG5cdCAqIDxiPk5vZGU6PC9iPiBJZiB0aGUgPGNvZGU+b0V4dGVybmFsQXBwRGF0YTwvY29kZT4gcGFyYW1ldGVyIGlzIG5vdCBzdXBwbGllZCwgdGhlIGV4dGVybmFsIGFwcCBkYXRhIHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvblxuXHQgKiB0aGUgPGNvZGU+bUlubmVyQXBwRGF0YTwvY29kZT4gZGF0YS48YnI+LlxuXHQgKlxuXHQgKiBAcGFyYW0gb1RhYmxlRXZlbnRQYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBTbWFydFRhYmxlIGNvbnRyb2wgd2hlbiB0aGUgU21hcnRMaW5rIGNvbnRyb2wgaGFzIGJlZW4gY2xpY2tlZCxcblx0ICogICAgICAgIGFuIGluc3RhbmNlIG9mIGEgUG9wT3ZlciBvYmplY3Rcblx0ICogQHBhcmFtIHNTZWxlY3Rpb25WYXJpYW50IFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0IGFzIHJldHVybmVkLCBmb3IgZXhhbXBsZSwgZnJvbSBnZXREYXRhU3VpdGVGb3JtYXQoKSBvZiB0aGUgU21hcnRGaWx0ZXJCYXIgY29udHJvbFxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLiBJZiBwcm92aWRlZCwgb3BlbmluZyB0aGUgUG9wb3ZlciBpcyBkZWZlcnJlZCB1bnRpbCB0aGVcblx0ICogICAgICAgIGlubmVyIGFwcCBkYXRhIGlzIHNhdmVkIGluIGEgY29uc2lzdGVudCB3YXkuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGFyZ2V0IHNjcmVlbi5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEuc2VsZWN0aW9uVmFyaWFudCBPYmplY3QgY29udGFpbmluZyBzZWxlY3Rpb25WYXJpYW50LCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGFyZ2V0IHNjcmVlbi4gSWYgbm90XG5cdCAqICAgICAgICBzZXQgdGhlIHNTZWxlY3Rpb25WYXJpYW50IHdpbGwgYmUgdXNlZC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCB1aSBwcmVzZW50YXRpb25WYXJpYW50IG9mIHRoZSBhcHAsIHdoaWNoIHdpbGwgYmVcblx0ICogICAgICAgIHBhc3NlZCB0byB0aGUgdGFyZ2V0IHNjcmVlblxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS52YWx1ZVRleHRzIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucywgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW5cblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgbW9kaWZpZWQgb1RhYmxlRXZlbnRQYXJhbWV0ZXJzIGlzIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIGVycm9yIG9iamVjdCBvZiB0eXBlXG5cdCAqICAgICAgICAgIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXMgcmV0dXJuZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiLCBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlciwgU2VsZWN0aW9uVmFyaWFudCkge1xuXHQgKiBcdC8vZXZlbnQgaGFuZGxlciBmb3IgdGhlIHNtYXJ0IGxpbmsgZXZlbnQgXCJiZWZvcmVQb3BvdmVyT3BlbnNcIlxuXHQgKiBcdFx0b25CZWZvcmVQb3BvdmVyT3BlbnM6IGZ1bmN0aW9uKG9FdmVudCkge1xuXHQgKiBcdFx0XHR2YXIgb1RhYmxlRXZlbnRQYXJhbWV0ZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcnMoKTtcblx0ICpcblx0ICogXHRcdFx0dmFyIG1Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdFx0XHR9O1xuXHQgKlxuXHQgKiBcdFx0XHR2YXIgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHQgKiBcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkN1c3RvbWVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiQzAwMDFcIik7XG5cdCAqIFx0XHRcdHZhciBzU2VsZWN0aW9uVmFyaWFudD0gb1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0XHRcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdFx0XHR2YXIgb1NtYXJ0TGlua1Byb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIucHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyhvVGFibGVFdmVudFBhcmFtZXRlcnMsIHNTZWxlY3Rpb25WYXJpYW50LCBtSW5uZXJBcHBEYXRhKTtcblx0ICpcblx0ICogXHRcdFx0b1NtYXJ0TGlua1Byb21pc2UuZG9uZShmdW5jdGlvbihvVGFibGVFdmVudFBhcmFtZXRlcnMpe1xuXHQgKiBcdFx0XHRcdC8vIGhlcmUgeW91IGNhbiBhZGQgY29kaW5nIHRoYXQgc2hvdWxkIHJ1biBhZnRlciBhbGwgYXBwIHN0YXRlcyBhcmUgc2F2ZWQgYW5kIHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIGFyZSBzZXRcblx0ICogXHRcdFx0fSk7XG5cdCAqXG5cdCAqIFx0XHRcdG9TbWFydExpbmtQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0XHRcdH0pO1xuXHQgKiBcdFx0fTtcblx0ICogXHR9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0cHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyhcblx0XHRvVGFibGVFdmVudFBhcmFtZXRlcnM6IGFueSxcblx0XHRzU2VsZWN0aW9uVmFyaWFudDogc3RyaW5nLFxuXHRcdG1Jbm5lckFwcERhdGE/OiBJbm5lckFwcERhdGEsXG5cdFx0b0V4dGVybmFsQXBwRGF0YT86IHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ/OiBvYmplY3Q7XG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50Pzogb2JqZWN0O1xuXHRcdFx0dmFsdWVUZXh0cz86IG9iamVjdDtcblx0XHR9XG5cdCk6IEpRdWVyeS5Qcm9taXNlPGFueSwgYW55LCBhbnk+IHtcblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXHRcdGxldCBtU2VtYW50aWNBdHRyaWJ1dGVzOiBhbnk7XG5cdFx0aWYgKG9UYWJsZUV2ZW50UGFyYW1ldGVycyAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG1TZW1hbnRpY0F0dHJpYnV0ZXMgPSBvVGFibGVFdmVudFBhcmFtZXRlcnMuc2VtYW50aWNBdHRyaWJ1dGVzO1xuXHRcdH1cblxuXHRcdGxldCBvWEFwcERhdGFPYmo6IGFueTtcblx0XHRjb25zdCBvTmF2SGFuZGxlcjogTmF2aWdhdGlvbkhhbmRsZXIgPSB0aGlzO1xuXG5cdFx0aWYgKG9FeHRlcm5hbEFwcERhdGEgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0ge307XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9FeHRlcm5hbEFwcERhdGE7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZm5TdG9yZVhhcHBBbmRDYWxsT3BlbiA9IGZ1bmN0aW9uIChtU3ViU2VtYW50aWNBdHRyaWJ1dGVzOiBhbnksIHNTdWJTZWxlY3Rpb25WYXJpYW50OiBhbnkpIHtcblx0XHRcdC8vIG1peCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyAoZS5nLiBmcm9tIHRoZSByb3cgbGluZSkgd2l0aCB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgKGUuZy4gZnJvbSB0aGUgZmlsdGVyIGJhcilcblx0XHRcdHNTdWJTZWxlY3Rpb25WYXJpYW50ID0gb1hBcHBEYXRhT2JqLnNlbGVjdGlvblZhcmlhbnQgfHwgc1N1YlNlbGVjdGlvblZhcmlhbnQgfHwgXCJ7fVwiO1xuXG5cdFx0XHRjb25zdCBpU3VwcHJlc3Npb25CZWhhdmlvciA9IFN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uTnVsbCB8IFN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uVW5kZWZpbmVkO1xuXHRcdFx0Lypcblx0XHRcdCAqIGNvbXBhdGlibGl0eTogVW50aWwgU0FQVUk1IDEuMjguNSAob3IgZXZlbiBsYXRlcikgdGhlIFNtYXJ0IExpbmsgaW4gYSBTbWFydCBUYWJsZSBpcyBmaWx0ZXJpbmcgYWxsIG51bGwtIGFuZCB1bmRlZmluZWQgdmFsdWVzLlxuXHRcdFx0ICogVGhlcmVmb3JlLCBtU2VtYW50aWNBdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHJlZHVjZWQgYXBwcm9wcmlhdGVseSAtLSB0aGlzIGRvZXMgbm90IG5lZWQgdG8gYmUgZG9uZSBieVxuXHRcdFx0ICogbWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQgYWdhaW4uIFRvIGVuc3VyZSB0aGF0IHdlIHN0aWxsIGhhdmUgdGhlIG9sZCBiZWhhdmlvdXIgKGkuZS4gYW4gTmF2RXJyb3IgaXMgcmFpc2VkIGluIGNhc2UgdGhhdFxuXHRcdFx0ICogYmVoYXZpb3VyIG9mIHRoZSBTbWFydCBMaW5rIGNvbnRyb2wgaGFzIGNoYW5nZWQpLCB0aGUgXCJvbGRcIiBTdXBwcmVzc2lvbiBCZWhhdmlvdXIgaXMgcmV0YWluZWQuXG5cdFx0XHQgKi9cblxuXHRcdFx0Y29uc3Qgb01peGVkU2VsVmFyID0gb05hdkhhbmRsZXIubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQoXG5cdFx0XHRcdG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMsXG5cdFx0XHRcdHNTdWJTZWxlY3Rpb25WYXJpYW50LFxuXHRcdFx0XHRpU3VwcHJlc3Npb25CZWhhdmlvclxuXHRcdFx0KTtcblx0XHRcdHNTdWJTZWxlY3Rpb25WYXJpYW50ID0gb01peGVkU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXG5cdFx0XHQvLyBlbnJpY2ggdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgd2l0aCBzaW5nbGUgc2VsZWN0aW9ucyBmcm9tIHRoZSBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdFx0bGV0IG9UbXBEYXRhOiBhbnkgPSB7fTtcblx0XHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvTWl4ZWRTZWxWYXIudG9KU09OT2JqZWN0KCk7XG5cblx0XHRcdG9UbXBEYXRhID0gb05hdkhhbmRsZXIuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9UbXBEYXRhKTtcblxuXHRcdFx0b1RtcERhdGEgPSBvTmF2SGFuZGxlci5fY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9UbXBEYXRhKTtcblxuXHRcdFx0bVN1YlNlbWFudGljQXR0cmlidXRlcyA9IG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnRcblx0XHRcdFx0PyBvTmF2SGFuZGxlci5fZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpKVxuXHRcdFx0XHQ6IHt9O1xuXG5cdFx0XHRjb25zdCBmbk9uQ29udGFpbmVyU2F2ZSA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0XHRpZiAob1RhYmxlRXZlbnRQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyBJZiBvVGFibGVFdmVudFBhcmFtZXRlcnMgaXMgdW5kZWZpbmVkLCByZXR1cm4gYm90aCBzZW1hbnRpY0F0dHJpYnV0ZXMgYW5kIGFwcFN0YXRla2V5XG5cdFx0XHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShtU3ViU2VtYW50aWNBdHRyaWJ1dGVzLCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHNldCB0aGUgc3RvcmVkIGRhdGEgaW4gcG9wb3ZlciBhbmQgY2FsbCBvcGVuKClcblx0XHRcdFx0XHRvVGFibGVFdmVudFBhcmFtZXRlcnMuc2V0U2VtYW50aWNBdHRyaWJ1dGVzKG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMpO1xuXHRcdFx0XHRcdG9UYWJsZUV2ZW50UGFyYW1ldGVycy5zZXRBcHBTdGF0ZUtleShzQXBwU3RhdGVLZXkpO1xuXHRcdFx0XHRcdG9UYWJsZUV2ZW50UGFyYW1ldGVycy5vcGVuKCk7IC8vID4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IE5vdGUgdGhhdCBcIm9wZW5cIiBkb2VzIG5vdCBvcGVuIHRoZSBwb3BvdmVyLCBidXQgcHJvY2VlZHNcblx0XHRcdFx0XHQvLyB3aXRoIGZpcmluZyB0aGUgb25OYXZUYXJnZXRzT2J0YWluZWQgZXZlbnQuXG5cdFx0XHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShvVGFibGVFdmVudFBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBmbk9uRXJyb3IgPSBmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9O1xuXG5cdFx0XHRvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCA9IHNTdWJTZWxlY3Rpb25WYXJpYW50O1xuXG5cdFx0XHRvWEFwcERhdGFPYmogPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1hBcHBEYXRhT2JqKTtcblxuXHRcdFx0b05hdkhhbmRsZXIuX3NhdmVBcHBTdGF0ZUFzeW5jKG9YQXBwRGF0YU9iaiwgZm5PbkNvbnRhaW5lclNhdmUsIGZuT25FcnJvcik7XG5cdFx0fTtcblxuXHRcdGlmIChtSW5uZXJBcHBEYXRhKSB7XG5cdFx0XHRjb25zdCBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IHRoaXMuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMobUlubmVyQXBwRGF0YSwgdHJ1ZSk7XG5cblx0XHRcdC8vIGlmIHRoZSBpbm5lciBhcHAgc3RhdGUgd2FzIHN1Y2Nlc3NmdWxseSBzdG9yZWQsIHN0b3JlIGFsc28gdGhlIHhhcHAtc3RhdGVcblx0XHRcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRmblN0b3JlWGFwcEFuZENhbGxPcGVuKG1TZW1hbnRpY0F0dHJpYnV0ZXMsIHNTZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBubyBpbm5lciBhcHAgc3RhdGUgdG8gc2F2ZSwganVzdCBwdXQgdGhlIHBhcmFtZXRlcnMgaW50byB4YXBwLXN0YXRlXG5cdFx0XHRmblN0b3JlWGFwcEFuZENhbGxPcGVuKG1TZW1hbnRpY0F0dHJpYnV0ZXMsIHNTZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3NlcyBzZWxlY3Rpb25WYXJpYW50IHN0cmluZyBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IChzZW1hbnRpY0F0dHJpYnV0ZXMgYW5kIEFwcFN0YXRlS2V5KS5cblx0ICpcblx0ICogQHBhcmFtIHNTZWxlY3Rpb25WYXJpYW50IFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0XG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIHNlbWFudGljQXR0cmlidXRlcyBhcyB3ZWxsIGFzIHRoZSBhcHBTdGF0ZUtleSBhcmUgcmV0dXJuZWQ7IGlmIGFuIGVycm9yIG9jY3VycywgYW4gZXJyb3Igb2JqZWN0IG9mIHR5cGVcblx0ICogICAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpcyByZXR1cm5lZFxuXHQgKiA8YnI+XG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0XHR2YXIgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHQgKiBcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ29tcGFueUNvZGVcIiwgXCJJXCIsIFwiRVFcIiwgXCIwMDAxXCIpO1xuXHQgKiBcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ3VzdG9tZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCJDMDAwMVwiKTtcblx0ICogXHRcdHZhciBzU2VsZWN0aW9uVmFyaWFudD0gb1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0XHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHRcdHZhciBvUHJvbWlzZU9iamVjdCA9IG9OYXZpZ2F0aW9uSGFuZGxlci5fZ2V0QXBwU3RhdGVLZXlBbmRVcmxQYXJhbWV0ZXJzKHNTZWxlY3Rpb25WYXJpYW50KTtcblx0ICpcblx0ICogXHRcdG9Qcm9taXNlT2JqZWN0LmRvbmUoZnVuY3Rpb24ob1NlbWFudGljQXR0cmlidXRlcywgc0FwcFN0YXRlS2V5KXtcblx0ICogXHRcdFx0Ly8gaGVyZSB5b3UgY2FuIGFkZCBjb2RpbmcgdGhhdCBzaG91bGQgcnVuIGFmdGVyIGFsbCBhcHAgc3RhdGUgYW5kIHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIGhhdmUgYmVlbiByZXR1cm5lZC5cblx0ICogXHRcdH0pO1xuXHQgKlxuXHQgKiBcdFx0b1Byb21pc2VPYmplY3QuZmFpbChmdW5jdGlvbihvRXJyb3Ipe1xuXHQgKiBcdFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHRcdH0pO1xuXHQgKlx0fSk7XG5cdCAqIDwvY29kZT5cblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0QXBwU3RhdGVLZXlBbmRVcmxQYXJhbWV0ZXJzKHNTZWxlY3Rpb25WYXJpYW50OiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zKHVuZGVmaW5lZCwgc1NlbGVjdGlvblZhcmlhbnQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgQXBwIHNwZWNpZmljIGhhc2guXG5cdCAqXG5cdCAqIEBwYXJhbSBhcHBIYXNoIFRoZSBwYXRoIHN0cmluZ1xuXHQgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgYmFzZSBwYXRoXG5cdCAqXG5cdCAqL1xuXHRhc3luYyBfZ2V0QXBwU3BlY2lmaWNIYXNoKGFwcEhhc2g6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNyb3NzQXBwU2VydmljZSA9IGF3YWl0IHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKTtcblx0XHRcdHJldHVybiBjcm9zc0FwcFNlcnZpY2UuaHJlZkZvckFwcFNwZWNpZmljSGFzaEFzeW5jKGFwcEhhc2gpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXHRcdFx0TG9nLmVycm9yKGBGRSA6IENhbiBub3QgZmV0Y2ggQXBwIHNlcGNpZmljIFVSTCA6ICR7bWVzc2FnZX1gKTtcblx0XHRcdHRocm93IEVycm9yKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdF9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50KG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSwgb1NlbFZhcmlhbnQ6IGFueSwgaVN1cHByZXNzaW9uQmVoYXZpb3I6IGFueSkge1xuXHRcdC8vIGFkZCBhbGwgc2VtYW50aWMgYXR0cmlidXRlcyB0byB0aGUgbWl4ZWQgc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eU5hbWUgaW4gbVNlbWFudGljQXR0cmlidXRlcykge1xuXHRcdFx0aWYgKG1TZW1hbnRpY0F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoc1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0Ly8gQSB2YWx1ZSBvZiBhIHNlbWFudGljIGF0dHJpYnV0ZSBtYXkgbm90IGJlIGEgc3RyaW5nLCBidXQgY2FuIGJlIGUuZy4gYSBkYXRlLlxuXHRcdFx0XHQvLyBTaW5jZSB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgYWNjZXB0cyBvbmx5IGEgc3RyaW5nLCB3ZSBoYXZlIHRvIGNvbnZlcnQgaXQgaW4gZGVwZW5kZW5jZSBvZiB0aGUgdHlwZS5cblx0XHRcdFx0bGV0IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gbVNlbWFudGljQXR0cmlidXRlc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0XHRcdC8vIHVzZSB0aGUgc2FtZSBjb252ZXJzaW9uIG1ldGhvZCBmb3IgZGF0ZXMgYXMgdGhlIFNtYXJ0RmlsdGVyQmFyOiB0b0pTT04oKVxuXHRcdFx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gdlNlbWFudGljQXR0cmlidXRlVmFsdWUudG9KU09OKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0QXJyYXkuaXNBcnJheSh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSkgfHxcblx0XHRcdFx0XHQodlNlbWFudGljQXR0cmlidXRlVmFsdWUgJiYgdHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcIm9iamVjdFwiKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gdlNlbWFudGljQXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJcIikge1xuXHRcdFx0XHRcdGlmIChpU3VwcHJlc3Npb25CZWhhdmlvciAmIFN1cHByZXNzaW9uQmVoYXZpb3IuaWdub3JlRW1wdHlTdHJpbmcpIHtcblx0XHRcdFx0XHRcdExvZy5pbmZvKFxuXHRcdFx0XHRcdFx0XHRcIlNlbWFudGljIGF0dHJpYnV0ZSBcIiArXG5cdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5TmFtZSArXG5cdFx0XHRcdFx0XHRcdFx0XCIgaXMgYW4gZW1wdHkgc3RyaW5nIGFuZCBkdWUgdG8gdGhlIGNob3NlbiBTdXBwcmVzc2lvbiBCZWhpYXZvdXIgaXMgYmVpbmcgaWdub3JlZC5cIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmIChpU3VwcHJlc3Npb25CZWhhdmlvciAmIFN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uTnVsbCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXCJTZW1hbnRpYyBhdHRyaWJ1dGUgXCIgKyBzUHJvcGVydHlOYW1lICsgXCIgaXMgbnVsbCBhbmQgaWdub3JlZCBmb3IgbWl4IGluIHRvIHNlbGVjdGlvbiB2YXJpYW50XCIpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7IC8vIGlnbm9yZSFcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChpU3VwcHJlc3Npb25CZWhhdmlvciAmIFN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uVW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIlNlbWFudGljIGF0dHJpYnV0ZSBcIiArIHNQcm9wZXJ0eU5hbWUgKyBcIiBpcyB1bmRlZmluZWQgYW5kIGlnbm9yZWQgZm9yIG1peCBpbiB0byBzZWxlY3Rpb24gdmFyaWFudFwiKTtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHtcblx0XHRcdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BlcnR5TmFtZSwgXCJJXCIsIFwiRVFcIiwgdlNlbWFudGljQXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9TZWxWYXJpYW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbWJpbmVzIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGFuZCBzZWxlY3Rpb24gdmFyaWFudCBpbnRvIGEgbmV3IHNlbGVjdGlvbiB2YXJpYW50IGNvbnRhaW5pbmcgcHJvcGVydGllcyBmcm9tIGJvdGgsIHdpdGggdGhlIHBhcmFtZXRlcnNcblx0ICogb3ZlcnJpZGluZyBleGlzdGluZyBwcm9wZXJ0aWVzIGluIHRoZSBzZWxlY3Rpb24gdmFyaWFudC4gVGhlIG5ldyBzZWxlY3Rpb24gdmFyaWFudCBkb2VzIG5vdCBjb250YWluIGFueSBwYXJhbWV0ZXJzLiBBbGwgcGFyYW1ldGVycyBhcmVcblx0ICogbWVyZ2VkIGludG8gc2VsZWN0IG9wdGlvbnMuIFRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiwgY29udmVydGVkIHRvIGEgSlNPTiBzdHJpbmcsIGNhbiBiZSB1c2VkIGZvciB0aGVcblx0ICoge0BsaW5rICMubmF2aWdhdGUgTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGV9IG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIHZTZW1hbnRpY0F0dHJpYnV0ZXMgT2JqZWN0LyhBcnJheSBvZiBPYmplY3RzKSBjb250YWluaW5nIGtleS92YWx1ZSBwYWlyc1xuXHQgKiBAcGFyYW0gc1NlbGVjdGlvblZhcmlhbnQgVGhlIHNlbGVjdGlvbiB2YXJpYW50IGluIHN0cmluZyBmb3JtYXQgYXMgcHJvdmlkZWQgYnkgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHBhcmFtIFtpU3VwcHJlc3Npb25CZWhhdmlvcj1zYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnN0YW5kYXJkXSBJbmRpY2F0ZXMgd2hldGhlciBzZW1hbnRpY1xuXHQgKiAgICAgICAgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgdmFsdWVzIChzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3Igc3VwcHJlc3Npb24gYmVoYXZpb3J9KSBtdXN0IGJlXG5cdCAqICAgICAgICBzdXBwcmVzc2VkIGJlZm9yZSB0aGV5IGFyZSBjb21iaW5lZCB3aXRoIHRoZSBzZWxlY3Rpb24gdmFyaWFudDsgc2V2ZXJhbFxuXHQgKiAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3Igc3VwcHJlc3Npb24gYmVoYXZpb3JzfSBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgYml0d2lzZSBPUiBvcGVyYXRvclxuXHQgKiAgICAgICAgKHwpXG5cdCAqIEByZXR1cm5zIEluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fVxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0dmFyIHZTZW1hbnRpY0F0dHJpYnV0ZXMgPSB7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDFcIiB9O1xuXHQgKiBcdG9yXG5cdCAqIFx0dmFyIHZTZW1hbnRpY0F0dHJpYnV0ZXMgPSBbeyBcIkN1c3RvbWVyXCIgOiBcIkMwMDAxXCIgfSx7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDJcIiB9XTtcblx0ICogXHR2YXIgc1NlbGVjdGlvblZhcmlhbnQgPSBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCk7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIHNOYXZpZ2F0aW9uU2VsZWN0aW9uVmFyaWFudCA9IG9OYXZpZ2F0aW9uSGFuZGxlci5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCh2U2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCkudG9KU09OU3RyaW5nKCk7XG5cdCAqIFx0Ly8gSW4gY2FzZSBvZiBhbiB2U2VtYW50aWNBdHRyaWJ1dGVzIGJlaW5nIGFuIGFycmF5LCB0aGUgc2VtYW50aWNBdHRyaWJ1dGVzIGFyZSBtZXJnZWQgdG8gYSBzaW5nbGUgU1YgYW5kIGNvbXBhcmVkIGFnYWluc3QgdGhlIHNTZWxlY3Rpb25WYXJpYW50KHNlY29uZCBhZ3J1bWVudCkuXG5cdCAqIFx0Ly8gT3B0aW9uYWxseSwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBzZXZlcmFsIHN1cHByZXNzaW9uIGJlaGF2aW9ycy4gU2V2ZXJhbCBzdXBwcmVzc2lvbiBiZWhhdmlvcnMgYXJlIGNvbWJpbmVkIHdpdGggdGhlIGJpdHdpc2UgT1Igb3BlcmF0b3IsIGUuZy5cblx0ICogXHQvLyB2YXIgaVN1cHByZXNzaW9uQmVoYXZpb3IgPSBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPbk51bGwgfCBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPblVuZGVmaW5lZDtcblx0ICogXHQvLyB2YXIgc05hdmlnYXRpb25TZWxlY3Rpb25WYXJpYW50ID0gb05hdmlnYXRpb25IYW5kbGVyLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KG1TZW1hbnRpY0F0dHJpYnV0ZXMsIHNTZWxlY3Rpb25WYXJpYW50LCBpU3VwcHJlc3Npb25CZWhhdmlvcikudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0b05hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlKFwiU2FsZXNPcmRlclwiLCBcImNyZWF0ZVwiLCBzTmF2aWdhdGlvblNlbGVjdGlvblZhcmlhbnQpO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0bWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQoXG5cdFx0dlNlbWFudGljQXR0cmlidXRlczogb2JqZWN0IHwgYW55W10sXG5cdFx0c1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZyB8IFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50LFxuXHRcdGlTdXBwcmVzc2lvbkJlaGF2aW9yPzogbnVtYmVyXG5cdCk6IFNlbGVjdGlvblZhcmlhbnQge1xuXHRcdGNvbnN0IG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdGNvbnN0IG9OZXdTZWxWYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cblx0XHRjb25zdCBmaWx0ZXJVcmwgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRGaWx0ZXJDb250ZXh0VXJsKCk7XG5cdFx0aWYgKGZpbHRlclVybCkge1xuXHRcdFx0b05ld1NlbFZhcmlhbnQuc2V0RmlsdGVyQ29udGV4dFVybChmaWx0ZXJVcmwpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnRleHRVcmwgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJDb250ZXh0VXJsKCk7XG5cdFx0aWYgKGNvbnRleHRVcmwpIHtcblx0XHRcdG9OZXdTZWxWYXJpYW50LnNldFBhcmFtZXRlckNvbnRleHRVcmwoY29udGV4dFVybCk7XG5cdFx0fVxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZTZW1hbnRpY0F0dHJpYnV0ZXMpKSB7XG5cdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSkge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5fbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudChtU2VtYW50aWNBdHRyaWJ1dGVzLCBvTmV3U2VsVmFyaWFudCwgaVN1cHByZXNzaW9uQmVoYXZpb3IpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX21peEF0dHJpYnV0ZXNUb1NlbFZhcmlhbnQodlNlbWFudGljQXR0cmlidXRlcywgb05ld1NlbFZhcmlhbnQsIGlTdXBwcmVzc2lvbkJlaGF2aW9yKTtcblx0XHR9XG5cblx0XHQvLyBhZGQgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb05ld1NlbFZhcmlhbnQgeWV0XG5cdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpO1xuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhUGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKCFvTmV3U2VsVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVBhcmFtZXRlcnNbaV0pKSB7XG5cdFx0XHRcdG9OZXdTZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihhUGFyYW1ldGVyc1tpXSwgXCJJXCIsIFwiRVFcIiwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyKGFQYXJhbWV0ZXJzW2ldKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIHNlbE9wdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9OZXdTZWxWYXJpYW50IHlldFxuXHRcdGNvbnN0IGFTZWxPcHRpb25OYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxPcHRpb25OYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Ly8gYWRkIHNlbE9wdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9OZXdTZWxWYXJpYW50IHlldFxuXHRcdFx0Y29uc3QgYVNlbGVjdE9wdGlvbjogYW55W10gPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVNlbE9wdGlvbk5hbWVzW2ldKSE7XG5cdFx0XHRpZiAoIW9OZXdTZWxWYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsT3B0aW9uTmFtZXNbaV0pKSB7XG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVNlbGVjdE9wdGlvbi5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdG9OZXdTZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcblx0XHRcdFx0XHRcdGFTZWxPcHRpb25OYW1lc1tpXSxcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uU2lnbixcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uT3B0aW9uLFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5Mb3csXG5cdFx0XHRcdFx0XHRhU2VsZWN0T3B0aW9uW2pdLkhpZ2hcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9OZXdTZWxWYXJpYW50O1xuXHR9XG5cblx0X2Vuc3VyZVNlbGVjdGlvblZhcmlhbnRGb3JtYXRTdHJpbmcodlNlbGVjdGlvblZhcmlhbnQ6IGFueSkge1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIGxlZ2FjeSBBcHBTdGF0ZXMgd2hlcmUgdGhlIFNlbGVjdGlvblZhcmlhbnQgaXMgYmVpbmcgc3RvcmVkIGFzIGEgc3RyaW5nLiBIb3dldmVyLCB0aGF0IGlzIG5vdCBjb21wbGlhbnQgdG8gdGhlIHNwZWNpZmljYXRpb24sXG5cdFx0ICogd2hpY2ggc3RhdGVzIHRoYXQgYSBzdGFuZGFyZCBKUyBvYmplY3Qgc2hhbGwgYmUgcHJvdmlkZWQuIEludGVybmFsbHksIGhvd2V2ZXIsIHRoZSBzZWxlY3Rpb25WYXJpYW50IGlzIGFsd2F5cyBvZiB0eXBlIHN0cmluZy4gU2l0dWF0aW9uXG5cdFx0ICogUGVyc2lzdGVuY3kgaW50ZXJuYWwgQVBJIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsZWdhY3kgc3RyaW5nIHN0cmluZyBuZXcgYXBwcm9hY2ggKEpTT04pIG9iamVjdFxuXHRcdCAqIHN0cmluZ1xuXHRcdCAqL1xuXG5cdFx0aWYgKHZTZWxlY3Rpb25WYXJpYW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0bGV0IHZDb252ZXJ0ZWRTZWxlY3Rpb25WYXJpYW50ID0gdlNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHR2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCA9IEpTT04uc3RyaW5naWZ5KHZTZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblxuXHRfZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybjogYW55LCBmbk9uQWZ0ZXJTYXZlOiBhbnksIGZuT25FcnJvcjogYW55KSB7XG5cdFx0b1JldHVybi5wcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKGZuT25BZnRlclNhdmUpIHtcblx0XHRcdFx0Zm5PbkFmdGVyU2F2ZShvUmV0dXJuLmFwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRcdG9SZXR1cm4ucHJvbWlzZS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVTYXZlLmZhaWxlZFwiKTtcblx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfc2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGE6IGFueSwgZm5PbkFmdGVyU2F2ZTogYW55LCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRyZXR1cm4gdGhpcy5fZm5TYXZlQXBwU3RhdGVBc3luYyhvQXBwRGF0YSwgZm5PbkVycm9yKS50aGVuKGZ1bmN0aW9uIChvUmV0dXJuOiBhbnkpIHtcblx0XHRcdGlmIChvUmV0dXJuKSB7XG5cdFx0XHRcdG9OYXZIYW5kbGVyLl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZShvUmV0dXJuLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdFx0XHRyZXR1cm4gb1JldHVybi5hcHBTdGF0ZUtleTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9KTtcblx0fVxuXG5cdF9zYXZlQXBwU3RhdGUob0FwcERhdGE6IGFueSwgZm5PbkFmdGVyU2F2ZTogYW55LCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdGNvbnN0IG9SZXR1cm4gPSB0aGlzLl9zYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhLCBmbk9uRXJyb3IpO1xuXHRcdGlmIChvUmV0dXJuKSB7XG5cdFx0XHR0aGlzLl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZShvUmV0dXJuLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdFx0cmV0dXJuIG9SZXR1cm4uYXBwU3RhdGVLZXk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGE6IGFueSwgb0FwcFN0YXRlOiBhbnksIGZuT25FcnJvcjogYW55KSB7XG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gb0FwcFN0YXRlLmdldEtleSgpO1xuXHRcdGNvbnN0IG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX2ZldGNoQXBwRGF0YUZvclNhdmUob0FwcERhdGEsIGZuT25FcnJvcik7XG5cdFx0aWYgKCFvQXBwRGF0YUZvclNhdmUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdG9BcHBTdGF0ZS5zZXREYXRhKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0Y29uc3Qgb1NhdmVQcm9taXNlID0gb0FwcFN0YXRlLnNhdmUoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0cHJvbWlzZTogb1NhdmVQcm9taXNlLnByb21pc2UoKVxuXHRcdH07XG5cdH1cblxuXHRfZmV0Y2hBcHBEYXRhRm9yU2F2ZShvQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdGxldCBvQXBwRGF0YUZvclNhdmU6IFBhcnRpYWw8SW5uZXJBcHBEYXRhPiA9IHt9O1xuXG5cdFx0aWYgKG9BcHBEYXRhLmhhc093blByb3BlcnR5KFwic2VsZWN0aW9uVmFyaWFudFwiKSkge1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50O1xuXG5cdFx0XHRpZiAob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHQvKlxuXHRcdFx0XHQgKiBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBTZWxlY3Rpb24gVmFyaWFudHMgbmVlZCB0byBiZSBKU09OIG9iamVjdHMuIEhvd2V2ZXIsIGludGVybmFsbHksIHdlIHdvcmsgd2l0aCBzdHJpbmdzIGZvclxuXHRcdFx0XHQgKiBcInNlbGVjdGlvblZhcmlhbnRcIi4gVGhlcmVmb3JlLCBpbiBjYXNlIHRoYXQgdGhpcyBpcyBhIHN0cmluZywgd2UgbmVlZCB0byBKU09OLXBhcnNlIHRoZSBkYXRhLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZWxlY3Rpb25WYXJpYW50ID0gSlNPTi5wYXJzZShvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSB0aGlzLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLkFwcFN0YXRlU2F2ZS5wYXJzZUVycm9yXCIpO1xuXHRcdFx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3NNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdG9BcHBEYXRhRm9yU2F2ZSA9IGV4dGVuZChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IHt9LFxuXHRcdFx0XHRcdHRhYmxlVmFyaWFudElkOiBcIlwiLFxuXHRcdFx0XHRcdGN1c3RvbURhdGE6IHt9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZVxuXHRcdFx0KSBhcyBJbm5lckFwcERhdGE7XG5cblx0XHRcdGlmIChvQXBwRGF0YS50YWJsZVZhcmlhbnRJZCkge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUudGFibGVWYXJpYW50SWQgPSBvQXBwRGF0YS50YWJsZVZhcmlhbnRJZDtcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS5jdXN0b21EYXRhKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5jdXN0b21EYXRhID0gb0FwcERhdGEuY3VzdG9tRGF0YTtcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5wcmVzZW50YXRpb25WYXJpYW50ID0gb0FwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS52YWx1ZVRleHRzKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS52YWx1ZVRleHRzID0gb0FwcERhdGEudmFsdWVUZXh0cztcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS5zZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZW1hbnRpY0RhdGVzID0gb0FwcERhdGEuc2VtYW50aWNEYXRlcztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0FwcERhdGFDbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIG9BcHBEYXRhKTtcblx0XHRcdG9BcHBEYXRhRm9yU2F2ZSA9IG1lcmdlKG9BcHBEYXRhQ2xvbmUsIG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0fVxuXHRcdG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvQXBwRGF0YUZvclNhdmUpO1xuXHRcdHJldHVybiBvQXBwRGF0YUZvclNhdmU7XG5cdH1cblxuXHRfZm5TYXZlQXBwU3RhdGVBc3luYyhvQXBwRGF0YTogYW55LCBmbk9uRXJyb3I/OiBhbnkpIHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0cmV0dXJuIHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5jcmVhdGVFbXB0eUFwcFN0YXRlQXN5bmMob05hdkhhbmRsZXIub0NvbXBvbmVudCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BcHBTdGF0ZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvTmF2SGFuZGxlci5fZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhLCBvQXBwU3RhdGUsIGZuT25FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGE6IGFueSwgZm5PbkVycm9yPzogYW55KSB7XG5cdFx0Y29uc3Qgb0FwcFN0YXRlID0gdGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2UoKS5jcmVhdGVFbXB0eUFwcFN0YXRlKHRoaXMub0NvbXBvbmVudCk7XG5cdFx0cmV0dXJuIHRoaXMuX2ZuU2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YSwgb0FwcFN0YXRlLCBmbk9uRXJyb3IpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbG9hZGVkIElBcHAgU3RhdGUgYW5kIG5hdmlnYXRpb24gdHlwZSBvbmNlIHJlc29sdmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBJQXBwU3RhdGVLZXkgdG8gcmV0cmlldmUgdGhlIEFwcFN0YXRlIGRhdGEuXG5cdCAqIEBwYXJhbSBvRGVmZXJyZWQgSnF1ZXJ5IGRlZmVycmVkIG9iamVjdCB0byByZXNvbHZlIHRoZSBBcHBTdGF0ZSBkYXRhLlxuXHQgKiBAcGFyYW0gbmF2VHlwZSBOYXZpZ2F0aW9uIHR5cGUgZm9yIHdoaWNoIEFwcFN0YXRlIGlzIHJldHJpZXZlZC5cblx0ICogQHJldHVybnMgVGhlIGRlZmVycmVkIG9iamVjdCB3aGljaCBpcyByZXNvbHZlZCB3aXRoIGxvYWRlZCBhcHAgc3RhdGUgZGF0YVxuXHQgYW5kIG5hdmlnYXRpb24gdHlwZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9sb2FkQXBwU3RhdGUoc0FwcFN0YXRlS2V5OiBzdHJpbmcsIG9EZWZlcnJlZDogalF1ZXJ5LkRlZmVycmVkLCBuYXZUeXBlOiBzdHJpbmcpOiBqUXVlcnkuRGVmZXJyZWQge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHR0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0FwcFN0YXRlUHJvbWlzZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0QXBwU3RhdGUob05hdkhhbmRsZXIub0NvbXBvbmVudCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0b0FwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRcdGxldCBvQXBwRGF0YTogYW55ID0ge307XG5cdFx0XHRcdFx0Y29uc3Qgb0FwcERhdGFMb2FkZWQgPSBvQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YUxvYWRlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0RGF0YUZyb21BcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAob05hdkhhbmRsZXIuX3NNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhID0ge1xuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50OiBcInt9XCIsXG5cdFx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRcdFx0XHRvRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDogbmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0XHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhYmxlVmFyaWFudElkOiBcIlwiLFxuXHRcdFx0XHRcdFx0XHRjdXN0b21EYXRhOiB7fSxcblx0XHRcdFx0XHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleSxcblx0XHRcdFx0XHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudDoge30sXG5cdFx0XHRcdFx0XHRcdHZhbHVlVGV4dHM6IHt9LFxuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY0RhdGVzOiB7fSxcblx0XHRcdFx0XHRcdFx0ZGF0YToge31cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0XHQgKiBJbiBjYXNlIHRoYXQgd2UgZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzdG9yZWQgQXBwRGF0YSAoPXBlcnNpc3RlbmN5KSwgd2UgbmVlZCB0byBzdHJpbmdpZnkgdGhlIEpTT04gb2JqZWN0LlxuXHRcdFx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkKSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLnRhYmxlVmFyaWFudElkID0gb0FwcERhdGFMb2FkZWQudGFibGVWYXJpYW50SWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5jdXN0b21EYXRhID0gb0FwcERhdGFMb2FkZWQuY3VzdG9tRGF0YTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5wcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgPSBvQXBwRGF0YUxvYWRlZC5wcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEudmFsdWVUZXh0cyA9IG9BcHBEYXRhTG9hZGVkLnZhbHVlVGV4dHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5zZW1hbnRpY0RhdGVzID0gb0FwcERhdGFMb2FkZWQuc2VtYW50aWNEYXRlcztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8qIEluIFYyIGNhc2UsIHdlIG5lZWQgdGhlIGRhdGEgaW4gdGhlIGJlbG93IGZvcm1hdCBmb3IgaHlicmlkIGNhc2UgKi9cblx0XHRcdFx0XHRcdGlmIChuYXZUeXBlID09PSBOYXZUeXBlLmh5YnJpZCkge1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5kYXRhID0gb0FwcERhdGFMb2FkZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhID0gbWVyZ2Uob0FwcERhdGEsIG9BcHBEYXRhTG9hZGVkKTtcblx0XHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0XHRcdCAqIEluIGNhc2UgdGhhdCB3ZSBnZXQgYW4gb2JqZWN0IGZyb20gdGhlIHN0b3JlZCBBcHBEYXRhICg9cGVyc2lzdGVuY3kpLCB3ZSBuZWVkIHRvIHN0cmluZ2lmeSB0aGUgSlNPTiBvYmplY3QuXG5cdFx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb05hdkhhbmRsZXIuX2Vuc3VyZVNlbGVjdGlvblZhcmlhbnRGb3JtYXRTdHJpbmcob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcmVzb2x2ZSBpcyBjYWxsZWQgb24gcGFzc2VkIERlZmVycmVkIG9iamVjdCB0byB0cmlnZ2VyIGEgY2FsbCBvZiB0aGUgZG9uZSBtZXRob2QsIGlmIGltcGxlbWVudGVkXG5cdFx0XHRcdFx0Ly8gdGhlIGRvbmUgbWV0aG9kIHdpbGwgcmVjZWl2ZSB0aGUgbG9hZGVkIGFwcFN0YXRlIGFuZCB0aGUgbmF2aWdhdGlvbiB0eXBlIGFzIHBhcmFtZXRlcnNcblx0XHRcdFx0XHRvRGVmZXJyZWQucmVzb2x2ZShvQXBwRGF0YSwge30sIG5hdlR5cGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b0FwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXRBcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0b0RlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBuYXZUeXBlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvQXBwU3RhdGVQcm9taXNlO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jLmZhaWxlZFwiKTtcblx0XHRcdFx0b0RlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBuYXZUeXBlKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9EZWZlcnJlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgc2FwLWlhcHAtc3RhdGUgKHRoZSBpbnRlcm5hbCBhcHBzKSBmcm9tIHRoZSBBcHBIYXNoIHN0cmluZy4gSXQgYXV0b21hdGljYWxseSB0YWtlcyBjYXJlIGFib3V0XG5cdCAqIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgb2xkIGFuZCB0aGUgbmV3IGFwcHJvYWNoIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZS4gUHJlY2VkZW5jZSBpcyB0aGF0IHRoZSBuZXcgYXBwcm9hY2ggaXMgZmF2b3VyZWQgYWdhaW5zdCB0aGUgb2xkXG5cdCAqIGFwcHJvYWNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FwcEhhc2ggVGhlIEFwcEhhc2gsIHdoaWNoIG1heSBjb250YWluIGEgc2FwLWlhcHAtc3RhdGUgcGFyYW1ldGVyIChib3RoIG9sZCBhbmQvb3IgbmV3IGFwcHJvYWNoKVxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2Ygc2FwLWlhcHAtc3RhdGUgKGkuZS4gdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byByZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaW5cblx0ICogICAgICAgICBjYXNlIHRoYXQgbm8gc2FwLWlhcHAtc3RhdGUgd2FzIGZvdW5kIGluIDxjb2RlPnNBcHBIYXNoPC9jb2RlPi5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoOiBzdHJpbmcpIHtcblx0XHQvLyB0cml2aWFsIGNhc2U6IG5vIGFwcCBoYXNoIGF2YWlsYWJsZSBhdCBhbGwuXG5cdFx0aWYgKCFzQXBwSGFzaCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvKiBuZXcgYXBwcm9hY2g6IHNlcGFyYXRlZCB2aWEgcXVlc3Rpb24gbWFyayAvIHBhcnQgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciBvZiB0aGUgQXBwSGFzaCAqL1xuXHRcdGxldCBhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVOZXcuZXhlYyhzQXBwSGFzaCk7XG5cblx0XHQvKiBvbGQgYXBwcm9hY2g6IHNwZWFyYXRlZCB2aWEgc2xhc2hlcyAvIGkuZS4gcGFydCBvZiB0aGUgcm91dGUgaXRzZWxmICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGQuZXhlYyhzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBvbGQgYXBwcm9hY2g6IHNwZWNpYWwgY2FzZTogaWYgdGhlcmUgaXMgbm8gZGVlcCByb3V0ZS9rZXkgZGVmaW5lZCwgdGhlIHNhcC1pYXBwLXN0YXRlIG1heSBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIHdpdGhvdXRcblx0XHQgKiBhbnkgc2VwYXJhdGlvbiB3aXRoIHRoZSBzbGFzaGVzXG5cdFx0ICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LmV4ZWMoc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gKHZhbGlkKSBzYXAtaWFwcC1zdGF0ZSBpbiB0aGUgQXBwIEhhc2hcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFNYXRjaGVzWzFdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIChvciBpbnNlcnRzKSBhIHBhcmFtZXRlciB2YWx1ZSAoYW4gQXBwU3RhdGVLZXkpIGZvciB0aGUgc2FwLWlhcHAtc3RhdGUgaW50byBhbiBleGlzdGluZyBBcHBIYXNoIHN0cmluZy4gT3RoZXIgcm91dGVzL3BhcmFtZXRlcnNcblx0ICogYXJlIGlnbm9yZWQgYW5kIHJldHVybmVkIHdpdGhvdXQgbW9kaWZpY2F0aW9uIChcImVudmlyb25tZW50YWwgYWdub3N0aWNcIiBwcm9wZXJ0eSkuIE9ubHkgdGhlIG5ldyBhcHByb2FjaCAoc2FwLWlhcHAtc3RhdGUgYXMgcXVlcnkgcGFyYW1ldGVyXG5cdCAqIGluIHRoZSBBcHBIYXNoKSBpcyBiZWluZyBpc3N1ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQXBwSGFzaCBUaGUgQXBwSGFzaCBpbnRvIHdoaWNoIHRoZSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgc2hhbGwgYmUgbWFkZSBhdmFpbGFibGVcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUga2V5IHZhbHVlIG9mIHRoZSBBcHBTdGF0ZSB3aGljaCBzaGFsbCBiZSBzdG9yZWQgYXMgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHNBcHBIYXNoIHN0cmluZywgc3VjaCB0aGF0IHRoZSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVlbiBzZXQgYmFzZWQgb24gdGhlIG5ldyAocXVlcnkgb3B0aW9uLWJhc2VkKVxuXHQgKiAgICAgICAgIHNhcC1pYXBwLXN0YXRlLiBJZiBhIHNhcC1pYXBwLXN0YXRlIGhhcyBiZWVuIHNwZWNpZmllZCBiZWZvcmUsIHRoZSBrZXkgaXMgcmVwbGFjZWQuIElmIDxjb2RlPnNBcHBIYXNoPC9jb2RlPiB3YXMgb2YgdGhlIG9sZFxuXHQgKiAgICAgICAgIGZvcm1hdCAoc2FwLWlhcHAtc3RhdGUgYXMgcGFydCBvZiB0aGUga2V5cy9yb3V0ZSksIHRoZSBmb3JtYXQgaXMgY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybWF0IGJlZm9yZSB0aGUgcmVzdWx0IGlzIHJldHVybmVkLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoOiBzdHJpbmcsIHNBcHBTdGF0ZUtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc05ld0lBcHBTdGF0ZSA9IElBUFBfU1RBVEUgKyBcIj1cIiArIHNBcHBTdGF0ZUtleTtcblxuXHRcdC8qXG5cdFx0ICogZ2VuZXJhdGUgc2FwLWlhcHAtc3RhdGVzIHdpdGggdGhlIG5ldyB3YXlcblx0XHQgKi9cblx0XHRpZiAoIXNBcHBIYXNoKSB7XG5cdFx0XHQvLyB0aGVyZSdzIG5vIHNBcHBIYXNoIGtleSB5ZXRcblx0XHRcdHJldHVybiBcIj9cIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyID0gZnVuY3Rpb24gKHNTdWJBcHBIYXNoOiBhbnkpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGFuIEFwcEhhc2ggYXZhaWxhYmxlLCBidXQgaXQgZG9lcyBub3QgY29udGFpbiBhIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciB5ZXQgLSB3ZSBuZWVkIHRvIGFwcGVuZCBvbmVcblxuXHRcdFx0Ly8gbmV3IGFwcHJvYWNoOiB3ZSBuZWVkIHRvIGNoZWNrLCBpZiBhIHNldCBvZiBxdWVyeSBwYXJhbWV0ZXJzIGlzIGFscmVhZHkgYXZhaWxhYmxlXG5cdFx0XHRpZiAoc1N1YkFwcEhhc2guaW5kZXhPZihcIj9cIikgIT09IC0xKSB7XG5cdFx0XHRcdC8vIHRoZXJlIGFyZSBhbHJlYWR5IHF1ZXJ5IHBhcmFtZXRlcnMgYXZhaWxhYmxlIC0gYXBwZW5kIGl0IGFzIGFub3RoZXIgcGFyYW1ldGVyXG5cdFx0XHRcdHJldHVybiBzU3ViQXBwSGFzaCArIFwiJlwiICsgc05ld0lBcHBTdGF0ZTtcblx0XHRcdH1cblx0XHRcdC8vIHRoZXJlIGFyZSBubyBhIHF1ZXJ5IHBhcmFtZXRlcnMgYXZhaWxhYmxlIHlldDsgY3JlYXRlIGEgc2V0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyXG5cdFx0XHRyZXR1cm4gc1N1YkFwcEhhc2ggKyBcIj9cIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0fTtcblxuXHRcdGlmICghdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCkpIHtcblx0XHRcdHJldHVybiBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIoc0FwcEhhc2gpO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBpcyBhbiBBcHBIYXNoIGF2YWlsYWJsZSBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhbiBzYXAtaWFwcC1zdGF0ZSBpbiB0aGUgQXBwSGFzaFxuXG5cdFx0aWYgKHRoaXMuX3JJQXBwU3RhdGVOZXcudGVzdChzQXBwSGFzaCkpIHtcblx0XHRcdC8vIHRoZSBuZXcgYXBwcm9hY2ggaXMgYmVpbmcgdXNlZFxuXHRcdFx0cmV0dXJuIHNBcHBIYXNoLnJlcGxhY2UodGhpcy5fcklBcHBTdGF0ZU5ldywgZnVuY3Rpb24gKHNOZWVkbGU6IHN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gc05lZWRsZS5yZXBsYWNlKC9bPV0uKi9naSwgXCI9XCIgKyBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG9sZCBBcHBIYXNoIGVudGlyZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBuZXcgb25lLlxuXG5cdFx0Y29uc3QgZm5SZXBsYWNlT2xkQXBwcm9hY2ggPSBmdW5jdGlvbiAock9sZEFwcHJvYWNoOiBhbnksIHNTdWJBcHBIYXNoOiBhbnkpIHtcblx0XHRcdHNTdWJBcHBIYXNoID0gc1N1YkFwcEhhc2gucmVwbGFjZShyT2xkQXBwcm9hY2gsIFwiXCIpO1xuXHRcdFx0cmV0dXJuIGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlcihzU3ViQXBwSGFzaCk7XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkLnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5SZXBsYWNlT2xkQXBwcm9hY2godGhpcy5fcklBcHBTdGF0ZU9sZCwgc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydC50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuUmVwbGFjZU9sZEFwcHJvYWNoKHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LCBzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0KGZhbHNlLCBcImludGVybmFsIGluY29uc2lzdGVuY3k6IEFwcHJvYWNoIG9mIHNhcC1pYXBwLXN0YXRlIG5vdCBrbm93biwgYnV0IF9nZXRJbm5lckFwcFN0YXRlS2V5IHJldHVybmVkIGl0XCIpO1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KHZTZWxlY3Rpb25WYXJpYW50OiBhbnkpIHtcblx0XHRjb25zdCBtVVJMUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBvU2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdGlmICh0eXBlb2YgdlNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQodlNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IHZTZWxlY3Rpb25WYXJpYW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdC8vIGFkZCBVUkxzIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgKGlmIHNpbmdsZSB2YWx1ZSlcblx0XHRjb25zdCBhU2VsZWN0UHJvcGVydGllcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxlY3RQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBhU2VsZWN0T3B0aW9ucyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsZWN0UHJvcGVydGllc1tpXSk7XG5cdFx0XHRpZiAoYVNlbGVjdE9wdGlvbnMubGVuZ3RoID09PSAxICYmIGFTZWxlY3RPcHRpb25zWzBdLlNpZ24gPT09IFwiSVwiICYmIGFTZWxlY3RPcHRpb25zWzBdLk9wdGlvbiA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FTZWxlY3RQcm9wZXJ0aWVzW2ldXSA9IGFTZWxlY3RPcHRpb25zWzBdLkxvdztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhZGQgcGFyYW1ldGVycyBmcm9tIFNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyc1xuXHRcdGNvbnN0IGFQYXJhbWV0ZXJOYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlck5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFQYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc1BhcmFtZXRlclZhbHVlID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyKGFQYXJhbWV0ZXJOYW1lc1tpXSk7XG5cblx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FQYXJhbWV0ZXJOYW1lc1tpXV0gPSBzUGFyYW1ldGVyVmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiBtVVJMUGFyYW1ldGVycztcblx0fVxuXG5cdF9jcmVhdGVUZWNobmljYWxFcnJvcihzRXJyb3JDb2RlOiBhbnkpIHtcblx0XHRyZXR1cm4gbmV3IE5hdkVycm9yKHNFcnJvckNvZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG1vZGVsIHRoYXQgaXMgdXNlZCBmb3IgdmVyaWZpY2F0aW9uIG9mIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gSWYgdGhlIG1vZGVsIGlzIG5vdCBzZXQsIHRoZSB1bm5hbWVkIGNvbXBvbmVudCBtb2RlbCBpcyB1c2VkIGZvciB0aGVcblx0ICogdmVyaWZpY2F0aW9uIG9mIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0gb01vZGVsIEZvciBjaGVja2luZyBzZW5zaXRpdmUgaW5mb3JtYXRpb25cblx0ICovXG5cdHNldE1vZGVsKG9Nb2RlbDogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKSB7XG5cdFx0dGhpcy5fb01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0X2dldE1vZGVsKCk6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuX29Nb2RlbCB8fCB0aGlzLm9Db21wb25lbnQuZ2V0TW9kZWwoKTtcblx0fVxuXG5cdF9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9EYXRhOiBhbnkpIHtcblx0XHRpZiAob0RhdGEpIHtcblx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0RhdGEudmFsdWVUZXh0cykge1xuXHRcdFx0XHRvRGF0YS52YWx1ZVRleHRzID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9EYXRhLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0b0RhdGEuc2VtYW50aWNEYXRlcyA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVByb3BlcnRpZXMoYUZpbHRlck5hbWU6IGFueSwgYVBhcmFtZXRlck5hbWU6IGFueSwgb0RhdGE6IGFueSkge1xuXHRcdGlmIChhRmlsdGVyTmFtZS5sZW5ndGggJiYgb0RhdGEgJiYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgfHwgb0RhdGEudmFsdWVUZXh0cyB8fCBvRGF0YS5zZW1hbnRpY0RhdGVzKSkge1xuXHRcdFx0YUZpbHRlck5hbWUuZm9yRWFjaChmdW5jdGlvbiAoc05hbWU6IGFueSkge1xuXHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB7XG5cdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9EYXRhLnZhbHVlVGV4dHMgJiYgb0RhdGEudmFsdWVUZXh0cy5UZXh0cykge1xuXHRcdFx0XHRcdG9EYXRhLnZhbHVlVGV4dHMuVGV4dHMuZm9yRWFjaChmdW5jdGlvbiAob1RleHRzOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvVGV4dHMuUHJvcGVydHlUZXh0cykge1xuXHRcdFx0XHRcdFx0XHRvVGV4dHMuUHJvcGVydHlUZXh0cy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvVGV4dHMuUHJvcGVydHlUZXh0cy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9EYXRhLnNlbWFudGljRGF0ZXMgJiYgb0RhdGEuc2VtYW50aWNEYXRlcy5EYXRlcykge1xuXHRcdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAob0RhdGVzOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvRGF0ZXMuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoYVBhcmFtZXRlck5hbWUubGVuZ3RoICYmIG9EYXRhICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRhUGFyYW1ldGVyTmFtZS5mb3JFYWNoKGZ1bmN0aW9uIChzTmFtZTogYW55KSB7XG5cdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lIHx8IFwiJFBhcmFtZXRlci5cIiArIHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eTogYW55LCBzVGVybTogYW55KSB7XG5cdFx0Y29uc3QgZklzVGVybURlZmF1bHRUcnVlID0gZnVuY3Rpb24gKG9UZXJtOiBhbnkpIHtcblx0XHRcdGlmIChvVGVybSkge1xuXHRcdFx0XHRyZXR1cm4gb1Rlcm0uQm9vbCA/IG9UZXJtLkJvb2wgIT09IFwiZmFsc2VcIiA6IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHJldHVybiAhIW9Qcm9wZXJ0eVtzVGVybV0gJiYgZklzVGVybURlZmF1bHRUcnVlKG9Qcm9wZXJ0eVtzVGVybV0pO1xuXHR9XG5cblx0X2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5faXNUZXJtVHJ1ZShvUHJvcGVydHksIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiKTtcblx0fVxuXG5cdF9pc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCIpO1xuXHR9XG5cblx0X2lzTWVhc3VyZVByb3BlcnR5KG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCIpO1xuXHR9XG5cblx0X2lzVG9CZUV4Y2x1ZGVkKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1Byb3BlcnR5KSB8fCB0aGlzLl9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0KG9Qcm9wZXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCBjcmVhdGVzIGEgY29udGV4dCB1cmwgYmFzZWQgb24gcHJvdmlkZWQgZGF0YS4gVGhpcyBjb250ZXh0IHVybCBjYW4gZWl0aGVyIGJlIHVzZWQgYXNcblx0ICoge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyI3NldFBhcmFtZXRlckNvbnRleHRVcmwgUGFyYW1ldGVyQ29udGV4dFVybH0gb3Jcblx0ICoge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyI3NldEZpbHRlckNvbnRleHRVcmwgRmlsdGVyQ29udGV4dFVybH0uXG5cdCAqXG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0TmFtZSBVc2VkIGZvciB1cmwgZGV0ZXJtaW5hdGlvblxuXHQgKiBAcGFyYW0gW29Nb2RlbF0gVXNlZCBmb3IgdXJsIGRldGVybWluYXRpb24uIElmIG9taXR0ZWQsIHRoZSBOYXZpZ2F0aW9uSGFuZGxlciBtb2RlbCBpcyB1c2VkLlxuXHQgKiBAdGhyb3dzIEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaW4gY2FzZSBvZiBtaXNzaW5nIG9yIHdyb25nIHBhc3NlZCBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHVybCBmb3IgdGhlIGdpdmVuIGVudGl0aWVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdGNvbnN0cnVjdENvbnRleHRVcmwoc0VudGl0eVNldE5hbWU6IHN0cmluZywgb01vZGVsPzogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRpZiAoIXNFbnRpdHlTZXROYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5OT19FTlRJVFlfU0VUX1BST1ZJREVEXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpICsgXCIjXCIgKyBzRW50aXR5U2V0TmFtZTtcblx0fVxuXG5cdF9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbDogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRsZXQgc1NlcnZlclVybDtcblxuXHRcdGlmIChvTW9kZWwuaXNBPFYyT0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0c1NlcnZlclVybCA9IG9Nb2RlbC5fZ2V0U2VydmVyVXJsKCk7XG5cdFx0fSBlbHNlIGlmIChvTW9kZWwuaXNBPFY0T0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0Y29uc3Qgb1NlcnZpY2VVUkkgPSBuZXcgVVJJKG9Nb2RlbC5nZXRTZXJ2aWNlVXJsKCkpLmFic29sdXRlVG8oZG9jdW1lbnQuYmFzZVVSSSk7XG5cdFx0XHRzU2VydmVyVXJsID0gbmV3IFVSSShcIi9cIikuYWJzb2x1dGVUbyhvU2VydmljZVVSSSkudG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHRpZiAoc1NlcnZlclVybCAmJiBzU2VydmVyVXJsLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc1NlcnZlclVybC5sZW5ndGggLSAxKSB7XG5cdFx0XHRzU2VydmVyVXJsID0gc1NlcnZlclVybC5zdWJzdHIoMCwgc1NlcnZlclVybC5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc1NlcnZlclVybCArIG9Nb2RlbC5zU2VydmljZVVybCArIFwiLyRtZXRhZGF0YVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdmVyaWZpZXMsIGlmIGFueSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMvZmlsdGVycyBhcmUgbWFya2VkIGFzIHNlbnNpdGl2ZSwgYW5kIGlmIHRoaXMgaXMgdGhlIGNhc2UgcmVtb3ZlIHRob3NlIGZyb20gdGhlIGFwcFxuXHQgKiBkYXRhLiA8Yj5Ob3RlOjwvYj4gVG8gdXNlIHRoaXMgbWV0aG9kLCB0aGUgbWV0YWRhdGEgbXVzdCBiZSBsb2FkZWQgZmlyc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRGF0YSBXaXRoIHBvdGVudGlhbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gKGZvciBPRGF0YSwgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNpbmdcblx0ICogPGNvZGU+b1NlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk8L2NvZGU+IG11c3QgYmUgdXNlZCksIHdpdGggdGhlIDxjb2RlPkZpbHRlckNvbnRleHRVcmw8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcmFtZXRlckNvbnRleHRVcmw8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBEYXRhIHdpdGhvdXQgcHJvcGVydGllcyBtYXJrZWQgYXMgc2Vuc2l0aXZlIG9yIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgT0RhdGEgbWV0YWRhdGEgaXMgbm90IGZ1bGx5IGxvYWRlZCB5ZXRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob0RhdGE6IGFueSkge1xuXHRcdGxldCBvQWRhcHRlZERhdGEgPSBvRGF0YTtcblx0XHRpZiAoXG5cdFx0XHRvRGF0YSAmJlxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJlxuXHRcdFx0KChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fFxuXHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycykpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0Y29uc3QgYVNlbnNpdGl2ZUZpbHRlck5hbWUgPSBbXTtcblx0XHRcdFx0Y29uc3QgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUgPSBbXTtcblx0XHRcdFx0bGV0IGksXG5cdFx0XHRcdFx0b0VudGl0eVNldDogYW55LFxuXHRcdFx0XHRcdG9FbnRpdHlEZWY6IGFueSxcblx0XHRcdFx0XHRvU3ViRW50aXR5RGVmOiBhbnksXG5cdFx0XHRcdFx0b0VuZFJvbGU6IGFueSxcblx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBbXSxcblx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IFtdO1xuXG5cdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGlmIChvTW9kZWwuZ2V0U2VydmljZU1ldGFkYXRhKCkgJiYgb01ldGFNb2RlbD8ub01vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZiAmJiBvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlRmlsdGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRW5kUm9sZSA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZChvRW50aXR5RGVmLCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghb0VuZFJvbGUgfHwgb0VuZFJvbGUudHlwZSA9PT0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGVuZCByb2xlIGhhcyBjYXJkaW5hbGl0eSAwLi4xIG9yIDFcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMVwiIHx8IG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIwLi4xXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1N1YkVudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbmRSb2xlLnR5cGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1N1YkVudGl0eURlZiAmJiBvU3ViRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBvU3ViRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZUZpbHRlck5hbWUucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lICsgXCIuXCIgKyBvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdLm5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFQYXJhbUNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYVBhcmFtQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoYVNlbnNpdGl2ZUZpbHRlck5hbWUubGVuZ3RoIHx8IGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0b0FkYXB0ZWREYXRhID0gZXh0ZW5kKHRydWUgYXMgYW55LCB7fSwgb0FkYXB0ZWREYXRhKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydGllcyhhU2Vuc2l0aXZlRmlsdGVyTmFtZSwgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUsIG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9BZGFwdGVkRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9BZGFwdGVkRGF0YTtcblx0fVxuXG5cdF9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvQXBwRGF0YTogYW55KSB7XG5cdFx0bGV0IG9BcHBEYXRhRm9yU2F2ZSA9IG9BcHBEYXRhO1xuXG5cdFx0aWYgKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdC8qXG5cdFx0XHQgKiBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBTZWxlY3Rpb24gVmFyaWFudHMgbmVlZCB0byBiZSBKU09OIG9iamVjdHMuIEhvd2V2ZXIsIGludGVybmFsbHksIHdlIHdvcmsgd2l0aCBzdHJpbmdzIGZvclxuXHRcdFx0ICogXCJzZWxlY3Rpb25WYXJpYW50XCIuIFRoZXJlZm9yZSwgaW4gY2FzZSB0aGF0IHRoaXMgaXMgYSBzdHJpbmcsIHdlIG5lZWQgdG8gSlNPTi1wYXJzZSB0aGUgZGF0YS5cblx0XHRcdCAqL1xuXHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnBhcnNlKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IF9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiBwYXJzZSBlcnJvclwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSB0aGlzLl9yZW1vdmVNZWFzdXJlQmFzZWRQcm9wZXJ0aWVzKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9BcHBEYXRhRm9yU2F2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHZlcmlmaWVzIGlmIGFueSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMvZmlsdGVycyBhcmUgbWFya2VkIGFzIGEgbWVhc3VyZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB4YXBwXG5cdCAqIGFwcCBkYXRhLiA8Yj5Ob3RlOjwvYj4gVG8gdXNlIHRoaXMgbWV0aG9kLCB0aGUgbWV0YWRhdGEgbXVzdCBiZSBsb2FkZWQgZmlyc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRGF0YSBXaXRoIHBvdGVudGlhbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gKGZvciBPRGF0YSwgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNpbmdcblx0ICogPGNvZGU+b1NlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk8L2NvZGU+IG11c3QgYmUgdXNlZCksIHdpdGggdGhlIDxjb2RlPkZpbHRlckNvbnRleHRVcmw8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcmFtZXRlckNvbnRleHRVcmw8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBEYXRhIHdpdGhvdXQgcHJvcGVydGllcyBtYXJrZWQgYXMgbWVhc3VyZXMgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBPRGF0YSBtZXRhZGF0YSBpcyBub3QgZnVsbHkgbG9hZGVkIHlldFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMob0RhdGE6IGFueSkge1xuXHRcdGxldCBvQWRhcHRlZERhdGEgPSBvRGF0YTtcblx0XHRjb25zdCBhTWVhc3VyZUZpbHRlck5hbWUgPSBbXTtcblx0XHRjb25zdCBhTWVhc3VyZVBhcmFtZXRlck5hbWUgPSBbXTtcblx0XHRsZXQgaSxcblx0XHRcdG9Nb2RlbCxcblx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRvRW50aXR5U2V0OiBhbnksXG5cdFx0XHRvRW50aXR5RGVmOiBhbnksXG5cdFx0XHRvU3ViRW50aXR5RGVmOiBhbnksXG5cdFx0XHRvRW5kUm9sZTogYW55LFxuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gW10sXG5cdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IFtdO1xuXG5cdFx0aWYgKFxuXHRcdFx0b0RhdGEgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiZcblx0XHRcdCgob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykgfHxcblx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMpKVxuXHRcdCkge1xuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGlmIChvTW9kZWwuZ2V0U2VydmljZU1ldGFkYXRhKCkgJiYgb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLm9Nb2RlbCkge1xuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYgJiYgb0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVGaWx0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FbmRSb2xlID0gb01ldGFNb2RlbC5nZXRPRGF0YUFzc29jaWF0aW9uRW5kKG9FbnRpdHlEZWYsIG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvRW5kUm9sZSB8fCBvRW5kUm9sZS50eXBlID09PSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgZW5kIHJvbGUgaGFzIGNhcmRpbmFsaXR5IDAuLjEgb3IgMVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIxXCIgfHwgb0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjAuLjFcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvU3ViRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VuZFJvbGUudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvU3ViRW50aXR5RGVmICYmIG9TdWJFbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG9TdWJFbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc01lYXN1cmVQcm9wZXJ0eShvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVhc3VyZUZpbHRlck5hbWUucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lICsgXCIuXCIgKyBvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdLm5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFQYXJhbUNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYVBhcmFtQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlUGFyYW1ldGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFNZWFzdXJlRmlsdGVyTmFtZS5sZW5ndGggfHwgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly8gVFE6IG5lZWRzIGF0dGVudGlvblxuXHRcdFx0XHRcdFx0b0FkYXB0ZWREYXRhID0gZXh0ZW5kKHRydWUgYXMgYW55LCB7fSwgb0FkYXB0ZWREYXRhKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydGllcyhhTWVhc3VyZUZpbHRlck5hbWUsIGFNZWFzdXJlUGFyYW1ldGVyTmFtZSwgb0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYW5ub3RhdGlvbnMgYXJlIG5vdCBsb2FkZWRcblxuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUFsbFByb3BlcnRpZXMob0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogb01ldGFkYXRhIGFyZSBub3QgZnVsbHkgbG9hZGVkIVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQob0FkYXB0ZWREYXRhLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9BZGFwdGVkRGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHNlbnNpdGl2ZSBkYXRhIGZyb20gdGhlIG5hdmlnYXRpb24gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9EYXRhIFNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIEBwYXJhbSBiTWVhc3VyZSBTaG91bGQgbWVhc3VyZXMgYmUgcmVtb3ZlZFxuXHQgKiBAcmV0dXJucyBUaGUgc2VsZWN0aW9uIHZhcmlhbnQgYWZ0ZXIgc2Vuc2l0aXZlIGRhdGEgaGFzIGJlZW4gcmVtb3ZlZFxuXHQgKi9cblx0X3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9EYXRhOiBhbnksIGJNZWFzdXJlPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcyxcblx0XHRcdG9TViA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQpLFxuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRsZXQgYUZpbHRlckNvbnRleHRQYXJ0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghb01vZGVsLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChcIi9cIikpIHtcblx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9EYXRhKTtcblx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0cmV0dXJuIG9EYXRhO1xuXHRcdH1cblxuXHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Py5sZW5ndGggPT09IDIgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyAmJlxuXHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYUZpbHRlckNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdCkge1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5jb250ZXh0XCIpO1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIik7XG5cdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKFwiU0FQX19NZXNzYWdlc1wiKTtcblxuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IGFGaWx0ZXJDb250ZXh0UGFydFsxXSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YVByb3BlcnR5TmFtZXMgPSBvU1YuZ2V0UHJvcGVydHlOYW1lcygpIHx8IFtdLFxuXHRcdFx0XHRmbklzU2Vuc2l0aXZlRGF0YSA9IGZ1bmN0aW9uIChzUHJvcDogYW55LCBlc05hbWU6IGFueSkge1xuXHRcdFx0XHRcdGVzTmFtZSA9IGVzTmFtZSB8fCBzRW50aXR5U2V0O1xuXHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eUFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIgKyBlc05hbWUgKyBcIi9cIiArIHNQcm9wICsgXCJAXCIpO1xuXHRcdFx0XHRcdGlmIChhUHJvcGVydHlBbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQoYk1lYXN1cmUgJiYgYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIl0pIHx8XG5cdFx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhKGFQcm9wZXJ0eUFubm90YXRpb25zKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRyb2wgPSBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdO1xuXHRcdFx0XHRcdFx0XHRpZiAob0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdICYmIG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXS5zcGxpdChcIi9cIilbMV0gPT09IFwiSW5hcHBsaWNhYmxlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH07XG5cblx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgYVByb3BlcnR5TmFtZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gYVByb3BlcnR5TmFtZXNba107XG5cdFx0XHRcdC8vIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXRcblx0XHRcdFx0aWYgKGZuSXNTZW5zaXRpdmVEYXRhKHNQcm9wZXJ0eSwgc0VudGl0eVNldCkpIHtcblx0XHRcdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKHNQcm9wZXJ0eSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU1YudG9KU09OT2JqZWN0KCk7XG5cdFx0fVxuXHRcdHJldHVybiBvRGF0YTtcblx0fVxuXG5cdF9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhKGFQcm9wZXJ0eUFubm90YXRpb25zOiBhbnkpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmVcIl0gfHxcblx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIl1cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSAodGhlIGludGVybmFsIGFwcHMpIGZyb20gdGhlIEFwcEhhc2ggc3RyaW5nLiBJdCBhdXRvbWF0aWNhbGx5IHRha2VzIGNhcmUgYWJvdXRcblx0ICogY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBvbGQgYW5kIHRoZSBuZXcgYXBwcm9hY2ggb2YgdGhlIHNhcC1pYXBwLXN0YXRlLiBQcmVjZWRlbmNlIGlzIHRoYXQgdGhlIG5ldyBhcHByb2FjaCBpcyBmYXZvdXJlZCBhZ2FpbnN0IHRoZSBvbGRcblx0ICogYXBwcm9hY2guXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiBzYXAtaWFwcC1zdGF0ZSAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzKSwgb3IgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBpblxuXHQgKiAgICAgICAgIGNhc2UgdGhhdCBubyBzYXAtaWFwcC1zdGF0ZSB3YXMgZm91bmQgaW4gPGNvZGU+c0FwcEhhc2g8L2NvZGU+LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0SUFwcFN0YXRlS2V5KCkge1xuXHRcdGNvbnN0IHNBcHBIYXNoID0gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdFx0cmV0dXJuIHRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpO1xuXHR9XG59XG5cbi8vIEV4cG9ydGluZyB0aGUgY2xhc3MgYXMgcHJvcGVybHkgdHlwZWQgVUk1Q2xhc3NcblxuY29uc3QgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyA9IEJhc2VPYmplY3QuZXh0ZW5kKFxuXHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCIsXG5cdE5hdmlnYXRpb25IYW5kbGVyLnByb3RvdHlwZSBhcyBhbnlcbikgYXMgdHlwZW9mIE5hdmlnYXRpb25IYW5kbGVyO1xudHlwZSBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzID0gSW5zdGFuY2VUeXBlPHR5cGVvZiBOYXZpZ2F0aW9uSGFuZGxlcj47XG5leHBvcnQgZGVmYXVsdCBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7O0VBdURBO0VBQ0EsTUFBTUEsT0FBTyxHQUFHQyxVQUFV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
|
|
@@ -699,7 +699,8 @@ export class NavigationHandler extends BaseObject {
|
|
|
699
699
|
oMyDeferred.resolve(oAppStateData, oStartupParameters, navType);
|
|
700
700
|
};
|
|
701
701
|
const failureHandlerHybridState = function (error: object, _ref: object, navType: string): void {
|
|
702
|
-
|
|
702
|
+
error = oNavHandler._createTechnicalError("NavigationHandler.getAppState.failed");
|
|
703
|
+
oMyDeferred.reject(error, _ref, navType);
|
|
703
704
|
};
|
|
704
705
|
if (hybridIAppStateKeyParams !== undefined && iAppStateHybridDeferred !== undefined) {
|
|
705
706
|
iAppStateHybridDeferred.done(successHandlerHybridState);
|
|
@@ -93,7 +93,7 @@ sap.ui.define(["sap/ui/core/Core", "sap/ui/core/library"], function (Core, _libr
|
|
|
93
93
|
const thisLib = Core.initLibrary({
|
|
94
94
|
name: "sap.fe.navigation",
|
|
95
95
|
// eslint-disable-next-line no-template-curly-in-string
|
|
96
|
-
version: "1.120.
|
|
96
|
+
version: "1.120.18",
|
|
97
97
|
dependencies: ["sap.ui.core"],
|
|
98
98
|
types: ["sap.fe.navigation.NavType", "sap.fe.navigation.ParamHandlingMode", "sap.fe.navigation.SuppressionBehavior"],
|
|
99
99
|
interfaces: [],
|