@sapui5/sap.fe.core 1.114.0 → 1.114.2
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/ActionRuntime-dbg.js +3 -2
- package/src/sap/fe/core/ActionRuntime.js +1 -1
- package/src/sap/fe/core/ActionRuntime.js.map +1 -1
- package/src/sap/fe/core/ActionRuntime.ts +2 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +4 -1
- package/src/sap/fe/core/AppStateHandler.js +1 -1
- package/src/sap/fe/core/AppStateHandler.js.map +1 -1
- package/src/sap/fe/core/AppStateHandler.ts +4 -1
- package/src/sap/fe/core/ExtensionAPI-dbg.js +3 -2
- package/src/sap/fe/core/ExtensionAPI.js +1 -1
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +7 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +10 -3
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +8 -1
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +5 -5
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +4 -4
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +17 -10
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +15 -8
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +14 -16
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +16 -16
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +2 -4
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +1 -3
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +5 -3
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +4 -2
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +10 -6
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +18 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +2 -2
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +0 -1
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +75 -45
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.ts +72 -43
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +29 -29
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +28 -34
- package/src/sap/fe/core/converters/helpers/InsightsHelpers-dbg.js +11 -3
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +1 -1
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +13 -8
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +70 -22
- package/src/sap/fe/core/helpers/BindingToolkit.js +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.ts +107 -26
- package/src/sap/fe/core/helpers/RecommendationHelper-dbg.js +16 -1
- package/src/sap/fe/core/helpers/RecommendationHelper.js +1 -1
- package/src/sap/fe/core/helpers/RecommendationHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/RecommendationHelper.ts +20 -0
- package/src/sap/fe/core/library-dbg.js +4 -3
- package/src/sap/fe/core/library-preload.js +22 -22
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/library.js.map +1 -1
- package/src/sap/fe/core/library.ts +1 -1
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/messagebundle.properties +6 -0
- package/src/sap/fe/core/messagebundle_ar.properties +5 -1
- package/src/sap/fe/core/messagebundle_bg.properties +9 -5
- package/src/sap/fe/core/messagebundle_ca.properties +5 -1
- package/src/sap/fe/core/messagebundle_cs.properties +7 -3
- package/src/sap/fe/core/messagebundle_cy.properties +7 -3
- package/src/sap/fe/core/messagebundle_da.properties +7 -3
- package/src/sap/fe/core/messagebundle_de.properties +7 -3
- package/src/sap/fe/core/messagebundle_el.properties +7 -3
- package/src/sap/fe/core/messagebundle_en.properties +7 -3
- package/src/sap/fe/core/messagebundle_en_GB.properties +5 -1
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +6 -2
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +6 -2
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +6 -2
- package/src/sap/fe/core/messagebundle_es.properties +5 -1
- package/src/sap/fe/core/messagebundle_es_MX.properties +5 -1
- package/src/sap/fe/core/messagebundle_et.properties +7 -3
- package/src/sap/fe/core/messagebundle_fi.properties +7 -3
- package/src/sap/fe/core/messagebundle_fr.properties +7 -3
- package/src/sap/fe/core/messagebundle_fr_CA.properties +10 -6
- package/src/sap/fe/core/messagebundle_hi.properties +7 -3
- package/src/sap/fe/core/messagebundle_hr.properties +7 -3
- package/src/sap/fe/core/messagebundle_hu.properties +7 -3
- package/src/sap/fe/core/messagebundle_id.properties +7 -3
- package/src/sap/fe/core/messagebundle_it.properties +13 -9
- package/src/sap/fe/core/messagebundle_iw.properties +7 -3
- package/src/sap/fe/core/messagebundle_ja.properties +13 -9
- package/src/sap/fe/core/messagebundle_kk.properties +7 -3
- package/src/sap/fe/core/messagebundle_ko.properties +7 -3
- package/src/sap/fe/core/messagebundle_lt.properties +7 -3
- package/src/sap/fe/core/messagebundle_lv.properties +5 -1
- package/src/sap/fe/core/messagebundle_ms.properties +5 -1
- package/src/sap/fe/core/messagebundle_nl.properties +7 -3
- package/src/sap/fe/core/messagebundle_no.properties +5 -1
- package/src/sap/fe/core/messagebundle_pl.properties +9 -5
- package/src/sap/fe/core/messagebundle_pt.properties +7 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -3
- package/src/sap/fe/core/messagebundle_ro.properties +5 -1
- package/src/sap/fe/core/messagebundle_ru.properties +7 -3
- package/src/sap/fe/core/messagebundle_sh.properties +7 -3
- package/src/sap/fe/core/messagebundle_sk.properties +7 -3
- package/src/sap/fe/core/messagebundle_sl.properties +5 -1
- package/src/sap/fe/core/messagebundle_sv.properties +5 -1
- package/src/sap/fe/core/messagebundle_th.properties +7 -3
- package/src/sap/fe/core/messagebundle_tr.properties +7 -3
- package/src/sap/fe/core/messagebundle_uk.properties +7 -3
- package/src/sap/fe/core/messagebundle_vi.properties +7 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +5 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +8 -4
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/Fcl.controller.js +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.ts +8 -1
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +10 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +30 -14
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +30 -20
|
@@ -11,7 +11,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
11
11
|
var finalExtension = ClassSupport.finalExtension;
|
|
12
12
|
var extensible = ClassSupport.extensible;
|
|
13
13
|
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
14
|
-
var isConnected = ActivitySync.isConnected;
|
|
15
14
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
16
15
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
17
16
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
@@ -568,7 +567,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
568
567
|
* @private
|
|
569
568
|
*/;
|
|
570
569
|
_proto.resolvePath = async function resolvePath(pathToResolve, model, navigationParameter) {
|
|
571
|
-
var _currentHashNoParams, _currentHashNoParams2, _currentHashNoParams3
|
|
570
|
+
var _currentHashNoParams, _currentHashNoParams2, _currentHashNoParams3;
|
|
572
571
|
const metaModel = model.getMetaModel();
|
|
573
572
|
const lastSemanticMapping = this._oRoutingService.getLastSemanticMapping();
|
|
574
573
|
let currentHashNoParams = this._oRouter.getHashChanger().getHash().split("?")[0];
|
|
@@ -582,14 +581,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
582
581
|
}
|
|
583
582
|
const isRootDraft = this.checkDraftAvailability(currentHashNoParams, metaModel),
|
|
584
583
|
semanticKeys = isRootDraft ? SemanticKeyHelper.getSemanticKeys(metaModel, rootEntityName) : undefined,
|
|
585
|
-
isCollaborationEnabled = ModelHelper.isCollaborationDraftSupported(metaModel)
|
|
586
|
-
|
|
584
|
+
isCollaborationEnabled = ModelHelper.isCollaborationDraftSupported(metaModel);
|
|
585
|
+
|
|
587
586
|
/**
|
|
588
587
|
* If the entity is draft enabled, and we're in a collaboration application, and we're navigating to a draft, we're treating it as a new path.
|
|
589
588
|
* We want to check if the draft exists first, then we navigate on it if it does exist, otherwise we navigate to the saved version.
|
|
590
589
|
*/
|
|
591
|
-
if (isRootDraft && isCollaborationEnabled
|
|
592
|
-
|
|
590
|
+
if (isRootDraft && isCollaborationEnabled) {
|
|
591
|
+
var _navigationParameter$;
|
|
592
|
+
const isActiveEntity = (navigationParameter === null || navigationParameter === void 0 ? void 0 : (_navigationParameter$ = navigationParameter.useContext) === null || _navigationParameter$ === void 0 ? void 0 : _navigationParameter$.getProperty("IsActiveEntity")) ?? true;
|
|
593
|
+
if (!isActiveEntity) {
|
|
594
|
+
return this.resolveCollaborationPath(pathToResolve, model, navigationParameter, semanticKeys, rootEntityName);
|
|
595
|
+
}
|
|
593
596
|
}
|
|
594
597
|
/**
|
|
595
598
|
* This is the 'normal' process.
|
|
@@ -679,6 +682,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
679
682
|
// or if we have a context already selected
|
|
680
683
|
if (oUseContext && oUseContext.getPath() === sTargetPath) {
|
|
681
684
|
if (oUseContext !== oCurrentContext) {
|
|
685
|
+
let shouldRefreshContext = false;
|
|
682
686
|
// We already have the context to be used, and it's not the current one
|
|
683
687
|
const oRootViewController = this._oAppComponent.getRootViewController();
|
|
684
688
|
|
|
@@ -688,15 +692,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
688
692
|
if (oRootViewController.isFclEnabled() && oNavigationParameters.reason === NavigationReason.RowPress) {
|
|
689
693
|
const metaModel = oUseContext.getModel().getMetaModel();
|
|
690
694
|
if (!oUseContext.getBinding().hasPendingChanges()) {
|
|
691
|
-
|
|
692
|
-
} else if (isConnected(this.getView()) || ModelHelper.isDraftSupported(metaModel, oUseContext.getPath()) && ModelHelper.isCollaborationDraftSupported(metaModel)) {
|
|
695
|
+
shouldRefreshContext = true;
|
|
696
|
+
} else if (ActivitySync.isConnected(this.getView()) || ModelHelper.isDraftSupported(metaModel, oUseContext.getPath()) && ModelHelper.isCollaborationDraftSupported(metaModel)) {
|
|
693
697
|
// If there are pending changes but we're in collaboration draft, we force the refresh (discarding pending changes) as we need to have the latest version.
|
|
694
698
|
// When navigating from LR to OP, the view is not connected yet --> check if we're in draft with collaboration from the metamodel
|
|
695
699
|
oUseContext.getBinding().resetChanges();
|
|
696
|
-
|
|
700
|
+
shouldRefreshContext = true;
|
|
697
701
|
}
|
|
698
702
|
}
|
|
699
703
|
this._bindPageToContext(oUseContext, oModel, oNavigationParameters);
|
|
704
|
+
if (shouldRefreshContext) {
|
|
705
|
+
oUseContext.refresh();
|
|
706
|
+
}
|
|
700
707
|
}
|
|
701
708
|
} else if (sCurrentPath !== sTargetPath) {
|
|
702
709
|
// We need to create a new context for its path
|
|
@@ -1068,4 +1075,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1068
1075
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
|
|
1069
1076
|
return InternalRouting;
|
|
1070
1077
|
}, false);
|
|
1071
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJ0YXJnZXRQYXRoIiwibW9kZWwiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJyZXNvbHZlUGF0aCIsInRlY2huaWNhbFBhdGgiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm1lc3NhZ2UiLCJjcmVhdGVGaWx0ZXJGcm9tUGF0aCIsInNlbWFudGljUGF0aCIsInNlbWFudGljS2V5cyIsIm1ldGFNb2RlbCIsInVucXVvdGVBbmREZWNvZGUiLCJ2YWx1ZSIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyaW5nIiwia2V5VmFsdWVzIiwic3BsaXQiLCJmaW5hbEtleXMiLCJmaW5hbEtleVZhbHVlcyIsImluY2x1ZGVzIiwiZmlsdGVyIiwic2luZ2xlS2V5IiwiZWxlbWVudCIsInN0YXJ0c1dpdGgiLCJmaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJmaWx0ZXJzIiwia2V5UGFydCIsImtleVZhbHVlIiwiRmlsdGVyIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJmYWlsZWQiLCJtYXAiLCJzZW1hbnRpY0tleSIsImtleSIsImRyYWZ0RmlsdGVyIiwiYW5kIiwicHVzaCIsImdldFRlY2huaWNhbFBhdGhGcm9tUGF0aCIsInBhdGhXaXRoUGFyYW1ldGVycyIsImtleXMiLCJnZXRNZXRhTW9kZWwiLCJlbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRQYXRoIiwibGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiQkZ3JvdXBJZCIsImNvbnRleHRzIiwicmVxdWVzdENvbnRleHRzIiwicmVmcmVzaENvbnRleHQiLCJwYXRoVG9SZXBsYWNlV2l0aCIsImNvbnRleHRUb1JlbW92ZSIsInJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJjaGVja0RyYWZ0QXZhaWxhYmlsaXR5IiwibWF0Y2hlcyIsImV4ZWMiLCJkcmFmdFJvb3QiLCJwYXRoVG9SZXNvbHZlIiwibmF2aWdhdGlvblBhcmFtZXRlciIsImxhc3RTZW1hbnRpY01hcHBpbmciLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwiY3VycmVudEhhc2hOb1BhcmFtcyIsImdldEhhc2hDaGFuZ2VyIiwicm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJpc1Jvb3REcmFmdCIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXNvbHZlQ29sbGFib3JhdGlvblBhdGgiLCJmb3JtYXR0ZWRTZW1hbnRpY0tleXMiLCIkUHJvcGVydHlQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsImZvcm1hdHRlZEtleXMiLCJjb21wYXJhdGl2ZVBhdGgiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsIlR5cGVOYW1lIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIlJvd1ByZXNzIiwicmVmcmVzaCIsImlzQ29ubmVjdGVkIiwiaXNEcmFmdFN1cHBvcnRlZCIsIl9jcmVhdGVDb250ZXh0IiwiQXBwU3RhdGVDaGFuZ2VkIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJiRHJhZnROYXZpZ2F0aW9uIiwic2hvd1BsYWNlaG9sZGVyIiwiYlNob3dQbGFjZWhvbGRlciIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic01lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvUHJldmlvdXNCaW5kaW5nIiwiZGVzdHJveSIsIm9IaWRkZW5CaW5kaW5nIiwiYmluZENvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJpc0xvY2tlZCIsInVubG9jayIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwibVBhcmFtcyIsInN0YXR1cyIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJzaG93TWVzc2FnZXMiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1Jvb3RDb250ZXh0UGF0aCIsImFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocyIsImFQcm9wZXJ0eVBhdGhzIiwib1NpZGVFZmZlY3RzIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwiZ2V0QmluZGluZ1BhdGhzIiwib0JpbmRpbmciLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwiZ2V0Q29udGV4dCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4Iiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwiYWRkaXRpb25uYWxTZWdtZW50cyIsInBvcCIsImtlcHRBbGl2ZVBhdGgiLCJqb2luIiwib0tlZXBBbGl2ZUNvbnRleHQiLCJyZXZlcnNlIiwiYWRkaXRpb25uYWxQYXRoIiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImRyYWZ0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsIk5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJJbnRlcm5hbFJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IGlzQ29ubmVjdGVkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB7IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5cbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS43NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1wiKVxuY2xhc3MgSW50ZXJuYWxSb3V0aW5nIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgX29WaWV3ITogVmlldztcblxuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgbnVsbDtcblxuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbjogYW55O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHR0aGlzLl9vUm91dGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAoIXRoaXMuX29BcHBDb21wb25lbnQgfHwgIXRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sZXIgZXh0ZW5zaW9uICdzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZXNpb25zLkludGVybmFsUm91dGluZ1wiKTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50ID09PSB0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXNuJ3QgaG9zdGVkIGluIGEgZGVkaWNhdGVkIFVJQ29tcG9uZW50LCBidXQgZGlyZWN0bHkgaW4gdGhlIGFwcFxuXHRcdFx0Ly8gLS0+IGp1c3Qga2VlcCB0aGUgdmlld1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIilcblx0XHRcdC50aGVuKChvUm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZSA9IG9Sb3V0aW5nU2VydmljZTtcblx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkFmdGVyQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9UYXJnZXQob0NvbnRleHQ6IGFueSwgc05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsIGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgc1JvdXRlTmFtZSwgbVBhcmFtZXRlck1hcHBpbmcsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgbnVsbCwgbnVsbCwgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fVxuXHRcdHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQgcm91dGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0Um91dGVOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0gW29QYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHRJbmZvOiBhbnkgPSB7fTtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0KSB7XG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGVpdGhlciBjcmVhdGVkIGFzeW5jIChQcm9taXNlKVxuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGFjdGl2YXRlIHRoZSByb3V0ZU1hdGNoU3luY2hybyBvbiB0aGUgUm91dGVyUHJveHkgdG8gYXZvaWQgdGhhdFxuXHRcdFx0XHQvLyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIG5hdmlnYXRlVG9Db250ZXh0IGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk7XG5cblx0XHRcdFx0bVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0XG5cdFx0XHRcdFx0LnRoZW4oKGFzeW5jQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBvbmNlIHRoZSBjb250ZXh0IGlzIHJldHVybmVkIHdlIG5hdmlnYXRlIGludG8gaXRcblx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVUb0NvbnRleHQoYXN5bmNDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiBtUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IG1QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwsXG5cdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiBtUGFyYW1ldGVycy5iRm9yY2VGb2N1c1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFtUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdC8vIE5hdmlnYXRlIHRvIGEgbGlzdCBiaW5kaW5nIG5vdCB5ZXQgc3VwcG9ydGVkXG5cdFx0XHRcdHRocm93IFwibmF2aWdhdGlvbiB0byBhIGxpc3QgYmluZGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jYWxsRXh0ZW5zaW9uKSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cblx0XHRcdG9Db250ZXh0SW5mby5zb3VyY2VCaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0b0NvbnRleHRJbmZvLmJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMub0V2ZW50KSB7XG5cdFx0XHRcdG9Db250ZXh0SW5mby5vRXZlbnQgPSBtUGFyYW1ldGVycy5vRXZlbnQ7XG5cdFx0XHR9XG5cdFx0XHQvLyBTdG9yaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVzZSBpdCBpbiBpbnRlcm5hbCByb3V0ZSBuYXZpZ2F0aW9uIGlmIG5lY2Nlc3NhcnkuXG5cdFx0XHRjb25zdCBiT3ZlcnJpZGVOYXYgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbihvQ29udGV4dEluZm8pO1xuXHRcdFx0aWYgKGJPdmVycmlkZU5hdikge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgZnJvbSBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgZm9yd2FyZHMgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrIGluIGhpc3RvcnkgaWYgdGhlIGN1cnJlbnQgaGFzaCBjb3JyZXNwb25kcyB0byBhIHRyYW5zaWVudCBzdGF0ZS5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpO1xuXG5cdFx0Ly8gaWYgdHJpZ2dlcmVkIHdoaWxlIG5hdmlnYXRpbmcgdG8gKC4uLiksIHdlIG5lZWQgdG8gbmF2aWdhdGUgYmFja1xuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwiKC4uLilcIikgIT09IC0xKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkubmF2QmFjaygpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVcIikgPiAtMSB8fFxuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmRleE9mKFwiaS1hY3Rpb249YXV0b0NyZWF0ZVwiKSA+IC0xXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvSGFzaCh0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0RGVmYXVsdENyZWF0ZUhhc2goKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdFx0cmV0dXJuICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb246IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8IGFUYXJnZXRzLmluZGV4T2YodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpID09PSAtMSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm1zIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0LCB0byBhdm9pZCB0aGlzIHZpZXcgdG8gaGF2ZSBkYXRhIGlmIHdlIG5hdmlnYXRlIHRvIGl0IGxhdGVyIG9uXG5cdFx0XHRpZiAoKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkpIHtcblx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgocm91dGVBcmd1bWVudHM6IGFueSwgYmluZGluZ1BhdHRlcm46IHN0cmluZywgbmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluZGV4T2YoYHske3NLZXl9fWApID49IDApIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmIChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSAmJiByb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXS5oYXNPd25Qcm9wZXJ0eShcImktYWN0aW9uXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IChvRXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIGFueSkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGxldCBvT3V0O1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRvT3V0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5vblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk7XG5cdFx0fSk7XG5cblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBkZWZmZXJlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kRGVmZXJyZWQoc1RhcmdldFBhdGg6IHN0cmluZywgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsLCB7IGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlIH0pO1xuXG5cdFx0aWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0IHx8ICFvTmF2aWdhdGlvblBhcmFtZXRlcnMub0FzeW5jQ29udGV4dCkge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHNUYXJnZXRQYXRoLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0LFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRpZiAoY3VycmVudEJpbmRpbmdDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHQvLyBGb3Igbm93IHJlbW92ZSB0aGUgcGVuZGluZyBjaGFuZ2VzIHRvIGF2b2lkIHRoZSBtb2RlbCByYWlzZXMgZXJyb3JzIGFuZCB0aGUgb2JqZWN0IHBhZ2UgaXMgYXQgbGVhc3QgYm91bmRcblx0XHRcdC8vIElkZWFsbHkgdGhlIHVzZXIgc2hvdWxkIGJlIGFza2VkIGZvclxuXHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyByZW1vdmUgdGhlIGNvbnRleHQgdG8gYXZvaWQgc2hvd2luZyBvbGQgZGF0YVxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlKHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pIHtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlUGF0aCh0YXJnZXRQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigodGVjaG5pY2FsUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9QYXRoKHRlY2huaWNhbFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cblx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBlcnJvci5tZXNzYWdlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZmlsdGVyIHRvIHJldHJpZXZlIGEgY29udGV4dCBjb3JyZXNwb25kaW5nIHRvIGEgc2VtYW50aWMgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNlbWFudGljUGF0aCBUaGUgc2VtYW50aWMgb3IgdGVjaG5pY2FsIHBhdGhcblx0ICogQHBhcmFtIHNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMgb3IgdGVjaG5pY2FsIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGZpbHRlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGNyZWF0ZUZpbHRlckZyb21QYXRoKHNlbWFudGljUGF0aDogc3RyaW5nLCBzZW1hbnRpY0tleXM6IHN0cmluZ1tdLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogRmlsdGVyIHwgbnVsbCB7XG5cdFx0Y29uc3QgdW5xdW90ZUFuZERlY29kZSA9IGZ1bmN0aW9uICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRcdGlmICh2YWx1ZS5pbmRleE9mKFwiJ1wiKSA9PT0gMCAmJiB2YWx1ZS5sYXN0SW5kZXhPZihcIidcIikgPT09IHZhbHVlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBxdW90ZXMgZnJvbSB0aGUgdmFsdWUgYW5kIGRlY29kZSBzcGVjaWFsIGNoYXJzXG5cdFx0XHRcdHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fTtcblx0XHRjb25zdCBrZXlWYWx1ZXMgPSBzZW1hbnRpY1BhdGguc3Vic3RyaW5nKHNlbWFudGljUGF0aC5pbmRleE9mKFwiKFwiKSArIDEsIHNlbWFudGljUGF0aC5sZW5ndGggLSAxKS5zcGxpdChcIixcIik7XG5cblx0XHRsZXQgZmluYWxLZXlzID0gc2VtYW50aWNLZXlzO1xuXHRcdGxldCBmaW5hbEtleVZhbHVlcyA9IGtleVZhbHVlcztcblx0XHQvLyBJZiB3ZSBoYXZlIHRlY2huaWNhbCBrZXlzLCBJc0FjdGl2ZUVudGl0eSB3aWxsIGJlIHByZXNlbnQuIFdlIG5lZWQgdG8gcmVtb3ZlIGl0IGFzIHdlJ3JlIGFscmVhZHkgYWRkaW5nIHRoZW0gYXQgdGhlIGVuZC5cblx0XHRpZiAoc2VtYW50aWNLZXlzLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRcdGZpbmFsS2V5cyA9IHNlbWFudGljS2V5cy5maWx0ZXIoKHNpbmdsZUtleSkgPT4gc2luZ2xlS2V5LmluZGV4T2YoXCJJc0FjdGl2ZUVudGl0eVwiKSA8IDApO1xuXHRcdFx0ZmluYWxLZXlWYWx1ZXMgPSBrZXlWYWx1ZXMuZmlsdGVyKChlbGVtZW50KSA9PiAhZWxlbWVudC5zdGFydHNXaXRoKFwiSXNBY3RpdmVFbnRpdHlcIikpO1xuXHRcdH1cblxuXHRcdGlmIChmaW5hbEtleXMubGVuZ3RoICE9IGZpbmFsS2V5VmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShtZXRhTW9kZWwpO1xuXHRcdGxldCBmaWx0ZXJzOiBGaWx0ZXJbXTtcblx0XHRpZiAoZmluYWxLZXlzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHRlY2huaWNhbCBrZXksIHRoZSBlcXVhbCBpcyBwcmVzZW50IGJlY2F1c2UgdGhlcmUncyBhdCBsZWFzdCAyIHBhcmFtZXRlcnMsIGEgdGVjaG5pY2FsIGtleSBhbmQgSXNBY3RpdmVFbnRpdHlcblx0XHRcdGlmIChmaW5hbEtleVZhbHVlc1swXS5pbmRleE9mKFwiPVwiKSA+IDApIHtcblx0XHRcdFx0Y29uc3Qga2V5UGFydCA9IGZpbmFsS2V5VmFsdWVzWzBdLnNwbGl0KFwiPVwiKTtcblx0XHRcdFx0ZmluYWxLZXlWYWx1ZXNbMF0gPSBrZXlQYXJ0WzFdO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVGFrZSB0aGUgZmlyc3Qga2V5IHZhbHVlXG5cdFx0XHRjb25zdCBrZXlWYWx1ZSA9IHVucXVvdGVBbmREZWNvZGUoZmluYWxLZXlWYWx1ZXNbMF0pO1xuXHRcdFx0ZmlsdGVycyA9IFtcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0cGF0aDogZmluYWxLZXlzWzBdLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHR2YWx1ZTE6IGtleVZhbHVlLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0fSlcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1LZXlWYWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBrZXkgdmFsdWVzXG5cdFx0XHRmaW5hbEtleVZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5QXNzaWdubWVudDogc3RyaW5nKSB7XG5cdFx0XHRcdGNvbnN0IGFQYXJ0cyA9IHNLZXlBc3NpZ25tZW50LnNwbGl0KFwiPVwiKSxcblx0XHRcdFx0XHRrZXlWYWx1ZSA9IHVucXVvdGVBbmREZWNvZGUoYVBhcnRzWzFdKTtcblxuXHRcdFx0XHRtS2V5VmFsdWVzW2FQYXJ0c1swXV0gPSBrZXlWYWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgZmFpbGVkID0gZmFsc2U7XG5cdFx0XHRmaWx0ZXJzID0gZmluYWxLZXlzLm1hcChmdW5jdGlvbiAoc2VtYW50aWNLZXkpIHtcblx0XHRcdFx0Y29uc3Qga2V5ID0gc2VtYW50aWNLZXksXG5cdFx0XHRcdFx0dmFsdWUgPSBtS2V5VmFsdWVzW2tleV07XG5cblx0XHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBrZXksXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZhaWxlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogXCJYWFwiXG5cdFx0XHRcdFx0fSk7IC8vIHdpbGwgYmUgaWdub3JlZCBhbnl3YXkgc2luY2Ugd2UgcmV0dXJuIGFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoZmFpbGVkKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCBhIGRyYWZ0IGZpbHRlciB0byBtYWtlIHN1cmUgd2UgdGFrZSB0aGUgZHJhZnQgZW50aXR5IGlmIHRoZXJlIGlzIG9uZVxuXHRcdC8vIE9yIHRoZSBhY3RpdmUgZW50aXR5IG90aGVyd2lzZVxuXHRcdGNvbnN0IGRyYWZ0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBbbmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgZmFsc2UpLCBuZXcgRmlsdGVyKFwiU2libGluZ0VudGl0eS9Jc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIG51bGwpXSxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0XHRmaWx0ZXJzLnB1c2goZHJhZnRGaWx0ZXIpO1xuXG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVycywgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyB0byBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhXaXRoUGFyYW1ldGVycyBUaGUgcGF0aCB3aXRoIHNlbWFudGljIGtleXNcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIGtleXMgVGhlIHNlbWFudGljIG9yIHRlY2huaWNhbCBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgY29udGFpbmluZyB0aGUgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzIGlmIHBhdGhXaXRoUGFyYW1ldGVycyBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHRlY2huaWNhbCBwYXRoLCBudWxsIG90aGVyd2lzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIGdldFRlY2huaWNhbFBhdGhGcm9tUGF0aChwYXRoV2l0aFBhcmFtZXRlcnM6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGF0aFdpdGhQYXJhbWV0ZXJzKS5nZXRQYXRoKCk7XG5cblx0XHRpZiAoIWtleXMgfHwga2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIHNlbWFudGljL3RlY2huaWNhbCBrZXlzXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSBzZXQgb2YgZmlsdGVycyBjb3JyZXNwb25kaW5nIHRvIGFsbCBrZXlzXG5cdFx0Y29uc3QgZmlsdGVyID0gdGhpcy5jcmVhdGVGaWx0ZXJGcm9tUGF0aChwYXRoV2l0aFBhcmFtZXRlcnMsIGtleXMsIG1ldGFNb2RlbCk7XG5cdFx0aWYgKGZpbHRlciA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgaW50ZXJwcmV0IHRoZSBwYXRoIGFzIGEgc2VtYW50aWMgb25lXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBMb2FkIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdFxuXHRcdGlmICghZW50aXR5U2V0UGF0aD8uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7ZW50aXR5U2V0UGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0QmluZGluZyA9IG1vZGVsLmJpbmRMaXN0KGVudGl0eVNldFBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmaWx0ZXIsIHtcblx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0aWYgKGNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZGF0YSBjb3VsZCBiZSBsb2FkZWRcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZXNoZXMgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBwYXRoVG9SZXBsYWNlV2l0aCBUaGUgcGF0aCB0byB0aGUgbmV3IGNvbnRleHRcblx0ICogQHBhcmFtIGNvbnRleHRUb1JlbW92ZSBUaGUgaW5pdGlhbCBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIHJlZnJlc2hDb250ZXh0KG1vZGVsOiBPRGF0YU1vZGVsLCBwYXRoVG9SZXBsYWNlV2l0aDogc3RyaW5nLCBjb250ZXh0VG9SZW1vdmU6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRUb1JlcGxhY2VXaXRoID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChwYXRoVG9SZXBsYWNlV2l0aCk7XG5cdFx0XHRjb250ZXh0VG9SZW1vdmUucmVwbGFjZVdpdGgoY29udGV4dFRvUmVwbGFjZVdpdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBhIHJvb3QgZHJhZnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRlc3Rcblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgYSByb290IHBhdGhcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjaGVja0RyYWZ0QXZhaWxhYmlsaXR5KHBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1hdGNoZXMgPSAvXlsvXT8oXFx3KylcXChbXi9dK1xcKSQvLmV4ZWMocGF0aCk7XG5cdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8vIEdldCB0aGUgZW50aXR5U2V0IG5hbWVcblx0XHRjb25zdCBlbnRpdHlTZXRQYXRoID0gYC8ke21hdGNoZXNbMV19YDtcblx0XHQvLyBDaGVjayB0aGUgZW50aXR5IHNldCBzdXBwb3J0cyBkcmFmdFxuXHRcdGNvbnN0IGRyYWZ0Um9vdCA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdHJldHVybiBkcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgcGF0aCB0byBuYXZpZ2F0ZSB0byBmcm9tIGEgcGF0aCB3aXRoIFNlbWFudGljS2V5cyBvciB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhUb1Jlc29sdmUgVGhlIHBhdGggdG8gYmUgdHJhbnNmb3JtZWRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlciBUaGUgcGFyYW1ldGVyIG9mIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEByZXR1cm5zIFN0cmluZyBwcm9taXNlIGZvciB0aGUgbmV3IHBhdGguIElmIHBhdGhUb1Jlc29sdmUgY291bGRuJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBpdCBpcyByZXR1cm5lZCBhcyBpcy5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRhc3luYyByZXNvbHZlUGF0aChwYXRoVG9SZXNvbHZlOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBjdXJyZW50SGFzaE5vUGFyYW1zID0gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKS5zcGxpdChcIj9cIilbMF07XG5cblx0XHRpZiAoY3VycmVudEhhc2hOb1BhcmFtcz8ubGFzdEluZGV4T2YoXCIvXCIpID09PSBjdXJyZW50SGFzaE5vUGFyYW1zPy5sZW5ndGggLSAxKSB7XG5cdFx0XHQvLyBSZW1vdmUgdHJhaWxpbmcgJy8nXG5cdFx0XHRjdXJyZW50SGFzaE5vUGFyYW1zID0gY3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgY3VycmVudEhhc2hOb1BhcmFtcy5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRsZXQgcm9vdEVudGl0eU5hbWUgPSBjdXJyZW50SGFzaE5vUGFyYW1zPy5zdWJzdHIoMCwgY3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHJvb3RFbnRpdHlOYW1lLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHRyb290RW50aXR5TmFtZSA9IHJvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgaXNSb290RHJhZnQgPSB0aGlzLmNoZWNrRHJhZnRBdmFpbGFiaWxpdHkoY3VycmVudEhhc2hOb1BhcmFtcywgbWV0YU1vZGVsKSxcblx0XHRcdHNlbWFudGljS2V5cyA9IGlzUm9vdERyYWZ0XG5cdFx0XHRcdD8gKFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhtZXRhTW9kZWwsIHJvb3RFbnRpdHlOYW1lKSBhcyB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10pXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0aXNDb2xsYWJvcmF0aW9uRW5hYmxlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCksXG5cdFx0XHRpc0FjdGl2ZUVudGl0eSA9IG5hdmlnYXRpb25QYXJhbWV0ZXI/LnVzZUNvbnRleHQ/LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPz8gdHJ1ZTtcblx0XHQvKipcblx0XHQgKiBJZiB0aGUgZW50aXR5IGlzIGRyYWZ0IGVuYWJsZWQsIGFuZCB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24sIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQsIHdlJ3JlIHRyZWF0aW5nIGl0IGFzIGEgbmV3IHBhdGguXG5cdFx0ICogV2Ugd2FudCB0byBjaGVjayBpZiB0aGUgZHJhZnQgZXhpc3RzIGZpcnN0LCB0aGVuIHdlIG5hdmlnYXRlIG9uIGl0IGlmIGl0IGRvZXMgZXhpc3QsIG90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgc2F2ZWQgdmVyc2lvbi5cblx0XHQgKi9cblx0XHRpZiAoaXNSb290RHJhZnQgJiYgaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCAmJiAhaXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVDb2xsYWJvcmF0aW9uUGF0aChwYXRoVG9SZXNvbHZlLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlciwgc2VtYW50aWNLZXlzLCByb290RW50aXR5TmFtZSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgaXMgdGhlICdub3JtYWwnIHByb2Nlc3MuXG5cdFx0ICogSWYgd2UgZG9uJ3QgaGF2ZSBzZW1hbnRpYyBrZXlzLCB0aGUgcGF0aCB3ZSBoYXZlIGlzIHRlY2huaWNhbCBhbmQgY2FuIGJlIHVzZWQgYXMgaXMuXG5cdFx0ICogSWYgdGhlIHBhdGggdG8gcmVzb2x2ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2VtYW50aWMgcGF0aCwgdGhlbiB3ZSBrbm93IGlzIGhhcyBiZWVuIHJlc29sdmVkIHByZXZpb3VzbHkgYW5kIHdlIGNhbiByZXR1cm4gdGhlIHRlY2huaWNhbCBwYXRoXG5cdFx0ICogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGV2YWx1YXRlIHRoZSB0ZWNobmljYWwgcGF0aCwgdG8gc2V0IHVwIHRoZSBzZW1hbnRpYyBtYXBwaW5nIChpZiBpdCdzIGJlZW4gcmVzb2x2ZWQpLlxuXHRcdCAqL1xuXHRcdGlmIChzZW1hbnRpY0tleXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHBhdGhUb1Jlc29sdmU7XG5cdFx0fVxuXHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGggPT09IHBhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gbGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBmb3JtYXR0ZWRTZW1hbnRpY0tleXMgPSBzZW1hbnRpY0tleXMubWFwKChzaW5nbGVLZXkpID0+IHNpbmdsZUtleS4kUHJvcGVydHlQYXRoKTtcblxuXHRcdC8vIFdlIG5lZWQgcmVzb2x2ZSB0aGUgc2VtYW50aWMgcGF0aCB0byBnZXQgdGhlIHRlY2huaWNhbCBrZXlzXG5cdFx0Y29uc3QgdGVjaG5pY2FsUGF0aCA9IGF3YWl0IHRoaXMuZ2V0VGVjaG5pY2FsUGF0aEZyb21QYXRoKGN1cnJlbnRIYXNoTm9QYXJhbXMsIG1vZGVsLCBmb3JtYXR0ZWRTZW1hbnRpY0tleXMpO1xuXG5cdFx0aWYgKHRlY2huaWNhbFBhdGggJiYgdGVjaG5pY2FsUGF0aCAhPT0gcGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0Ly8gVGhlIHNlbWFudGljIHBhdGggd2FzIHJlc29sdmVkIChvdGhlcndpc2Uga2VlcCB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRhcmdldClcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHtcblx0XHRcdFx0dGVjaG5pY2FsUGF0aDogdGVjaG5pY2FsUGF0aCxcblx0XHRcdFx0c2VtYW50aWNQYXRoOiBwYXRoVG9SZXNvbHZlXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0ZWNobmljYWxQYXRoO1xuXHRcdH1cblx0XHRyZXR1cm4gcGF0aFRvUmVzb2x2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmFsdWF0ZSB0aGUgcGF0aCB0byBuYXZpZ2F0ZSB3aGVuIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbiBhbmQgbmF2aWdhdGluZyB0byBhIGRyYWZ0LlxuXHQgKiBJZiB0aGUgZHJhZnQgaGFzIGJlZW4gZGlzY2FyZGVkLCB3ZSBjaGFuZ2UgdGhlIHBhdGggdG8gdGhlIHNpYmxpbmcgZWxlbWVudCBhc3NvY2lhdGVkLCBvdGhlcndpc2Ugd2Uga2VlcCB0aGUgc2FtZSBwYXRoLlxuXHQgKiBXZSdyZSBub3QgZG9pbmcgaXQgb3V0c2lkZSBvZiBjb2xsYWJvcmF0aW9uIGFzIGl0J3MgYWRkaW5nIGEgcmVxdWVzdCBkdXJpbmcgbmF2aWdhdGlvbiFcblx0ICpcblx0ICogQHBhcmFtIHBhdGhUb1Jlc29sdmUgVGhlIHBhdGggd2UncmUgY2hlY2tpbmcuIElmIHRoZSBkcmFmdCBleGlzdHMsIHdlIHJldHVybiBpdCBhcyBpcywgb3RoZXJ3aXNlIHdlIHJldHVybiB0aGUgc2libGluZyBlbGVtZW50IGFzc29jaWF0ZWRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBvRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlciBUaGUgcGFyYW1ldGVyIG9mIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBzZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgaWYgd2UgaGF2ZSBzZW1hbnRpYyBuYXZpZ2F0aW9uLCBvdGhlcndpc2UgZmFsc2Vcblx0ICogQHBhcmFtIHJvb3RFbnRpdHlOYW1lIE5hbWUgb2YgdGhlIHJvb3QgZW50aXR5XG5cdCAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIG5hdmlnYXRlIHRvXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRhc3luYyByZXNvbHZlQ29sbGFib3JhdGlvblBhdGgoXG5cdFx0cGF0aFRvUmVzb2x2ZTogc3RyaW5nLFxuXHRcdG1vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdG5hdmlnYXRpb25QYXJhbWV0ZXI6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyxcblx0XHRzZW1hbnRpY0tleXM6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSB8IHVuZGVmaW5lZCxcblx0XHRyb290RW50aXR5TmFtZTogc3RyaW5nXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGxldCBmb3JtYXR0ZWRLZXlzOiBzdHJpbmdbXTtcblx0XHRjb25zdCBjb21wYXJhdGl2ZVBhdGggPSBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID8/IHBhdGhUb1Jlc29sdmU7XG5cdFx0aWYgKHNlbWFudGljS2V5cykge1xuXHRcdFx0Zm9ybWF0dGVkS2V5cyA9IHNlbWFudGljS2V5cy5tYXAoKHNpbmdsZUtleSkgPT4gc2luZ2xlS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3JtYXR0ZWRLZXlzID0gbWV0YU1vZGVsLmdldE9iamVjdChgLyR7cm9vdEVudGl0eU5hbWV9LyRUeXBlLyRLZXlgKTtcblx0XHR9XG5cblx0XHRjb25zdCB0ZWNobmljYWxQYXRoID0gYXdhaXQgdGhpcy5nZXRUZWNobmljYWxQYXRoRnJvbVBhdGgoY3VycmVudEhhc2hOb1BhcmFtcywgbW9kZWwsIGZvcm1hdHRlZEtleXMpO1xuXHRcdGlmICh0ZWNobmljYWxQYXRoID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gcGF0aFRvUmVzb2x2ZTtcblx0XHR9XG5cdFx0Ly8gQ29tcGFyaW5nIHBhdGggdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdGhlIG9uZSB3ZSBoYXZlLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIGl0IG1lYW5zIHRoZSBkcmFmdCBkb2Vzbid0IGV4aXN0LlxuXHRcdGlmICh0ZWNobmljYWxQYXRoICE9PSBjb21wYXJhdGl2ZVBhdGggJiYgbmF2aWdhdGlvblBhcmFtZXRlci51c2VDb250ZXh0KSB7XG5cdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZykge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2Uuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7XG5cdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogdGVjaG5pY2FsUGF0aCxcblx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHBhdGhUb1Jlc29sdmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyLnJlZGlyZWN0ZWRUb05vbkRyYWZ0ID1cblx0XHRcdFx0bWV0YU1vZGVsLmdldE9iamVjdChgLyR7cm9vdEVudGl0eU5hbWV9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvYCk/LlR5cGVOYW1lID8/IHJvb3RFbnRpdHlOYW1lO1xuXHRcdFx0YXdhaXQgdGhpcy5yZWZyZXNoQ29udGV4dChtb2RlbCwgdGVjaG5pY2FsUGF0aCwgbmF2aWdhdGlvblBhcmFtZXRlci51c2VDb250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRlY2huaWNhbFBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQuIE5lZWRzIHRvIGNvbnRhaW4gdGVjaG5pY2FsIGtleXMgb25seS5cblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbykge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0aXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbykge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0KSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWUgLy8gTG9hZCBtZXNzYWdlcywgb3RoZXJ3aXNlIHRoZXkgZG9uJ3QgZ2V0IHJlZnJlc2hlZCBsYXRlciwgZS5nLiBmb3Igc2lkZSBlZmZlY3RzXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0Ly8gc2V0S2VlcEFsaXZlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHBhcmVudCBsaXN0YmluZGluZyBkb2Vzbid0IGhhdmUgJCRvd25SZXF1ZXN0PXRydWVcblx0XHRcdFx0Ly8gVGhpcyBjYXNlIGZvciBjdXN0b20gZnJhZ21lbnRzIGlzIHN1cHBvcnRlZCwgYnV0IGFuIGVycm9yIGlzIGxvZ2dlZCB0byBtYWtlIHRoZSBsYWNrIG9mIHN5bmNocm9uaXphdGlvbiBhcHBhcmVudFxuXHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0YFZpZXcgZm9yICR7b0NvbnRleHQuZ2V0UGF0aCgpfSB3b24ndCBiZSBzeW5jaHJvbml6ZWQuIFBhcmVudCBsaXN0QmluZGluZyBtdXN0IGhhdmUgYmluZGluZyBwYXJhbWV0ZXIgJCRvd25SZXF1ZXN0PXRydWVgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8IG9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgY29udGV4dCBvdGhlcndpc2Ugd2UgZ2V0IGVycm9yc1xuXHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIHRoZSBwcm9wZXIgYmVmb3JlL2FmdGVyIGNhbGxiYWNrc1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlNob3dQbGFjZWhvbGRlclxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcob0NvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IGFueSA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0b0RyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ/IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXVxuXHRcdFx0XHRcdFx0XHQ6IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHNFbnRpdHlTZXQpIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy4kc2VsZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gXCJIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ICs9IFwiLEhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRjb25zdCBvUHJldmlvdXNCaW5kaW5nID0gKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgYW55KT8uZ2V0QmluZGluZygpO1xuXHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nXG5cdFx0XHRcdFx0Py5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdG9QcmV2aW91c0JpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVzZXRpbmcgdGhlIGNoYW5nZXMgdG8gdGhlIGJpbmRpbmdcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG9uRGF0YVJlY2VpdmVkKG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBzRXJyb3JEZXNjcmlwdGlvbiA9IG9FdmVudCAmJiBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5fb1ZpZXcpKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXG5cdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IGF3YWl0IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0XHRsZXQgbVBhcmFtcyA9IHt9O1xuXHRcdFx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA1MDMpIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0aXNJbml0aWFsTG9hZDUwM0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIGlmIChzRXJyb3JEZXNjcmlwdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JfREVTQ1JJUFRJT05cIiksXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Vycm9yRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9CaW5kaW5nQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKChvQmluZGluZy5nZXRDb250ZXh0KCkgJiYgb0JpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSkgfHwgXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBgJHtzUmVsYXRpdmVQYXRoLnNsaWNlKDEpfS9gIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoYURlcGVuZGVudEJpbmRpbmdzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFQcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldHM6IHN0cmluZ1tdLCB0YXJnZXRQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdHRhcmdldHMucHVzaChpbmRleCA+IDAgPyB0YXJnZXRQcm9wZXJ0eS5zbGljZSgwLCBpbmRleCkgOiB0YXJnZXRQcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0cztcblx0XHR9LCBbXSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRCaW5kaW5nQ29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IGFueSkge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dD8uaXNLZWVwQWxpdmUoKSAmJiBvUHJldmlvdXNDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKG9QcmV2aW91c0NvbnRleHQsIGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgbGV2ZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUob0NvbnRleHQ6IENvbnRleHQsIGJLZWVwQWxpdmU6IGJvb2xlYW4sIGZuQmVmb3JlRGVzdHJveT86IEZ1bmN0aW9uLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbikge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbDogT0RhdGFNb2RlbCwgcGF0aDogc3RyaW5nLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbiwgcGFyYW1ldGVycz86IGFueSk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIGNvbnRleHQgdGhhdCBpcyByZWFsbHkga2VwdCBhbGl2ZSAocGFydCBvZiBhIGNvbGxlY3Rpb24pXG5cdFx0Ly8gaS5lLiByZW1vdmUgYWxsIHNlZ21lbnRzIG5vdCBlbmRpbmcgd2l0aCBhICcpJ1xuXHRcdGNvbnN0IGtlcHRBbGl2ZVNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgYWRkaXRpb25uYWxTZWdtZW50czogc3RyaW5nW10gPSBbXTtcblx0XHR3aGlsZSAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoICYmICFrZXB0QWxpdmVTZWdtZW50c1trZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggLSAxXS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucHVzaChrZXB0QWxpdmVTZWdtZW50cy5wb3AoKSEpO1xuXHRcdH1cblxuXHRcdGlmIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2VwdEFsaXZlUGF0aCA9IGtlcHRBbGl2ZVNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdGNvbnN0IG9LZWVwQWxpdmVDb250ZXh0ID0gb01vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoa2VwdEFsaXZlUGF0aCwgYlJlcXVlc3RNZXNzYWdlcywgcGFyYW1ldGVycyk7XG5cblx0XHRpZiAoYWRkaXRpb25uYWxTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBvS2VlcEFsaXZlQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5yZXZlcnNlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbm5hbFBhdGggPSBhZGRpdGlvbm5hbFNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0cmV0dXJuIG9Nb2RlbC5iaW5kQ29udGV4dChhZGRpdGlvbm5hbFBhdGgsIG9LZWVwQWxpdmVDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGwtc2NyZWVuIG1vZGUgd2hlbiBGQ0wgaXMgdXNlZC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBzTGF5b3V0OiBzTmV4dExheW91dCB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKSB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7RUErQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBLElBU01BLGVBQWUsV0FEcEJDLGNBQWMsQ0FBQyxrREFBa0QsQ0FBQyxVQW9CakVDLGNBQWMsRUFBRSxVQU9oQkEsY0FBYyxFQUFFLFVBb0NoQkMsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsVUFLbkNILGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBS25DSCxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQVFuQ0gsZUFBZSxFQUFFLFdBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FzQm5DSCxlQUFlLEVBQUUsV0F5QmpCQSxlQUFlLEVBQUUsV0FhakJBLGVBQWUsRUFBRSxXQUNqQkksY0FBYyxFQUFFLFdBNkRoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FnQmhCSixlQUFlLEVBQUUsV0FDakJJLGNBQWMsRUFBRSxXQWNoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FVaEJKLGVBQWUsRUFBRSxXQUNqQkksY0FBYyxFQUFFLFdBc0JoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0Ewb0JoQkosZUFBZSxFQUFFLFdBcU5qQkEsZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FzQmhCSixlQUFlLEVBQUUsV0FDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNHLE1BQU0sQ0FBQztJQUFBO0lBQUE7TUFBQTtJ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
|
|
1078
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJ0YXJnZXRQYXRoIiwibW9kZWwiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJyZXNvbHZlUGF0aCIsInRlY2huaWNhbFBhdGgiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm1lc3NhZ2UiLCJjcmVhdGVGaWx0ZXJGcm9tUGF0aCIsInNlbWFudGljUGF0aCIsInNlbWFudGljS2V5cyIsIm1ldGFNb2RlbCIsInVucXVvdGVBbmREZWNvZGUiLCJ2YWx1ZSIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyaW5nIiwia2V5VmFsdWVzIiwic3BsaXQiLCJmaW5hbEtleXMiLCJmaW5hbEtleVZhbHVlcyIsImluY2x1ZGVzIiwiZmlsdGVyIiwic2luZ2xlS2V5IiwiZWxlbWVudCIsInN0YXJ0c1dpdGgiLCJmaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJmaWx0ZXJzIiwia2V5UGFydCIsImtleVZhbHVlIiwiRmlsdGVyIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJmYWlsZWQiLCJtYXAiLCJzZW1hbnRpY0tleSIsImtleSIsImRyYWZ0RmlsdGVyIiwiYW5kIiwicHVzaCIsImdldFRlY2huaWNhbFBhdGhGcm9tUGF0aCIsInBhdGhXaXRoUGFyYW1ldGVycyIsImtleXMiLCJnZXRNZXRhTW9kZWwiLCJlbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRQYXRoIiwibGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiQkZ3JvdXBJZCIsImNvbnRleHRzIiwicmVxdWVzdENvbnRleHRzIiwicmVmcmVzaENvbnRleHQiLCJwYXRoVG9SZXBsYWNlV2l0aCIsImNvbnRleHRUb1JlbW92ZSIsInJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJjaGVja0RyYWZ0QXZhaWxhYmlsaXR5IiwibWF0Y2hlcyIsImV4ZWMiLCJkcmFmdFJvb3QiLCJwYXRoVG9SZXNvbHZlIiwibmF2aWdhdGlvblBhcmFtZXRlciIsImxhc3RTZW1hbnRpY01hcHBpbmciLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwiY3VycmVudEhhc2hOb1BhcmFtcyIsImdldEhhc2hDaGFuZ2VyIiwicm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJpc1Jvb3REcmFmdCIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXNvbHZlQ29sbGFib3JhdGlvblBhdGgiLCJmb3JtYXR0ZWRTZW1hbnRpY0tleXMiLCIkUHJvcGVydHlQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsImZvcm1hdHRlZEtleXMiLCJjb21wYXJhdGl2ZVBhdGgiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsIlR5cGVOYW1lIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJzaG91bGRSZWZyZXNoQ29udGV4dCIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJyZWFzb24iLCJOYXZpZ2F0aW9uUmVhc29uIiwiUm93UHJlc3MiLCJBY3Rpdml0eVN5bmMiLCJpc0Nvbm5lY3RlZCIsImlzRHJhZnRTdXBwb3J0ZWQiLCJyZWZyZXNoIiwiX2NyZWF0ZUNvbnRleHQiLCJBcHBTdGF0ZUNoYW5nZWQiLCJpc0VkaXRTdGF0ZURpcnR5IiwiX3JlZnJlc2hCaW5kaW5nQ29udGV4dCIsIm9QYXJlbnRMaXN0QmluZGluZyIsIl9zZXRLZWVwQWxpdmUiLCJpc0NvbnRleHRVc2VkSW5QYWdlcyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwic1BhdGgiLCJvUGFnZUNvbXBvbmVudCIsInNFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJzQ29udGV4dFBhdGgiLCJnZXRDb250ZXh0UGF0aCIsIm9NZXRhTW9kZWwiLCIkJHVwZGF0ZUdyb3VwSWQiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJfZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcXVlc3RQcm9wZXJ0eSIsInJlcXVlc3RPYmplY3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJzTWVzc2FnZXNQYXRoIiwiJHNlbGVjdCIsIm9QcmV2aW91c0JpbmRpbmciLCJkZXN0cm95Iiwib0hpZGRlbkJpbmRpbmciLCJiaW5kQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib25EYXRhUmVjZWl2ZWQiLCJnZXRCb3VuZENvbnRleHQiLCJzRXJyb3JEZXNjcmlwdGlvbiIsImlzTG9ja2VkIiwidW5sb2NrIiwib1Jlc291cmNlQnVuZGxlIiwibWVzc2FnZUhhbmRsZXIiLCJtUGFyYW1zIiwic3RhdHVzIiwiaXNJbml0aWFsTG9hZDUwM0Vycm9yIiwic2hlbGxCYWNrIiwiaXNEYXRhUmVjZWl2ZWRFcnJvciIsInNob3dNZXNzYWdlcyIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJzUm9vdENvbnRleHRQYXRoIiwiYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzIiwiYVByb3BlcnR5UGF0aHMiLCJvU2lkZUVmZmVjdHMiLCJ0YXJnZXRQcm9wZXJ0aWVzIiwidGFyZ2V0RW50aXRpZXMiLCJnZXRCaW5kaW5nUGF0aHMiLCJvQmluZGluZyIsImFEZXBlbmRlbnRCaW5kaW5ncyIsInNSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0Iiwic2xpY2UiLCJnZXREZXBlbmRlbnRCaW5kaW5ncyIsImkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInJlZHVjZSIsInRhcmdldFByb3BlcnR5IiwiaW5kZXgiLCJvUHJldmlvdXNDb250ZXh0Iiwib1RhcmdldENvbnRyb2wiLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzS2VlcEFsaXZlIiwiYktlZXBBbGl2ZSIsImZuQmVmb3JlRGVzdHJveSIsImJSZXF1ZXN0TWVzc2FnZXMiLCJlbmRzV2l0aCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwic2V0S2VlcEFsaXZlIiwia2VwdEFsaXZlU2VnbWVudHMiLCJhZGRpdGlvbm5hbFNlZ21lbnRzIiwicG9wIiwia2VwdEFsaXZlUGF0aCIsImpvaW4iLCJvS2VlcEFsaXZlQ29udGV4dCIsInJldmVyc2UiLCJhZGRpdGlvbm5hbFBhdGgiLCJzd2l0Y2hGdWxsU2NyZWVuIiwib1NvdXJjZSIsIm9GQ0xIZWxwZXJNb2RlbCIsImJJc0Z1bGxTY3JlZW4iLCJzTmV4dExheW91dCIsImdldFJpZ2h0bW9zdENvbnRleHQiLCJfcm91dGluZyIsInNMYXlvdXQiLCJ3YXJuaW5nIiwiY2xvc2VDb2x1bW4iLCJvVmlld0RhdGEiLCJub1ByZXNlcnZhdGlvbkNhY2hlIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkludGVybmFsUm91dGluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IEFjdGl2aXR5U3luYyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL05hdmlnYXRpb25SZWFzb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlclByb3h5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9yb3V0aW5nL1JvdXRlclByb3h5XCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbywgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1xuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0cHJpdmF0ZSBfb1JvdXRpbmdTZXJ2aWNlITogUm91dGluZ1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBfb1RhcmdldEluZm9ybWF0aW9uOiBhbnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCkge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHR0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kID0gdGhpcy5fb25Sb3V0ZU1hdGNoZWQuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1RhcmdldChvQ29udGV4dDogYW55LCBzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZywgYlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9XG5cdFx0dGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigoYXN5bmNDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChhc3luY0NvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IG1QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogbVBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IG1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoIW1QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0b0NvbnRleHRJbmZvLnNvdXJjZUJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRvQ29udGV4dEluZm8uYmluZGluZ0NvbnRleHQgPSBvQ29udGV4dDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5vRXZlbnQpIHtcblx0XHRcdFx0b0NvbnRleHRJbmZvLm9FdmVudCA9IG1QYXJhbWV0ZXJzLm9FdmVudDtcblx0XHRcdH1cblx0XHRcdC8vIFN0b3JpbmcgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXNlIGl0IGluIGludGVybmFsIHJvdXRlIG5hdmlnYXRpb24gaWYgbmVjY2Vzc2FyeS5cblx0XHRcdGNvbnN0IGJPdmVycmlkZU5hdiA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKG9Db250ZXh0SW5mbyk7XG5cdFx0XHRpZiAoYk92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIGZyb21cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluZGV4T2YoXCIoLi4uKVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9NZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGlmIChcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWNyZWF0ZVwiKSA+IC0xIHx8XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1hdXRvQ3JlYXRlXCIpID4gLTFcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0XHRyZXR1cm4gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5RXJyb3JQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdGUgaXMgaW1wYWN0ZWQgYnkgdGhlIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHRfaXNWaWV3UGFydE9mUm91dGUocm91dGVJbmZvcm1hdGlvbjogYW55KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYVRhcmdldHMgPSByb3V0ZUluZm9ybWF0aW9uPy50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgYVRhcmdldHMuaW5kZXhPZih0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkgPT09IC0xKSB7XG5cdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaGFzIGEgdmlldyBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHJvdXRlIGxldmVsLCBpdCBtZWFucyB0aGlzIHZpZXcgY29tZXMgXCJhZnRlclwiIHRoZSByb3V0ZVxuXHRcdFx0Ly8gaW4gdGVybXMgb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQsIHRvIGF2b2lkIHRoaXMgdmlldyB0byBoYXZlIGRhdGEgaWYgd2UgbmF2aWdhdGUgdG8gaXQgbGF0ZXIgb25cblx0XHRcdGlmICgodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSkge1xuXHRcdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTsgLy8gVGhpcyBhbHNvIGNhbGwgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfYnVpbGRCaW5kaW5nUGF0aChyb3V0ZUFyZ3VtZW50czogYW55LCBiaW5kaW5nUGF0dGVybjogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KTogeyBwYXRoOiBzdHJpbmc7IGRlZmVycmVkOiBib29sZWFuIH0ge1xuXHRcdGxldCBwYXRoID0gYmluZGluZ1BhdHRlcm4ucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdGxldCBkZWZlcnJlZCA9IGZhbHNlO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIHJvdXRlQXJndW1lbnRzKSB7XG5cdFx0XHRjb25zdCBzVmFsdWUgPSByb3V0ZUFyZ3VtZW50c1tzS2V5XTtcblx0XHRcdGlmIChzVmFsdWUgPT09IFwiLi4uXCIgJiYgYmluZGluZ1BhdHRlcm4uaW5kZXhPZihgeyR7c0tleX19YCkgPj0gMCkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKHJvdXRlQXJndW1lbnRzW1wiP3F1ZXJ5XCJdICYmIHJvdXRlQXJndW1lbnRzW1wiP3F1ZXJ5XCJdLmhhc093blByb3BlcnR5KFwiaS1hY3Rpb25cIikpIHtcblx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIHRoZSBiaW5kaW5nIHBhdGggaXMgYWx3YXlzIGFic29sdXRlXG5cdFx0aWYgKHBhdGggJiYgcGF0aFswXSAhPT0gXCIvXCIpIHtcblx0XHRcdHBhdGggPSBgLyR7cGF0aH1gO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IHBhdGgsIGRlZmVycmVkIH07XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRvIGJpbmQgdGhlIHBhZ2Ugd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWRcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBCdWlsZHMgdGhlIGJpbmRpbmcgY29udGV4dCBmcm9tIHRoZSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMsIGFuZCBiaW5kIHRoZSBwYWdlIGFjY29yZGluZ2x5LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKG9FdmVudDogRXZlbnQpIHtcblx0XHQvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaXMgcGFydCBvZiB0aGUgZXZlbnQgdGFyZ2V0cyAoaS5lLiBpcyBhIHRhcmdldCBmb3IgdGhlIGN1cnJlbnQgcm91dGUpLlxuXHRcdC8vIElmIG5vdCwgd2UgZG9uJ3QgbmVlZCB0byBiaW5kIGl0IC0tPiByZXR1cm5cblx0XHRpZiAoIXRoaXMuX2lzVmlld1BhcnRPZlJvdXRlKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZUluZm9ybWF0aW9uXCIpKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHJpZXZlIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGxldCBiaW5kaW5nUGF0dGVybjtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKSB7XG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybigpO1xuXHRcdH1cblx0XHRiaW5kaW5nUGF0dGVybiA9IGJpbmRpbmdQYXR0ZXJuIHx8IHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5jb250ZXh0UGF0dGVybjtcblxuXHRcdGlmIChiaW5kaW5nUGF0dGVybiA9PT0gbnVsbCB8fCBiaW5kaW5nUGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBEb24ndCBkbyB0aGlzIGlmIHdlIGFscmVhZHkgZ290IHNUYXJnZXQgPT0gJycsIHdoaWNoIGlzIGEgdmFsaWQgdGFyZ2V0IHBhdHRlcm5cblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlUGF0dGVyblwiKTtcblx0XHR9XG5cblx0XHQvLyBSZXBsYWNlIHRoZSBwYXJhbWV0ZXJzIGJ5IHRoZWlyIHZhbHVlcyBpbiB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRjb25zdCBtQXJndW1lbnRzID0gKG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkgYXMgYW55KS5hcmd1bWVudHM7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25QYXJhbWV0ZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcIm5hdmlnYXRpb25JbmZvXCIpO1xuXHRcdGNvbnN0IHsgcGF0aCwgZGVmZXJyZWQgfSA9IHRoaXMuX2J1aWxkQmluZGluZ1BhdGgobUFyZ3VtZW50cywgYmluZGluZ1BhdHRlcm4sIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cblx0XHR0aGlzLm9uUm91dGVNYXRjaGVkKCk7XG5cblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0bGV0IG9PdXQ7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZERlZmVycmVkKHBhdGgsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kUGFnZShwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdG9PdXQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHR9KTtcblxuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkudXBkYXRlVUlTdGF0ZUZvclZpZXcodGhpcy5fb1ZpZXcsIHRoaXMuX2dldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmREZWZlcnJlZChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwsIHsgZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQgfHwgIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5vQXN5bmNDb250ZXh0KSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0c1RhcmdldFBhdGgsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChjdXJyZW50QmluZGluZ0NvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdC8vIEZvciBub3cgcmVtb3ZlIHRoZSBwZW5kaW5nIGNoYW5nZXMgdG8gYXZvaWQgdGhlIG1vZGVsIHJhaXNlcyBlcnJvcnMgYW5kIHRoZSBvYmplY3QgcGFnZSBpcyBhdCBsZWFzdCBib3VuZFxuXHRcdFx0Ly8gSWRlYWxseSB0aGUgdXNlciBzaG91bGQgYmUgYXNrZWQgZm9yXG5cdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBoYXMgYmVlbiBzZXQgb24gdGhlIHBhZ2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2UodGFyZ2V0UGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbykge1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCh0ZWNobmljYWxQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgodGVjaG5pY2FsUGF0aCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblxuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGVycm9yLm1lc3NhZ2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdG8gcmV0cmlldmUgYSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gYSBzZW1hbnRpYyBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2VtYW50aWNQYXRoIFRoZSBzZW1hbnRpYyBvciB0ZWNobmljYWwgcGF0aFxuXHQgKiBAcGFyYW0gc2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBvciB0ZWNobmljYWwga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGFtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Y3JlYXRlRmlsdGVyRnJvbVBhdGgoc2VtYW50aWNQYXRoOiBzdHJpbmcsIHNlbWFudGljS2V5czogc3RyaW5nW10sIG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBGaWx0ZXIgfCBudWxsIHtcblx0XHRjb25zdCB1bnF1b3RlQW5kRGVjb2RlID0gZnVuY3Rpb24gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdFx0aWYgKHZhbHVlLmluZGV4T2YoXCInXCIpID09PSAwICYmIHZhbHVlLmxhc3RJbmRleE9mKFwiJ1wiKSA9PT0gdmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHQvLyBSZW1vdmUgdGhlIHF1b3RlcyBmcm9tIHRoZSB2YWx1ZSBhbmQgZGVjb2RlIHNwZWNpYWwgY2hhcnNcblx0XHRcdFx0dmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9O1xuXHRcdGNvbnN0IGtleVZhbHVlcyA9IHNlbWFudGljUGF0aC5zdWJzdHJpbmcoc2VtYW50aWNQYXRoLmluZGV4T2YoXCIoXCIpICsgMSwgc2VtYW50aWNQYXRoLmxlbmd0aCAtIDEpLnNwbGl0KFwiLFwiKTtcblxuXHRcdGxldCBmaW5hbEtleXMgPSBzZW1hbnRpY0tleXM7XG5cdFx0bGV0IGZpbmFsS2V5VmFsdWVzID0ga2V5VmFsdWVzO1xuXHRcdC8vIElmIHdlIGhhdmUgdGVjaG5pY2FsIGtleXMsIElzQWN0aXZlRW50aXR5IHdpbGwgYmUgcHJlc2VudC4gV2UgbmVlZCB0byByZW1vdmUgaXQgYXMgd2UncmUgYWxyZWFkeSBhZGRpbmcgdGhlbSBhdCB0aGUgZW5kLlxuXHRcdGlmIChzZW1hbnRpY0tleXMuaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdFx0ZmluYWxLZXlzID0gc2VtYW50aWNLZXlzLmZpbHRlcigoc2luZ2xlS2V5KSA9PiBzaW5nbGVLZXkuaW5kZXhPZihcIklzQWN0aXZlRW50aXR5XCIpIDwgMCk7XG5cdFx0XHRmaW5hbEtleVZhbHVlcyA9IGtleVZhbHVlcy5maWx0ZXIoKGVsZW1lbnQpID0+ICFlbGVtZW50LnN0YXJ0c1dpdGgoXCJJc0FjdGl2ZUVudGl0eVwiKSk7XG5cdFx0fVxuXG5cdFx0aWYgKGZpbmFsS2V5cy5sZW5ndGggIT0gZmluYWxLZXlWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBmaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKG1ldGFNb2RlbCk7XG5cdFx0bGV0IGZpbHRlcnM6IEZpbHRlcltdO1xuXHRcdGlmIChmaW5hbEtleXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgdGVjaG5pY2FsIGtleSwgdGhlIGVxdWFsIGlzIHByZXNlbnQgYmVjYXVzZSB0aGVyZSdzIGF0IGxlYXN0IDIgcGFyYW1ldGVycywgYSB0ZWNobmljYWwga2V5IGFuZCBJc0FjdGl2ZUVudGl0eVxuXHRcdFx0aWYgKGZpbmFsS2V5VmFsdWVzWzBdLmluZGV4T2YoXCI9XCIpID4gMCkge1xuXHRcdFx0XHRjb25zdCBrZXlQYXJ0ID0gZmluYWxLZXlWYWx1ZXNbMF0uc3BsaXQoXCI9XCIpO1xuXHRcdFx0XHRmaW5hbEtleVZhbHVlc1swXSA9IGtleVBhcnRbMV07XG5cdFx0XHR9XG5cdFx0XHQvLyBUYWtlIHRoZSBmaXJzdCBrZXkgdmFsdWVcblx0XHRcdGNvbnN0IGtleVZhbHVlID0gdW5xdW90ZUFuZERlY29kZShmaW5hbEtleVZhbHVlc1swXSk7XG5cdFx0XHRmaWx0ZXJzID0gW1xuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRwYXRoOiBmaW5hbEtleXNbMF0sXG5cdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdHZhbHVlMToga2V5VmFsdWUsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbUtleVZhbHVlczogYW55ID0ge307XG5cdFx0XHQvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGtleSB2YWx1ZXNcblx0XHRcdGZpbmFsS2V5VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXlBc3NpZ25tZW50OiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gc0tleUFzc2lnbm1lbnQuc3BsaXQoXCI9XCIpLFxuXHRcdFx0XHRcdGtleVZhbHVlID0gdW5xdW90ZUFuZERlY29kZShhUGFydHNbMV0pO1xuXG5cdFx0XHRcdG1LZXlWYWx1ZXNbYVBhcnRzWzBdXSA9IGtleVZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGxldCBmYWlsZWQgPSBmYWxzZTtcblx0XHRcdGZpbHRlcnMgPSBmaW5hbEtleXMubWFwKGZ1bmN0aW9uIChzZW1hbnRpY0tleSkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBzZW1hbnRpY0tleSxcblx0XHRcdFx0XHR2YWx1ZSA9IG1LZXlWYWx1ZXNba2V5XTtcblxuXHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IGtleSxcblx0XHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHRcdHZhbHVlMTogdmFsdWUsXG5cdFx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBmaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmFpbGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIlhYXCJcblx0XHRcdFx0XHR9KTsgLy8gd2lsbCBiZSBpZ25vcmVkIGFueXdheSBzaW5jZSB3ZSByZXR1cm4gYWZ0ZXJcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChmYWlsZWQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGEgZHJhZnQgZmlsdGVyIHRvIG1ha2Ugc3VyZSB3ZSB0YWtlIHRoZSBkcmFmdCBlbnRpdHkgaWYgdGhlcmUgaXMgb25lXG5cdFx0Ly8gT3IgdGhlIGFjdGl2ZSBlbnRpdHkgb3RoZXJ3aXNlXG5cdFx0Y29uc3QgZHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHRcdGZpbHRlcnMucHVzaChkcmFmdEZpbHRlcik7XG5cblx0XHRyZXR1cm4gbmV3IEZpbHRlcihmaWx0ZXJzLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIHRvIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aFdpdGhQYXJhbWV0ZXJzIFRoZSBwYXRoIHdpdGggc2VtYW50aWMga2V5c1xuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0ga2V5cyBUaGUgc2VtYW50aWMgb3IgdGVjaG5pY2FsIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBjb250YWluaW5nIHRoZSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMgaWYgcGF0aFdpdGhQYXJhbWV0ZXJzIGNvdWxkIGJlIGludGVycHJldGVkIGFzIGEgdGVjaG5pY2FsIHBhdGgsIG51bGwgb3RoZXJ3aXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgZ2V0VGVjaG5pY2FsUGF0aEZyb21QYXRoKHBhdGhXaXRoUGFyYW1ldGVyczogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwga2V5czogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgZW50aXR5U2V0UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXRoV2l0aFBhcmFtZXRlcnMpLmdldFBhdGgoKTtcblxuXHRcdGlmICgha2V5cyB8fCBrZXlzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc2VtYW50aWMvdGVjaG5pY2FsIGtleXNcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHNldCBvZiBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIGtleXNcblx0XHRjb25zdCBmaWx0ZXIgPSB0aGlzLmNyZWF0ZUZpbHRlckZyb21QYXRoKHBhdGhXaXRoUGFyYW1ldGVycywga2V5cywgbWV0YU1vZGVsKTtcblx0XHRpZiAoZmlsdGVyID09PSBudWxsKSB7XG5cdFx0XHQvLyBDb3VsZG4ndCBpbnRlcnByZXQgdGhlIHBhdGggYXMgYSBzZW1hbnRpYyBvbmVcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdC8vIExvYWQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0XG5cdFx0aWYgKCFlbnRpdHlTZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtlbnRpdHlTZXRQYXRofWA7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QoZW50aXR5U2V0UGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZpbHRlciwge1xuXHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiXG5cdFx0fSk7XG5cblx0XHRjb25zdCBjb250ZXh0cyA9IGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKTtcblx0XHRpZiAoY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dHNbMF0uZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBObyBkYXRhIGNvdWxkIGJlIGxvYWRlZFxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlZnJlc2hlcyBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHBhdGhUb1JlcGxhY2VXaXRoIFRoZSBwYXRoIHRvIHRoZSBuZXcgY29udGV4dFxuXHQgKiBAcGFyYW0gY29udGV4dFRvUmVtb3ZlIFRoZSBpbml0aWFsIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSByZXBsYWNlZFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaENvbnRleHQobW9kZWw6IE9EYXRhTW9kZWwsIHBhdGhUb1JlcGxhY2VXaXRoOiBzdHJpbmcsIGNvbnRleHRUb1JlbW92ZTogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgY29udGV4dFRvUmVwbGFjZVdpdGggPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KHBhdGhUb1JlcGxhY2VXaXRoKTtcblx0XHRcdGNvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChjb250ZXh0VG9SZXBsYWNlV2l0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBwYXRoIGlzIGEgcm9vdCBkcmFmdC5cblx0ICpcblx0ICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBhIHJvb3QgcGF0aFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGNoZWNrRHJhZnRBdmFpbGFiaWxpdHkocGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWF0Y2hlcyA9IC9eWy9dPyhcXHcrKVxcKFteL10rXFwpJC8uZXhlYyhwYXRoKTtcblx0XHRpZiAoIW1hdGNoZXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gR2V0IHRoZSBlbnRpdHlTZXQgbmFtZVxuXHRcdGNvbnN0IGVudGl0eVNldFBhdGggPSBgLyR7bWF0Y2hlc1sxXX1gO1xuXHRcdC8vIENoZWNrIHRoZSBlbnRpdHkgc2V0IHN1cHBvcnRzIGRyYWZ0XG5cdFx0Y29uc3QgZHJhZnRSb290ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtlbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0cmV0dXJuIGRyYWZ0Um9vdCA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBwYXRoIHRvIG5hdmlnYXRlIHRvIGZyb20gYSBwYXRoIHdpdGggU2VtYW50aWNLZXlzIG9yIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aFRvUmVzb2x2ZSBUaGUgcGF0aCB0byBiZSB0cmFuc2Zvcm1lZFxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVyIFRoZSBwYXJhbWV0ZXIgb2YgdGhlIG5hdmlnYXRpb25cblx0ICogQHJldHVybnMgU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgcGF0aFRvUmVzb2x2ZSBjb3VsZG4ndCBiZSBpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHBhdGgsIGl0IGlzIHJldHVybmVkIGFzIGlzLlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIHJlc29sdmVQYXRoKHBhdGhUb1Jlc29sdmU6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXI6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0bGV0IGN1cnJlbnRIYXNoTm9QYXJhbXMgPSB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGlmIChjdXJyZW50SGFzaE5vUGFyYW1zPy5sYXN0SW5kZXhPZihcIi9cIikgPT09IGN1cnJlbnRIYXNoTm9QYXJhbXM/Lmxlbmd0aCAtIDEpIHtcblx0XHRcdC8vIFJlbW92ZSB0cmFpbGluZyAnLydcblx0XHRcdGN1cnJlbnRIYXNoTm9QYXJhbXMgPSBjdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cmluZygwLCBjdXJyZW50SGFzaE5vUGFyYW1zLmxlbmd0aCAtIDEpO1xuXHRcdH1cblxuXHRcdGxldCByb290RW50aXR5TmFtZSA9IGN1cnJlbnRIYXNoTm9QYXJhbXM/LnN1YnN0cigwLCBjdXJyZW50SGFzaE5vUGFyYW1zLmluZGV4T2YoXCIoXCIpKTtcblx0XHRpZiAocm9vdEVudGl0eU5hbWUuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdHJvb3RFbnRpdHlOYW1lID0gcm9vdEVudGl0eU5hbWUuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBpc1Jvb3REcmFmdCA9IHRoaXMuY2hlY2tEcmFmdEF2YWlsYWJpbGl0eShjdXJyZW50SGFzaE5vUGFyYW1zLCBtZXRhTW9kZWwpLFxuXHRcdFx0c2VtYW50aWNLZXlzID0gaXNSb290RHJhZnRcblx0XHRcdFx0PyAoU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG1ldGFNb2RlbCwgcm9vdEVudGl0eU5hbWUpIGFzIHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSlcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0NvbGxhYm9yYXRpb25FbmFibGVkID0gTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKTtcblxuXHRcdC8qKlxuXHRcdCAqIElmIHRoZSBlbnRpdHkgaXMgZHJhZnQgZW5hYmxlZCwgYW5kIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbiwgYW5kIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCwgd2UncmUgdHJlYXRpbmcgaXQgYXMgYSBuZXcgcGF0aC5cblx0XHQgKiBXZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBkcmFmdCBleGlzdHMgZmlyc3QsIHRoZW4gd2UgbmF2aWdhdGUgb24gaXQgaWYgaXQgZG9lcyBleGlzdCwgb3RoZXJ3aXNlIHdlIG5hdmlnYXRlIHRvIHRoZSBzYXZlZCB2ZXJzaW9uLlxuXHRcdCAqL1xuXHRcdGlmIChpc1Jvb3REcmFmdCAmJiBpc0NvbGxhYm9yYXRpb25FbmFibGVkKSB7XG5cdFx0XHRjb25zdCBpc0FjdGl2ZUVudGl0eSA9IG5hdmlnYXRpb25QYXJhbWV0ZXI/LnVzZUNvbnRleHQ/LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPz8gdHJ1ZTtcblx0XHRcdGlmICghaXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVzb2x2ZUNvbGxhYm9yYXRpb25QYXRoKHBhdGhUb1Jlc29sdmUsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyLCBzZW1hbnRpY0tleXMsIHJvb3RFbnRpdHlOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogVGhpcyBpcyB0aGUgJ25vcm1hbCcgcHJvY2Vzcy5cblx0XHQgKiBJZiB3ZSBkb24ndCBoYXZlIHNlbWFudGljIGtleXMsIHRoZSBwYXRoIHdlIGhhdmUgaXMgdGVjaG5pY2FsIGFuZCBjYW4gYmUgdXNlZCBhcyBpcy5cblx0XHQgKiBJZiB0aGUgcGF0aCB0byByZXNvbHZlIGlzIHRoZSBzYW1lIGFzIHRoZSBzZW1hbnRpYyBwYXRoLCB0aGVuIHdlIGtub3cgaXMgaGFzIGJlZW4gcmVzb2x2ZWQgcHJldmlvdXNseSBhbmQgd2UgY2FuIHJldHVybiB0aGUgdGVjaG5pY2FsIHBhdGhcblx0XHQgKiBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIHRlY2huaWNhbCBwYXRoLCB0byBzZXQgdXAgdGhlIHNlbWFudGljIG1hcHBpbmcgKGlmIGl0J3MgYmVlbiByZXNvbHZlZCkuXG5cdFx0ICovXG5cdFx0aWYgKHNlbWFudGljS2V5cyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcGF0aFRvUmVzb2x2ZTtcblx0XHR9XG5cdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCA9PT0gcGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0Ly8gVGhpcyBzZW1hbnRpYyBwYXRoIGhhcyBiZWVuIHJlc29sdmVkIHByZXZpb3VzbHlcblx0XHRcdHJldHVybiBsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IGZvcm1hdHRlZFNlbWFudGljS2V5cyA9IHNlbWFudGljS2V5cy5tYXAoKHNpbmdsZUtleSkgPT4gc2luZ2xlS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXG5cdFx0Ly8gV2UgbmVlZCByZXNvbHZlIHRoZSBzZW1hbnRpYyBwYXRoIHRvIGdldCB0aGUgdGVjaG5pY2FsIGtleXNcblx0XHRjb25zdCB0ZWNobmljYWxQYXRoID0gYXdhaXQgdGhpcy5nZXRUZWNobmljYWxQYXRoRnJvbVBhdGgoY3VycmVudEhhc2hOb1BhcmFtcywgbW9kZWwsIGZvcm1hdHRlZFNlbWFudGljS2V5cyk7XG5cblx0XHRpZiAodGVjaG5pY2FsUGF0aCAmJiB0ZWNobmljYWxQYXRoICE9PSBwYXRoVG9SZXNvbHZlKSB7XG5cdFx0XHQvLyBUaGUgc2VtYW50aWMgcGF0aCB3YXMgcmVzb2x2ZWQgKG90aGVyd2lzZSBrZWVwIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGFyZ2V0KVxuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHR0ZWNobmljYWxQYXRoOiB0ZWNobmljYWxQYXRoLFxuXHRcdFx0XHRzZW1hbnRpY1BhdGg6IHBhdGhUb1Jlc29sdmVcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRlY2huaWNhbFBhdGg7XG5cdFx0fVxuXHRcdHJldHVybiBwYXRoVG9SZXNvbHZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlIHRoZSBwYXRoIHRvIG5hdmlnYXRlIHdoZW4gd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uIGFuZCBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQuXG5cdCAqIElmIHRoZSBkcmFmdCBoYXMgYmVlbiBkaXNjYXJkZWQsIHdlIGNoYW5nZSB0aGUgcGF0aCB0byB0aGUgc2libGluZyBlbGVtZW50IGFzc29jaWF0ZWQsIG90aGVyd2lzZSB3ZSBrZWVwIHRoZSBzYW1lIHBhdGguXG5cdCAqIFdlJ3JlIG5vdCBkb2luZyBpdCBvdXRzaWRlIG9mIGNvbGxhYm9yYXRpb24gYXMgaXQncyBhZGRpbmcgYSByZXF1ZXN0IGR1cmluZyBuYXZpZ2F0aW9uIVxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aFRvUmVzb2x2ZSBUaGUgcGF0aCB3ZSdyZSBjaGVja2luZy4gSWYgdGhlIGRyYWZ0IGV4aXN0cywgd2UgcmV0dXJuIGl0IGFzIGlzLCBvdGhlcndpc2Ugd2UgcmV0dXJuIHRoZSBzaWJsaW5nIGVsZW1lbnQgYXNzb2NpYXRlZFxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIG9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVyIFRoZSBwYXJhbWV0ZXIgb2YgdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBpZiB3ZSBoYXZlIHNlbWFudGljIG5hdmlnYXRpb24sIG90aGVyd2lzZSBmYWxzZVxuXHQgKiBAcGFyYW0gcm9vdEVudGl0eU5hbWUgTmFtZSBvZiB0aGUgcm9vdCBlbnRpdHlcblx0ICogQHJldHVybnMgVGhlIHBhdGggdG8gbmF2aWdhdGUgdG9cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIHJlc29sdmVDb2xsYWJvcmF0aW9uUGF0aChcblx0XHRwYXRoVG9SZXNvbHZlOiBzdHJpbmcsXG5cdFx0bW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcjogUm91dGluZ05hdmlnYXRpb25JbmZvLFxuXHRcdHNlbWFudGljS2V5czogeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkLFxuXHRcdHJvb3RFbnRpdHlOYW1lOiBzdHJpbmdcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBjdXJyZW50SGFzaE5vUGFyYW1zID0gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKS5zcGxpdChcIj9cIilbMF07XG5cdFx0bGV0IGZvcm1hdHRlZEtleXM6IHN0cmluZ1tdO1xuXHRcdGNvbnN0IGNvbXBhcmF0aXZlUGF0aCA9IGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPz8gcGF0aFRvUmVzb2x2ZTtcblx0XHRpZiAoc2VtYW50aWNLZXlzKSB7XG5cdFx0XHRmb3JtYXR0ZWRLZXlzID0gc2VtYW50aWNLZXlzLm1hcCgoc2luZ2xlS2V5KSA9PiBzaW5nbGVLZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvcm1hdHRlZEtleXMgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtyb290RW50aXR5TmFtZX0vJFR5cGUvJEtleWApO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRlY2huaWNhbFBhdGggPSBhd2FpdCB0aGlzLmdldFRlY2huaWNhbFBhdGhGcm9tUGF0aChjdXJyZW50SGFzaE5vUGFyYW1zLCBtb2RlbCwgZm9ybWF0dGVkS2V5cyk7XG5cdFx0aWYgKHRlY2huaWNhbFBhdGggPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBwYXRoVG9SZXNvbHZlO1xuXHRcdH1cblx0XHQvLyBDb21wYXJpbmcgcGF0aCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgb25lIHdlIGhhdmUuIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgaXQgbWVhbnMgdGhlIGRyYWZ0IGRvZXNuJ3QgZXhpc3QuXG5cdFx0aWYgKHRlY2huaWNhbFBhdGggIT09IGNvbXBhcmF0aXZlUGF0aCAmJiBuYXZpZ2F0aW9uUGFyYW1ldGVyLnVzZUNvbnRleHQpIHtcblx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nKSB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHtcblx0XHRcdFx0XHR0ZWNobmljYWxQYXRoOiB0ZWNobmljYWxQYXRoLFxuXHRcdFx0XHRcdHNlbWFudGljUGF0aDogcGF0aFRvUmVzb2x2ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXIucmVkaXJlY3RlZFRvTm9uRHJhZnQgPVxuXHRcdFx0XHRtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtyb290RW50aXR5TmFtZX0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm9gKT8uVHlwZU5hbWUgPz8gcm9vdEVudGl0eU5hbWU7XG5cdFx0XHRhd2FpdCB0aGlzLnJlZnJlc2hDb250ZXh0KG1vZGVsLCB0ZWNobmljYWxQYXRoLCBuYXZpZ2F0aW9uUGFyYW1ldGVyLnVzZUNvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGVjaG5pY2FsUGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dC4gTmVlZHMgdG8gY29udGFpbiB0ZWNobmljYWwga2V5cyBvbmx5LlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKSB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpIHtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGxldCBzaG91bGRSZWZyZXNoQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0QWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKSB8fFxuXHRcdFx0XHRcdFx0KE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBvVXNlQ29udGV4dC5nZXRQYXRoKCkpICYmXG5cdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGJ1dCB3ZSdyZSBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0LCB3ZSBmb3JjZSB0aGUgcmVmcmVzaCAoZGlzY2FyZGluZyBwZW5kaW5nIGNoYW5nZXMpIGFzIHdlIG5lZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24uXG5cdFx0XHRcdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgZnJvbSBMUiB0byBPUCwgdGhlIHZpZXcgaXMgbm90IGNvbm5lY3RlZCB5ZXQgLS0+IGNoZWNrIGlmIHdlJ3JlIGluIGRyYWZ0IHdpdGggY29sbGFib3JhdGlvbiBmcm9tIHRoZSBtZXRhbW9kZWxcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1VzZUNvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKHNob3VsZFJlZnJlc2hDb250ZXh0KSB7XG5cdFx0XHRcdFx0b1VzZUNvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb250ZXh0IGZvciBpdHMgcGF0aFxuXHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQodGhpcy5fY3JlYXRlQ29udGV4dChzVGFyZ2V0UGF0aCwgb01vZGVsKSwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5BcHBTdGF0ZUNoYW5nZWQgJiYgRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0dGhpcy5fcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9DdXJyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJpbmRzIHRoZSBwYWdlIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgYm91bmRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKSB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9QYXJlbnRMaXN0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0aWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgIW9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgcGFyZW50QmluZGluZyBpcyBub3QgYSBsaXN0QmluZGluZywgd2UgY3JlYXRlIGEgbmV3IGNvbnRleHRcblx0XHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcob0NvbnRleHQsIHtcblx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0bGlzdEJpbmRpbmc6IG9QYXJlbnRMaXN0QmluZGluZyxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhvQ29udGV4dCwgeyByZWRpcmVjdGVkVG9Ob25EcmFmdDogb05hdmlnYXRpb25QYXJhbWV0ZXJzPy5yZWRpcmVjdGVkVG9Ob25EcmFmdCB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgY29udGV4dCBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoIFRoZSBwYXRoXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY3JlYXRlQ29udGV4dChzUGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIsXG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiLFxuXHRcdFx0XHQkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlXG5cdFx0XHR9O1xuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbCwgc1BhdGgsIGZhbHNlLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBrZWVwQWxpdmUgY29udGV4dCAke3NQYXRofWApO1xuXHRcdFx0fSBlbHNlIGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRcdFx0XHRpZiAob0RyYWZ0Um9vdCkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRyYWZ0IGFuZCBlZGl0IHdlIG5lZWQgdG8gZW5zdXJlIHRob3NlIHByb3BlcnRpZXMgYXJlIHJlcXVlc3RlZCBhZ2FpbiBldmVuIGlmIHRoZXkgYXJlIGluIHRoZSBiaW5kaW5nJ3MgY2FjaGVcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2hlbiB5b3UgZWRpdCBhbmQgZ28gdG8gdGhlIHNhdmVkIHZlcnNpb24geW91IGhhdmUgbm8gd2F5IG9mIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBlZGl0IHZlcnNpb25cblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRvRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdD8gW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdXG5cdFx0XHRcdFx0XHRcdDogW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoc0VudGl0eVNldCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBhbnkpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdG9QcmV2aW91c0JpbmRpbmdcblx0XHRcdFx0XHQ/LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXNldGluZyB0aGUgY2hhbmdlcyB0byB0aGUgYmluZGluZ1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSk7XG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgdGhpcy5vbkRhdGFSZWNlaXZlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgb25EYXRhUmVjZWl2ZWQob0V2ZW50OiBFdmVudCkge1xuXHRcdGNvbnN0IHNFcnJvckRlc2NyaXB0aW9uID0gb0V2ZW50ICYmIG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJlcnJvclwiKTtcblx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLl9vVmlldykpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24pIHtcblx0XHRcdC8vIFRPRE86IGluIGNhc2Ugb2YgNDA0IHRoZSB0ZXh0IHNoYWxsIGJlIGRpZmZlcmVudFxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gYXdhaXQgQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0XHRcdGxldCBtUGFyYW1zID0ge307XG5cdFx0XHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbi5zdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRpc0luaXRpYWxMb2FkNTAzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUl9ERVNDUklQVElPTlwiKSxcblx0XHRcdFx0XHRcdGlzRGF0YVJlY2VpdmVkRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzRXJyb3JEZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdGlzRGF0YVJlY2VpdmVkRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyhtUGFyYW1zKTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICpcblx0ICogQHBhcmFtIG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDtcblx0XHRjb25zdCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVByb3BlcnR5UGF0aHM6IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBbXVxuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmc6IGFueSkge1xuXHRcdFx0bGV0IGFEZXBlbmRlbnRCaW5kaW5ncztcblx0XHRcdGNvbnN0IHNSZWxhdGl2ZVBhdGggPSAoKG9CaW5kaW5nLmdldENvbnRleHQoKSAmJiBvQmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKSB8fCBcIlwiKS5yZXBsYWNlKHNSb290Q29udGV4dFBhdGgsIFwiXCIpOyAvLyBJZiBubyBjb250ZXh0LCB0aGlzIGlzIGFuIGFic29sdXRlIGJpbmRpbmcgc28gbm8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0Y29uc3Qgc1BhdGggPSAoc1JlbGF0aXZlUGF0aCA/IGAke3NSZWxhdGl2ZVBhdGguc2xpY2UoMSl9L2AgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdQYXRocyhhRGVwZW5kZW50QmluZGluZ3NbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYVByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHR9XG5cdFx0Ly9hbGwgdGhpcyBsb2dpYyB0byBiZSByZXBsYWNlZCB3aXRoIGEgU2lkZUVmZmVjdHMgcmVxdWVzdCBmb3IgYW4gZW1wdHkgcGF0aCAocmVmcmVzaCBldmVyeXRoaW5nKSwgYWZ0ZXIgdGVzdGluZyB0cmFuc2llbnQgY29udGV4dHNcblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0czogc3RyaW5nW10sIHRhcmdldFByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAodGFyZ2V0UHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB0YXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0dGFyZ2V0cy5wdXNoKGluZGV4ID4gMCA/IHRhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KSA6IHRhcmdldFByb3BlcnR5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YXJnZXRzO1xuXHRcdH0sIFtdKTtcblx0XHQvLyBPRGF0YSBtb2RlbCB3aWxsIHRha2UgY2FyZSBvZiBkdXBsaWNhdGVzXG5cdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoWy4uLm9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcywgLi4ub1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXNdLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogYW55KSB7XG5cdFx0bGV0IG9QcmV2aW91c0NvbnRleHQsIG9UYXJnZXRDb250cm9sO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0Py5pc0tlZXBBbGl2ZSgpICYmIG9QcmV2aW91c0NvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRGQ0xMZXZlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLkZDTExldmVsO1xuXHR9XG5cblx0X3NldEtlZXBBbGl2ZShvQ29udGV4dDogQ29udGV4dCwgYktlZXBBbGl2ZTogYm9vbGVhbiwgZm5CZWZvcmVEZXN0cm95PzogRnVuY3Rpb24sIGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuKSB7XG5cdFx0aWYgKG9Db250ZXh0LmdldFBhdGgoKS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdC8vIFdlIGtlZXAgdGhlIGNvbnRleHQgYWxpdmUgb25seSBpZiB0aGV5J3JlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCBpLmUuIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCBhICcpJ1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoYktlZXBBbGl2ZSwgZm5CZWZvcmVEZXN0cm95LCAhIXNNZXNzYWdlc1BhdGggJiYgYlJlcXVlc3RNZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsOiBPRGF0YU1vZGVsLCBwYXRoOiBzdHJpbmcsIGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuLCBwYXJhbWV0ZXJzPzogYW55KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gR2V0IHRoZSBwYXRoIGZvciB0aGUgY29udGV4dCB0aGF0IGlzIHJlYWxseSBrZXB0IGFsaXZlIChwYXJ0IG9mIGEgY29sbGVjdGlvbilcblx0XHQvLyBpLmUuIHJlbW92ZSBhbGwgc2VnbWVudHMgbm90IGVuZGluZyB3aXRoIGEgJyknXG5cdFx0Y29uc3Qga2VwdEFsaXZlU2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBhZGRpdGlvbm5hbFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHdoaWxlIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggJiYgIWtlcHRBbGl2ZVNlZ21lbnRzW2tlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5wdXNoKGtlcHRBbGl2ZVNlZ21lbnRzLnBvcCgpISk7XG5cdFx0fVxuXG5cdFx0aWYgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBrZXB0QWxpdmVQYXRoID0ga2VwdEFsaXZlU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0Y29uc3Qgb0tlZXBBbGl2ZUNvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChrZXB0QWxpdmVQYXRoLCBiUmVxdWVzdE1lc3NhZ2VzLCBwYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChhZGRpdGlvbm5hbFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG9LZWVwQWxpdmVDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnJldmVyc2UoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9ubmFsUGF0aCA9IGFkZGl0aW9ubmFsU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0XHRyZXR1cm4gb01vZGVsLmJpbmRDb250ZXh0KGFkZGl0aW9ubmFsUGF0aCwgb0tlZXBBbGl2ZUNvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN3aXRjaEZ1bGxTY3JlZW4oKSB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ZDTEhlbHBlck1vZGVsID0gb1NvdXJjZS5nZXRNb2RlbChcImZjbGhlbHBlclwiKSxcblx0XHRcdGJJc0Z1bGxTY3JlZW4gPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vaXNGdWxsU2NyZWVuXCIpLFxuXHRcdFx0c05leHRMYXlvdXQgPSBvRkNMSGVscGVyTW9kZWwuZ2V0UHJvcGVydHkoXG5cdFx0XHRcdGJJc0Z1bGxTY3JlZW4gPyBcIi9hY3Rpb25CdXR0b25zSW5mby9leGl0RnVsbFNjcmVlblwiIDogXCIvYWN0aW9uQnV0dG9uc0luZm8vZnVsbFNjcmVlblwiXG5cdFx0XHQpLFxuXHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cblx0XHRjb25zdCBvQ29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0dGhpcy5iYXNlLl9yb3V0aW5nLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7IHNMYXlvdXQ6IHNOZXh0TGF5b3V0IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiY2Fubm90IHN3aXRjaCBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbHNjcmVlblwiKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIGNvbHVtbiBmb3IgdGhlIGN1cnJlbnQgdmlldyBpbiBhIEZDTC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQmVmb3JlKVxuXHRjbG9zZUNvbHVtbigpIHtcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBuYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0XHRcdG5vUHJlc2VydmF0aW9uQ2FjaGU6IHRydWUsXG5cdFx0XHRzTGF5b3V0OiB0aGlzLl9vVmlldy5nZXRNb2RlbChcImZjbGhlbHBlclwiKS5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9jbG9zZUNvbHVtblwiKVxuXHRcdH07XG5cblx0XHRpZiAob1ZpZXdEYXRhPy52aWV3TGV2ZWwgPT09IDEgJiYgTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvTWV0YU1vZGVsLCBvQ29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0RnVuY3Rpb24ucHJvdG90eXBlLFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5fb1ZpZXcuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJuYWxSb3V0aW5nO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7O0VBK0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQSxJQVNNQSxlQUFlLFdBRHBCQyxjQUFjLENBQUMsa0RBQWtELENBQUMsVUFvQmpFQyxjQUFjLEVBQUUsVUFPaEJBLGNBQWMsRUFBRSxVQW9DaEJDLGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBS25DSCxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxVQUtuQ0gsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FRbkNILGVBQWUsRUFBRSxXQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBc0JuQ0gsZUFBZSxFQUFFLFdBeUJqQkEsZUFBZSxFQUFFLFdBYWpCQSxlQUFlLEVBQUUsV0FDakJJLGNBQWMsRUFBRSxXQTZEaEJKLGVBQWUsRUFBRSxXQUNqQkksY0FBYyxFQUFFLFdBZ0JoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FjaEJKLGVBQWUsRUFBRSxX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
|