@sapui5/sap.fe.core 1.136.3 → 1.136.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +3 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +6 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -5
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +19 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +4 -3
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +10 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +6 -5
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +8 -4
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -3
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +6 -2
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +4 -17
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -19
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +15 -1
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +18 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +4 -4
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +3 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle_ar.properties +2 -0
- package/src/sap/fe/core/messagebundle_bg.properties +2 -0
- package/src/sap/fe/core/messagebundle_ca.properties +2 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
- package/src/sap/fe/core/messagebundle_cs.properties +2 -0
- package/src/sap/fe/core/messagebundle_cy.properties +2 -0
- package/src/sap/fe/core/messagebundle_da.properties +2 -0
- package/src/sap/fe/core/messagebundle_de.properties +2 -0
- package/src/sap/fe/core/messagebundle_el.properties +2 -0
- package/src/sap/fe/core/messagebundle_en.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
- package/src/sap/fe/core/messagebundle_es.properties +3 -1
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
- package/src/sap/fe/core/messagebundle_et.properties +2 -0
- package/src/sap/fe/core/messagebundle_fi.properties +2 -0
- package/src/sap/fe/core/messagebundle_fr.properties +2 -0
- package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -0
- package/src/sap/fe/core/messagebundle_hi.properties +2 -0
- package/src/sap/fe/core/messagebundle_hr.properties +2 -0
- package/src/sap/fe/core/messagebundle_hu.properties +2 -0
- package/src/sap/fe/core/messagebundle_id.properties +2 -0
- package/src/sap/fe/core/messagebundle_it.properties +2 -0
- package/src/sap/fe/core/messagebundle_iw.properties +2 -0
- package/src/sap/fe/core/messagebundle_ja.properties +2 -0
- package/src/sap/fe/core/messagebundle_kk.properties +2 -0
- package/src/sap/fe/core/messagebundle_ko.properties +2 -0
- package/src/sap/fe/core/messagebundle_lt.properties +2 -0
- package/src/sap/fe/core/messagebundle_lv.properties +2 -0
- package/src/sap/fe/core/messagebundle_mk.properties +2 -0
- package/src/sap/fe/core/messagebundle_ms.properties +2 -0
- package/src/sap/fe/core/messagebundle_nl.properties +2 -0
- package/src/sap/fe/core/messagebundle_no.properties +2 -0
- package/src/sap/fe/core/messagebundle_pl.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
- package/src/sap/fe/core/messagebundle_ro.properties +2 -0
- package/src/sap/fe/core/messagebundle_ru.properties +2 -0
- package/src/sap/fe/core/messagebundle_sh.properties +2 -0
- package/src/sap/fe/core/messagebundle_sk.properties +2 -0
- package/src/sap/fe/core/messagebundle_sl.properties +2 -0
- package/src/sap/fe/core/messagebundle_sr.properties +2 -0
- package/src/sap/fe/core/messagebundle_sv.properties +2 -0
- package/src/sap/fe/core/messagebundle_th.properties +2 -0
- package/src/sap/fe/core/messagebundle_tr.properties +2 -0
- package/src/sap/fe/core/messagebundle_uk.properties +2 -0
- package/src/sap/fe/core/messagebundle_vi.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +2 -1
|
@@ -799,6 +799,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
799
799
|
*/;
|
|
800
800
|
_proto.saveDocument = async function saveDocument(context, appComponent, resourceModel, executeSideEffectsOnError, bindingsForSideEffects, messageHandler, isNewObject) {
|
|
801
801
|
let skipConfirmationMsg = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
|
|
802
|
+
let isStandardSave = arguments.length > 8 ? arguments[8] : undefined;
|
|
802
803
|
const sProgrammingModel = this.getProgrammingModel(context);
|
|
803
804
|
if (sProgrammingModel !== ProgrammingModel.Sticky && sProgrammingModel !== ProgrammingModel.Draft) {
|
|
804
805
|
throw new Error("Save is only allowed for draft or sticky session supported services");
|
|
@@ -808,9 +809,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
808
809
|
const entitySetName = this.getCollectionNameFromContext(context);
|
|
809
810
|
const oActiveDocument = sProgrammingModel === ProgrammingModel.Draft ? await draft.activateDocument(context, appComponent, messageHandler, {
|
|
810
811
|
resourceModel: resourceModel
|
|
811
|
-
}) : await sticky.activateDocument(context, appComponent, messageHandler, {
|
|
812
|
+
}, isStandardSave) : await sticky.activateDocument(context, appComponent, messageHandler, {
|
|
812
813
|
resourceModel: resourceModel
|
|
813
|
-
});
|
|
814
|
+
}, isStandardSave);
|
|
814
815
|
const messagesReceived = messageHandling.getMessages().concat(messageHandling.getMessages(true, true)); // get unbound and bound messages present in the model
|
|
815
816
|
if (!skipConfirmationMsg && !(messagesReceived.length === 1 && messagesReceived[0].getType() === MessageType.Success)) {
|
|
816
817
|
// show our object creation toast only if it is not coming from backend
|
|
@@ -1302,4 +1303,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/UIProvide
|
|
|
1302
1303
|
const singleton = new TransactionHelper();
|
|
1303
1304
|
return singleton;
|
|
1304
1305
|
}, false);
|
|
1305
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiYmluZGluZ1BhdGgiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsInN0YXJ0c1dpdGgiLCJpbmNsdWRlcyIsImZpcnN0TmF2Iiwic3BsaXQiLCJwYXJlbnRQYXRoIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJnZXRIZWFkZXJDb250ZXh0IiwiZGVmYXVsdEZ1bmN0aW9uUGF0aCIsImdldE1ldGFQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aCIsImRlZmF1bHRGdW5jdGlvblJlc3VsdCIsImlzQm91bmQiLCJvcGVyYXRpb25zIiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJ0b1N0cmluZyIsImNhbGxGdW5jdGlvbkltcG9ydCIsImdldE9iamVjdCIsImlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwiLCJnZXRBZ2dyZWdhdGlvbiIsImhpZXJhcmNoeVF1YWxpZmllciIsImlzTGlzdEJpbmRpbmdBbmFseXRpY2FsIiwiYWdncmVnYXRpb24iLCJjcmVhdGVDb250ZXh0IiwiaW5pdGlhbERhdGEiLCJvcHRpb25zIiwiZGF0YUZvckNyZWF0aW9uIiwibGlzdEJpbmRpbmdGb3JDcmVhdGlvbiIsInBhcmVudENvbnRleHQiLCJpc0V4cGFuZGVkIiwiZXhwYW5kIiwiT2JqZWN0IiwiYXNzaWduIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJnZXRHcm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm9iamVjdFBhdGgiLCJwYXJlbnROYXZpZ2F0aW9uIiwidGFyZ2V0RW50aXR5VHlwZSIsIkFnZ3JlZ2F0aW9uIiwiUGFyZW50TmF2aWdhdGlvblByb3BlcnR5IiwidmFsdWUiLCJFcnJvciIsInBhcmVudEJpbmRpbmdEYXRhIiwiY3JlYXRlIiwiY3JlYXRlQXRFbmQiLCJjcmVhdGVJbmFjdGl2ZSIsImdldENyZWF0aW9uUGFyYW1ldGVycyIsImNyZWF0ZURhdGEiLCJtZXRhUGF0aCIsIm5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsImdldENyZWF0ZVBvcHVwRmllbGRzIiwiZmlsdGVyIiwiZmllbGROYW1lIiwiY3JlYXRlRG9jdW1lbnQiLCJtYWluTGlzdEJpbmRpbmciLCJpblBhcmFtZXRlcnMiLCJyZXNvdXJjZU1vZGVsIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwibmV3RG9jdW1lbnRDb250ZXh0IiwicGFyYW1ldGVycyIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRCdXN5UGF0aCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiaW5hY3RpdmUiLCJtZXNzYWdlSGFuZGxpbmdLZXkiLCJyZWdpc3RlclRvSG9sZE1lc3NhZ2VzIiwicGVyZm9ybUNyZWF0aW9uIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsInVuSG9sZEtleSIsImVycm9yIiwiQ29uc3RhbnRzIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJidXN5TW9kZSIsImJ1c3lJZCIsImNyZWF0ZURvY3VtZW50Q29udGV4dCIsImNyZWF0ZVBhcmFtZXRlcnMiLCJlbnRyaWVzIiwibWFwIiwiX3JlZiIsImtleSIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiTG9nIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJyZWR1Y2UiLCJyZXN1bHQiLCJjdXJyZW50T2JqZWN0IiwiY3JlYXRlUHJvbWlzZSIsIkNvbW1vblV0aWxzIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwic3VibWl0QmF0Y2giLCJjcmVhdGVIYXNoIiwiZ2V0Um91dGVyUHJveHkiLCJnZXRIYXNoIiwiY29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJzdGFydHVwUGFyYW1ldGVycyIsIm5ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJwZXJmb3JtQ3JlYXRpb25XaXRoQWN0aW9uIiwic3RhdHVzIiwicmVhc29uIiwicmV0dXJuZWRDb250ZXh0IiwicGVyZm9ybUNyZWF0aW9uV2l0aFBPU1QiLCJhY3Rpb25OYW1lIiwiaGVhZGVyQ29udGV4dFBhdGgiLCJtZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJzZWxlY3RlZFByb3BlcnRpZXMiLCJwdXNoIiwiam9pbiIsImNhbGxBY3Rpb24iLCJjb250ZXh0cyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJsYWJlbCIsIl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsIiwidmlldyIsImlzQ3JlYXRlQWN0aW9uIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSIsImNhbkhhdmVEaWFsb2ciLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIklubGluZSIsImNyZWF0aW9uRGlhbG9nRmllbGRzIiwiQ3JlYXRpb25EaWFsb2ciLCJmb3JFYWNoIiwiY3JlYXRlV2l0aERpYWxvZyIsIndhaXRGb3JDcmVhdGVDb21wbGV0aW9uIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsIm1zZyIsIm1lc3NhZ2UiLCJfaXNEcmFmdEVuYWJsZWQiLCJ2Q29udGV4dHMiLCJjb250ZXh0Rm9yRHJhZnRNb2RlbCIsInNQcm9ncmFtbWluZ01vZGVsIiwiZGVsZXRlRG9jdW1lbnQiLCJjb250ZXh0c1RvRGVsZXRlIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlyc3RDb250ZXh0Iiwic2VsZWN0ZWRDb250ZXh0cyIsInJlamVjdCIsImRyYWZ0RW5hYmxlZCIsIml0ZW1zIiwidW5TYXZlZENvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0Q29sbGVjdGlvbk5hbWVGcm9tQ29udGV4dCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxvY2tlZENvbnRleHQiLCJmaW5kIiwiY29udGV4dERhdGEiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5IiwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEiLCJJblByb2Nlc3NCeVVzZXIiLCJEcmFmdElzQ3JlYXRlZEJ5TWUiLCJsb2NraW5nVXNlck5hbWUiLCJNZXNzYWdlQm94Iiwic2hvdyIsImdldFRleHQiLCJ0aXRsZSIsIm9uQ2xvc2UiLCJub25UYWJsZVR4dCIsInVuU2F2ZWRDb250ZXh0VXNlciIsImRlc2NyaXB0aW9uIiwidHlwZSIsImRlbGV0YWJsZUNvbnRleHRzIiwidGV4dCIsInNlbGVjdGVkIiwiVEVYVCIsInRvdGFsRGVsZXRhYmxlIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJ1blNhdmVkQ29udGV4dHMiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJnZXROb25EZWxldGFibGVUZXh0Iiwib3B0aW9uc0RlbGV0YWJsZVRleHRzIiwiZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwiY29tbW9uQmluZGluZyIsImdldEJpbmRpbmciLCJiaW5kaW5nVHlwZSIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJmbkNvbmZpcm0iLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwib0Vycm9yIiwiZGlhbG9nIiwiY3JlYXRlRGVsZXRlRGlhbG9nIiwibm9EaWFsb2ciLCJzaWxlbnRNb2RlIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJmblJlamVjdCIsImRpYWxvZ0NvbmZpcm1lZCIsInZCb3giLCJWQm94IiwicmVzb3VyY2VCdW5kbGVDb3JlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiYXJpYUxhYmVsbGVkQnkiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImVkaXREb2N1bWVudCIsImdyb3VwSWQiLCJ0cmFuc2FjdGlvbkRldGFpbHMiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvTmV3Q29udGV4dCIsImRyYWZ0IiwiY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJiUHJlc2VydmVDaGFuZ2VzIiwic3RpY2t5IiwiZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uIiwiZXJyIiwic2hvd01lc3NhZ2VzIiwiY29uY3VycmVudEVkaXRGbGFnIiwiY2FuY2VsRG9jdW1lbnQiLCJtSW5QYXJhbWV0ZXJzIiwiaXNOZXdPYmplY3QiLCJpc09iamVjdE1vZGlmaWVkIiwib01vZGVsIiwicmV0dXJuZWRWYWx1ZSIsInNpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCIsImRyYWZ0QWRtaW5EYXRhIiwic2libGluZ0NvbnRleHQiLCJkcmFmdERhdGFDb250ZXh0IiwiYWxsIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJyZXF1ZXN0T2JqZWN0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9jb25maXJtRGlzY2FyZCIsImNhbmNlbEJ1dHRvbiIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZURyYWZ0IiwiZGlzY2FyZGVkQ29udGV4dCIsImRpc2NhcmREb2N1bWVudCIsInJlZnJlc2giLCJzYXZlRG9jdW1lbnQiLCJleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYmluZGluZ3NGb3JTaWRlRWZmZWN0cyIsInNraXBDb25maXJtYXRpb25Nc2ciLCJhcmd1bWVudHMiLCJvQWN0aXZlRG9jdW1lbnQiLCJhY3RpdmF0ZURvY3VtZW50IiwibWVzc2FnZXNSZWNlaXZlZCIsImdldE1lc3NhZ2VzIiwiY29uY2F0IiwiZ2V0VHlwZSIsIk1lc3NhZ2VUeXBlIiwiU3VjY2VzcyIsIk1lc3NhZ2VUb2FzdCIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQWN0aW9uTmFtZSIsImNvbnRleHRUb1Byb2Nlc3MiLCJzTmFtZSIsImNvbnRyb2xJZCIsImJ5SWQiLCJvUmVzdWx0IiwiYWN0aW9uUGF0aCIsImJvdW5kQWN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJjb252ZXJ0ZWRUeXBlcyIsImNvbnZlcnRUeXBlcyIsImNvbnZlcnRlZEFjdGlvbiIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiT3BlcmF0aW9uIiwicGFyYW1ldGVyVmFsdWVzIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwib0RhdGFQcm9wZXJ0aWVzIiwiZ2hvc3RDb250ZXh0QmluZGluZ1Byb3RlY3Rpb24iLCJlbmhhbmNlJHNlbGVjdCIsImlnbm9yZUVUYWciLCJvRGF0YUV2ZW50cyIsIm9uT0RhdGFTdWJtaXQiLCJvbk9EYXRhUmVzcG9uc2UiLCJvblJlcXVlc3RTaWRlRWZmZWN0cyIsImhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbiIsImludGVybmFsTW9kZWxDb250ZXh0Iiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwiZXhlY3V0ZSIsImNhbGxBY3Rpb25JbXBvcnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJuYW1lIiwiYWN0aW9uSGVscGVyIiwiaXNTdGF0aWNBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiSlNPTiIsInBhcnNlIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsInVwZGF0ZURlbGV0ZUluZm9Gb3JTZWxlY3RlZENvbnRleHRzIiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwic2V0UHJvcGVydHkiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJlcnJvclRvUmVtb3ZlIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsInZhbGlkYXRpb24iLCJyZW1vdmVNZXNzYWdlcyIsIl9jcmVhdGVQb3BvdmVyIiwic2V0dGluZ3MiLCJQb3BvdmVyIiwiaXNNb2RpZmllZCIsInNldEVuYWJsZWQiLCJjb25maXJtYXRpb25Qb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsIlRleHQiLCJjb25maXJtQnV0dG9uIiwid2lkdGgiLCJhZGRDb250ZW50IiwiYXR0YWNoQmVmb3JlT3BlbiIsInNldEluaXRpYWxGb2N1cyIsImF0dGFjaEFmdGVyQ2xvc2UiLCJvcGVuQnkiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJpc1Jvb3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlcXVlc3RSZWZyZXNoIiwiZmllbGROYW1lcyIsImxpc3RNZXRhUGF0aCIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwicmVmcmVzaEludGVybmFsIiwidHJhbnNpZW50Q29udGV4dCIsImZpZWxkTWV0YUNvbnRleHRzIiwiY3JlYXRlRGlhbG9nIiwiZ2V0Q29yZVVJRmFjdG9yeSIsIm5ld0NyZWF0ZURpYWxvZyIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsIm9wZW5EaWFsb2ciLCJlIiwicmVzdWx0UHJvbWlzZUtlZXBlciIsIlByb21pc2VLZWVwZXIiLCJvbkV4aXREaWFsb2ciLCJldmVudCIsImdldFBhcmFtZXRlciIsImNsb3NlRGlhbG9nIiwic2V0QnVzeSIsImJJc0NyZWF0ZURpYWxvZyIsInRyYW5zaWVudERhdGEiLCJrZXlzIiwicHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJjcmVhdGVEYXRhQXNBcnJheSIsIl9yZWYyIiwiVWlNb2RlbENvbnN0YW50cyIsIkRvY3VtZW50TW9kaWZpZWQiLCJuZXdDb250ZXh0IiwiY3JlYXRpb25TdWNjZXNzIiwiYWZ0ZXJDcmVhdGVDYWxsQmFjayIsImRpc3BsYXlFcnJvck1lc3NhZ2VzIiwic2hvd0JvdW5kU3RhdGVNZXNzYWdlcyIsIkNyZWF0aW9uRmFpbGVkIiwiaXNPcGVyYXRpb25EaWFsb2dPcGVuIiwiaXNPcGVuIiwiYXR0YWNoRXhpdERpYWxvZyIsInByb21pc2UiLCJwcm9taXNlS2VlcGVyIiwicGFyZW50TGlzdEJpbmRpbmciLCJvbkNyZWF0ZUNvbXBsZXRlZCIsImNyZWF0ZWRDb250ZXh0Iiwic3VjY2VzcyIsImRldGFjaENyZWF0ZUNvbXBsZXRlZCIsImF0dGFjaENyZWF0ZUNvbXBsZXRlZCIsImNyZWF0aW9uU3VjY2Vzc2Z1bCIsImNyZWF0ZWQiLCJjYXRjaCIsImNvbnRleHRFcnJvciIsInRyYWNlIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwic0NyZWF0ZUhhc2giLCJvTWV0YU1vZGVsIiwic01ldGFQYXRoIiwic05ld0FjdGlvbiIsInByZWZlcnJlZE1vZGUiLCJ0b1VwcGVyQ2FzZSIsInNQcmVmZXJyZWRNb2RlIiwibGluZUl0ZW1zIiwibGluZUl0ZW0iLCJpc0RhdGFGaWVsZEZvckFjdGlvbiIsIkFjdGlvbiIsIkxhYmVsIiwic2luZ2xldG9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJUcmFuc2FjdGlvbkhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbiwgQWN0aW9uIGFzIEVkbUFjdGlvbiwgRW50aXR5U2V0LCBOYXZpZ2F0aW9uUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgTGluZUl0ZW0gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBFeGl0RGlhbG9nRXZlbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVUlQcm92aWRlclwiO1xuaW1wb3J0IHsgZ2V0Q29yZVVJRmFjdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS9VSVByb3ZpZGVyXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgb3BlcmF0aW9ucyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgaXNEYXRhRmllbGRGb3JBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlT3B0aW9uLCBEZWxldGVQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB7IGdldENyZWF0ZVBvcHVwRmllbGRzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTWV0YU1vZGVsRnVuY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUHJvbWlzZUtlZXBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Qcm9taXNlS2VlcGVyXCI7XG5pbXBvcnQgdG9FUzZQcm9taXNlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1RvRVM2UHJvbWlzZVwiO1xuaW1wb3J0IHsgaXNOYXZpZ2F0aW9uUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IHR5cGUgeyAkUG9wb3ZlclNldHRpbmdzIH0gZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IFZCb3ggZnJvbSBcInNhcC9tL1ZCb3hcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRJdGVtIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL011bHRpVmFsdWVGaWVsZEl0ZW1cIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcIi4uLy4uL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vb3BlcmF0aW9ucy9PRGF0YU9wZXJhdGlvblwiO1xuaW1wb3J0IE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb25zL09wZXJhdGlvblwiO1xuaW1wb3J0IGFjdGlvbkhlbHBlciBmcm9tIFwiLi9vcGVyYXRpb25zL2FjdGlvbkhlbHBlclwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuXG4vL0VudW1zIGZvciBkZWxldGUgdGV4dCBjYWxjdWxhdGlvbnMgZm9yIGRlbGV0ZSBjb25maXJtIGRpYWxvZy5cbmNvbnN0IERlbGV0ZU9wdGlvblR5cGVzID0gZGVsZXRlSGVscGVyLkRlbGV0ZU9wdGlvblR5cGVzO1xuY29uc3QgRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wgPSBkZWxldGVIZWxwZXIuRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2w7XG5cbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVyczxUPihtUGFyYW1ldGVycz86IEV2ZW50IHwgVCk6IFQge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIEV2ZW50KS5nZXRNZXRhZGF0YSAmJiAobVBhcmFtZXRlcnMgYXMgRXZlbnQpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC51aS5iYXNlLkV2ZW50XCIpIHtcblx0XHRtUGFyYW1ldGVycyA9IHt9IGFzIFQ7XG5cdH1cblx0cmV0dXJuIChtUGFyYW1ldGVycyBhcyBUKSB8fCAoe30gYXMgVCk7XG59XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdGJ1c3lJZD86IHN0cmluZztcblx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdHBhcmVudENvbnRyb2w6IFZpZXc7XG5cdGluYWN0aXZlPzogYm9vbGVhbjtcblx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0YWZ0ZXJDcmVhdGVDYWxsQmFjaz86IChjb250ZXh0OiBPRGF0YVY0Q29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdGNyZWF0aW9uTW9kZT86IHN0cmluZztcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBDYW5jZWxQYXJhbWV0ZXJzID0geyBjYW5jZWxCdXR0b246IEJ1dHRvbjsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuOyBiZWZvcmVDYW5jZWxDYWxsQmFjaz86IEZ1bmN0aW9uIH07XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMgPSBEZWxldGVQYXJhbWV0ZXJzICYge1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0dGl0bGU/OiBzdHJpbmc7XG5cdG5vRGlhbG9nPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBFZGl0VHJhbnNhY3Rpb25FeGVjdXRpb25EZXRhaWxzID0ge1xuXHRleGlzdGluZ0RyYWZ0UmV1c2VkPzogYm9vbGVhbjsgLy8gdHJ1ZSBpZiBhbiBleGlzdGluZyBkcmFmdCB3YXMgcmV0dXJuZWQsIGluc3RlYWQgb2YgcmV0dXJuaW5nIGEgbmV3IG9uZVxufTtcblxuY2xhc3MgVHJhbnNhY3Rpb25IZWxwZXIge1xuXHRidXN5TG9jayhhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgYnVzeVBhdGg/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCdXN5TG9ja2VyLmxvY2soYXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIiksIGJ1c3lQYXRoKTtcblx0fVxuXG5cdGJ1c3lVbmxvY2soYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGJ1c3lQYXRoPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnVzeUxvY2tlci51bmxvY2soYXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIiksIGJ1c3lQYXRoKTtcblx0fVxuXG5cdGdldFByb2dyYW1taW5nTW9kZWwoc291cmNlOiBPRGF0YVY0Q29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0bGV0IHBhdGg6IHN0cmluZztcblx0XHRpZiAoc291cmNlLmlzQTxPRGF0YVY0Q29udGV4dD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkge1xuXHRcdFx0cGF0aCA9IHNvdXJjZS5nZXRQYXRoKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhdGggPSAoc291cmNlLmlzUmVsYXRpdmUoKSA/IHNvdXJjZS5nZXRSZXNvbHZlZFBhdGgoKSA6IHNvdXJjZS5nZXRQYXRoKCkpID8/IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gc291cmNlLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChtZXRhTW9kZWwgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIHBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0XHR9IGVsc2UgaWYgKG1ldGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQobWV0YU1vZGVsKSkge1xuXHRcdFx0cmV0dXJuIFByb2dyYW1taW5nTW9kZWwuU3RpY2t5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5Ob25EcmFmdDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG1QYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSxcblx0XHRvVmlldzogVmlld1xuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRcdGlmIChzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRjb25zdCBzTW9kdWxlID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoMCwgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpLnJlcGxhY2UoL1xcLi9naSwgXCIvXCIpLFxuXHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGVuZ3RoXG5cdFx0XHRcdCksXG5cdFx0XHRcdG1EYXRhID0gbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdGRlbGV0ZSBtRGF0YVtcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRyZXR1cm4gRlBNSGVscGVyLnZhbGlkYXRpb25XcmFwcGVyKHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIG1EYXRhLCBvVmlldywgb0NvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgZGVmYXR1bCB2YWx1ZXMgZnJvbSB0aGUgRGVmYXVsdFZhbHVlIGZ1bmN0aW9uLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0byBiZSB1c2VkIGZvciBjcmVhdGlvblxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgKG9yIHVuZGVmaW5lZCBpZiB0aGVyZSdzIG5vIGRlZmF1bHQgdmFsdWUgZnVuY3Rpb24pXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGdldERhdGFGcm9tRGVmYXVsdFZhbHVlRnVuY3Rpb24obGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBQcm9taXNlPG9iamVjdCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nT2JqZWN0UGF0aCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA9IChsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSB8IEVudGl0eVNldCkuYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0IHwgdW5kZWZpbmVkKT8uYW5ub3RhdGlvbnMuQ29tbW9uXG5cdFx0XHQ/LkRlZmF1bHRWYWx1ZXNGdW5jdGlvbjtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25OYW1lID0gZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCA/PyBkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0O1xuXG5cdFx0aWYgKCFkZWZhdWx0RnVuY3Rpb25OYW1lKSB7XG5cdFx0XHQvLyBObyBkZWZhdWx0IHZhbHVlIGZ1bmN0aW9uXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZ1bmN0aW9uT25OYXZQcm9wID0gaXNOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldE9iamVjdCkgJiYgZGVmYXVsdEZ1bmNPblRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkO1xuXHRcdGxldCBkZWZhdWx0RnVuY3Rpb25Db250ZXh0O1xuXHRcdGlmIChmdW5jdGlvbk9uTmF2UHJvcCkge1xuXHRcdFx0Ly8gSWYgdGhlIHBhdGggaXMgYSBkZWVwIG5hdmlnYXRpb24sIGRlcml2ZSB0aGUgY29ycmVjdCBwYXJlbnQgY29udGV4dFxuXHRcdFx0Y29uc3QgYmluZGluZ1BhdGggPSBsaXN0QmluZGluZy5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBjb250ZXh0ID0gbGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpO1xuXHRcdFx0aWYgKGJpbmRpbmdQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRkZWZhdWx0RnVuY3Rpb25Db250ZXh0ID0gY29udGV4dDtcblx0XHRcdH0gZWxzZSBpZiAoYmluZGluZ1BhdGggJiYgY29udGV4dCAmJiBiaW5kaW5nUGF0aC5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdFx0Ly8gRXh0cmFjdCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgbmF2aWdhdGlvbiBwYXRoIChlLmcuLCBfVG9IZWFkZXIvX1RvSXRlbXMg4oaSIF9Ub0hlYWRlcilcblx0XHRcdFx0Y29uc3QgZmlyc3ROYXYgPSBiaW5kaW5nUGF0aC5zcGxpdChcIi9cIilbMF07XG5cblx0XHRcdFx0Ly8gQnVpbGQgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29ycmVjdCBjb250ZXh0IGZvciB0aGUgZnVuY3Rpb24gY2FsbFxuXHRcdFx0XHRjb25zdCBwYXJlbnRQYXRoID0gYCR7Y29udGV4dC5nZXRQYXRoKCl9LyR7Zmlyc3ROYXZ9YDtcblxuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgYmluZGluZyBjb250ZXh0IGZvciB0aGlzIHBhdGhcblx0XHRcdFx0ZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHBhcmVudFBhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gdGhlIGN1cnJlbnQgY29udGV4dCBpZiBubyBuYXZpZ2F0aW9uIGZvdW5kXG5cdFx0XHRcdGRlZmF1bHRGdW5jdGlvbkNvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgYSBuYXZpZ2F0aW9uIHByb3BlcnR5LCB1c2UgdGhlIGhlYWRlciBjb250ZXh0IChyb290IG9iamVjdCBwYWdlIGNvbnRleHQpXG5cdFx0XHRkZWZhdWx0RnVuY3Rpb25Db250ZXh0ID0gbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdH1cblx0XHRpZiAoIWRlZmF1bHRGdW5jdGlvbkNvbnRleHQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoZGVmYXVsdEZ1bmN0aW9uQ29udGV4dC5nZXRQYXRoKCkpfS8ke2RlZmF1bHRGdW5jdGlvbk5hbWV9YDtcblxuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk9iamVjdFBhdGggPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChkZWZhdWx0RnVuY3Rpb25QYXRoKSk7XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uUmVzdWx0ID0gKGRlZmF1bHRGdW5jdGlvbk9iamVjdFBhdGgudGFyZ2V0T2JqZWN0IGFzIEFjdGlvbik/LmlzQm91bmRcblx0XHRcdD8gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQm91bmRGdW5jdGlvbihkZWZhdWx0RnVuY3Rpb25OYW1lLnRvU3RyaW5nKCksIGRlZmF1bHRGdW5jdGlvbkNvbnRleHQsIG1vZGVsKVxuXHRcdFx0OiAoKGF3YWl0IG9wZXJhdGlvbnMuY2FsbEZ1bmN0aW9uSW1wb3J0KGRlZmF1bHRGdW5jdGlvbk5hbWUudG9TdHJpbmcoKSwgbW9kZWwpKSBhcyBPRGF0YVY0Q29udGV4dCk7XG5cblx0XHRyZXR1cm4gZGVmYXVsdEZ1bmN0aW9uUmVzdWx0LmdldE9iamVjdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGxpc3QgYmluZGluZyBjb3JyZXNwb25kcyB0byBhIGhpZXJhcmNoeS5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGxpc3QgYmluZGluZyBpcyBoaWVyYXJjaGljYWwuXG5cdCAqL1xuXHRpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgaGllcmFyY2h5UXVhbGlmaWVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5oaWVyYXJjaHlRdWFsaWZpZXIgPyB0cnVlIDogZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBsaXN0IGJpbmRpbmcgaXMgYW5hbHl0aWNhbC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVFJVRSBpZiB0aGUgbGlzdCBiaW5kaW5nIGlzIGFuYWx5dGljYWwsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0aXNMaXN0QmluZGluZ0FuYWx5dGljYWwobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBhZ2dyZWdhdGlvbiA9IGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gYWdncmVnYXRpb24gIT09IHVuZGVmaW5lZCAmJiAhYWdncmVnYXRpb24uaGllcmFyY2h5UXVhbGlmaWVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBpbiBhIGxpc3QgYmluZGluZy4gSGFuZGxlcyBib3RoIGZsYXQgYW5kIGhpZXJhcmNoaWNhbCBjYXNlcy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBpbml0aWFsRGF0YSBJbml0aWFsIGRhdGEgdG8gY3JlYXRlIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBDcmVhdGlvbiBvcHRpb25zLlxuXHQgKiBAcGFyYW0gb3B0aW9ucy5jcmVhdGVBdEVuZCBDcmVhdGUgdGhlIGNvbnRleHQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIG9wdGlvbnMuY3JlYXRlSW5hY3RpdmUgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGluYWN0aXZlIChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gb3B0aW9ucy5wYXJlbnRDb250ZXh0IENyZWF0ZSB0aGUgY29udGV4dCBhcyBhXHQgY2hpbGQgb2YgdGhpcyBjb250ZXh0IChvbnkgdXNlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgY3JlYXRlQ29udGV4dChcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRpbml0aWFsRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkLFxuXHRcdG9wdGlvbnM6IHsgY3JlYXRlQXRFbmQ/OiBib29sZWFuOyBjcmVhdGVJbmFjdGl2ZT86IGJvb2xlYW47IHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dCB9XG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRjb25zdCBkYXRhRm9yQ3JlYXRpb24gPSBpbml0aWFsRGF0YSA/PyB7fTtcblxuXHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRsZXQgbGlzdEJpbmRpbmdGb3JDcmVhdGlvbjogT0RhdGFMaXN0QmluZGluZztcblx0XHRcdGlmIChvcHRpb25zLnBhcmVudENvbnRleHQ/LmlzRXhwYW5kZWQoKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0Ly8gSWYgdGhlIHBhcmVudCBjb250ZXh0IGFscmVhZHkgaGFzIGNoaWxkcmVuIGFuZCBpcyBjb2xsYXBzZWQsIHdlIGV4cGFuZCBpdCBmaXJzdFxuXHRcdFx0XHRhd2FpdCBsaXN0QmluZGluZy5leHBhbmQob3B0aW9ucy5wYXJlbnRDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRPYmplY3QuYXNzaWduKGRhdGFGb3JDcmVhdGlvbiwgeyBcIkAkdWk1Lm5vZGUucGFyZW50XCI6IG9wdGlvbnMucGFyZW50Q29udGV4dCB9KTtcblx0XHRcdFx0bGlzdEJpbmRpbmdGb3JDcmVhdGlvbiA9IGxpc3RCaW5kaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWJzb2x1dGUgYmluZGluZzogY3JlYXRpb24gZnJvbSB0aGUgTGlzdFJlcG9ydFxuXHRcdFx0XHQvLyBXZSB1c2UgYSB0ZW1wb3JhcnkgZmxhdCBsaXN0QmluZGluZyBmb3IgdGhlIGNyZWF0aW9uLCB0byBhdm9pZCBhZGRpbmcgdGhlIG5ldyBjb250ZXh0IGluIHRoZSB0YWJsZSAod2UgZG9uJ3Qgd2FudCB0byBkaXNwbGF5IGl0IHVudGlsIGl0J3Mgc2F2ZWQpXG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0XHQkJGdyb3VwSWQ6IGxpc3RCaW5kaW5nLmdldEdyb3VwSWQoKSxcblx0XHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IGxpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBBZGQgdGhlIHBhcmVudCBwYXRoIGluIHRoZSBpbml0aWFsIGRhdGEgaWYgYSBwYXJlbnQgaXMgcHJvdmlkZWRcblx0XHRcdFx0aWYgKG9wdGlvbnMucGFyZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGNvbnN0IG9iamVjdFBhdGggPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0XHRjb25zdCBoaWVyYXJjaHlRdWFsaWZpZXIgPSAobGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcjogc3RyaW5nIH0pLmhpZXJhcmNoeVF1YWxpZmllcjtcblx0XHRcdFx0XHRjb25zdCBwYXJlbnROYXZpZ2F0aW9uID1cblx0XHRcdFx0XHRcdG9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5BZ2dyZWdhdGlvbj8uW2BSZWN1cnNpdmVIaWVyYXJjaHkjJHtoaWVyYXJjaHlRdWFsaWZpZXJ9YF1cblx0XHRcdFx0XHRcdFx0Py5QYXJlbnROYXZpZ2F0aW9uUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdFx0aWYgKCFwYXJlbnROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIHBhcmVudCBuYXZpZ2F0aW9uIHByb3BlcnR5IGZvciAke2xpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50QmluZGluZ0RhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRcdFx0XHRwYXJlbnRCaW5kaW5nRGF0YVtgJHtwYXJlbnROYXZpZ2F0aW9ufUBvZGF0YS5iaW5kYF0gPSBvcHRpb25zLnBhcmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2UoL15cXC8vLCBcIlwiKTsgLy8gUmVtb3ZlIGxlYWRpbmcgXCIvXCIgZnJvbSB0aGUgcGF0aFxuXHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oZGF0YUZvckNyZWF0aW9uLCBwYXJlbnRCaW5kaW5nRGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24uY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTGlzdEJpbmRpbmdBbmFseXRpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGluZyBhIG5ldyBkb2N1bWVudCBpbiBhIGFuYWx5dGljYWwgdGFibGUgaXMgc3VwcG9ydGVkIG9ubHkgaW4gYSBMaXN0UmVwb3J0XCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gV2UgdXNlIGEgdGVtcG9yYXJ5IGZsYXQgbGlzdEJpbmRpbmcgZm9yIHRoZSBjcmVhdGlvbiwgdG8gYXZvaWQgYWRkaW5nIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgdGFibGUgKHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSBpdCB1bnRpbCBpdCdzIHNhdmVkKVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24gPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0XHQkJGdyb3VwSWQ6IGxpc3RCaW5kaW5nLmdldEdyb3VwSWQoKSxcblx0XHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IGxpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGxpc3RCaW5kaW5nRm9yQ3JlYXRpb24uY3JlYXRlKGRhdGFGb3JDcmVhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBsaXN0QmluZGluZy5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlLCBvcHRpb25zLmNyZWF0ZUF0RW5kLCBvcHRpb25zLmNyZWF0ZUluYWN0aXZlKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDcmVhdGlvblBhcmFtZXRlcnMobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIGNyZWF0ZURhdGE6IG9iamVjdCB8IHVuZGVmaW5lZCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cblx0XHRjb25zdCBub25Db21wdXRlZFZpc2libGVGaWVsZHMgPSBnZXRDcmVhdGVQb3B1cEZpZWxkcyhtZXRhTW9kZWwsIG1ldGFQYXRoLCBhcHBDb21wb25lbnQpO1xuXHRcdC8vIERvIG5vdCBjb25zaWRlciBmaWVsZHMgZm9yIHdoaWNoIHdlIHByb3ZpZGUgc29tZSBpbml0aWFsIGRhdGFcblx0XHRyZXR1cm4gbm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzLmZpbHRlcigoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcblx0XHRcdHJldHVybiAhKGZpZWxkTmFtZSBpbiAoY3JlYXRlRGF0YSA/PyB7fSkpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0XG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5kYXRhXSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmJ1c3lNb2RlXSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZSBUT0RPOiB0byBiZSByZWZhY3RvcmVkXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmJ1c3lJZF0gSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRdIElmIHNldCwgdGhlIGNvbnRleHQgc3RheXMgaW4gdGhlIGxpc3QgaWYgdGhlIFBPU1QgZmFpbGVkIGFuZCBQT1NUIHdpbGwgYmUgcmVwZWF0ZWQgd2l0aCB0aGUgbmV4dCBjaGFuZ2Vcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuaW5hY3RpdmVdIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSByZXNvdXJjZSBtb2RlbFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGZyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGluUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyB8IHVuZGVmaW5lZCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRsZXQgbmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhpblBhcmFtZXRlcnMpO1xuXHRcdGlmICghbWFpbkxpc3RCaW5kaW5nKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIHJlcXVpcmVkIGZvciBuZXcgZG9jdW1lbnQgY3JlYXRpb25cIik7XG5cdFx0fVxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ3JlYXRlIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHRjb25zdCBidXN5UGF0aCA9IHRoaXMuZ2V0QnVzeVBhdGgocGFyYW1ldGVycyk7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGZyb21Db3B5UGFzdGUgPyB1bmRlZmluZWQgOiBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXHRcdGlmICghaW5QYXJhbWV0ZXJzPy5pbmFjdGl2ZSkge1xuXHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQsIGJ1c3lQYXRoKTtcblx0XHR9XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gbWVzc2FnZUhhbmRsZXIucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXHRcdHRyeSB7XG5cdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLnBlcmZvcm1DcmVhdGlvbihcblx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRmcm9tQ29weVBhc3RlXG5cdFx0XHQpO1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsIHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0cmV0dXJuIG5ld0RvY3VtZW50Q29udGV4dCE7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sLCB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCB8fCBlcnJvciA9PT0gRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpICYmXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dD8uaXNUcmFuc2llbnQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBtb2RlbCBhcyBDb250ZXh0LmRlbGV0ZSByZXN1bHRzIGluIGFuIGVycm9yXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSB0aGUgJGRpcmVjdCBvbmNlIG1vZGVsIHJlc29sdmVzIHRoaXMgaXNzdWVcblx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQuZGVsZXRlKFwiJGRpcmVjdFwiKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoIWluUGFyYW1ldGVycz8uaW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCwgYnVzeVBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0QnVzeVBhdGgobVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMpOiBzdHJpbmcge1xuXHRcdHJldHVybiBtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiID8gYC9idXN5TG9jYWwvJHttUGFyYW1ldGVycy5idXN5SWR9YCA6IFwiL2J1c3lcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5TW9kZSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5SWQgSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmluYWN0aXZlIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIENyZWF0ZSB0aGUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVJbmFjdGl2ZSBDcmVhdGUgdGhlIGNvbnRleHQgYXMgaW5hY3RpdmUgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGEgY2hpbGQgb2YgdGhpcyBjb250ZXh0IChvbmx5IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGNyZWF0ZURvY3VtZW50Q29udGV4dChtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdC8vYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgZXhwZWN0cyBjcmVhdGVQYXJhbWV0ZXJzIG9mIHR5cGUgYW55W11cblx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmRhdGEgPyBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzLmRhdGEpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBba2V5XTogdmFsdWUgfSkpIDogW107XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0b0VTNlByb21pc2UoXG5cdFx0XHRcdFx0cGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbWFpbkxpc3RCaW5kaW5nICYmIG1haW5MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBjcmVhdGVQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cGFyYW1ldGVycy5kYXRhID0gY3JlYXRlUGFyYW1ldGVycy5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAuLi5yZXN1bHQsIC4uLmN1cnJlbnRPYmplY3QgfTtcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cdFx0Y29uc3QgY3JlYXRlUHJvbWlzZSA9IHRoaXMuY3JlYXRlQ29udGV4dChtYWluTGlzdEJpbmRpbmcsIHBhcmFtZXRlcnMuZGF0YSwge1xuXHRcdFx0Y3JlYXRlQXRFbmQ6ICEhcGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdGNyZWF0ZUluYWN0aXZlOiAhIXBhcmFtZXRlcnMuaW5hY3RpdmUsXG5cdFx0XHRwYXJlbnRDb250ZXh0OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHRcblx0XHR9KTtcblx0XHRpZiAobWFpbkxpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSA9PT0gQ29tbW9uVXRpbHMuSU5MSU5FRURJVF9VUERBVEVHUk9VUElEKSB7XG5cdFx0XHRtYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpO1xuXHRcdH1cblx0XHRyZXR1cm4gY3JlYXRlUHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGVpdGhlciB2aWEgbmV3IEFjdGlvbiBvciBzdGFuZGFyZCBQT1NUIGNyZWF0ZS5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5TW9kZSBHbG9iYWwgKGRlZmF1bHQpLCBMb2NhbCwgTm9uZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5idXN5SWQgSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmluYWN0aXZlIElmIHNldCwgdGhlIGNvbnRleHQgaXMgc2V0IGFzIGluYWN0aXZlIGZvciBlbXB0eSByb3dzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIENyZWF0ZSB0aGUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVJbmFjdGl2ZSBDcmVhdGUgdGhlIGNvbnRleHQgYXMgaW5hY3RpdmUgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGEgY2hpbGQgb2YgdGhpcyBjb250ZXh0IChvbmx5IHVzZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsXG5cdCAqIEBwYXJhbSBmcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggbmV3IGJpbmRpbmcgY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwZXJmb3JtQ3JlYXRpb24oXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbWFpbkxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgobWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBjcmVhdGVIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdGNvbnN0IGNvbXBvbmVudERhdGEgPSBhcHBDb21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdGNvbnN0IHN0YXJ0dXBQYXJhbWV0ZXJzID0gY29tcG9uZW50RGF0YT8uc3RhcnR1cFBhcmFtZXRlcnMgPz8ge307XG5cdFx0Y29uc3QgbmV3QWN0aW9uID0gIW1haW5MaXN0QmluZGluZy5pc1JlbGF0aXZlKClcblx0XHRcdD8gdGhpcy5fZ2V0TmV3QWN0aW9uKHN0YXJ0dXBQYXJhbWV0ZXJzLCBjcmVhdGVIYXNoLCBtZXRhTW9kZWwsIG1ldGFQYXRoKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmV3QWN0aW9uKSB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBlcmZvcm1DcmVhdGlvbldpdGhBY3Rpb24oXG5cdFx0XHRcdG5ld0FjdGlvbixcblx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHR0aHJvdyByZXN1bHQucmVhc29uO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdC52YWx1ZS5yZXR1cm5lZENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnBlcmZvcm1DcmVhdGlvbldpdGhQT1NUKG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycywgYXBwQ29tcG9uZW50LCByZXNvdXJjZU1vZGVsLCBtZXNzYWdlSGFuZGxlciwgZnJvbUNvcHlQYXN0ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkb2N1bWVudCB3aXRoIGFuIGFjdGlvbi5cblx0ICogQHBhcmFtIGFjdGlvbk5hbWVcblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0LlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwZXJmb3JtQ3JlYXRpb25XaXRoQWN0aW9uKFxuXHRcdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD4+IHtcblx0XHRjb25zdCBoZWFkZXJDb250ZXh0UGF0aCA9IG1haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChoZWFkZXJDb250ZXh0UGF0aCk7XG5cdFx0Y29uc3QgbWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG1ldGFNb2RlbCwgbWV0YVBhdGgpO1xuXHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJzOiBCaW5kQ29udGV4dFBhcmFtZXRlcnMgPSB7ICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWUsICQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiIH07XG5cblx0XHRjb25zdCBzZWxlY3RlZFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKG1lc3NhZ2VzUGF0aCkge1xuXHRcdFx0c2VsZWN0ZWRQcm9wZXJ0aWVzLnB1c2gobWVzc2FnZXNQYXRoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChtYWluTGlzdEJpbmRpbmcpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRzZWxlY3RlZFByb3BlcnRpZXMucHVzaChcIklzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJIYXNBY3RpdmVFbnRpdHlcIik7IC8vIE5lZWRlZCBmb3Igb3VyIGludGVybmFsIGxvZ2ljIChlLmcuIG5hdmlnYXRpb24pXG5cdFx0fVxuXHRcdGlmIChzZWxlY3RlZFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnNbXCIkc2VsZWN0XCJdID0gc2VsZWN0ZWRQcm9wZXJ0aWVzLmpvaW4oXCIsXCIpO1xuXHRcdH1cblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhbGxBY3Rpb24oXG5cdFx0XHRhY3Rpb25OYW1lLFxuXHRcdFx0e1xuXHRcdFx0XHRjb250ZXh0czogbWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0bGFiZWw6IHRoaXMuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwobWV0YU1vZGVsLCBtZXRhUGF0aCwgYWN0aW9uTmFtZSwgcmVzb3VyY2VNb2RlbCksXG5cdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBiaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0dmlldzogcGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRpc0NyZWF0ZUFjdGlvbjogdHJ1ZSxcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogcGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXG5cdFx0XHR9LFxuXHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHQpO1xuXHRcdHJldHVybiByZXN1bHRbMF07XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRvY3VlbW50IHdpdGggYSBzdGFuZGFyZCBQT1NUIHJlcXVlc3QuXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIGZyb21Db3B5UGFzdGVcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dC5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcGVyZm9ybUNyZWF0aW9uV2l0aFBPU1QoXG5cdFx0bWFpbkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0ZnJvbUNvcHlQYXN0ZTogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgaW5pdGlhbERhdGEgPSBwYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRpZiAoIWZyb21Db3B5UGFzdGUpIHtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhID0gYXdhaXQgdGhpcy5nZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uKG1haW5MaXN0QmluZGluZyk7XG5cdFx0XHRcdHBhcmFtZXRlcnMuZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSwgcGFyYW1ldGVycy5kYXRhKTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0ZGVsZXRlIHBhcmFtZXRlcnMuZGF0YVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5IYXZlRGlhbG9nID0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdGNvbnN0IGNyZWF0aW9uRGlhbG9nRmllbGRzID0gY2FuSGF2ZURpYWxvZyA/IHRoaXMuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKG1haW5MaXN0QmluZGluZywgaW5pdGlhbERhdGEsIGFwcENvbXBvbmVudCkgOiBbXTtcblx0XHRcdGlmIChwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHM/LmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGlmICghY3JlYXRpb25EaWFsb2dGaWVsZHMuaW5jbHVkZXMoZmllbGROYW1lKSkge1xuXHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHMucHVzaChmaWVsZE5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGNyZWF0aW9uRGlhbG9nRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIEluIENyZWF0aW9uRGlhbG9nIG1vZGUsIHRoZSBkaWFsb2cgaXMgbWFuZGF0b3J5XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gZmllbGRzIGF2YWlsYWJsZSBmb3IgdGhlIGNyZWF0aW9uIGRpYWxvZ1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY3JlYXRpb25EaWFsb2dGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRuZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVdpdGhEaWFsb2coXG5cdFx0XHRcdFx0bWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzLFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlRG9jdW1lbnRDb250ZXh0KG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmICghcGFyYW1ldGVycy5pbmFjdGl2ZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMud2FpdEZvckNyZWF0ZUNvbXBsZXRpb24obmV3RG9jdW1lbnRDb250ZXh0LCBwYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPT09IHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRjb25zdCBtc2cgPSAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UgPz8gZXJyb3I7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIG1zZyk7XG5cdFx0XHR0aHJvdyBtc2c7XG5cdFx0fVxuXHR9XG5cblx0X2lzRHJhZnRFbmFibGVkKHZDb250ZXh0czogT0RhdGFWNENvbnRleHRbXSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHRGb3JEcmFmdE1vZGVsID0gdkNvbnRleHRzWzBdO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHRGb3JEcmFmdE1vZGVsKTtcblx0XHRyZXR1cm4gc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlIG9uZSBvciBtdWx0aXBsZSBkb2N1bWVudChzKS5cblx0ICogQHBhcmFtIGNvbnRleHRzIENvbnRleHRzIEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIE51bWJlciBvZiBvYmplY3RzIHNlbGVjdGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ub0RpYWxvZyBUbyBkaXNhYmxlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSxcblx0XHRtUGFyYW1ldGVyczogVHJhbnNhY3Rpb25EZWxldGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIGRlbGV0ZSBkb2N1bWVudCBsb2NrXG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXG5cdFx0Y29uc3QgY29udGV4dHNUb0RlbGV0ZSA9IEFycmF5LmlzQXJyYXkoY29udGV4dHMpID8gWy4uLmNvbnRleHRzXSA6IFtjb250ZXh0c107XG5cdFx0Y29uc3QgZmlyc3RDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgPz8gY29udGV4dHNUb0RlbGV0ZSlbMF07XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZHJhZnRFbmFibGVkID0gdGhpcy5faXNEcmFmdEVuYWJsZWQobVBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyB8fCBjb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0Y29uc3QgaXRlbXM6IENvbnRyb2xbXSA9IFtdO1xuXHRcdFx0XHRsZXQgb3B0aW9uczogRGVsZXRlT3B0aW9uW10gPSBbXTtcblx0XHRcdFx0bGV0IHVuU2F2ZWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHQvLyBpdGVtcyh0ZXh0cykgYW5kIG9wdGlvbnMoY2hlY2tCb3hlcyBhbmQgc2luZ2xlIGRlZmF1bHQgb3B0aW9uKSBmb3IgY29uZmlybSBkaWFsb2cuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSA9IHRoaXMuZ2V0Q29sbGVjdGlvbk5hbWVGcm9tQ29udGV4dChmaXJzdENvbnRleHQpO1xuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHQvLyBub24tVGFibGVcblx0XHRcdFx0XHRcdGlmIChkcmFmdEVuYWJsZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgMSBvZiB0aGUgZHJhZnRzIGlzIGxvY2tlZCBieSBhbm90aGVyIHVzZXJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbG9ja2VkQ29udGV4dCA9IGNvbnRleHRzVG9EZWxldGUuZmluZCgoY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHREYXRhID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyICYmXG5cdFx0XHRcdFx0XHRcdFx0XHQhY29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChsb2NrZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gU2hvdyBtZXNzYWdlIGJveCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBsb2NraW5nIHVzZXIgYW5kIHJldHVyblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2tpbmdVc2VyTmFtZSA9IGxvY2tlZENvbnRleHQuZ2V0T2JqZWN0KCkuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfU0lOR0xFX09CSkVDVF9MT0NLRURcIiwgW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsb2NraW5nVXNlck5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdF0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNsb3NlOiByZWplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR1blNhdmVkQ29udGV4dCA9IGNvbnRleHRzVG9EZWxldGUuZmluZCgoY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgeyBJc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIERyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIH0gPSBjb250ZXh0LmdldE9iamVjdCgpIHx8IHt9O1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIElzQWN0aXZlRW50aXR5ID09PSB0cnVlICYmIEhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmICEhRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGE/LkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bGV0IG5vblRhYmxlVHh0ID0gXCJcIjtcblx0XHRcdFx0XHRcdGlmICh1blNhdmVkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB1blNhdmVkQ29udGV4dFVzZXIgPSB1blNhdmVkQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRbdW5TYXZlZENvbnRleHRVc2VyXSxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kZXNjcmlwdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRcdFttUGFyYW1ldGVycy50aXRsZSwgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb25dLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfT05MWVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLnRpdGxlXSxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b3B0aW9ucy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogRGVsZXRlT3B0aW9uVHlwZXMuZGVsZXRhYmxlQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRzOiBjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHR0ZXh0OiBub25UYWJsZVR4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2w6IERlbGV0ZURpYWxvZ0NvbnRlbnRDb250cm9sLlRFWFRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBUYWJsZVxuXHRcdFx0XHRcdFx0bGV0IHRvdGFsRGVsZXRhYmxlID0gY29udGV4dHNUb0RlbGV0ZS5sZW5ndGg7XG5cblx0XHRcdFx0XHRcdGlmIChkcmFmdEVuYWJsZWQpIHtcblx0XHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUgKz1cblx0XHRcdFx0XHRcdFx0XHQobVBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT8ubGVuZ3RoID8/IDApICtcblx0XHRcdFx0XHRcdFx0XHQobVBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZT8ubGVuZ3RoID8/IDApICtcblx0XHRcdFx0XHRcdFx0XHQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzPy5sZW5ndGggPz8gMCk7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyhcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbXMsXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgbm9uRGVsZXRhYmxlVGV4dCA9IGRlbGV0ZUhlbHBlci5nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB0b3RhbERlbGV0YWJsZSwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdFx0XHRcdGlmIChub25EZWxldGFibGVUZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aXRlbXMucHVzaChub25EZWxldGFibGVUZXh0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCBvcHRpb25zRGVsZXRhYmxlVGV4dHMgPSBkZWxldGVIZWxwZXIuZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZSxcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdG9wdGlvbnMgPSBbLi4ub3B0aW9ucywgLi4ub3B0aW9uc0RlbGV0YWJsZVRleHRzXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBjb21tb25CaW5kaW5nID0gZmlyc3RDb250ZXh0LmdldEJpbmRpbmcoKSBhcyBCaW5kaW5nO1xuXHRcdFx0XHRsZXQgYmluZGluZ1R5cGU6IFwiVHJlZVwiIHwgXCJBbmFseXRpY2FsXCIgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChjb21tb25CaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChjb21tb25CaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0YmluZGluZ1R5cGUgPSBcIlRyZWVcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXNMaXN0QmluZGluZ0FuYWx5dGljYWwoY29tbW9uQmluZGluZykpIHtcblx0XHRcdFx0XHRcdGJpbmRpbmdUeXBlID0gXCJBbmFseXRpY2FsXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ29udGVudCBvZiBEZWxldGUgRGlhbG9nXG5cdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVDb250ZW50Rm9yRGVsZXRlRGlhbG9nKG9wdGlvbnMsIGl0ZW1zKTtcblx0XHRcdFx0Y29uc3QgZm5Db25maXJtID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkZWxldGVIZWxwZXIuZGVsZXRlQ29uZmlybUhhbmRsZXIoXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRkcmFmdEVuYWJsZWQsXG5cdFx0XHRcdFx0XHRcdGJpbmRpbmdUeXBlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCBkaWFsb2cgPSB0aGlzLmNyZWF0ZURlbGV0ZURpYWxvZyhpdGVtcywgbVBhcmFtZXRlcnMsIHJlc291cmNlTW9kZWwsIGZuQ29uZmlybSwgcmVqZWN0KTtcblxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cgPT09IHRydWUgfHwgbVBhcmFtZXRlcnMuc2lsZW50TW9kZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0XHRkaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHQvLyBkZWxldGUgZG9jdW1lbnQgdW5sb2NrXG5cdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZyBmbyB0aGUgZGVsZXRpb24uXG5cdCAqIEBwYXJhbSBpdGVtcyBBbiBhcnJheSBvZiBjb250cm9scyB1c2VkIGZvciB0aGUgZGlhbG9nIGNvbnRlbnRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sIFBhcmVudCBjb250cm9sIG9mIHRoZSBkZWxldGUgYnV0dG9uIGlmIGFueVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIGN1cnJlbnQgZW50aXR5U2V0XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBmbkNvbmZpcm0gRnVuY3Rpb24gZXhlY3V0ZWQgdXBvbiB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZGVsZXRpb25cblx0ICogQHBhcmFtIGZuUmVqZWN0IEZ1bmN0aW9uIGV4ZWN1dGVkIGlmIHRoZSBkaWFsb2cgaXMgY2xvc2VkIHZpYSBDYW5jZWwgb3IgRXNjYXBlIGJ1dHRvblxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBkZWxldGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKi9cblx0Y3JlYXRlRGVsZXRlRGlhbG9nKFxuXHRcdGl0ZW1zOiBDb250cm9sW10sXG5cdFx0cGFyYW1ldGVyczogUGFydGlhbDx7IHBhcmVudENvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQ7IGVudGl0eVNldE5hbWU6IHN0cmluZyB9Pixcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGZuQ29uZmlybTogRnVuY3Rpb24sXG5cdFx0Zm5SZWplY3Q6IEZ1bmN0aW9uXG5cdCk6IERpYWxvZyB7XG5cdFx0bGV0IGRpYWxvZ0NvbmZpcm1lZCA9IGZhbHNlO1xuXHRcdGNvbnN0IHZCb3ggPSBuZXcgVkJveCh7IGl0ZW1zOiBpdGVtcyB9KTtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZUNvcmUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRcdGxldCB0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w/LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdHRpdGxlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiTV9DT01NT05fVEFCTEVfREVMRVRFXCIsIHVuZGVmaW5lZCwgcGFyYW1ldGVycy5lbnRpdHlTZXROYW1lKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGl0bGUgPSByZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKTtcblx0XHR9XG5cdFx0Y29uc3QgZGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHR0aXRsZTogdGl0bGUsXG5cdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRjb250ZW50OiBbdkJveF0sXG5cdFx0XHRhcmlhTGFiZWxsZWRCeTogaXRlbXMsXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHRpdGxlLFxuXHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRkaWFsb2dDb25maXJtZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGRpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxcIiksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRkaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHQvLyBpZiBkaWFsb2cgaXMgY2xvc2VkIHVuY29uZmlybWVkIChlLmcuIHZpYSBcIkNhbmNlbFwiIG9yIEVzY2FwZSBidXR0b24pLCBlbnN1cmUgdG8gcmVqZWN0IHByb21pc2Vcblx0XHRcdFx0aWYgKCFkaWFsb2dDb25maXJtZWQpIHtcblx0XHRcdFx0XHRmblJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRpYWxvZztcblx0fVxuXG5cdC8qKlxuXHQgKiBFZGl0cyBhIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBvVmlldyBDdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc2FjdGlvbkRldGFpbHMgT3B0aW9uYWwgb2JqZWN0IHRvIHJldHVybiBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgaG93IHRoZSB0cmFuc2FjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSBuZXcgZHJhZnQgY29udGV4dCBpbiBjYXNlIG9mIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgZWRpdERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRvVmlldzogRkVWaWV3LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRncm91cElkOiBzdHJpbmcsXG5cdFx0dHJhbnNhY3Rpb25EZXRhaWxzPzogRWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlsc1xuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdFx0fVxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxlci5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb05ld0NvbnRleHQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRiUHJlc2VydmVDaGFuZ2VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdG9WaWV3OiBvVmlld1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRncm91cElkLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzXG5cdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uKG9Db250ZXh0LCBhcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyKTtcblxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdHJldHVybiBvTmV3Q29udGV4dDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IGNvbmN1cnJlbnRFZGl0RmxhZzogdHJ1ZSwgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYW5jZWwgJ2VkaXQnIG1vZGUgb2YgYSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGNhbmNlbGVkIG9yIGRlbGV0ZWRcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gQ2FuY2VsIEJ1dHRvbiBvZiB0aGUgZGlzY2FyZCBwb3BvdmVyIChtYW5kYXRvcnkgZm9yIG5vdylcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBpbmNhc2Ugb2YgZHJhZnQgYXBwbGljYXRpb25zIHdoaWxlIG5hdmlnYXRpbmcgb3V0IG9mIE9QXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcENvbXBvbmVudFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBpc09iamVjdE1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgdXNlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG1JblBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgfCB1bmRlZmluZWQsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0aXNOZXdPYmplY3Q6IGJvb2xlYW4sXG5cdFx0aXNPYmplY3RNb2RpZmllZDogYm9vbGVhblxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2FuY2VsIGRvY3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCByZXR1cm5lZFZhbHVlOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRcdGxldCBzaWJsaW5nQ29udGV4dENhbm9uaWNhbFBhdGgsIGRyYWZ0QWRtaW5EYXRhO1xuXHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIWlzT2JqZWN0TW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFtzaWJsaW5nQ29udGV4dENhbm9uaWNhbFBhdGgsIGRyYWZ0QWRtaW5EYXRhXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdFx0XHRpc05ld09iamVjdCA/IHVuZGVmaW5lZCA6IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCksXG5cdFx0XHRcdFx0ZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0XSk7XG5cdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdGlzT2JqZWN0TW9kaWZpZWQgPSBkcmFmdEFkbWluRGF0YS5DcmVhdGlvbkRhdGVUaW1lICE9PSBkcmFmdEFkbWluRGF0YS5MYXN0Q2hhbmdlRGF0ZVRpbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX2NvbmZpcm1EaXNjYXJkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiwgaXNPYmplY3RNb2RpZmllZCwgcmVzb3VyY2VNb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgY29udGV4dCBpcyBrZXB0IGFsaXZlIHdlIHNldCBpdCBhZ2FpbiB0byBkZXRhY2ggdGhlIG9uQmVmb3JlRGVzdHJveSBjYWxsYmFjayBhbmQgaGFuZGxlIG5hdmlnYXRpb24gaGVyZVxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBuZWVkcyB0byBzdGlsbCBiZSBrZXB0IGFsaXZlIHRvIGJlIGFibGUgdG8gcmVzZXQgY2hhbmdlcyBwcm9wZXJseVxuXHRcdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUodHJ1ZSwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBtUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdGlmIChpc05ld09iamVjdCkge1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IGRyYWZ0LmRlbGV0ZURyYWZ0KG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IG9Nb2RlbFxuXHRcdFx0XHRcdFx0XHQuYmluZENvbnRleHQoXG5cdFx0XHRcdFx0XHRcdFx0c2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoID8gc2libGluZ0NvbnRleHRDYW5vbmljYWxQYXRoIDogYXdhaXQgc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIG1lc3NhZ2VIYW5kbGVyLCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIWlzTmV3T2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBkaXNjYXJkZWRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1vdmUgZXhpc3RpbmcgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHQvLyBzaG93IHVuYm91bmQgbWVzc2FnZXNcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0cmV0dXJuIHJldHVybmVkVmFsdWU7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgc2F2ZWRcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIFRydWUgaWYgd2Ugc2hvdWxkIGV4ZWN1dGUgc2lkZSBlZmZlY3RzIGluIGNhc2Ugb2YgYW4gZXJyb3Jcblx0ICogQHBhcmFtIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMgVGhlIGxpc3RCaW5kaW5ncyB0byBiZSB1c2VkIGZvciBleGVjdXRpbmcgc2lkZSBlZmZlY3RzIG9uIGVycm9yXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIHNraXBDb25maXJtYXRpb25Nc2dcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIHNhdmVEb2N1bWVudChcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGJvb2xlYW4sXG5cdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0czogT0RhdGFMaXN0QmluZGluZ1tdLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhbixcblx0XHRza2lwQ29uZmlybWF0aW9uTXNnID0gZmFsc2Vcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlNhdmUgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSB0aGlzLmdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyLCB7IHJlc291cmNlTW9kZWw6IHJlc291cmNlTW9kZWwgfSlcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5hY3RpdmF0ZURvY3VtZW50KGNvbnRleHQsIGFwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIsIHsgcmVzb3VyY2VNb2RlbDogcmVzb3VyY2VNb2RlbCB9KTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXNSZWNlaXZlZCA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpOyAvLyBnZXQgdW5ib3VuZCBhbmQgYm91bmQgbWVzc2FnZXMgcHJlc2VudCBpbiB0aGUgbW9kZWxcblx0XHRcdGlmICghc2tpcENvbmZpcm1hdGlvbk1zZyAmJiAhKG1lc3NhZ2VzUmVjZWl2ZWQubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzUmVjZWl2ZWRbMF0uZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzKSkge1xuXHRcdFx0XHQvLyBzaG93IG91ciBvYmplY3QgY3JlYXRpb24gdG9hc3Qgb25seSBpZiBpdCBpcyBub3QgY29taW5nIGZyb20gYmFja2VuZFxuXHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0XHRpc05ld09iamVjdFxuXHRcdFx0XHRcdFx0PyByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpXG5cdFx0XHRcdFx0XHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9TQVZFRFwiLCB1bmRlZmluZWQsIGVudGl0eVNldE5hbWUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAoZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciAmJiBiaW5kaW5nc0ZvclNpZGVFZmZlY3RzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBmb3IgdGFibGUgaXRlbXMgaW4gdHJhbnNpZW50IHN0YXRlICovXG5cdFx0XHRcdGJpbmRpbmdzRm9yU2lkZUVmZmVjdHMuZm9yRWFjaCgobGlzdEJpbmRpbmcpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbHMgYSBib3VuZCBvciB1bmJvdW5kIGFjdGlvbi5cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXNdIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb246IEVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOiBBbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZ10gTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubGFiZWxdIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5zaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy52aWV3XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXBcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5ncm91cElkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWcgSWYgc3BlY2lmaWVkLCB0aGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IEVUYWcgaGFuZGxpbmdcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcmVzcG9uc2Ugb2JqZWN0cyAoVE9ETzogdG8gYmUgY2hhbmdlZClcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYWxsQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzPzogQmluZENvbnRleHRQYXJhbWV0ZXJzO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHR2aWV3OiBWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0aWdub3JlRVRhZz86IGJvb2xlYW47XG5cdFx0fSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W10+IHtcblx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdGxldCBjb250ZXh0VG9Qcm9jZXNzO1xuXHRcdGxldCBvTW9kZWw6IE9EYXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFzQWN0aW9uTmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZSBuYW1lIG9mIGFjdGlvbiB0byBiZSBleGVjdXRlZFwiKTtcblx0XHR9XG5cdFx0Ly8gYWN0aW9uIGltcG9ydHMgYXJlIG5vdCBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBtZXRhTW9kZWwgYnkgaXQgaXMgcHJlc2VudCBpbnNpZGUgdGhlIGVudGl0eUNvbnRhaW5lclxuXHRcdC8vIGFuZCB0aGUgYWNpb25zIGl0IHJlZmVycyB0byBwcmVzZW50IG91dHNpZGUgdGhlIGVudGl0eWNvbnRhaW5lciwgaGVuY2UgdG8gb2J0YWluIGtpbmQgb2YgdGhlIGFjdGlvblxuXHRcdC8vIHNwbGl0KCkgb24gaXRzIG5hbWUgd2FzIHJlcXVpcmVkXG5cdFx0Y29uc3Qgc05hbWUgPSBzQWN0aW9uTmFtZS5zcGxpdChcIi9cIilbMV07XG5cblx0XHRjb250ZXh0VG9Qcm9jZXNzID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MgJiYgKChBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpICYmIGNvbnRleHRUb1Byb2Nlc3MubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShjb250ZXh0VG9Qcm9jZXNzKSkpIHtcblx0XHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpID8gY29udGV4dFRvUHJvY2Vzc1swXSA6IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0XHRvTW9kZWwgPSBjb250ZXh0VG9Qcm9jZXNzLmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgY29udHJvbCA9IChtUGFyYW1ldGVycy5jb250cm9sSWQgPyBtUGFyYW1ldGVycy52aWV3LmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSA6IG1QYXJhbWV0ZXJzLnZpZXcpIGFzXG5cdFx0XHRcdHwgQ29udHJvbFxuXHRcdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRcdGxldCBvUmVzdWx0OiBQcm9taXNlU2V0dGxlZFJlc3VsdDxPcGVyYXRpb25SZXN1bHQ+W107XG5cdFx0XHRpZiAoY29udGV4dFRvUHJvY2VzcyAmJiBtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0cyA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHMgOiBbbVBhcmFtZXRlcnMuY29udGV4dHNdOyAvLyBFbnN1cmUgdGhhdCBjb250ZXh0cyBpcyBhbiBhcnJheSAoZm9yIHN0YXRpYyBhY3Rpb25zIGl0J3Mgbm90IGFuIHdlIG5lZWQgdG8gZml4IGl0KVxuXG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRhY3Rpb25QYXRoID0gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHRzWzBdLmdldFBhdGgoKSl9LyR7c0FjdGlvbk5hbWV9YCxcblx0XHRcdFx0XHRib3VuZEFjdGlvbiA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHthY3Rpb25QYXRofS9AJHVpNS5vdmVybG9hZC8wYCkhO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoPEVkbUFjdGlvbiB8IHVuZGVmaW5lZD4oYm91bmRBY3Rpb24uZ2V0UGF0aCgpKS50YXJnZXQ7XG5cdFx0XHRcdGlmICghY29udmVydGVkQWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBib3VuZCBhY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG5ldyBPcGVyYXRpb24oYXBwQ29tcG9uZW50LCBvTW9kZWwsIGNvbnZlcnRlZEFjdGlvbiwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0Y29udGV4dHMsXG5cdFx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBtUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRleHRCaW5kaW5nUHJvdGVjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRcdGVuaGFuY2Ukc2VsZWN0OiB0cnVlLFxuXHRcdFx0XHRcdFx0Z3JvdXBJZDogbVBhcmFtZXRlcnMuZ3JvdXBJZCxcblx0XHRcdFx0XHRcdGlnbm9yZUVUYWc6IG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhRXZlbnRzOiB7XG5cdFx0XHRcdFx0XHRvbk9EYXRhU3VibWl0OiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyPy5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uT0RhdGFSZXNwb25zZTogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvblJlcXVlc3RTaWRlRWZmZWN0czogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZUFjdGlvbkVuYWJsZW1lbnRPbk9wZXJhdGlvbih7XG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRyb2w6IGNvbnRyb2wsXG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVkQWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dmlldzogbVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXcsXG5cdFx0XHRcdFx0aXNDcmVhdGVBY3Rpb246IG1QYXJhbWV0ZXJzLmlzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHR9KS5leGVjdXRlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQWN0aW9uSW1wb3J0KHNBY3Rpb25OYW1lLCBvTW9kZWwsIGFwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdHBhcmFtZXRlclZhbHVlczogbVBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBNdWx0aVZhbHVlRmllbGRJdGVtW10+W10sXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1QYXJhbWV0ZXJzLmJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0b0RhdGFFdmVudHM6IHtcblx0XHRcdFx0XHRcdG9uT0RhdGFTdWJtaXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uT0RhdGFSZXNwb25zZTogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdFx0aWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdHZpZXc6IG1QYXJhbWV0ZXJzLnZpZXcgYXMgRkVWaWV3XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0dGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRcdHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1QYXJhbWV0ZXJzLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGNvbGxlY3Rpb24gbmFtZSBmcm9tIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgY29sbGVjdGlvbiBuYW1lXG5cdCAqL1xuXHRnZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIChNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRPYmplY3QgYXMgRW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkKVxuXHRcdFx0Py5uYW1lO1xuXHR9XG5cblx0aGFuZGxlQWN0aW9uRW5hYmxlbWVudE9uT3BlcmF0aW9uKHBhcmFtZXRlcnM6IHtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0Y29udHJvbD86IENvbnRyb2w7XG5cdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdGNvbnZlcnRlZEFjdGlvbjogRWRtQWN0aW9uO1xuXHR9KTogdm9pZCB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgJiYgcGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRcdGxldCBzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdID0gW107XG5cdFx0XHQvL2NoZWNrIGZvciBza2lwcGluZyBzdGF0aWMgYWN0aW9uc1xuXHRcdFx0aWYgKCFhY3Rpb25IZWxwZXIuaXNTdGF0aWNBY3Rpb24ocGFyYW1ldGVycy5jb252ZXJ0ZWRBY3Rpb24pKSB7XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiKSB8fCBbXTtcblx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0SlNPTi5wYXJzZShwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCksXG5cdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocGFyYW1ldGVycy5jb250cm9sKSB7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5jb250cm9sLmdldFNlbGVjdGVkQ29udGV4dHMoKSBhcyBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChcblx0XHRcdFx0XHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRKU09OLnBhcnNlKHBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcInRhYmxlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvL3VwZGF0ZSBkZWxldGUgYnV0dG9uXG5cdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMocGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCwgc2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZUFjdGlvblJlc3BvbnNlKFxuXHRcdG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH0sXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBAZmluYWxcblx0ICovXG5cdGhhbmRsZVZhbGlkYXRpb25FcnJvcigpOiB2b2lkIHtcblx0XHRjb25zdCBlcnJvclRvUmVtb3ZlID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChlcnJvcjogTWVzc2FnZSkgPT4gZXJyb3IudmFsaWRhdGlvbik7IC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRNZXNzYWdpbmcucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBQb3BvdmVyLiBGYWN0b3J5IG1ldGhvZCB0byBtYWtlIHVuaXQgdGVzdHMgZWFzaWVyLlxuXHQgKiBAcGFyYW0gc2V0dGluZ3MgSW5pdGlhbCBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3ZlclxuXHQgKiBAcmV0dXJucyBBIG5ldyBQb3BvdmVyXG5cdCAqL1xuXHRfY3JlYXRlUG9wb3ZlcihzZXR0aW5ncz86ICRQb3BvdmVyU2V0dGluZ3MpOiBQb3BvdmVyIHtcblx0XHRyZXR1cm4gbmV3IFBvcG92ZXIoc2V0dGluZ3MpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciB0byBjb25maXJtIGRpc2NhcmQgaWYgbmVlZGVkLlxuXHQgKiBAcGFyYW0gY2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gaXNNb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgYW5kIGEgY29uZmlybWF0aW9uIHBvcG92ZXIgbXVzdCBiZSBzaG93blxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBUaGUgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgX2NvbmZpcm1EaXNjYXJkKGNhbmNlbEJ1dHRvbjogQnV0dG9uLCBpc01vZGlmaWVkOiBib29sZWFuLCByZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gSWYgdGhlIGRhdGEgaXNuJ3QgbW9kaWZpZWQsIGRvIG5vdCBzaG93IGFueSBjb25maXJtYXRpb24gcG9wb3ZlclxuXHRcdGlmICghaXNNb2RpZmllZCkge1xuXHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cblx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdGNvbnN0IGNvbmZpcm1hdGlvblBvcG92ZXIgPSB0aGlzLl9jcmVhdGVQb3BvdmVyKHtcblx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJUb3BcIlxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBvcG92ZXJcblx0XHRcdGNvbnN0IHRpdGxlID0gbmV3IFRleHQoe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX01FU1NBR0VcIilcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgY29uZmlybUJ1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSxcblx0XHRcdFx0d2lkdGg6IFwiMTAwJVwiLFxuXHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5kYXRhKFwiY29udGludWVEaXNjYXJkXCIsIHRydWUpO1xuXHRcdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmFkZENvbnRlbnQobmV3IFZCb3goeyBpdGVtczogW3RpdGxlLCBjb25maXJtQnV0dG9uXSB9KSk7XG5cblx0XHRcdC8vIEF0dGFjaCBoYW5kbGVyXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEJlZm9yZU9wZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLnNldEluaXRpYWxGb2N1cyhjb25maXJtQnV0dG9uKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5hdHRhY2hBZnRlckNsb3NlKCgpID0+IHtcblx0XHRcdFx0Y2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdGlmIChjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIikpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLm9wZW5CeShjYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWxvYWRzIGRhdGEgZm9yIGFuIE9EYXRhTGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdGJpbmRpbmcgdG8gcmVmcmVzaFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Vcblx0ICovXG5cdGFzeW5jIHJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Ly8gV2UgdXNlIGEgc2lkZS1lZmZlY3QgcmVmcmVzaCBmb3IgYSBUcmVlVGFibGUsIHRvIHByZXNlcnZlIGV4cGFuc2lvbiBzdGF0ZXNcblx0XHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogXCJcIiB9XSwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpISk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdFJlZnJlc2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXdhaXQgYXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH1dLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHJlZnJlc2hpbmcgbGlzdCBiaW5kaW5nICR7bGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWAsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY3JlYXRlV2l0aERpYWxvZyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRmaWVsZE5hbWVzOiBzdHJpbmdbXSxcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRcdGJJc0NyZWF0ZURpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRcdFx0YWZ0ZXJDcmVhdGVDYWxsQmFjaz86IChuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRcdFx0cGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGxpc3RNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRSZXNvbHZlZFBhdGgoKSEpO1xuXG5cdFx0Ly8gQ3JlYXRlIGEgZmFrZSAodHJhbnNpZW50KSBsaXN0QmluZGluZyBhbmQgY29udGV4dCwganVzdCBmb3IgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgZGlhbG9nXG5cdFx0Y29uc3QgdHJhbnNpZW50TGlzdEJpbmRpbmcgPSBtb2RlbC5iaW5kTGlzdChsaXN0QmluZGluZy5nZXRQYXRoKCksIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0fSk7XG5cdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdGNvbnN0IHRyYW5zaWVudENvbnRleHQgPSB0cmFuc2llbnRMaXN0QmluZGluZy5jcmVhdGUocGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblx0XHRjb25zdCBmaWVsZE1ldGFDb250ZXh0cyA9IGZpZWxkTmFtZXMubWFwKChuYW1lKSA9PiB7XG5cdFx0XHRyZXR1cm4gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke2xpc3RNZXRhUGF0aH0vJHtuYW1lfWApIGFzIENvbnRleHQ7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjcmVhdGVEaWFsb2cgPSBnZXRDb3JlVUlGYWN0b3J5KCkubmV3Q3JlYXRlRGlhbG9nKFxuXHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdGZpZWxkTmFtZXMsXG5cdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uRGlhbG9nID8gXCJTdGFuZGFsb25lXCIgOiBcIldpdGhOYXZpZ2F0aW9uXCIsXG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0XHQpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IENvbW1vblV0aWxzLnNldFVzZXJEZWZhdWx0cyhcblx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRmaWVsZE1ldGFDb250ZXh0cyxcblx0XHRcdFx0dHJhbnNpZW50Q29udGV4dCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdCk7XG5cdFx0XHRjcmVhdGVEaWFsb2cub3BlbkRpYWxvZygpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHRQcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8T0RhdGFWNENvbnRleHQ+KCk7XG5cblx0XHRjb25zdCBvbkV4aXREaWFsb2cgPSBhc3luYyAoZXZlbnQ6IEV4aXREaWFsb2dFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0aWYgKCFldmVudC5nZXRQYXJhbWV0ZXIoXCJhY2NlcHRcIikpIHtcblx0XHRcdFx0Ly8gVXNlciBoYXMgY2FuY2VsbGVkIGNyZWF0aW9uOiBkZXN0cm95IHRoZSB0cmFuc2llbnQgbGlzdCBiaW5kaW5nIGFuZCBjbG9zZSB0aGUgZGlhbG9nXG5cdFx0XHRcdHRyYW5zaWVudExpc3RCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjcmVhdGVEaWFsb2cuc2V0QnVzeSh0cnVlKTtcblx0XHRcdHBhcmFtZXRlcnMuYklzQ3JlYXRlRGlhbG9nID0gdHJ1ZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHRyYW5zaWVudERhdGEgPSB0cmFuc2llbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgY3JlYXRlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0T2JqZWN0LmtleXModHJhbnNpZW50RGF0YSkuZm9yRWFjaCgocHJvcGVydHlQYXRoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtsaXN0TWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdC8vIEVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBhcyBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0Ly8gQW5kIHJlbW92ZSBhbnkgcHJvcGVydHkgc3RhcnRpbmcgYnkgQCR1aTUgYXMgdGhleSBhcmUgbm90IHByb3BlcnR5IGNyZWF0ZWQgYnkgZmlsbGluZyB0aGUgZm9ybVxuXHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmICFwcm9wZXJ0eVBhdGg/LnN0YXJ0c1dpdGgoXCJAJHVpNVwiKSkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlRGF0YVtwcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtwcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHQvL2JlZm9yZUNyZWF0ZUNhbGxCYWNrIGV4cGVjdHMgY3JlYXRlUGFyYW1ldGVycyBvZiB0eXBlIGFueVtdXG5cdFx0XHRcdFx0Y29uc3QgY3JlYXRlRGF0YUFzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjcmVhdGVEYXRhKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgW2tleV06IHZhbHVlIH0pKTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGNyZWF0ZURhdGFBc0FycmF5XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLk9uQmVmb3JlQ3JlYXRlRmFpbGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjcmVhdGVEYXRhID0gY3JlYXRlRGF0YUFzQXJyYXkucmVkdWNlKChyZXN1bHQsIGN1cnJlbnRPYmplY3QpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7IC4uLnJlc3VsdCwgLi4uY3VycmVudE9iamVjdCB9O1xuXHRcdFx0XHRcdH0sIHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMoY3JlYXRlRGF0YSkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbmV3Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChsaXN0QmluZGluZywgY3JlYXRlRGF0YSwge1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0ZUluYWN0aXZlOiBwYXJhbWV0ZXJzLmluYWN0aXZlLFxuXHRcdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3MgPSBhd2FpdCB0aGlzLndhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0NvbnRleHQsIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9PT0gdHJ1ZSk7XG5cdFx0XHRcdGlmIChjcmVhdGlvblN1Y2Nlc3MpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcGFyYW1ldGVycy5hZnRlckNyZWF0ZUNhbGxCYWNrPy4obmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5kaXNwbGF5RXJyb3JNZXNzYWdlcyhNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpKTtcblx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgc2hvd0JvdW5kU3RhdGVNZXNzYWdlczogdHJ1ZSB9KTtcblxuXHRcdFx0XHRcdFx0Ly8gRGVsZXRlIHRoZSBjcmVhdGVkIGRvY3VtZW50IGFuZCByZWZyZXNoIGl0cyBsaXN0IGJpbmRpbmcgKG90aGVyd2lzZSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzdGlsbCB2aXNpYmxlIGluIHRoZSBsaXN0KVxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudChuZXdDb250ZXh0LCB7IHNpbGVudE1vZGU6IHRydWUgfSwgYXBwQ29tcG9uZW50LCByZXNvdXJjZU1vZGVsLCBtZXNzYWdlSGFuZGxlcik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgYXBwQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcvc2F2aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVzb2x2ZShuZXdDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjcmVhdGlvbiBmYWlsZWQsIGRpYWxvZyBzaG91bGQgc3RheSBvcGVuIC0gdG8gYWNoaWV2ZSB0aGUgc2FtZSwgbm90aGluZyBoYXMgdG8gYmUgZG9uZSAobGlrZSBpbiBjYXNlIG9mIHN1Y2Nlc3Mgd2l0aCBiS2VlcERpYWxvZ09wZW4pXG5cdFx0XHRcdGlmICghW0ZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQsIEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWRdLmluY2x1ZGVzKGVycm9yKSkge1xuXHRcdFx0XHRcdC8vIG90aGVyIGVycm9ycyBhcmUgbm90IGV4cGVjdGVkXG5cdFx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGNyZWF0ZURpYWxvZy5jbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdHJlc3VsdFByb21pc2VLZWVwZXIucmVqZWN0KGVycm9yIGFzIHN0cmluZyB8IEVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0Y3JlYXRlRGlhbG9nLnNldEJ1c3koZmFsc2UpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoeyBpc09wZXJhdGlvbkRpYWxvZ09wZW46IGNyZWF0ZURpYWxvZy5pc09wZW4oKSB9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y3JlYXRlRGlhbG9nLmF0dGFjaEV4aXREaWFsb2coe30sIG9uRXhpdERpYWxvZyk7XG5cblx0XHRyZXR1cm4gcmVzdWx0UHJvbWlzZUtlZXBlci5wcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdhaXRzIGZvciB0aGUgY3JlYXRpb24gb2YgYSBjb250ZXh0IHRvIGJlIGZpbmlzaGVkLlxuXHQgKiBAcGFyYW0gbmV3Q29udGV4dCBUaGUgY29udGV4dCBiZWluZyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsXG5cdCAqL1xuXHRhc3luYyB3YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdDb250ZXh0OiBPRGF0YVY0Q29udGV4dCwga2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxib29sZWFuPigpO1xuXHRcdGNvbnN0IHBhcmVudExpc3RCaW5kaW5nID0gbmV3Q29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblxuXHRcdGNvbnN0IG9uQ3JlYXRlQ29tcGxldGVkID0gKGV2ZW50OiBPRGF0YUxpc3RCaW5kaW5nJENyZWF0ZUNvbXBsZXRlZEV2ZW50KTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChjcmVhdGVkQ29udGV4dCA9PT0gbmV3Q29udGV4dCkge1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5kZXRhY2hDcmVhdGVDb21wbGV0ZWQob25DcmVhdGVDb21wbGV0ZWQpO1xuXHRcdFx0XHRwcm9taXNlS2VlcGVyLnJlc29sdmUoc3VjY2VzcyA9PT0gdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHBhcmVudExpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cblx0XHRjb25zdCBjcmVhdGlvblN1Y2Nlc3NmdWwgPSBhd2FpdCBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdFx0aWYgKCFjcmVhdGlvblN1Y2Nlc3NmdWwpIHtcblx0XHRcdGlmICgha2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCkge1xuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHBlbmRpbmcgUE9TVCBhbmQgZGVsZXRlIHRoZSBjb250ZXh0IGluIHRoZSBsaXN0QmluZGluZ1xuXHRcdFx0XHQobmV3Q29udGV4dC5jcmVhdGVkKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCkpLmNhdGNoKGZ1bmN0aW9uIChjb250ZXh0RXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRwYXJlbnRMaXN0QmluZGluZy5nZXRNb2RlbCgpLnJlc2V0Q2hhbmdlcyhwYXJlbnRMaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHRcdFx0XHR0aHJvdyBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIE5ld0FjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBTdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uXG5cdCAqIEBwYXJhbSBbb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVdXG5cdCAqIEBwYXJhbSBzQ3JlYXRlSGFzaCBIYXNoIHRvIGJlIGNoZWNrZWQgZm9yIGFjdGlvbiB0eXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgTmV3QWN0aW9uIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gc01ldGFQYXRoIFRoZSBNZXRhUGF0aFxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldE5ld0FjdGlvbihcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IHtcblx0XHRcdHByZWZlcnJlZE1vZGU/OiBzdHJpbmdbXTtcblx0XHR9LFxuXHRcdHNDcmVhdGVIYXNoOiBzdHJpbmcsXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmdcblx0KTogc3RyaW5nIHtcblx0XHRsZXQgc05ld0FjdGlvbjtcblxuXHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgc0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkktQUNUSU9OPUNSRUFURVdJVEhcIikpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkNSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmXG5cdFx0XHRzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049QVVUT0NSRUFURVdJVEhcIilcblx0XHQpIHtcblx0XHRcdGNvbnN0IHNQcmVmZXJyZWRNb2RlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF07XG5cdFx0XHRzTmV3QWN0aW9uID0gc1ByZWZlcnJlZE1vZGUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhcIkFVVE9DUkVBVEVXSVRIOlwiKVxuXHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cmluZyhzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCkgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxhYmVsIGZvciB0aGUgdGl0bGUgb2YgYSBzcGVjaWZpYyBjcmVhdGUgYWN0aW9uIGRpYWxvZywgZS5nLiBDcmVhdGUgU2FsZXMgT3JkZXIgZnJvbSBRdW90YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgcHJpb3JpdHkgaXMgYXBwbGllZDpcblx0ICogMS4gbGFiZWwgb2YgbGluZS1pdGVtIGFubm90YXRpb24uXG5cdCAqIDIuIGxhYmVsIGFubm90YXRlZCBpbiB0aGUgYWN0aW9uLlxuXHQgKiAzLiBcIkNyZWF0ZVwiIGFzIGEgY29uc3RhbnQgZnJvbSBpMThuLlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEBwYXJhbSBzTmV3QWN0aW9uIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgUmVzb3VyY2VCdW5kbGUgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IENyZWF0ZSBsYWJlbFxuXHQgKiBAcmV0dXJucyBUaGUgbGFiZWwgZm9yIHRoZSBDcmVhdGUgQWN0aW9uIERpYWxvZ1xuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsIHwgdW5kZWZpbmVkXG5cdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbGluZUl0ZW1zID0gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkgYXMgTGluZUl0ZW0gfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBsYWJlbCA9IGxpbmVJdGVtcz8uZmluZCgobGluZUl0ZW0pID0+IGlzRGF0YUZpZWxkRm9yQWN0aW9uKGxpbmVJdGVtKSAmJiBsaW5lSXRlbS5BY3Rpb24uc3BsaXQoXCIoXCIsIDEpWzBdID09PSBzTmV3QWN0aW9uKVxuXHRcdFx0Py5MYWJlbDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRsYWJlbCB8fFxuXHRcdFx0b01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzTmV3QWN0aW9ufUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTGFiZWxgKSB8fFxuXHRcdFx0cmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX1NBUEZFX0FDVElPTl9DUkVBVEVcIilcblx0XHQpO1xuXHR9XG59XG5cbmNvbnN0IHNpbmdsZXRvbiA9IG5ldyBUcmFuc2FjdGlvbkhlbHBlcigpO1xuZXhwb3J0IGRlZmF1bHQgc2luZ2xldG9uO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7RUEyREEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7RUFDM0MsTUFBTUUsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCOztFQUVuRDtFQUNBLE1BQU1DLGlCQUFpQixHQUFHQyxZQUFZLENBQUNELGlCQUFpQjtFQUN4RCxNQUFNRSwwQkFB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
|
|
1306
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiRGVsZXRlT3B0aW9uVHlwZXMiLCJkZWxldGVIZWxwZXIiLCJEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCIsImdldFBhcmFtZXRlcnMiLCJtUGFyYW1ldGVycyIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsIlRyYW5zYWN0aW9uSGVscGVyIiwiX3Byb3RvIiwicHJvdG90eXBlIiwiYnVzeUxvY2siLCJhcHBDb21wb25lbnQiLCJidXN5UGF0aCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZ2V0TW9kZWwiLCJidXN5VW5sb2NrIiwidW5sb2NrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsInNvdXJjZSIsInBhdGgiLCJpc0EiLCJnZXRQYXRoIiwiaXNSZWxhdGl2ZSIsImdldFJlc29sdmVkUGF0aCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsIk1vZGVsSGVscGVyIiwiaXNEcmFmdFN1cHBvcnRlZCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib0NvbnRleHQiLCJvVmlldyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJzTW9kdWxlIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXBsYWNlIiwic0Z1bmN0aW9uTmFtZSIsImxlbmd0aCIsIm1EYXRhIiwiZGF0YSIsIkZQTUhlbHBlciIsInZhbGlkYXRpb25XcmFwcGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXREYXRhRnJvbURlZmF1bHRWYWx1ZUZ1bmN0aW9uIiwibGlzdEJpbmRpbmciLCJtb2RlbCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJsaXN0QmluZGluZ09iamVjdFBhdGgiLCJNZXRhTW9kZWxDb252ZXJ0ZXIiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0IiwidGFyZ2V0T2JqZWN0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEZWZhdWx0VmFsdWVzRnVuY3Rpb24iLCJkZWZhdWx0RnVuY09uVGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVmYXVsdEZ1bmN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImZ1bmN0aW9uT25OYXZQcm9wIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkZWZhdWx0RnVuY3Rpb25Db250ZXh0IiwiYmluZGluZ1BhdGgiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsInN0YXJ0c1dpdGgiLCJpbmNsdWRlcyIsImZpcnN0TmF2Iiwic3BsaXQiLCJwYXJlbnRQYXRoIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJnZXRIZWFkZXJDb250ZXh0IiwiZGVmYXVsdEZ1bmN0aW9uUGF0aCIsImdldE1ldGFQYXRoIiwiZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aCIsImRlZmF1bHRGdW5jdGlvblJlc3VsdCIsImlzQm91bmQiLCJvcGVyYXRpb25zIiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJ0b1N0cmluZyIsImNhbGxGdW5jdGlvbkltcG9ydCIsImdldE9iamVjdCIsImlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwiLCJnZXRBZ2dyZWdhdGlvbiIsImhpZXJhcmNoeVF1YWxpZmllciIsImlzTGlzdEJpbmRpbmdBbmFseXRpY2FsIiwiYWdncmVnYXRpb24iLCJjcmVhdGVDb250ZXh0IiwiaW5pdGlhbERhdGEiLCJvcHRpb25zIiwiZGF0YUZvckNyZWF0aW9uIiwibGlzdEJpbmRpbmdGb3JDcmVhdGlvbiIsInBhcmVudENvbnRleHQiLCJpc0V4cGFuZGVkIiwiZXhwYW5kIiwiT2JqZWN0IiwiYXNzaWduIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJnZXRHcm91cElkIiwiJCR1cGRhdGVHcm91cElkIiwiZ2V0VXBkYXRlR3JvdXBJZCIsIm9iamVjdFBhdGgiLCJwYXJlbnROYXZpZ2F0aW9uIiwidGFyZ2V0RW50aXR5VHlwZSIsIkFnZ3JlZ2F0aW9uIiwiUGFyZW50TmF2aWdhdGlvblByb3BlcnR5IiwidmFsdWUiLCJFcnJvciIsInBhcmVudEJpbmRpbmdEYXRhIiwiY3JlYXRlIiwiY3JlYXRlQXRFbmQiLCJjcmVhdGVJbmFjdGl2ZSIsImdldENyZWF0aW9uUGFyYW1ldGVycyIsImNyZWF0ZURhdGEiLCJtZXRhUGF0aCIsIm5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsImdldENyZWF0ZVBvcHVwRmllbGRzIiwiZmlsdGVyIiwiZmllbGROYW1lIiwiY3JlYXRlRG9jdW1lbnQiLCJtYWluTGlzdEJpbmRpbmciLCJpblBhcmFtZXRlcnMiLCJyZXNvdXJjZU1vZGVsIiwibWVzc2FnZUhhbmRsZXIiLCJmcm9tQ29weVBhc3RlIiwibmV3RG9jdW1lbnRDb250ZXh0IiwicGFyYW1ldGVycyIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRCdXN5UGF0aCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiaW5hY3RpdmUiLCJtZXNzYWdlSGFuZGxpbmdLZXkiLCJyZWdpc3RlclRvSG9sZE1lc3NhZ2VzIiwicGVyZm9ybUNyZWF0aW9uIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250cm9sIiwicGFyZW50Q29udHJvbCIsInVuSG9sZEtleSIsImVycm9yIiwiQ29uc3RhbnRzIiwiQWN0aW9uRXhlY3V0aW9uRmFpbGVkIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJidXN5TW9kZSIsImJ1c3lJZCIsImNyZWF0ZURvY3VtZW50Q29udGV4dCIsImNyZWF0ZVBhcmFtZXRlcnMiLCJlbnRyaWVzIiwibWFwIiwiX3JlZiIsImtleSIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiTG9nIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJyZWR1Y2UiLCJyZXN1bHQiLCJjdXJyZW50T2JqZWN0IiwiY3JlYXRlUHJvbWlzZSIsIkNvbW1vblV0aWxzIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwic3VibWl0QmF0Y2giLCJjcmVhdGVIYXNoIiwiZ2V0Um91dGVyUHJveHkiLCJnZXRIYXNoIiwiY29tcG9uZW50RGF0YSIsImdldENvbXBvbmVudERhdGEiLCJzdGFydHVwUGFyYW1ldGVycyIsIm5ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJwZXJmb3JtQ3JlYXRpb25XaXRoQWN0aW9uIiwic3RhdHVzIiwicmVhc29uIiwicmV0dXJuZWRDb250ZXh0IiwicGVyZm9ybUNyZWF0aW9uV2l0aFBPU1QiLCJhY3Rpb25OYW1lIiwiaGVhZGVyQ29udGV4dFBhdGgiLCJtZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJzZWxlY3RlZFByb3BlcnRpZXMiLCJwdXNoIiwiam9pbiIsImNhbGxBY3Rpb24iLCJjb250ZXh0cyIsInNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2ciLCJsYWJlbCIsIl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsIiwidmlldyIsImlzQ3JlYXRlQWN0aW9uIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImRlZmF1bHRWYWx1ZUZ1bmN0aW9uRGF0YSIsImNhbkhhdmVEaWFsb2ciLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIklubGluZSIsImNyZWF0aW9uRGlhbG9nRmllbGRzIiwiQ3JlYXRpb25EaWFsb2ciLCJmb3JFYWNoIiwiY3JlYXRlV2l0aERpYWxvZyIsIndhaXRGb3JDcmVhdGVDb21wbGV0aW9uIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsIm1zZyIsIm1lc3NhZ2UiLCJfaXNEcmFmdEVuYWJsZWQiLCJ2Q29udGV4dHMiLCJjb250ZXh0Rm9yRHJhZnRNb2RlbCIsInNQcm9ncmFtbWluZ01vZGVsIiwiZGVsZXRlRG9jdW1lbnQiLCJjb250ZXh0c1RvRGVsZXRlIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlyc3RDb250ZXh0Iiwic2VsZWN0ZWRDb250ZXh0cyIsInJlamVjdCIsImRyYWZ0RW5hYmxlZCIsIml0ZW1zIiwidW5TYXZlZENvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0Q29sbGVjdGlvbk5hbWVGcm9tQ29udGV4dCIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImxvY2tlZENvbnRleHQiLCJmaW5kIiwiY29udGV4dERhdGEiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5IiwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEiLCJJblByb2Nlc3NCeVVzZXIiLCJEcmFmdElzQ3JlYXRlZEJ5TWUiLCJsb2NraW5nVXNlck5hbWUiLCJNZXNzYWdlQm94Iiwic2hvdyIsImdldFRleHQiLCJ0aXRsZSIsIm9uQ2xvc2UiLCJub25UYWJsZVR4dCIsInVuU2F2ZWRDb250ZXh0VXNlciIsImRlc2NyaXB0aW9uIiwidHlwZSIsImRlbGV0YWJsZUNvbnRleHRzIiwidGV4dCIsInNlbGVjdGVkIiwiVEVYVCIsInRvdGFsRGVsZXRhYmxlIiwiZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJ1blNhdmVkQ29udGV4dHMiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsIm5vbkRlbGV0YWJsZVRleHQiLCJnZXROb25EZWxldGFibGVUZXh0Iiwib3B0aW9uc0RlbGV0YWJsZVRleHRzIiwiZ2V0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzIiwiY29tbW9uQmluZGluZyIsImdldEJpbmRpbmciLCJiaW5kaW5nVHlwZSIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJmbkNvbmZpcm0iLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwib0Vycm9yIiwiZGlhbG9nIiwiY3JlYXRlRGVsZXRlRGlhbG9nIiwibm9EaWFsb2ciLCJzaWxlbnRNb2RlIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJmblJlamVjdCIsImRpYWxvZ0NvbmZpcm1lZCIsInZCb3giLCJWQm94IiwicmVzb3VyY2VCdW5kbGVDb3JlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiYXJpYUxhYmVsbGVkQnkiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInByZXNzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImVkaXREb2N1bWVudCIsImdyb3VwSWQiLCJ0cmFuc2FjdGlvbkRldGFpbHMiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJvTmV3Q29udGV4dCIsImRyYWZ0IiwiY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJiUHJlc2VydmVDaGFuZ2VzIiwic3RpY2t5IiwiZWRpdERvY3VtZW50SW5TdGlja3lTZXNzaW9uIiwiZXJyIiwic2hvd01lc3NhZ2VzIiwiY29uY3VycmVudEVkaXRGbGFnIiwiY2FuY2VsRG9jdW1lbnQiLCJtSW5QYXJhbWV0ZXJzIiwiaXNOZXdPYmplY3QiLCJpc09iamVjdE1vZGlmaWVkIiwib01vZGVsIiwicmV0dXJuZWRWYWx1ZSIsInNpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCIsImRyYWZ0QWRtaW5EYXRhIiwic2libGluZ0NvbnRleHQiLCJkcmFmdERhdGFDb250ZXh0IiwiYWxsIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJyZXF1ZXN0T2JqZWN0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9jb25maXJtRGlzY2FyZCIsImNhbmNlbEJ1dHRvbiIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZURyYWZ0IiwiZGlzY2FyZGVkQ29udGV4dCIsImRpc2NhcmREb2N1bWVudCIsInJlZnJlc2giLCJzYXZlRG9jdW1lbnQiLCJleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYmluZGluZ3NGb3JTaWRlRWZmZWN0cyIsInNraXBDb25maXJtYXRpb25Nc2ciLCJhcmd1bWVudHMiLCJpc1N0YW5kYXJkU2F2ZSIsIm9BY3RpdmVEb2N1bWVudCIsImFjdGl2YXRlRG9jdW1lbnQiLCJtZXNzYWdlc1JlY2VpdmVkIiwiZ2V0TWVzc2FnZXMiLCJjb25jYXQiLCJnZXRUeXBlIiwiTWVzc2FnZVR5cGUiLCJTdWNjZXNzIiwiTWVzc2FnZVRvYXN0IiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNBY3Rpb25OYW1lIiwiY29udGV4dFRvUHJvY2VzcyIsInNOYW1lIiwiY29udHJvbElkIiwiYnlJZCIsIm9SZXN1bHQiLCJhY3Rpb25QYXRoIiwiYm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnZlcnRlZFR5cGVzIiwiY29udmVydFR5cGVzIiwiY29udmVydGVkQWN0aW9uIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXQiLCJPcGVyYXRpb24iLCJwYXJhbWV0ZXJWYWx1ZXMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJvRGF0YVByb3BlcnRpZXMiLCJnaG9zdENvbnRleHRCaW5kaW5nUHJvdGVjdGlvbiIsImVuaGFuY2Ukc2VsZWN0IiwiaWdub3JlRVRhZyIsIm9EYXRhRXZlbnRzIiwib25PRGF0YVN1Ym1pdCIsIm9uT0RhdGFSZXNwb25zZSIsIm9uUmVxdWVzdFNpZGVFZmZlY3RzIiwiaGFuZGxlQWN0aW9uRW5hYmxlbWVudE9uT3BlcmF0aW9uIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJvcGVyYXRpb25BdmFpbGFibGVNYXAiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJleGVjdXRlIiwiY2FsbEFjdGlvbkltcG9ydCIsIl9oYW5kbGVBY3Rpb25SZXNwb25zZSIsIm5hbWUiLCJhY3Rpb25IZWxwZXIiLCJpc1N0YXRpY0FjdGlvbiIsImdldFByb3BlcnR5IiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJKU09OIiwicGFyc2UiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwidXBkYXRlRGVsZXRlSW5mb0ZvclNlbGVjdGVkQ29udGV4dHMiLCJhVHJhbnNpZW50TWVzc2FnZXMiLCJzZXRQcm9wZXJ0eSIsImhhbmRsZVZhbGlkYXRpb25FcnJvciIsImVycm9yVG9SZW1vdmUiLCJNZXNzYWdpbmciLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwiX2NyZWF0ZVBvcG92ZXIiLCJzZXR0aW5ncyIsIlBvcG92ZXIiLCJpc01vZGlmaWVkIiwic2V0RW5hYmxlZCIsImNvbmZpcm1hdGlvblBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiVGV4dCIsImNvbmZpcm1CdXR0b24iLCJ3aWR0aCIsImFkZENvbnRlbnQiLCJhdHRhY2hCZWZvcmVPcGVuIiwic2V0SW5pdGlhbEZvY3VzIiwiYXR0YWNoQWZ0ZXJDbG9zZSIsIm9wZW5CeSIsInJlZnJlc2hMaXN0QmluZGluZyIsImlzUm9vdCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwicmVxdWVzdFJlZnJlc2giLCJmaWVsZE5hbWVzIiwibGlzdE1ldGFQYXRoIiwidHJhbnNpZW50TGlzdEJpbmRpbmciLCJyZWZyZXNoSW50ZXJuYWwiLCJ0cmFuc2llbnRDb250ZXh0IiwiZmllbGRNZXRhQ29udGV4dHMiLCJjcmVhdGVEaWFsb2ciLCJnZXRDb3JlVUlGYWN0b3J5IiwibmV3Q3JlYXRlRGlhbG9nIiwic2V0VXNlckRlZmF1bHRzIiwiY3JlYXRlQWN0aW9uIiwib3BlbkRpYWxvZyIsImUiLCJyZXN1bHRQcm9taXNlS2VlcGVyIiwiUHJvbWlzZUtlZXBlciIsIm9uRXhpdERpYWxvZyIsImV2ZW50IiwiZ2V0UGFyYW1ldGVyIiwiY2xvc2VEaWFsb2ciLCJzZXRCdXN5IiwiYklzQ3JlYXRlRGlhbG9nIiwidHJhbnNpZW50RGF0YSIsImtleXMiLCJwcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsImNyZWF0ZURhdGFBc0FycmF5IiwiX3JlZjIiLCJVaU1vZGVsQ29uc3RhbnRzIiwiRG9jdW1lbnRNb2RpZmllZCIsIm5ld0NvbnRleHQiLCJjcmVhdGlvblN1Y2Nlc3MiLCJhZnRlckNyZWF0ZUNhbGxCYWNrIiwiZGlzcGxheUVycm9yTWVzc2FnZXMiLCJzaG93Qm91bmRTdGF0ZU1lc3NhZ2VzIiwiQ3JlYXRpb25GYWlsZWQiLCJpc09wZXJhdGlvbkRpYWxvZ09wZW4iLCJpc09wZW4iLCJhdHRhY2hFeGl0RGlhbG9nIiwicHJvbWlzZSIsInByb21pc2VLZWVwZXIiLCJwYXJlbnRMaXN0QmluZGluZyIsIm9uQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRlZENvbnRleHQiLCJzdWNjZXNzIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwiYXR0YWNoQ3JlYXRlQ29tcGxldGVkIiwiY3JlYXRpb25TdWNjZXNzZnVsIiwiY3JlYXRlZCIsImNhdGNoIiwiY29udGV4dEVycm9yIiwidHJhY2UiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJzQ3JlYXRlSGFzaCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGgiLCJzTmV3QWN0aW9uIiwicHJlZmVycmVkTW9kZSIsInRvVXBwZXJDYXNlIiwic1ByZWZlcnJlZE1vZGUiLCJsaW5lSXRlbXMiLCJsaW5lSXRlbSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiLCJzaW5nbGV0b24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uLCBBY3Rpb24gYXMgRWRtQWN0aW9uLCBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBMaW5lSXRlbSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEV4aXREaWFsb2dFdmVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9VSVByb3ZpZGVyXCI7XG5pbXBvcnQgeyBnZXRDb3JlVUlGYWN0b3J5IH0gZnJvbSBcInNhcC9mZS9jb3JlL1VJUHJvdmlkZXJcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgVWlNb2RlbENvbnN0YW50cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZWRpdEZsb3dDb25zdGFudHNcIjtcbmltcG9ydCBvcGVyYXRpb25zIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBpc0RhdGFGaWVsZEZvckFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHR5cGUgeyBEZWxldGVPcHRpb24sIERlbGV0ZVBhcmFtZXRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBkZWxldGVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRGVsZXRlSGVscGVyXCI7XG5pbXBvcnQgRlBNSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0ZQTUhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0Q3JlYXRlUG9wdXBGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBQcm9taXNlS2VlcGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Byb21pc2VLZWVwZXJcIjtcbmltcG9ydCB0b0VTNlByb21pc2UgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVG9FUzZQcm9taXNlXCI7XG5pbXBvcnQgeyBpc05hdmlnYXRpb25Qcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgdHlwZSB7ICRQb3BvdmVyU2V0dGluZ3MgfSBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZEl0ZW0gZnJvbSBcInNhcC91aS9tZGMvZmllbGQvTXVsdGlWYWx1ZUZpZWxkSXRlbVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhTGlzdEJpbmRpbmckQ3JlYXRlQ29tcGxldGVkRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25SZXN1bHQgfSBmcm9tIFwiLi9vcGVyYXRpb25zL09EYXRhT3BlcmF0aW9uXCI7XG5pbXBvcnQgT3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbnMvT3BlcmF0aW9uXCI7XG5pbXBvcnQgYWN0aW9uSGVscGVyIGZyb20gXCIuL29wZXJhdGlvbnMvYWN0aW9uSGVscGVyXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGU7XG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5cbi8vRW51bXMgZm9yIGRlbGV0ZSB0ZXh0IGNhbGN1bGF0aW9ucyBmb3IgZGVsZXRlIGNvbmZpcm0gZGlhbG9nLlxuY29uc3QgRGVsZXRlT3B0aW9uVHlwZXMgPSBkZWxldGVIZWxwZXIuRGVsZXRlT3B0aW9uVHlwZXM7XG5jb25zdCBEZWxldGVEaWFsb2dDb250ZW50Q29udHJvbCA9IGRlbGV0ZUhlbHBlci5EZWxldGVEaWFsb2dDb250ZW50Q29udHJvbDtcblxuLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1QYXJhbWV0ZXJzIGlzIG5vdCB0aGUgb0V2ZW50ICovXG5mdW5jdGlvbiBnZXRQYXJhbWV0ZXJzPFQ+KG1QYXJhbWV0ZXJzPzogRXZlbnQgfCBUKTogVCB7XG5cdGlmIChtUGFyYW1ldGVycyAmJiAobVBhcmFtZXRlcnMgYXMgRXZlbnQpLmdldE1ldGFkYXRhICYmIChtUGFyYW1ldGVycyBhcyBFdmVudCkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLnVpLmJhc2UuRXZlbnRcIikge1xuXHRcdG1QYXJhbWV0ZXJzID0ge30gYXMgVDtcblx0fVxuXHRyZXR1cm4gKG1QYXJhbWV0ZXJzIGFzIFQpIHx8ICh7fSBhcyBUKTtcbn1cblxuZXhwb3J0IHR5cGUgQ3JlYXRlUGFyYW1ldGVycyA9IHtcblx0ZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRidXN5TW9kZT86IHN0cmluZztcblx0YnVzeUlkPzogc3RyaW5nO1xuXHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYm9vbGVhbjtcblx0cGFyZW50Q29udHJvbDogVmlldztcblx0aW5hY3RpdmU/OiBib29sZWFuO1xuXHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRhZnRlckNyZWF0ZUNhbGxCYWNrPzogKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlPzogc3RyaW5nO1xuXHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENhbmNlbFBhcmFtZXRlcnMgPSB7IGNhbmNlbEJ1dHRvbjogQnV0dG9uOyBza2lwRGlzY2FyZFBvcG92ZXI6IGJvb2xlYW47IGJlZm9yZUNhbmNlbENhbGxCYWNrPzogRnVuY3Rpb24gfTtcbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uRGVsZXRlUGFyYW1ldGVycyA9IERlbGV0ZVBhcmFtZXRlcnMgJiB7XG5cdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHR0aXRsZT86IHN0cmluZztcblx0bm9EaWFsb2c/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHMgPSB7XG5cdGV4aXN0aW5nRHJhZnRSZXVzZWQ/OiBib29sZWFuOyAvLyB0cnVlIGlmIGFuIGV4aXN0aW5nIGRyYWZ0IHdhcyByZXR1cm5lZCwgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBuZXcgb25lXG59O1xuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdGJ1c3lMb2NrKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBidXN5UGF0aD86IHN0cmluZyk6IHZvaWQge1xuXHRcdEJ1c3lMb2NrZXIubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0YnVzeVVubG9jayhhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgYnVzeVBhdGg/OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCdXN5TG9ja2VyLnVubG9jayhhcHBDb21wb25lbnQuZ2V0TW9kZWwoXCJ1aVwiKSwgYnVzeVBhdGgpO1xuXHR9XG5cblx0Z2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IE9EYXRhVjRDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRsZXQgcGF0aDogc3RyaW5nO1xuXHRcdGlmIChzb3VyY2UuaXNBPE9EYXRhVjRDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB7XG5cdFx0XHRwYXRoID0gc291cmNlLmdldFBhdGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGF0aCA9IChzb3VyY2UuaXNSZWxhdGl2ZSgpID8gc291cmNlLmdldFJlc29sdmVkUGF0aCgpIDogc291cmNlLmdldFBhdGgoKSkgPz8gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1ldGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCwgcGF0aCkpIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdH0gZWxzZSBpZiAobWV0YU1vZGVsICYmIE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChtZXRhTW9kZWwpKSB7XG5cdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3k7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9ncmFtbWluZ01vZGVsLk5vbkRyYWZ0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZFxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25dIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1ZpZXcgQ29udGFpbnMgdGhlIG9iamVjdCBvZiB0aGUgY3VycmVudCB2aWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgdmFsaWRhdGVEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHsgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uPzogc3RyaW5nOyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuXHRcdG9WaWV3OiBWaWV3XG5cdCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0aWYgKHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdGNvbnN0IHNNb2R1bGUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZygwLCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSB8fCAtMSkucmVwbGFjZSgvXFwuL2dpLCBcIi9cIiksXG5cdFx0XHRcdHNGdW5jdGlvbk5hbWUgPSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLnN1YnN0cmluZyhcblx0XHRcdFx0XHRzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLmxhc3RJbmRleE9mKFwiLlwiKSArIDEsXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sZW5ndGhcblx0XHRcdFx0KSxcblx0XHRcdFx0bURhdGEgPSBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0ZGVsZXRlIG1EYXRhW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdHJldHVybiBGUE1IZWxwZXIudmFsaWRhdGlvbldyYXBwZXIoc01vZHVsZSwgc0Z1bmN0aW9uTmFtZSwgbURhdGEsIG9WaWV3LCBvQ29udGV4dCk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBkZWZhdHVsIHZhbHVlcyBmcm9tIHRoZSBEZWZhdWx0VmFsdWUgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkZWZhdWx0IHZhbHVlcyAob3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm8gZGVmYXVsdCB2YWx1ZSBmdW5jdGlvbilcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZ2V0RGF0YUZyb21EZWZhdWx0VmFsdWVGdW5jdGlvbihsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8b2JqZWN0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpIGFzIHN0cmluZyk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdPYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cblx0XHRjb25zdCBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ID0gKGxpc3RCaW5kaW5nT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgTmF2aWdhdGlvblByb3BlcnR5IHwgRW50aXR5U2V0KS5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jT25UYXJnZXRFbnRpdHlTZXQgPSAobGlzdEJpbmRpbmdPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQpPy5hbm5vdGF0aW9ucy5Db21tb25cblx0XHRcdD8uRGVmYXVsdFZhbHVlc0Z1bmN0aW9uO1xuXHRcdGNvbnN0IGRlZmF1bHRGdW5jdGlvbk5hbWUgPSBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ID8/IGRlZmF1bHRGdW5jT25UYXJnZXRFbnRpdHlTZXQ7XG5cblx0XHRpZiAoIWRlZmF1bHRGdW5jdGlvbk5hbWUpIHtcblx0XHRcdC8vIE5vIGRlZmF1bHQgdmFsdWUgZnVuY3Rpb25cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZnVuY3Rpb25Pbk5hdlByb3AgPSBpc05hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZ09iamVjdFBhdGgudGFyZ2V0T2JqZWN0KSAmJiBkZWZhdWx0RnVuY09uVGFyZ2V0T2JqZWN0ICE9PSB1bmRlZmluZWQ7XG5cdFx0bGV0IGRlZmF1bHRGdW5jdGlvbkNvbnRleHQ7XG5cdFx0aWYgKGZ1bmN0aW9uT25OYXZQcm9wKSB7XG5cdFx0XHQvLyBJZiB0aGUgcGF0aCBpcyBhIGRlZXAgbmF2aWdhdGlvbiwgZGVyaXZlIHRoZSBjb3JyZWN0IHBhcmVudCBjb250ZXh0XG5cdFx0XHRjb25zdCBiaW5kaW5nUGF0aCA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBsaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRpZiAoYmluZGluZ1BhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdGRlZmF1bHRGdW5jdGlvbkNvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0fSBlbHNlIGlmIChiaW5kaW5nUGF0aCAmJiBjb250ZXh0ICYmIGJpbmRpbmdQYXRoLmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBFeHRyYWN0IHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBuYXZpZ2F0aW9uIHBhdGggKGUuZy4sIF9Ub0hlYWRlci9fVG9JdGVtcyDihpIgX1RvSGVhZGVyKVxuXHRcdFx0XHRjb25zdCBmaXJzdE5hdiA9IGJpbmRpbmdQYXRoLnNwbGl0KFwiL1wiKVswXTtcblxuXHRcdFx0XHQvLyBCdWlsZCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjb3JyZWN0IGNvbnRleHQgZm9yIHRoZSBmdW5jdGlvbiBjYWxsXG5cdFx0XHRcdGNvbnN0IHBhcmVudFBhdGggPSBgJHtjb250ZXh0LmdldFBhdGgoKX0vJHtmaXJzdE5hdn1gO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBiaW5kaW5nIGNvbnRleHQgZm9yIHRoaXMgcGF0aFxuXHRcdFx0XHRkZWZhdWx0RnVuY3Rpb25Db250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocGFyZW50UGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBGYWxsYmFjayB0byB0aGUgY3VycmVudCBjb250ZXh0IGlmIG5vIG5hdmlnYXRpb24gZm91bmRcblx0XHRcdFx0ZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vdCBhIG5hdmlnYXRpb24gcHJvcGVydHksIHVzZSB0aGUgaGVhZGVyIGNvbnRleHQgKHJvb3Qgb2JqZWN0IHBhZ2UgY29udGV4dClcblx0XHRcdGRlZmF1bHRGdW5jdGlvbkNvbnRleHQgPSBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0fVxuXHRcdGlmICghZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uUGF0aCA9IGAke21ldGFNb2RlbC5nZXRNZXRhUGF0aChkZWZhdWx0RnVuY3Rpb25Db250ZXh0LmdldFBhdGgoKSl9LyR7ZGVmYXVsdEZ1bmN0aW9uTmFtZX1gO1xuXG5cdFx0Y29uc3QgZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGRlZmF1bHRGdW5jdGlvblBhdGgpKTtcblx0XHRjb25zdCBkZWZhdWx0RnVuY3Rpb25SZXN1bHQgPSAoZGVmYXVsdEZ1bmN0aW9uT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgYXMgQWN0aW9uKT8uaXNCb3VuZFxuXHRcdFx0PyBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKGRlZmF1bHRGdW5jdGlvbk5hbWUudG9TdHJpbmcoKSwgZGVmYXVsdEZ1bmN0aW9uQ29udGV4dCwgbW9kZWwpXG5cdFx0XHQ6ICgoYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoZGVmYXVsdEZ1bmN0aW9uTmFtZS50b1N0cmluZygpLCBtb2RlbCkpIGFzIE9EYXRhVjRDb250ZXh0KTtcblxuXHRcdHJldHVybiBkZWZhdWx0RnVuY3Rpb25SZXN1bHQuZ2V0T2JqZWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgbGlzdCBiaW5kaW5nIGNvcnJlc3BvbmRzIHRvIGEgaGllcmFyY2h5LlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgbGlzdCBiaW5kaW5nIGlzIGhpZXJhcmNoaWNhbC5cblx0ICovXG5cdGlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKGxpc3RCaW5kaW5nLmdldEFnZ3JlZ2F0aW9uKCkgYXMgeyBoaWVyYXJjaHlRdWFsaWZpZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmhpZXJhcmNoeVF1YWxpZmllciA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGxpc3QgYmluZGluZyBpcyBhbmFseXRpY2FsLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUUlVFIGlmIHRoZSBsaXN0IGJpbmRpbmcgaXMgYW5hbHl0aWNhbCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRpc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0aW9uID0gbGlzdEJpbmRpbmcuZ2V0QWdncmVnYXRpb24oKSBhcyB7IGhpZXJhcmNoeVF1YWxpZmllcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXHRcdHJldHVybiBhZ2dyZWdhdGlvbiAhPT0gdW5kZWZpbmVkICYmICFhZ2dyZWdhdGlvbi5oaWVyYXJjaHlRdWFsaWZpZXI7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGluIGEgbGlzdCBiaW5kaW5nLiBIYW5kbGVzIGJvdGggZmxhdCBhbmQgaGllcmFyY2hpY2FsIGNhc2VzLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmdcblx0ICogQHBhcmFtIGluaXRpYWxEYXRhIEluaXRpYWwgZGF0YSB0byBjcmVhdGUgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvcHRpb25zIENyZWF0aW9uIG9wdGlvbnMuXG5cdCAqIEBwYXJhbSBvcHRpb25zLmNyZWF0ZUF0RW5kIENyZWF0ZSB0aGUgY29udGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChpZ25vcmVkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcGFyYW0gb3B0aW9ucy5jcmVhdGVJbmFjdGl2ZSBDcmVhdGUgdGhlIGNvbnRleHQgYXMgaW5hY3RpdmUgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBvcHRpb25zLnBhcmVudENvbnRleHQgQ3JlYXRlIHRoZSBjb250ZXh0IGFzIGFcdCBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ueSB1c2VkIGluIGNhc2Ugb2YgYSBoaWVyYXJjaHkpLlxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0LlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBjcmVhdGVDb250ZXh0KFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGluaXRpYWxEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQsXG5cdFx0b3B0aW9uczogeyBjcmVhdGVBdEVuZD86IGJvb2xlYW47IGNyZWF0ZUluYWN0aXZlPzogYm9vbGVhbjsgcGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0IH1cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IGRhdGFGb3JDcmVhdGlvbiA9IGluaXRpYWxEYXRhID8/IHt9O1xuXG5cdFx0aWYgKHRoaXMuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdGxldCBsaXN0QmluZGluZ0ZvckNyZWF0aW9uOiBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0aWYgKG9wdGlvbnMucGFyZW50Q29udGV4dD8uaXNFeHBhbmRlZCgpID09PSBmYWxzZSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgcGFyZW50IGNvbnRleHQgYWxyZWFkeSBoYXMgY2hpbGRyZW4gYW5kIGlzIGNvbGxhcHNlZCwgd2UgZXhwYW5kIGl0IGZpcnN0XG5cdFx0XHRcdGF3YWl0IGxpc3RCaW5kaW5nLmV4cGFuZChvcHRpb25zLnBhcmVudENvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdE9iamVjdC5hc3NpZ24oZGF0YUZvckNyZWF0aW9uLCB7IFwiQCR1aTUubm9kZS5wYXJlbnRcIjogb3B0aW9ucy5wYXJlbnRDb250ZXh0IH0pO1xuXHRcdFx0XHRsaXN0QmluZGluZ0ZvckNyZWF0aW9uID0gbGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBYnNvbHV0ZSBiaW5kaW5nOiBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0XG5cdFx0XHRcdC8vIFdlIHVzZSBhIHRlbXBvcmFyeSBmbGF0IGxpc3RCaW5kaW5nIGZvciB0aGUgY3JlYXRpb24sIHRvIGF2b2lkIGFkZGluZyB0aGUgbmV3IGNvbnRleHQgaW4gdGhlIHRhYmxlICh3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgaXQgdW50aWwgaXQncyBzYXZlZClcblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0bGlzdEJpbmRpbmdGb3JDcmVhdGlvbiA9IG1vZGVsLmJpbmRMaXN0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdCQkZ3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0R3JvdXBJZCgpLFxuXHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIEFkZCB0aGUgcGFyZW50IHBhdGggaW4gdGhlIGluaXRpYWwgZGF0YSBpZiBhIHBhcmVudCBpcyBwcm92aWRlZFxuXHRcdFx0XHRpZiAob3B0aW9ucy5wYXJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRcdGNvbnN0IGhpZXJhcmNoeVF1YWxpZmllciA9IChsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgaGllcmFyY2h5UXVhbGlmaWVyOiBzdHJpbmcgfSkuaGllcmFyY2h5UXVhbGlmaWVyO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudE5hdmlnYXRpb24gPVxuXHRcdFx0XHRcdFx0b2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkFnZ3JlZ2F0aW9uPy5bYFJlY3Vyc2l2ZUhpZXJhcmNoeSMke2hpZXJhcmNoeVF1YWxpZmllcn1gXVxuXHRcdFx0XHRcdFx0XHQ/LlBhcmVudE5hdmlnYXRpb25Qcm9wZXJ0eS52YWx1ZTtcblx0XHRcdFx0XHRpZiAoIXBhcmVudE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgcGFyZW50IG5hdmlnYXRpb24gcHJvcGVydHkgZm9yICR7bGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBwYXJlbnRCaW5kaW5nRGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0XHRcdHBhcmVudEJpbmRpbmdEYXRhW2Ake3BhcmVudE5hdmlnYXRpb259QG9kYXRhLmJpbmRgXSA9IG9wdGlvbnMucGFyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZSgvXlxcLy8sIFwiXCIpOyAvLyBSZW1vdmUgbGVhZGluZyBcIi9cIiBmcm9tIHRoZSBwYXRoXG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhRm9yQ3JlYXRpb24sIHBhcmVudEJpbmRpbmdEYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmdGb3JDcmVhdGlvbi5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNMaXN0QmluZGluZ0FuYWx5dGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNyZWF0aW5nIGEgbmV3IGRvY3VtZW50IGluIGEgYW5hbHl0aWNhbCB0YWJsZSBpcyBzdXBwb3J0ZWQgb25seSBpbiBhIExpc3RSZXBvcnRcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSB1c2UgYSB0ZW1wb3JhcnkgZmxhdCBsaXN0QmluZGluZyBmb3IgdGhlIGNyZWF0aW9uLCB0byBhdm9pZCBhZGRpbmcgdGhlIG5ldyBjb250ZXh0IGluIHRoZSB0YWJsZSAod2UgZG9uJ3Qgd2FudCB0byBkaXNwbGF5IGl0IHVudGlsIGl0J3Mgc2F2ZWQpXG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgbGlzdEJpbmRpbmdGb3JDcmVhdGlvbiA9IG1vZGVsLmJpbmRMaXN0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuXHRcdFx0XHRcdCQkZ3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0R3JvdXBJZCgpLFxuXHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogbGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gbGlzdEJpbmRpbmdGb3JDcmVhdGlvbi5jcmVhdGUoZGF0YUZvckNyZWF0aW9uLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGxpc3RCaW5kaW5nLmNyZWF0ZShkYXRhRm9yQ3JlYXRpb24sIHRydWUsIG9wdGlvbnMuY3JlYXRlQXRFbmQsIG9wdGlvbnMuY3JlYXRlSW5hY3RpdmUpO1xuXHRcdH1cblx0fVxuXG5cdGdldENyZWF0aW9uUGFyYW1ldGVycyhsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkLCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblxuXHRcdGNvbnN0IG5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyA9IGdldENyZWF0ZVBvcHVwRmllbGRzKG1ldGFNb2RlbCwgbWV0YVBhdGgsIGFwcENvbXBvbmVudCk7XG5cdFx0Ly8gRG8gbm90IGNvbnNpZGVyIGZpZWxkcyBmb3Igd2hpY2ggd2UgcHJvdmlkZSBzb21lIGluaXRpYWwgZGF0YVxuXHRcdHJldHVybiBub25Db21wdXRlZFZpc2libGVGaWVsZHMuZmlsdGVyKChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xuXHRcdFx0cmV0dXJuICEoZmllbGROYW1lIGluIChjcmVhdGVEYXRhID8/IHt9KSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBbaW5QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgc2VudCB3aXRoaW4gdGhlIFBPU1Rcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuYnVzeU1vZGVdIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lIFRPRE86IHRvIGJlIHJlZmFjdG9yZWRcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuYnVzeUlkXSBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZF0gSWYgc2V0LCB0aGUgY29udGV4dCBzdGF5cyBpbiB0aGUgbGlzdCBpZiB0aGUgUE9TVCBmYWlsZWQgYW5kIFBPU1Qgd2lsbCBiZSByZXBlYXRlZCB3aXRoIHRoZSBuZXh0IGNoYW5nZVxuXHQgKiBAcGFyYW0gW2luUGFyYW1ldGVycy5pbmFjdGl2ZV0gSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIFtpblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0aW5QYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGZyb21Db3B5UGFzdGU6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGxldCBuZXdEb2N1bWVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKGluUGFyYW1ldGVycyk7XG5cdFx0aWYgKCFtYWluTGlzdEJpbmRpbmcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgcmVxdWlyZWQgZm9yIG5ldyBkb2N1bWVudCBjcmVhdGlvblwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChtYWluTGlzdEJpbmRpbmcpO1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGJ1c3lQYXRoID0gdGhpcy5nZXRCdXN5UGF0aChwYXJhbWV0ZXJzKTtcblx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gZnJvbUNvcHlQYXN0ZSA/IHVuZGVmaW5lZCA6IHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2s7XG5cdFx0aWYgKCFpblBhcmFtZXRlcnM/LmluYWN0aXZlKSB7XG5cdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCwgYnVzeVBhdGgpO1xuXHRcdH1cblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxlci5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0dHJ5IHtcblx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMucGVyZm9ybUNyZWF0aW9uKFxuXHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdGZyb21Db3B5UGFzdGVcblx0XHRcdCk7XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IGNvbnRyb2w6IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCwgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRyZXR1cm4gbmV3RG9jdW1lbnRDb250ZXh0ITtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsIHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8IGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykgJiZcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0Py5pc1RyYW5zaWVudCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIHdvcmthcm91bmQgc3VnZ2VzdGVkIGJ5IG1vZGVsIGFzIENvbnRleHQuZGVsZXRlIHJlc3VsdHMgaW4gYW4gZXJyb3Jcblx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHRoZSAkZGlyZWN0IG9uY2UgbW9kZWwgcmVzb2x2ZXMgdGhpcyBpc3N1ZVxuXHRcdFx0XHQvLyB0aGlzIGxpbmUgc2hvd3MgdGhlIGV4cGVjdGVkIGNvbnNvbGUgZXJyb3IgVW5jYXVnaHQgKGluIHByb21pc2UpIEVycm9yOiBSZXF1ZXN0IGNhbmNlbGVkOiBQT1NUIFRyYXZlbDsgZ3JvdXA6IHN1Ym1pdExhdGVyXG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmICghaW5QYXJhbWV0ZXJzPy5pbmFjdGl2ZSkge1xuXHRcdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50LCBidXN5UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRCdXN5UGF0aChtUGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID09PSBcIkxvY2FsXCIgPyBgL2J1c3lMb2NhbC8ke21QYXJhbWV0ZXJzLmJ1c3lJZH1gIDogXCIvYnVzeVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBtYWluTGlzdEJpbmRpbmcgT0RhdGEgVjQgTGlzdEJpbmRpbmcgb2JqZWN0LlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lNb2RlIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lJZCBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW5hY3RpdmUgSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYSBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ubHkgdXNlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgY3JlYXRlRG9jdW1lbnRDb250ZXh0KG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyk6IFByb21pc2U8T0RhdGFWNENvbnRleHQ+IHtcblx0XHRpZiAocGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0Ly9iZWZvcmVDcmVhdGVDYWxsQmFjayBleHBlY3RzIGNyZWF0ZVBhcmFtZXRlcnMgb2YgdHlwZSBhbnlbXVxuXHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuZGF0YSA/IE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMuZGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSkgOiBbXTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBtYWluTGlzdEJpbmRpbmcgJiYgbWFpbkxpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnM6IGNyZWF0ZVBhcmFtZXRlcnNcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQ7XG5cdFx0XHR9XG5cdFx0XHRwYXJhbWV0ZXJzLmRhdGEgPSBjcmVhdGVQYXJhbWV0ZXJzLnJlZHVjZSgocmVzdWx0LCBjdXJyZW50T2JqZWN0KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7IC4uLnJlc3VsdCwgLi4uY3VycmVudE9iamVjdCB9O1xuXHRcdFx0fSwge30pO1xuXHRcdH1cblx0XHRjb25zdCBjcmVhdGVQcm9taXNlID0gdGhpcy5jcmVhdGVDb250ZXh0KG1haW5MaXN0QmluZGluZywgcGFyYW1ldGVycy5kYXRhLCB7XG5cdFx0XHRjcmVhdGVBdEVuZDogISFwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0Y3JlYXRlSW5hY3RpdmU6ICEhcGFyYW1ldGVycy5pbmFjdGl2ZSxcblx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHRcdH0pO1xuXHRcdGlmIChtYWluTGlzdEJpbmRpbmcuZ2V0VXBkYXRlR3JvdXBJZCgpID09PSBDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQpIHtcblx0XHRcdG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRCk7XG5cdFx0fVxuXHRcdHJldHVybiBjcmVhdGVQcm9taXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgZWl0aGVyIHZpYSBuZXcgQWN0aW9uIG9yIHN0YW5kYXJkIFBPU1QgY3JlYXRlLlxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nIE9EYXRhIFY0IExpc3RCaW5kaW5nIG9iamVjdFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZGF0YSBBIG1hcCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgd2l0aGluIHRoZSBQT1NUXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lNb2RlIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJ1c3lJZCBJRCBvZiB0aGUgbG9jYWwgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuaW5hY3RpdmUgSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgQ3JlYXRlIHRoZSBjb250ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKGlnbm9yZWQgaW4gY2FzZSBvZiBhIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0ZUluYWN0aXZlIENyZWF0ZSB0aGUgY29udGV4dCBhcyBpbmFjdGl2ZSAoaWdub3JlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCBDcmVhdGUgdGhlIGNvbnRleHQgYXMgYSBjaGlsZCBvZiB0aGlzIGNvbnRleHQgKG9ubHkgdXNlZCBpbiBjYXNlIG9mIGEgaGllcmFyY2h5KS5cblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBleHRlbnNpb25cblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHBhcmFtIGZyb21Db3B5UGFzdGUgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgcGFzdGUgYWN0aW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBuZXcgYmluZGluZyBjb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1DcmVhdGlvbihcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtYWluTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpO1xuXHRcdGNvbnN0IGNyZWF0ZUhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0Y29uc3QgY29tcG9uZW50RGF0YSA9IGFwcENvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0Y29uc3Qgc3RhcnR1cFBhcmFtZXRlcnMgPSBjb21wb25lbnREYXRhPy5zdGFydHVwUGFyYW1ldGVycyA/PyB7fTtcblx0XHRjb25zdCBuZXdBY3Rpb24gPSAhbWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKVxuXHRcdFx0PyB0aGlzLl9nZXROZXdBY3Rpb24oc3RhcnR1cFBhcmFtZXRlcnMsIGNyZWF0ZUhhc2gsIG1ldGFNb2RlbCwgbWV0YVBhdGgpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChuZXdBY3Rpb24pIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVyZm9ybUNyZWF0aW9uV2l0aEFjdGlvbihcblx0XHRcdFx0bmV3QWN0aW9uLFxuXHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRcdHRocm93IHJlc3VsdC5yZWFzb247XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0LnZhbHVlLnJldHVybmVkQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMucGVyZm9ybUNyZWF0aW9uV2l0aFBPU1QobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLCBhcHBDb21wb25lbnQsIHJlc291cmNlTW9kZWwsIG1lc3NhZ2VIYW5kbGVyLCBmcm9tQ29weVBhc3RlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRvY3VtZW50IHdpdGggYW4gYWN0aW9uLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZVxuXHQgKiBAcGFyYW0gbWFpbkxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWxcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHBlcmZvcm1DcmVhdGlvbldpdGhBY3Rpb24oXG5cdFx0YWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRwYXJhbWV0ZXJzOiBDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0Pj4ge1xuXHRcdGNvbnN0IGhlYWRlckNvbnRleHRQYXRoID0gbWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGhlYWRlckNvbnRleHRQYXRoKTtcblx0XHRjb25zdCBtZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgobWV0YU1vZGVsLCBtZXRhUGF0aCk7XG5cdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlcnM6IEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHsgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZSwgJCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIgfTtcblxuXHRcdGNvbnN0IHNlbGVjdGVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRpZiAobWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRzZWxlY3RlZFByb3BlcnRpZXMucHVzaChtZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG1haW5MaXN0QmluZGluZykgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHNlbGVjdGVkUHJvcGVydGllcy5wdXNoKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIkhhc0FjdGl2ZUVudGl0eVwiKTsgLy8gTmVlZGVkIGZvciBvdXIgaW50ZXJuYWwgbG9naWMgKGUuZy4gbmF2aWdhdGlvbilcblx0XHR9XG5cdFx0aWYgKHNlbGVjdGVkUHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVyc1tcIiRzZWxlY3RcIl0gPSBzZWxlY3RlZFByb3BlcnRpZXMuam9pbihcIixcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdGFjdGlvbk5hbWUsXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnRleHRzOiBtYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLFxuXHRcdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nOiB0cnVlLFxuXHRcdFx0XHRsYWJlbDogdGhpcy5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChtZXRhTW9kZWwsIG1ldGFQYXRoLCBhY3Rpb25OYW1lLCByZXNvdXJjZU1vZGVsKSxcblx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IGJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHR2aWV3OiBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdGlzQ3JlYXRlQWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBwYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2dcblx0XHRcdH0sXG5cdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdCk7XG5cdFx0cmV0dXJuIHJlc3VsdFswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZG9jdWVtbnQgd2l0aCBhIHN0YW5kYXJkIFBPU1QgcmVxdWVzdC5cblx0ICogQHBhcmFtIG1haW5MaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gZnJvbUNvcHlQYXN0ZVxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0LlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwZXJmb3JtQ3JlYXRpb25XaXRoUE9TVChcblx0XHRtYWluTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUGFyYW1ldGVycyxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRmcm9tQ29weVBhc3RlOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0bGV0IG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBpbml0aWFsRGF0YSA9IHBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdGlmICghZnJvbUNvcHlQYXN0ZSkge1xuXHRcdFx0XHRjb25zdCBkZWZhdWx0VmFsdWVGdW5jdGlvbkRhdGEgPSBhd2FpdCB0aGlzLmdldERhdGFGcm9tRGVmYXVsdFZhbHVlRnVuY3Rpb24obWFpbkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0cGFyYW1ldGVycy5kYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFZhbHVlRnVuY3Rpb25EYXRhLCBwYXJhbWV0ZXJzLmRhdGEpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtZXRlcnMuZGF0YSkge1xuXHRcdFx0XHRkZWxldGUgcGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbkhhdmVEaWFsb2cgPSBwYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0Y29uc3QgY3JlYXRpb25EaWFsb2dGaWVsZHMgPSBjYW5IYXZlRGlhbG9nID8gdGhpcy5nZXRDcmVhdGlvblBhcmFtZXRlcnMobWFpbkxpc3RCaW5kaW5nLCBpbml0aWFsRGF0YSwgYXBwQ29tcG9uZW50KSA6IFtdO1xuXHRcdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2cpIHtcblx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcz8uZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG5cdFx0XHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5wdXNoKGZpZWxkTmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoY3JlYXRpb25EaWFsb2dGaWVsZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gSW4gQ3JlYXRpb25EaWFsb2cgbW9kZSwgdGhlIGRpYWxvZyBpcyBtYW5kYXRvcnlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBmaWVsZHMgYXZhaWxhYmxlIGZvciB0aGUgY3JlYXRpb24gZGlhbG9nXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjcmVhdGlvbkRpYWxvZ0ZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdG5ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2l0aERpYWxvZyhcblx0XHRcdFx0XHRtYWluTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHMsXG5cdFx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVEb2N1bWVudENvbnRleHQobWFpbkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKCFwYXJhbWV0ZXJzLmluYWN0aXZlKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy53YWl0Rm9yQ3JlYXRlQ29tcGxldGlvbihuZXdEb2N1bWVudENvbnRleHQsIHBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9PT0gdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdGNvbnN0IG1zZyA9IChlcnJvciBhcyBFcnJvcikubWVzc2FnZSA/PyBlcnJvcjtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgbXNnKTtcblx0XHRcdHRocm93IG1zZztcblx0XHR9XG5cdH1cblxuXHRfaXNEcmFmdEVuYWJsZWQodkNvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29udGV4dEZvckRyYWZ0TW9kZWwgPSB2Q29udGV4dHNbMF07XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dEZvckRyYWZ0TW9kZWwpO1xuXHRcdHJldHVybiBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGUgb25lIG9yIG11bHRpcGxlIGRvY3VtZW50KHMpLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwsIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgTnVtYmVyIG9mIG9iamVjdHMgc2VsZWN0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm5vRGlhbG9nIFRvIGRpc2FibGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVEb2N1bWVudChcblx0XHRjb250ZXh0czogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdLFxuXHRcdG1QYXJhbWV0ZXJzOiBUcmFuc2FjdGlvbkRlbGV0ZVBhcmFtZXRlcnMsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0cmVzb3VyY2VNb2RlbDogUmVzb3VyY2VNb2RlbCxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gZGVsZXRlIGRvY3VtZW50IGxvY2tcblx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cblx0XHRjb25zdCBjb250ZXh0c1RvRGVsZXRlID0gQXJyYXkuaXNBcnJheShjb250ZXh0cykgPyBbLi4uY29udGV4dHNdIDogW2NvbnRleHRzXTtcblx0XHRjb25zdCBmaXJzdENvbnRleHQgPSAobVBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cyA/PyBjb250ZXh0c1RvRGVsZXRlKVswXTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkcmFmdEVuYWJsZWQgPSB0aGlzLl9pc0RyYWZ0RW5hYmxlZChtUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIHx8IGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0XHRjb25zdCBpdGVtczogQ29udHJvbFtdID0gW107XG5cdFx0XHRcdGxldCBvcHRpb25zOiBEZWxldGVPcHRpb25bXSA9IFtdO1xuXHRcdFx0XHRsZXQgdW5TYXZlZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdC8vIGl0ZW1zKHRleHRzKSBhbmQgb3B0aW9ucyhjaGVja0JveGVzIGFuZCBzaW5nbGUgZGVmYXVsdCBvcHRpb24pIGZvciBjb25maXJtIGRpYWxvZy5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lID0gdGhpcy5nZXRDb2xsZWN0aW9uTmFtZUZyb21Db250ZXh0KGZpcnN0Q29udGV4dCk7XG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdC8vIG5vbi1UYWJsZVxuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0XHQvLyBDaGVjayBpZiAxIG9mIHRoZSBkcmFmdHMgaXMgbG9ja2VkIGJ5IGFub3RoZXIgdXNlclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsb2NrZWRDb250ZXh0ID0gY29udGV4dHNUb0RlbGV0ZS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29udGV4dERhdGEgPSBjb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFjb250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5EcmFmdElzQ3JlYXRlZEJ5TWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKGxvY2tlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBTaG93IG1lc3NhZ2UgYm94IHdpdGggdGhlIG5hbWUgb2YgdGhlIGxvY2tpbmcgdXNlciBhbmQgcmV0dXJuXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbG9ja2luZ1VzZXJOYW1lID0gbG9ja2VkQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdFx0TWVzc2FnZUJveC5zaG93KFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9TSU5HTEVfT0JKRUNUX0xPQ0tFRFwiLCBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxvY2tpbmdVc2VyTmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XSksXG5cdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U6IHJlamVjdFxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHVuU2F2ZWRDb250ZXh0ID0gY29udGV4dHNUb0RlbGV0ZS5maW5kKChjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB7IElzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgfSA9IGNvbnRleHQuZ2V0T2JqZWN0KCkgfHwge307XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gSXNBY3RpdmVFbnRpdHkgPT09IHRydWUgJiYgSGFzRHJhZnRFbnRpdHkgPT09IHRydWUgJiYgISFEcmFmdEFkbWluaXN0cmF0aXZlRGF0YT8uSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRsZXQgbm9uVGFibGVUeHQgPSBcIlwiO1xuXHRcdFx0XHRcdFx0aWYgKHVuU2F2ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHVuU2F2ZWRDb250ZXh0VXNlciA9IHVuU2F2ZWRDb250ZXh0LmdldE9iamVjdCgpLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLFxuXHRcdFx0XHRcdFx0XHRcdFt1blNhdmVkQ29udGV4dFVzZXJdLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobVBhcmFtZXRlcnMudGl0bGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLnRpdGxlLCBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9PTkxZXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMudGl0bGVdLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5vblRhYmxlVHh0ID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvcHRpb25zLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBEZWxldGVPcHRpb25UeXBlcy5kZWxldGFibGVDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdHRleHQ6IG5vblRhYmxlVHh0LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0Y29udHJvbDogRGVsZXRlRGlhbG9nQ29udGVudENvbnRyb2wuVEVYVFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRhYmxlXG5cdFx0XHRcdFx0XHRsZXQgdG90YWxEZWxldGFibGUgPSBjb250ZXh0c1RvRGVsZXRlLmxlbmd0aDtcblxuXHRcdFx0XHRcdFx0aWYgKGRyYWZ0RW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0XHR0b3RhbERlbGV0YWJsZSArPVxuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPy5sZW5ndGggPz8gMCkgK1xuXHRcdFx0XHRcdFx0XHRcdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHM/Lmxlbmd0aCA/PyAwKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZURyYWZ0T3B0aW9uc0ZvckRlbGV0YWJsZVRleHRzKFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRzVG9EZWxldGUsXG5cdFx0XHRcdFx0XHRcdFx0dG90YWxEZWxldGFibGUsXG5cdFx0XHRcdFx0XHRcdFx0cmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRpdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBub25EZWxldGFibGVUZXh0ID0gZGVsZXRlSGVscGVyLmdldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHRvdGFsRGVsZXRhYmxlLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0aWYgKG5vbkRlbGV0YWJsZVRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtcy5wdXNoKG5vbkRlbGV0YWJsZVRleHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IG9wdGlvbnNEZWxldGFibGVUZXh0cyA9IGRlbGV0ZUhlbHBlci5nZXRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b3B0aW9ucyA9IFsuLi5vcHRpb25zLCAuLi5vcHRpb25zRGVsZXRhYmxlVGV4dHNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGNvbW1vbkJpbmRpbmcgPSBmaXJzdENvbnRleHQuZ2V0QmluZGluZygpIGFzIEJpbmRpbmc7XG5cdFx0XHRcdGxldCBiaW5kaW5nVHlwZTogXCJUcmVlXCIgfCBcIkFuYWx5dGljYWxcIiB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKGNvbW1vbkJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGNvbW1vbkJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRiaW5kaW5nVHlwZSA9IFwiVHJlZVwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChjb21tb25CaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0YmluZGluZ1R5cGUgPSBcIkFuYWx5dGljYWxcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb250ZW50IG9mIERlbGV0ZSBEaWFsb2dcblx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2cob3B0aW9ucywgaXRlbXMpO1xuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IGRlbGV0ZUhlbHBlci5kZWxldGVDb25maXJtSGFuZGxlcihcblx0XHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdFx0XHRcdGRyYWZ0RW5hYmxlZCxcblx0XHRcdFx0XHRcdFx0YmluZGluZ1R5cGVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGNvbnN0IGRpYWxvZyA9IHRoaXMuY3JlYXRlRGVsZXRlRGlhbG9nKGl0ZW1zLCBtUGFyYW1ldGVycywgcmVzb3VyY2VNb2RlbCwgZm5Db25maXJtLCByZWplY3QpO1xuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub0RpYWxvZyA9PT0gdHJ1ZSB8fCBtUGFyYW1ldGVycy5zaWxlbnRNb2RlID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRcdGRpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdC8vIGRlbGV0ZSBkb2N1bWVudCB1bmxvY2tcblx0XHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZvIHRoZSBkZWxldGlvbi5cblx0ICogQHBhcmFtIGl0ZW1zIEFuIGFycmF5IG9mIGNvbnRyb2xzIHVzZWQgZm9yIHRoZSBkaWFsb2cgY29udGVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgUGFyZW50IGNvbnRyb2wgb2YgdGhlIGRlbGV0ZSBidXR0b24gaWYgYW55XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgY3VycmVudCBlbnRpdHlTZXRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIGZuQ29uZmlybSBGdW5jdGlvbiBleGVjdXRlZCB1cG9uIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkZWxldGlvblxuXHQgKiBAcGFyYW0gZm5SZWplY3QgRnVuY3Rpb24gZXhlY3V0ZWQgaWYgdGhlIGRpYWxvZyBpcyBjbG9zZWQgdmlhIENhbmNlbCBvciBFc2NhcGUgYnV0dG9uXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGRlbGV0ZSBjb25maXJtYXRpb24gZGlhbG9nXG5cdCAqL1xuXHRjcmVhdGVEZWxldGVEaWFsb2coXG5cdFx0aXRlbXM6IENvbnRyb2xbXSxcblx0XHRwYXJhbWV0ZXJzOiBQYXJ0aWFsPHsgcGFyZW50Q29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDsgZW50aXR5U2V0TmFtZTogc3RyaW5nIH0+LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0Zm5Db25maXJtOiBGdW5jdGlvbixcblx0XHRmblJlamVjdDogRnVuY3Rpb25cblx0KTogRGlhbG9nIHtcblx0XHRsZXQgZGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Y29uc3QgdkJveCA9IG5ldyBWQm94KHsgaXRlbXM6IGl0ZW1zIH0pO1xuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlQ29yZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0bGV0IHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKHBhcmFtZXRlcnMucGFyZW50Q29udHJvbD8uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGl0bGUgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJNX0NPTU1PTl9UQUJMRV9ERUxFVEVcIiwgdW5kZWZpbmVkLCBwYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aXRsZSA9IHJlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpO1xuXHRcdH1cblx0XHRjb25zdCBkaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHRpdGxlOiB0aXRsZSxcblx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdGNvbnRlbnQ6IFt2Qm94XSxcblx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBpdGVtcyxcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogdGl0bGUsXG5cdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0ZGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiKSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRkaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdGRpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdC8vIGlmIGRpYWxvZyBpcyBjbG9zZWQgdW5jb25maXJtZWQgKGUuZy4gdmlhIFwiQ2FuY2VsXCIgb3IgRXNjYXBlIGJ1dHRvbiksIGVuc3VyZSB0byByZWplY3QgcHJvbWlzZVxuXHRcdFx0XHRpZiAoIWRpYWxvZ0NvbmZpcm1lZCkge1xuXHRcdFx0XHRcdGZuUmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gZGlhbG9nO1xuXHR9XG5cblx0LyoqXG5cdCAqIEVkaXRzIGEgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG9WaWV3IEN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zYWN0aW9uRGV0YWlscyBPcHRpb25hbCBvYmplY3QgdG8gcmV0dXJuIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCBob3cgdGhlIHRyYW5zYWN0aW9uIHdhcyBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBlZGl0RG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdG9WaWV3OiBGRVZpZXcsXG5cdFx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGdyb3VwSWQ6IHN0cmluZyxcblx0XHR0cmFuc2FjdGlvbkRldGFpbHM/OiBFZGl0VHJhbnNhY3Rpb25FeGVjdXRpb25EZXRhaWxzXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGFjdGl2ZSBkb2N1bWVudCBpcyByZXF1aXJlZFwiKTtcblx0XHR9XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dGhpcy5idXN5TG9jayhhcHBDb21wb25lbnQpO1xuXHRcdC8vIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBlZGl0IGFjdGlvbiB3ZSdsbCBoYXZlIHRvIHJlbW92ZSBhbGwgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlc1xuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGVyLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5jcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGJQcmVzZXJ2ZUNoYW5nZXM6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0b1ZpZXc6IG9WaWV3XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGdyb3VwSWQsXG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdFx0XHR0cmFuc2FjdGlvbkRldGFpbHNcblx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIGFwcENvbXBvbmVudCwgbWVzc2FnZUhhbmRsZXIpO1xuXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0cmV0dXJuIG9OZXdDb250ZXh0O1xuXHRcdH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29uY3VycmVudEVkaXRGbGFnOiB0cnVlLCB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5idXN5VW5sb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgY2FuY2VsZWQgb3IgZGVsZXRlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBDYW5jZWwgQnV0dG9uIG9mIHRoZSBkaXNjYXJkIHBvcG92ZXIgKG1hbmRhdG9yeSBmb3Igbm93KVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwQ29tcG9uZW50XG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGV4dGVuc2lvblxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHBhcmFtIGlzT2JqZWN0TW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIGJ5IHRoZSB1c2VyXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0bUluUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyB8IHVuZGVmaW5lZCxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhbixcblx0XHRpc09iamVjdE1vZGlmaWVkOiBib29sZWFuXG5cdCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHQvL2NvbnRleHQgbXVzdCBhbHdheXMgYmUgcGFzc2VkIC0gbWFuZGF0b3J5IHBhcmFtZXRlclxuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRleHQgZXhpc3RzLiBQYXNzIGEgbWVhbmluZ2Z1bCBjb250ZXh0XCIpO1xuXHRcdH1cblx0XHRjb25zdCBtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobUluUGFyYW1ldGVycyk7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5jZWwgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR0cnkge1xuXHRcdFx0bGV0IHJldHVybmVkVmFsdWU6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdFx0bGV0IHNpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCwgZHJhZnRBZG1pbkRhdGE7XG5cdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhaXNPYmplY3RNb2RpZmllZCkge1xuXHRcdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0W3NpYmxpbmdDb250ZXh0Q2Fub25pY2FsUGF0aCwgZHJhZnRBZG1pbkRhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuXHRcdFx0XHRcdGlzTmV3T2JqZWN0ID8gdW5kZWZpbmVkIDogc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKSxcblx0XHRcdFx0XHRkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHRdKTtcblx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0aXNPYmplY3RNb2RpZmllZCA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fY29uZmlybURpc2NhcmQobVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uLCBpc09iamVjdE1vZGlmaWVkLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdH1cblx0XHRcdGlmIChvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdC8vIGlmIHRoZSBjb250ZXh0IGlzIGtlcHQgYWxpdmUgd2Ugc2V0IGl0IGFnYWluIHRvIGRldGFjaCB0aGUgb25CZWZvcmVEZXN0cm95IGNhbGxiYWNrIGFuZCBoYW5kbGUgbmF2aWdhdGlvbiBoZXJlXG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IG5lZWRzIHRvIHN0aWxsIGJlIGtlcHQgYWxpdmUgdG8gYmUgYWJsZSB0byByZXNldCBjaGFuZ2VzIHByb3Blcmx5XG5cdFx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZSh0cnVlLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKSB7XG5cdFx0XHRcdGF3YWl0IG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0aWYgKGlzTmV3T2JqZWN0KSB7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIG1lc3NhZ2VIYW5kbGVyLCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gb01vZGVsXG5cdFx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dChcblx0XHRcdFx0XHRcdFx0XHRzaWJsaW5nQ29udGV4dENhbm9uaWNhbFBhdGggPyBzaWJsaW5nQ29udGV4dENhbm9uaWNhbFBhdGggOiBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IGRpc2NhcmRlZENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRyZXR1cm4gcmV0dXJuZWRWYWx1ZTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmJ1c3lVbmxvY2soYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBzYXZlZFxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIHJlc291cmNlTW9kZWwgVGhlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcblx0ICogQHBhcmFtIGV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgVHJ1ZSBpZiB3ZSBzaG91bGQgZXhlY3V0ZSBzaWRlIGVmZmVjdHMgaW4gY2FzZSBvZiBhbiBlcnJvclxuXHQgKiBAcGFyYW0gYmluZGluZ3NGb3JTaWRlRWZmZWN0cyBUaGUgbGlzdEJpbmRpbmdzIHRvIGJlIHVzZWQgZm9yIGV4ZWN1dGluZyBzaWRlIGVmZmVjdHMgb24gZXJyb3Jcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEBwYXJhbSBpc05ld09iamVjdCBUcnVlIGlmIHdlJ3JlIHRyeWluZyB0byBjYW5jZWwgYSBuZXdseSBjcmVhdGVkIG9iamVjdFxuXHQgKiBAcGFyYW0gc2tpcENvbmZpcm1hdGlvbk1zZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgc2F2ZURvY3VtZW50KFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYm9vbGVhbixcblx0XHRiaW5kaW5nc0ZvclNpZGVFZmZlY3RzOiBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuLFxuXHRcdHNraXBDb25maXJtYXRpb25Nc2cgPSBmYWxzZSxcblx0XHRpc1N0YW5kYXJkU2F2ZT86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxPRGF0YVY0Q29udGV4dD4ge1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlNhdmUgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMuYnVzeUxvY2soYXBwQ29tcG9uZW50KTtcblx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSB0aGlzLmdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnQgPVxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdD8gYXdhaXQgZHJhZnQuYWN0aXZhdGVEb2N1bWVudChjb250ZXh0LCBhcHBDb21wb25lbnQsIG1lc3NhZ2VIYW5kbGVyLCB7IHJlc291cmNlTW9kZWw6IHJlc291cmNlTW9kZWwgfSwgaXNTdGFuZGFyZFNhdmUpXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuYWN0aXZhdGVEb2N1bWVudChcblx0XHRcdFx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0eyByZXNvdXJjZU1vZGVsOiByZXNvdXJjZU1vZGVsIH0sXG5cdFx0XHRcdFx0XHRcdGlzU3RhbmRhcmRTYXZlXG5cdFx0XHRcdFx0ICApO1xuXG5cdFx0XHRjb25zdCBtZXNzYWdlc1JlY2VpdmVkID0gbWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKCkuY29uY2F0KG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7IC8vIGdldCB1bmJvdW5kIGFuZCBib3VuZCBtZXNzYWdlcyBwcmVzZW50IGluIHRoZSBtb2RlbFxuXHRcdFx0aWYgKCFza2lwQ29uZmlybWF0aW9uTXNnICYmICEobWVzc2FnZXNSZWNlaXZlZC5sZW5ndGggPT09IDEgJiYgbWVzc2FnZXNSZWNlaXZlZFswXS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MpKSB7XG5cdFx0XHRcdC8vIHNob3cgb3VyIG9iamVjdCBjcmVhdGlvbiB0b2FzdCBvbmx5IGlmIGl0IGlzIG5vdCBjb21pbmcgZnJvbSBiYWNrZW5kXG5cdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRcdGlzTmV3T2JqZWN0XG5cdFx0XHRcdFx0XHQ/IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9DUkVBVEVEXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0XHRcdDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIsIHVuZGVmaW5lZCwgZW50aXR5U2V0TmFtZSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yICYmIGJpbmRpbmdzRm9yU2lkZUVmZmVjdHM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0LyogVGhlIHNpZGVFZmZlY3RzIGFyZSBleGVjdXRlZCBvbmx5IGZvciB0YWJsZSBpdGVtcyBpbiB0cmFuc2llbnQgc3RhdGUgKi9cblx0XHRcdFx0YmluZGluZ3NGb3JTaWRlRWZmZWN0cy5mb3JFYWNoKChsaXN0QmluZGluZykgPT4ge1xuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBjb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnNcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2dcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnZpZXdcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaXNDcmVhdGVBY3Rpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmdyb3VwSWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuaWdub3JlRVRhZyBJZiBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGhvdXQgRVRhZyBoYW5kbGluZ1xuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHBDb21wb25lbnRcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgZXh0ZW5zaW9uXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiByZXNwb25zZSBvYmplY3RzIChUT0RPOiB0byBiZSBjaGFuZ2VkKVxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbGxBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRzaG93QWN0aW9uUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgbnVsbDtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHZpZXc6IFZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc0NyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdGdyb3VwSWQ/OiBzdHJpbmc7XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0XHR9LFxuXHRcdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0bGV0IGNvbnRleHRUb1Byb2Nlc3M7XG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblxuXHRcdGNvbnRleHRUb1Byb2Nlc3MgPSBzTmFtZSA/IHVuZGVmaW5lZCA6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdC8vY2hlY2tpbmcgd2hldGhlciB0aGUgY29udGV4dCBpcyBhbiBhcnJheSB3aXRoIG1vcmUgdGhhbiAwIGxlbmd0aCBvciBub3QgYW4gYXJyYXkoY3JlYXRlIGFjdGlvbilcblx0XHRpZiAoY29udGV4dFRvUHJvY2VzcyAmJiAoKEFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykgJiYgY29udGV4dFRvUHJvY2Vzcy5sZW5ndGgpIHx8ICFBcnJheS5pc0FycmF5KGNvbnRleHRUb1Byb2Nlc3MpKSkge1xuXHRcdFx0Y29udGV4dFRvUHJvY2VzcyA9IEFycmF5LmlzQXJyYXkoY29udGV4dFRvUHJvY2VzcykgPyBjb250ZXh0VG9Qcm9jZXNzWzBdIDogY29udGV4dFRvUHJvY2Vzcztcblx0XHRcdG9Nb2RlbCA9IGNvbnRleHRUb1Byb2Nlc3MuZ2V0TW9kZWwoKTtcblx0XHR9XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLm1vZGVsKSB7XG5cdFx0XHRvTW9kZWwgPSBtUGFyYW1ldGVycy5tb2RlbDtcblx0XHR9XG5cdFx0aWYgKCFvTW9kZWwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlBhc3MgYSBjb250ZXh0IGZvciBhIGJvdW5kIGFjdGlvbiBvciBwYXNzIHRoZSBtb2RlbCBmb3IgYW4gdW5ib3VuZCBhY3Rpb25cIik7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjb250cm9sID0gKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCA/IG1QYXJhbWV0ZXJzLnZpZXcuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpIDogbVBhcmFtZXRlcnMudmlldykgYXNcblx0XHRcdFx0fCBDb250cm9sXG5cdFx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdFx0bGV0IG9SZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXTtcblx0XHRcdGlmIChjb250ZXh0VG9Qcm9jZXNzICYmIG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRzID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgPyBtUGFyYW1ldGVycy5jb250ZXh0cyA6IFttUGFyYW1ldGVycy5jb250ZXh0c107IC8vIEVuc3VyZSB0aGF0IGNvbnRleHRzIGlzIGFuIGFycmF5IChmb3Igc3RhdGljIGFjdGlvbnMgaXQncyBub3QgYW4gd2UgbmVlZCB0byBmaXggaXQpXG5cblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdGFjdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dHNbMF0uZ2V0UGF0aCgpKX0vJHtzQWN0aW9uTmFtZX1gLFxuXHRcdFx0XHRcdGJvdW5kQWN0aW9uID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke2FjdGlvblBhdGh9L0AkdWk1Lm92ZXJsb2FkLzBgKSE7XG5cblx0XHRcdFx0Y29uc3QgY29udmVydGVkVHlwZXMgPSBjb252ZXJ0VHlwZXMob01vZGVsLmdldE1ldGFNb2RlbCgpKTtcblx0XHRcdFx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGg8RWRtQWN0aW9uIHwgdW5kZWZpbmVkPihib3VuZEFjdGlvbi5nZXRQYXRoKCkpLnRhcmdldDtcblx0XHRcdFx0aWYgKCFjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGJvdW5kIGFjdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgbmV3IE9wZXJhdGlvbihhcHBDb21wb25lbnQsIG9Nb2RlbCwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXSxcblx0XHRcdFx0XHRjb250ZXh0cyxcblx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRcdGdob3N0Q29udGV4dEJpbmRpbmdQcm90ZWN0aW9uOiB0cnVlLFxuXHRcdFx0XHRcdFx0ZW5oYW5jZSRzZWxlY3Q6IHRydWUsXG5cdFx0XHRcdFx0XHRncm91cElkOiBtUGFyYW1ldGVycy5ncm91cElkLFxuXHRcdFx0XHRcdFx0aWdub3JlRVRhZzogbVBhcmFtZXRlcnMuaWdub3JlRVRhZ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFFdmVudHM6IHtcblx0XHRcdFx0XHRcdG9uT0RhdGFTdWJtaXQ6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI/LnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25PRGF0YVJlc3BvbnNlOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uUmVxdWVzdFNpZGVFZmZlY3RzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlQWN0aW9uRW5hYmxlbWVudE9uT3BlcmF0aW9uKHtcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBtUGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXAsXG5cdFx0XHRcdFx0XHRcdFx0Y29udHJvbDogY29udHJvbCxcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZWRBY3Rpb25cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR2aWV3OiBtUGFyYW1ldGVycy52aWV3IGFzIEZFVmlldyxcblx0XHRcdFx0XHRpc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuaXNDcmVhdGVBY3Rpb24sXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdH0pLmV4ZWN1dGUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCBvcGVyYXRpb25zLmNhbGxBY3Rpb25JbXBvcnQoc0FjdGlvbk5hbWUsIG9Nb2RlbCwgYXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IE11bHRpVmFsdWVGaWVsZEl0ZW1bXT5bXSxcblx0XHRcdFx0XHRsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwsXG5cdFx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZzogbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbVBhcmFtZXRlcnMuYmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdFx0ZW50aXR5U2V0TmFtZTogbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSxcblx0XHRcdFx0XHRvRGF0YUV2ZW50czoge1xuXHRcdFx0XHRcdFx0b25PRGF0YVN1Ym1pdDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJ1c3lMb2NrKGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25PRGF0YVJlc3BvbnNlOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuYnVzeVVubG9jayhhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRpZ25vcmVFVGFnOiBtUGFyYW1ldGVycy5pZ25vcmVFVGFnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0dmlldzogbVBhcmFtZXRlcnMudmlldyBhcyBGRVZpZXdcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0XHR0aGlzLl9oYW5kbGVBY3Rpb25SZXNwb25zZShtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAobWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdFx0dGhpcy5faGFuZGxlQWN0aW9uUmVzcG9uc2UobVBhcmFtZXRlcnMsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgY29sbGVjdGlvbiBuYW1lIGZyb20gdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBjb2xsZWN0aW9uIG5hbWVcblx0ICovXG5cdGdldENvbGxlY3Rpb25OYW1lRnJvbUNvbnRleHQoY29udGV4dDogT0RhdGFWNENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRyZXR1cm4gKE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldE9iamVjdCBhcyBFbnRpdHlTZXQgfCBOYXZpZ2F0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQpXG5cdFx0XHQ/Lm5hbWU7XG5cdH1cblxuXHRoYW5kbGVBY3Rpb25FbmFibGVtZW50T25PcGVyYXRpb24ocGFyYW1ldGVyczoge1xuXHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRjb250cm9sPzogQ29udHJvbDtcblx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0Y29udmVydGVkQWN0aW9uOiBFZG1BY3Rpb247XG5cdH0pOiB2b2lkIHtcblx0XHRpZiAocGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCAmJiBwYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCkge1xuXHRcdFx0bGV0IHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gPSBbXTtcblx0XHRcdC8vY2hlY2sgZm9yIHNraXBwaW5nIHN0YXRpYyBhY3Rpb25zXG5cdFx0XHRpZiAoIWFjdGlvbkhlbHBlci5pc1N0YXRpY0FjdGlvbihwYXJhbWV0ZXJzLmNvbnZlcnRlZEFjdGlvbikpIHtcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIpIHx8IFtdO1xuXHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQoXG5cdFx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRKU09OLnBhcnNlKHBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRcdFx0XHRzZWxlY3RlZENvbnRleHRzLFxuXHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLmNvbnRyb2wpIHtcblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuY29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdHNlbGVjdGVkQ29udGV4dHMgPSBwYXJhbWV0ZXJzLmNvbnRyb2wuZ2V0U2VsZWN0ZWRDb250ZXh0cygpIGFzIE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KFxuXHRcdFx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdFx0XHRcdEpTT04ucGFyc2UocGFyYW1ldGVycy5vcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cyxcblx0XHRcdFx0XHRcdFwidGFibGVcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vdXBkYXRlIGRlbGV0ZSBidXR0b25cblx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVEZWxldGVJbmZvRm9yU2VsZWN0ZWRDb250ZXh0cyhwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LCBzZWxlY3RlZENvbnRleHRzKTtcblx0XHR9XG5cdH1cblxuXHRfaGFuZGxlQWN0aW9uUmVzcG9uc2UoXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fSxcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGFUcmFuc2llbnRNZXNzYWdlcyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcyh0cnVlLCB0cnVlKTtcblx0XHRpZiAoYVRyYW5zaWVudE1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIiwgbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xuXHRcdGNvbnN0IGVycm9yVG9SZW1vdmUgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKGVycm9yOiBNZXNzYWdlKSA9PiBlcnJvci52YWxpZGF0aW9uKTsgLy8gb25seSBuZWVkcyB0byBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGVjaG5pY2FsIGFuZCBwZXJzaXN0ZW50IGVycm9ycyBuZWVkcyBub3QgdG8gYmUgY2hlY2tlZCBoZXJlLlxuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhlcnJvclRvUmVtb3ZlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFBvcG92ZXIuIEZhY3RvcnkgbWV0aG9kIHRvIG1ha2UgdW5pdCB0ZXN0cyBlYXNpZXIuXG5cdCAqIEBwYXJhbSBzZXR0aW5ncyBJbml0aWFsIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3BvdmVyXG5cdCAqIEByZXR1cm5zIEEgbmV3IFBvcG92ZXJcblx0ICovXG5cdF9jcmVhdGVQb3BvdmVyKHNldHRpbmdzPzogJFBvcG92ZXJTZXR0aW5ncyk6IFBvcG92ZXIge1xuXHRcdHJldHVybiBuZXcgUG9wb3ZlcihzZXR0aW5ncyk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvd3MgYSBwb3BvdmVyIHRvIGNvbmZpcm0gZGlzY2FyZCBpZiBuZWVkZWQuXG5cdCAqIEBwYXJhbSBjYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBpc01vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBhbmQgYSBjb25maXJtYXRpb24gcG9wb3ZlciBtdXN0IGJlIHNob3duXG5cdCAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIFRoZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBjb25maXJtcyBkaXNjYXJkLCByZWplY3RzIGlmIG90aGVyd2lzZSwgcmVqZWN0cyBpZiBubyBjb250cm9sIHBhc3NlZCB0byBvcGVuIHBvcG92ZXJcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBfY29uZmlybURpc2NhcmQoY2FuY2VsQnV0dG9uOiBCdXR0b24sIGlzTW9kaWZpZWQ6IGJvb2xlYW4sIHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBJZiB0aGUgZGF0YSBpc24ndCBtb2RpZmllZCwgZG8gbm90IHNob3cgYW55IGNvbmZpcm1hdGlvbiBwb3BvdmVyXG5cdFx0aWYgKCFpc01vZGlmaWVkKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgY29uZmlybWF0aW9uUG9wb3ZlciA9IHRoaXMuX2NyZWF0ZVBvcG92ZXIoe1xuXHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0cGxhY2VtZW50OiBcIlRvcFwiXG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgY29udGVudCBvZiB0aGUgcG9wb3ZlclxuXHRcdFx0Y29uc3QgdGl0bGUgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiKVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBjb25maXJtQnV0dG9uID0gbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpLFxuXHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdHByZXNzOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uZmlybWF0aW9uUG9wb3Zlci5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYWRkQ29udGVudChuZXcgVkJveCh7IGl0ZW1zOiBbdGl0bGUsIGNvbmZpcm1CdXR0b25dIH0pKTtcblxuXHRcdFx0Ly8gQXR0YWNoIGhhbmRsZXJcblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuYXR0YWNoQmVmb3JlT3BlbigoKSA9PiB7XG5cdFx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIuc2V0SW5pdGlhbEZvY3VzKGNvbmZpcm1CdXR0b24pO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25maXJtYXRpb25Qb3BvdmVyLmF0dGFjaEFmdGVyQ2xvc2UoKCkgPT4ge1xuXHRcdFx0XHRjYW5jZWxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTtcblx0XHRcdFx0aWYgKGNvbmZpcm1hdGlvblBvcG92ZXIuZGF0YShcImNvbnRpbnVlRGlzY2FyZFwiKSkge1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbmZpcm1hdGlvblBvcG92ZXIub3BlbkJ5KGNhbmNlbEJ1dHRvbiwgZmFsc2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbG9hZHMgZGF0YSBmb3IgYW4gT0RhdGFMaXN0QmluZGluZy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0YmluZGluZyB0byByZWZyZXNoXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgcHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaExpc3RCaW5kaW5nKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0aWYgKHRoaXMuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHQvLyBXZSB1c2UgYSBzaWRlLWVmZmVjdCByZWZyZXNoIGZvciBhIFRyZWVUYWJsZSwgdG8gcHJlc2VydmUgZXhwYW5zaW9uIHN0YXRlc1xuXHRcdFx0XHRcdGF3YWl0IGFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBcIlwiIH1dLCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0UmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnRcblx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBsaXN0QmluZGluZy5nZXRQYXRoKCkgfV0sIGxpc3RCaW5kaW5nLmdldENvbnRleHQoKSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcmVmcmVzaGluZyBsaXN0IGJpbmRpbmcgJHtsaXN0QmluZGluZy5nZXRQYXRoKCl9YCwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBjcmVhdGVXaXRoRGlhbG9nKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGZpZWxkTmFtZXM6IHN0cmluZ1tdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0ZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0YklzQ3JlYXRlRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRhZnRlckNyZWF0ZUNhbGxCYWNrPzogKG5ld0RvY3VtZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQpID0+IFByb21pc2U8dm9pZD47XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRpbmFjdGl2ZT86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250ZXh0PzogT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGlvbk1vZGU/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0XHRyZXNvdXJjZU1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlclxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Y29uc3QgbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbGlzdE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGxpc3RCaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpISk7XG5cblx0XHQvLyBDcmVhdGUgYSBmYWtlICh0cmFuc2llbnQpIGxpc3RCaW5kaW5nIGFuZCBjb250ZXh0LCBqdXN0IGZvciB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBkaWFsb2dcblx0XHRjb25zdCB0cmFuc2llbnRMaXN0QmluZGluZyA9IG1vZGVsLmJpbmRMaXN0KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgbGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuXHRcdFx0JCR1cGRhdGVHcm91cElkOiBcInN1Ym1pdExhdGVyXCJcblx0XHR9KTtcblx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5yZWZyZXNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHQvKiAqL1xuXHRcdH07XG5cdFx0Y29uc3QgdHJhbnNpZW50Q29udGV4dCA9IHRyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZShwYXJhbWV0ZXJzLmRhdGEsIHRydWUpO1xuXHRcdGNvbnN0IGZpZWxkTWV0YUNvbnRleHRzID0gZmllbGROYW1lcy5tYXAoKG5hbWUpID0+IHtcblx0XHRcdHJldHVybiBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYCR7bGlzdE1ldGFQYXRofS8ke25hbWV9YCkgYXMgQ29udGV4dDtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGNyZWF0ZURpYWxvZyA9IGdldENvcmVVSUZhY3RvcnkoKS5uZXdDcmVhdGVEaWFsb2coXG5cdFx0XHR0cmFuc2llbnRDb250ZXh0LFxuXHRcdFx0ZmllbGROYW1lcyxcblx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2cgPyBcIlN0YW5kYWxvbmVcIiA6IFwiV2l0aE5hdmlnYXRpb25cIixcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbFxuXHRcdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMuc2V0VXNlckRlZmF1bHRzKFxuXHRcdFx0XHRhcHBDb21wb25lbnQsXG5cdFx0XHRcdGZpZWxkTWV0YUNvbnRleHRzLFxuXHRcdFx0XHR0cmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0cGFyYW1ldGVycy5jcmVhdGVBY3Rpb24sXG5cdFx0XHRcdHBhcmFtZXRlcnMuZGF0YVxuXHRcdFx0KTtcblx0XHRcdGNyZWF0ZURpYWxvZy5vcGVuRGlhbG9nKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdFByb21pc2VLZWVwZXIgPSBuZXcgUHJvbWlzZUtlZXBlcjxPRGF0YVY0Q29udGV4dD4oKTtcblxuXHRcdGNvbnN0IG9uRXhpdERpYWxvZyA9IGFzeW5jIChldmVudDogRXhpdERpYWxvZ0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRpZiAoIWV2ZW50LmdldFBhcmFtZXRlcihcImFjY2VwdFwiKSkge1xuXHRcdFx0XHQvLyBVc2VyIGhhcyBjYW5jZWxsZWQgY3JlYXRpb246IGRlc3Ryb3kgdGhlIHRyYW5zaWVudCBsaXN0IGJpbmRpbmcgYW5kIGNsb3NlIHRoZSBkaWFsb2dcblx0XHRcdFx0dHJhbnNpZW50TGlzdEJpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRjcmVhdGVEaWFsb2cuY2xvc2VEaWFsb2coKTtcblx0XHRcdFx0cmVzdWx0UHJvbWlzZUtlZXBlci5yZWplY3QoRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNyZWF0ZURpYWxvZy5zZXRCdXN5KHRydWUpO1xuXHRcdFx0cGFyYW1ldGVycy5iSXNDcmVhdGVEaWFsb2cgPSB0cnVlO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgdHJhbnNpZW50RGF0YSA9IHRyYW5zaWVudENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGxldCBjcmVhdGVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdFx0XHRPYmplY3Qua2V5cyh0cmFuc2llbnREYXRhKS5mb3JFYWNoKChwcm9wZXJ0eVBhdGgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke2xpc3RNZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0Ly8gRW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGFzIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHQvLyBBbmQgcmVtb3ZlIGFueSBwcm9wZXJ0eSBzdGFydGluZyBieSBAJHVpNSBhcyB0aGV5IGFyZSBub3QgcHJvcGVydHkgY3JlYXRlZCBieSBmaWxsaW5nIHRoZSBmb3JtXG5cdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgIXByb3BlcnR5UGF0aD8uc3RhcnRzV2l0aChcIkAkdWk1XCIpKSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVEYXRhW3Byb3BlcnR5UGF0aF0gPSB0cmFuc2llbnREYXRhW3Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAocGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdC8vYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgZXhwZWN0cyBjcmVhdGVQYXJhbWV0ZXJzIG9mIHR5cGUgYW55W11cblx0XHRcdFx0XHRjb25zdCBjcmVhdGVEYXRhQXNBcnJheSA9IE9iamVjdC5lbnRyaWVzKGNyZWF0ZURhdGEpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBba2V5XTogdmFsdWUgfSkpO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0b0VTNlByb21pc2UoXG5cdFx0XHRcdFx0XHRcdHBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBsaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVyczogY3JlYXRlRGF0YUFzQXJyYXlcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBuZXcgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNyZWF0ZURhdGEgPSBjcmVhdGVEYXRhQXNBcnJheS5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudE9iamVjdCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgLi4ucmVzdWx0LCAuLi5jdXJyZW50T2JqZWN0IH07XG5cdFx0XHRcdFx0fSwge30pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhjcmVhdGVEYXRhKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldE1vZGVsKFwidWlcIikuc2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5Eb2N1bWVudE1vZGlmaWVkLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB7XG5cdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0Y3JlYXRlSW5hY3RpdmU6IHBhcmFtZXRlcnMuaW5hY3RpdmUsXG5cdFx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGNvbnN0IGNyZWF0aW9uU3VjY2VzcyA9IGF3YWl0IHRoaXMud2FpdEZvckNyZWF0ZUNvbXBsZXRpb24obmV3Q29udGV4dCwgcGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID09PSB0cnVlKTtcblx0XHRcdFx0aWYgKGNyZWF0aW9uU3VjY2Vzcykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBwYXJhbWV0ZXJzLmFmdGVyQ3JlYXRlQ2FsbEJhY2s/LihuZXdDb250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0Y3JlYXRlRGlhbG9nLmRpc3BsYXlFcnJvck1lc3NhZ2VzKE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCkpO1xuXHRcdFx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBzaG93Qm91bmRTdGF0ZU1lc3NhZ2VzOiB0cnVlIH0pO1xuXG5cdFx0XHRcdFx0XHQvLyBEZWxldGUgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgYW5kIHJlZnJlc2ggaXRzIGxpc3QgYmluZGluZyAob3RoZXJ3aXNlIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHN0aWxsIHZpc2libGUgaW4gdGhlIGxpc3QpXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50KG5ld0NvbnRleHQsIHsgc2lsZW50TW9kZTogdHJ1ZSB9LCBhcHBDb21wb25lbnQsIHJlc291cmNlTW9kZWwsIG1lc3NhZ2VIYW5kbGVyKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucmVmcmVzaExpc3RCaW5kaW5nKGxpc3RCaW5kaW5nLCBhcHBDb21wb25lbnQpO1xuXG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZy9zYXZpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdFx0cmVzdWx0UHJvbWlzZUtlZXBlci5yZXNvbHZlKG5ld0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHQvLyBpbiBjYXNlIG9mIGNyZWF0aW9uIGZhaWxlZCwgZGlhbG9nIHNob3VsZCBzdGF5IG9wZW4gLSB0byBhY2hpZXZlIHRoZSBzYW1lLCBub3RoaW5nIGhhcyB0byBiZSBkb25lIChsaWtlIGluIGNhc2Ugb2Ygc3VjY2VzcyB3aXRoIGJLZWVwRGlhbG9nT3Blbilcblx0XHRcdFx0aWYgKCFbRkVMaWJyYXJ5LkNvbnN0YW50cy5PbkJlZm9yZUNyZWF0ZUZhaWxlZCwgRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZF0uaW5jbHVkZXMoZXJyb3IpKSB7XG5cdFx0XHRcdFx0Ly8gb3RoZXIgZXJyb3JzIGFyZSBub3QgZXhwZWN0ZWRcblx0XHRcdFx0XHR0cmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0Y3JlYXRlRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdFx0cmVzdWx0UHJvbWlzZUtlZXBlci5yZWplY3QoZXJyb3IgYXMgc3RyaW5nIHwgRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRjcmVhdGVEaWFsb2cuc2V0QnVzeShmYWxzZSk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IGlzT3BlcmF0aW9uRGlhbG9nT3BlbjogY3JlYXRlRGlhbG9nLmlzT3BlbigpIH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjcmVhdGVEaWFsb2cuYXR0YWNoRXhpdERpYWxvZyh7fSwgb25FeGl0RGlhbG9nKTtcblxuXHRcdHJldHVybiByZXN1bHRQcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdHMgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIGNvbnRleHQgdG8gYmUgZmluaXNoZWQuXG5cdCAqIEBwYXJhbSBuZXdDb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGNyZWF0ZWRcblx0ICogQHBhcmFtIGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWxcblx0ICovXG5cdGFzeW5jIHdhaXRGb3JDcmVhdGVDb21wbGV0aW9uKG5ld0NvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3QgcHJvbWlzZUtlZXBlciA9IG5ldyBQcm9taXNlS2VlcGVyPGJvb2xlYW4+KCk7XG5cdFx0Y29uc3QgcGFyZW50TGlzdEJpbmRpbmcgPSBuZXdDb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXG5cdFx0Y29uc3Qgb25DcmVhdGVDb21wbGV0ZWQgPSAoZXZlbnQ6IE9EYXRhTGlzdEJpbmRpbmckQ3JlYXRlQ29tcGxldGVkRXZlbnQpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKGNyZWF0ZWRDb250ZXh0ID09PSBuZXdDb250ZXh0KSB7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLmRldGFjaENyZWF0ZUNvbXBsZXRlZChvbkNyZWF0ZUNvbXBsZXRlZCk7XG5cdFx0XHRcdHByb21pc2VLZWVwZXIucmVzb2x2ZShzdWNjZXNzID09PSB0cnVlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cGFyZW50TGlzdEJpbmRpbmcuYXR0YWNoQ3JlYXRlQ29tcGxldGVkKG9uQ3JlYXRlQ29tcGxldGVkKTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uU3VjY2Vzc2Z1bCA9IGF3YWl0IHByb21pc2VLZWVwZXIucHJvbWlzZTtcblx0XHRpZiAoIWNyZWF0aW9uU3VjY2Vzc2Z1bCkge1xuXHRcdFx0aWYgKCFrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcGVuZGluZyBQT1NUIGFuZCBkZWxldGUgdGhlIGNvbnRleHQgaW4gdGhlIGxpc3RCaW5kaW5nXG5cdFx0XHRcdChuZXdDb250ZXh0LmNyZWF0ZWQoKSA/PyBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goZnVuY3Rpb24gKGNvbnRleHRFcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0aW9uIGVycm9yXCIsIGNvbnRleHRFcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGFyZW50TGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdHBhcmVudExpc3RCaW5kaW5nLmdldE1vZGVsKCkucmVzZXRDaGFuZ2VzKHBhcmVudExpc3RCaW5kaW5nLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdFx0XHRcdHRocm93IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGF3YWl0IG5ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgTmV3QWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwbGljYXRpb25cblx0ICogQHBhcmFtIFtvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZV1cblx0ICogQHBhcmFtIHNDcmVhdGVIYXNoIEhhc2ggdG8gYmUgY2hlY2tlZCBmb3IgYWN0aW9uIHR5cGVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIE1ldGFNb2RlbCB1c2VkIHRvIGNoZWNrIGZvciBOZXdBY3Rpb24gcGFyYW1ldGVyXG5cdCAqIEBwYXJhbSBzTWV0YVBhdGggVGhlIE1ldGFQYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0TmV3QWN0aW9uKFxuXHRcdG9TdGFydHVwUGFyYW1ldGVyczoge1xuXHRcdFx0cHJlZmVycmVkTW9kZT86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0c0NyZWF0ZUhhc2g6IHN0cmluZyxcblx0XHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRzTWV0YVBhdGg6IHN0cmluZ1xuXHQpOiBzdHJpbmcge1xuXHRcdGxldCBzTmV3QWN0aW9uO1xuXG5cdFx0aWYgKG9TdGFydHVwUGFyYW1ldGVycyAmJiBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZSAmJiBzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiSS1BQ1RJT049Q1JFQVRFV0lUSFwiKSkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPSBzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiQ1JFQVRFV0lUSDpcIilcblx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHJpbmcoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiZcblx0XHRcdHNDcmVhdGVIYXNoLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJJLUFDVElPTj1BVVRPQ1JFQVRFV0lUSFwiKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgc1ByZWZlcnJlZE1vZGUgPSBvU3RhcnR1cFBhcmFtZXRlcnMucHJlZmVycmVkTW9kZVswXTtcblx0XHRcdHNOZXdBY3Rpb24gPSBzUHJlZmVycmVkTW9kZS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKFwiQVVUT0NSRUFURVdJVEg6XCIpXG5cdFx0XHRcdD8gc1ByZWZlcnJlZE1vZGUuc3Vic3RyaW5nKHNQcmVmZXJyZWRNb2RlLmxhc3RJbmRleE9mKFwiOlwiKSArIDEpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0b01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKSB8fFxuXHRcdFx0XHRcdCAgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzTmV3QWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgbGFiZWwgZm9yIHRoZSB0aXRsZSBvZiBhIHNwZWNpZmljIGNyZWF0ZSBhY3Rpb24gZGlhbG9nLCBlLmcuIENyZWF0ZSBTYWxlcyBPcmRlciBmcm9tIFF1b3RhdGlvbi5cblx0ICpcblx0ICogVGhlIGZvbGxvd2luZyBwcmlvcml0eSBpcyBhcHBsaWVkOlxuXHQgKiAxLiBsYWJlbCBvZiBsaW5lLWl0ZW0gYW5ub3RhdGlvbi5cblx0ICogMi4gbGFiZWwgYW5ub3RhdGVkIGluIHRoZSBhY3Rpb24uXG5cdCAqIDMuIFwiQ3JlYXRlXCIgYXMgYSBjb25zdGFudCBmcm9tIGkxOG4uXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwoXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQsXG5cdFx0c01ldGFQYXRoOiBzdHJpbmcsXG5cdFx0c05ld0FjdGlvbjogc3RyaW5nLFxuXHRcdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwgfCB1bmRlZmluZWRcblx0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBsaW5lSXRlbXMgPSBvTWV0YU1vZGVsPy5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuTGluZUl0ZW1gKSBhcyBMaW5lSXRlbSB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGxhYmVsID0gbGluZUl0ZW1zPy5maW5kKChsaW5lSXRlbSkgPT4gaXNEYXRhRmllbGRGb3JBY3Rpb24obGluZUl0ZW0pICYmIGxpbmVJdGVtLkFjdGlvbi5zcGxpdChcIihcIiwgMSlbMF0gPT09IHNOZXdBY3Rpb24pXG5cdFx0XHQ/LkxhYmVsO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGxhYmVsIHx8XG5cdFx0XHRvTWV0YU1vZGVsPy5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NOZXdBY3Rpb259QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbGApIHx8XG5cdFx0XHRyZXNvdXJjZU1vZGVsPy5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKVxuXHRcdCk7XG5cdH1cbn1cblxuY29uc3Qgc2luZ2xldG9uID0gbmV3IFRyYW5zYWN0aW9uSGVscGVyKCk7XG5leHBvcnQgZGVmYXVsdCBzaW5nbGV0b247XG4iXSwi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
|