@sapui5/sap.fe.core 1.141.2 → 1.142.1
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 +4 -1
- package/src/sap/fe/core/ActionRuntime.js +48 -23
- package/src/sap/fe/core/ActionRuntime.ts +61 -35
- package/src/sap/fe/core/AppComponent.js +76 -6
- package/src/sap/fe/core/AppComponent.ts +94 -8
- package/src/sap/fe/core/AppStateHandler.js +9 -8
- package/src/sap/fe/core/AppStateHandler.ts +13 -9
- package/src/sap/fe/core/BaseController.js +8 -5
- package/src/sap/fe/core/BaseController.ts +6 -1
- package/src/sap/fe/core/CommonUtils.js +4 -123
- package/src/sap/fe/core/CommonUtils.ts +3 -172
- package/src/sap/fe/core/ExtensionAPI.js +3 -10
- package/src/sap/fe/core/ExtensionAPI.ts +2 -14
- package/src/sap/fe/core/PageController.js +64 -43
- package/src/sap/fe/core/PageController.ts +62 -47
- package/src/sap/fe/core/TemplateComponent.js +20 -1
- package/src/sap/fe/core/TemplateComponent.ts +24 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
- package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
- package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
- package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
- package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
- package/src/sap/fe/core/controllerextensions/Share.js +5 -5
- package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
- package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
- package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
- package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
- package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
- package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
- package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
- package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
- package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
- package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
- package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
- package/src/sap/fe/core/converters/helpers/ID.js +3 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
- package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
- package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
- package/src/sap/fe/core/fpm/Component.js +8 -1
- package/src/sap/fe/core/fpm/Component.ts +8 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
- package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
- package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
- package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
- package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
- package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
- package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
- package/src/sap/fe/core/helpers/WebSocket.js +6 -7
- package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
- package/src/sap/fe/core/library.js +30 -3
- package/src/sap/fe/core/library.ts +28 -1
- package/src/sap/fe/core/messagebundle.properties +8 -1
- package/src/sap/fe/core/messagebundle_ar.properties +7 -0
- package/src/sap/fe/core/messagebundle_bg.properties +10 -3
- package/src/sap/fe/core/messagebundle_ca.properties +7 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
- package/src/sap/fe/core/messagebundle_cs.properties +7 -0
- package/src/sap/fe/core/messagebundle_cy.properties +8 -1
- package/src/sap/fe/core/messagebundle_da.properties +7 -0
- package/src/sap/fe/core/messagebundle_de.properties +7 -0
- package/src/sap/fe/core/messagebundle_el.properties +7 -0
- package/src/sap/fe/core/messagebundle_en.properties +8 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
- package/src/sap/fe/core/messagebundle_es.properties +8 -1
- package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
- package/src/sap/fe/core/messagebundle_et.properties +7 -0
- package/src/sap/fe/core/messagebundle_fi.properties +7 -0
- package/src/sap/fe/core/messagebundle_fr.properties +16 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
- package/src/sap/fe/core/messagebundle_hi.properties +8 -1
- package/src/sap/fe/core/messagebundle_hr.properties +7 -0
- package/src/sap/fe/core/messagebundle_hu.properties +7 -0
- package/src/sap/fe/core/messagebundle_id.properties +7 -0
- package/src/sap/fe/core/messagebundle_it.properties +7 -0
- package/src/sap/fe/core/messagebundle_iw.properties +7 -0
- package/src/sap/fe/core/messagebundle_ja.properties +8 -1
- package/src/sap/fe/core/messagebundle_kk.properties +7 -0
- package/src/sap/fe/core/messagebundle_ko.properties +7 -0
- package/src/sap/fe/core/messagebundle_lt.properties +7 -0
- package/src/sap/fe/core/messagebundle_lv.properties +7 -0
- package/src/sap/fe/core/messagebundle_mk.properties +7 -0
- package/src/sap/fe/core/messagebundle_ms.properties +7 -0
- package/src/sap/fe/core/messagebundle_nl.properties +7 -0
- package/src/sap/fe/core/messagebundle_no.properties +7 -0
- package/src/sap/fe/core/messagebundle_pl.properties +7 -0
- package/src/sap/fe/core/messagebundle_pt.properties +7 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
- package/src/sap/fe/core/messagebundle_ro.properties +7 -0
- package/src/sap/fe/core/messagebundle_ru.properties +7 -0
- package/src/sap/fe/core/messagebundle_sh.properties +7 -0
- package/src/sap/fe/core/messagebundle_sk.properties +7 -0
- package/src/sap/fe/core/messagebundle_sl.properties +7 -0
- package/src/sap/fe/core/messagebundle_sr.properties +7 -0
- package/src/sap/fe/core/messagebundle_sv.properties +7 -0
- package/src/sap/fe/core/messagebundle_th.properties +7 -0
- package/src/sap/fe/core/messagebundle_tr.properties +7 -0
- package/src/sap/fe/core/messagebundle_uk.properties +7 -0
- package/src/sap/fe/core/messagebundle_vi.properties +7 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
- package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
- package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
- package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
- package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
- package/src/sap/fe/core/templating/UIFormatters.js +17 -2
- package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
- package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
- package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
- package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
- package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
- package/ui5.yaml +2 -0
|
@@ -131,7 +131,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-ru
|
|
|
131
131
|
const getRootPath = function (sPath, model) {
|
|
132
132
|
let firstIteration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
133
133
|
const sIterationPath = firstIteration ? sPath : new RegExp(/.*(?=\/)/).exec(sPath)?.[0]; // *Regex to get the ancestor
|
|
134
|
-
if (sIterationPath && sIterationPath !== "/") {
|
|
134
|
+
if (oMetaModel && sIterationPath && sIterationPath !== "/") {
|
|
135
135
|
const sEntityPath = oMetaModel.getMetaPath(sIterationPath);
|
|
136
136
|
const mDataModel = MetaModelConverter.getInvolvedDataModelObjects(oMetaModel.getContext(sEntityPath));
|
|
137
137
|
if (mDataModel.startingEntitySet === mDataModel.targetEntitySet && mDataModel.targetEntitySet?.annotations?.Session?.StickySessionSupported) {
|
|
@@ -219,6 +219,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-ru
|
|
|
219
219
|
*/
|
|
220
220
|
|
|
221
221
|
enhanceInternalJSONModel: function (oInternalModel) {
|
|
222
|
+
const fnSetProperty = oInternalModel.setProperty.bind(oInternalModel);
|
|
223
|
+
oInternalModel.setProperty = function (propertyPath, value, oContext, bAsyncUpdate) {
|
|
224
|
+
if (oContext && oContext.getObject() === undefined) {
|
|
225
|
+
// initialize
|
|
226
|
+
fnSetProperty(oContext.getPath(), {});
|
|
227
|
+
}
|
|
228
|
+
const propertyPathSplit = propertyPath.split("/");
|
|
229
|
+
let path = oContext?.getPath().replace(/\/$/, "") ?? ""; // Remove slash if it is at the end
|
|
230
|
+
// let's ensure that sub objects are initialized
|
|
231
|
+
const startIndex = propertyPath.startsWith("/") ? 1 : 0;
|
|
232
|
+
for (let i = startIndex; i < propertyPathSplit.length - 1; i++) {
|
|
233
|
+
path = `${path}/${propertyPathSplit[i]}`;
|
|
234
|
+
if (this.getProperty(path, oContext) === undefined) {
|
|
235
|
+
// initialize
|
|
236
|
+
fnSetProperty(path, {});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return fnSetProperty(propertyPath, value, oContext, bAsyncUpdate);
|
|
240
|
+
};
|
|
222
241
|
const fnBindContext = oInternalModel.bindContext;
|
|
223
242
|
oInternalModel.bindContext = function (sPath, context, mParameters, oEvents) {
|
|
224
243
|
const contextBinding = fnBindContext.apply(this, [sPath, context, mParameters, oEvents]);
|
|
@@ -478,7 +497,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-ru
|
|
|
478
497
|
const baseGetProperty = localAnnotationModel.getProperty;
|
|
479
498
|
localAnnotationModel.getProperty = function (path, context) {
|
|
480
499
|
const [propertyName, annotationType] = path.split("@$ui5.fe.");
|
|
481
|
-
if (context && context.isTransient() !== true && annotationType === "@Common/ExternalID") {
|
|
500
|
+
if (context && context.isTransient() !== true && (context.getIndex() === undefined || context.getIndex() >= 0) && annotationType === "@Common/ExternalID") {
|
|
482
501
|
const contextObject = context.getObject();
|
|
483
502
|
if (contextObject) {
|
|
484
503
|
const metaPath = new MetaPath(convertTypes(odataModel.getMetaModel()), odataModel.getMetaModel().getMetaPath(context.getPath()), odataModel.getMetaModel().getMetaPath(context.getPath()));
|
|
@@ -514,11 +533,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-ru
|
|
|
514
533
|
const externalIdPropPath = externalIdProperty.path;
|
|
515
534
|
const propertiesToRequest = [externalIdPropPath.substring(0, externalIdPropPath.lastIndexOf("/"))];
|
|
516
535
|
const textProperty = metaPath.getMetaPathForPath(metaPath.getPath() + "/" + externalIdPropPath)?.getTarget().annotations.Common?.Text;
|
|
536
|
+
if (value === null) {
|
|
537
|
+
context.setProperty(externalIdPropPath, {});
|
|
538
|
+
}
|
|
517
539
|
if (isPathAnnotationExpression(textProperty)) {
|
|
518
540
|
const textPropPath = textProperty.path;
|
|
519
541
|
if (textPropPath.includes("/")) {
|
|
520
542
|
propertiesToRequest.push(textPropPath);
|
|
521
543
|
}
|
|
544
|
+
if (value === null) {
|
|
545
|
+
context.setProperty(textPropPath, {});
|
|
546
|
+
}
|
|
522
547
|
}
|
|
523
548
|
context.requestSideEffects(propertiesToRequest).then(_refreshLocalModel).catch(err => {
|
|
524
549
|
Log.error(err);
|
|
@@ -852,13 +877,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-ru
|
|
|
852
877
|
const placeholderValueKey = localModelPath + "@$ui5.fe.recommendations.placeholderValue";
|
|
853
878
|
const placeholderDescriptionKey = localModelPath + "@$ui5.fe.recommendations.placeholderDescription";
|
|
854
879
|
const typeAheadValuesKey = localModelPath + "@$ui5.fe.recommendations.typeAheadValues";
|
|
855
|
-
recommendationObj[typeAheadValuesKey] = [];
|
|
856
880
|
for (const propertyRecommendation of propertyRecommendations) {
|
|
857
881
|
if (propertyRecommendation.RecommendedFieldIsSuggestion) {
|
|
858
882
|
recommendationObj[placeholderValueKey] = propertyRecommendation.RecommendedFieldValue;
|
|
859
883
|
recommendationObj[placeholderDescriptionKey] = propertyRecommendation.RecommendedFieldDescription;
|
|
860
884
|
}
|
|
861
885
|
if (propertyRecommendation.RecommendedFieldValue) {
|
|
886
|
+
recommendationObj[typeAheadValuesKey] = recommendationObj[typeAheadValuesKey] || [];
|
|
862
887
|
recommendationObj[typeAheadValuesKey].push(propertyRecommendation.RecommendedFieldValue);
|
|
863
888
|
}
|
|
864
889
|
}
|
|
@@ -869,11 +894,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-ru
|
|
|
869
894
|
}
|
|
870
895
|
recommendationObj["recommendationContext"] = currentContext;
|
|
871
896
|
if (!this._compareRecommendations(recommendationObj, rejectedRecommendations[currentContext.getPath()] || {})) {
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
}
|
|
897
|
+
// Get existing data from the local annotation model for the current context path
|
|
898
|
+
const existingData = localAnnotationModel.getProperty(currentContext.getPath()) || {};
|
|
899
|
+
|
|
900
|
+
// Remove all keys that include "@$ui5.fe.recommendations" from existing data
|
|
901
|
+
const cleanedExistingData = {};
|
|
902
|
+
for (const key in existingData) {
|
|
903
|
+
if (!key.includes("@$ui5.fe.recommendations")) {
|
|
904
|
+
cleanedExistingData[key] = existingData[key];
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// Merge cleaned existing data with new recommendation data
|
|
909
|
+
const mergedData = {
|
|
910
|
+
...cleanedExistingData,
|
|
911
|
+
...recommendationObj
|
|
912
|
+
};
|
|
913
|
+
|
|
914
|
+
// make sure to set the recommendations on the current context path so that old recommendations are overridden and some stale data is not shown.
|
|
915
|
+
localAnnotationModel.setProperty(currentContext.getPath(), mergedData, currentContext, false);
|
|
877
916
|
}
|
|
878
917
|
}
|
|
879
918
|
},
|
|
@@ -931,4 +970,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/fe/base/jsx-ru
|
|
|
931
970
|
};
|
|
932
971
|
return ModelHelper;
|
|
933
972
|
}, false);
|
|
934
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJoYXNJc0FjdGl2ZUVudGl0eUtleSIsInRhcmdldEVudGl0eVR5cGUiLCJrZXlzIiwic29tZSIsImtleSIsIm5hbWUiLCJpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQiLCJnZXRDbG9zZXN0RW50aXR5U2V0IiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dCIsImNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZWRUeXBlcyIsImVudGl0eVNldHMiLCJlbnRpdHlTZXQiLCJTaGFyZUFjdGlvbiIsInVuZGVmaW5lZCIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwibWV0YU9iamVjdCIsInRlbXBsYXRlSW50ZXJmYWNlIiwib01ldGFNb2RlbCIsImNvbnRleHQiLCJnZXRNb2RlbCIsIl9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkIiwib0VudGl0eUNvbnRhaW5lciIsInNFbnRpdHlTZXQiLCJnZXREcmFmdFJvb3RQYXRoIiwib0NvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRSb290UGF0aCIsInNQYXRoIiwibW9kZWwiLCJmaXJzdEl0ZXJhdGlvbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNJdGVyYXRpb25QYXRoIiwiUmVnRXhwIiwiZXhlYyIsInNFbnRpdHlQYXRoIiwiZ2V0TWV0YVBhdGgiLCJtRGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0Q29udGV4dCIsImdldFBhdGgiLCJnZXRTdGlja3lSb290UGF0aCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZ2V0VGFyZ2V0RW50aXR5U2V0Iiwic0VudGl0eVNldFBhdGgiLCJnZXRFbnRpdHlTZXRQYXRoIiwib2RhdGFNZXRhTW9kZWwiLCJlbnRpdHlTZXRQYXRoIiwic3BsaXQiLCJmaWx0ZXIiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImpvaW4iLCJwYXRoUGFydHMiLCJpbml0aWFsUGF0aE9iamVjdCIsImdyb3dpbmdQYXRoIiwicGVuZGluZ05hdlByb3BCaW5kaW5nIiwicGF0aE9iamVjdCIsInJlZHVjZSIsInBhdGhVbmRlckNvbnN0cnVjdGlvbiIsInBhdGhQYXJ0IiwiaWR4IiwiZGVsaW1pdGVyIiwidGVtcFBhdGgiLCJuYXZQcm9wQmluZGluZ3MiLCJuYXZQcm9wQmluZGluZ1RvQ2hlY2siLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsInJlcGxhY2UiLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5CaW5kQ29udGV4dCIsImJpbmRDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvRXZlbnRzIiwiY29udGV4dEJpbmRpbmciLCJhcHBseSIsImZuR2V0Qm91bmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwib0JvdW5kQ29udGV4dCIsInNldFByb3BlcnR5IiwicHJvcGVydHlQYXRoIiwidmFsdWUiLCJwcm9wZXJ0eVBhdGhTcGxpdCIsImkiLCJnZXRQcm9wZXJ0eSIsImVuaGFuY2VVaUpTT05Nb2RlbCIsInVpTW9kZWwiLCJsaWJyYXJ5IiwiZm5TZXRQcm9wZXJ0eSIsImFzeW5jVXBkYXRlIiwiRWRpdE1vZGUiLCJFZGl0YWJsZSIsIkRpc3BsYXkiLCJlbmhhbmNlVmlld0pTT05Nb2RlbCIsInZpZXdNb2RlbCIsImZuR2V0T2JqZWN0IiwiX2dldE9iamVjdCIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImZpbHRlckZ1bmN0aW9ucyIsIl9maWx0ZXJGdW5jdGlvbnMiLCJpbmRleE9mIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwib01vZGVsIiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJjb250ZXh0UGF0aCIsInJvb3RFbnRpdHlTZXRQYXRoIiwiYVBhdGhzIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwib1ZpZXciLCJ2TGlzdEJpbmRpbmciLCJzTWV0YVBhdGgiLCJzdGFydHNXaXRoIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzUm9vdENvbnRleHRQYXRoIiwib0JpbmRpbmciLCJvUm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInNSb290QmluZGluZ1BhdGgiLCJzUmVsYXRpdmVQYXRoIiwiZ2V0UmVsYXRpdmVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwicGFyZW50Q29udGV4dCIsImxpc3RCaW5kaW5nIiwibGlzdEJpbmRpbmdDb250ZXh0IiwicGFyZW50Q29udGV4dFBhdGgiLCJ2aWV3QmluZGluZ01ldGFQYXRoIiwiZ2V0RHJhZnRSb290IiwiZ2V0RHJhZnROb2RlIiwiaXNTdGlja3kiLCJnZXRTdGlja3lTZXNzaW9uIiwiaXNVcGRhdGVIaWRkZW4iLCJlbnRpdHlUeXBlIiwiaXNFbnRpdHlTZXQiLCJVSSIsIlVwZGF0ZUhpZGRlbiIsImdldERlbGV0ZUhpZGRlbiIsIkRlbGV0ZUhpZGRlbiIsImdldEFic29sdXRlUGF0aEZyb21MaXN0QmluZGluZyIsIm1ldGFtb2RlbCIsIm1ldGFQYXRoIiwicm9vdEJpbmRpbmciLCJyb290QmluZGluZ1BhdGgiLCJyZWxhdGl2ZVBhdGgiLCJlbmhhbmNlT0RhdGFNb2RlbCIsIm9kYXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJ2aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkiLCJBcnJheSIsImZuTWVzc2FnZSIsInNldE1lc3NhZ2VzIiwibG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJKU09OTW9kZWwiLCJzZXREZWZhdWx0QmluZGluZ01vZGUiLCJCaW5kaW5nTW9kZSIsIk9uZVdheSIsImJhc2VTZXRQcm9wZXJ0eSIsImJhc2VHZXRQcm9wZXJ0eSIsInByb3BlcnR5TmFtZSIsImFubm90YXRpb25UeXBlIiwiaXNUcmFuc2llbnQiLCJjb250ZXh0T2JqZWN0IiwiTWV0YVBhdGgiLCJjb252ZXJ0VHlwZXMiLCJleHRlcm5hbElkUHJvcGVydHkiLCJnZXRNZXRhUGF0aEZvclBhdGgiLCJnZXRUYXJnZXQiLCJFeHRlcm5hbElEIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJmdWxsUGF0aCIsIl9yZWZyZXNoTG9jYWxNb2RlbCIsInJlZnJlc2giLCJleHRlcm5hbElkUHJvcFBhdGgiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJ0ZXh0UHJvcGVydHkiLCJUZXh0IiwidGV4dFByb3BQYXRoIiwiaW5jbHVkZXMiLCJwdXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwidGhlbiIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJwYXRoRnJvbVJvb3QiLCJjbGVhckFubm90YXRpb25UeXBlIiwiYW5ub3RhdGlvblR5cGVzIiwiZGF0YVNldCIsImlzQ29udGV4dCIsImlzQSIsImVuZHNXaXRoIiwiX2xvY2FsQW5ub3RhdGlvbk1vZGVsIiwiZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJtZXNzYWdlcyIsImNsZWFuZWREYXRhIiwiZ2V0RGF0YSIsInNldERhdGEiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0VHlwZSIsImdldE1lc3NhZ2UiLCJmbkJpbmRQcm9wZXJ0eSIsImJpbmRQcm9wZXJ0eSIsImJpbmQiLCJwYXJhbWV0ZXJzIiwicmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkRpc2FibGVJbnB1dEFzc2lzdGFuY2UiLCJyZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyIsInNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyIsImludGVybmFsSWRQcm9wZXJ0eU5hbWUiLCJpbnRlcm5hbElkQmluZGluZyIsImV4dGVybmFsSURCaW5kaW5nIiwiZXh0ZXJuYWxJZFRleHRQcm9wZXJ0eSIsImV4dGVybmFsSURUZXh0QmluZGluZyIsImV4dGVybmFsSWRCaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwicmVxdWVzdFZhbHVlIiwicHJvcEJpbmRpbmciLCJ1cGRhdGVSZXF1aXJlZCIsImV4cHJlc3Npb24iLCJ2aWV3SWQiLCJnZXRWaXJ0dWFsQmluZGluZ0V4cHJlc3Npb24iLCJvd25lciIsIlVJNUVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdob3N0Q29udHJvbCIsIkFueSIsImFueSIsImNvbXBpbGVFeHByZXNzaW9uIiwiYmluZEJhY2tQcm9wZXJ0eSIsImdldENvbnRyb2xsZXIiLCJqc3giLCJnZXRGb3JtYXR0ZXJDb250ZXh0IiwiZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nIiwiZGVzdHJveSIsImZuU2V0Q29udGV4dCIsInNldENvbnRleHQiLCJuZXdDb250ZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJzZXRNb2RlbCIsImdob3N0QmluZGluZyIsImdldEJpbmRpbmdJbmZvIiwiYmluZGluZyIsImZuQ2hlY2tVcGRhdGUiLCJjaGVja1VwZGF0ZSIsImZvcmNlVXBkYXRlIiwiaXNDb250ZXh0TG9hZGVkIiwiZ2V0QmluZEJhY2tQcm9wZXJ0eSIsInZhbHVlSW5Mb2NhbEFubm90YXRpb24iLCJnZXRFeHRlcm5hbFZhbHVlIiwiZm5EZXN0cm95IiwidnBCaW5kaW5nIiwiZXZhbHVhdGVWaXJ0dWFsRXhwcmVzc2lvbiIsInByb21pc2VLZWVwZXIiLCJQcm9taXNlS2VlcGVyIiwiRGF0YVdhdGNoZXIiLCJ2YWx1ZUNoYW5nZWQiLCJldmVudCIsInJlc29sdmUiLCJnZXRQYXJhbWV0ZXIiLCJnZXRTb3VyY2UiLCJwcm9wZXJ0eUJpbmRpbmciLCJwcm9taXNlIiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsInRleHQiLCJtZXRhTW9kZWxQYXRoIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJhbm5vdGF0aW9uIiwidG9TdHJpbmciLCJlIiwiaW5mbyIsImdldE1lc3NhZ2VzUGF0aCIsIk1lc3NhZ2VzIiwicmVjb21tZW5kYXRpb25iaW5kaW5nIiwic2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nIiwib2RhdGFQcm9wZXJ0eUJpbmRpbmciLCJyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSIsImlzUmVjb21tZW5kZWRQcm9wZXJ0eSIsInZhbGlkYXRlUmVjb21tZW5kYXRpb25CaW5kaW5nUGF0aCIsImFscmVhZHlCb3VuZCIsImV4aXN0aW5nQmluZGluZyIsInNldFR5cGUiLCJSYXciLCJzZXRCaW5kaW5nTW9kZSIsImN1cnJlbnRDb250ZXh0IiwiY29udGV4dFJlY29tbWVuZGF0aW9ucyIsImdldFZhbHVlIiwic2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbCIsImJpbmRpbmdQYXRoIiwiY29udGV4dE1ldGFQYXRoIiwiUmVjb21tZW5kYXRpb25zIiwiZW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnR5IiwidGFyZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsInJlY29tbWVuZGF0aW9uT2JqIiwicmVqZWN0ZWRSZWNvbW1lbmRhdGlvbnMiLCJyZWNvbW1lbmRlZFByb3BlcnR5IiwicHJvcGVydHlSZWNvbW1lbmRhdGlvbnMiLCJsb2NhbE1vZGVsUGF0aCIsInBsYWNlaG9sZGVyVmFsdWVLZXkiLCJwbGFjZWhvbGRlckRlc2NyaXB0aW9uS2V5IiwidHlwZUFoZWFkVmFsdWVzS2V5IiwicHJvcGVydHlSZWNvbW1lbmRhdGlvbiIsIlJlY29tbWVuZGVkRmllbGRJc1N1Z2dlc3Rpb24iLCJSZWNvbW1lbmRlZEZpZWxkVmFsdWUiLCJSZWNvbW1lbmRlZEZpZWxkRGVzY3JpcHRpb24iLCJfY29tcGFyZVJlY29tbWVuZGF0aW9ucyIsImZvckVhY2giLCJyZWNvbW1lbmRhdGlvbnMiLCJyZWNvbW1lbmRhdGlvbktleXMiLCJyZWplY3RlZFJlY29tbWVuZGF0aW9uS2V5cyIsInJlY29tbWVuZGF0aW9uVHlwZUFoZWFkVmFsdWVzIiwicmVqZWN0ZWRSZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcyIsImlzQXJyYXkiLCJ2YWwiLCJnZXRBbHRlcm5hdGVBbmRTZWNvbmRhcnlLZXlzIiwiYWx0ZXJuYXRlS2V5cyIsIl9mZXRjaEFsdGVybmF0ZUtleXMiLCJlbnRpdHlUeXBlT3JTZXQiLCJDb3JlIiwiQWx0ZXJuYXRlS2V5cyIsImFsdGVybmF0ZUtleSIsIktleSIsIk5hbWUiLCJfZmV0Y2hTZWNvbmRhcnlLZXlzIiwiZVQiLCJTZWNvbmRhcnlLZXkiLCJzZWNvbmRhcnlLZXkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk1vZGVsSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyB0byBiZSB1c2VkIGF0IHJ1bnRpbWUgdG8gcmV0cmlldmUgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZWwgKi9cbmltcG9ydCB0eXBlIHsgQ29tcGxleFR5cGUsIEVudGl0eVNldCwgRW50aXR5VHlwZSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCwgU2luZ2xldG9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZ1bmN0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0Tm9kZSwgRHJhZnRSb290IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgQWx0ZXJuYXRlS2V5LCBQcm9wZXJ0eVJlZiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29yZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGlja3lTZXNzaW9uU3VwcG9ydGVkIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9TZXNzaW9uXCI7XG5pbXBvcnQgdHlwZSB7IERlbGV0ZUhpZGRlbiwgVXBkYXRlSGlkZGVuIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJX0VkbVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQganN4IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQW55IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9BbnlcIjtcbmltcG9ydCBEYXRhV2F0Y2hlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvRGF0YVdhdGNoZXJcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxBY3Rpb25QYXJhbWV0ZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgTWV0YVBhdGggZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTWV0YVBhdGhcIjtcbmltcG9ydCBQcm9taXNlS2VlcGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Byb21pc2VLZWVwZXJcIjtcbmltcG9ydCB7IGlzRW50aXR5U2V0LCBpc05hdmlnYXRpb25Qcm9wZXJ0eSwgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IEJpbmRpbmdNb2RlIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ01vZGVcIjtcbmltcG9ydCB0eXBlIEJhc2VDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBQcm9wZXJ0eUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Qcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFJhdyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3R5cGUvUmF3XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCwgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9EYXRhTGlzdEJpbmRpbmcgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhUHJvcGVydHlCaW5kaW5nJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YVByb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCIuLi9BcHBDb21wb25lbnRcIjtcblxuLy8gVE9ETzogUmlnaHQgbm93IHJlY29tbWVuZGF0aW9ucyBpcyBub3QgcGFydCBvZiB0aGUgVUkgdm9jYWJ1bGFyeS5cbi8vIGhlbmNlIHdlIGFyZSBhZGRpbmcgaXQgdG8gdGhlIHR5cGUuXG4vLyBvbmNlIHRoaXMgYmVjb21lcyBwYXJ0IG9mIHRoZSBVSSB2b2NhYnVsYXJ5IHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzLlxuZXhwb3J0IHR5cGUgRW50aXR5VHlwZUFubm90YXRpb25zX1VJX1dpdGhfUmVjb21tZW5kYXRpb25zID0gRW50aXR5VHlwZUFubm90YXRpb25zX1VJICYge1xuXHRSZWNvbW1lbmRhdGlvbnM/OiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHR9O1xufTtcblxuY29uc3QgTW9kZWxIZWxwZXIgPSB7XG5cdC8vIGdsb2JhbCBzd2l0Y2ggdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBieSBhIHByaXZhdGUgbWFuaWZlc3QgZmxhZ1xuXHQvLyB0aGlzIGFsbG93cyBjdXN0b21lcnMgdG8gZGlzYWJsZSB0aGUgY29sbGFib3JhdGlvbiBkcmFmdCBpbiBjYXNlIHdlIHJ1biBpbnRvIGlzc3VlcyB3aXRoIHRoZSBmaXJzdCBkZWxpdmVyeVxuXHQvLyB0aGlzIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHRoZSBuZXh0IFMvNCByZWxlYXNlXG5cdGRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQ6IGZhbHNlLFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgdG8gY2hlY2sgZm9yIHN0aWNreSBlbmFibGVkIGVudGl0eVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgc3RpY2t5LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50aXR5Q29udGFpbmVyID0gbWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0Zm9yIChjb25zdCBlbnRpdHlTZXROYW1lIGluIGVudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRlbnRpdHlDb250YWluZXJbZW50aXR5U2V0TmFtZV0uJGtpbmQgPT09IFwiRW50aXR5U2V0XCIgJiZcblx0XHRcdFx0bWV0YU1vZGVsLmdldE9iamVjdChgLyR7ZW50aXR5U2V0TmFtZX1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBkcmFmdC5cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBPRGF0YU1vZGVsTWV0YU1vZGVsIG9mIHRoZSBjb250ZXh0IGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBkcmFmdCwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhdGgpO1xuXHRcdGNvbnN0IG9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhQ29udGV4dCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQob2JqZWN0UGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBkcmFmdCBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoLlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgc3VwcG9ydGVkXG5cdCAqL1xuXHRpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4pOiBib29sZWFuIHtcblx0XHRjb25zdCBjdXJyZW50RW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGN1cnJlbnRFbnRpdHlTZXQpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdFx0aXNOYXZpZ2F0aW9uUHJvcGVydHkoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpICYmXG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHRcdCgoZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHxcblx0XHRcdFx0KGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlKVxuXHRcdFx0XHQ/IHRydWVcblx0XHRcdFx0OiBmYWxzZTtcblx0XHRjb25zdCBoYXNJc0FjdGl2ZUVudGl0eUtleSA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5rZXlzPy5zb21lKChrZXkpID0+IGtleS5uYW1lID09PSBcIklzQWN0aXZlRW50aXR5XCIpO1xuXHRcdHJldHVybiBiSXNEcmFmdFJvb3QgfHwgYklzRHJhZnROb2RlIHx8ICghY3VycmVudEVudGl0eVNldCAmJiBiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50ICYmIGhhc0lzQWN0aXZlRW50aXR5S2V5KTtcblx0fSxcblxuXHRpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChkYXRhTW9kZWxPYmplY3RQYXRoOiBNZXRhUGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLmdldENsb3Nlc3RFbnRpdHlTZXQoKSBhcyBFbnRpdHlTZXQ7XG5cdFx0Y29uc3QgYklzRHJhZnRSb290ID0gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnROb2RlID0gTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY3VycmVudEVudGl0eVNldCk7XG5cdFx0cmV0dXJuIGJJc0RyYWZ0Um9vdCB8fCBiSXNEcmFmdE5vZGU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhIFNoYXJlQWN0aW9uIGluIGFueSBFbnRpdHlTZXQgb2YgdGhlIGFwcGxpY2F0aW9uLlxuXHQgKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFubm90YXRpb24gZXhpc3RzLiBGYWxzZSBvdGhlcndpc2UuXG5cdCAqL1xuXHRpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZEZyb21Db252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZWRUeXBlcygpLmVudGl0eVNldHMuc29tZSgoZW50aXR5U2V0KSA9PiB7XG5cdFx0XHRyZXR1cm4gZW50aXR5U2V0LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdD8uU2hhcmVBY3Rpb24gIT09IHVuZGVmaW5lZDtcblx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgc2VydmljZSwgc3VwcG9ydHMgY29sbGFib3JhdGlvbiBkcmFmdC5cblx0ICogQHBhcmFtIG1ldGFPYmplY3QgTWV0YU9iamVjdCB0byBiZSB1c2VkIGZvciBkZXRlcm1pbmF0aW9uXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUludGVyZmFjZSBBUEkgcHJvdmlkZWQgYnkgVUk1IHRlbXBsYXRpbmcgaWYgdXNlZFxuXHQgKiBAcGFyYW0gdGVtcGxhdGVJbnRlcmZhY2UuY29udGV4dCBDb250ZXh0IG9mIHRoZSB0ZW1wbGF0ZVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgY29sbGFib3JhdGlvbiBkcmFmdCwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uIChtZXRhT2JqZWN0OiB1bmtub3duLCB0ZW1wbGF0ZUludGVyZmFjZT86IHsgY29udGV4dDogQ29udGV4dCB9KTogYm9vbGVhbiB7XG5cdFx0aWYgKCFNb2RlbEhlbHBlci5kaXNhYmxlQ29sbGFib3JhdGlvbkRyYWZ0KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gKHRlbXBsYXRlSW50ZXJmYWNlPy5jb250ZXh0Py5nZXRNb2RlbCgpIHx8IG1ldGFPYmplY3QpIGFzIE9EYXRhTWV0YU1vZGVsICYge1xuXHRcdFx0XHRfXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZD86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0aWYgKG9NZXRhTW9kZWwuX18kZmVJc0NvbGxhYm9yYXRpb25EcmFmdEVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gb01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0XHRmb3IgKGNvbnN0IHNFbnRpdHlTZXQgaW4gb0VudGl0eUNvbnRhaW5lcikge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzRW50aXR5U2V0fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1NoYXJlQWN0aW9uYClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9NZXRhTW9kZWwuX18kZmVJc0NvbGxhYm9yYXRpb25EcmFmdEVuYWJsZWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIHRoZSBEcmFmdFJvb3QgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBPZGF0YU1vZGVsIGNvbnRleHRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZHJhZnRSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIGRyYWZ0Um9vdCBpcyBmb3VuZFxuXHQgKi9cblx0Z2V0RHJhZnRSb290UGF0aDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBnZXRSb290UGF0aCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgZmlyc3RJdGVyYXRpb24gPSB0cnVlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRcdGNvbnN0IHNJdGVyYXRpb25QYXRoID0gZmlyc3RJdGVyYXRpb24gPyBzUGF0aCA6IG5ldyBSZWdFeHAoLy4qKD89XFwvKS8pLmV4ZWMoc1BhdGgpPy5bMF07IC8vICpSZWdleCB0byBnZXQgdGhlIGFuY2VzdG9yXG5cdFx0XHRpZiAoc0l0ZXJhdGlvblBhdGggJiYgc0l0ZXJhdGlvblBhdGggIT09IFwiL1wiKSB7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzSXRlcmF0aW9uUGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzRW50aXR5UGF0aCkpO1xuXHRcdFx0XHRpZiAoKG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNJdGVyYXRpb25QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRSb290UGF0aChzSXRlcmF0aW9uUGF0aCwgbW9kZWwsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgob0NvbnRleHQuZ2V0UGF0aCgpLCBvQ29udGV4dC5nZXRNb2RlbCgpKTtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiB0aGUgU3RpY2t5Um9vdCBwYXRoIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IE9kYXRhTW9kZWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBTdGlja3lSb290IGVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIFN0aWNreVJvb3QgaXMgZm91bmRcblx0ICovXG5cdGdldFN0aWNreVJvb3RQYXRoOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGdldFJvb3RQYXRoID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBmaXJzdEl0ZXJhdGlvbiA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0Y29uc3Qgc0l0ZXJhdGlvblBhdGggPSBmaXJzdEl0ZXJhdGlvbiA/IHNQYXRoIDogbmV3IFJlZ0V4cCgvLiooPz1cXC8pLykuZXhlYyhzUGF0aCk/LlswXTsgLy8gKlJlZ2V4IHRvIGdldCB0aGUgYW5jZXN0b3Jcblx0XHRcdGlmIChzSXRlcmF0aW9uUGF0aCAmJiBzSXRlcmF0aW9uUGF0aCAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNJdGVyYXRpb25QYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRtRGF0YU1vZGVsLnN0YXJ0aW5nRW50aXR5U2V0ID09PSBtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0XHRcdChtRGF0YU1vZGVsLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gc0l0ZXJhdGlvblBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFJvb3RQYXRoKHNJdGVyYXRpb25QYXRoLCBtb2RlbCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXHRcdHJldHVybiBnZXRSb290UGF0aChvQ29udGV4dC5nZXRQYXRoKCksIG9Db250ZXh0LmdldE1vZGVsKCkpO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgd2lsbCBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uIChvQ29udGV4dDogQmFzZUNvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGlmIChcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkVudGl0eVNldFwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIka2luZFwiKSA9PT0gXCJBY3Rpb25cIiB8fFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiMC8ka2luZFwiKSA9PT0gXCJBY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHNQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBzRW50aXR5U2V0UGF0aCA9IE1vZGVsSGVscGVyLmdldEVudGl0eVNldFBhdGgoc1BhdGgpO1xuXHRcdHJldHVybiBgLyR7b0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKX1gO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbXBsZXRlIHBhdGggdG8gdGhlIGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy4gTm90ZTogVG8gYmUgdXNlZCBvbmx5IGFmdGVyIHRoZSBtZXRhbW9kZWwgaGFzIGxvYWRlZC5cblx0ICogQHBhcmFtIHBhdGggUGF0aCBmb3Igd2hpY2ggY29tcGxldGUgZW50aXR5U2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIGVudGl0eVR5cGUgcGF0aFxuXHQgKiBAcGFyYW0gb2RhdGFNZXRhTW9kZWwgTWV0YW1vZGVsIHRvIGJlIHVzZWQuKE9wdGlvbmFsIGluIG5vcm1hbCBzY2VuYXJpb3MsIGJ1dCBuZWVkZWQgZm9yIHBhcmFtZXRlcml6ZWQgc2VydmljZSBzY2VuYXJpb3MpXG5cdCAqIEByZXR1cm5zIFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgb2RhdGFNZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGlmICghb2RhdGFNZXRhTW9kZWwpIHtcblx0XHRcdC8vIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBnZXR0aW5nIGVudGl0eVNldFBhdGggZnJvbSBlbnRpdHlUeXBlUGF0aFxuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpLmpvaW4oXCIvJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcvXCIpfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENhbGN1bGF0aW5nIHRoZSBlbnRpdHlTZXRQYXRoIGZyb20gTWV0YU1vZGVsLlxuXHRcdFx0Y29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKTtcblx0XHRcdGlmIChwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRjb25zdCBpbml0aWFsUGF0aE9iamVjdCA9IHtcblx0XHRcdFx0XHRncm93aW5nUGF0aDogXCIvXCIsXG5cdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nOiBcIlwiXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3QgcGF0aE9iamVjdCA9IHBhdGhQYXJ0cy5yZWR1Y2UoXG5cdFx0XHRcdFx0KHBhdGhVbmRlckNvbnN0cnVjdGlvbjogeyBncm93aW5nUGF0aDogc3RyaW5nOyBwZW5kaW5nTmF2UHJvcEJpbmRpbmc6IHN0cmluZyB9LCBwYXRoUGFydDogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGVsaW1pdGVyID0gKCEhaWR4ICYmIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKSB8fCBcIlwiO1xuXHRcdFx0XHRcdFx0bGV0IHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9ID0gcGF0aFVuZGVyQ29uc3RydWN0aW9uO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGVtcFBhdGggPSBncm93aW5nUGF0aCArIGRlbGltaXRlcjtcblx0XHRcdFx0XHRcdGNvbnN0IG5hdlByb3BCaW5kaW5ncyA9IG9kYXRhTWV0YU1vZGVsLmdldE9iamVjdCh0ZW1wUGF0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQcm9wQmluZGluZ1RvQ2hlY2sgPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgJHtwZW5kaW5nTmF2UHJvcEJpbmRpbmd9LyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRuYXZQcm9wQmluZGluZ3MgJiZcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcEJpbmRpbmdzKS5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0XHRcdG5hdlByb3BCaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eShuYXZQcm9wQmluZGluZ1RvQ2hlY2spXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Z3Jvd2luZ1BhdGggPSB0ZW1wUGF0aCArIG5hdlByb3BCaW5kaW5nVG9DaGVjay5yZXBsYWNlKFwiL1wiLCBcIiUyRlwiKTtcblx0XHRcdFx0XHRcdFx0cGVuZGluZ05hdlByb3BCaW5kaW5nID0gXCJcIjtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZyArPSBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgPyBgLyR7cGF0aFBhcnR9YCA6IHBhdGhQYXJ0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHsgZ3Jvd2luZ1BhdGgsIHBlbmRpbmdOYXZQcm9wQmluZGluZyB9O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0aW5pdGlhbFBhdGhPYmplY3Rcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRlbnRpdHlTZXRQYXRoID0gcGF0aE9iamVjdC5ncm93aW5nUGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7cGF0aFBhcnRzWzBdfWA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudGl0eVNldFBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIG9QYXJhbWV0ZXIgQWN0aW9uIFBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb21wbGV0ZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbXMgcHJvcGVydHkgb2YgTXVsdGlWYWx1ZUZpZWxkIHBhcmFtZXRlcnNcblx0ICovXG5cdGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoOiBmdW5jdGlvbiAob1BhcmFtZXRlcjogTWV0YU1vZGVsQWN0aW9uUGFyYW1ldGVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gb1BhcmFtZXRlciAmJiBvUGFyYW1ldGVyLiROYW1lID8gYHtwYXRoOiAnbXZmdmlldz4vJHtvUGFyYW1ldGVyLiROYW1lfSd9YCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHRmaWx0ZXJPdXROYXZQcm9wQmluZGluZzogZnVuY3Rpb24gKHNQYXRoUGFydDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqIEBwYXJhbSBJbnRlcm5hbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqL1xuXG5cdGVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbDogZnVuY3Rpb24gKG9JbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwpOiB2b2lkIHtcblx0XHRjb25zdCBmbkJpbmRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuYmluZENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWwuYmluZENvbnRleHQgPSBmdW5jdGlvbiAoXG5cdFx0XHRzUGF0aDogc3RyaW5nLFxuXHRcdFx0Y29udGV4dDogQmFzZUNvbnRleHQsXG5cdFx0XHRtUGFyYW1ldGVyczogb2JqZWN0IHwgdW5kZWZpbmVkLFxuXHRcdFx0b0V2ZW50czogb2JqZWN0IHwgdW5kZWZpbmVkXG5cdFx0KTogQ29udGV4dEJpbmRpbmcge1xuXHRcdFx0Y29uc3QgY29udGV4dEJpbmRpbmcgPSBmbkJpbmRDb250ZXh0LmFwcGx5KHRoaXMsIFtzUGF0aCwgY29udGV4dCwgbVBhcmFtZXRlcnMsIG9FdmVudHNdKTtcblx0XHRcdGNvbnN0IGZuR2V0Qm91bmRDb250ZXh0ID0gY29udGV4dEJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0O1xuXG5cdFx0XHRjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQgPSBmdW5jdGlvbiAoKTogQmFzZUNvbnRleHQgfCBudWxsIHtcblx0XHRcdFx0Y29uc3Qgb0JvdW5kQ29udGV4dCA9IGZuR2V0Qm91bmRDb250ZXh0LmFwcGx5KHRoaXMpO1xuXHRcdFx0XHRpZiAob0JvdW5kQ29udGV4dCkge1xuXHRcdFx0XHRcdG9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRPYmplY3QoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHRoaXMuZ2V0UGF0aCgpLCB7fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdFx0XHRsZXQgcGF0aCA9IHRoaXMuZ2V0UGF0aCgpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTsgLy8gUmVtb3ZlIHNsYXNoIGlmIGl0IGlzIGF0IHRoZSBlbmRcblx0XHRcdFx0XHRcdC8vIGxldCdzIGVuc3VyZSB0aGF0IHN1YiBvYmplY3RzIGFyZSBpbml0aWFsaXplZFxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IGAke3BhdGh9LyR7cHJvcGVydHlQYXRoU3BsaXRbaV19YDtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0TW9kZWwoKS5nZXRQcm9wZXJ0eShwYXRoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwYXRoLCB7fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHZhbHVlLCB0aGlzKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvQm91bmRDb250ZXh0O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBjb250ZXh0QmluZGluZztcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGhhbmRsZXIgb24gcHJvcGVydHlDaGFuZ2UuXG5cdCAqIFRoZSBwcm9wZXJ0eSBcIi9lZGl0TW9kZVwiIGlzIGNoYW5nZWQgYWNjb3JkaW5nIHRvIHByb3BlcnR5ICcvaXNFZGl0YWJsZScgd2hlbiB0aGlzIGxhc3Qgb25lIGlzIHNldFxuXHQgKiBpbiBvcmRlciB0byBiZSBjb21wbGlhbnQgd2l0aCBmb3JtZXIgdmVyc2lvbnMgd2hlcmUgYnVpbGRpbmcgYmxvY2tzIHVzZSB0aGUgcHJvcGVydHkgXCIvZWRpdE1vZGVcIlxuXHQgKiBAcGFyYW0gdWlNb2RlbCBKU09OIE1vZGVsIHdoaWNoIGlzIGVuaGFuY2VkXG5cdCAqIEBwYXJhbSBsaWJyYXJ5IENvcmUgbGlicmFyeSBvZiBTQVAgRmlvcmkgZWxlbWVudHNcblx0ICovXG5cblx0ZW5oYW5jZVVpSlNPTk1vZGVsOiBmdW5jdGlvbiAodWlNb2RlbDogSlNPTk1vZGVsLCBsaWJyYXJ5OiB7IEVkaXRNb2RlOiB7IEVkaXRhYmxlOiBzdHJpbmc7IERpc3BsYXk6IHN0cmluZyB9IH0pOiB2b2lkIHtcblx0XHRjb25zdCBmblNldFByb3BlcnR5ID0gdWlNb2RlbC5zZXRQcm9wZXJ0eTtcblx0XHR1aU1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRcdFx0cGF0aDogc3RyaW5nLFxuXHRcdFx0dmFsdWU6IHVua25vd24sXG5cdFx0XHRjb250ZXh0OiBCYXNlQ29udGV4dCB8IHVuZGVmaW5lZCxcblx0XHRcdGFzeW5jVXBkYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkXG5cdFx0KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAocGF0aCA9PT0gXCIvaXNFZGl0YWJsZVwiKSB7XG5cdFx0XHRcdHVpTW9kZWwuc2V0UHJvcGVydHkoXCIvZWRpdE1vZGVcIiwgdmFsdWUgPyBsaWJyYXJ5LkVkaXRNb2RlLkVkaXRhYmxlIDogbGlicmFyeS5FZGl0TW9kZS5EaXNwbGF5LCBjb250ZXh0LCBhc3luY1VwZGF0ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5TZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgdmFsdWUsIGNvbnRleHQsIGFzeW5jVXBkYXRlXSk7XG5cdFx0fTtcblx0fSxcblxuXHRlbmhhbmNlVmlld0pTT05Nb2RlbDogZnVuY3Rpb24gKHZpZXdNb2RlbDogSlNPTk1vZGVsICYgeyBfZ2V0T2JqZWN0OiBGdW5jdGlvbiB9KTogdm9pZCB7XG5cdFx0Y29uc3QgZm5HZXRPYmplY3QgPSB2aWV3TW9kZWwuX2dldE9iamVjdDtcblx0XHR2aWV3TW9kZWwuX2dldE9iamVjdCA9IGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiB1bmtub3duIHtcblx0XHRcdGlmIChzUGF0aCA9PT0gdW5kZWZpbmVkIHx8IHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdHNQYXRoID0gXCIvXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5HZXRPYmplY3QuYXBwbHkodGhpcywgW3NQYXRoLCBvQ29udGV4dF0pO1xuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBmaWx0ZXJGdW5jdGlvbnMgRmlsdGVyIGZ1bmN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZpY2Vcblx0ICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIHRoZSBzZXJ2aWNlIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcblx0ICovXG5cdGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZTogZnVuY3Rpb24gKG9NZXRhTW9kZWw/OiBPRGF0YU1ldGFNb2RlbCwgZmlsdGVyRnVuY3Rpb25zPzogRmlsdGVyRnVuY3Rpb25zIHwgc3RyaW5nW10pOiBib29sZWFuIHtcblx0XHRjb25zdCBfZmlsdGVyRnVuY3Rpb25zID0gZmlsdGVyRnVuY3Rpb25zID8/IG9NZXRhTW9kZWw/LmdldE9iamVjdChcIi9AT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMS5GaWx0ZXJGdW5jdGlvbnNcIik7XG5cblx0XHRpZiAoIV9maWx0ZXJGdW5jdGlvbnMpIHtcblx0XHRcdC8vIGlmIG5vIGZpbHRlcnMgZnVuY3Rpb24gZGVmaW5lZCBpbiBzZXJ2aWNlLCB3ZSBhc3N1bWUgdGhhdCB0aGUgc2VydmljZSBpcyBjYXNlIHNlbnNpdGl2ZVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9maWx0ZXJGdW5jdGlvbnMuaW5kZXhPZihcInRvbG93ZXJcIikgPT09IC0xO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSB1c2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIG1ldGFwYXRoIGZvciB0aGUgY29udGV4dC5cblx0ICovXG5cdGdldE1ldGFQYXRoRm9yQ29udGV4dDogZnVuY3Rpb24gKG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHJldHVybiBvTWV0YU1vZGVsICYmIHNQYXRoICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dFBhdGggTWV0YVBhdGggdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSByb290IGVudGl0eSBzZXQgcGF0aC5cblx0ICovXG5cdGdldFJvb3RFbnRpdHlTZXRQYXRoOiBmdW5jdGlvbiAoY29udGV4dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0bGV0IHJvb3RFbnRpdHlTZXRQYXRoID0gXCJcIjtcblx0XHRjb25zdCBhUGF0aHMgPSBjb250ZXh0UGF0aCA/IGNvbnRleHRQYXRoLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdGlmIChhUGF0aHMubGVuZ3RoID4gMSkge1xuXHRcdFx0cm9vdEVudGl0eVNldFBhdGggPSBhUGF0aHNbMV07XG5cdFx0fVxuXHRcdHJldHVybiByb290RW50aXR5U2V0UGF0aDtcblx0fSxcblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGxpc3RCaW5kaW5nLlxuXHQgKiBAcGFyYW0gb1ZpZXcgVmlldyBvZiB0aGUgY29udHJvbCB1c2luZyBsaXN0QmluZGluZ1xuXHQgKiBAcGFyYW0gdkxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBtZXRhcGF0aCBmb3IgdGhlIGxpc3RiaW5kaW5nLlxuXHQgKi9cblx0Z2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nOiBmdW5jdGlvbiAob1ZpZXc6IEZFVmlldywgdkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc01ldGFQYXRoO1xuXG5cdFx0aWYgKHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdGlmICh2TGlzdEJpbmRpbmcuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZMaXN0QmluZGluZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3NSb290Q29udGV4dFBhdGh9LyR7dkxpc3RCaW5kaW5nfWApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB3ZSBhbHJlYWR5IGdldCBhIGxpc3QgYmluZGluZyB1c2UgdGhpcyBvbmVcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdkxpc3RCaW5kaW5nO1xuXHRcdFx0Y29uc3Qgb1Jvb3RCaW5kaW5nID0gb0JpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRcdGlmIChvQmluZGluZyA9PT0gb1Jvb3RCaW5kaW5nKSB7XG5cdFx0XHRcdC8vIGFic29sdXRlIHBhdGhcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0XHRjb25zdCBzUm9vdEJpbmRpbmdQYXRoID0gb1Jvb3RCaW5kaW5nIS5nZXRQYXRoKCk7XG5cdFx0XHRcdGNvbnN0IHNSZWxhdGl2ZVBhdGggPSBvQmluZGluZy5nZXRQYXRoKCk7XG5cdFx0XHRcdGlmICh2TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpID09PSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHtzUm9vdEJpbmRpbmdQYXRofS8ke3NSZWxhdGl2ZVBhdGh9YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9PbiB0aGUgY2FzZSBvZiBhIG11bHRpIHZhbHVlIGZpZWxkLCB0aGUgY29udGV4dCBvZiB0aGUgbGlzdCBiaW5kaW5nIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgdmlldyBiaW5kaW5nIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gd2UgaGF2ZSB0byBnZXQgdGhlIG1ldGEgcGF0aCBmcm9tIHRoZSBjb250ZXh0IG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZMaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKX0vJHtzUmVsYXRpdmVQYXRofWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNNZXRhUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSByZWxhdGl2ZSBtZXRhUGF0aCBmcm9tIHRoZSB2aWV3IGZvciB0aGUgbGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IENvbnRleHQgb2YgdGhlIHZpZXcgb3IgdGhlIHBhcmVudCBjb250cm9sXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YVBhdGggZm9yIHRoZSBPRGF0YUxpc3RCaW5kaW5nLlxuXHQgKi9cblx0Z2V0UmVsYXRpdmVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHBhcmVudENvbnRleHQ6IENvbnRleHQsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBsaXN0QmluZGluZ0NvbnRleHQgPSBsaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dFBhdGggPSBwYXJlbnRDb250ZXh0LmdldFBhdGgoKTtcblxuXHRcdC8vRm9yIGFic29sdXRlIHBhdGggd2UgcmV0dXJuIHVuZGVmaW5lZFxuXHRcdGlmICghbGlzdEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIGlmIHRoZSBsaXN0IGJpbmRpbmcgY29udGV4dCBpcyB0aGUgcGFyZW50IGNvbnRleHQsIHdlIHJldHVybiB0aGUgbGlzdCBiaW5kaW5nIHBhdGhcblx0XHRpZiAobGlzdEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSA9PT0gcGFyZW50Q29udGV4dFBhdGgpIHtcblx0XHRcdHJldHVybiBsaXN0QmluZGluZy5nZXRQYXRoKCk7XG5cdFx0fVxuXHRcdC8vIGlmIHRoZSBsaXN0IGJpbmRpbmcgY29udGV4dCBpcyBub3QgdGhlIHBhcmVudCBjb250ZXh0LCB3ZSB0cnkgdG8gZmluZCB0aGUgcmVsYXRpdmUgcGF0aFxuXHRcdGlmIChsaXN0QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocGFyZW50Q29udGV4dFBhdGgpKSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdNZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChwYXJlbnRDb250ZXh0UGF0aCk7XG5cdFx0XHRyZXR1cm4gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGxpc3RCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpfS8ke2xpc3RCaW5kaW5nLmdldFBhdGgoKX1gLnJlcGxhY2UoYCR7dmlld0JpbmRpbmdNZXRhUGF0aH0vYCwgXCJcIik7XG5cdFx0fVxuXHRcdC8vIG90aGVyd2lzZSwgd2UgcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB0aGUgbGlzdCBiaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgdmlldyBiaW5kaW5nIGNvbnRleHRcblx0XHRyZXR1cm47XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCByb290LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdGlzRHJhZnRSb290OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RHJhZnRSb290KGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IG5vZGUuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZVxuXHQgKi9cblx0aXNEcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdE5vZGUoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RpY2t5IHNlc3Npb24gcm9vdC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290XG5cdCAqL1xuXHRpc1N0aWNreTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U3RpY2t5U2Vzc2lvbihlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgZW50aXR5IGlzIHVwZGF0YWJsZSBvciBub3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB1cGRhdGFibGUgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNVcGRhdGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFVwZGF0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LlVwZGF0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlPy5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnRSb290IGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdFJvb3QgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnRSb290IDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBAQ29tbW9uLkRyYWZ0Tm9kZSBhbm5vdGF0aW9uIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBFbnRpdHlTZXQuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIERyYWZ0Um9vdFxuXHQgKi9cblx0Z2V0RHJhZnROb2RlOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogRHJhZnROb2RlIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gaXNFbnRpdHlTZXQoZW50aXR5U2V0KSA/IGVudGl0eVNldC5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Tm9kZSA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogSGVscGVyIG1ldGhvZCB0byBnZXQgc3RpY2t5IHNlc3Npb24uXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFNlc3Npb24gU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHQgKi9cblx0Z2V0U3RpY2t5U2Vzc2lvbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgZGVsZXRlIGJ1dHRvbi5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGRlbGV0ZSBidXR0b24gaXMgaGlkZGVuXG5cdCAqL1xuXHRnZXREZWxldGVIaWRkZW46IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IERlbGV0ZUhpZGRlbiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGlzRW50aXR5U2V0KGVudGl0eVNldCkpIHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbiA/PyBlbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5EZWxldGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBtZXRhcGF0aCBmb3IgdGhlIGdpdmVuIGxpc3QgYmluZGluZy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3RCaW5kaW5nLlxuXHQgKiBAcmV0dXJucyBNZXRhUGF0aFxuXHQgKi9cblx0Z2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBtZXRhbW9kZWwgPSBsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBtZXRhUGF0aDtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCk7XG5cdFx0aWYgKGxpc3RCaW5kaW5nID09PSByb290QmluZGluZykge1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgcm9vdEJpbmRpbmdQYXRoID0gcm9vdEJpbmRpbmc/LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdG1ldGFQYXRoID0gbWV0YW1vZGVsLmdldE1ldGFQYXRoKGAke3Jvb3RCaW5kaW5nUGF0aH0vJHtyZWxhdGl2ZVBhdGh9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXRhUGF0aDtcblx0fSxcblxuXHRlbmhhbmNlT0RhdGFNb2RlbChvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCk6IHZvaWQge1xuXHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5ID0gbmV3IEFycmF5PE9EYXRhUHJvcGVydHlCaW5kaW5nPigpO1xuXHRcdGNvbnN0IGZuTWVzc2FnZSA9IG9kYXRhTW9kZWwuc2V0TWVzc2FnZXM7XG5cdFx0Y29uc3QgbG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXREZWZhdWx0QmluZGluZ01vZGUoQmluZGluZ01vZGUuT25lV2F5KTtcblx0XHRjb25zdCBiYXNlU2V0UHJvcGVydHkgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eTtcblx0XHRjb25zdCBiYXNlR2V0UHJvcGVydHkgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRQcm9wZXJ0eTtcblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoLCBjb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHVua25vd24ge1xuXHRcdFx0Y29uc3QgW3Byb3BlcnR5TmFtZSwgYW5ub3RhdGlvblR5cGVdID0gcGF0aC5zcGxpdChcIkAkdWk1LmZlLlwiKTtcblxuXHRcdFx0aWYgKGNvbnRleHQgJiYgY29udGV4dC5pc1RyYW5zaWVudCgpICE9PSB0cnVlICYmIGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRPYmplY3QgPSBjb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoY29udGV4dE9iamVjdCkge1xuXHRcdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0XHRjb252ZXJ0VHlwZXMob2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKSksXG5cdFx0XHRcdFx0XHRvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkUHJvcGVydHkgPSBtZXRhUGF0aC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KG1ldGFQYXRoLmdldFBhdGgoKSArIFwiL1wiICsgcHJvcGVydHlOYW1lKT8uZ2V0VGFyZ2V0KClcblx0XHRcdFx0XHRcdC5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cblx0XHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZXh0ZXJuYWxJZFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KGV4dGVybmFsSWRQcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoY29udGV4dCAmJiBhbm5vdGF0aW9uVHlwZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldFBhdGgoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJhc2VHZXRQcm9wZXJ0eS5hcHBseSh0aGlzLCBbcGF0aCwgY29udGV4dF0pO1xuXHRcdH07XG5cblx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGUpOiBib29sZWFuIHtcblx0XHRcdGxldCBmdWxsUGF0aCA9IHBhdGg7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRmdWxsUGF0aCA9IGNvbnRleHQuZ2V0UGF0aChwYXRoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IF9yZWZyZXNoTG9jYWxNb2RlbCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0dGhpcy5yZWZyZXNoKCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgW3Byb3BlcnR5TmFtZSwgYW5ub3RhdGlvblR5cGVdID0gcGF0aC5zcGxpdChcIkAkdWk1LmZlLlwiKTtcblx0XHRcdGlmIChjb250ZXh0ICYmIGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiKSB7XG5cdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG5cdFx0XHRcdC8vIHJlZnJlc2hpbmcgRXh0ZXJuYWxJRCBhbmQgdGV4dCBwcm9wZXJ0aWVzIChwYXRocyBuZWVkIHRvIGJlIGRldGVybWluZWQgZ2VuZXJpY2FsbHkpXG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0Y29udmVydFR5cGVzKG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4obWV0YVBhdGguZ2V0UGF0aCgpICsgXCIvXCIgKyBwcm9wZXJ0eU5hbWUpPy5nZXRUYXJnZXQoKVxuXHRcdFx0XHRcdC5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cblx0XHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGV4dGVybmFsSWRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkUHJvcFBhdGggPSBleHRlcm5hbElkUHJvcGVydHkucGF0aDtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gW2V4dGVybmFsSWRQcm9wUGF0aC5zdWJzdHJpbmcoMCwgZXh0ZXJuYWxJZFByb3BQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSldO1xuXHRcdFx0XHRcdGNvbnN0IHRleHRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4obWV0YVBhdGguZ2V0UGF0aCgpICsgXCIvXCIgKyBleHRlcm5hbElkUHJvcFBhdGgpPy5nZXRUYXJnZXQoKVxuXHRcdFx0XHRcdFx0LmFubm90YXRpb25zLkNvbW1vbj8uVGV4dDtcblx0XHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGV4dFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGV4dFByb3BQYXRoID0gdGV4dFByb3BlcnR5LnBhdGg7XG5cdFx0XHRcdFx0XHRpZiAodGV4dFByb3BQYXRoLmluY2x1ZGVzKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0aWVzVG9SZXF1ZXN0LnB1c2godGV4dFByb3BQYXRoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KGNvbnRleHQgYXMgT0RhdGFWNENvbnRleHQpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKHByb3BlcnRpZXNUb1JlcXVlc3QpXG5cdFx0XHRcdFx0XHQudGhlbihfcmVmcmVzaExvY2FsTW9kZWwpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoU3BsaXQgPSBmdWxsUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHQvLyBsZXQncyBlbnN1cmUgdGhhdCBzdWIgb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWRcblx0XHRcdGxldCBwYXRoRnJvbVJvb3QgPSBcIlwiO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0cGF0aEZyb21Sb290ICs9IFwiL1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGhGcm9tUm9vdCArPSBwcm9wZXJ0eVBhdGhTcGxpdFtpXTtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0T2JqZWN0KHBhdGhGcm9tUm9vdCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHR0aGlzLnNldFByb3BlcnR5KHBhdGhGcm9tUm9vdCwge30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYmFzZVNldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGVdKTtcblx0XHR9O1xuXHRcdGZ1bmN0aW9uIGNsZWFyQW5ub3RhdGlvblR5cGUoYW5ub3RhdGlvblR5cGVzOiBzdHJpbmdbXSwgZGF0YVNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBvYmplY3Qge1xuXHRcdFx0Zm9yIChjb25zdCBjb250ZXh0UGF0aCBpbiBkYXRhU2V0KSB7XG5cdFx0XHRcdC8vIHdlIGFkZGVkIGEgY29udGV4dCBmb3IgYWNjZXB0aW5nIHJlY29tbWVuZGF0aW9ucyBldmVudHVhbGx5LlxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBhIGRlZXBseSBuZXN0ZWQgb2JqZWN0IGl0ZXJhdGluZyBvdmVyIGl0IGNhdXNlIHRoZSBjb2RlIHRoZSBicmVha1xuXHRcdFx0XHQvLyBoZW5jZSB3ZSBhcmUgc2tpcHBpbmcgaXQgaGVyZS5cblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IGRhdGFTZXQ/Lltjb250ZXh0UGF0aF0gYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdGNvbnN0IGlzQ29udGV4dCA9IGNvbnRleHQ/LmlzQT8uKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIik7XG5cdFx0XHRcdGlmICh0eXBlb2YgY29udGV4dCA9PT0gXCJvYmplY3RcIiAmJiAhaXNDb250ZXh0KSB7XG5cdFx0XHRcdFx0ZGF0YVNldFtjb250ZXh0UGF0aF0gPSBjbGVhckFubm90YXRpb25UeXBlKGFubm90YXRpb25UeXBlcywgZGF0YVNldFtjb250ZXh0UGF0aF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXHRcdFx0XHRcdGlmIChkYXRhU2V0W2NvbnRleHRQYXRoXSAmJiBPYmplY3Qua2V5cyhkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGFTZXRbY29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGFubm90YXRpb25UeXBlIG9mIGFubm90YXRpb25UeXBlcykge1xuXHRcdFx0XHRcdGlmIChjb250ZXh0UGF0aC5lbmRzV2l0aChhbm5vdGF0aW9uVHlwZSkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhU2V0W2NvbnRleHRQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBkYXRhU2V0O1xuXHRcdH1cblx0XHRvZGF0YU1vZGVsLl9sb2NhbEFubm90YXRpb25Nb2RlbCA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsO1xuXHRcdG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBmdW5jdGlvbiAoKTogSlNPTk1vZGVsIHtcblx0XHRcdHJldHVybiB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbDtcblx0XHR9O1xuXHRcdG9kYXRhTW9kZWwuc2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAobWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIE1lc3NhZ2VbXT4pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNsZWFuZWREYXRhID0gY2xlYXJBbm5vdGF0aW9uVHlwZShbXCJAJHVpNS5mZS5tZXNzYWdlVHlwZVwiLCBcIkAkdWk1LmZlLm1lc3NhZ2VUZXh0XCJdLCB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5nZXREYXRhKCkpO1xuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0RGF0YShjbGVhbmVkRGF0YSk7XG5cdFx0XHRmb3IgKGNvbnN0IG1lc3NhZ2VUYXJnZXQgaW4gbWVzc2FnZXMpIHtcblx0XHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoYCR7bWVzc2FnZVRhcmdldH1AJHVpNS5mZS5tZXNzYWdlVHlwZWAsIG1lc3NhZ2VzW21lc3NhZ2VUYXJnZXRdWzBdLmdldFR5cGUoKSk7XG5cdFx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KGAke21lc3NhZ2VUYXJnZXR9QCR1aTUuZmUubWVzc2FnZVRleHRgLCBtZXNzYWdlc1ttZXNzYWdlVGFyZ2V0XVswXS5nZXRNZXNzYWdlKCkpO1xuXHRcdFx0fVxuXHRcdFx0Zm5NZXNzYWdlLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5CaW5kUHJvcGVydHkgPSBvZGF0YU1vZGVsLmJpbmRQcm9wZXJ0eS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuYmluZFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgY29udGV4dDogT0RhdGFWNENvbnRleHQsIHBhcmFtZXRlcnMpOiBPRGF0YVByb3BlcnR5QmluZGluZyB7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCA9IGFwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXM/LigpLkRpc2FibGVJbnB1dEFzc2lzdGFuY2U7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyA9IE1vZGVsSGVscGVyLnNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyhcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0Zm5CaW5kUHJvcGVydHksXG5cdFx0XHRcdHBhdGgsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uUHJvcGVydHlCaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmVuZHNXaXRoKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpICYmIGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxJZFByb3BlcnR5TmFtZSA9IHBhdGguc3BsaXQoXCJAJHVpNS5mZS5cIilbMF07XG5cdFx0XHRcdGNvbnN0IGludGVybmFsSWRCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkoaW50ZXJuYWxJZFByb3BlcnR5TmFtZSwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0Y29udmVydFR5cGVzKG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BlcnR5ID0gbWV0YVBhdGhcblx0XHRcdFx0XHQuZ2V0TWV0YVBhdGhGb3JQYXRoPFByb3BlcnR5PihtZXRhUGF0aC5nZXRQYXRoKCkgKyBcIi9cIiArIGludGVybmFsSWRQcm9wZXJ0eU5hbWUpXG5cdFx0XHRcdFx0Py5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cblx0XHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGV4dGVybmFsSWRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElEQmluZGluZyA9IGZuQmluZFByb3BlcnR5KGV4dGVybmFsSWRQcm9wZXJ0eS5wYXRoLCBjb250ZXh0KTtcblx0XHRcdFx0XHRvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5wdXNoKGV4dGVybmFsSURCaW5kaW5nKTtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkVGV4dFByb3BlcnR5ID0gbWV0YVBhdGhcblx0XHRcdFx0XHRcdC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KGV4dGVybmFsSURCaW5kaW5nLmdldENvbnRleHQoKT8uZ2V0UGF0aCgpICsgXCIvXCIgKyBleHRlcm5hbElkUHJvcGVydHkucGF0aClcblx0XHRcdFx0XHRcdD8uZ2V0VGFyZ2V0KCkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkVGV4dFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJRFRleHRCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkoZXh0ZXJuYWxJZFRleHRQcm9wZXJ0eS5wYXRoLCBjb250ZXh0KTtcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2goZXh0ZXJuYWxJRFRleHRCaW5kaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZEJpbmRpbmcgPSB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgdW5rbm93biBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblxuXHRcdFx0XHRpbnRlcm5hbElkQmluZGluZy5hdHRhY2hDaGFuZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdGV4dGVybmFsSWRCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGludGVybmFsSWRCaW5kaW5nXG5cdFx0XHRcdFx0LnJlcXVlc3RWYWx1ZSgpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0ZXh0ZXJuYWxJZEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGV4dGVybmFsSWRCaW5kaW5nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGguaW5jbHVkZXMoXCJAJHVpNS5mZS5cIikpIHtcblx0XHRcdFx0Y29uc3QgcHJvcEJpbmRpbmcgPSB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdFx0c2V0Q29udGV4dD86IEZ1bmN0aW9uO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocGF0aC5lbmRzV2l0aChcIkAkdWk1LmZlLkBDb21tb24vRXh0ZXJuYWxJRFwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9wQmluZGluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRwcm9wQmluZGluZy51cGRhdGVSZXF1aXJlZCA9IGZ1bmN0aW9uIChtb2RlbDogb2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIG1vZGVsICYmIG1vZGVsID09PSBvZGF0YU1vZGVsO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocGF0aC5pbmNsdWRlcyhcIkAkdWk1LmZlLnZpcnR1YWwuXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgeyBleHByZXNzaW9uLCB2aWV3SWQgfSA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRWaXJ0dWFsQmluZGluZ0V4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0TWV0YU1vZGVsQ29udmVydGVyLmNvbnZlcnRUeXBlcyh0aGlzLmdldE1ldGFNb2RlbCgpKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3Qgb3duZXIgPSB2aWV3SWQgPyAoVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpIGFzIFZpZXcpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0Q29udHJvbCA9IG5ldyBBbnkoXG5cdFx0XHRcdFx0XHR7IGFueTogY29tcGlsZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksIGJpbmRCYWNrUHJvcGVydHk6IHBhdGggfSxcblx0XHRcdFx0XHRcdG93bmVyPy5nZXRDb250cm9sbGVyKCkgPz8ganN4LmdldEZvcm1hdHRlckNvbnRleHQoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nID0gcHJvcEJpbmRpbmcuZGVzdHJveS5iaW5kKHByb3BCaW5kaW5nKTtcblx0XHRcdFx0XHRwcm9wQmluZGluZy5kZXN0cm95ID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sPy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nKCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmblNldENvbnRleHQgPSBwcm9wQmluZGluZy5zZXRDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChmblNldENvbnRleHQpIHtcblx0XHRcdFx0XHRcdHByb3BCaW5kaW5nLnNldENvbnRleHQgPSAobmV3Q29udGV4dDogQ29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRnaG9zdENvbnRyb2w/LnNldEJpbmRpbmdDb250ZXh0KG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRDb250ZXh0LmJpbmQocHJvcEJpbmRpbmcpKG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnaG9zdENvbnRyb2wuc2V0TW9kZWwodGhpcyk7XG5cdFx0XHRcdFx0Y29uc3QgZ2hvc3RCaW5kaW5nID0gZ2hvc3RDb250cm9sLmdldEJpbmRpbmdJbmZvKFwiYW55XCIpPy5iaW5kaW5nO1xuXHRcdFx0XHRcdGNvbnN0IGZuQ2hlY2tVcGRhdGUgPSBnaG9zdEJpbmRpbmc/LmNoZWNrVXBkYXRlO1xuXHRcdFx0XHRcdGlmIChmbkNoZWNrVXBkYXRlKSB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRyb2wuZ2V0QmluZGluZ0luZm8oXCJhbnlcIikuYmluZGluZy5jaGVja1VwZGF0ZSA9IChmb3JjZVVwZGF0ZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGZvcmNlIHRoZSB1cGRhdGUgb25seSBpZiB0aGUgZ2hvc3QgY29udHJvbCBpcyBib3VuZCB0byBhIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbG9jYWwgYW5ub3RhdGlvbiBtb2RlbCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZXh0ZXJuYWwgdmFsdWUuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIGdob3N0IGNvbnRyb2wgaXMgdXBkYXRlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LlxuXHRcdFx0XHRcdFx0XHRjb25zdCBpc0NvbnRleHRMb2FkZWQgPSBnaG9zdENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0T2JqZWN0KCkgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZEJhY2tQcm9wZXJ0eSA9IGdob3N0Q29udHJvbC5nZXRCaW5kQmFja1Byb3BlcnR5KCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlSW5Mb2NhbEFubm90YXRpb24gPSBpc0NvbnRleHRMb2FkZWRcblx0XHRcdFx0XHRcdFx0XHQ/IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5KGdob3N0Q29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIS5nZXRQYXRoKGJpbmRCYWNrUHJvcGVydHkpKVxuXHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5DaGVja1VwZGF0ZS5iaW5kKGdob3N0QmluZGluZykoXG5cdFx0XHRcdFx0XHRcdFx0Zm9yY2VVcGRhdGUgfHxcblx0XHRcdFx0XHRcdFx0XHRcdChiaW5kQmFja1Byb3BlcnR5ICYmIGlzQ29udGV4dExvYWRlZCAmJiBnaG9zdEJpbmRpbmcuZ2V0RXh0ZXJuYWxWYWx1ZSgpICE9PSB2YWx1ZUluTG9jYWxBbm5vdGF0aW9uKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Z2hvc3RDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwcm9wQmluZGluZztcblx0XHRcdH1cblx0XHRcdHJldHVybiBmbkJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuRGVzdHJveSA9IG9kYXRhTW9kZWwuZGVzdHJveS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuZGVzdHJveSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdGZvciAoY29uc3QgdnBCaW5kaW5nIG9mIG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5KSB7XG5cdFx0XHRcdHZwQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gZm5EZXN0cm95LmFwcGx5KHRoaXMpO1xuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlcyBhIHZpcnR1YWwgYmluZGluZyBleHByZXNzaW9uIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBwcm9taXNlLlxuXHQgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgdmlydHVhbCBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIGV2YWx1YXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZXZhbHVhdGVkIHZhbHVlXG5cdCAqL1xuXHRhc3luYyBldmFsdWF0ZVZpcnR1YWxFeHByZXNzaW9uPFQ+KHBhdGg6IHN0cmluZywgY29udGV4dDogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPFQ+IHtcblx0XHRjb25zdCBwcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8VD4oKTtcblx0XHRjb25zdCB7IGV4cHJlc3Npb24sIHZpZXdJZCB9ID0gTWV0YU1vZGVsQ29udmVydGVyLmdldFZpcnR1YWxCaW5kaW5nRXhwcmVzc2lvbihcblx0XHRcdHBhdGgsXG5cdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSlcblx0XHQpO1xuXHRcdGNvbnN0IG93bmVyID0gdmlld0lkID8gKFVJNUVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQodmlld0lkKSBhcyBWaWV3KSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBnaG9zdENvbnRyb2wgPSBuZXcgRGF0YVdhdGNoZXIoXG5cdFx0XHR7XG5cdFx0XHRcdHZhbHVlQ2hhbmdlZDogZnVuY3Rpb24gKGV2ZW50KTogdm9pZCB7XG5cdFx0XHRcdFx0cHJvbWlzZUtlZXBlci5yZXNvbHZlKGV2ZW50LmdldFBhcmFtZXRlcihcInZhbHVlXCIpIGFzIFQpO1xuXHRcdFx0XHRcdGV2ZW50LmdldFNvdXJjZSgpLmRlc3Ryb3koKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJvcGVydHlCaW5kaW5nOiBjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uKVxuXHRcdFx0fSxcblx0XHRcdChvd25lcj8uZ2V0Q29udHJvbGxlcigpID8/IGpzeC5nZXRGb3JtYXR0ZXJDb250ZXh0KCkpIGFzIFByb3BlcnRpZXNPZjxEYXRhV2F0Y2hlcj5cblx0XHQpO1xuXHRcdGdob3N0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblx0XHRnaG9zdENvbnRyb2wuc2V0TW9kZWwoY29udGV4dC5nZXRNb2RlbCgpKTtcblxuXHRcdHJldHVybiBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIGEgbWV0YWRhdGEgYmluZGluZyB0byBpdHMgdGV4dCwgZWl0aGVyIHVzaW5nIHRoZSBjb252ZXJ0ZXJDb250ZXh0IG9yIHRoZSBtZXRhTW9kZWwgZGlyZWN0bHkuXG5cdCAqIEBwYXJhbSBwYXRoXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG5cdCAqIEBwYXJhbSBtZXRhTW9kZWxcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVkIHRleHQgaWYgcG9zc2libGUsIGVsc2UgdGhlIGlucHV0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGF0aCB3YXMgdW5kZWZpbmVkXG5cdCAqL1xuXHRmZXRjaFRleHRGcm9tTWV0YU1vZGVsKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dD86IENvbnZlcnRlckNvbnRleHQ8dW5rbm93bj4sIG1ldGFNb2RlbD86IE1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IHRleHQgPSBwYXRoICE9PSB1bmRlZmluZWQgPyBwYXRoIDogXCJcIjtcblx0XHRpZiAocGF0aD8uc3RhcnRzV2l0aChcInttZXRhTW9kZWw+XCIpKSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWxQYXRoID0gcGF0aC5zdWJzdHJpbmcoMTEsIHBhdGgubGVuZ3RoIC0gMSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoY29udmVydGVyQ29udGV4dCkge1xuXHRcdFx0XHRcdHRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKG1ldGFNb2RlbFBhdGgpLmFubm90YXRpb24/LnRvU3RyaW5nKCkgPz8gXCJcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0ZXh0ID0gbWV0YU1vZGVsPy5nZXRPYmplY3QobWV0YU1vZGVsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0TG9nLmluZm8oYFVuYWJsZSB0byByZXRyaWV2ZSB0ZXh0IGZyb20gbWV0YSBtb2RlbCB1c2luZyBwYXRoICR7bWV0YU1vZGVsUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRleHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgcGF0aCBjb3JyZXNwb25kaW5nIHRvIHN0YXRlIG1lc3NhZ2VzLlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIFRoZSBtZXRhbW9kZWxcblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIFBhdGggZm9yIHRoZSBjb250ZXh0IG9uIHdoaWNoIHdlIHdoYXQgdG8gcmV0cmVpdmUgdGhlIG1lc3NhZ2UgcGF0aFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoLCBvciB1bmRlZmluZWQgaWYgbm8gTWVzc2FnZXMgYW5ub3RhdGlvbiBpcyBkZWZpbmVkXG5cdCAqL1xuXHRnZXRNZXNzYWdlc1BhdGg6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0UGF0aCk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSBvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5NZXNzYWdlcztcblx0XHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcblx0fSxcblx0LyoqXG5cdCAqIFNldHVwIHJlY29tbWVuZGF0aW9uIGxvY2FsIGJpbmRpbmcgdG8gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWNjZXNzaWJsZSB2aWEgY2xpZW50IHNpZGUgaW5zdGFuY2UgYW5ub3RhdGlvbnMuXG5cdCAqXG5cdCAqIFJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkuXG5cdCAqIE1vZGVsIGRvZXMgbm90IHByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gYmluZCB0byBjb21wbGV4IHByb3BlcnRpZXMuIEl0IGhhcyAyIG1ham9yIGxpbWl0YXRpb25zLlxuXHQgKlxuXHQgKiBJdCBvbmx5IHN1cHBvcnRzIG9uZSB0aW1lIGJpbmRpbmcgdG8gY29tcGxleCBwcm9wZXJ0aWVzLiBUaGlzIGlzIG5lZWRlZCB0byBzaG93IHVwZGF0ZWQgcmVjb21tZW5kYXRpb25zIG9uIHRoZSBVSS5cblx0ICogSXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5ncyB0byBwcm9wZXJ0aWVzIGluc2lkZSBhIGNvbXBsZXggcHJvcGVydHkgd2hpY2ggaXMgbmVlZGVkIGZvciByZWNvbW1lbmRhdGlvbnMuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3b3JrYXJvdW5kIHRvIG92ZXJjb21lIHRoZSBhYm92ZSB0d28gc2hvcnQgY29taW5ncyBhbmRcblx0ICogdG8gc3VwcG9ydCBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucyBmb3IgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gb2RhdGFNb2RlbCBUaGUgb2RhdGEgbW9kZWwgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSBmbkJpbmRQcm9wZXJ0eSBPcmlnaW5hbCBiaW5kIHByb3BlcnR5IG9mIHRoZSBvRGF0YU1vZGVsXG5cdCAqIEBwYXJhbSBwYXRoIEJpbmRpbmcgcGF0aCBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCBGbGFnIHdoaWNoIHRvZ2dsZXMgdGhlIHJlY29tbWVuZGF0aW9uIGZlYXR1cmVcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gcHJvcGVydHkgcGF0aCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIHRoZSBiaW5kaW5nUGF0aCBpcyByZWxldmFudCBvciBub3QgYmFzZWQgb24gbWV0YWRhdGEuXG5cdCAqL1xuXHRzZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmc6IGZ1bmN0aW9uIChcblx0XHRvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdGZuQmluZFByb3BlcnR5OiBGdW5jdGlvbixcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0cmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQ6IGJvb2xlYW5cblx0KTogUHJvcGVydHlCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocGF0aC5pbmNsdWRlcyhcInVpNS5mZS5yZWNvbW1lbmRhdGlvbnNcIikpIHtcblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uYmluZGluZyA9IG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKS5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdHNldENvbnRleHQ6IEZ1bmN0aW9uO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyA9IChvZGF0YVByb3BlcnR5QmluZGluZzogT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7IHNldENvbnRleHQ6IEZ1bmN0aW9uIH0pOiB2b2lkID0+IHtcblx0XHRcdFx0Ly93ZSBtYWtlIHN1cmUgdGhlIHBhcmVudCBjb250ZXh0IGlzIHNldCB0byB0aGUgcHJvcGVydHliaW5kaW5nXG5cdFx0XHRcdGNvbnN0IGZuU2V0Q29udGV4dCA9IHJlY29tbWVuZGF0aW9uYmluZGluZy5zZXRDb250ZXh0O1xuXHRcdFx0XHRpZiAoZm5TZXRDb250ZXh0KSB7XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25iaW5kaW5nLnNldENvbnRleHQgPSAobmV3Q29udGV4dDogQ29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmc/LnNldENvbnRleHQobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRmblNldENvbnRleHQuYmluZChvZGF0YVByb3BlcnR5QmluZGluZykobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRDb250ZXh0LmJpbmQocmVjb21tZW5kYXRpb25iaW5kaW5nKShuZXdDb250ZXh0KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgeyByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSwgaXNSZWNvbW1lbmRlZFByb3BlcnR5IH0gPSBNb2RlbEhlbHBlci52YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGgoXG5cdFx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0XHRwYXRoXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSAmJiBpc1JlY29tbWVuZGVkUHJvcGVydHkgJiYgIXJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWxyZWFkeUJvdW5kID0gb2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkuc29tZSgoZXhpc3RpbmdCaW5kaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQvLyBXZSBkbyBub3Qgd2FudCB0aGUgYmluZGluZyB0byB0aGUgY29tcGxleCBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIHRvbyBtYW55IHRpbWVzXG5cdFx0XHRcdFx0XHRcdC8vIGhlbmNlIHdlIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciB0aGUgY29udGV4dHMgYXJlIHNhbWUgb3Igbm90IGJlZm9yZSBjcmVhdGluZyBhIGJpbmRpbmcuXG5cdFx0XHRcdFx0XHRcdGNvbnRleHQgPT09IGV4aXN0aW5nQmluZGluZy5nZXRDb250ZXh0KCkgJiYgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPT09IGV4aXN0aW5nQmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKCFhbHJlYWR5Qm91bmQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9kYXRhUHJvcGVydHlCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nICYge1xuXHRcdFx0XHRcdFx0XHRzZXRDb250ZXh0OiBGdW5jdGlvbjtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHQvLyBCZWN1YXNlIHJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkgYW5kIG5vdCBhIHByaW1pdGl2ZSB0eXBlIGhlbmNlIHVzZSBhIHJhdyB0eXBlLlxuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0VHlwZShuZXcgUmF3KCksIFwiYW55XCIpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0QmluZGluZ01vZGUoQmluZGluZ01vZGUuT25lV2F5KTtcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2gob2RhdGFQcm9wZXJ0eUJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuYXR0YWNoQ2hhbmdlKChldmVudDogT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgbG9jYWwgYW5ub3RhdGlvbiBiaW5kaW5nIG9uY2UgcmVjb21tZW5kYXRpb24gYmluZGluZyBpcyB1cGRhdGVkLlxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUJpbmRpbmcgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudENvbnRleHQgPSBldmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgPSBwcm9wZXJ0eUJpbmRpbmcuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5zZXRSZWNvbW1lbmRhdGlvbnNPbkxvY2FsQW5ub3RhdGlvbk1vZGVsKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMsIGN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdC8vIHJldWVzdFZhbHVlIHdpbGwgYWRkIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSB0byB0aGUgJHNlbGVjdFxuXHRcdFx0XHRcdFx0Ly8gaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSAkc2VsZWN0IHdoZW4gY29uc3RydWN0aW5nIHRoZSBiaW5kaW5nIGF0IHZhcmlvdXMgcGxhY2VzIChmb3JtcywgdGFibGUgZXRjLilcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnJlcXVlc3RWYWx1ZSgpLmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJSZWNvbW1lbmRhdGlvbnMgY291bGQgbm90IGJlIHJlc29sdmVkXCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0c2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nKG9kYXRhUHJvcGVydHlCaW5kaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGJpbmRpbmcgYmVjb21lcyBpbnZhbGlkIGFuZCBhIG5ldyBiaW5kaW5nIGlzIGNyZWF0ZWQgc28gdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IGJpbmRpbmcgY2FuIGJlIGNyZWF0ZWQuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gRm9yIHRoaXMgd2UgbmVlZCB0byBvdmVycmlkZSB1cGRhdGVSZXF1aXJlZCBzbyB0aGF0IHRoZSBiaW5kaW5nIGlzIHVwZGF0ZWQgdW50aWwgaXQgaGFzIG5vdCByZWNlaXZlZCBhIGNvbnRleHRcblx0XHRcdC8vIHBvc3QgdGhhdCB3ZSBkbyBub3QgbmVlZCB0aGUgYmluZGluZyB0byBiZSB1cGRhdGVkLlxuXHRcdFx0Ly8gSWYgd2UgcmVtb3ZlIHRoZSB1cGRhdGVSZXF1aXJlZCBvdmVycmlkZSB0aGVuIHJlY29tbWVuZGF0aW9ucyB3b3JrIGZpbmUgYnkgZHVyaW5nIHNhdmUgb2YgYSBuZXdseSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyB3ZSBnZXQgYmluZGluZyByZWxhdGVkIGlzc3Vlcy5cblx0XHRcdC8vXG5cdFx0XHQvLyBVcGRhdGluZyB0aGUgYmluZGluZyB0byByZWNvbW1lbmRhdGlvbnMgd2lsbCBiZSBkb25lIGJ5IHNldFByb3BlcnR5IG9uIHRoZSBsb2NhbEFubm90YXRpb25Nb2RlbFxuXHRcdFx0Ly8gd2hlbiB0aGUgcmVjb21tZW5kYXRpb24gcHJvcGVydHkgaXMgYWN0dWFsbHkgdXBkYXRlZC5cblx0XHRcdHJlY29tbWVuZGF0aW9uYmluZGluZy51cGRhdGVSZXF1aXJlZCA9IGZ1bmN0aW9uIChtb2RlbDogb2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldENvbnRleHQoKSA/IG1vZGVsICYmIG1vZGVsID09PSBvZGF0YU1vZGVsIDogbW9kZWwgJiYgdGhpcy5nZXRNb2RlbCgpID09PSBtb2RlbDtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25iaW5kaW5nO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBiYXNlZCBvbiBtZXRhZGF0YSB3aGV0aGVyIGEgZ2l2ZW4gYmluZGluZyBzaG91bGQgZGVhbCB3aXRoIHJlY29tbWVuZGF0aW9ucyBvciBub3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkLlxuXHQgKiBAcGFyYW0gYmluZGluZ1BhdGggQmluZGluZyBwYXRoIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFJlY29tbWVuZGF0aW9uIHByb3BlcnR5IHBhdGggZm9yIHRoZSBlbnRpdHkgcmVsYXRlZCB0byB0aGUgY29udGV4dCBhbmQgd2hldGhlciB0aGUgYmluZGluZ1BhdGggaXMgcmVsZXZhbnQgb3Igbm90IGJhc2VkIG9uIG1ldGFkYXRhLlxuXHQgKi9cblx0dmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoOiBmdW5jdGlvbiAoXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0YmluZGluZ1BhdGg6IHN0cmluZ1xuXHQpOiB7IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGlzUmVjb21tZW5kZWRQcm9wZXJ0eTogYm9vbGVhbiB9IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGV4dE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0TWV0YVBhdGgpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPSAodGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJIGFzIEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSV9XaXRoX1JlY29tbWVuZGF0aW9ucylcblx0XHRcdD8uUmVjb21tZW5kYXRpb25zPy5wYXRoO1xuXHRcdC8vIHNhbXBsZSBiaW5kaW5nIC0gU2hpcHBpbmdDb25kaXRpb25AJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVxuXHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IGJpbmRpbmdQYXRoLnNwbGl0KFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zXCIpWzBdO1xuXHRcdGNvbnN0IGlzUmVjb21tZW5kZWRQcm9wZXJ0eSA9IHRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5zb21lKChlbnRpdHlQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKGVudGl0eVByb3BlcnR5Lm5hbWUgPT09IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0XHRcdHJldHVybiAoZW50aXR5UHJvcGVydHk/LnRhcmdldFR5cGUgYXMgQ29tcGxleFR5cGUpPy5wcm9wZXJ0aWVzLnNvbWUoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHkubmFtZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5LFxuXHRcdFx0aXNSZWNvbW1lbmRlZFByb3BlcnR5XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFVwZGF0ZSByZWNvbW1lbmRhdGlvbiBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgVXBkYXRlZCByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBjdXJyZW50Q29udGV4dCBDb250ZXh0IHdoZXJlIHJlY29tbWVuZGF0aW9uIHdhcyB1cGRhdGVkLlxuXHQgKi9cblx0c2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbDogZnVuY3Rpb24gKGNvbnRleHRSZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9ucywgY3VycmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gY3VycmVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25PYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRjb25zdCByZWplY3RlZFJlY29tbWVuZGF0aW9ucyA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5KFwiL3JlamVjdGVkUmVjb21tZW5kYXRpb25zXCIpIHx8IHt9O1xuXHRcdFx0Zm9yIChjb25zdCByZWNvbW1lbmRlZFByb3BlcnR5IGluIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMgPSBjb250ZXh0UmVjb21tZW5kYXRpb25zW3JlY29tbWVuZGVkUHJvcGVydHldO1xuXHRcdFx0XHRjb25zdCBsb2NhbE1vZGVsUGF0aCA9IHJlY29tbWVuZGVkUHJvcGVydHk7XG5cdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyVmFsdWVLZXkgPSBsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyVmFsdWVcIjtcblx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJEZXNjcmlwdGlvbktleSA9IGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJEZXNjcmlwdGlvblwiO1xuXHRcdFx0XHRjb25zdCB0eXBlQWhlYWRWYWx1ZXNLZXkgPSBsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnR5cGVBaGVhZFZhbHVlc1wiO1xuXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uT2JqW3R5cGVBaGVhZFZhbHVlc0tleV0gPSBbXTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UmVjb21tZW5kYXRpb24gb2YgcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkSXNTdWdnZXN0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbk9ialtwbGFjZWhvbGRlclZhbHVlS2V5XSA9IHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlO1xuXHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25PYmpbcGxhY2Vob2xkZXJEZXNjcmlwdGlvbktleV0gPSBwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGREZXNjcmlwdGlvbjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZFZhbHVlKSB7XG5cdFx0XHRcdFx0XHQocmVjb21tZW5kYXRpb25PYmpbdHlwZUFoZWFkVmFsdWVzS2V5XSBhcyBzdHJpbmdbXSkucHVzaChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMgfHwgIXByb3BlcnR5UmVjb21tZW5kYXRpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uT2JqW3BsYWNlaG9sZGVyVmFsdWVLZXldID0gbnVsbDtcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbk9ialtwbGFjZWhvbGRlckRlc2NyaXB0aW9uS2V5XSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJlY29tbWVuZGF0aW9uT2JqW1wicmVjb21tZW5kYXRpb25Db250ZXh0XCJdID0gY3VycmVudENvbnRleHQ7XG5cdFx0XHRpZiAoIXRoaXMuX2NvbXBhcmVSZWNvbW1lbmRhdGlvbnMocmVjb21tZW5kYXRpb25PYmosIHJlamVjdGVkUmVjb21tZW5kYXRpb25zW2N1cnJlbnRDb250ZXh0LmdldFBhdGgoKV0gfHwge30pKSB7XG5cdFx0XHRcdE9iamVjdC5rZXlzKHJlY29tbWVuZGF0aW9uT2JqKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoa2V5KTtcblx0XHRcdFx0XHQvLyBTZXQgdGhlIGZpbmFsIHZhbHVlIGF0IHRoZSBsYXN0IHBhdGhcblx0XHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShmdWxsUGF0aCwgcmVjb21tZW5kYXRpb25PYmpba2V5XSwgY3VycmVudENvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdF9jb21wYXJlUmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRyZWplY3RlZFJlY29tbWVuZGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25LZXlzID0gT2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25zKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInJlY29tbWVuZGF0aW9uQ29udGV4dFwiKTtcblx0XHRjb25zdCByZWplY3RlZFJlY29tbWVuZGF0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHJlamVjdGVkUmVjb21tZW5kYXRpb25zKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInJlY29tbWVuZGF0aW9uQ29udGV4dFwiKTtcblx0XHRpZiAocmVjb21tZW5kYXRpb25LZXlzLmxlbmd0aCAhPT0gcmVqZWN0ZWRSZWNvbW1lbmRhdGlvbktleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGZvciAoY29uc3Qga2V5IG9mIHJlY29tbWVuZGF0aW9uS2V5cykge1xuXHRcdFx0aWYgKCFyZWplY3RlZFJlY29tbWVuZGF0aW9uS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChrZXkuaW5jbHVkZXMoXCJ1aTUuZmUucmVjb21tZW5kYXRpb25zLnR5cGVBaGVhZFZhbHVlc1wiKSkge1xuXHRcdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcyA9IHJlY29tbWVuZGF0aW9uc1trZXldIGFzIHVua25vd25bXTtcblx0XHRcdFx0Y29uc3QgcmVqZWN0ZWRSZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcyA9IHJlamVjdGVkUmVjb21tZW5kYXRpb25zW2tleV0gYXMgdW5rbm93bltdO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IUFycmF5LmlzQXJyYXkocmVjb21tZW5kYXRpb25UeXBlQWhlYWRWYWx1ZXMpIHx8XG5cdFx0XHRcdFx0IUFycmF5LmlzQXJyYXkocmVqZWN0ZWRSZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcykgfHxcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcy5sZW5ndGggIT09IHJlamVjdGVkUmVjb21tZW5kYXRpb25UeXBlQWhlYWRWYWx1ZXMubGVuZ3RoIHx8XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25UeXBlQWhlYWRWYWx1ZXMuc29tZSgodmFsLCBpZHgpID0+IHZhbCAhPT0gcmVqZWN0ZWRSZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlc1tpZHhdKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocmVjb21tZW5kYXRpb25zW2tleV0gIT09IHJlamVjdGVkUmVjb21tZW5kYXRpb25zW2tleV0pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIFNlY29uZGFyeUtleXMgZnJvbSBlbnRpdHl0eXBlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVR5cGVcblx0ICogQHBhcmFtIGVudGl0eVNldCBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVNldFxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbHRlcm5hdGUga2V5c1xuXHQgKi9cblx0Z2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5czogKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGVudGl0eVNldDogRW50aXR5U2V0KTogc3RyaW5nW10gPT4ge1xuXHRcdGNvbnN0IGFsdGVybmF0ZUtleXM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgX2ZldGNoQWx0ZXJuYXRlS2V5cyA9IChlbnRpdHlUeXBlT3JTZXQ6IEVudGl0eVNldCB8IEVudGl0eVR5cGUpOiB2b2lkID0+IHtcblx0XHRcdGVudGl0eVR5cGVPclNldD8uYW5ub3RhdGlvbnM/LkNvcmU/LkFsdGVybmF0ZUtleXM/LmZvckVhY2goKGFsdGVybmF0ZUtleTogQWx0ZXJuYXRlS2V5KSA9PiB7XG5cdFx0XHRcdGFsdGVybmF0ZUtleS5LZXkuZm9yRWFjaCgoa2V5OiBQcm9wZXJ0eVJlZikgPT4ge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChrZXkuTmFtZS52YWx1ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBfZmV0Y2hTZWNvbmRhcnlLZXlzID0gKGVUOiBFbnRpdHlUeXBlKTogdm9pZCA9PiB7XG5cdFx0XHRlVD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2Vjb25kYXJ5S2V5Py5mb3JFYWNoKChzZWNvbmRhcnlLZXk6IFByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRpZiAoIWFsdGVybmF0ZUtleXMuaW5jbHVkZXMoc2Vjb25kYXJ5S2V5LnZhbHVlKSkge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChzZWNvbmRhcnlLZXkudmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdF9mZXRjaEFsdGVybmF0ZUtleXMoZW50aXR5U2V0KTtcblx0XHRpZiAoIWFsdGVybmF0ZUtleXMubGVuZ3RoKSB7XG5cdFx0XHRfZmV0Y2hBbHRlcm5hdGVLZXlzKGVudGl0eVR5cGUpO1xuXHRcdH1cblx0XHRfZmV0Y2hTZWNvbmRhcnlLZXlzKGVudGl0eVR5cGUpO1xuXHRcdHJldHVybiBhbHRlcm5hdGVLZXlzO1xuXHR9XG59O1xuXG50eXBlIFJlY29tbWVuZGF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29tbWVuZGF0aW9uRGV0YWlsc1tdPjtcbnR5cGUgUmVjb21tZW5kYXRpb25EZXRhaWxzID0ge1xuXHRSZWNvbW1lbmRlZEZpZWxkVmFsdWU6IHN0cmluZztcblx0UmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbjogYm9vbGVhbjtcblx0UmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHsgZ2V0TW9kZWwoKTogSlNPTk1vZGVsIH0gJiBCYXNlQ29udGV4dCAmIHtcblx0XHRzZXRQcm9wZXJ0eShzUGF0aDogc3RyaW5nLCB2VmFsdWU6IHVua25vd24pOiB2b2lkO1xuXHR9O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RlbEhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQUFBO0VBMENBO0VBQ0E7RUFDQTs7RUFPQSxNQUFNQSxXQUFXLEdBQUc7SUFDbkI7SUFDQTtJQUNBO0lBQ0FDLHlCQUF5QixFQUFFLEtBQUs7SUFDaEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVQyxTQUF5QixFQUFXO01BQ3ZFLE1BQU1DLGVBQWUs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
|
|
973
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlbEhlbHBlciIsImRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJtZXRhTW9kZWwiLCJlbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJlbnRpdHlTZXROYW1lIiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwicGF0aCIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVudEVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsImJJc0RyYWZ0Um9vdCIsImlzRHJhZnRSb290IiwiYklzRHJhZnROb2RlIiwiaXNEcmFmdE5vZGUiLCJiSXNEcmFmdFBhcmVudEVudGl0eUZvckNvbnRhaW5tZW50IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJEcmFmdFJvb3QiLCJEcmFmdE5vZGUiLCJoYXNJc0FjdGl2ZUVudGl0eUtleSIsInRhcmdldEVudGl0eVR5cGUiLCJrZXlzIiwic29tZSIsImtleSIsIm5hbWUiLCJpc01ldGFQYXRoRHJhZnRTdXBwb3J0ZWQiLCJnZXRDbG9zZXN0RW50aXR5U2V0IiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWRGcm9tQ29udmVydGVyQ29udGV4dCIsImNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZWRUeXBlcyIsImVudGl0eVNldHMiLCJlbnRpdHlTZXQiLCJTaGFyZUFjdGlvbiIsInVuZGVmaW5lZCIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwibWV0YU9iamVjdCIsInRlbXBsYXRlSW50ZXJmYWNlIiwib01ldGFNb2RlbCIsImNvbnRleHQiLCJnZXRNb2RlbCIsIl9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkIiwib0VudGl0eUNvbnRhaW5lciIsInNFbnRpdHlTZXQiLCJnZXREcmFmdFJvb3RQYXRoIiwib0NvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRSb290UGF0aCIsInNQYXRoIiwibW9kZWwiLCJmaXJzdEl0ZXJhdGlvbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNJdGVyYXRpb25QYXRoIiwiUmVnRXhwIiwiZXhlYyIsInNFbnRpdHlQYXRoIiwiZ2V0TWV0YVBhdGgiLCJtRGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0Q29udGV4dCIsImdldFBhdGgiLCJnZXRTdGlja3lSb290UGF0aCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZ2V0VGFyZ2V0RW50aXR5U2V0Iiwic0VudGl0eVNldFBhdGgiLCJnZXRFbnRpdHlTZXRQYXRoIiwib2RhdGFNZXRhTW9kZWwiLCJlbnRpdHlTZXRQYXRoIiwic3BsaXQiLCJmaWx0ZXIiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImpvaW4iLCJwYXRoUGFydHMiLCJpbml0aWFsUGF0aE9iamVjdCIsImdyb3dpbmdQYXRoIiwicGVuZGluZ05hdlByb3BCaW5kaW5nIiwicGF0aE9iamVjdCIsInJlZHVjZSIsInBhdGhVbmRlckNvbnN0cnVjdGlvbiIsInBhdGhQYXJ0IiwiaWR4IiwiZGVsaW1pdGVyIiwidGVtcFBhdGgiLCJuYXZQcm9wQmluZGluZ3MiLCJuYXZQcm9wQmluZGluZ1RvQ2hlY2siLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsInJlcGxhY2UiLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5TZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwiYmluZCIsInByb3BlcnR5UGF0aCIsInZhbHVlIiwiYkFzeW5jVXBkYXRlIiwicHJvcGVydHlQYXRoU3BsaXQiLCJzdGFydEluZGV4Iiwic3RhcnRzV2l0aCIsImkiLCJnZXRQcm9wZXJ0eSIsImZuQmluZENvbnRleHQiLCJiaW5kQ29udGV4dCIsIm1QYXJhbWV0ZXJzIiwib0V2ZW50cyIsImNvbnRleHRCaW5kaW5nIiwiYXBwbHkiLCJmbkdldEJvdW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm9Cb3VuZENvbnRleHQiLCJlbmhhbmNlVWlKU09OTW9kZWwiLCJ1aU1vZGVsIiwibGlicmFyeSIsImFzeW5jVXBkYXRlIiwiRWRpdE1vZGUiLCJFZGl0YWJsZSIsIkRpc3BsYXkiLCJlbmhhbmNlVmlld0pTT05Nb2RlbCIsInZpZXdNb2RlbCIsImZuR2V0T2JqZWN0IiwiX2dldE9iamVjdCIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImZpbHRlckZ1bmN0aW9ucyIsIl9maWx0ZXJGdW5jdGlvbnMiLCJpbmRleE9mIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwib01vZGVsIiwiZ2V0Um9vdEVudGl0eVNldFBhdGgiLCJjb250ZXh0UGF0aCIsInJvb3RFbnRpdHlTZXRQYXRoIiwiYVBhdGhzIiwiZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nIiwib1ZpZXciLCJ2TGlzdEJpbmRpbmciLCJzTWV0YVBhdGgiLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNSb290Q29udGV4dFBhdGgiLCJvQmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwic1Jvb3RCaW5kaW5nUGF0aCIsInNSZWxhdGl2ZVBhdGgiLCJnZXRSZWxhdGl2ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJwYXJlbnRDb250ZXh0IiwibGlzdEJpbmRpbmciLCJsaXN0QmluZGluZ0NvbnRleHQiLCJwYXJlbnRDb250ZXh0UGF0aCIsInZpZXdCaW5kaW5nTWV0YVBhdGgiLCJnZXREcmFmdFJvb3QiLCJnZXREcmFmdE5vZGUiLCJpc1N0aWNreSIsImdldFN0aWNreVNlc3Npb24iLCJpc1VwZGF0ZUhpZGRlbiIsImVudGl0eVR5cGUiLCJpc0VudGl0eVNldCIsIlVJIiwiVXBkYXRlSGlkZGVuIiwiZ2V0RGVsZXRlSGlkZGVuIiwiRGVsZXRlSGlkZGVuIiwiZ2V0QWJzb2x1dGVQYXRoRnJvbUxpc3RCaW5kaW5nIiwibWV0YW1vZGVsIiwibWV0YVBhdGgiLCJyb290QmluZGluZyIsInJvb3RCaW5kaW5nUGF0aCIsInJlbGF0aXZlUGF0aCIsImVuaGFuY2VPRGF0YU1vZGVsIiwib2RhdGFNb2RlbCIsImFwcENvbXBvbmVudCIsInZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeSIsIkFycmF5IiwiZm5NZXNzYWdlIiwic2V0TWVzc2FnZXMiLCJsb2NhbEFubm90YXRpb25Nb2RlbCIsIkpTT05Nb2RlbCIsInNldERlZmF1bHRCaW5kaW5nTW9kZSIsIkJpbmRpbmdNb2RlIiwiT25lV2F5IiwiYmFzZVNldFByb3BlcnR5IiwiYmFzZUdldFByb3BlcnR5IiwicHJvcGVydHlOYW1lIiwiYW5ub3RhdGlvblR5cGUiLCJpc1RyYW5zaWVudCIsImdldEluZGV4IiwiY29udGV4dE9iamVjdCIsIk1ldGFQYXRoIiwiY29udmVydFR5cGVzIiwiZXh0ZXJuYWxJZFByb3BlcnR5IiwiZ2V0TWV0YVBhdGhGb3JQYXRoIiwiZ2V0VGFyZ2V0IiwiRXh0ZXJuYWxJRCIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiZnVsbFBhdGgiLCJfcmVmcmVzaExvY2FsTW9kZWwiLCJyZWZyZXNoIiwiZXh0ZXJuYWxJZFByb3BQYXRoIiwicHJvcGVydGllc1RvUmVxdWVzdCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwidGV4dFByb3BlcnR5IiwiVGV4dCIsInRleHRQcm9wUGF0aCIsImluY2x1ZGVzIiwicHVzaCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInRoZW4iLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwicGF0aEZyb21Sb290IiwiY2xlYXJBbm5vdGF0aW9uVHlwZSIsImFubm90YXRpb25UeXBlcyIsImRhdGFTZXQiLCJpc0NvbnRleHQiLCJpc0EiLCJlbmRzV2l0aCIsIl9sb2NhbEFubm90YXRpb25Nb2RlbCIsImdldExvY2FsQW5ub3RhdGlvbk1vZGVsIiwibWVzc2FnZXMiLCJjbGVhbmVkRGF0YSIsImdldERhdGEiLCJzZXREYXRhIiwibWVzc2FnZVRhcmdldCIsImdldFR5cGUiLCJnZXRNZXNzYWdlIiwiZm5CaW5kUHJvcGVydHkiLCJiaW5kUHJvcGVydHkiLCJwYXJhbWV0ZXJzIiwicmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQiLCJnZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcyIsImdldENhcGFiaWxpdGllcyIsIkRpc2FibGVJbnB1dEFzc2lzdGFuY2UiLCJyZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyIsInNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyIsImludGVybmFsSWRQcm9wZXJ0eU5hbWUiLCJpbnRlcm5hbElkQmluZGluZyIsImV4dGVybmFsSURCaW5kaW5nIiwiZXh0ZXJuYWxJZFRleHRQcm9wZXJ0eSIsImV4dGVybmFsSURUZXh0QmluZGluZyIsImV4dGVybmFsSWRCaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwicmVxdWVzdFZhbHVlIiwicHJvcEJpbmRpbmciLCJ1cGRhdGVSZXF1aXJlZCIsImV4cHJlc3Npb24iLCJ2aWV3SWQiLCJnZXRWaXJ0dWFsQmluZGluZ0V4cHJlc3Npb24iLCJvd25lciIsIlVJNUVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdob3N0Q29udHJvbCIsIkFueSIsImFueSIsImNvbXBpbGVFeHByZXNzaW9uIiwiYmluZEJhY2tQcm9wZXJ0eSIsImdldENvbnRyb2xsZXIiLCJqc3giLCJnZXRGb3JtYXR0ZXJDb250ZXh0IiwiZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nIiwiZGVzdHJveSIsImZuU2V0Q29udGV4dCIsInNldENvbnRleHQiLCJuZXdDb250ZXh0Iiwic2V0QmluZGluZ0NvbnRleHQiLCJzZXRNb2RlbCIsImdob3N0QmluZGluZyIsImdldEJpbmRpbmdJbmZvIiwiYmluZGluZyIsImZuQ2hlY2tVcGRhdGUiLCJjaGVja1VwZGF0ZSIsImZvcmNlVXBkYXRlIiwiaXNDb250ZXh0TG9hZGVkIiwiZ2V0QmluZEJhY2tQcm9wZXJ0eSIsInZhbHVlSW5Mb2NhbEFubm90YXRpb24iLCJnZXRFeHRlcm5hbFZhbHVlIiwiZm5EZXN0cm95IiwidnBCaW5kaW5nIiwiZXZhbHVhdGVWaXJ0dWFsRXhwcmVzc2lvbiIsInByb21pc2VLZWVwZXIiLCJQcm9taXNlS2VlcGVyIiwiRGF0YVdhdGNoZXIiLCJ2YWx1ZUNoYW5nZWQiLCJldmVudCIsInJlc29sdmUiLCJnZXRQYXJhbWV0ZXIiLCJnZXRTb3VyY2UiLCJwcm9wZXJ0eUJpbmRpbmciLCJwcm9taXNlIiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsInRleHQiLCJtZXRhTW9kZWxQYXRoIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJhbm5vdGF0aW9uIiwidG9TdHJpbmciLCJlIiwiaW5mbyIsImdldE1lc3NhZ2VzUGF0aCIsIk1lc3NhZ2VzIiwicmVjb21tZW5kYXRpb25iaW5kaW5nIiwic2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nIiwib2RhdGFQcm9wZXJ0eUJpbmRpbmciLCJyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSIsImlzUmVjb21tZW5kZWRQcm9wZXJ0eSIsInZhbGlkYXRlUmVjb21tZW5kYXRpb25CaW5kaW5nUGF0aCIsImFscmVhZHlCb3VuZCIsImV4aXN0aW5nQmluZGluZyIsInNldFR5cGUiLCJSYXciLCJzZXRCaW5kaW5nTW9kZSIsImN1cnJlbnRDb250ZXh0IiwiY29udGV4dFJlY29tbWVuZGF0aW9ucyIsImdldFZhbHVlIiwic2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbCIsImJpbmRpbmdQYXRoIiwiY29udGV4dE1ldGFQYXRoIiwiUmVjb21tZW5kYXRpb25zIiwiZW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnR5IiwidGFyZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsInJlY29tbWVuZGF0aW9uT2JqIiwicmVqZWN0ZWRSZWNvbW1lbmRhdGlvbnMiLCJyZWNvbW1lbmRlZFByb3BlcnR5IiwicHJvcGVydHlSZWNvbW1lbmRhdGlvbnMiLCJsb2NhbE1vZGVsUGF0aCIsInBsYWNlaG9sZGVyVmFsdWVLZXkiLCJwbGFjZWhvbGRlckRlc2NyaXB0aW9uS2V5IiwidHlwZUFoZWFkVmFsdWVzS2V5IiwicHJvcGVydHlSZWNvbW1lbmRhdGlvbiIsIlJlY29tbWVuZGVkRmllbGRJc1N1Z2dlc3Rpb24iLCJSZWNvbW1lbmRlZEZpZWxkVmFsdWUiLCJSZWNvbW1lbmRlZEZpZWxkRGVzY3JpcHRpb24iLCJfY29tcGFyZVJlY29tbWVuZGF0aW9ucyIsImV4aXN0aW5nRGF0YSIsImNsZWFuZWRFeGlzdGluZ0RhdGEiLCJtZXJnZWREYXRhIiwicmVjb21tZW5kYXRpb25zIiwicmVjb21tZW5kYXRpb25LZXlzIiwicmVqZWN0ZWRSZWNvbW1lbmRhdGlvbktleXMiLCJyZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcyIsInJlamVjdGVkUmVjb21tZW5kYXRpb25UeXBlQWhlYWRWYWx1ZXMiLCJpc0FycmF5IiwidmFsIiwiZ2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5cyIsImFsdGVybmF0ZUtleXMiLCJfZmV0Y2hBbHRlcm5hdGVLZXlzIiwiZW50aXR5VHlwZU9yU2V0IiwiQ29yZSIsIkFsdGVybmF0ZUtleXMiLCJmb3JFYWNoIiwiYWx0ZXJuYXRlS2V5IiwiS2V5IiwiTmFtZSIsIl9mZXRjaFNlY29uZGFyeUtleXMiLCJlVCIsIlNlY29uZGFyeUtleSIsInNlY29uZGFyeUtleSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTW9kZWxIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXJzIHRvIGJlIHVzZWQgYXQgcnVudGltZSB0byByZXRyaWV2ZSBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBtb2RlbCAqL1xuaW1wb3J0IHR5cGUgeyBDb21wbGV4VHlwZSwgRW50aXR5U2V0LCBFbnRpdHlUeXBlLCBQcm9wZXJ0eSwgUHJvcGVydHlQYXRoLCBTaW5nbGV0b24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnROb2RlLCBEcmFmdFJvb3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBBbHRlcm5hdGVLZXksIFByb3BlcnR5UmVmIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db3JlXCI7XG5pbXBvcnQgdHlwZSB7IFN0aWNreVNlc3Npb25TdXBwb3J0ZWQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1Nlc3Npb25cIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlSGlkZGVuLCBVcGRhdGVIaWRkZW4gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlfRWRtXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnRpZXNPZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBBbnkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0FueVwiO1xuaW1wb3J0IERhdGFXYXRjaGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9EYXRhV2F0Y2hlclwiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvblBhcmFtZXRlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCBNZXRhUGF0aCBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhUGF0aFwiO1xuaW1wb3J0IFByb21pc2VLZWVwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUHJvbWlzZUtlZXBlclwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQsIGlzTmF2aWdhdGlvblByb3BlcnR5LCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQmluZGluZ01vZGUgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nTW9kZVwiO1xuaW1wb3J0IHR5cGUgQmFzZUNvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIFByb3BlcnR5QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL1Byb3BlcnR5QmluZGluZ1wiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgUmF3IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdHlwZS9SYXdcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT0RhdGFMaXN0QmluZGluZyB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhUHJvcGVydHlCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uL0FwcENvbXBvbmVudFwiO1xuXG4vLyBUT0RPOiBSaWdodCBub3cgcmVjb21tZW5kYXRpb25zIGlzIG5vdCBwYXJ0IG9mIHRoZSBVSSB2b2NhYnVsYXJ5LlxuLy8gaGVuY2Ugd2UgYXJlIGFkZGluZyBpdCB0byB0aGUgdHlwZS5cbi8vIG9uY2UgdGhpcyBiZWNvbWVzIHBhcnQgb2YgdGhlIFVJIHZvY2FidWxhcnkgdGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMuXG5leHBvcnQgdHlwZSBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUlfV2l0aF9SZWNvbW1lbmRhdGlvbnMgPSBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfVUkgJiB7XG5cdFJlY29tbWVuZGF0aW9ucz86IHtcblx0XHRwYXRoOiBzdHJpbmc7XG5cdH07XG59O1xuXG5jb25zdCBNb2RlbEhlbHBlciA9IHtcblx0Ly8gZ2xvYmFsIHN3aXRjaCB0byBkaXNhYmxlIHRoZSBjb2xsYWJvcmF0aW9uIGRyYWZ0IGJ5IGEgcHJpdmF0ZSBtYW5pZmVzdCBmbGFnXG5cdC8vIHRoaXMgYWxsb3dzIGN1c3RvbWVycyB0byBkaXNhYmxlIHRoZSBjb2xsYWJvcmF0aW9uIGRyYWZ0IGluIGNhc2Ugd2UgcnVuIGludG8gaXNzdWVzIHdpdGggdGhlIGZpcnN0IGRlbGl2ZXJ5XG5cdC8vIHRoaXMgd2lsbCBiZSByZW1vdmVkIHdpdGggdGhlIG5leHQgUy80IHJlbGVhc2Vcblx0ZGlzYWJsZUNvbGxhYm9yYXRpb25EcmFmdDogZmFsc2UsXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBzdGlja3kuXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgT0RhdGFNb2RlbE1ldGFNb2RlbCB0byBjaGVjayBmb3Igc3RpY2t5IGVuYWJsZWQgZW50aXR5XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiBzdGlja3ksIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBib29sZWFuIHtcblx0XHRjb25zdCBlbnRpdHlDb250YWluZXIgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRmb3IgKGNvbnN0IGVudGl0eVNldE5hbWUgaW4gZW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGVudGl0eUNvbnRhaW5lcltlbnRpdHlTZXROYW1lXS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlTZXROYW1lfUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRgKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIHByb2dyYW1taW5nIG1vZGVsIGlzIGRyYWZ0LlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgb2YgdGhlIGNvbnRleHQgZm9yIHdoaWNoIGRyYWZ0IHN1cHBvcnQgc2hhbGwgYmUgY2hlY2tlZFxuXHQgKiBAcGFyYW0gcGF0aCBQYXRoIGZvciB3aGljaCBkcmFmdCBzdXBwb3J0IHNoYWxsIGJlIGNoZWNrZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGRyYWZ0LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc0RyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAobWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGF0aCk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KG1ldGFDb250ZXh0KTtcblx0XHRyZXR1cm4gdGhpcy5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChvYmplY3RQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGRyYWZ0IGlzIHN1cHBvcnRlZCBmb3IgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGguXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBzdXBwb3J0ZWRcblx0ICovXG5cdGlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkOiBmdW5jdGlvbiAoZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0Y29uc3QgYklzRHJhZnRSb290ID0gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnROb2RlID0gTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY3VycmVudEVudGl0eVNldCk7XG5cdFx0Y29uc3QgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCA9XG5cdFx0XHRpc05hdmlnYXRpb25Qcm9wZXJ0eShkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCkgJiZcblx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Py5jb250YWluc1RhcmdldCAmJlxuXHRcdFx0KChkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldCk/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0XHQoZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQpPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUpXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdGNvbnN0IGhhc0lzQWN0aXZlRW50aXR5S2V5ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmtleXM/LnNvbWUoKGtleSkgPT4ga2V5Lm5hbWUgPT09IFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0cmV0dXJuIGJJc0RyYWZ0Um9vdCB8fCBiSXNEcmFmdE5vZGUgfHwgKCFjdXJyZW50RW50aXR5U2V0ICYmIGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgJiYgaGFzSXNBY3RpdmVFbnRpdHlLZXkpO1xuXHR9LFxuXG5cdGlzTWV0YVBhdGhEcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKGRhdGFNb2RlbE9iamVjdFBhdGg6IE1ldGFQYXRoPHVua25vd24+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGRhdGFNb2RlbE9iamVjdFBhdGguZ2V0Q2xvc2VzdEVudGl0eVNldCgpIGFzIEVudGl0eVNldDtcblx0XHRjb25zdCBiSXNEcmFmdFJvb3QgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjdXJyZW50RW50aXR5U2V0KTtcblx0XHRjb25zdCBiSXNEcmFmdE5vZGUgPSBNb2RlbEhlbHBlci5pc0RyYWZ0Tm9kZShjdXJyZW50RW50aXR5U2V0KTtcblx0XHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGEgU2hhcmVBY3Rpb24gaW4gYW55IEVudGl0eVNldCBvZiB0aGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYW5ub3RhdGlvbiBleGlzdHMuIEZhbHNlIG90aGVyd2lzZS5cblx0ICovXG5cdGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkRnJvbUNvbnZlcnRlckNvbnRleHQoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlZFR5cGVzKCkuZW50aXR5U2V0cy5zb21lKChlbnRpdHlTZXQpID0+IHtcblx0XHRcdHJldHVybiBlbnRpdHlTZXQuYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5TaGFyZUFjdGlvbiAhPT0gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzZXJ2aWNlLCBzdXBwb3J0cyBjb2xsYWJvcmF0aW9uIGRyYWZ0LlxuXHQgKiBAcGFyYW0gbWV0YU9iamVjdCBNZXRhT2JqZWN0IHRvIGJlIHVzZWQgZm9yIGRldGVybWluYXRpb25cblx0ICogQHBhcmFtIHRlbXBsYXRlSW50ZXJmYWNlIEFQSSBwcm92aWRlZCBieSBVSTUgdGVtcGxhdGluZyBpZiB1c2VkXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUludGVyZmFjZS5jb250ZXh0IENvbnRleHQgb2YgdGhlIHRlbXBsYXRlXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmljZSBzdXBwb3J0cyBjb2xsYWJvcmF0aW9uIGRyYWZ0LCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZDogZnVuY3Rpb24gKG1ldGFPYmplY3Q6IHVua25vd24sIHRlbXBsYXRlSW50ZXJmYWNlPzogeyBjb250ZXh0OiBDb250ZXh0IH0pOiBib29sZWFuIHtcblx0XHRpZiAoIU1vZGVsSGVscGVyLmRpc2FibGVDb2xsYWJvcmF0aW9uRHJhZnQpIHtcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSAodGVtcGxhdGVJbnRlcmZhY2U/LmNvbnRleHQ/LmdldE1vZGVsKCkgfHwgbWV0YU9iamVjdCkgYXMgT0RhdGFNZXRhTW9kZWwgJiB7XG5cdFx0XHRcdF9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHRpZiAob01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsLl9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0XHRcdGZvciAoY29uc3Qgc0VudGl0eVNldCBpbiBvRW50aXR5Q29udGFpbmVyKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRW50aXR5Q29udGFpbmVyW3NFbnRpdHlTZXRdLiRraW5kID09PSBcIkVudGl0eVNldFwiICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NFbnRpdHlTZXR9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvU2hhcmVBY3Rpb25gKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvTWV0YU1vZGVsLl9fJGZlSXNDb2xsYWJvcmF0aW9uRHJhZnRFbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b01ldGFNb2RlbC5fXyRmZUlzQ29sbGFib3JhdGlvbkRyYWZ0RW5hYmxlZCA9IGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIHBhdGggb2YgdGhlIERyYWZ0Um9vdCBwYXRoIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgY29udGV4dC5cblx0ICogQHBhcmFtIG9Db250ZXh0IE9kYXRhTW9kZWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBkcmFmdFJvb3QgZW50aXR5LCBvciB1bmRlZmluZWQgaWYgbm8gZHJhZnRSb290IGlzIGZvdW5kXG5cdCAqL1xuXHRnZXREcmFmdFJvb3RQYXRoOiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGdldFJvb3RQYXRoID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBmaXJzdEl0ZXJhdGlvbiA9IHRydWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0Y29uc3Qgc0l0ZXJhdGlvblBhdGggPSBmaXJzdEl0ZXJhdGlvbiA/IHNQYXRoIDogbmV3IFJlZ0V4cCgvLiooPz1cXC8pLykuZXhlYyhzUGF0aCk/LlswXTsgLy8gKlJlZ2V4IHRvIGdldCB0aGUgYW5jZXN0b3Jcblx0XHRcdGlmIChzSXRlcmF0aW9uUGF0aCAmJiBzSXRlcmF0aW9uUGF0aCAhPT0gXCIvXCIpIHtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNJdGVyYXRpb25QYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdGlmICgobURhdGFNb2RlbC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRyZXR1cm4gc0l0ZXJhdGlvblBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFJvb3RQYXRoKHNJdGVyYXRpb25QYXRoLCBtb2RlbCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXHRcdHJldHVybiBnZXRSb290UGF0aChvQ29udGV4dC5nZXRQYXRoKCksIG9Db250ZXh0LmdldE1vZGVsKCkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZ2V0IHRoZSBwYXRoIG9mIHRoZSBTdGlja3lSb290IHBhdGggYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgT2RhdGFNb2RlbCBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIFN0aWNreVJvb3QgZW50aXR5LCBvciB1bmRlZmluZWQgaWYgbm8gU3RpY2t5Um9vdCBpcyBmb3VuZFxuXHQgKi9cblx0Z2V0U3RpY2t5Um9vdFBhdGg6IGZ1bmN0aW9uIChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgZ2V0Um9vdFBhdGggPSBmdW5jdGlvbiAoc1BhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIGZpcnN0SXRlcmF0aW9uID0gdHJ1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRjb25zdCBzSXRlcmF0aW9uUGF0aCA9IGZpcnN0SXRlcmF0aW9uID8gc1BhdGggOiBuZXcgUmVnRXhwKC8uKig/PVxcLykvKS5leGVjKHNQYXRoKT8uWzBdOyAvLyAqUmVnZXggdG8gZ2V0IHRoZSBhbmNlc3RvclxuXHRcdFx0aWYgKG9NZXRhTW9kZWwgJiYgc0l0ZXJhdGlvblBhdGggJiYgc0l0ZXJhdGlvblBhdGggIT09IFwiL1wiKSB7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzSXRlcmF0aW9uUGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzRW50aXR5UGF0aCkpO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bURhdGFNb2RlbC5zdGFydGluZ0VudGl0eVNldCA9PT0gbURhdGFNb2RlbC50YXJnZXRFbnRpdHlTZXQgJiZcblx0XHRcdFx0XHQobURhdGFNb2RlbC50YXJnZXRFbnRpdHlTZXQgYXMgRW50aXR5U2V0KT8uYW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNJdGVyYXRpb25QYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRSb290UGF0aChzSXRlcmF0aW9uUGF0aCwgbW9kZWwsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fTtcblx0XHRyZXR1cm4gZ2V0Um9vdFBhdGgob0NvbnRleHQuZ2V0UGF0aCgpLCBvQ29udGV4dC5nZXRNb2RlbCgpKTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0IHdpdGggbmF2aWdhdGlvbiBwcm9wZXJ0eSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIHRhcmdldCBlbnRpdHkgc2V0IHdpbGwgYmUgZGV0ZXJtaW5lZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSB0YXJnZXQgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0VGFyZ2V0RW50aXR5U2V0OiBmdW5jdGlvbiAob0NvbnRleHQ6IEJhc2VDb250ZXh0KTogc3RyaW5nIHtcblx0XHRjb25zdCBzUGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRpZiAoXG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIka2luZFwiKSA9PT0gXCJFbnRpdHlTZXRcIiB8fFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiQWN0aW9uXCIgfHxcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIjAvJGtpbmRcIikgPT09IFwiQWN0aW9uXCJcblx0XHQpIHtcblx0XHRcdHJldHVybiBzUGF0aDtcblx0XHR9XG5cdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBNb2RlbEhlbHBlci5nZXRFbnRpdHlTZXRQYXRoKHNQYXRoKTtcblx0XHRyZXR1cm4gYC8ke29Db250ZXh0LmdldE9iamVjdChzRW50aXR5U2V0UGF0aCl9YDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBjb21wbGV0ZSBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0IHZpYSB1c2luZyBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuIE5vdGU6IFRvIGJlIHVzZWQgb25seSBhZnRlciB0aGUgbWV0YW1vZGVsIGhhcyBsb2FkZWQuXG5cdCAqIEBwYXJhbSBwYXRoIFBhdGggZm9yIHdoaWNoIGNvbXBsZXRlIGVudGl0eVNldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgZnJvbSBlbnRpdHlUeXBlIHBhdGhcblx0ICogQHBhcmFtIG9kYXRhTWV0YU1vZGVsIE1ldGFtb2RlbCB0byBiZSB1c2VkLihPcHRpb25hbCBpbiBub3JtYWwgc2NlbmFyaW9zLCBidXQgbmVlZGVkIGZvciBwYXJhbWV0ZXJpemVkIHNlcnZpY2Ugc2NlbmFyaW9zKVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGNvbXBsZXRlIHBhdGggdG8gdGhlIGVudGl0eSBzZXRcblx0ICovXG5cdGdldEVudGl0eVNldFBhdGg6IGZ1bmN0aW9uIChwYXRoOiBzdHJpbmcsIG9kYXRhTWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdGxldCBlbnRpdHlTZXRQYXRoID0gXCJcIjtcblx0XHRpZiAoIW9kYXRhTWV0YU1vZGVsKSB7XG5cdFx0XHQvLyBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBmb3IgZ2V0dGluZyBlbnRpdHlTZXRQYXRoIGZyb20gZW50aXR5VHlwZVBhdGhcblx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7cGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKE1vZGVsSGVscGVyLmZpbHRlck91dE5hdlByb3BCaW5kaW5nKS5qb2luKFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKX1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDYWxjdWxhdGluZyB0aGUgZW50aXR5U2V0UGF0aCBmcm9tIE1ldGFNb2RlbC5cblx0XHRcdGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihNb2RlbEhlbHBlci5maWx0ZXJPdXROYXZQcm9wQmluZGluZyk7XG5cdFx0XHRpZiAocGF0aFBhcnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0Y29uc3QgaW5pdGlhbFBhdGhPYmplY3QgPSB7XG5cdFx0XHRcdFx0Z3Jvd2luZ1BhdGg6IFwiL1wiLFxuXHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZzogXCJcIlxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGNvbnN0IHBhdGhPYmplY3QgPSBwYXRoUGFydHMucmVkdWNlKFxuXHRcdFx0XHRcdChwYXRoVW5kZXJDb25zdHJ1Y3Rpb246IHsgZ3Jvd2luZ1BhdGg6IHN0cmluZzsgcGVuZGluZ05hdlByb3BCaW5kaW5nOiBzdHJpbmcgfSwgcGF0aFBhcnQ6IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGRlbGltaXRlciA9ICghIWlkeCAmJiBcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy9cIikgfHwgXCJcIjtcblx0XHRcdFx0XHRcdGxldCB7IGdyb3dpbmdQYXRoLCBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgfSA9IHBhdGhVbmRlckNvbnN0cnVjdGlvbjtcblx0XHRcdFx0XHRcdGNvbnN0IHRlbXBQYXRoID0gZ3Jvd2luZ1BhdGggKyBkZWxpbWl0ZXI7XG5cdFx0XHRcdFx0XHRjb25zdCBuYXZQcm9wQmluZGluZ3MgPSBvZGF0YU1ldGFNb2RlbC5nZXRPYmplY3QodGVtcFBhdGgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbmF2UHJvcEJpbmRpbmdUb0NoZWNrID0gcGVuZGluZ05hdlByb3BCaW5kaW5nID8gYCR7cGVuZGluZ05hdlByb3BCaW5kaW5nfS8ke3BhdGhQYXJ0fWAgOiBwYXRoUGFydDtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0bmF2UHJvcEJpbmRpbmdzICYmXG5cdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKG5hdlByb3BCaW5kaW5ncykubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0XHRuYXZQcm9wQmluZGluZ3MuaGFzT3duUHJvcGVydHkobmF2UHJvcEJpbmRpbmdUb0NoZWNrKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGdyb3dpbmdQYXRoID0gdGVtcFBhdGggKyBuYXZQcm9wQmluZGluZ1RvQ2hlY2sucmVwbGFjZShcIi9cIiwgXCIlMkZcIik7XG5cdFx0XHRcdFx0XHRcdHBlbmRpbmdOYXZQcm9wQmluZGluZyA9IFwiXCI7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwZW5kaW5nTmF2UHJvcEJpbmRpbmcgKz0gcGVuZGluZ05hdlByb3BCaW5kaW5nID8gYC8ke3BhdGhQYXJ0fWAgOiBwYXRoUGFydDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiB7IGdyb3dpbmdQYXRoLCBwZW5kaW5nTmF2UHJvcEJpbmRpbmcgfTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGluaXRpYWxQYXRoT2JqZWN0XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0ZW50aXR5U2V0UGF0aCA9IHBhdGhPYmplY3QuZ3Jvd2luZ1BhdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbnRpdHlTZXRQYXRoID0gYC8ke3BhdGhQYXJ0c1swXX1gO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBlbnRpdHlTZXRQYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwYXRoIGZvciB0aGUgaXRlbXMgcHJvcGVydHkgb2YgTXVsdGlWYWx1ZUZpZWxkIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBvUGFyYW1ldGVyIEFjdGlvbiBQYXJhbWV0ZXJcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgY29tcGxldGUgbW9kZWwgcGF0aCBmb3IgdGhlIGl0ZW1zIHByb3BlcnR5IG9mIE11bHRpVmFsdWVGaWVsZCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aDogZnVuY3Rpb24gKG9QYXJhbWV0ZXI6IE1ldGFNb2RlbEFjdGlvblBhcmFtZXRlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIG9QYXJhbWV0ZXIgJiYgb1BhcmFtZXRlci4kTmFtZSA/IGB7cGF0aDogJ212ZnZpZXc+LyR7b1BhcmFtZXRlci4kTmFtZX0nfWAgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0ZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmc6IGZ1bmN0aW9uIChzUGF0aFBhcnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzUGF0aFBhcnQgIT09IFwiXCIgJiYgc1BhdGhQYXJ0ICE9PSBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCI7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYSBzZXRQcm9wZXJ0eSB0byB0aGUgY3JlYXRlZCBiaW5kaW5nIGNvbnRleHRzIG9mIHRoZSBpbnRlcm5hbCBKU09OIG1vZGVsLlxuXHQgKiBAcGFyYW0gSW50ZXJuYWwgSlNPTiBNb2RlbCB3aGljaCBpcyBlbmhhbmNlZFxuXHQgKi9cblxuXHRlbmhhbmNlSW50ZXJuYWxKU09OTW9kZWw6IGZ1bmN0aW9uIChvSW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsKTogdm9pZCB7XG5cdFx0Y29uc3QgZm5TZXRQcm9wZXJ0eSA9IG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5LmJpbmQob0ludGVybmFsTW9kZWwpO1xuXHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRcdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0XHR2YWx1ZTogdW5rbm93bixcblx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdFx0YkFzeW5jVXBkYXRlOiBib29sZWFuXG5cdFx0KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAob0NvbnRleHQgJiYgb0NvbnRleHQuZ2V0T2JqZWN0KCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQvLyBpbml0aWFsaXplXG5cdFx0XHRcdGZuU2V0UHJvcGVydHkob0NvbnRleHQuZ2V0UGF0aCgpLCB7fSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGhTcGxpdCA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRsZXQgcGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpID8/IFwiXCI7IC8vIFJlbW92ZSBzbGFzaCBpZiBpdCBpcyBhdCB0aGUgZW5kXG5cdFx0XHQvLyBsZXQncyBlbnN1cmUgdGhhdCBzdWIgb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWRcblx0XHRcdGNvbnN0IHN0YXJ0SW5kZXggPSBwcm9wZXJ0eVBhdGguc3RhcnRzV2l0aChcIi9cIikgPyAxIDogMDtcblx0XHRcdGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgcHJvcGVydHlQYXRoU3BsaXQubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdFx0XHRcdHBhdGggPSBgJHtwYXRofS8ke3Byb3BlcnR5UGF0aFNwbGl0W2ldfWA7XG5cdFx0XHRcdGlmICh0aGlzLmdldFByb3BlcnR5KHBhdGgsIG9Db250ZXh0KSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdGZuU2V0UHJvcGVydHkocGF0aCwge30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZm5TZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHZhbHVlLCBvQ29udGV4dCwgYkFzeW5jVXBkYXRlKTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuQmluZENvbnRleHQgPSBvSW50ZXJuYWxNb2RlbC5iaW5kQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbC5iaW5kQ29udGV4dCA9IGZ1bmN0aW9uIChcblx0XHRcdHNQYXRoOiBzdHJpbmcsXG5cdFx0XHRjb250ZXh0OiBCYXNlQ29udGV4dCxcblx0XHRcdG1QYXJhbWV0ZXJzOiBvYmplY3QgfCB1bmRlZmluZWQsXG5cdFx0XHRvRXZlbnRzOiBvYmplY3QgfCB1bmRlZmluZWRcblx0XHQpOiBDb250ZXh0QmluZGluZyB7XG5cdFx0XHRjb25zdCBjb250ZXh0QmluZGluZyA9IGZuQmluZENvbnRleHQuYXBwbHkodGhpcywgW3NQYXRoLCBjb250ZXh0LCBtUGFyYW1ldGVycywgb0V2ZW50c10pO1xuXHRcdFx0Y29uc3QgZm5HZXRCb3VuZENvbnRleHQgPSBjb250ZXh0QmluZGluZy5nZXRCb3VuZENvbnRleHQ7XG5cblx0XHRcdGNvbnRleHRCaW5kaW5nLmdldEJvdW5kQ29udGV4dCA9IGZ1bmN0aW9uICgpOiBCYXNlQ29udGV4dCB8IG51bGwge1xuXHRcdFx0XHRjb25zdCBvQm91bmRDb250ZXh0ID0gZm5HZXRCb3VuZENvbnRleHQuYXBwbHkodGhpcyk7XG5cdFx0XHRcdGlmIChvQm91bmRDb250ZXh0KSB7XG5cdFx0XHRcdFx0b0JvdW5kQ29udGV4dC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmdldE9iamVjdCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkodGhpcy5nZXRQYXRoKCksIHt9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aFNwbGl0ID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdFx0XHRcdGxldCBwYXRoID0gdGhpcy5nZXRQYXRoKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpOyAvLyBSZW1vdmUgc2xhc2ggaWYgaXQgaXMgYXQgdGhlIGVuZFxuXHRcdFx0XHRcdFx0Ly8gbGV0J3MgZW5zdXJlIHRoYXQgc3ViIG9iamVjdHMgYXJlIGluaXRpYWxpemVkXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5UGF0aFNwbGl0Lmxlbmd0aCAtIDE7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gYCR7cGF0aH0vJHtwcm9wZXJ0eVBhdGhTcGxpdFtpXX1gO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRNb2RlbCgpLmdldFByb3BlcnR5KHBhdGgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBpbml0aWFsaXplXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHBhdGgsIHt9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5nZXRNb2RlbCgpLnNldFByb3BlcnR5KHByb3BlcnR5UGF0aCwgdmFsdWUsIHRoaXMpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9Cb3VuZENvbnRleHQ7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIGNvbnRleHRCaW5kaW5nO1xuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkZHMgYW4gaGFuZGxlciBvbiBwcm9wZXJ0eUNoYW5nZS5cblx0ICogVGhlIHByb3BlcnR5IFwiL2VkaXRNb2RlXCIgaXMgY2hhbmdlZCBhY2NvcmRpbmcgdG8gcHJvcGVydHkgJy9pc0VkaXRhYmxlJyB3aGVuIHRoaXMgbGFzdCBvbmUgaXMgc2V0XG5cdCAqIGluIG9yZGVyIHRvIGJlIGNvbXBsaWFudCB3aXRoIGZvcm1lciB2ZXJzaW9ucyB3aGVyZSBidWlsZGluZyBibG9ja3MgdXNlIHRoZSBwcm9wZXJ0eSBcIi9lZGl0TW9kZVwiXG5cdCAqIEBwYXJhbSB1aU1vZGVsIEpTT04gTW9kZWwgd2hpY2ggaXMgZW5oYW5jZWRcblx0ICogQHBhcmFtIGxpYnJhcnkgQ29yZSBsaWJyYXJ5IG9mIFNBUCBGaW9yaSBlbGVtZW50c1xuXHQgKi9cblxuXHRlbmhhbmNlVWlKU09OTW9kZWw6IGZ1bmN0aW9uICh1aU1vZGVsOiBKU09OTW9kZWwsIGxpYnJhcnk6IHsgRWRpdE1vZGU6IHsgRWRpdGFibGU6IHN0cmluZzsgRGlzcGxheTogc3RyaW5nIH0gfSk6IHZvaWQge1xuXHRcdGNvbnN0IGZuU2V0UHJvcGVydHkgPSB1aU1vZGVsLnNldFByb3BlcnR5O1xuXHRcdHVpTW9kZWwuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdFx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0XHR2YWx1ZTogdW5rbm93bixcblx0XHRcdGNvbnRleHQ6IEJhc2VDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRcdFx0YXN5bmNVcGRhdGU6IGJvb2xlYW4gfCB1bmRlZmluZWRcblx0XHQpOiBib29sZWFuIHtcblx0XHRcdGlmIChwYXRoID09PSBcIi9pc0VkaXRhYmxlXCIpIHtcblx0XHRcdFx0dWlNb2RlbC5zZXRQcm9wZXJ0eShcIi9lZGl0TW9kZVwiLCB2YWx1ZSA/IGxpYnJhcnkuRWRpdE1vZGUuRWRpdGFibGUgOiBsaWJyYXJ5LkVkaXRNb2RlLkRpc3BsYXksIGNvbnRleHQsIGFzeW5jVXBkYXRlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmblNldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGVdKTtcblx0XHR9O1xuXHR9LFxuXG5cdGVuaGFuY2VWaWV3SlNPTk1vZGVsOiBmdW5jdGlvbiAodmlld01vZGVsOiBKU09OTW9kZWwgJiB7IF9nZXRPYmplY3Q6IEZ1bmN0aW9uIH0pOiB2b2lkIHtcblx0XHRjb25zdCBmbkdldE9iamVjdCA9IHZpZXdNb2RlbC5fZ2V0T2JqZWN0O1xuXHRcdHZpZXdNb2RlbC5fZ2V0T2JqZWN0ID0gZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCk6IHVua25vd24ge1xuXHRcdFx0aWYgKHNQYXRoID09PSB1bmRlZmluZWQgfHwgc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0c1BhdGggPSBcIi9cIjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmbkdldE9iamVjdC5hcHBseSh0aGlzLCBbc1BhdGgsIG9Db250ZXh0XSk7XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGEgbW9kZWxcblx0ICogQHBhcmFtIGZpbHRlckZ1bmN0aW9ucyBGaWx0ZXIgZnVuY3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgc2VydmljZVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zICdmYWxzZScgaWYgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuXHQgKi9cblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlOiBmdW5jdGlvbiAob01ldGFNb2RlbD86IE9EYXRhTWV0YU1vZGVsLCBmaWx0ZXJGdW5jdGlvbnM/OiBGaWx0ZXJGdW5jdGlvbnMgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IF9maWx0ZXJGdW5jdGlvbnMgPSBmaWx0ZXJGdW5jdGlvbnMgPz8gb01ldGFNb2RlbD8uZ2V0T2JqZWN0KFwiL0BPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkZpbHRlckZ1bmN0aW9uc1wiKTtcblxuXHRcdGlmICghX2ZpbHRlckZ1bmN0aW9ucykge1xuXHRcdFx0Ly8gaWYgbm8gZmlsdGVycyBmdW5jdGlvbiBkZWZpbmVkIGluIHNlcnZpY2UsIHdlIGFzc3VtZSB0aGF0IHRoZSBzZXJ2aWNlIGlzIGNhc2Ugc2Vuc2l0aXZlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gX2ZpbHRlckZ1bmN0aW9ucy5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTE7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIHVzZWRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgbWV0YXBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKi9cblx0Z2V0TWV0YVBhdGhGb3JDb250ZXh0OiBmdW5jdGlvbiAob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwgJiYgc1BhdGggJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBNZXRhUGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0UGF0aCBNZXRhUGF0aCB0byBiZSB1c2VkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHJvb3QgZW50aXR5IHNldCBwYXRoLlxuXHQgKi9cblx0Z2V0Um9vdEVudGl0eVNldFBhdGg6IGZ1bmN0aW9uIChjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRsZXQgcm9vdEVudGl0eVNldFBhdGggPSBcIlwiO1xuXHRcdGNvbnN0IGFQYXRocyA9IGNvbnRleHRQYXRoID8gY29udGV4dFBhdGguc3BsaXQoXCIvXCIpIDogW107XG5cdFx0aWYgKGFQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRyb290RW50aXR5U2V0UGF0aCA9IGFQYXRoc1sxXTtcblx0XHR9XG5cdFx0cmV0dXJuIHJvb3RFbnRpdHlTZXRQYXRoO1xuXHR9LFxuXHQvKipcblx0ICogR2V0IE1ldGFQYXRoIGZvciB0aGUgbGlzdEJpbmRpbmcuXG5cdCAqIEBwYXJhbSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIG1ldGFwYXRoIGZvciB0aGUgbGlzdGJpbmRpbmcuXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmc6IGZ1bmN0aW9uIChvVmlldzogRkVWaWV3LCB2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmchLmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9IG9CaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdFx0aWYgKHZMaXN0QmluZGluZy5nZXRDb250ZXh0KCkgPT09IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3NSb290QmluZGluZ1BhdGh9LyR7c1JlbGF0aXZlUGF0aH1gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL09uIHRoZSBjYXNlIG9mIGEgbXVsdGkgdmFsdWUgZmllbGQsIHRoZSBjb250ZXh0IG9mIHRoZSBsaXN0IGJpbmRpbmcgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB2aWV3IGJpbmRpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyB3ZSBoYXZlIHRvIGdldCB0aGUgbWV0YSBwYXRoIGZyb20gdGhlIGNvbnRleHQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpfS8ke3NSZWxhdGl2ZVBhdGh9YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc01ldGFQYXRoO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJlbGF0aXZlIG1ldGFQYXRoIGZyb20gdGhlIHZpZXcgZm9yIHRoZSBsaXN0QmluZGluZy5cblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgQ29udGV4dCBvZiB0aGUgdmlldyBvciB0aGUgcGFyZW50IGNvbnRyb2xcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBtZXRhUGF0aCBmb3IgdGhlIE9EYXRhTGlzdEJpbmRpbmcuXG5cdCAqL1xuXHRnZXRSZWxhdGl2ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcocGFyZW50Q29udGV4dDogQ29udGV4dCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nQ29udGV4dCA9IGxpc3RCaW5kaW5nLmdldENvbnRleHQoKTtcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0UGF0aCA9IHBhcmVudENvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0Ly9Gb3IgYWJzb2x1dGUgcGF0aCB3ZSByZXR1cm4gdW5kZWZpbmVkXG5cdFx0aWYgKCFsaXN0QmluZGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gaWYgdGhlIGxpc3QgYmluZGluZyBjb250ZXh0IGlzIHRoZSBwYXJlbnQgY29udGV4dCwgd2UgcmV0dXJuIHRoZSBsaXN0IGJpbmRpbmcgcGF0aFxuXHRcdGlmIChsaXN0QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpID09PSBwYXJlbnRDb250ZXh0UGF0aCkge1xuXHRcdFx0cmV0dXJuIGxpc3RCaW5kaW5nLmdldFBhdGgoKTtcblx0XHR9XG5cdFx0Ly8gaWYgdGhlIGxpc3QgYmluZGluZyBjb250ZXh0IGlzIG5vdCB0aGUgcGFyZW50IGNvbnRleHQsIHdlIHRyeSB0byBmaW5kIHRoZSByZWxhdGl2ZSBwYXRoXG5cdFx0aWYgKGxpc3RCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChwYXJlbnRDb250ZXh0UGF0aCkpIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ01ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhcmVudENvbnRleHRQYXRoKTtcblx0XHRcdHJldHVybiBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgobGlzdEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSl9LyR7bGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWAucmVwbGFjZShgJHt2aWV3QmluZGluZ01ldGFQYXRofS9gLCBcIlwiKTtcblx0XHR9XG5cdFx0Ly8gb3RoZXJ3aXNlLCB3ZSByZXR1cm4gdW5kZWZpbmVkIHNpbmNlIHRoZSBsaXN0IGJpbmRpbmcgaXMgbm90IHJlbGF0aXZlIHRvIHRoZSB2aWV3IGJpbmRpbmcgY29udGV4dFxuXHRcdHJldHVybjtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIGRyYWZ0IHJvb3QuXG5cdCAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkXG5cdCAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgcm9vdFxuXHQgKi9cblx0aXNEcmFmdFJvb3Q6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXREcmFmdFJvb3QoZW50aXR5U2V0KSAhPT0gdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgZHJhZnQgbm9kZS5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBkcmFmdCBub2RlXG5cdCAqL1xuXHRpc0RyYWZ0Tm9kZTogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldERyYWZ0Tm9kZShlbnRpdHlTZXQpICE9PSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBzdGlja3kgc2Vzc2lvbiByb290LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHN0aWNreSBzZXNzaW9uIHJvb3Rcblx0ICovXG5cdGlzU3RpY2t5OiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGlja3lTZXNzaW9uKGVudGl0eVNldCkgIT09IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiBlbnRpdHkgaXMgdXBkYXRhYmxlIG9yIG5vdC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHVwZGF0YWJsZSBlbHNlIGZhbHNlXG5cdCAqL1xuXHRpc1VwZGF0ZUhpZGRlbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogVXBkYXRlSGlkZGVuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdFx0cmV0dXJuIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uVXBkYXRlSGlkZGVuID8/IGVudGl0eVR5cGU/LmFubm90YXRpb25zLlVJPy5VcGRhdGVIaWRkZW47XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogR2V0cyB0aGUgQENvbW1vbi5EcmFmdFJvb3QgYW5ub3RhdGlvbiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gRW50aXR5U2V0LlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcmV0dXJucyBEcmFmdFJvb3Rcblx0ICovXG5cdGdldERyYWZ0Um9vdDogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5rbm93biB8IHVuZGVmaW5lZCk6IERyYWZ0Um9vdCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzRW50aXR5U2V0KGVudGl0eVNldCkgPyBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5EcmFmdFJvb3QgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIEBDb21tb24uRHJhZnROb2RlIGFubm90YXRpb24gaWYgdGhlIGFyZ3VtZW50IGlzIGFuIEVudGl0eVNldC5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgRHJhZnRSb290XG5cdCAqL1xuXHRnZXREcmFmdE5vZGU6IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVua25vd24gfCB1bmRlZmluZWQpOiBEcmFmdE5vZGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiBpc0VudGl0eVNldChlbnRpdHlTZXQpID8gZW50aXR5U2V0LmFubm90YXRpb25zLkNvbW1vbj8uRHJhZnROb2RlIDogdW5kZWZpbmVkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGlja3kgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmRlZmluZWRcblx0ICogQHJldHVybnMgU2Vzc2lvbiBTdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdCAqL1xuXHRnZXRTdGlja3lTZXNzaW9uOiBmdW5jdGlvbiAoZW50aXR5U2V0OiBFbnRpdHlTZXQgfCBTaW5nbGV0b24gfCB1bmtub3duIHwgdW5kZWZpbmVkKTogU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzRW50aXR5U2V0KGVudGl0eVNldCkgPyBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA6IHVuZGVmaW5lZDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBkZWxldGUgYnV0dG9uLlxuXHQgKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eVNldCB8IFNpbmdsZXRvbiB8IHVuZGVmaW5lZFxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHlUeXBlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgZGVsZXRlIGJ1dHRvbiBpcyBoaWRkZW5cblx0ICovXG5cdGdldERlbGV0ZUhpZGRlbjogZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogRGVsZXRlSGlkZGVuIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdFx0cmV0dXJuIGVudGl0eVNldC5hbm5vdGF0aW9ucy5VST8uRGVsZXRlSGlkZGVuID8/IGVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkRlbGV0ZUhpZGRlbjtcblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG1ldGFwYXRoIGZvciB0aGUgZ2l2ZW4gbGlzdCBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdEJpbmRpbmcuXG5cdCAqIEByZXR1cm5zIE1ldGFQYXRoXG5cdCAqL1xuXHRnZXRBYnNvbHV0ZVBhdGhGcm9tTGlzdEJpbmRpbmcobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG1ldGFtb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IG1ldGFQYXRoO1xuXHRcdGNvbnN0IHJvb3RCaW5kaW5nID0gbGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKTtcblx0XHRpZiAobGlzdEJpbmRpbmcgPT09IHJvb3RCaW5kaW5nKSB7XG5cdFx0XHRtZXRhUGF0aCA9IG1ldGFtb2RlbC5nZXRNZXRhUGF0aChsaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCByb290QmluZGluZ1BhdGggPSByb290QmluZGluZz8uZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0bWV0YVBhdGggPSBtZXRhbW9kZWwuZ2V0TWV0YVBhdGgoYCR7cm9vdEJpbmRpbmdQYXRofS8ke3JlbGF0aXZlUGF0aH1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1ldGFQYXRoO1xuXHR9LFxuXG5cdGVuaGFuY2VPRGF0YU1vZGVsKG9kYXRhTW9kZWw6IE9EYXRhTW9kZWwsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KTogdm9pZCB7XG5cdFx0b2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkgPSBuZXcgQXJyYXk8T0RhdGFQcm9wZXJ0eUJpbmRpbmc+KCk7XG5cdFx0Y29uc3QgZm5NZXNzYWdlID0gb2RhdGFNb2RlbC5zZXRNZXNzYWdlcztcblx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldERlZmF1bHRCaW5kaW5nTW9kZShCaW5kaW5nTW9kZS5PbmVXYXkpO1xuXHRcdGNvbnN0IGJhc2VTZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5O1xuXHRcdGNvbnN0IGJhc2VHZXRQcm9wZXJ0eSA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5O1xuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdW5rbm93biB7XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNvbnRleHQgJiZcblx0XHRcdFx0Y29udGV4dC5pc1RyYW5zaWVudCgpICE9PSB0cnVlICYmXG5cdFx0XHRcdChjb250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCB8fCBjb250ZXh0LmdldEluZGV4KCkhID49IDApICYmXG5cdFx0XHRcdGFubm90YXRpb25UeXBlID09PSBcIkBDb21tb24vRXh0ZXJuYWxJRFwiXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dE9iamVjdCA9IGNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGlmIChjb250ZXh0T2JqZWN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRcdGNvbnZlcnRUeXBlcyhvZGF0YU1vZGVsLmdldE1ldGFNb2RlbCgpKSxcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IG1ldGFQYXRoLmdldE1ldGFQYXRoRm9yUGF0aDxQcm9wZXJ0eT4obWV0YVBhdGguZ2V0UGF0aCgpICsgXCIvXCIgKyBwcm9wZXJ0eU5hbWUpPy5nZXRUYXJnZXQoKVxuXHRcdFx0XHRcdFx0LmFubm90YXRpb25zLkNvbW1vbj8uRXh0ZXJuYWxJRDtcblxuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRPYmplY3QoZXh0ZXJuYWxJZFByb3BlcnR5LnBhdGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRPYmplY3QocHJvcGVydHlOYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChjb250ZXh0ICYmIGFubm90YXRpb25UeXBlID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYmFzZUdldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCBjb250ZXh0XSk7XG5cdFx0fTtcblxuXHRcdGxvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgsIHZhbHVlLCBjb250ZXh0LCBhc3luY1VwZGF0ZSk6IGJvb2xlYW4ge1xuXHRcdFx0bGV0IGZ1bGxQYXRoID0gcGF0aDtcblx0XHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRcdGZ1bGxQYXRoID0gY29udGV4dC5nZXRQYXRoKHBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgX3JlZnJlc2hMb2NhbE1vZGVsID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBbcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uVHlwZV0gPSBwYXRoLnNwbGl0KFwiQCR1aTUuZmUuXCIpO1xuXHRcdFx0aWYgKGNvbnRleHQgJiYgYW5ub3RhdGlvblR5cGUgPT09IFwiQENvbW1vbi9FeHRlcm5hbElEXCIpIHtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcblx0XHRcdFx0Ly8gcmVmcmVzaGluZyBFeHRlcm5hbElEIGFuZCB0ZXh0IHByb3BlcnRpZXMgKHBhdGhzIG5lZWQgdG8gYmUgZGV0ZXJtaW5lZCBnZW5lcmljYWxseSlcblx0XHRcdFx0Y29uc3QgbWV0YVBhdGggPSBuZXcgTWV0YVBhdGg8RW50aXR5U2V0Pihcblx0XHRcdFx0XHRjb252ZXJ0VHlwZXMob2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKSksXG5cdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSksXG5cdFx0XHRcdFx0b2RhdGFNb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BlcnR5ID0gbWV0YVBhdGguZ2V0TWV0YVBhdGhGb3JQYXRoPFByb3BlcnR5PihtZXRhUGF0aC5nZXRQYXRoKCkgKyBcIi9cIiArIHByb3BlcnR5TmFtZSk/LmdldFRhcmdldCgpXG5cdFx0XHRcdFx0LmFubm90YXRpb25zLkNvbW1vbj8uRXh0ZXJuYWxJRDtcblxuXHRcdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZXh0ZXJuYWxJZFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wUGF0aCA9IGV4dGVybmFsSWRQcm9wZXJ0eS5wYXRoO1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBbZXh0ZXJuYWxJZFByb3BQYXRoLnN1YnN0cmluZygwLCBleHRlcm5hbElkUHJvcFBhdGgubGFzdEluZGV4T2YoXCIvXCIpKV07XG5cdFx0XHRcdFx0Y29uc3QgdGV4dFByb3BlcnR5ID0gbWV0YVBhdGguZ2V0TWV0YVBhdGhGb3JQYXRoPFByb3BlcnR5PihtZXRhUGF0aC5nZXRQYXRoKCkgKyBcIi9cIiArIGV4dGVybmFsSWRQcm9wUGF0aCk/LmdldFRhcmdldCgpXG5cdFx0XHRcdFx0XHQuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShleHRlcm5hbElkUHJvcFBhdGgsIHt9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHRleHRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRleHRQcm9wUGF0aCA9IHRleHRQcm9wZXJ0eS5wYXRoO1xuXHRcdFx0XHRcdFx0aWYgKHRleHRQcm9wUGF0aC5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydGllc1RvUmVxdWVzdC5wdXNoKHRleHRQcm9wUGF0aCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eSh0ZXh0UHJvcFBhdGgsIHt9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KGNvbnRleHQgYXMgT0RhdGFWNENvbnRleHQpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKHByb3BlcnRpZXNUb1JlcXVlc3QpXG5cdFx0XHRcdFx0XHQudGhlbihfcmVmcmVzaExvY2FsTW9kZWwpXG5cdFx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoU3BsaXQgPSBmdWxsUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHQvLyBsZXQncyBlbnN1cmUgdGhhdCBzdWIgb2JqZWN0cyBhcmUgaW5pdGlhbGl6ZWRcblx0XHRcdGxldCBwYXRoRnJvbVJvb3QgPSBcIlwiO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eVBhdGhTcGxpdC5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0cGF0aEZyb21Sb290ICs9IFwiL1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBhdGhGcm9tUm9vdCArPSBwcm9wZXJ0eVBhdGhTcGxpdFtpXTtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0T2JqZWN0KHBhdGhGcm9tUm9vdCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIGluaXRpYWxpemVcblx0XHRcdFx0XHR0aGlzLnNldFByb3BlcnR5KHBhdGhGcm9tUm9vdCwge30pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYmFzZVNldFByb3BlcnR5LmFwcGx5KHRoaXMsIFtwYXRoLCB2YWx1ZSwgY29udGV4dCwgYXN5bmNVcGRhdGVdKTtcblx0XHR9O1xuXHRcdGZ1bmN0aW9uIGNsZWFyQW5ub3RhdGlvblR5cGUoYW5ub3RhdGlvblR5cGVzOiBzdHJpbmdbXSwgZGF0YVNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBvYmplY3Qge1xuXHRcdFx0Zm9yIChjb25zdCBjb250ZXh0UGF0aCBpbiBkYXRhU2V0KSB7XG5cdFx0XHRcdC8vIHdlIGFkZGVkIGEgY29udGV4dCBmb3IgYWNjZXB0aW5nIHJlY29tbWVuZGF0aW9ucyBldmVudHVhbGx5LlxuXHRcdFx0XHQvLyB0aGUgY29udGV4dCBpcyBhIGRlZXBseSBuZXN0ZWQgb2JqZWN0IGl0ZXJhdGluZyBvdmVyIGl0IGNhdXNlIHRoZSBjb2RlIHRoZSBicmVha1xuXHRcdFx0XHQvLyBoZW5jZSB3ZSBhcmUgc2tpcHBpbmcgaXQgaGVyZS5cblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IGRhdGFTZXQ/Lltjb250ZXh0UGF0aF0gYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdGNvbnN0IGlzQ29udGV4dCA9IGNvbnRleHQ/LmlzQT8uKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIik7XG5cdFx0XHRcdGlmICh0eXBlb2YgY29udGV4dCA9PT0gXCJvYmplY3RcIiAmJiAhaXNDb250ZXh0KSB7XG5cdFx0XHRcdFx0ZGF0YVNldFtjb250ZXh0UGF0aF0gPSBjbGVhckFubm90YXRpb25UeXBlKGFubm90YXRpb25UeXBlcywgZGF0YVNldFtjb250ZXh0UGF0aF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXHRcdFx0XHRcdGlmIChkYXRhU2V0W2NvbnRleHRQYXRoXSAmJiBPYmplY3Qua2V5cyhkYXRhU2V0W2NvbnRleHRQYXRoXSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRhdGFTZXRbY29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGNvbnN0IGFubm90YXRpb25UeXBlIG9mIGFubm90YXRpb25UeXBlcykge1xuXHRcdFx0XHRcdGlmIChjb250ZXh0UGF0aC5lbmRzV2l0aChhbm5vdGF0aW9uVHlwZSkpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhU2V0W2NvbnRleHRQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBkYXRhU2V0O1xuXHRcdH1cblx0XHRvZGF0YU1vZGVsLl9sb2NhbEFubm90YXRpb25Nb2RlbCA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsO1xuXHRcdG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwgPSBmdW5jdGlvbiAoKTogSlNPTk1vZGVsIHtcblx0XHRcdHJldHVybiB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbDtcblx0XHR9O1xuXHRcdG9kYXRhTW9kZWwuc2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAobWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIE1lc3NhZ2VbXT4pOiB2b2lkIHtcblx0XHRcdGNvbnN0IGNsZWFuZWREYXRhID0gY2xlYXJBbm5vdGF0aW9uVHlwZShbXCJAJHVpNS5mZS5tZXNzYWdlVHlwZVwiLCBcIkAkdWk1LmZlLm1lc3NhZ2VUZXh0XCJdLCB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5nZXREYXRhKCkpO1xuXHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0RGF0YShjbGVhbmVkRGF0YSk7XG5cdFx0XHRmb3IgKGNvbnN0IG1lc3NhZ2VUYXJnZXQgaW4gbWVzc2FnZXMpIHtcblx0XHRcdFx0dGhpcy5fbG9jYWxBbm5vdGF0aW9uTW9kZWwuc2V0UHJvcGVydHkoYCR7bWVzc2FnZVRhcmdldH1AJHVpNS5mZS5tZXNzYWdlVHlwZWAsIG1lc3NhZ2VzW21lc3NhZ2VUYXJnZXRdWzBdLmdldFR5cGUoKSk7XG5cdFx0XHRcdHRoaXMuX2xvY2FsQW5ub3RhdGlvbk1vZGVsLnNldFByb3BlcnR5KGAke21lc3NhZ2VUYXJnZXR9QCR1aTUuZmUubWVzc2FnZVRleHRgLCBtZXNzYWdlc1ttZXNzYWdlVGFyZ2V0XVswXS5nZXRNZXNzYWdlKCkpO1xuXHRcdFx0fVxuXHRcdFx0Zm5NZXNzYWdlLmFwcGx5KHRoaXMsIFttZXNzYWdlc10pO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5CaW5kUHJvcGVydHkgPSBvZGF0YU1vZGVsLmJpbmRQcm9wZXJ0eS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuYmluZFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgY29udGV4dDogT0RhdGFWNENvbnRleHQsIHBhcmFtZXRlcnMpOiBPRGF0YVByb3BlcnR5QmluZGluZyB7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCA9IGFwcENvbXBvbmVudC5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXM/LigpLkRpc2FibGVJbnB1dEFzc2lzdGFuY2U7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyA9IE1vZGVsSGVscGVyLnNldFVwUmVjb21tZW5kYXRpb25Mb2NhbE1vZGVsQmluZGluZyhcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0Zm5CaW5kUHJvcGVydHksXG5cdFx0XHRcdHBhdGgsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uUHJvcGVydHlCaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiByZWNvbW1lbmRhdGlvblByb3BlcnR5QmluZGluZyBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblx0XHRcdH1cblx0XHRcdGlmIChwYXRoLmVuZHNXaXRoKFwiQCR1aTUuZmUuQENvbW1vbi9FeHRlcm5hbElEXCIpICYmIGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxJZFByb3BlcnR5TmFtZSA9IHBhdGguc3BsaXQoXCJAJHVpNS5mZS5cIilbMF07XG5cdFx0XHRcdGNvbnN0IGludGVybmFsSWRCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkoaW50ZXJuYWxJZFByb3BlcnR5TmFtZSwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFQYXRoID0gbmV3IE1ldGFQYXRoPEVudGl0eVNldD4oXG5cdFx0XHRcdFx0Y29udmVydFR5cGVzKG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0XHRcdG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BlcnR5ID0gbWV0YVBhdGhcblx0XHRcdFx0XHQuZ2V0TWV0YVBhdGhGb3JQYXRoPFByb3BlcnR5PihtZXRhUGF0aC5nZXRQYXRoKCkgKyBcIi9cIiArIGludGVybmFsSWRQcm9wZXJ0eU5hbWUpXG5cdFx0XHRcdFx0Py5nZXRUYXJnZXQoKS5hbm5vdGF0aW9ucy5Db21tb24/LkV4dGVybmFsSUQ7XG5cblx0XHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGV4dGVybmFsSWRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElEQmluZGluZyA9IGZuQmluZFByb3BlcnR5KGV4dGVybmFsSWRQcm9wZXJ0eS5wYXRoLCBjb250ZXh0KTtcblx0XHRcdFx0XHRvZGF0YU1vZGVsLnZpcnR1YWxQcm9wZXJ0eUJpbmRpbmdSZWdpc3RyeS5wdXNoKGV4dGVybmFsSURCaW5kaW5nKTtcblx0XHRcdFx0XHRjb25zdCBleHRlcm5hbElkVGV4dFByb3BlcnR5ID0gbWV0YVBhdGhcblx0XHRcdFx0XHRcdC5nZXRNZXRhUGF0aEZvclBhdGg8UHJvcGVydHk+KGV4dGVybmFsSURCaW5kaW5nLmdldENvbnRleHQoKT8uZ2V0UGF0aCgpICsgXCIvXCIgKyBleHRlcm5hbElkUHJvcGVydHkucGF0aClcblx0XHRcdFx0XHRcdD8uZ2V0VGFyZ2V0KCkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihleHRlcm5hbElkVGV4dFByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJRFRleHRCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkoZXh0ZXJuYWxJZFRleHRQcm9wZXJ0eS5wYXRoLCBjb250ZXh0KTtcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2goZXh0ZXJuYWxJRFRleHRCaW5kaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgZXh0ZXJuYWxJZEJpbmRpbmcgPSB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgdW5rbm93biBhcyBPRGF0YVByb3BlcnR5QmluZGluZztcblxuXHRcdFx0XHRpbnRlcm5hbElkQmluZGluZy5hdHRhY2hDaGFuZ2UoKCkgPT4ge1xuXHRcdFx0XHRcdGV4dGVybmFsSWRCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGludGVybmFsSWRCaW5kaW5nXG5cdFx0XHRcdFx0LnJlcXVlc3RWYWx1ZSgpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0ZXh0ZXJuYWxJZEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGV4dGVybmFsSWRCaW5kaW5nO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhdGguaW5jbHVkZXMoXCJAJHVpNS5mZS5cIikpIHtcblx0XHRcdFx0Y29uc3QgcHJvcEJpbmRpbmcgPSB0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdFx0c2V0Q29udGV4dD86IEZ1bmN0aW9uO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocGF0aC5lbmRzV2l0aChcIkAkdWk1LmZlLkBDb21tb24vRXh0ZXJuYWxJRFwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9wQmluZGluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRwcm9wQmluZGluZy51cGRhdGVSZXF1aXJlZCA9IGZ1bmN0aW9uIChtb2RlbDogb2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIG1vZGVsICYmIG1vZGVsID09PSBvZGF0YU1vZGVsO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAocGF0aC5pbmNsdWRlcyhcIkAkdWk1LmZlLnZpcnR1YWwuXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgeyBleHByZXNzaW9uLCB2aWV3SWQgfSA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRWaXJ0dWFsQmluZGluZ0V4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdFx0TWV0YU1vZGVsQ29udmVydGVyLmNvbnZlcnRUeXBlcyh0aGlzLmdldE1ldGFNb2RlbCgpKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3Qgb3duZXIgPSB2aWV3SWQgPyAoVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpIGFzIFZpZXcpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGdob3N0Q29udHJvbCA9IG5ldyBBbnkoXG5cdFx0XHRcdFx0XHR7IGFueTogY29tcGlsZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksIGJpbmRCYWNrUHJvcGVydHk6IHBhdGggfSxcblx0XHRcdFx0XHRcdG93bmVyPy5nZXRDb250cm9sbGVyKCkgPz8ganN4LmdldEZvcm1hdHRlckNvbnRleHQoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Y29uc3QgZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nID0gcHJvcEJpbmRpbmcuZGVzdHJveS5iaW5kKHByb3BCaW5kaW5nKTtcblx0XHRcdFx0XHRwcm9wQmluZGluZy5kZXN0cm95ID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0Z2hvc3RDb250cm9sPy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5EZXN0cm95UHJvcGVydHlCaW5kaW5nKCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmblNldENvbnRleHQgPSBwcm9wQmluZGluZy5zZXRDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChmblNldENvbnRleHQpIHtcblx0XHRcdFx0XHRcdHByb3BCaW5kaW5nLnNldENvbnRleHQgPSAobmV3Q29udGV4dDogQ29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHRnaG9zdENvbnRyb2w/LnNldEJpbmRpbmdDb250ZXh0KG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRDb250ZXh0LmJpbmQocHJvcEJpbmRpbmcpKG5ld0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnaG9zdENvbnRyb2wuc2V0TW9kZWwodGhpcyk7XG5cdFx0XHRcdFx0Y29uc3QgZ2hvc3RCaW5kaW5nID0gZ2hvc3RDb250cm9sLmdldEJpbmRpbmdJbmZvKFwiYW55XCIpPy5iaW5kaW5nO1xuXHRcdFx0XHRcdGNvbnN0IGZuQ2hlY2tVcGRhdGUgPSBnaG9zdEJpbmRpbmc/LmNoZWNrVXBkYXRlO1xuXHRcdFx0XHRcdGlmIChmbkNoZWNrVXBkYXRlKSB7XG5cdFx0XHRcdFx0XHRnaG9zdENvbnRyb2wuZ2V0QmluZGluZ0luZm8oXCJhbnlcIikuYmluZGluZy5jaGVja1VwZGF0ZSA9IChmb3JjZVVwZGF0ZTogYm9vbGVhbik6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGZvcmNlIHRoZSB1cGRhdGUgb25seSBpZiB0aGUgZ2hvc3QgY29udHJvbCBpcyBib3VuZCB0byBhIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbG9jYWwgYW5ub3RhdGlvbiBtb2RlbCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZXh0ZXJuYWwgdmFsdWUuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIGdob3N0IGNvbnRyb2wgaXMgdXBkYXRlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LlxuXHRcdFx0XHRcdFx0XHRjb25zdCBpc0NvbnRleHRMb2FkZWQgPSBnaG9zdENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0T2JqZWN0KCkgIT09IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZEJhY2tQcm9wZXJ0eSA9IGdob3N0Q29udHJvbC5nZXRCaW5kQmFja1Byb3BlcnR5KCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlSW5Mb2NhbEFubm90YXRpb24gPSBpc0NvbnRleHRMb2FkZWRcblx0XHRcdFx0XHRcdFx0XHQ/IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5KGdob3N0Q29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIS5nZXRQYXRoKGJpbmRCYWNrUHJvcGVydHkpKVxuXHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZm5DaGVja1VwZGF0ZS5iaW5kKGdob3N0QmluZGluZykoXG5cdFx0XHRcdFx0XHRcdFx0Zm9yY2VVcGRhdGUgfHxcblx0XHRcdFx0XHRcdFx0XHRcdChiaW5kQmFja1Byb3BlcnR5ICYmIGlzQ29udGV4dExvYWRlZCAmJiBnaG9zdEJpbmRpbmcuZ2V0RXh0ZXJuYWxWYWx1ZSgpICE9PSB2YWx1ZUluTG9jYWxBbm5vdGF0aW9uKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Z2hvc3RDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwcm9wQmluZGluZztcblx0XHRcdH1cblx0XHRcdHJldHVybiBmbkJpbmRQcm9wZXJ0eShwYXRoLCBjb250ZXh0LCBwYXJhbWV0ZXJzKTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuRGVzdHJveSA9IG9kYXRhTW9kZWwuZGVzdHJveS5iaW5kKG9kYXRhTW9kZWwpO1xuXHRcdG9kYXRhTW9kZWwuZGVzdHJveSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdGZvciAoY29uc3QgdnBCaW5kaW5nIG9mIG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5KSB7XG5cdFx0XHRcdHZwQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9sb2NhbEFubm90YXRpb25Nb2RlbC5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gZm5EZXN0cm95LmFwcGx5KHRoaXMpO1xuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlcyBhIHZpcnR1YWwgYmluZGluZyBleHByZXNzaW9uIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBwcm9taXNlLlxuXHQgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgdmlydHVhbCBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIGV2YWx1YXRpb25cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZXZhbHVhdGVkIHZhbHVlXG5cdCAqL1xuXHRhc3luYyBldmFsdWF0ZVZpcnR1YWxFeHByZXNzaW9uPFQ+KHBhdGg6IHN0cmluZywgY29udGV4dDogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPFQ+IHtcblx0XHRjb25zdCBwcm9taXNlS2VlcGVyID0gbmV3IFByb21pc2VLZWVwZXI8VD4oKTtcblx0XHRjb25zdCB7IGV4cHJlc3Npb24sIHZpZXdJZCB9ID0gTWV0YU1vZGVsQ29udmVydGVyLmdldFZpcnR1YWxCaW5kaW5nRXhwcmVzc2lvbihcblx0XHRcdHBhdGgsXG5cdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSlcblx0XHQpO1xuXHRcdGNvbnN0IG93bmVyID0gdmlld0lkID8gKFVJNUVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQodmlld0lkKSBhcyBWaWV3KSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBnaG9zdENvbnRyb2wgPSBuZXcgRGF0YVdhdGNoZXIoXG5cdFx0XHR7XG5cdFx0XHRcdHZhbHVlQ2hhbmdlZDogZnVuY3Rpb24gKGV2ZW50KTogdm9pZCB7XG5cdFx0XHRcdFx0cHJvbWlzZUtlZXBlci5yZXNvbHZlKGV2ZW50LmdldFBhcmFtZXRlcihcInZhbHVlXCIpIGFzIFQpO1xuXHRcdFx0XHRcdGV2ZW50LmdldFNvdXJjZSgpLmRlc3Ryb3koKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0cHJvcGVydHlCaW5kaW5nOiBjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uKVxuXHRcdFx0fSxcblx0XHRcdChvd25lcj8uZ2V0Q29udHJvbGxlcigpID8/IGpzeC5nZXRGb3JtYXR0ZXJDb250ZXh0KCkpIGFzIFByb3BlcnRpZXNPZjxEYXRhV2F0Y2hlcj5cblx0XHQpO1xuXHRcdGdob3N0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChjb250ZXh0KTtcblx0XHRnaG9zdENvbnRyb2wuc2V0TW9kZWwoY29udGV4dC5nZXRNb2RlbCgpKTtcblxuXHRcdHJldHVybiBwcm9taXNlS2VlcGVyLnByb21pc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIGEgbWV0YWRhdGEgYmluZGluZyB0byBpdHMgdGV4dCwgZWl0aGVyIHVzaW5nIHRoZSBjb252ZXJ0ZXJDb250ZXh0IG9yIHRoZSBtZXRhTW9kZWwgZGlyZWN0bHkuXG5cdCAqIEBwYXJhbSBwYXRoXG5cdCAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG5cdCAqIEBwYXJhbSBtZXRhTW9kZWxcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVkIHRleHQgaWYgcG9zc2libGUsIGVsc2UgdGhlIGlucHV0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGF0aCB3YXMgdW5kZWZpbmVkXG5cdCAqL1xuXHRmZXRjaFRleHRGcm9tTWV0YU1vZGVsKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dD86IENvbnZlcnRlckNvbnRleHQ8dW5rbm93bj4sIG1ldGFNb2RlbD86IE1ldGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IHRleHQgPSBwYXRoICE9PSB1bmRlZmluZWQgPyBwYXRoIDogXCJcIjtcblx0XHRpZiAocGF0aD8uc3RhcnRzV2l0aChcInttZXRhTW9kZWw+XCIpKSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWxQYXRoID0gcGF0aC5zdWJzdHJpbmcoMTEsIHBhdGgubGVuZ3RoIC0gMSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoY29udmVydGVyQ29udGV4dCkge1xuXHRcdFx0XHRcdHRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGVBbm5vdGF0aW9uKG1ldGFNb2RlbFBhdGgpLmFubm90YXRpb24/LnRvU3RyaW5nKCkgPz8gXCJcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0ZXh0ID0gbWV0YU1vZGVsPy5nZXRPYmplY3QobWV0YU1vZGVsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0TG9nLmluZm8oYFVuYWJsZSB0byByZXRyaWV2ZSB0ZXh0IGZyb20gbWV0YSBtb2RlbCB1c2luZyBwYXRoICR7bWV0YU1vZGVsUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRleHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgcGF0aCBjb3JyZXNwb25kaW5nIHRvIHN0YXRlIG1lc3NhZ2VzLlxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIFRoZSBtZXRhbW9kZWxcblx0ICogQHBhcmFtIGNvbnRleHRQYXRoIFBhdGggZm9yIHRoZSBjb250ZXh0IG9uIHdoaWNoIHdlIHdoYXQgdG8gcmV0cmVpdmUgdGhlIG1lc3NhZ2UgcGF0aFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoLCBvciB1bmRlZmluZWQgaWYgbm8gTWVzc2FnZXMgYW5ub3RhdGlvbiBpcyBkZWZpbmVkXG5cdCAqL1xuXHRnZXRNZXNzYWdlc1BhdGg6IGZ1bmN0aW9uIChtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLCBjb250ZXh0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0UGF0aCk7XG5cdFx0Y29uc3Qgb2JqZWN0UGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSBvYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5NZXNzYWdlcztcblx0XHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcblx0fSxcblx0LyoqXG5cdCAqIFNldHVwIHJlY29tbWVuZGF0aW9uIGxvY2FsIGJpbmRpbmcgdG8gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWNjZXNzaWJsZSB2aWEgY2xpZW50IHNpZGUgaW5zdGFuY2UgYW5ub3RhdGlvbnMuXG5cdCAqXG5cdCAqIFJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkuXG5cdCAqIE1vZGVsIGRvZXMgbm90IHByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gYmluZCB0byBjb21wbGV4IHByb3BlcnRpZXMuIEl0IGhhcyAyIG1ham9yIGxpbWl0YXRpb25zLlxuXHQgKlxuXHQgKiBJdCBvbmx5IHN1cHBvcnRzIG9uZSB0aW1lIGJpbmRpbmcgdG8gY29tcGxleCBwcm9wZXJ0aWVzLiBUaGlzIGlzIG5lZWRlZCB0byBzaG93IHVwZGF0ZWQgcmVjb21tZW5kYXRpb25zIG9uIHRoZSBVSS5cblx0ICogSXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5ncyB0byBwcm9wZXJ0aWVzIGluc2lkZSBhIGNvbXBsZXggcHJvcGVydHkgd2hpY2ggaXMgbmVlZGVkIGZvciByZWNvbW1lbmRhdGlvbnMuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3b3JrYXJvdW5kIHRvIG92ZXJjb21lIHRoZSBhYm92ZSB0d28gc2hvcnQgY29taW5ncyBhbmRcblx0ICogdG8gc3VwcG9ydCBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucyBmb3IgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gb2RhdGFNb2RlbCBUaGUgb2RhdGEgbW9kZWwgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSBmbkJpbmRQcm9wZXJ0eSBPcmlnaW5hbCBiaW5kIHByb3BlcnR5IG9mIHRoZSBvRGF0YU1vZGVsXG5cdCAqIEBwYXJhbSBwYXRoIEJpbmRpbmcgcGF0aCBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkZlYXR1cmVEaXNhYmxlZCBGbGFnIHdoaWNoIHRvZ2dsZXMgdGhlIHJlY29tbWVuZGF0aW9uIGZlYXR1cmVcblx0ICogQHJldHVybnMgUmVjb21tZW5kYXRpb24gcHJvcGVydHkgcGF0aCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIHRoZSBiaW5kaW5nUGF0aCBpcyByZWxldmFudCBvciBub3QgYmFzZWQgb24gbWV0YWRhdGEuXG5cdCAqL1xuXHRzZXRVcFJlY29tbWVuZGF0aW9uTG9jYWxNb2RlbEJpbmRpbmc6IGZ1bmN0aW9uIChcblx0XHRvZGF0YU1vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdGZuQmluZFByb3BlcnR5OiBGdW5jdGlvbixcblx0XHRwYXRoOiBzdHJpbmcsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0cmVjb21tZW5kYXRpb25GZWF0dXJlRGlzYWJsZWQ6IGJvb2xlYW5cblx0KTogUHJvcGVydHlCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocGF0aC5pbmNsdWRlcyhcInVpNS5mZS5yZWNvbW1lbmRhdGlvbnNcIikpIHtcblx0XHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uYmluZGluZyA9IG9kYXRhTW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKS5iaW5kUHJvcGVydHkocGF0aCwgY29udGV4dCkgYXMgT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7XG5cdFx0XHRcdHNldENvbnRleHQ6IEZ1bmN0aW9uO1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHNldENvbnRleHRPblJlY29tbWVuZGF0aW9uQmluZGluZyA9IChvZGF0YVByb3BlcnR5QmluZGluZzogT0RhdGFQcm9wZXJ0eUJpbmRpbmcgJiB7IHNldENvbnRleHQ6IEZ1bmN0aW9uIH0pOiB2b2lkID0+IHtcblx0XHRcdFx0Ly93ZSBtYWtlIHN1cmUgdGhlIHBhcmVudCBjb250ZXh0IGlzIHNldCB0byB0aGUgcHJvcGVydHliaW5kaW5nXG5cdFx0XHRcdGNvbnN0IGZuU2V0Q29udGV4dCA9IHJlY29tbWVuZGF0aW9uYmluZGluZy5zZXRDb250ZXh0O1xuXHRcdFx0XHRpZiAoZm5TZXRDb250ZXh0KSB7XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25iaW5kaW5nLnNldENvbnRleHQgPSAobmV3Q29udGV4dDogQ29udGV4dCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmc/LnNldENvbnRleHQobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRmblNldENvbnRleHQuYmluZChvZGF0YVByb3BlcnR5QmluZGluZykobmV3Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRDb250ZXh0LmJpbmQocmVjb21tZW5kYXRpb25iaW5kaW5nKShuZXdDb250ZXh0KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdFx0Y29uc3QgeyByZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSwgaXNSZWNvbW1lbmRlZFByb3BlcnR5IH0gPSBNb2RlbEhlbHBlci52YWxpZGF0ZVJlY29tbWVuZGF0aW9uQmluZGluZ1BhdGgoXG5cdFx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0XHRwYXRoXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChyZWNvbW1lbmRhdGlvbkNvbXBsZXhQcm9wZXJ0eSAmJiBpc1JlY29tbWVuZGVkUHJvcGVydHkgJiYgIXJlY29tbWVuZGF0aW9uRmVhdHVyZURpc2FibGVkKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWxyZWFkeUJvdW5kID0gb2RhdGFNb2RlbC52aXJ0dWFsUHJvcGVydHlCaW5kaW5nUmVnaXN0cnkuc29tZSgoZXhpc3RpbmdCaW5kaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQvLyBXZSBkbyBub3Qgd2FudCB0aGUgYmluZGluZyB0byB0aGUgY29tcGxleCBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIHRvbyBtYW55IHRpbWVzXG5cdFx0XHRcdFx0XHRcdC8vIGhlbmNlIHdlIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciB0aGUgY29udGV4dHMgYXJlIHNhbWUgb3Igbm90IGJlZm9yZSBjcmVhdGluZyBhIGJpbmRpbmcuXG5cdFx0XHRcdFx0XHRcdGNvbnRleHQgPT09IGV4aXN0aW5nQmluZGluZy5nZXRDb250ZXh0KCkgJiYgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPT09IGV4aXN0aW5nQmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0aWYgKCFhbHJlYWR5Qm91bmQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9kYXRhUHJvcGVydHlCaW5kaW5nID0gZm5CaW5kUHJvcGVydHkocmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHksIGNvbnRleHQpIGFzIE9EYXRhUHJvcGVydHlCaW5kaW5nICYge1xuXHRcdFx0XHRcdFx0XHRzZXRDb250ZXh0OiBGdW5jdGlvbjtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHQvLyBCZWN1YXNlIHJlY29tbWVuZGF0aW9ucyBpcyBhIGNvbXBsZXggcHJvcGVydHkgYW5kIG5vdCBhIHByaW1pdGl2ZSB0eXBlIGhlbmNlIHVzZSBhIHJhdyB0eXBlLlxuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0VHlwZShuZXcgUmF3KCksIFwiYW55XCIpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuc2V0QmluZGluZ01vZGUoQmluZGluZ01vZGUuT25lV2F5KTtcblx0XHRcdFx0XHRcdG9kYXRhTW9kZWwudmlydHVhbFByb3BlcnR5QmluZGluZ1JlZ2lzdHJ5LnB1c2gob2RhdGFQcm9wZXJ0eUJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0b2RhdGFQcm9wZXJ0eUJpbmRpbmcuYXR0YWNoQ2hhbmdlKChldmVudDogT0RhdGFQcm9wZXJ0eUJpbmRpbmckQ2hhbmdlRXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgbG9jYWwgYW5ub3RhdGlvbiBiaW5kaW5nIG9uY2UgcmVjb21tZW5kYXRpb24gYmluZGluZyBpcyB1cGRhdGVkLlxuXHRcdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eUJpbmRpbmcgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudENvbnRleHQgPSBldmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgPSBwcm9wZXJ0eUJpbmRpbmcuZ2V0VmFsdWUoKTtcblx0XHRcdFx0XHRcdFx0XHRNb2RlbEhlbHBlci5zZXRSZWNvbW1lbmRhdGlvbnNPbkxvY2FsQW5ub3RhdGlvbk1vZGVsKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMsIGN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbmJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdC8vIHJldWVzdFZhbHVlIHdpbGwgYWRkIHRoZSByZWNvbW1lbmRhdGlvbiBwcm9wZXJ0eSB0byB0aGUgJHNlbGVjdFxuXHRcdFx0XHRcdFx0Ly8gaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gYWRkIGl0IHRvIHRoZSAkc2VsZWN0IHdoZW4gY29uc3RydWN0aW5nIHRoZSBiaW5kaW5nIGF0IHZhcmlvdXMgcGxhY2VzIChmb3JtcywgdGFibGUgZXRjLilcblx0XHRcdFx0XHRcdG9kYXRhUHJvcGVydHlCaW5kaW5nLnJlcXVlc3RWYWx1ZSgpLmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJSZWNvbW1lbmRhdGlvbnMgY291bGQgbm90IGJlIHJlc29sdmVkXCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0c2V0Q29udGV4dE9uUmVjb21tZW5kYXRpb25CaW5kaW5nKG9kYXRhUHJvcGVydHlCaW5kaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGJpbmRpbmcgYmVjb21lcyBpbnZhbGlkIGFuZCBhIG5ldyBiaW5kaW5nIGlzIGNyZWF0ZWQgc28gdGhlIHJlY29tbWVuZGF0aW9uIHByb3BlcnR5IGJpbmRpbmcgY2FuIGJlIGNyZWF0ZWQuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gRm9yIHRoaXMgd2UgbmVlZCB0byBvdmVycmlkZSB1cGRhdGVSZXF1aXJlZCBzbyB0aGF0IHRoZSBiaW5kaW5nIGlzIHVwZGF0ZWQgdW50aWwgaXQgaGFzIG5vdCByZWNlaXZlZCBhIGNvbnRleHRcblx0XHRcdC8vIHBvc3QgdGhhdCB3ZSBkbyBub3QgbmVlZCB0aGUgYmluZGluZyB0byBiZSB1cGRhdGVkLlxuXHRcdFx0Ly8gSWYgd2UgcmVtb3ZlIHRoZSB1cGRhdGVSZXF1aXJlZCBvdmVycmlkZSB0aGVuIHJlY29tbWVuZGF0aW9ucyB3b3JrIGZpbmUgYnkgZHVyaW5nIHNhdmUgb2YgYSBuZXdseSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyB3ZSBnZXQgYmluZGluZyByZWxhdGVkIGlzc3Vlcy5cblx0XHRcdC8vXG5cdFx0XHQvLyBVcGRhdGluZyB0aGUgYmluZGluZyB0byByZWNvbW1lbmRhdGlvbnMgd2lsbCBiZSBkb25lIGJ5IHNldFByb3BlcnR5IG9uIHRoZSBsb2NhbEFubm90YXRpb25Nb2RlbFxuXHRcdFx0Ly8gd2hlbiB0aGUgcmVjb21tZW5kYXRpb24gcHJvcGVydHkgaXMgYWN0dWFsbHkgdXBkYXRlZC5cblx0XHRcdHJlY29tbWVuZGF0aW9uYmluZGluZy51cGRhdGVSZXF1aXJlZCA9IGZ1bmN0aW9uIChtb2RlbDogb2JqZWN0KTogYm9vbGVhbiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldENvbnRleHQoKSA/IG1vZGVsICYmIG1vZGVsID09PSBvZGF0YU1vZGVsIDogbW9kZWwgJiYgdGhpcy5nZXRNb2RlbCgpID09PSBtb2RlbDtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25iaW5kaW5nO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBiYXNlZCBvbiBtZXRhZGF0YSB3aGV0aGVyIGEgZ2l2ZW4gYmluZGluZyBzaG91bGQgZGVhbCB3aXRoIHJlY29tbWVuZGF0aW9ucyBvciBub3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgcmVjb21tZW5kYXRpb24gaXMgYmVpbmcgcmVxdWVzdGVkLlxuXHQgKiBAcGFyYW0gYmluZGluZ1BhdGggQmluZGluZyBwYXRoIGZvciB3aGljaCByZWNvbW1lbmRhdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFJlY29tbWVuZGF0aW9uIHByb3BlcnR5IHBhdGggZm9yIHRoZSBlbnRpdHkgcmVsYXRlZCB0byB0aGUgY29udGV4dCBhbmQgd2hldGhlciB0aGUgYmluZGluZ1BhdGggaXMgcmVsZXZhbnQgb3Igbm90IGJhc2VkIG9uIG1ldGFkYXRhLlxuXHQgKi9cblx0dmFsaWRhdGVSZWNvbW1lbmRhdGlvbkJpbmRpbmdQYXRoOiBmdW5jdGlvbiAoXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0YmluZGluZ1BhdGg6IHN0cmluZ1xuXHQpOiB7IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7IGlzUmVjb21tZW5kZWRQcm9wZXJ0eTogYm9vbGVhbiB9IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGV4dE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0TWV0YVBhdGgpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Db21wbGV4UHJvcGVydHkgPSAodGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJIGFzIEVudGl0eVR5cGVBbm5vdGF0aW9uc19VSV9XaXRoX1JlY29tbWVuZGF0aW9ucylcblx0XHRcdD8uUmVjb21tZW5kYXRpb25zPy5wYXRoO1xuXHRcdC8vIHNhbXBsZSBiaW5kaW5nIC0gU2hpcHBpbmdDb25kaXRpb25AJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJWYWx1ZVxuXHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IGJpbmRpbmdQYXRoLnNwbGl0KFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zXCIpWzBdO1xuXHRcdGNvbnN0IGlzUmVjb21tZW5kZWRQcm9wZXJ0eSA9IHRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5zb21lKChlbnRpdHlQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKGVudGl0eVByb3BlcnR5Lm5hbWUgPT09IHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0XHRcdHJldHVybiAoZW50aXR5UHJvcGVydHk/LnRhcmdldFR5cGUgYXMgQ29tcGxleFR5cGUpPy5wcm9wZXJ0aWVzLnNvbWUoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHkubmFtZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlY29tbWVuZGF0aW9uQ29tcGxleFByb3BlcnR5LFxuXHRcdFx0aXNSZWNvbW1lbmRlZFByb3BlcnR5XG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIFVwZGF0ZSByZWNvbW1lbmRhdGlvbiBjbGllbnQgc2lkZSBpbnN0YW5jZSBhbm5vdGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMgVXBkYXRlZCByZWNvbW1lbmRhdGlvbnMuXG5cdCAqIEBwYXJhbSBjdXJyZW50Q29udGV4dCBDb250ZXh0IHdoZXJlIHJlY29tbWVuZGF0aW9uIHdhcyB1cGRhdGVkLlxuXHQgKi9cblx0c2V0UmVjb21tZW5kYXRpb25zT25Mb2NhbEFubm90YXRpb25Nb2RlbDogZnVuY3Rpb24gKGNvbnRleHRSZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9ucywgY3VycmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gY3VycmVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25PYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRjb25zdCByZWplY3RlZFJlY29tbWVuZGF0aW9ucyA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldFByb3BlcnR5KFwiL3JlamVjdGVkUmVjb21tZW5kYXRpb25zXCIpIHx8IHt9O1xuXHRcdFx0Zm9yIChjb25zdCByZWNvbW1lbmRlZFByb3BlcnR5IGluIGNvbnRleHRSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlSZWNvbW1lbmRhdGlvbnMgPSBjb250ZXh0UmVjb21tZW5kYXRpb25zW3JlY29tbWVuZGVkUHJvcGVydHldO1xuXHRcdFx0XHRjb25zdCBsb2NhbE1vZGVsUGF0aCA9IHJlY29tbWVuZGVkUHJvcGVydHk7XG5cdFx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyVmFsdWVLZXkgPSBsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnBsYWNlaG9sZGVyVmFsdWVcIjtcblx0XHRcdFx0Y29uc3QgcGxhY2Vob2xkZXJEZXNjcmlwdGlvbktleSA9IGxvY2FsTW9kZWxQYXRoICsgXCJAJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMucGxhY2Vob2xkZXJEZXNjcmlwdGlvblwiO1xuXHRcdFx0XHRjb25zdCB0eXBlQWhlYWRWYWx1ZXNLZXkgPSBsb2NhbE1vZGVsUGF0aCArIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zLnR5cGVBaGVhZFZhbHVlc1wiO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlSZWNvbW1lbmRhdGlvbiBvZiBwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eVJlY29tbWVuZGF0aW9uLlJlY29tbWVuZGVkRmllbGRJc1N1Z2dlc3Rpb24pIHtcblx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uT2JqW3BsYWNlaG9sZGVyVmFsdWVLZXldID0gcHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWU7XG5cdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbk9ialtwbGFjZWhvbGRlckRlc2NyaXB0aW9uS2V5XSA9IHByb3BlcnR5UmVjb21tZW5kYXRpb24uUmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUpIHtcblx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uT2JqW3R5cGVBaGVhZFZhbHVlc0tleV0gPSByZWNvbW1lbmRhdGlvbk9ialt0eXBlQWhlYWRWYWx1ZXNLZXldIHx8IFtdO1xuXHRcdFx0XHRcdFx0KHJlY29tbWVuZGF0aW9uT2JqW3R5cGVBaGVhZFZhbHVlc0tleV0gYXMgc3RyaW5nW10pLnB1c2gocHJvcGVydHlSZWNvbW1lbmRhdGlvbi5SZWNvbW1lbmRlZEZpZWxkVmFsdWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXByb3BlcnR5UmVjb21tZW5kYXRpb25zIHx8ICFwcm9wZXJ0eVJlY29tbWVuZGF0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbk9ialtwbGFjZWhvbGRlclZhbHVlS2V5XSA9IG51bGw7XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25PYmpbcGxhY2Vob2xkZXJEZXNjcmlwdGlvbktleV0gPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWNvbW1lbmRhdGlvbk9ialtcInJlY29tbWVuZGF0aW9uQ29udGV4dFwiXSA9IGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0aWYgKCF0aGlzLl9jb21wYXJlUmVjb21tZW5kYXRpb25zKHJlY29tbWVuZGF0aW9uT2JqLCByZWplY3RlZFJlY29tbWVuZGF0aW9uc1tjdXJyZW50Q29udGV4dC5nZXRQYXRoKCldIHx8IHt9KSkge1xuXHRcdFx0XHQvLyBHZXQgZXhpc3RpbmcgZGF0YSBmcm9tIHRoZSBsb2NhbCBhbm5vdGF0aW9uIG1vZGVsIGZvciB0aGUgY3VycmVudCBjb250ZXh0IHBhdGhcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdEYXRhID0gbG9jYWxBbm5vdGF0aW9uTW9kZWwuZ2V0UHJvcGVydHkoY3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB8fCB7fTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYWxsIGtleXMgdGhhdCBpbmNsdWRlIFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zXCIgZnJvbSBleGlzdGluZyBkYXRhXG5cdFx0XHRcdGNvbnN0IGNsZWFuZWRFeGlzdGluZ0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIGV4aXN0aW5nRGF0YSkge1xuXHRcdFx0XHRcdGlmICgha2V5LmluY2x1ZGVzKFwiQCR1aTUuZmUucmVjb21tZW5kYXRpb25zXCIpKSB7XG5cdFx0XHRcdFx0XHRjbGVhbmVkRXhpc3RpbmdEYXRhW2tleV0gPSBleGlzdGluZ0RhdGFba2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNZXJnZSBjbGVhbmVkIGV4aXN0aW5nIGRhdGEgd2l0aCBuZXcgcmVjb21tZW5kYXRpb24gZGF0YVxuXHRcdFx0XHRjb25zdCBtZXJnZWREYXRhID0geyAuLi5jbGVhbmVkRXhpc3RpbmdEYXRhLCAuLi5yZWNvbW1lbmRhdGlvbk9iaiB9O1xuXG5cdFx0XHRcdC8vIG1ha2Ugc3VyZSB0byBzZXQgdGhlIHJlY29tbWVuZGF0aW9ucyBvbiB0aGUgY3VycmVudCBjb250ZXh0IHBhdGggc28gdGhhdCBvbGQgcmVjb21tZW5kYXRpb25zIGFyZSBvdmVycmlkZGVuIGFuZCBzb21lIHN0YWxlIGRhdGEgaXMgbm90IHNob3duLlxuXHRcdFx0XHRsb2NhbEFubm90YXRpb25Nb2RlbC5zZXRQcm9wZXJ0eShjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksIG1lcmdlZERhdGEsIGN1cnJlbnRDb250ZXh0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdF9jb21wYXJlUmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRyZWplY3RlZFJlY29tbWVuZGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25LZXlzID0gT2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25zKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInJlY29tbWVuZGF0aW9uQ29udGV4dFwiKTtcblx0XHRjb25zdCByZWplY3RlZFJlY29tbWVuZGF0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHJlamVjdGVkUmVjb21tZW5kYXRpb25zKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInJlY29tbWVuZGF0aW9uQ29udGV4dFwiKTtcblx0XHRpZiAocmVjb21tZW5kYXRpb25LZXlzLmxlbmd0aCAhPT0gcmVqZWN0ZWRSZWNvbW1lbmRhdGlvbktleXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGZvciAoY29uc3Qga2V5IG9mIHJlY29tbWVuZGF0aW9uS2V5cykge1xuXHRcdFx0aWYgKCFyZWplY3RlZFJlY29tbWVuZGF0aW9uS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmIChrZXkuaW5jbHVkZXMoXCJ1aTUuZmUucmVjb21tZW5kYXRpb25zLnR5cGVBaGVhZFZhbHVlc1wiKSkge1xuXHRcdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcyA9IHJlY29tbWVuZGF0aW9uc1trZXldIGFzIHVua25vd25bXTtcblx0XHRcdFx0Y29uc3QgcmVqZWN0ZWRSZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcyA9IHJlamVjdGVkUmVjb21tZW5kYXRpb25zW2tleV0gYXMgdW5rbm93bltdO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IUFycmF5LmlzQXJyYXkocmVjb21tZW5kYXRpb25UeXBlQWhlYWRWYWx1ZXMpIHx8XG5cdFx0XHRcdFx0IUFycmF5LmlzQXJyYXkocmVqZWN0ZWRSZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcykgfHxcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlcy5sZW5ndGggIT09IHJlamVjdGVkUmVjb21tZW5kYXRpb25UeXBlQWhlYWRWYWx1ZXMubGVuZ3RoIHx8XG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25UeXBlQWhlYWRWYWx1ZXMuc29tZSgodmFsLCBpZHgpID0+IHZhbCAhPT0gcmVqZWN0ZWRSZWNvbW1lbmRhdGlvblR5cGVBaGVhZFZhbHVlc1tpZHhdKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocmVjb21tZW5kYXRpb25zW2tleV0gIT09IHJlamVjdGVkUmVjb21tZW5kYXRpb25zW2tleV0pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIFNlY29uZGFyeUtleXMgZnJvbSBlbnRpdHl0eXBlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVR5cGVcblx0ICogQHBhcmFtIGVudGl0eVNldCBEYXRhbW9kZWwgb2JqZWN0IG9mIGVudGl0eVNldFxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbHRlcm5hdGUga2V5c1xuXHQgKi9cblx0Z2V0QWx0ZXJuYXRlQW5kU2Vjb25kYXJ5S2V5czogKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGVudGl0eVNldDogRW50aXR5U2V0KTogc3RyaW5nW10gPT4ge1xuXHRcdGNvbnN0IGFsdGVybmF0ZUtleXM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgX2ZldGNoQWx0ZXJuYXRlS2V5cyA9IChlbnRpdHlUeXBlT3JTZXQ6IEVudGl0eVNldCB8IEVudGl0eVR5cGUpOiB2b2lkID0+IHtcblx0XHRcdGVudGl0eVR5cGVPclNldD8uYW5ub3RhdGlvbnM/LkNvcmU/LkFsdGVybmF0ZUtleXM/LmZvckVhY2goKGFsdGVybmF0ZUtleTogQWx0ZXJuYXRlS2V5KSA9PiB7XG5cdFx0XHRcdGFsdGVybmF0ZUtleS5LZXkuZm9yRWFjaCgoa2V5OiBQcm9wZXJ0eVJlZikgPT4ge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChrZXkuTmFtZS52YWx1ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBfZmV0Y2hTZWNvbmRhcnlLZXlzID0gKGVUOiBFbnRpdHlUeXBlKTogdm9pZCA9PiB7XG5cdFx0XHRlVD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2Vjb25kYXJ5S2V5Py5mb3JFYWNoKChzZWNvbmRhcnlLZXk6IFByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRpZiAoIWFsdGVybmF0ZUtleXMuaW5jbHVkZXMoc2Vjb25kYXJ5S2V5LnZhbHVlKSkge1xuXHRcdFx0XHRcdGFsdGVybmF0ZUtleXMucHVzaChzZWNvbmRhcnlLZXkudmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdF9mZXRjaEFsdGVybmF0ZUtleXMoZW50aXR5U2V0KTtcblx0XHRpZiAoIWFsdGVybmF0ZUtleXMubGVuZ3RoKSB7XG5cdFx0XHRfZmV0Y2hBbHRlcm5hdGVLZXlzKGVudGl0eVR5cGUpO1xuXHRcdH1cblx0XHRfZmV0Y2hTZWNvbmRhcnlLZXlzKGVudGl0eVR5cGUpO1xuXHRcdHJldHVybiBhbHRlcm5hdGVLZXlzO1xuXHR9XG59O1xuXG50eXBlIFJlY29tbWVuZGF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIFJlY29tbWVuZGF0aW9uRGV0YWlsc1tdPjtcbnR5cGUgUmVjb21tZW5kYXRpb25EZXRhaWxzID0ge1xuXHRSZWNvbW1lbmRlZEZpZWxkVmFsdWU6IHN0cmluZztcblx0UmVjb21tZW5kZWRGaWVsZElzU3VnZ2VzdGlvbjogYm9vbGVhbjtcblx0UmVjb21tZW5kZWRGaWVsZERlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IHsgZ2V0TW9kZWwoKTogSlNPTk1vZGVsIH0gJiBCYXNlQ29udGV4dCAmIHtcblx0XHRzZXRQcm9wZXJ0eShzUGF0aDogc3RyaW5nLCB2VmFsdWU6IHVua25vd24sIGNvbnRleHQ/OiBDb250ZXh0LCBhc3luY1VwZGF0ZT86IGJvb2xlYW4pOiB2b2lkO1xuXHR9O1xuXG5leHBvcnQgZGVmYXVsdCBNb2RlbEhlbHBlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQUFBO0VBMENBO0VBQ0E7RUFDQTs7RUFPQSxNQUFNQSxXQUFXLEdBQUc7SUFDbkI7SUFDQTtJQUNBO0lBQ0FDLHlCQUF5QixFQUFFLEtBQUs7SUFDaEM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyx3QkFBd0IsRUFBRSxTQUFBQSxDQUFVQyxTQUF5QixFQUFXO01BQ3ZFLE1BQU1DLGVBQWUsR0FBR0QsU0FBUyxDQUFDRSxTQUFTLENBQUMsR0FBRyxDQUFDO01BQ2hELEtBQUssTUFBTUMsYUFBYSxJQUFJRixlQUFlLEVBQUU7UUFDNUMsSUFDQ0EsZUFBZSxDQUFDRSxhQUFhLENBQUMsQ0FBQ0MsS0FBSyxLQUFLLFdBQVcsSUFDcERKLFNBQVMsQ0FBQ0UsU0FBUyxDQUFDLElBQUlDLGFBQWEseURBQXlELENBQUMsRUFDOUY7VUFDRCxPQUFPLElBQUk7UUFDWjtNQUNEO01BQ0EsT0FBTyxLQUFLO0lBQ2IsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDRSxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVTCxTQUF5QixFQUFFTSxJQUFZLEVBQVc7TUFDN0UsTUFBTUMsV0FBVyxHQUFHUCxTQUFTLENBQUNRLGNBQWMsQ0FBQ0YsSUFBSSxDQUFDO01BQ2xELE1BQU1HLFVBQVUsR0FBR0MsMkJBQTJCLENBQXdCSCxXQUFXLENBQUM7TUFDbEYsT0FBTyxJQUFJLENBQUNJLDBCQUEwQixDQUFDRixVQUFVLENBQUM7SUFDbkQsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FB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
|