@sapui5/sap.fe.core 1.112.0 → 1.114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime-dbg.js +70 -6
- package/src/sap/fe/core/ActionRuntime.js +1 -1
- package/src/sap/fe/core/ActionRuntime.js.map +1 -1
- package/src/sap/fe/core/ActionRuntime.ts +118 -3
- package/src/sap/fe/core/AppComponent-dbg.js +16 -6
- package/src/sap/fe/core/AppComponent.js +1 -1
- package/src/sap/fe/core/AppComponent.js.map +1 -1
- package/src/sap/fe/core/AppComponent.ts +21 -7
- package/src/sap/fe/core/AppStateHandler-dbg.js +11 -10
- package/src/sap/fe/core/AppStateHandler.js +1 -1
- package/src/sap/fe/core/AppStateHandler.js.map +1 -1
- package/src/sap/fe/core/AppStateHandler.ts +14 -11
- package/src/sap/fe/core/CommonUtils-dbg.js +102 -175
- package/src/sap/fe/core/CommonUtils.js +1 -1
- package/src/sap/fe/core/CommonUtils.js.map +1 -1
- package/src/sap/fe/core/CommonUtils.ts +114 -211
- package/src/sap/fe/core/ExtensionAPI-dbg.js +3 -1
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +2 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +2 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +2 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +13 -18
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +32 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +4 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.ts +41 -29
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +2 -2
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +2 -2
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +3 -1
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +124 -57
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +146 -73
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +35 -74
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +35 -78
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +217 -127
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +227 -129
- package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +3 -5
- package/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.ts +2 -4
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +3 -2
- package/src/sap/fe/core/controllerextensions/Share.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Share.ts +2 -1
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +19 -14
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -14
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +41 -24
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.ts +64 -31
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +8 -8
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +7 -9
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +7 -45
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +5 -48
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +4 -4
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating-dbg.js +52 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating.js +6 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating.ts +46 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog-dbg.js +103 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +124 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +106 -205
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +121 -216
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +31 -4
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +38 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup-dbg.js +13 -10
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +7 -20
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +9 -4
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +12 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +10 -6
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +20 -11
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +1 -8
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +0 -9
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +19 -15
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +19 -22
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +67 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +68 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -0
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +4 -9
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
- package/src/sap/fe/core/controls/CommandExecution.ts +0 -8
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block-dbg.js +335 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +6 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js.map +1 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +336 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +3 -28
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +8 -29
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +30 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +38 -0
- package/src/sap/fe/core/converters/ConverterContext-dbg.js +3 -5
- package/src/sap/fe/core/converters/ConverterContext.js +1 -1
- package/src/sap/fe/core/converters/ConverterContext.js.map +1 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +2 -5
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +7 -6
- package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +5 -3
- package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.ts +7 -1
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +49 -28
- package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +62 -30
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +1 -6
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +22 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.ts +20 -7
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +701 -681
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +6 -12
- package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.ts +9 -14
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +32 -20
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +30 -18
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +4 -5
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +6 -37
- package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +7 -6
- package/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.ts +5 -11
- package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +5 -5
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -4
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +135 -85
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.ts +189 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +56 -22
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +67 -31
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +137 -49
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +166 -43
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +33 -14
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +31 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +27 -18
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +36 -23
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +37 -15
- package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +36 -20
- package/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +8 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/BindingHelper.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +8 -6
- package/src/sap/fe/core/converters/helpers/InsightsHelpers-dbg.js +39 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +6 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +45 -0
- package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +3 -2
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +2 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +17 -16
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +11 -11
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +20 -17
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +25 -56
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +13 -13
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -13
- package/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +17 -33
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +27 -22
- package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -6
- package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.ts +1 -5
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +13 -5
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +19 -9
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +2 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.ts +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +58 -35
- package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.ts +76 -54
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +8 -4
- package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.ts +7 -5
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +6 -5
- package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.ts +4 -4
- package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +167 -4
- package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
- package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -1
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +205 -3
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +37 -73
- package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +41 -68
- package/src/sap/fe/core/helpers/RecommendationHelper-dbg.js +71 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.js +6 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.ts +94 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +19 -3
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.ts +21 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +40 -6
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +39 -5
- package/src/sap/fe/core/helpers/SizeHelper-dbg.js +53 -0
- package/src/sap/fe/core/helpers/SizeHelper.js +6 -0
- package/src/sap/fe/core/helpers/SizeHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SizeHelper.ts +51 -0
- package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +52 -26
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +49 -25
- package/src/sap/fe/core/helpers/TypeGuards-dbg.js +147 -1
- package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.ts +151 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +25 -2
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +24 -0
- package/src/sap/fe/core/jsx-runtime/jsx-dbg.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -0
- package/src/sap/fe/core/library-dbg.js +1 -1
- package/src/sap/fe/core/library-preload.js +123 -95
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +67 -15
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -14
- package/src/sap/fe/core/messagebundle.properties +6 -6
- package/src/sap/fe/core/messagebundle_ar.properties +5 -6
- package/src/sap/fe/core/messagebundle_bg.properties +11 -12
- package/src/sap/fe/core/messagebundle_ca.properties +3 -4
- package/src/sap/fe/core/messagebundle_cs.properties +3 -4
- package/src/sap/fe/core/messagebundle_cy.properties +3 -4
- package/src/sap/fe/core/messagebundle_da.properties +3 -4
- package/src/sap/fe/core/messagebundle_de.properties +11 -12
- package/src/sap/fe/core/messagebundle_el.properties +5 -6
- package/src/sap/fe/core/messagebundle_en.properties +3 -4
- package/src/sap/fe/core/messagebundle_en_GB.properties +4 -5
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +3 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +3 -4
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +3 -2
- package/src/sap/fe/core/messagebundle_es.properties +3 -4
- package/src/sap/fe/core/messagebundle_es_MX.properties +3 -4
- package/src/sap/fe/core/messagebundle_et.properties +3 -4
- package/src/sap/fe/core/messagebundle_fi.properties +3 -4
- package/src/sap/fe/core/messagebundle_fr.properties +3 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +11 -12
- package/src/sap/fe/core/messagebundle_hi.properties +11 -12
- package/src/sap/fe/core/messagebundle_hr.properties +3 -4
- package/src/sap/fe/core/messagebundle_hu.properties +3 -4
- package/src/sap/fe/core/messagebundle_id.properties +11 -12
- package/src/sap/fe/core/messagebundle_it.properties +3 -4
- package/src/sap/fe/core/messagebundle_iw.properties +3 -4
- package/src/sap/fe/core/messagebundle_ja.properties +4 -5
- package/src/sap/fe/core/messagebundle_kk.properties +3 -4
- package/src/sap/fe/core/messagebundle_ko.properties +11 -12
- package/src/sap/fe/core/messagebundle_lt.properties +3 -4
- package/src/sap/fe/core/messagebundle_lv.properties +11 -12
- package/src/sap/fe/core/messagebundle_ms.properties +3 -4
- package/src/sap/fe/core/messagebundle_nl.properties +3 -4
- package/src/sap/fe/core/messagebundle_no.properties +3 -4
- package/src/sap/fe/core/messagebundle_pl.properties +11 -12
- package/src/sap/fe/core/messagebundle_pt.properties +3 -4
- package/src/sap/fe/core/messagebundle_pt_PT.properties +3 -4
- package/src/sap/fe/core/messagebundle_ro.properties +14 -15
- package/src/sap/fe/core/messagebundle_ru.properties +11 -12
- package/src/sap/fe/core/messagebundle_sh.properties +3 -4
- package/src/sap/fe/core/messagebundle_sk.properties +3 -4
- package/src/sap/fe/core/messagebundle_sl.properties +3 -4
- package/src/sap/fe/core/messagebundle_sv.properties +11 -12
- package/src/sap/fe/core/messagebundle_th.properties +3 -4
- package/src/sap/fe/core/messagebundle_tr.properties +3 -4
- package/src/sap/fe/core/messagebundle_uk.properties +3 -4
- package/src/sap/fe/core/messagebundle_vi.properties +3 -4
- package/src/sap/fe/core/messagebundle_zh_CN.properties +11 -12
- package/src/sap/fe/core/messagebundle_zh_TW.properties +11 -12
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +22 -8
- package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +17 -7
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +36 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +37 -1
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +13 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +13 -0
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +7 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +20 -2
- package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +7 -1
- package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.js.map +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +10 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +10 -7
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +12 -13
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +9 -3
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +11 -15
- package/src/sap/fe/core/templating/CommonFormatters-dbg.js +4 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters-dbg.js +1 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
- package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +19 -18
- package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +24 -18
- package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +5 -5
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.js.map +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -2
- package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +19 -28
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -24
- package/src/sap/fe/core/templating/EntityTypeHelper-dbg.js +48 -0
- package/src/sap/fe/core/templating/EntityTypeHelper.js +6 -0
- package/src/sap/fe/core/templating/EntityTypeHelper.js.map +1 -0
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +37 -0
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +12 -1
- package/src/sap/fe/core/templating/FilterHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FilterHelper.ts +12 -0
- package/src/sap/fe/core/templating/FilterTemplating-dbg.js +7 -8
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.js.map +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +5 -8
- package/src/sap/fe/core/templating/PropertyFormatters-dbg.js +1 -6
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.ts +0 -5
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +13 -46
- package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.js.map +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +14 -43
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +32 -26
- package/src/sap/fe/core/templating/UIFormatters.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +45 -34
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +0 -91
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +0 -59
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +0 -171
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +0 -6
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +0 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +0 -184
|
@@ -368,210 +368,298 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
368
368
|
/**
|
|
369
369
|
* Sets the binding context of the page from a path.
|
|
370
370
|
*
|
|
371
|
-
* @param
|
|
372
|
-
* @param
|
|
373
|
-
* @param
|
|
371
|
+
* @param targetPath The path to the context
|
|
372
|
+
* @param model The OData model
|
|
373
|
+
* @param navigationParameters Navigation parameters
|
|
374
374
|
* @returns A Promise resolved once the binding has been set on the page
|
|
375
375
|
* @ui5-restricted
|
|
376
376
|
*/;
|
|
377
|
-
_proto._bindPage = function _bindPage(
|
|
378
|
-
if (
|
|
379
|
-
return Promise.resolve(this._bindPageToContext(null,
|
|
380
|
-
} else {
|
|
381
|
-
return this._resolveSemanticPath(sTargetPath, oModel).then(sTechnicalPath => {
|
|
382
|
-
this._bindPageToPath(sTechnicalPath, oModel, oNavigationParameters);
|
|
383
|
-
}).catch(oError => {
|
|
384
|
-
// Error handling for erroneous metadata request
|
|
385
|
-
const oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
386
|
-
this.navigateToMessagePage(oResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
|
|
387
|
-
title: oResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
|
|
388
|
-
description: oError.message
|
|
389
|
-
});
|
|
390
|
-
});
|
|
377
|
+
_proto._bindPage = function _bindPage(targetPath, model, navigationParameters) {
|
|
378
|
+
if (targetPath === "") {
|
|
379
|
+
return Promise.resolve(this._bindPageToContext(null, model, navigationParameters));
|
|
391
380
|
}
|
|
381
|
+
return this.resolvePath(targetPath, model, navigationParameters).then(technicalPath => {
|
|
382
|
+
this._bindPageToPath(technicalPath, model, navigationParameters);
|
|
383
|
+
}).catch(error => {
|
|
384
|
+
// Error handling for erroneous metadata request
|
|
385
|
+
const resourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
386
|
+
this.navigateToMessagePage(resourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
|
|
387
|
+
title: resourceBundle.getText("C_COMMON_SAPFE_ERROR"),
|
|
388
|
+
description: error.message
|
|
389
|
+
});
|
|
390
|
+
});
|
|
392
391
|
}
|
|
393
392
|
|
|
394
393
|
/**
|
|
395
394
|
* Creates the filter to retrieve a context corresponding to a semantic path.
|
|
396
395
|
*
|
|
397
|
-
* @param
|
|
398
|
-
* @param
|
|
399
|
-
* @param
|
|
396
|
+
* @param semanticPath The semantic or technical path
|
|
397
|
+
* @param semanticKeys The semantic or technical keys for the path
|
|
398
|
+
* @param metaModel The instance of the metamodel
|
|
400
399
|
* @returns The filter
|
|
401
400
|
* @ui5-restricted
|
|
402
401
|
*/;
|
|
403
|
-
_proto.
|
|
404
|
-
const
|
|
405
|
-
if (
|
|
402
|
+
_proto.createFilterFromPath = function createFilterFromPath(semanticPath, semanticKeys, metaModel) {
|
|
403
|
+
const unquoteAndDecode = function (value) {
|
|
404
|
+
if (value.indexOf("'") === 0 && value.lastIndexOf("'") === value.length - 1) {
|
|
406
405
|
// Remove the quotes from the value and decode special chars
|
|
407
|
-
|
|
406
|
+
value = decodeURIComponent(value.substring(1, value.length - 1));
|
|
408
407
|
}
|
|
409
|
-
return
|
|
408
|
+
return value;
|
|
410
409
|
};
|
|
411
|
-
const
|
|
412
|
-
let
|
|
413
|
-
|
|
410
|
+
const keyValues = semanticPath.substring(semanticPath.indexOf("(") + 1, semanticPath.length - 1).split(",");
|
|
411
|
+
let finalKeys = semanticKeys;
|
|
412
|
+
let finalKeyValues = keyValues;
|
|
413
|
+
// If we have technical keys, IsActiveEntity will be present. We need to remove it as we're already adding them at the end.
|
|
414
|
+
if (semanticKeys.includes("IsActiveEntity")) {
|
|
415
|
+
finalKeys = semanticKeys.filter(singleKey => singleKey.indexOf("IsActiveEntity") < 0);
|
|
416
|
+
finalKeyValues = keyValues.filter(element => !element.startsWith("IsActiveEntity"));
|
|
417
|
+
}
|
|
418
|
+
if (finalKeys.length != finalKeyValues.length) {
|
|
414
419
|
return null;
|
|
415
420
|
}
|
|
416
|
-
const
|
|
417
|
-
|
|
421
|
+
const filteringCaseSensitive = ModelHelper.isFilteringCaseSensitive(metaModel);
|
|
422
|
+
let filters;
|
|
423
|
+
if (finalKeys.length === 1) {
|
|
424
|
+
// If this is a technical key, the equal is present because there's at least 2 parameters, a technical key and IsActiveEntity
|
|
425
|
+
if (finalKeyValues[0].indexOf("=") > 0) {
|
|
426
|
+
const keyPart = finalKeyValues[0].split("=");
|
|
427
|
+
finalKeyValues[0] = keyPart[1];
|
|
428
|
+
}
|
|
418
429
|
// Take the first key value
|
|
419
|
-
const
|
|
420
|
-
|
|
421
|
-
path:
|
|
430
|
+
const keyValue = unquoteAndDecode(finalKeyValues[0]);
|
|
431
|
+
filters = [new Filter({
|
|
432
|
+
path: finalKeys[0],
|
|
422
433
|
operator: FilterOperator.EQ,
|
|
423
|
-
value1:
|
|
424
|
-
caseSensitive:
|
|
434
|
+
value1: keyValue,
|
|
435
|
+
caseSensitive: filteringCaseSensitive
|
|
425
436
|
})];
|
|
426
437
|
} else {
|
|
427
438
|
const mKeyValues = {};
|
|
428
439
|
// Create a map of all key values
|
|
429
|
-
|
|
440
|
+
finalKeyValues.forEach(function (sKeyAssignment) {
|
|
430
441
|
const aParts = sKeyAssignment.split("="),
|
|
431
|
-
|
|
432
|
-
mKeyValues[aParts[0]] =
|
|
442
|
+
keyValue = unquoteAndDecode(aParts[1]);
|
|
443
|
+
mKeyValues[aParts[0]] = keyValue;
|
|
433
444
|
});
|
|
434
|
-
let
|
|
435
|
-
|
|
436
|
-
const
|
|
437
|
-
|
|
438
|
-
if (
|
|
445
|
+
let failed = false;
|
|
446
|
+
filters = finalKeys.map(function (semanticKey) {
|
|
447
|
+
const key = semanticKey,
|
|
448
|
+
value = mKeyValues[key];
|
|
449
|
+
if (value !== undefined) {
|
|
439
450
|
return new Filter({
|
|
440
|
-
path:
|
|
451
|
+
path: key,
|
|
441
452
|
operator: FilterOperator.EQ,
|
|
442
|
-
value1:
|
|
443
|
-
caseSensitive:
|
|
453
|
+
value1: value,
|
|
454
|
+
caseSensitive: filteringCaseSensitive
|
|
444
455
|
});
|
|
445
456
|
} else {
|
|
446
|
-
|
|
457
|
+
failed = true;
|
|
447
458
|
return new Filter({
|
|
448
459
|
path: "XX"
|
|
449
|
-
}); // will be
|
|
460
|
+
}); // will be ignored anyway since we return after
|
|
450
461
|
}
|
|
451
462
|
});
|
|
452
463
|
|
|
453
|
-
if (
|
|
464
|
+
if (failed) {
|
|
454
465
|
return null;
|
|
455
466
|
}
|
|
456
467
|
}
|
|
457
468
|
|
|
458
469
|
// Add a draft filter to make sure we take the draft entity if there is one
|
|
459
470
|
// Or the active entity otherwise
|
|
460
|
-
const
|
|
471
|
+
const draftFilter = new Filter({
|
|
461
472
|
filters: [new Filter("IsActiveEntity", "EQ", false), new Filter("SiblingEntity/IsActiveEntity", "EQ", null)],
|
|
462
473
|
and: false
|
|
463
474
|
});
|
|
464
|
-
|
|
465
|
-
return new Filter(
|
|
475
|
+
filters.push(draftFilter);
|
|
476
|
+
return new Filter(filters, true);
|
|
466
477
|
}
|
|
467
478
|
|
|
468
479
|
/**
|
|
469
480
|
* Converts a path with semantic keys to a path with technical keys.
|
|
470
481
|
*
|
|
471
|
-
* @param
|
|
472
|
-
* @param
|
|
473
|
-
* @param
|
|
474
|
-
* @returns A Promise containing the path with technical keys if
|
|
482
|
+
* @param pathWithParameters The path with semantic keys
|
|
483
|
+
* @param model The model for the path
|
|
484
|
+
* @param keys The semantic or technical keys for the path
|
|
485
|
+
* @returns A Promise containing the path with technical keys if pathWithParameters could be interpreted as a technical path, null otherwise
|
|
475
486
|
* @ui5-restricted
|
|
487
|
+
* @private
|
|
476
488
|
*/;
|
|
477
|
-
_proto.
|
|
478
|
-
var
|
|
479
|
-
const
|
|
480
|
-
let
|
|
481
|
-
if (!
|
|
482
|
-
// No semantic keys
|
|
483
|
-
return
|
|
489
|
+
_proto.getTechnicalPathFromPath = async function getTechnicalPathFromPath(pathWithParameters, model, keys) {
|
|
490
|
+
var _entitySetPath;
|
|
491
|
+
const metaModel = model.getMetaModel();
|
|
492
|
+
let entitySetPath = metaModel.getMetaContext(pathWithParameters).getPath();
|
|
493
|
+
if (!keys || keys.length === 0) {
|
|
494
|
+
// No semantic/technical keys
|
|
495
|
+
return null;
|
|
484
496
|
}
|
|
485
497
|
|
|
486
498
|
// Create a set of filters corresponding to all keys
|
|
487
|
-
const
|
|
488
|
-
if (
|
|
499
|
+
const filter = this.createFilterFromPath(pathWithParameters, keys, metaModel);
|
|
500
|
+
if (filter === null) {
|
|
489
501
|
// Couldn't interpret the path as a semantic one
|
|
490
|
-
return
|
|
502
|
+
return null;
|
|
491
503
|
}
|
|
492
504
|
|
|
493
505
|
// Load the corresponding object
|
|
494
|
-
if (!((
|
|
495
|
-
|
|
506
|
+
if (!((_entitySetPath = entitySetPath) !== null && _entitySetPath !== void 0 && _entitySetPath.startsWith("/"))) {
|
|
507
|
+
entitySetPath = `/${entitySetPath}`;
|
|
496
508
|
}
|
|
497
|
-
const
|
|
509
|
+
const listBinding = model.bindList(entitySetPath, undefined, undefined, filter, {
|
|
498
510
|
$$groupId: "$auto.Heroes"
|
|
499
511
|
});
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
512
|
+
const contexts = await listBinding.requestContexts(0, 2);
|
|
513
|
+
if (contexts.length) {
|
|
514
|
+
return contexts[0].getPath();
|
|
515
|
+
} else {
|
|
516
|
+
// No data could be loaded
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Refreshes a context.
|
|
523
|
+
*
|
|
524
|
+
* @param model The OData model
|
|
525
|
+
* @param pathToReplaceWith The path to the new context
|
|
526
|
+
* @param contextToRemove The initial context that is going to be replaced
|
|
527
|
+
* @private
|
|
528
|
+
*/;
|
|
529
|
+
_proto.refreshContext = async function refreshContext(model, pathToReplaceWith, contextToRemove) {
|
|
530
|
+
const rootViewController = this._oAppComponent.getRootViewController();
|
|
531
|
+
if (rootViewController.isFclEnabled()) {
|
|
532
|
+
const contextToReplaceWith = model.getKeepAliveContext(pathToReplaceWith);
|
|
533
|
+
contextToRemove.replaceWith(contextToReplaceWith);
|
|
534
|
+
} else {
|
|
535
|
+
EditState.setEditStateDirty();
|
|
536
|
+
}
|
|
508
537
|
}
|
|
509
538
|
|
|
510
539
|
/**
|
|
511
|
-
* Checks if a path is
|
|
540
|
+
* Checks if a path is a root draft.
|
|
512
541
|
*
|
|
513
|
-
* @param
|
|
514
|
-
* @param
|
|
515
|
-
* @returns `true` if the path is
|
|
542
|
+
* @param path The path to test
|
|
543
|
+
* @param metaModel The associated metadata model
|
|
544
|
+
* @returns `true` if the path is a root path
|
|
516
545
|
* @ui5-restricted
|
|
546
|
+
* @private
|
|
517
547
|
*/;
|
|
518
|
-
_proto.
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
if (!aMatches) {
|
|
548
|
+
_proto.checkDraftAvailability = function checkDraftAvailability(path, metaModel) {
|
|
549
|
+
const matches = /^[/]?(\w+)\([^/]+\)$/.exec(path);
|
|
550
|
+
if (!matches) {
|
|
522
551
|
return false;
|
|
523
552
|
}
|
|
524
553
|
// Get the entitySet name
|
|
525
|
-
const
|
|
526
|
-
// Check the entity set supports draft
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
return oDraftRoot || oDraftNode ? true : false;
|
|
554
|
+
const entitySetPath = `/${matches[1]}`;
|
|
555
|
+
// Check the entity set supports draft
|
|
556
|
+
const draftRoot = metaModel.getObject(`${entitySetPath}@com.sap.vocabularies.Common.v1.DraftRoot`);
|
|
557
|
+
return draftRoot ? true : false;
|
|
530
558
|
}
|
|
531
559
|
|
|
532
560
|
/**
|
|
533
|
-
* Builds a path
|
|
561
|
+
* Builds a path to navigate to from a path with SemanticKeys or technical keys.
|
|
534
562
|
*
|
|
535
|
-
* @param
|
|
536
|
-
* @param
|
|
537
|
-
* @
|
|
563
|
+
* @param pathToResolve The path to be transformed
|
|
564
|
+
* @param model The OData model
|
|
565
|
+
* @param navigationParameter The parameter of the navigation
|
|
566
|
+
* @returns String promise for the new path. If pathToResolve couldn't be interpreted as a semantic path, it is returned as is.
|
|
538
567
|
* @ui5-restricted
|
|
568
|
+
* @private
|
|
539
569
|
*/;
|
|
540
|
-
_proto.
|
|
541
|
-
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
|
|
570
|
+
_proto.resolvePath = async function resolvePath(pathToResolve, model, navigationParameter) {
|
|
571
|
+
var _currentHashNoParams, _currentHashNoParams2, _currentHashNoParams3, _navigationParameter$;
|
|
572
|
+
const metaModel = model.getMetaModel();
|
|
573
|
+
const lastSemanticMapping = this._oRoutingService.getLastSemanticMapping();
|
|
574
|
+
let currentHashNoParams = this._oRouter.getHashChanger().getHash().split("?")[0];
|
|
575
|
+
if (((_currentHashNoParams = currentHashNoParams) === null || _currentHashNoParams === void 0 ? void 0 : _currentHashNoParams.lastIndexOf("/")) === ((_currentHashNoParams2 = currentHashNoParams) === null || _currentHashNoParams2 === void 0 ? void 0 : _currentHashNoParams2.length) - 1) {
|
|
545
576
|
// Remove trailing '/'
|
|
546
|
-
|
|
547
|
-
}
|
|
548
|
-
let
|
|
549
|
-
if (
|
|
550
|
-
|
|
551
|
-
}
|
|
552
|
-
const
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
577
|
+
currentHashNoParams = currentHashNoParams.substring(0, currentHashNoParams.length - 1);
|
|
578
|
+
}
|
|
579
|
+
let rootEntityName = (_currentHashNoParams3 = currentHashNoParams) === null || _currentHashNoParams3 === void 0 ? void 0 : _currentHashNoParams3.substr(0, currentHashNoParams.indexOf("("));
|
|
580
|
+
if (rootEntityName.indexOf("/") === 0) {
|
|
581
|
+
rootEntityName = rootEntityName.substring(1);
|
|
582
|
+
}
|
|
583
|
+
const isRootDraft = this.checkDraftAvailability(currentHashNoParams, metaModel),
|
|
584
|
+
semanticKeys = isRootDraft ? SemanticKeyHelper.getSemanticKeys(metaModel, rootEntityName) : undefined,
|
|
585
|
+
isCollaborationEnabled = ModelHelper.isCollaborationDraftSupported(metaModel),
|
|
586
|
+
isActiveEntity = (navigationParameter === null || navigationParameter === void 0 ? void 0 : (_navigationParameter$ = navigationParameter.useContext) === null || _navigationParameter$ === void 0 ? void 0 : _navigationParameter$.getProperty("IsActiveEntity")) ?? true;
|
|
587
|
+
/**
|
|
588
|
+
* If the entity is draft enabled, and we're in a collaboration application, and we're navigating to a draft, we're treating it as a new path.
|
|
589
|
+
* We want to check if the draft exists first, then we navigate on it if it does exist, otherwise we navigate to the saved version.
|
|
590
|
+
*/
|
|
591
|
+
if (isRootDraft && isCollaborationEnabled && !isActiveEntity) {
|
|
592
|
+
return this.resolveCollaborationPath(pathToResolve, model, navigationParameter, semanticKeys, rootEntityName);
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* This is the 'normal' process.
|
|
596
|
+
* If we don't have semantic keys, the path we have is technical and can be used as is.
|
|
597
|
+
* If the path to resolve is the same as the semantic path, then we know is has been resolved previously and we can return the technical path
|
|
598
|
+
* Otherwise, we need to evaluate the technical path, to set up the semantic mapping (if it's been resolved).
|
|
599
|
+
*/
|
|
600
|
+
if (semanticKeys === undefined) {
|
|
601
|
+
return pathToResolve;
|
|
602
|
+
}
|
|
603
|
+
if ((lastSemanticMapping === null || lastSemanticMapping === void 0 ? void 0 : lastSemanticMapping.semanticPath) === pathToResolve) {
|
|
558
604
|
// This semantic path has been resolved previously
|
|
559
|
-
return
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
} else {
|
|
571
|
-
return sPathToResolve;
|
|
572
|
-
}
|
|
605
|
+
return lastSemanticMapping.technicalPath;
|
|
606
|
+
}
|
|
607
|
+
const formattedSemanticKeys = semanticKeys.map(singleKey => singleKey.$PropertyPath);
|
|
608
|
+
|
|
609
|
+
// We need resolve the semantic path to get the technical keys
|
|
610
|
+
const technicalPath = await this.getTechnicalPathFromPath(currentHashNoParams, model, formattedSemanticKeys);
|
|
611
|
+
if (technicalPath && technicalPath !== pathToResolve) {
|
|
612
|
+
// The semantic path was resolved (otherwise keep the original value for target)
|
|
613
|
+
this._oRoutingService.setLastSemanticMapping({
|
|
614
|
+
technicalPath: technicalPath,
|
|
615
|
+
semanticPath: pathToResolve
|
|
573
616
|
});
|
|
617
|
+
return technicalPath;
|
|
574
618
|
}
|
|
619
|
+
return pathToResolve;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Evaluate the path to navigate when we're in a collaboration application and navigating to a draft.
|
|
624
|
+
* If the draft has been discarded, we change the path to the sibling element associated, otherwise we keep the same path.
|
|
625
|
+
* We're not doing it outside of collaboration as it's adding a request during navigation!
|
|
626
|
+
*
|
|
627
|
+
* @param pathToResolve The path we're checking. If the draft exists, we return it as is, otherwise we return the sibling element associated
|
|
628
|
+
* @param model The oData model
|
|
629
|
+
* @param navigationParameter The parameter of the navigation
|
|
630
|
+
* @param semanticKeys The semantic keys if we have semantic navigation, otherwise false
|
|
631
|
+
* @param rootEntityName Name of the root entity
|
|
632
|
+
* @returns The path to navigate to
|
|
633
|
+
* @private
|
|
634
|
+
*/;
|
|
635
|
+
_proto.resolveCollaborationPath = async function resolveCollaborationPath(pathToResolve, model, navigationParameter, semanticKeys, rootEntityName) {
|
|
636
|
+
const lastSemanticMapping = this._oRoutingService.getLastSemanticMapping();
|
|
637
|
+
const metaModel = model.getMetaModel();
|
|
638
|
+
const currentHashNoParams = this._oRouter.getHashChanger().getHash().split("?")[0];
|
|
639
|
+
let formattedKeys;
|
|
640
|
+
const comparativePath = (lastSemanticMapping === null || lastSemanticMapping === void 0 ? void 0 : lastSemanticMapping.technicalPath) ?? pathToResolve;
|
|
641
|
+
if (semanticKeys) {
|
|
642
|
+
formattedKeys = semanticKeys.map(singleKey => singleKey.$PropertyPath);
|
|
643
|
+
} else {
|
|
644
|
+
formattedKeys = metaModel.getObject(`/${rootEntityName}/$Type/$Key`);
|
|
645
|
+
}
|
|
646
|
+
const technicalPath = await this.getTechnicalPathFromPath(currentHashNoParams, model, formattedKeys);
|
|
647
|
+
if (technicalPath === null) {
|
|
648
|
+
return pathToResolve;
|
|
649
|
+
}
|
|
650
|
+
// Comparing path that was returned from the server with the one we have. If they are different, it means the draft doesn't exist.
|
|
651
|
+
if (technicalPath !== comparativePath && navigationParameter.useContext) {
|
|
652
|
+
var _metaModel$getObject;
|
|
653
|
+
if (lastSemanticMapping) {
|
|
654
|
+
this._oRoutingService.setLastSemanticMapping({
|
|
655
|
+
technicalPath: technicalPath,
|
|
656
|
+
semanticPath: pathToResolve
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
navigationParameter.redirectedToNonDraft = ((_metaModel$getObject = metaModel.getObject(`/${rootEntityName}/@com.sap.vocabularies.UI.v1.HeaderInfo`)) === null || _metaModel$getObject === void 0 ? void 0 : _metaModel$getObject.TypeName) ?? rootEntityName;
|
|
660
|
+
await this.refreshContext(model, technicalPath, navigationParameter.useContext);
|
|
661
|
+
}
|
|
662
|
+
return technicalPath;
|
|
575
663
|
}
|
|
576
664
|
|
|
577
665
|
/**
|
|
@@ -665,7 +753,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
665
753
|
showPlaceholder: oNavigationParameters.bShowPlaceholder
|
|
666
754
|
});
|
|
667
755
|
this._setBindingContext(oContext);
|
|
668
|
-
this.onAfterBinding(oContext
|
|
756
|
+
this.onAfterBinding(oContext, {
|
|
757
|
+
redirectedToNonDraft: oNavigationParameters === null || oNavigationParameters === void 0 ? void 0 : oNavigationParameters.redirectedToNonDraft
|
|
758
|
+
});
|
|
669
759
|
}
|
|
670
760
|
|
|
671
761
|
/**
|
|
@@ -978,4 +1068,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
978
1068
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatched", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatched"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onRouteMatchedFinished", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "onRouteMatchedFinished"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeBinding", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterBinding", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterBinding"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToTarget", [_dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToTarget"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToRoute", [_dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToRoute"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToContext", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromContext", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateForwardToContext", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateForwardToContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateBackFromTransientState", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateBackFromTransientState"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "navigateToMessagePage", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "navigateToMessagePage"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "isCurrentStateImpactedBy", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "isCurrentStateImpactedBy"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onDataReceived", [_dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onDataReceived"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "switchFullScreen", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "switchFullScreen"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "closeColumn", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "closeColumn"), _class2.prototype)), _class2)) || _class);
|
|
979
1069
|
return InternalRouting;
|
|
980
1070
|
}, false);
|
|
981
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJfcmVzb2x2ZVNlbWFudGljUGF0aCIsInNUZWNobmljYWxQYXRoIiwiX2JpbmRQYWdlVG9QYXRoIiwib1Jlc291cmNlQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsIl9jcmVhdGVGaWx0ZXJGcm9tU2VtYW50aWNQYXRoIiwic1NlbWFudGljUGF0aCIsImFTZW1hbnRpY0tleXMiLCJvTWV0YU1vZGVsIiwiZm5VbnF1b3RlQW5kRGVjb2RlIiwibGFzdEluZGV4T2YiLCJsZW5ndGgiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzdWJzdHJpbmciLCJhS2V5VmFsdWVzIiwic3BsaXQiLCJhRmlsdGVycyIsImJGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJzS2V5VmFsdWUiLCJGaWx0ZXIiLCIkUHJvcGVydHlQYXRoIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJiRmFpbGVkIiwibWFwIiwib1NlbWFudGljS2V5Iiwib0RyYWZ0RmlsdGVyIiwiZmlsdGVycyIsImFuZCIsInB1c2giLCJfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsIm9GaWx0ZXIiLCJzdGFydHNXaXRoIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJyZXF1ZXN0Q29udGV4dHMiLCJvQ29udGV4dHMiLCJfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyIsInNQYXRoIiwiYU1hdGNoZXMiLCJleGVjIiwib0RyYWZ0Um9vdCIsIm9EcmFmdE5vZGUiLCJzUGF0aFRvUmVzb2x2ZSIsIm9MYXN0U2VtYW50aWNNYXBwaW5nIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50SGFzaE5vUGFyYW1zIiwiZ2V0SGFzaENoYW5nZXIiLCJzUm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJiQWxsb3dTZW1hbnRpY0Jvb2ttYXJrIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJzZW1hbnRpY1BhdGgiLCJ0ZWNobmljYWxQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsIm9DdXJyZW50Q29udGV4dCIsInNDdXJyZW50UGF0aCIsIm9Vc2VDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIm1ldGFNb2RlbCIsInJlZnJlc2giLCJpc0Nvbm5lY3RlZCIsImlzRHJhZnRTdXBwb3J0ZWQiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsIl9jcmVhdGVDb250ZXh0IiwiQXBwU3RhdGVDaGFuZ2VkIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJsaXN0QmluZGluZyIsImJEcmFmdE5hdmlnYXRpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJiU2hvd1BsYWNlaG9sZGVyIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCIkJHVwZGF0ZUdyb3VwSWQiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic01lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvUHJldmlvdXNCaW5kaW5nIiwiZGVzdHJveSIsIm9IaWRkZW5CaW5kaW5nIiwiYmluZENvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJpc0xvY2tlZCIsInVubG9jayIsIm1lc3NhZ2VIYW5kbGVyIiwibVBhcmFtcyIsInN0YXR1cyIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJzaG93TWVzc2FnZXMiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1Jvb3RDb250ZXh0UGF0aCIsImFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocyIsImFQcm9wZXJ0eVBhdGhzIiwib1NpZGVFZmZlY3RzIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwiZ2V0QmluZGluZ1BhdGhzIiwib0JpbmRpbmciLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwiZ2V0Q29udGV4dCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4Iiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwiYWRkaXRpb25uYWxTZWdtZW50cyIsInBvcCIsImtlcHRBbGl2ZVBhdGgiLCJqb2luIiwib0tlZXBBbGl2ZUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwic0xheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBpc0Nvbm5lY3RlZCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgUm91dGVyUHJveHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvUm91dGVyUHJveHlcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgU2lkZUVmZmVjdHNUYXJnZXRUeXBlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcblxuLyoqXG4gKiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb24gQ29udHJvbGxlciBleHRlbnNpb259XG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1xuICogQHByaXZhdGVcbiAqIEBzaW5jZSAxLjc0LjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpXG5jbGFzcyBJbnRlcm5hbFJvdXRpbmcgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBfb1ZpZXchOiBWaWV3O1xuXG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0cHJpdmF0ZSBfb1JvdXRpbmdTZXJ2aWNlITogUm91dGluZ1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBfb1RhcmdldEluZm9ybWF0aW9uOiBhbnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCkge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHR0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kID0gdGhpcy5fb25Sb3V0ZU1hdGNoZWQuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1RhcmdldChvQ29udGV4dDogYW55LCBzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZywgYlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9XG5cdFx0dGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigoYXN5bmNDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChhc3luY0NvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IG1QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogbVBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IG1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoIW1QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblxuXHRcdFx0b0NvbnRleHRJbmZvLnNvdXJjZUJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRvQ29udGV4dEluZm8uYmluZGluZ0NvbnRleHQgPSBvQ29udGV4dDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5vRXZlbnQpIHtcblx0XHRcdFx0b0NvbnRleHRJbmZvLm9FdmVudCA9IG1QYXJhbWV0ZXJzLm9FdmVudDtcblx0XHRcdH1cblx0XHRcdC8vIFN0b3JpbmcgdGhlIHNlbGVjdGVkIGNvbnRleHQgdG8gdXNlIGl0IGluIGludGVybmFsIHJvdXRlIG5hdmlnYXRpb24gaWYgbmVjY2Vzc2FyeS5cblx0XHRcdGNvbnN0IGJPdmVycmlkZU5hdiA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmcub25CZWZvcmVOYXZpZ2F0aW9uKG9Db250ZXh0SW5mbyk7XG5cdFx0XHRpZiAoYk92ZXJyaWRlTmF2KSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMsIHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCksIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2t3YXJkcyBmcm9tIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIGZyb21cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gLTE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBmb3J3YXJkcyB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCB0b1xuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIpID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdG1QYXJhbWV0ZXJzLnVwZGF0ZUZDTExldmVsID0gMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGJhY2sgaW4gaGlzdG9yeSBpZiB0aGUgY3VycmVudCBoYXNoIGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNpZW50IHN0YXRlLlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpIHtcblx0XHRjb25zdCBzSGFzaCA9IHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCk7XG5cblx0XHQvLyBpZiB0cmlnZ2VyZWQgd2hpbGUgbmF2aWdhdGluZyB0byAoLi4uKSwgd2UgbmVlZCB0byBuYXZpZ2F0ZSBiYWNrXG5cdFx0aWYgKHNIYXNoLmluZGV4T2YoXCIoLi4uKVwiKSAhPT0gLTEpIHtcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9NZXNzYWdlUGFnZShzRXJyb3JNZXNzYWdlOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGlmIChcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWNyZWF0ZVwiKSA+IC0xIHx8XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1hdXRvQ3JlYXRlXCIpID4gLTFcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUm91dGVyUHJveHkubmF2VG9IYXNoKHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXREZWZhdWx0Q3JlYXRlSGFzaCgpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuRkNMTGV2ZWwgPSB0aGlzLl9nZXRGQ0xMZXZlbCgpO1xuXG5cdFx0XHRyZXR1cm4gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5kaXNwbGF5RXJyb3JQYWdlKHNFcnJvck1lc3NhZ2UsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIG9uZSBvZiB0aGUgY3VycmVudCB2aWV3cyBvbiB0aGUgc2NyZWVuIGlzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0XG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdGUgaXMgaW1wYWN0ZWQgYnkgdGhlIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dCk7XG5cdH1cblxuXHRfaXNWaWV3UGFydE9mUm91dGUocm91dGVJbmZvcm1hdGlvbjogYW55KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYVRhcmdldHMgPSByb3V0ZUluZm9ybWF0aW9uPy50YXJnZXRzO1xuXHRcdGlmICghYVRhcmdldHMgfHwgYVRhcmdldHMuaW5kZXhPZih0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udGFyZ2V0TmFtZSkgPT09IC0xKSB7XG5cdFx0XHQvLyBJZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaGFzIGEgdmlldyBsZXZlbCBncmVhdGVyIHRoYW4gdGhlIHJvdXRlIGxldmVsLCBpdCBtZWFucyB0aGlzIHZpZXcgY29tZXMgXCJhZnRlclwiIHRoZSByb3V0ZVxuXHRcdFx0Ly8gaW4gdGVybXMgb2YgbmF2aWdhdGlvbi5cblx0XHRcdC8vIEluIHN1Y2ggY2FzZSwgd2UgcmVtb3ZlIGl0cyBiaW5kaW5nIGNvbnRleHQsIHRvIGF2b2lkIHRoaXMgdmlldyB0byBoYXZlIGRhdGEgaWYgd2UgbmF2aWdhdGUgdG8gaXQgbGF0ZXIgb25cblx0XHRcdGlmICgodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnZpZXdMZXZlbCA/PyAwKSA+PSAocm91dGVJbmZvcm1hdGlvbj8ucm91dGVMZXZlbCA/PyAwKSkge1xuXHRcdFx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChudWxsKTsgLy8gVGhpcyBhbHNvIGNhbGwgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfYnVpbGRCaW5kaW5nUGF0aChyb3V0ZUFyZ3VtZW50czogYW55LCBiaW5kaW5nUGF0dGVybjogc3RyaW5nLCBuYXZpZ2F0aW9uUGFyYW1ldGVyczogYW55KTogeyBwYXRoOiBzdHJpbmc7IGRlZmVycmVkOiBib29sZWFuIH0ge1xuXHRcdGxldCBwYXRoID0gYmluZGluZ1BhdHRlcm4ucmVwbGFjZShcIjo/cXVlcnk6XCIsIFwiXCIpO1xuXHRcdGxldCBkZWZlcnJlZCA9IGZhbHNlO1xuXG5cdFx0Zm9yIChjb25zdCBzS2V5IGluIHJvdXRlQXJndW1lbnRzKSB7XG5cdFx0XHRjb25zdCBzVmFsdWUgPSByb3V0ZUFyZ3VtZW50c1tzS2V5XTtcblx0XHRcdGlmIChzVmFsdWUgPT09IFwiLi4uXCIgJiYgYmluZGluZ1BhdHRlcm4uaW5kZXhPZihgeyR7c0tleX19YCkgPj0gMCkge1xuXHRcdFx0XHRkZWZlcnJlZCA9IHRydWU7XG5cdFx0XHRcdC8vIFNvbWV0aW1lcyBpbiBwcmVmZXJyZWRNb2RlID0gY3JlYXRlLCB0aGUgZWRpdCBidXR0b24gaXMgc2hvd24gaW4gYmFja2dyb3VuZCB3aGVuIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBzaG93cyB1cCwgc2V0dGluZyBiVGFyZ2V0RWRpdGFibGUgcGFzc2VzIGVkaXRhYmxlIGFzIHRydWVcblx0XHRcdFx0Ly8gdG8gb25CZWZvcmVCaW5kaW5nIGluIF9iaW5kVGFyZ2V0UGFnZSBmdW5jdGlvblxuXHRcdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZShgeyR7c0tleX19YCwgc1ZhbHVlKTtcblx0XHR9XG5cdFx0aWYgKHJvdXRlQXJndW1lbnRzW1wiP3F1ZXJ5XCJdICYmIHJvdXRlQXJndW1lbnRzW1wiP3F1ZXJ5XCJdLmhhc093blByb3BlcnR5KFwiaS1hY3Rpb25cIikpIHtcblx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIHRoZSBiaW5kaW5nIHBhdGggaXMgYWx3YXlzIGFic29sdXRlXG5cdFx0aWYgKHBhdGggJiYgcGF0aFswXSAhPT0gXCIvXCIpIHtcblx0XHRcdHBhdGggPSBgLyR7cGF0aH1gO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IHBhdGgsIGRlZmVycmVkIH07XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRvIGJpbmQgdGhlIHBhZ2Ugd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWRcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkLlxuXHQgKiBCdWlsZHMgdGhlIGJpbmRpbmcgY29udGV4dCBmcm9tIHRoZSBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMsIGFuZCBiaW5kIHRoZSBwYWdlIGFjY29yZGluZ2x5LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X29uUm91dGVNYXRjaGVkKG9FdmVudDogRXZlbnQpIHtcblx0XHQvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGZvciB0aGlzIHZpZXcgaXMgcGFydCBvZiB0aGUgZXZlbnQgdGFyZ2V0cyAoaS5lLiBpcyBhIHRhcmdldCBmb3IgdGhlIGN1cnJlbnQgcm91dGUpLlxuXHRcdC8vIElmIG5vdCwgd2UgZG9uJ3QgbmVlZCB0byBiaW5kIGl0IC0tPiByZXR1cm5cblx0XHRpZiAoIXRoaXMuX2lzVmlld1BhcnRPZlJvdXRlKG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZUluZm9ybWF0aW9uXCIpKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHJpZXZlIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGxldCBiaW5kaW5nUGF0dGVybjtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQgJiYgdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKSB7XG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybigpO1xuXHRcdH1cblx0XHRiaW5kaW5nUGF0dGVybiA9IGJpbmRpbmdQYXR0ZXJuIHx8IHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5jb250ZXh0UGF0dGVybjtcblxuXHRcdGlmIChiaW5kaW5nUGF0dGVybiA9PT0gbnVsbCB8fCBiaW5kaW5nUGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBEb24ndCBkbyB0aGlzIGlmIHdlIGFscmVhZHkgZ290IHNUYXJnZXQgPT0gJycsIHdoaWNoIGlzIGEgdmFsaWQgdGFyZ2V0IHBhdHRlcm5cblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlUGF0dGVyblwiKTtcblx0XHR9XG5cblx0XHQvLyBSZXBsYWNlIHRoZSBwYXJhbWV0ZXJzIGJ5IHRoZWlyIHZhbHVlcyBpbiB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRjb25zdCBtQXJndW1lbnRzID0gKG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkgYXMgYW55KS5hcmd1bWVudHM7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25QYXJhbWV0ZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcIm5hdmlnYXRpb25JbmZvXCIpO1xuXHRcdGNvbnN0IHsgcGF0aCwgZGVmZXJyZWQgfSA9IHRoaXMuX2J1aWxkQmluZGluZ1BhdGgobUFyZ3VtZW50cywgYmluZGluZ1BhdHRlcm4sIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cblx0XHR0aGlzLm9uUm91dGVNYXRjaGVkKCk7XG5cblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0bGV0IG9PdXQ7XG5cdFx0aWYgKGRlZmVycmVkKSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZERlZmVycmVkKHBhdGgsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9PdXQgPSB0aGlzLl9iaW5kUGFnZShwYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL2NhdGNoLW9yLXJldHVyblxuXHRcdG9PdXQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHR0aGlzLm9uUm91dGVNYXRjaGVkRmluaXNoZWQoKTtcblx0XHR9KTtcblxuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkudXBkYXRlVUlTdGF0ZUZvclZpZXcodGhpcy5fb1ZpZXcsIHRoaXMuX2dldEZDTExldmVsKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmVycmVkIGJpbmRpbmcgKGR1cmluZyBvYmplY3QgY3JlYXRpb24pLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gdGhlIGRlZmZlcmVkIGNvbnRleHRcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmREZWZlcnJlZChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwsIHsgZWRpdGFibGU6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iVGFyZ2V0RWRpdGFibGUgfSk7XG5cblx0XHRpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQgfHwgIW9OYXZpZ2F0aW9uUGFyYW1ldGVycy5vQXN5bmNDb250ZXh0KSB7XG5cdFx0XHQvLyBlaXRoZXIgdGhlIGNvbnRleHQgc2hhbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFyZ2V0IHBhZ2UgKGRlZmVycmVkIENvbnRleHQpIG9yIGl0IHNoYWxsXG5cdFx0XHQvLyBiZSBjcmVhdGVkIGFzeW5jIGJ1dCB0aGUgdXNlciByZWZyZXNoZWQgdGhlIHBhZ2UgLyBib29rbWFya2VkIHRoaXMgVVJMXG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhlIHRhcmdldCBjb21wb25lbnQgY3JlYXRlcyB0aGlzIGRvY3VtZW50IGJ1dCB3ZSBzaGFsbCBtb3ZlIHRoaXMgdG9cblx0XHRcdC8vIGEgY2VudHJhbCBwbGFjZVxuXHRcdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmNyZWF0ZURlZmVycmVkQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQoXG5cdFx0XHRcdFx0c1RhcmdldFBhdGgsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQsXG5cdFx0XHRcdFx0b05hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChjdXJyZW50QmluZGluZ0NvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdC8vIEZvciBub3cgcmVtb3ZlIHRoZSBwZW5kaW5nIGNoYW5nZXMgdG8gYXZvaWQgdGhlIG1vZGVsIHJhaXNlcyBlcnJvcnMgYW5kIHRoZSBvYmplY3QgcGFnZSBpcyBhdCBsZWFzdCBib3VuZFxuXHRcdFx0Ly8gSWRlYWxseSB0aGUgdXNlciBzaG91bGQgYmUgYXNrZWQgZm9yXG5cdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBoYXMgYmVlbiBzZXQgb24gdGhlIHBhZ2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2Uoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IG9iamVjdCkge1xuXHRcdGlmIChzVGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVzb2x2ZVNlbWFudGljUGF0aChzVGFyZ2V0UGF0aCwgb01vZGVsKVxuXHRcdFx0XHQudGhlbigoc1RlY2huaWNhbFBhdGg6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9QYXRoKHNUZWNobmljYWxQYXRoLCBvTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBFcnJvciBoYW5kbGluZyBmb3IgZXJyb25lb3VzIG1ldGFkYXRhIHJlcXVlc3Rcblx0XHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uob1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvRXJyb3IubWVzc2FnZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZmlsdGVyIHRvIHJldHJpZXZlIGEgY29udGV4dCBjb3JyZXNwb25kaW5nIHRvIGEgc2VtYW50aWMgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNTZW1hbnRpY1BhdGggVGhlIHNlbWFudGljIHBhdGhcblx0ICogQHBhcmFtIGFTZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBpbnN0YW5jZSBvZiB0aGUgbWV0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUZpbHRlckZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBhU2VtYW50aWNLZXlzOiBhbnlbXSwgb01ldGFNb2RlbDogb2JqZWN0KSB7XG5cdFx0Y29uc3QgZm5VbnF1b3RlQW5kRGVjb2RlID0gZnVuY3Rpb24gKHNWYWx1ZTogYW55KSB7XG5cdFx0XHRpZiAoc1ZhbHVlLmluZGV4T2YoXCInXCIpID09PSAwICYmIHNWYWx1ZS5sYXN0SW5kZXhPZihcIidcIikgPT09IHNWYWx1ZS5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgcXVvdGVzIGZyb20gdGhlIHZhbHVlIGFuZCBkZWNvZGUgc3BlY2lhbCBjaGFyc1xuXHRcdFx0XHRzVmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoc1ZhbHVlLnN1YnN0cmluZygxLCBzVmFsdWUubGVuZ3RoIC0gMSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNWYWx1ZTtcblx0XHR9O1xuXHRcdGNvbnN0IGFLZXlWYWx1ZXMgPSBzU2VtYW50aWNQYXRoLnN1YnN0cmluZyhzU2VtYW50aWNQYXRoLmluZGV4T2YoXCIoXCIpICsgMSwgc1NlbWFudGljUGF0aC5sZW5ndGggLSAxKS5zcGxpdChcIixcIik7XG5cdFx0bGV0IGFGaWx0ZXJzOiBGaWx0ZXJbXTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzLmxlbmd0aCAhPSBhS2V5VmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUob01ldGFNb2RlbCk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdC8vIFRha2UgdGhlIGZpcnN0IGtleSB2YWx1ZVxuXHRcdFx0Y29uc3Qgc0tleVZhbHVlID0gZm5VbnF1b3RlQW5kRGVjb2RlKGFLZXlWYWx1ZXNbMF0pO1xuXHRcdFx0YUZpbHRlcnMgPSBbXG5cdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdHBhdGg6IGFTZW1hbnRpY0tleXNbMF0uJFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0dmFsdWUxOiBzS2V5VmFsdWUsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0fSlcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1LZXlWYWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBrZXkgdmFsdWVzXG5cdFx0XHRhS2V5VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXlBc3NpZ25tZW50OiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gc0tleUFzc2lnbm1lbnQuc3BsaXQoXCI9XCIpLFxuXHRcdFx0XHRcdHNLZXlWYWx1ZSA9IGZuVW5xdW90ZUFuZERlY29kZShhUGFydHNbMV0pO1xuXG5cdFx0XHRcdG1LZXlWYWx1ZXNbYVBhcnRzWzBdXSA9IHNLZXlWYWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgYkZhaWxlZCA9IGZhbHNlO1xuXHRcdFx0YUZpbHRlcnMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob1NlbWFudGljS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgc0tleSA9IG9TZW1hbnRpY0tleS4kUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHNWYWx1ZSA9IG1LZXlWYWx1ZXNbc0tleV07XG5cblx0XHRcdFx0aWYgKHNWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogc0tleSxcblx0XHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHRcdHZhbHVlMTogc1ZhbHVlLFxuXHRcdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogYkZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRiRmFpbGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIlhYXCJcblx0XHRcdFx0XHR9KTsgLy8gd2lsbCBiZSBpZ25vcmUgYW55d2F5IHNpbmNlIHdlIHJldHVybiBhZnRlclxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGJGYWlsZWQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGEgZHJhZnQgZmlsdGVyIHRvIG1ha2Ugc3VyZSB3ZSB0YWtlIHRoZSBkcmFmdCBlbnRpdHkgaWYgdGhlcmUgaXMgb25lXG5cdFx0Ly8gT3IgdGhlIGFjdGl2ZSBlbnRpdHkgb3RoZXJ3aXNlXG5cdFx0Y29uc3Qgb0RyYWZ0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBbbmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgZmFsc2UpLCBuZXcgRmlsdGVyKFwiU2libGluZ0VudGl0eS9Jc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIG51bGwpXSxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0XHRhRmlsdGVycy5wdXNoKG9EcmFmdEZpbHRlcik7XG5cblx0XHRyZXR1cm4gbmV3IEZpbHRlcihhRmlsdGVycywgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyB0byBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHNTZW1hbnRpY1BhdGggVGhlIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIG1vZGVsIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0gYVNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHJldHVybnMgQSBQcm9taXNlIGNvbnRhaW5pbmcgdGhlIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cyBpZiBzU2VtYW50aWNQYXRoIGNvdWxkIGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgbnVsbCBvdGhlcndpc2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0VGVjaG5pY2FsUGF0aEZyb21TZW1hbnRpY1BhdGgoc1NlbWFudGljUGF0aDogc3RyaW5nLCBvTW9kZWw6IGFueSwgYVNlbWFudGljS2V5czogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoc1NlbWFudGljUGF0aCkuZ2V0UGF0aCgpO1xuXG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzIHx8IGFTZW1hbnRpY0tleXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHNldCBvZiBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIGtleXNcblx0XHRjb25zdCBvRmlsdGVyID0gdGhpcy5fY3JlYXRlRmlsdGVyRnJvbVNlbWFudGljUGF0aChzU2VtYW50aWNQYXRoLCBhU2VtYW50aWNLZXlzLCBvTWV0YU1vZGVsKTtcblx0XHRpZiAob0ZpbHRlciA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgaW50ZXJwcmV0IHRoZSBwYXRoIGFzIGEgc2VtYW50aWMgb25lXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblxuXHRcdC8vIExvYWQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0XG5cdFx0aWYgKCFzRW50aXR5U2V0UGF0aD8uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdHNFbnRpdHlTZXRQYXRoID0gYC8ke3NFbnRpdHlTZXRQYXRofWA7XG5cdFx0fVxuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9Nb2RlbC5iaW5kTGlzdChzRW50aXR5U2V0UGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9GaWx0ZXIsIHtcblx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMikudGhlbihmdW5jdGlvbiAob0NvbnRleHRzOiBhbnkpIHtcblx0XHRcdGlmIChvQ29udGV4dHMgJiYgb0NvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5vIGRhdGEgY291bGQgYmUgbG9hZGVkXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIHBhdGggaXMgZWxpZ2libGUgZm9yIHNlbWFudGljIGJvb2ttYXJraW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgZWxpZ2libGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY2hlY2tQYXRoRm9yU2VtYW50aWNCb29rbWFya2luZyhzUGF0aDogc3RyaW5nLCBvTWV0YU1vZGVsOiBhbnkpIHtcblx0XHQvLyBPbmx5IHBhdGggb24gcm9vdCBvYmplY3RzIGFsbG93IHNlbWFudGljIGJvb2ttYXJraW5nLCBpLmUuIHNQYXRoID0geHh4KHl5eSlcblx0XHRjb25zdCBhTWF0Y2hlcyA9IC9eWy9dPyhcXHcrKVxcKFteL10rXFwpJC8uZXhlYyhzUGF0aCk7XG5cdFx0aWYgKCFhTWF0Y2hlcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBHZXQgdGhlIGVudGl0eVNldCBuYW1lXG5cdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBgLyR7YU1hdGNoZXNbMV19YDtcblx0XHQvLyBDaGVjayB0aGUgZW50aXR5IHNldCBzdXBwb3J0cyBkcmFmdCAob3RoZXJ3aXNlIHdlIGRvbid0IHN1cHBvcnQgc2VtYW50aWMgYm9va21hcmtpbmcpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0cmV0dXJuIG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyBmcm9tIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGhUb1Jlc29sdmUgVGhlIHBhdGggdG8gYmUgdHJhbnNmb3JtZWRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgc1BhdGhUb1Jlc29sdmVkIGNvdWxkbid0IGJlIGludGVycHJldGVkIGFzIGEgc2VtYW50aWMgcGF0aCwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3Jlc29sdmVTZW1hbnRpY1BhdGgoc1BhdGhUb1Jlc29sdmU6IHN0cmluZywgb01vZGVsOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb0xhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBzQ3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0aWYgKHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0Ly8gUmVtb3ZlIHRyYWlsaW5nICcvJ1xuXHRcdFx0c0N1cnJlbnRIYXNoTm9QYXJhbXMgPSBzQ3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgc0N1cnJlbnRIYXNoTm9QYXJhbXMubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0bGV0IHNSb290RW50aXR5TmFtZSA9IHNDdXJyZW50SGFzaE5vUGFyYW1zICYmIHNDdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cigwLCBzQ3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHNSb290RW50aXR5TmFtZS5pbmRleE9mKFwiL1wiKSA9PT0gMCkge1xuXHRcdFx0c1Jvb3RFbnRpdHlOYW1lID0gc1Jvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgYkFsbG93U2VtYW50aWNCb29rbWFyayA9IHRoaXMuX2NoZWNrUGF0aEZvclNlbWFudGljQm9va21hcmtpbmcoc0N1cnJlbnRIYXNoTm9QYXJhbXMsIG9NZXRhTW9kZWwpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IGJBbGxvd1NlbWFudGljQm9va21hcmsgJiYgU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNSb290RW50aXR5TmFtZSk7XG5cdFx0aWYgKCFhU2VtYW50aWNLZXlzKSB7XG5cdFx0XHQvLyBObyBzZW1hbnRpYyBrZXlzIGF2YWlsYWJsZSAtLT4gdXNlIHRoZSBwYXRoIGFzIGlzXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNQYXRoVG9SZXNvbHZlKTtcblx0XHR9IGVsc2UgaWYgKG9MYXN0U2VtYW50aWNNYXBwaW5nICYmIG9MYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCA9PT0gc1BhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9MYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBuZWVkIHJlc29sdmUgdGhlIHNlbWFudGljIHBhdGggdG8gZ2V0IHRoZSB0ZWNobmljYWwga2V5c1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFRlY2huaWNhbFBhdGhGcm9tU2VtYW50aWNQYXRoKHNDdXJyZW50SGFzaE5vUGFyYW1zLCBvTW9kZWwsIGFTZW1hbnRpY0tleXMpLnRoZW4oKHNUZWNobmljYWxQYXRoOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNUZWNobmljYWxQYXRoICYmIHNUZWNobmljYWxQYXRoICE9PSBzUGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzZW1hbnRpYyBwYXRoIHdhcyByZXNvbHZlZCAob3RoZXJ3aXNlIGtlZXAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciB0YXJnZXQpXG5cdFx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogc1RlY2huaWNhbFBhdGgsXG5cdFx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHNQYXRoVG9SZXNvbHZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIHNUZWNobmljYWxQYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFRvUmVzb2x2ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIGJ1aWxkIHRoZSBjb250ZXh0LiBOZWVkcyB0byBjb250YWluIHRlY2huaWNhbCBrZXlzIG9ubHkuXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9QYXRoKHNUYXJnZXRQYXRoOiBzdHJpbmcsIG9Nb2RlbDogYW55LCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0aXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0KSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWUgLy8gTG9hZCBtZXNzYWdlcywgb3RoZXJ3aXNlIHRoZXkgZG9uJ3QgZ2V0IHJlZnJlc2hlZCBsYXRlciwgZS5nLiBmb3Igc2lkZSBlZmZlY3RzXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0Ly8gc2V0S2VlcEFsaXZlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHBhcmVudCBsaXN0YmluZGluZyBkb2Vzbid0IGhhdmUgJCRvd25SZXF1ZXN0PXRydWVcblx0XHRcdFx0Ly8gVGhpcyBjYXNlIGZvciBjdXN0b20gZnJhZ21lbnRzIGlzIHN1cHBvcnRlZCwgYnV0IGFuIGVycm9yIGlzIGxvZ2dlZCB0byBtYWtlIHRoZSBsYWNrIG9mIHN5bmNocm9uaXphdGlvbiBhcHBhcmVudFxuXHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0YFZpZXcgZm9yICR7b0NvbnRleHQuZ2V0UGF0aCgpfSB3b24ndCBiZSBzeW5jaHJvbml6ZWQuIFBhcmVudCBsaXN0QmluZGluZyBtdXN0IGhhdmUgYmluZGluZyBwYXJhbWV0ZXIgJCRvd25SZXF1ZXN0PXRydWVgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8IG9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgY29udGV4dCBvdGhlcndpc2Ugd2UgZ2V0IGVycm9yc1xuXHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIHRoZSBwcm9wZXIgYmVmb3JlL2FmdGVyIGNhbGxiYWNrc1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlNob3dQbGFjZWhvbGRlclxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcob0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjb250ZXh0IGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGggVGhlIHBhdGhcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9jcmVhdGVDb250ZXh0KHNQYXRoOiBzdHJpbmcsIG9Nb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQsXG5cdFx0XHRzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpLFxuXHRcdFx0c0NvbnRleHRQYXRoID1cblx0XHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIixcblx0XHRcdFx0JCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIsXG5cdFx0XHRcdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRjb25zdCBvRHJhZnRSb290ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0Y29uc3Qgb0RyYWZ0Tm9kZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Tm9kZWApO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsLCBzUGF0aCwgZmFsc2UsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JlYXRlIGtlZXBBbGl2ZSBjb250ZXh0ICR7c1BhdGh9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFByb3BlcnR5KFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdFx0XHRcdGlmIChvRHJhZnRSb290KSB7XG5cdFx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZHJhZnQgYW5kIGVkaXQgd2UgbmVlZCB0byBlbnN1cmUgdGhvc2UgcHJvcGVydGllcyBhcmUgcmVxdWVzdGVkIGFnYWluIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGJpbmRpbmcncyBjYWNoZVxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3aGVuIHlvdSBlZGl0IGFuZCBnbyB0byB0aGUgc2F2ZWQgdmVyc2lvbiB5b3UgaGF2ZSBubyB3YXkgb2Ygc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGVkaXQgdmVyc2lvblxuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdG9EcmFmdFJvb3Rcblx0XHRcdFx0XHRcdFx0PyBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCIsIFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFcIl1cblx0XHRcdFx0XHRcdFx0OiBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChzRW50aXR5U2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHRcdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gc01lc3NhZ2VzUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdFx0aWYgKG9EcmFmdFJvb3QgfHwgb0RyYWZ0Tm9kZSkge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuJHNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IFwiSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCArPSBcIixIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0Y29uc3Qgb1ByZXZpb3VzQmluZGluZyA9ICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIGFueSk/LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0b1ByZXZpb3VzQmluZGluZ1xuXHRcdFx0XHRcdD8ucmVzZXRDaGFuZ2VzKClcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlc2V0aW5nIHRoZSBjaGFuZ2VzIHRvIHRoZSBiaW5kaW5nXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9IaWRkZW5CaW5kaW5nID0gb01vZGVsLmJpbmRDb250ZXh0KHNQYXRoLCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlcXVlc3RlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0XHR9KTtcblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCB0aGlzLm9uRGF0YVJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdFx0cmV0dXJuIG9IaWRkZW5CaW5kaW5nLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRhc3luYyBvbkRhdGFSZWNlaXZlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgc0Vycm9yRGVzY3JpcHRpb24gPSBvRXZlbnQgJiYgb0V2ZW50LmdldFBhcmFtZXRlcihcImVycm9yXCIpO1xuXHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuX29WaWV3KSkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdH1cblxuXHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbikge1xuXHRcdFx0Ly8gVE9ETzogaW4gY2FzZSBvZiA0MDQgdGhlIHRleHQgc2hhbGwgYmUgZGlmZmVyZW50XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBhd2FpdCBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlSGFuZGxlciA9IHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHRcdFx0bGV0IG1QYXJhbXMgPSB7fTtcblx0XHRcdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNTAzKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdGlzSW5pdGlhbExvYWQ1MDNFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSBpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA0MDApIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IHNFcnJvckRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdFx0aXNEYXRhUmVjZWl2ZWRFcnJvcjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNoZWxsQmFjazogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKG1QYXJhbXMpO1xuXHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgY29yZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgc2lkZSBlZmZlY3RzIG9uIGEgYmluZGluZyBjb250ZXh0IHRvIFwicmVmcmVzaFwiIGl0LlxuXHQgKiBUT0RPOiBnZXQgcmlkIG9mIHRoaXMgb25jZSBwcm92aWRlZCBieSB0aGUgbW9kZWxcblx0ICogYSByZWZyZXNoIG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3Qgd29yayBpbiBjYXNlIGEgY3JlYXRpb24gcm93IHdpdGggYSB0cmFuc2llbnQgY29udGV4dCBpc1xuXHQgKiB1c2VkLiBhbHNvIGEgcmVxdWVzdFNpZGVFZmZlY3RzIHdpdGggYW4gZW1wdHkgcGF0aCB3b3VsZCBmYWlsIGR1ZSB0byB0aGUgdHJhbnNpZW50IGNvbnRleHRcblx0ICogdGhlcmVmb3JlIHdlIGdldCBhbGwgZGVwZW5kZW50IGJpbmRpbmdzICh2aWEgcHJpdmF0ZSBtb2RlbCBtZXRob2QpIHRvIGRldGVybWluZSBhbGwgcGF0aHMgYW5kIHRoZW5cblx0ICogcmVxdWVzdCB0aGVtLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0JpbmRpbmdDb250ZXh0IENvbnRleHQgdG8gYmUgcmVmcmVzaGVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQmluZGluZ0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9QYWdlQ29tcG9uZW50ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzU2VydmljZSA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgc0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKTtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPVxuXHRcdFx0KG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoICYmIG9QYWdlQ29tcG9uZW50LmdldENvbnRleHRQYXRoKCkpIHx8IChzRW50aXR5U2V0ICYmIGAvJHtzRW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGxldCBzTWVzc2FnZXNQYXRoO1xuXHRcdGNvbnN0IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhUHJvcGVydHlQYXRoczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IFtdLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGdldEJpbmRpbmdQYXRocyhvQmluZGluZzogYW55KSB7XG5cdFx0XHRsZXQgYURlcGVuZGVudEJpbmRpbmdzO1xuXHRcdFx0Y29uc3Qgc1JlbGF0aXZlUGF0aCA9ICgob0JpbmRpbmcuZ2V0Q29udGV4dCgpICYmIG9CaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpIHx8IFwiXCIpLnJlcGxhY2Uoc1Jvb3RDb250ZXh0UGF0aCwgXCJcIik7IC8vIElmIG5vIGNvbnRleHQsIHRoaXMgaXMgYW4gYWJzb2x1dGUgYmluZGluZyBzbyBubyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRjb25zdCBzUGF0aCA9IChzUmVsYXRpdmVQYXRoID8gYCR7c1JlbGF0aXZlUGF0aC5zbGljZSgxKX0vYCA6IHNSZWxhdGl2ZVBhdGgpICsgb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXG5cdFx0XHRpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgKHNQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRcdC8vIG5vdyBnZXQgdGhlIGRlcGVuZGVudCBiaW5kaW5nc1xuXHRcdFx0XHRhRGVwZW5kZW50QmluZGluZ3MgPSBvQmluZGluZy5nZXREZXBlbmRlbnRCaW5kaW5ncygpO1xuXHRcdFx0XHRpZiAoYURlcGVuZGVudEJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gYXNrIHRoZSBkZXBlbmRlbnQgYmluZGluZ3MgKGFuZCBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBncm91cElkXG5cdFx0XHRcdFx0Ly9pZiAoYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Z2V0QmluZGluZ1BhdGhzKGFEZXBlbmRlbnRCaW5kaW5nc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhUHJvcGVydHlQYXRocy5pbmRleE9mKHNQYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRhUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChzQ29udGV4dFBhdGgpIHtcblx0XHRcdHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHR9XG5cblx0XHQvLyBiaW5kaW5nIG9mIHRoZSBjb250ZXh0IG11c3QgaGF2ZSAkJFBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIHRydWUsIHRoaXMgYm91bmQgY29udGV4dCBtYXkgYmUgbmVlZGVkIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgZGVwZW5kZW50IGJpbmRpbmdcblx0XHRnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSk7XG5cblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMucHVzaCh7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHNbaV1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0eVBhdGhzO1xuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5wdXNoKHNNZXNzYWdlc1BhdGgpO1xuXHRcdH1cblx0XHQvL2FsbCB0aGlzIGxvZ2ljIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBTaWRlRWZmZWN0cyByZXF1ZXN0IGZvciBhbiBlbXB0eSBwYXRoIChyZWZyZXNoIGV2ZXJ5dGhpbmcpLCBhZnRlciB0ZXN0aW5nIHRyYW5zaWVudCBjb250ZXh0c1xuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gb1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucmVkdWNlKCh0YXJnZXRzOiBzdHJpbmdbXSwgdGFyZ2V0UHJvcGVydHkpID0+IHtcblx0XHRcdGlmICh0YXJnZXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHRhcmdldFByb3BlcnR5LmluZGV4T2YoXCIvXCIpO1xuXHRcdFx0XHR0YXJnZXRzLnB1c2goaW5kZXggPiAwID8gdGFyZ2V0UHJvcGVydHkuc2xpY2UoMCwgaW5kZXgpIDogdGFyZ2V0UHJvcGVydHkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhcmdldHM7XG5cdFx0fSwgW10pO1xuXHRcdC8vIE9EYXRhIG1vZGVsIHdpbGwgdGFrZSBjYXJlIG9mIGR1cGxpY2F0ZXNcblx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbLi4ub1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLCAuLi5vU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllc10sIG9CaW5kaW5nQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0QmluZGluZ0NvbnRleHQoKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIG9yIHRoZSBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X3NldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0OiBhbnkpIHtcblx0XHRsZXQgb1ByZXZpb3VzQ29udGV4dCwgb1RhcmdldENvbnRyb2w7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1ZpZXc7XG5cdFx0fVxuXG5cdFx0b1RhcmdldENvbnRyb2wuc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXG5cdFx0aWYgKG9QcmV2aW91c0NvbnRleHQ/LmlzS2VlcEFsaXZlKCkgJiYgb1ByZXZpb3VzQ29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShvUHJldmlvdXNDb250ZXh0LCBmYWxzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGZsZXhpYmxlIGNvbHVtbiBsYXlvdXQgKEZDTCkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgdmlldyAoLTEgaWYgdGhlIGFwcCBpcyBub3QgRkNMKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGxldmVsXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEZDTExldmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uRkNMTGV2ZWw7XG5cdH1cblxuXHRfc2V0S2VlcEFsaXZlKG9Db250ZXh0OiBDb250ZXh0LCBiS2VlcEFsaXZlOiBib29sZWFuLCBmbkJlZm9yZURlc3Ryb3k/OiBGdW5jdGlvbiwgYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pIHtcblx0XHRpZiAob0NvbnRleHQuZ2V0UGF0aCgpLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0Ly8gV2Uga2VlcCB0aGUgY29udGV4dCBhbGl2ZSBvbmx5IGlmIHRoZXkncmUgcGFydCBvZiBhIGNvbGxlY3Rpb24sIGkuZS4gaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgJyknXG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhgKTtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShiS2VlcEFsaXZlLCBmbkJlZm9yZURlc3Ryb3ksICEhc01lc3NhZ2VzUGF0aCAmJiBiUmVxdWVzdE1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWw6IE9EYXRhTW9kZWwsIHBhdGg6IHN0cmluZywgYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4sIHBhcmFtZXRlcnM/OiBhbnkpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHQvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSBjb250ZXh0IHRoYXQgaXMgcmVhbGx5IGtlcHQgYWxpdmUgKHBhcnQgb2YgYSBjb2xsZWN0aW9uKVxuXHRcdC8vIGkuZS4gcmVtb3ZlIGFsbCBzZWdtZW50cyBub3QgZW5kaW5nIHdpdGggYSAnKSdcblx0XHRjb25zdCBrZXB0QWxpdmVTZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9ubmFsU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG5cdFx0d2hpbGUgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAmJiAha2VwdEFsaXZlU2VnbWVudHNba2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnB1c2goa2VwdEFsaXZlU2VnbWVudHMucG9wKCkhKTtcblx0XHR9XG5cblx0XHRpZiAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtlcHRBbGl2ZVBhdGggPSBrZXB0QWxpdmVTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRjb25zdCBvS2VlcEFsaXZlQ29udGV4dCA9IG9Nb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGtlcHRBbGl2ZVBhdGgsIGJSZXF1ZXN0TWVzc2FnZXMsIHBhcmFtZXRlcnMpO1xuXG5cdFx0aWYgKGFkZGl0aW9ubmFsU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gb0tlZXBBbGl2ZUNvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucmV2ZXJzZSgpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25uYWxQYXRoID0gYWRkaXRpb25uYWxTZWdtZW50cy5qb2luKFwiL1wiKTtcblx0XHRcdHJldHVybiBvTW9kZWwuYmluZENvbnRleHQoYWRkaXRpb25uYWxQYXRoLCBvS2VlcEFsaXZlQ29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsLXNjcmVlbiBtb2RlIHdoZW4gRkNMIGlzIHVzZWQuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c3dpdGNoRnVsbFNjcmVlbigpIHtcblx0XHRjb25zdCBvU291cmNlID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBvRkNMSGVscGVyTW9kZWwgPSBvU291cmNlLmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLFxuXHRcdFx0YklzRnVsbFNjcmVlbiA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcIi9hY3Rpb25CdXR0b25zSW5mby9pc0Z1bGxTY3JlZW5cIiksXG5cdFx0XHRzTmV4dExheW91dCA9IG9GQ0xIZWxwZXJNb2RlbC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0YklzRnVsbFNjcmVlbiA/IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2V4aXRGdWxsU2NyZWVuXCIgOiBcIi9hY3Rpb25CdXR0b25zSW5mby9mdWxsU2NyZWVuXCJcblx0XHRcdCksXG5cdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0ID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHR0aGlzLmJhc2UuX3JvdXRpbmcubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHsgc0xheW91dDogc05leHRMYXlvdXQgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJjYW5ub3Qgc3dpdGNoIGJldHdlZW4gY29sdW1uIGFuZCBmdWxsc2NyZWVuXCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlcyB0aGUgY29sdW1uIGZvciB0aGUgY3VycmVudCB2aWV3IGluIGEgRkNMLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5CZWZvcmUpXG5cdGNsb3NlQ29sdW1uKCkge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55O1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0bm9QcmVzZXJ2YXRpb25DYWNoZTogdHJ1ZSxcblx0XHRcdHNMYXlvdXQ6IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Nsb3NlQ29sdW1uXCIpXG5cdFx0fTtcblxuXHRcdGlmIChvVmlld0RhdGE/LnZpZXdMZXZlbCA9PT0gMSAmJiBNb2RlbEhlbHBlci5pc0RyYWZ0U3VwcG9ydGVkKG9NZXRhTW9kZWwsIG9Db250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLl9vVmlldy5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcm5hbFJvdXRpbmc7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0VBK0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFQQSxJQVNNQSxlQUFlLFdBRHBCQyxjQUFjLENBQUMsa0RBQWtELENBQUMsVUFvQmpFQyxjQUFjLEVBQUUsVUFPaEJBLGNBQWMsRUFBRSxVQW9DaEJDLGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBS25DSCxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxVQUtuQ0gsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FRbkNILGVBQWUsRUFBRSxXQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFdBc0JuQ0gsZUFBZSxFQUFFLFdBeUJqQkEsZUFBZSxFQUFFLFdB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
|
|
1071
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsInVzZUNvbnRleHQiLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJfZ2V0QmluZGluZ0NvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJ0YXJnZXRQYXRoIiwibW9kZWwiLCJfYmluZFBhZ2VUb0NvbnRleHQiLCJyZXNvbHZlUGF0aCIsInRlY2huaWNhbFBhdGgiLCJfYmluZFBhZ2VUb1BhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm1lc3NhZ2UiLCJjcmVhdGVGaWx0ZXJGcm9tUGF0aCIsInNlbWFudGljUGF0aCIsInNlbWFudGljS2V5cyIsIm1ldGFNb2RlbCIsInVucXVvdGVBbmREZWNvZGUiLCJ2YWx1ZSIsImxhc3RJbmRleE9mIiwibGVuZ3RoIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyaW5nIiwia2V5VmFsdWVzIiwic3BsaXQiLCJmaW5hbEtleXMiLCJmaW5hbEtleVZhbHVlcyIsImluY2x1ZGVzIiwiZmlsdGVyIiwic2luZ2xlS2V5IiwiZWxlbWVudCIsInN0YXJ0c1dpdGgiLCJmaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiTW9kZWxIZWxwZXIiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJmaWx0ZXJzIiwia2V5UGFydCIsImtleVZhbHVlIiwiRmlsdGVyIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIkVRIiwidmFsdWUxIiwiY2FzZVNlbnNpdGl2ZSIsIm1LZXlWYWx1ZXMiLCJmb3JFYWNoIiwic0tleUFzc2lnbm1lbnQiLCJhUGFydHMiLCJmYWlsZWQiLCJtYXAiLCJzZW1hbnRpY0tleSIsImtleSIsImRyYWZ0RmlsdGVyIiwiYW5kIiwicHVzaCIsImdldFRlY2huaWNhbFBhdGhGcm9tUGF0aCIsInBhdGhXaXRoUGFyYW1ldGVycyIsImtleXMiLCJnZXRNZXRhTW9kZWwiLCJlbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRQYXRoIiwibGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiQkZ3JvdXBJZCIsImNvbnRleHRzIiwicmVxdWVzdENvbnRleHRzIiwicmVmcmVzaENvbnRleHQiLCJwYXRoVG9SZXBsYWNlV2l0aCIsImNvbnRleHRUb1JlbW92ZSIsInJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsImNvbnRleHRUb1JlcGxhY2VXaXRoIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInJlcGxhY2VXaXRoIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJjaGVja0RyYWZ0QXZhaWxhYmlsaXR5IiwibWF0Y2hlcyIsImV4ZWMiLCJkcmFmdFJvb3QiLCJwYXRoVG9SZXNvbHZlIiwibmF2aWdhdGlvblBhcmFtZXRlciIsImxhc3RTZW1hbnRpY01hcHBpbmciLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwiY3VycmVudEhhc2hOb1BhcmFtcyIsImdldEhhc2hDaGFuZ2VyIiwicm9vdEVudGl0eU5hbWUiLCJzdWJzdHIiLCJpc1Jvb3REcmFmdCIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiaXNBY3RpdmVFbnRpdHkiLCJyZXNvbHZlQ29sbGFib3JhdGlvblBhdGgiLCJmb3JtYXR0ZWRTZW1hbnRpY0tleXMiLCIkUHJvcGVydHlQYXRoIiwic2V0TGFzdFNlbWFudGljTWFwcGluZyIsImZvcm1hdHRlZEtleXMiLCJjb21wYXJhdGl2ZVBhdGgiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsIlR5cGVOYW1lIiwib0N1cnJlbnRDb250ZXh0Iiwic0N1cnJlbnRQYXRoIiwib1VzZUNvbnRleHQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIlJvd1ByZXNzIiwicmVmcmVzaCIsImlzQ29ubmVjdGVkIiwiaXNEcmFmdFN1cHBvcnRlZCIsIl9jcmVhdGVDb250ZXh0IiwiQXBwU3RhdGVDaGFuZ2VkIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIl9yZWZyZXNoQmluZGluZ0NvbnRleHQiLCJvUGFyZW50TGlzdEJpbmRpbmciLCJfc2V0S2VlcEFsaXZlIiwiaXNDb250ZXh0VXNlZEluUGFnZXMiLCJiRHJhZnROYXZpZ2F0aW9uIiwic2hvd1BsYWNlaG9sZGVyIiwiYlNob3dQbGFjZWhvbGRlciIsInNQYXRoIiwib1BhZ2VDb21wb25lbnQiLCJzRW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0Iiwic0NvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJvTWV0YU1vZGVsIiwiJCR1cGRhdGVHcm91cElkIiwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyIsIm9EcmFmdFJvb3QiLCJvRHJhZnROb2RlIiwiX2dldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJyZXF1ZXN0T2JqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic01lc3NhZ2VzUGF0aCIsIiRzZWxlY3QiLCJvUHJldmlvdXNCaW5kaW5nIiwiZGVzdHJveSIsIm9IaWRkZW5CaW5kaW5nIiwiYmluZENvbnRleHQiLCJhdHRhY2hFdmVudE9uY2UiLCJCdXN5TG9ja2VyIiwibG9jayIsIm9uRGF0YVJlY2VpdmVkIiwiZ2V0Qm91bmRDb250ZXh0Iiwic0Vycm9yRGVzY3JpcHRpb24iLCJpc0xvY2tlZCIsInVubG9jayIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwibVBhcmFtcyIsInN0YXR1cyIsImlzSW5pdGlhbExvYWQ1MDNFcnJvciIsInNoZWxsQmFjayIsImlzRGF0YVJlY2VpdmVkRXJyb3IiLCJzaG93TWVzc2FnZXMiLCJvU2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwic1Jvb3RDb250ZXh0UGF0aCIsImFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocyIsImFQcm9wZXJ0eVBhdGhzIiwib1NpZGVFZmZlY3RzIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwiZ2V0QmluZGluZ1BhdGhzIiwib0JpbmRpbmciLCJhRGVwZW5kZW50QmluZGluZ3MiLCJzUmVsYXRpdmVQYXRoIiwiZ2V0Q29udGV4dCIsInNsaWNlIiwiZ2V0RGVwZW5kZW50QmluZGluZ3MiLCJpIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJyZWR1Y2UiLCJ0YXJnZXRQcm9wZXJ0eSIsImluZGV4Iiwib1ByZXZpb3VzQ29udGV4dCIsIm9UYXJnZXRDb250cm9sIiwic2V0QmluZGluZ0NvbnRleHQiLCJpc0tlZXBBbGl2ZSIsImJLZWVwQWxpdmUiLCJmbkJlZm9yZURlc3Ryb3kiLCJiUmVxdWVzdE1lc3NhZ2VzIiwiZW5kc1dpdGgiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsInNldEtlZXBBbGl2ZSIsImtlcHRBbGl2ZVNlZ21lbnRzIiwiYWRkaXRpb25uYWxTZWdtZW50cyIsInBvcCIsImtlcHRBbGl2ZVBhdGgiLCJqb2luIiwib0tlZXBBbGl2ZUNvbnRleHQiLCJyZXZlcnNlIiwiYWRkaXRpb25uYWxQYXRoIiwic3dpdGNoRnVsbFNjcmVlbiIsIm9Tb3VyY2UiLCJvRkNMSGVscGVyTW9kZWwiLCJiSXNGdWxsU2NyZWVuIiwic05leHRMYXlvdXQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX3JvdXRpbmciLCJzTGF5b3V0Iiwid2FybmluZyIsImNsb3NlQ29sdW1uIiwib1ZpZXdEYXRhIiwibm9QcmVzZXJ2YXRpb25DYWNoZSIsImRyYWZ0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsIk5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJJbnRlcm5hbFJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IGlzQ29ubmVjdGVkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB7IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5cbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS43NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1wiKVxuY2xhc3MgSW50ZXJuYWxSb3V0aW5nIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgX29WaWV3ITogVmlldztcblxuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29QYWdlQ29tcG9uZW50ITogRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+IHwgbnVsbDtcblxuXHRwcml2YXRlIF9vUm91dGVyITogUm91dGVyO1xuXG5cdHByaXZhdGUgX29Sb3V0aW5nU2VydmljZSE6IFJvdXRpbmdTZXJ2aWNlO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXJQcm94eSE6IFJvdXRlclByb3h5O1xuXG5cdHByaXZhdGUgX2ZuUm91dGVNYXRjaGVkQm91bmQhOiBGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgX29UYXJnZXRJbmZvcm1hdGlvbjogYW55O1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uRXhpdCgpIHtcblx0XHRpZiAodGhpcy5fb1JvdXRpbmdTZXJ2aWNlKSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuX2ZuUm91dGVNYXRjaGVkQm91bmQpO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcy5fb1ZpZXcpIGFzIEVuaGFuY2VXaXRoVUk1PFRlbXBsYXRlQ29tcG9uZW50Pjtcblx0XHR0aGlzLl9vUm91dGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb3V0ZXIoKTtcblx0XHR0aGlzLl9vUm91dGVyUHJveHkgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAoIXRoaXMuX29BcHBDb21wb25lbnQgfHwgIXRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb250cm9sZXIgZXh0ZW5zaW9uICdzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZXNpb25zLkludGVybmFsUm91dGluZ1wiKTtcblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzLl9vQXBwQ29tcG9uZW50ID09PSB0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0Ly8gVGhlIHZpZXcgaXNuJ3QgaG9zdGVkIGluIGEgZGVkaWNhdGVkIFVJQ29tcG9uZW50LCBidXQgZGlyZWN0bHkgaW4gdGhlIGFwcFxuXHRcdFx0Ly8gLS0+IGp1c3Qga2VlcCB0aGUgdmlld1xuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuX29BcHBDb21wb25lbnRcblx0XHRcdC5nZXRTZXJ2aWNlKFwicm91dGluZ1NlcnZpY2VcIilcblx0XHRcdC50aGVuKChvUm91dGluZ1NlcnZpY2U6IFJvdXRpbmdTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZSA9IG9Sb3V0aW5nU2VydmljZTtcblx0XHRcdFx0dGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCA9IHRoaXMuX29uUm91dGVNYXRjaGVkLmJpbmQodGhpcyk7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0XHRcdHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbiA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcih0aGlzLl9vUGFnZUNvbXBvbmVudCB8fCB0aGlzLl9vVmlldyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhpcyBjb250cm9sbGVyIGV4dGVuc2lvbiBjYW5ub3Qgd29yayB3aXRob3V0IGEgJ3JvdXRpbmdTZXJ2aWNlJyBvbiB0aGUgbWFpbiBBcHBDb21wb25lbnRcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VyZWQgZXZlcnkgdGltZSB0aGlzIGNvbnRyb2xsZXIgaXMgYSBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25Sb3V0ZU1hdGNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCkge1xuXHRcdC8qKi9cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdGNvbnN0IG9Sb3V0aW5nID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZztcblx0XHRpZiAob1JvdXRpbmcgJiYgb1JvdXRpbmcub25CZWZvcmVCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpIHtcblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLm9uQ29udGV4dEJvdW5kVG9WaWV3KG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkFmdGVyQmluZGluZykge1xuXHRcdFx0b1JvdXRpbmcub25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBhZnRlciBhIHVzZXIgYWN0aW9uXG5cdC8vIChlLmcuIGNsaWNrIG9uIGEgdGFibGUgcm93LCBidXR0b24sIGV0Yy4uLilcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBzTmF2aWdhdGlvblRhcmdldE5hbWUgTmFtZSBvZiB0aGUgbmF2aWdhdGlvbiB0YXJnZXRcblx0ICogQHBhcmFtIGJQcmVzZXJ2ZUhpc3RvcnkgVHJ1ZSB0byBmb3JjZSB0aGUgbmV3IFVSTCB0byBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBicm93c2VyIGhpc3RvcnkgKG5vIHJlcGxhY2UpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9UYXJnZXQob0NvbnRleHQ6IGFueSwgc05hdmlnYXRpb25UYXJnZXROYW1lOiBzdHJpbmcsIGJQcmVzZXJ2ZUhpc3Rvcnk/OiBib29sZWFuKSB7XG5cdFx0Y29uc3Qgb05hdmlnYXRpb25Db25maWd1cmF0aW9uID1cblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50ICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oc05hdmlnYXRpb25UYXJnZXROYW1lKTtcblx0XHRpZiAob05hdmlnYXRpb25Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsUm91dGUgPSBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24uZGV0YWlsO1xuXHRcdFx0Y29uc3Qgc1JvdXRlTmFtZSA9IG9EZXRhaWxSb3V0ZS5yb3V0ZTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJNYXBwaW5nID0gb0RldGFpbFJvdXRlLnBhcmFtZXRlcnM7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgc1JvdXRlTmFtZSwgbVBhcmFtZXRlck1hcHBpbmcsIGJQcmVzZXJ2ZUhpc3RvcnkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUbyhvQ29udGV4dCwgbnVsbCwgbnVsbCwgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fVxuXHRcdHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiB0YXJnZXQgcm91dGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0Um91dGVOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCByb3V0ZVxuXHQgKiBAcGFyYW0gW29QYXJhbWV0ZXJzXSBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2l0aCByb3V0ZSB0byBjcmVhdGUgdGhlIHRhcmdldCBoYXNoXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGZpbmFsaXplZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZTogc3RyaW5nLCBvUGFyYW1ldGVycz86IG9iamVjdCkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb1JvdXRlKHNUYXJnZXRSb3V0ZU5hbWUsIG9QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHRJbmZvOiBhbnkgPSB7fTtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0aWYgKG9Db250ZXh0LmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0KSB7XG5cdFx0XHRcdC8vIHRoZSBjb250ZXh0IGlzIGVpdGhlciBjcmVhdGVkIGFzeW5jIChQcm9taXNlKVxuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGFjdGl2YXRlIHRoZSByb3V0ZU1hdGNoU3luY2hybyBvbiB0aGUgUm91dGVyUHJveHkgdG8gYXZvaWQgdGhhdFxuXHRcdFx0XHQvLyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIG5hdmlnYXRlVG9Db250ZXh0IGNvbmZsaWN0cyB3aXRoIHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uKCk7XG5cblx0XHRcdFx0bVBhcmFtZXRlcnMuYXN5bmNDb250ZXh0XG5cdFx0XHRcdFx0LnRoZW4oKGFzeW5jQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBvbmNlIHRoZSBjb250ZXh0IGlzIHJldHVybmVkIHdlIG5hdmlnYXRlIGludG8gaXRcblx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVUb0NvbnRleHQoYXN5bmNDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiBtUGFyYW1ldGVycy5jaGVja05vSGFzaENoYW5nZSxcblx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IG1QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0XHRcdFx0XHR1cGRhdGVGQ0xMZXZlbDogbVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwsXG5cdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiBtUGFyYW1ldGVycy5iRm9yY2VGb2N1c1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aXRoIHRoZSBhc3luYyBjb250ZXh0XCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFtUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0KSB7XG5cdFx0XHRcdC8vIE5hdmlnYXRlIHRvIGEgbGlzdCBiaW5kaW5nIG5vdCB5ZXQgc3VwcG9ydGVkXG5cdFx0XHRcdHRocm93IFwibmF2aWdhdGlvbiB0byBhIGxpc3QgYmluZGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jYWxsRXh0ZW5zaW9uKSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cblx0XHRcdG9Db250ZXh0SW5mby5zb3VyY2VCaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0b0NvbnRleHRJbmZvLmJpbmRpbmdDb250ZXh0ID0gb0NvbnRleHQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMub0V2ZW50KSB7XG5cdFx0XHRcdG9Db250ZXh0SW5mby5vRXZlbnQgPSBtUGFyYW1ldGVycy5vRXZlbnQ7XG5cdFx0XHR9XG5cdFx0XHQvLyBTdG9yaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0IHRvIHVzZSBpdCBpbiBpbnRlcm5hbCByb3V0ZSBuYXZpZ2F0aW9uIGlmIG5lY2Nlc3NhcnkuXG5cdFx0XHRjb25zdCBiT3ZlcnJpZGVOYXYgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nLm9uQmVmb3JlTmF2aWdhdGlvbihvQ29udGV4dEluZm8pO1xuXHRcdFx0aWYgKGJPdmVycmlkZU5hdikge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzLCB0aGlzLl9vVmlldy5nZXRWaWV3RGF0YSgpLCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrd2FyZHMgZnJvbSBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIG5hdmlnYXRlZCBmcm9tXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IC0xO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgZm9yd2FyZHMgdG8gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9wdGlvbmFsIG5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdG5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyBiYWNrIGluIGhpc3RvcnkgaWYgdGhlIGN1cnJlbnQgaGFzaCBjb3JyZXNwb25kcyB0byBhIHRyYW5zaWVudCBzdGF0ZS5cblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKSB7XG5cdFx0Y29uc3Qgc0hhc2ggPSB0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpO1xuXG5cdFx0Ly8gaWYgdHJpZ2dlcmVkIHdoaWxlIG5hdmlnYXRpbmcgdG8gKC4uLiksIHdlIG5lZWQgdG8gbmF2aWdhdGUgYmFja1xuXHRcdGlmIChzSGFzaC5pbmRleE9mKFwiKC4uLilcIikgIT09IC0xKSB7XG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkubmF2QmFjaygpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2Uoc0Vycm9yTWVzc2FnZTogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLl9vUm91dGVyUHJveHkuZ2V0SGFzaCgpLmluZGV4T2YoXCJpLWFjdGlvbj1jcmVhdGVcIikgPiAtMSB8fFxuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmRleE9mKFwiaS1hY3Rpb249YXV0b0NyZWF0ZVwiKSA+IC0xXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1JvdXRlclByb3h5Lm5hdlRvSGFzaCh0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0RGVmYXVsdENyZWF0ZUhhc2goKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLkZDTExldmVsID0gdGhpcy5fZ2V0RkNMTGV2ZWwoKTtcblxuXHRcdFx0cmV0dXJuICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZGlzcGxheUVycm9yUGFnZShzRXJyb3JNZXNzYWdlLCBtUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBvbmUgb2YgdGhlIGN1cnJlbnQgdmlld3Mgb24gdGhlIHNjcmVlbiBpcyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0YXRlIGlzIGltcGFjdGVkIGJ5IHRoZSBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGlzQ3VycmVudFN0YXRlSW1wYWN0ZWRCeShvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5pc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQpO1xuXHR9XG5cblx0X2lzVmlld1BhcnRPZlJvdXRlKHJvdXRlSW5mb3JtYXRpb246IGFueSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFUYXJnZXRzID0gcm91dGVJbmZvcm1hdGlvbj8udGFyZ2V0cztcblx0XHRpZiAoIWFUYXJnZXRzIHx8IGFUYXJnZXRzLmluZGV4T2YodGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLnRhcmdldE5hbWUpID09PSAtMSkge1xuXHRcdFx0Ly8gSWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGhhcyBhIHZpZXcgbGV2ZWwgZ3JlYXRlciB0aGFuIHRoZSByb3V0ZSBsZXZlbCwgaXQgbWVhbnMgdGhpcyB2aWV3IGNvbWVzIFwiYWZ0ZXJcIiB0aGUgcm91dGVcblx0XHRcdC8vIGluIHRlcm1zIG9mIG5hdmlnYXRpb24uXG5cdFx0XHQvLyBJbiBzdWNoIGNhc2UsIHdlIHJlbW92ZSBpdHMgYmluZGluZyBjb250ZXh0LCB0byBhdm9pZCB0aGlzIHZpZXcgdG8gaGF2ZSBkYXRhIGlmIHdlIG5hdmlnYXRlIHRvIGl0IGxhdGVyIG9uXG5cdFx0XHRpZiAoKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi52aWV3TGV2ZWwgPz8gMCkgPj0gKHJvdXRlSW5mb3JtYXRpb24/LnJvdXRlTGV2ZWwgPz8gMCkpIHtcblx0XHRcdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7IC8vIFRoaXMgYWxzbyBjYWxsIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gdGhlIGN1cnJlbnQgY29udGV4dFxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X2J1aWxkQmluZGluZ1BhdGgocm91dGVBcmd1bWVudHM6IGFueSwgYmluZGluZ1BhdHRlcm46IHN0cmluZywgbmF2aWdhdGlvblBhcmFtZXRlcnM6IGFueSk6IHsgcGF0aDogc3RyaW5nOyBkZWZlcnJlZDogYm9vbGVhbiB9IHtcblx0XHRsZXQgcGF0aCA9IGJpbmRpbmdQYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRsZXQgZGVmZXJyZWQgPSBmYWxzZTtcblxuXHRcdGZvciAoY29uc3Qgc0tleSBpbiByb3V0ZUFyZ3VtZW50cykge1xuXHRcdFx0Y29uc3Qgc1ZhbHVlID0gcm91dGVBcmd1bWVudHNbc0tleV07XG5cdFx0XHRpZiAoc1ZhbHVlID09PSBcIi4uLlwiICYmIGJpbmRpbmdQYXR0ZXJuLmluZGV4T2YoYHske3NLZXl9fWApID49IDApIHtcblx0XHRcdFx0ZGVmZXJyZWQgPSB0cnVlO1xuXHRcdFx0XHQvLyBTb21ldGltZXMgaW4gcHJlZmVycmVkTW9kZSA9IGNyZWF0ZSwgdGhlIGVkaXQgYnV0dG9uIGlzIHNob3duIGluIGJhY2tncm91bmQgd2hlbiB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgc2hvd3MgdXAsIHNldHRpbmcgYlRhcmdldEVkaXRhYmxlIHBhc3NlcyBlZGl0YWJsZSBhcyB0cnVlXG5cdFx0XHRcdC8vIHRvIG9uQmVmb3JlQmluZGluZyBpbiBfYmluZFRhcmdldFBhZ2UgZnVuY3Rpb25cblx0XHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoYHske3NLZXl9fWAsIHNWYWx1ZSk7XG5cdFx0fVxuXHRcdGlmIChyb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXSAmJiByb3V0ZUFyZ3VtZW50c1tcIj9xdWVyeVwiXS5oYXNPd25Qcm9wZXJ0eShcImktYWN0aW9uXCIpKSB7XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyB0aGUgYmluZGluZyBwYXRoIGlzIGFsd2F5cyBhYnNvbHV0ZVxuXHRcdGlmIChwYXRoICYmIHBhdGhbMF0gIT09IFwiL1wiKSB7XG5cdFx0XHRwYXRoID0gYC8ke3BhdGh9YDtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBwYXRoLCBkZWZlcnJlZCB9O1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gTWV0aG9kcyB0byBiaW5kIHRoZSBwYWdlIHdoZW4gYSByb3V0ZSBpcyBtYXRjaGVkXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZC5cblx0ICogQnVpbGRzIHRoZSBiaW5kaW5nIGNvbnRleHQgZnJvbSB0aGUgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzLCBhbmQgYmluZCB0aGUgcGFnZSBhY2NvcmRpbmdseS5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9vblJvdXRlTWF0Y2hlZChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHRhcmdldCBmb3IgdGhpcyB2aWV3IGlzIHBhcnQgb2YgdGhlIGV2ZW50IHRhcmdldHMgKGkuZS4gaXMgYSB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHJvdXRlKS5cblx0XHQvLyBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gYmluZCBpdCAtLT4gcmV0dXJuXG5cdFx0aWYgKCF0aGlzLl9pc1ZpZXdQYXJ0T2ZSb3V0ZShvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVJbmZvcm1hdGlvblwiKSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXRyaWV2ZSB0aGUgYmluZGluZyBjb250ZXh0IHBhdHRlcm5cblx0XHRsZXQgYmluZGluZ1BhdHRlcm47XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50ICYmIHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0UGF0dGVybikge1xuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4oKTtcblx0XHR9XG5cdFx0YmluZGluZ1BhdHRlcm4gPSBiaW5kaW5nUGF0dGVybiB8fCB0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24uY29udGV4dFBhdHRlcm47XG5cblx0XHRpZiAoYmluZGluZ1BhdHRlcm4gPT09IG51bGwgfHwgYmluZGluZ1BhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gRG9uJ3QgZG8gdGhpcyBpZiB3ZSBhbHJlYWR5IGdvdCBzVGFyZ2V0ID09ICcnLCB3aGljaCBpcyBhIHZhbGlkIHRhcmdldCBwYXR0ZXJuXG5cdFx0XHRiaW5kaW5nUGF0dGVybiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyb3V0ZVBhdHRlcm5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGVpciB2YWx1ZXMgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0Y29uc3QgbUFyZ3VtZW50cyA9IChvRXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIGFueSkuYXJndW1lbnRzO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJuYXZpZ2F0aW9uSW5mb1wiKTtcblx0XHRjb25zdCB7IHBhdGgsIGRlZmVycmVkIH0gPSB0aGlzLl9idWlsZEJpbmRpbmdQYXRoKG1Bcmd1bWVudHMsIGJpbmRpbmdQYXR0ZXJuLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXG5cdFx0dGhpcy5vblJvdXRlTWF0Y2hlZCgpO1xuXG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGxldCBvT3V0O1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRvT3V0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5vblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk7XG5cdFx0fSk7XG5cblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBkZWZmZXJlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kRGVmZXJyZWQoc1RhcmdldFBhdGg6IHN0cmluZywgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsLCB7IGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlIH0pO1xuXG5cdFx0aWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0IHx8ICFvTmF2aWdhdGlvblBhcmFtZXRlcnMub0FzeW5jQ29udGV4dCkge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHNUYXJnZXRQYXRoLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy51c2VDb250ZXh0LFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iQWN0aW9uQ3JlYXRlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRpZiAoY3VycmVudEJpbmRpbmdDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHQvLyBGb3Igbm93IHJlbW92ZSB0aGUgcGVuZGluZyBjaGFuZ2VzIHRvIGF2b2lkIHRoZSBtb2RlbCByYWlzZXMgZXJyb3JzIGFuZCB0aGUgb2JqZWN0IHBhZ2UgaXMgYXQgbGVhc3QgYm91bmRcblx0XHRcdC8vIElkZWFsbHkgdGhlIHVzZXIgc2hvdWxkIGJlIGFza2VkIGZvclxuXHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyByZW1vdmUgdGhlIGNvbnRleHQgdG8gYXZvaWQgc2hvd2luZyBvbGQgZGF0YVxuXHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgcGF0aCB0byB0aGUgY29udGV4dFxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGJpbmRpbmcgaGFzIGJlZW4gc2V0IG9uIHRoZSBwYWdlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlKHRhcmdldFBhdGg6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pIHtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gXCJcIikge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChudWxsLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlUGF0aCh0YXJnZXRQYXRoLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigodGVjaG5pY2FsUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHRoaXMuX2JpbmRQYWdlVG9QYXRoKHRlY2huaWNhbFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEVycm9yIGhhbmRsaW5nIGZvciBlcnJvbmVvdXMgbWV0YWRhdGEgcmVxdWVzdFxuXHRcdFx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cblx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UocmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksIHtcblx0XHRcdFx0XHR0aXRsZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBlcnJvci5tZXNzYWdlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgZmlsdGVyIHRvIHJldHJpZXZlIGEgY29udGV4dCBjb3JyZXNwb25kaW5nIHRvIGEgc2VtYW50aWMgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNlbWFudGljUGF0aCBUaGUgc2VtYW50aWMgb3IgdGVjaG5pY2FsIHBhdGhcblx0ICogQHBhcmFtIHNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMgb3IgdGVjaG5pY2FsIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhbW9kZWxcblx0ICogQHJldHVybnMgVGhlIGZpbHRlclxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGNyZWF0ZUZpbHRlckZyb21QYXRoKHNlbWFudGljUGF0aDogc3RyaW5nLCBzZW1hbnRpY0tleXM6IHN0cmluZ1tdLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogRmlsdGVyIHwgbnVsbCB7XG5cdFx0Y29uc3QgdW5xdW90ZUFuZERlY29kZSA9IGZ1bmN0aW9uICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRcdGlmICh2YWx1ZS5pbmRleE9mKFwiJ1wiKSA9PT0gMCAmJiB2YWx1ZS5sYXN0SW5kZXhPZihcIidcIikgPT09IHZhbHVlLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBxdW90ZXMgZnJvbSB0aGUgdmFsdWUgYW5kIGRlY29kZSBzcGVjaWFsIGNoYXJzXG5cdFx0XHRcdHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fTtcblx0XHRjb25zdCBrZXlWYWx1ZXMgPSBzZW1hbnRpY1BhdGguc3Vic3RyaW5nKHNlbWFudGljUGF0aC5pbmRleE9mKFwiKFwiKSArIDEsIHNlbWFudGljUGF0aC5sZW5ndGggLSAxKS5zcGxpdChcIixcIik7XG5cblx0XHRsZXQgZmluYWxLZXlzID0gc2VtYW50aWNLZXlzO1xuXHRcdGxldCBmaW5hbEtleVZhbHVlcyA9IGtleVZhbHVlcztcblx0XHQvLyBJZiB3ZSBoYXZlIHRlY2huaWNhbCBrZXlzLCBJc0FjdGl2ZUVudGl0eSB3aWxsIGJlIHByZXNlbnQuIFdlIG5lZWQgdG8gcmVtb3ZlIGl0IGFzIHdlJ3JlIGFscmVhZHkgYWRkaW5nIHRoZW0gYXQgdGhlIGVuZC5cblx0XHRpZiAoc2VtYW50aWNLZXlzLmluY2x1ZGVzKFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRcdGZpbmFsS2V5cyA9IHNlbWFudGljS2V5cy5maWx0ZXIoKHNpbmdsZUtleSkgPT4gc2luZ2xlS2V5LmluZGV4T2YoXCJJc0FjdGl2ZUVudGl0eVwiKSA8IDApO1xuXHRcdFx0ZmluYWxLZXlWYWx1ZXMgPSBrZXlWYWx1ZXMuZmlsdGVyKChlbGVtZW50KSA9PiAhZWxlbWVudC5zdGFydHNXaXRoKFwiSXNBY3RpdmVFbnRpdHlcIikpO1xuXHRcdH1cblxuXHRcdGlmIChmaW5hbEtleXMubGVuZ3RoICE9IGZpbmFsS2V5VmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IE1vZGVsSGVscGVyLmlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShtZXRhTW9kZWwpO1xuXHRcdGxldCBmaWx0ZXJzOiBGaWx0ZXJbXTtcblx0XHRpZiAoZmluYWxLZXlzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHRlY2huaWNhbCBrZXksIHRoZSBlcXVhbCBpcyBwcmVzZW50IGJlY2F1c2UgdGhlcmUncyBhdCBsZWFzdCAyIHBhcmFtZXRlcnMsIGEgdGVjaG5pY2FsIGtleSBhbmQgSXNBY3RpdmVFbnRpdHlcblx0XHRcdGlmIChmaW5hbEtleVZhbHVlc1swXS5pbmRleE9mKFwiPVwiKSA+IDApIHtcblx0XHRcdFx0Y29uc3Qga2V5UGFydCA9IGZpbmFsS2V5VmFsdWVzWzBdLnNwbGl0KFwiPVwiKTtcblx0XHRcdFx0ZmluYWxLZXlWYWx1ZXNbMF0gPSBrZXlQYXJ0WzFdO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVGFrZSB0aGUgZmlyc3Qga2V5IHZhbHVlXG5cdFx0XHRjb25zdCBrZXlWYWx1ZSA9IHVucXVvdGVBbmREZWNvZGUoZmluYWxLZXlWYWx1ZXNbMF0pO1xuXHRcdFx0ZmlsdGVycyA9IFtcblx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0cGF0aDogZmluYWxLZXlzWzBdLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHR2YWx1ZTE6IGtleVZhbHVlLFxuXHRcdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGZpbHRlcmluZ0Nhc2VTZW5zaXRpdmVcblx0XHRcdFx0fSlcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1LZXlWYWx1ZXM6IGFueSA9IHt9O1xuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBrZXkgdmFsdWVzXG5cdFx0XHRmaW5hbEtleVZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5QXNzaWdubWVudDogc3RyaW5nKSB7XG5cdFx0XHRcdGNvbnN0IGFQYXJ0cyA9IHNLZXlBc3NpZ25tZW50LnNwbGl0KFwiPVwiKSxcblx0XHRcdFx0XHRrZXlWYWx1ZSA9IHVucXVvdGVBbmREZWNvZGUoYVBhcnRzWzFdKTtcblxuXHRcdFx0XHRtS2V5VmFsdWVzW2FQYXJ0c1swXV0gPSBrZXlWYWx1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRsZXQgZmFpbGVkID0gZmFsc2U7XG5cdFx0XHRmaWx0ZXJzID0gZmluYWxLZXlzLm1hcChmdW5jdGlvbiAoc2VtYW50aWNLZXkpIHtcblx0XHRcdFx0Y29uc3Qga2V5ID0gc2VtYW50aWNLZXksXG5cdFx0XHRcdFx0dmFsdWUgPSBtS2V5VmFsdWVzW2tleV07XG5cblx0XHRcdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBrZXksXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZhaWxlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogXCJYWFwiXG5cdFx0XHRcdFx0fSk7IC8vIHdpbGwgYmUgaWdub3JlZCBhbnl3YXkgc2luY2Ugd2UgcmV0dXJuIGFmdGVyXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoZmFpbGVkKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCBhIGRyYWZ0IGZpbHRlciB0byBtYWtlIHN1cmUgd2UgdGFrZSB0aGUgZHJhZnQgZW50aXR5IGlmIHRoZXJlIGlzIG9uZVxuXHRcdC8vIE9yIHRoZSBhY3RpdmUgZW50aXR5IG90aGVyd2lzZVxuXHRcdGNvbnN0IGRyYWZ0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBbbmV3IEZpbHRlcihcIklzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgZmFsc2UpLCBuZXcgRmlsdGVyKFwiU2libGluZ0VudGl0eS9Jc0FjdGl2ZUVudGl0eVwiLCBcIkVRXCIsIG51bGwpXSxcblx0XHRcdGFuZDogZmFsc2Vcblx0XHR9KTtcblx0XHRmaWx0ZXJzLnB1c2goZHJhZnRGaWx0ZXIpO1xuXG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVycywgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBwYXRoIHdpdGggc2VtYW50aWMga2V5cyB0byBhIHBhdGggd2l0aCB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhXaXRoUGFyYW1ldGVycyBUaGUgcGF0aCB3aXRoIHNlbWFudGljIGtleXNcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIGtleXMgVGhlIHNlbWFudGljIG9yIHRlY2huaWNhbCBrZXlzIGZvciB0aGUgcGF0aFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgY29udGFpbmluZyB0aGUgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzIGlmIHBhdGhXaXRoUGFyYW1ldGVycyBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHRlY2huaWNhbCBwYXRoLCBudWxsIG90aGVyd2lzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIGdldFRlY2huaWNhbFBhdGhGcm9tUGF0aChwYXRoV2l0aFBhcmFtZXRlcnM6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGVudGl0eVNldFBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGF0aFdpdGhQYXJhbWV0ZXJzKS5nZXRQYXRoKCk7XG5cblx0XHRpZiAoIWtleXMgfHwga2V5cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIE5vIHNlbWFudGljL3RlY2huaWNhbCBrZXlzXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSBzZXQgb2YgZmlsdGVycyBjb3JyZXNwb25kaW5nIHRvIGFsbCBrZXlzXG5cdFx0Y29uc3QgZmlsdGVyID0gdGhpcy5jcmVhdGVGaWx0ZXJGcm9tUGF0aChwYXRoV2l0aFBhcmFtZXRlcnMsIGtleXMsIG1ldGFNb2RlbCk7XG5cdFx0aWYgKGZpbHRlciA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgaW50ZXJwcmV0IHRoZSBwYXRoIGFzIGEgc2VtYW50aWMgb25lXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBMb2FkIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdFxuXHRcdGlmICghZW50aXR5U2V0UGF0aD8uc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdGVudGl0eVNldFBhdGggPSBgLyR7ZW50aXR5U2V0UGF0aH1gO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0QmluZGluZyA9IG1vZGVsLmJpbmRMaXN0KGVudGl0eVNldFBhdGgsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmaWx0ZXIsIHtcblx0XHRcdCQkZ3JvdXBJZDogXCIkYXV0by5IZXJvZXNcIlxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0aWYgKGNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHRzWzBdLmdldFBhdGgoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZGF0YSBjb3VsZCBiZSBsb2FkZWRcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZXNoZXMgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBwYXRoVG9SZXBsYWNlV2l0aCBUaGUgcGF0aCB0byB0aGUgbmV3IGNvbnRleHRcblx0ICogQHBhcmFtIGNvbnRleHRUb1JlbW92ZSBUaGUgaW5pdGlhbCBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVwbGFjZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIHJlZnJlc2hDb250ZXh0KG1vZGVsOiBPRGF0YU1vZGVsLCBwYXRoVG9SZXBsYWNlV2l0aDogc3RyaW5nLCBjb250ZXh0VG9SZW1vdmU6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGlmIChyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRUb1JlcGxhY2VXaXRoID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChwYXRoVG9SZXBsYWNlV2l0aCk7XG5cdFx0XHRjb250ZXh0VG9SZW1vdmUucmVwbGFjZVdpdGgoY29udGV4dFRvUmVwbGFjZVdpdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBhIHJvb3QgZHJhZnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRlc3Rcblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgYSByb290IHBhdGhcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjaGVja0RyYWZ0QXZhaWxhYmlsaXR5KHBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1hdGNoZXMgPSAvXlsvXT8oXFx3KylcXChbXi9dK1xcKSQvLmV4ZWMocGF0aCk7XG5cdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdC8vIEdldCB0aGUgZW50aXR5U2V0IG5hbWVcblx0XHRjb25zdCBlbnRpdHlTZXRQYXRoID0gYC8ke21hdGNoZXNbMV19YDtcblx0XHQvLyBDaGVjayB0aGUgZW50aXR5IHNldCBzdXBwb3J0cyBkcmFmdFxuXHRcdGNvbnN0IGRyYWZ0Um9vdCA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7ZW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdHJldHVybiBkcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGEgcGF0aCB0byBuYXZpZ2F0ZSB0byBmcm9tIGEgcGF0aCB3aXRoIFNlbWFudGljS2V5cyBvciB0ZWNobmljYWwga2V5cy5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhUb1Jlc29sdmUgVGhlIHBhdGggdG8gYmUgdHJhbnNmb3JtZWRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlciBUaGUgcGFyYW1ldGVyIG9mIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEByZXR1cm5zIFN0cmluZyBwcm9taXNlIGZvciB0aGUgbmV3IHBhdGguIElmIHBhdGhUb1Jlc29sdmUgY291bGRuJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZW1hbnRpYyBwYXRoLCBpdCBpcyByZXR1cm5lZCBhcyBpcy5cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRhc3luYyByZXNvbHZlUGF0aChwYXRoVG9SZXNvbHZlOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9vUm91dGluZ1NlcnZpY2UuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHRcdGxldCBjdXJyZW50SGFzaE5vUGFyYW1zID0gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKS5zcGxpdChcIj9cIilbMF07XG5cblx0XHRpZiAoY3VycmVudEhhc2hOb1BhcmFtcz8ubGFzdEluZGV4T2YoXCIvXCIpID09PSBjdXJyZW50SGFzaE5vUGFyYW1zPy5sZW5ndGggLSAxKSB7XG5cdFx0XHQvLyBSZW1vdmUgdHJhaWxpbmcgJy8nXG5cdFx0XHRjdXJyZW50SGFzaE5vUGFyYW1zID0gY3VycmVudEhhc2hOb1BhcmFtcy5zdWJzdHJpbmcoMCwgY3VycmVudEhhc2hOb1BhcmFtcy5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRsZXQgcm9vdEVudGl0eU5hbWUgPSBjdXJyZW50SGFzaE5vUGFyYW1zPy5zdWJzdHIoMCwgY3VycmVudEhhc2hOb1BhcmFtcy5pbmRleE9mKFwiKFwiKSk7XG5cdFx0aWYgKHJvb3RFbnRpdHlOYW1lLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHRyb290RW50aXR5TmFtZSA9IHJvb3RFbnRpdHlOYW1lLnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgaXNSb290RHJhZnQgPSB0aGlzLmNoZWNrRHJhZnRBdmFpbGFiaWxpdHkoY3VycmVudEhhc2hOb1BhcmFtcywgbWV0YU1vZGVsKSxcblx0XHRcdHNlbWFudGljS2V5cyA9IGlzUm9vdERyYWZ0XG5cdFx0XHRcdD8gKFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhtZXRhTW9kZWwsIHJvb3RFbnRpdHlOYW1lKSBhcyB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10pXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0aXNDb2xsYWJvcmF0aW9uRW5hYmxlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCksXG5cdFx0XHRpc0FjdGl2ZUVudGl0eSA9IG5hdmlnYXRpb25QYXJhbWV0ZXI/LnVzZUNvbnRleHQ/LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPz8gdHJ1ZTtcblx0XHQvKipcblx0XHQgKiBJZiB0aGUgZW50aXR5IGlzIGRyYWZ0IGVuYWJsZWQsIGFuZCB3ZSdyZSBpbiBhIGNvbGxhYm9yYXRpb24gYXBwbGljYXRpb24sIGFuZCB3ZSdyZSBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQsIHdlJ3JlIHRyZWF0aW5nIGl0IGFzIGEgbmV3IHBhdGguXG5cdFx0ICogV2Ugd2FudCB0byBjaGVjayBpZiB0aGUgZHJhZnQgZXhpc3RzIGZpcnN0LCB0aGVuIHdlIG5hdmlnYXRlIG9uIGl0IGlmIGl0IGRvZXMgZXhpc3QsIG90aGVyd2lzZSB3ZSBuYXZpZ2F0ZSB0byB0aGUgc2F2ZWQgdmVyc2lvbi5cblx0XHQgKi9cblx0XHRpZiAoaXNSb290RHJhZnQgJiYgaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCAmJiAhaXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVDb2xsYWJvcmF0aW9uUGF0aChwYXRoVG9SZXNvbHZlLCBtb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlciwgc2VtYW50aWNLZXlzLCByb290RW50aXR5TmFtZSk7XG5cdFx0fVxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgaXMgdGhlICdub3JtYWwnIHByb2Nlc3MuXG5cdFx0ICogSWYgd2UgZG9uJ3QgaGF2ZSBzZW1hbnRpYyBrZXlzLCB0aGUgcGF0aCB3ZSBoYXZlIGlzIHRlY2huaWNhbCBhbmQgY2FuIGJlIHVzZWQgYXMgaXMuXG5cdFx0ICogSWYgdGhlIHBhdGggdG8gcmVzb2x2ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2VtYW50aWMgcGF0aCwgdGhlbiB3ZSBrbm93IGlzIGhhcyBiZWVuIHJlc29sdmVkIHByZXZpb3VzbHkgYW5kIHdlIGNhbiByZXR1cm4gdGhlIHRlY2huaWNhbCBwYXRoXG5cdFx0ICogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGV2YWx1YXRlIHRoZSB0ZWNobmljYWwgcGF0aCwgdG8gc2V0IHVwIHRoZSBzZW1hbnRpYyBtYXBwaW5nIChpZiBpdCdzIGJlZW4gcmVzb2x2ZWQpLlxuXHRcdCAqL1xuXHRcdGlmIChzZW1hbnRpY0tleXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHBhdGhUb1Jlc29sdmU7XG5cdFx0fVxuXHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGggPT09IHBhdGhUb1Jlc29sdmUpIHtcblx0XHRcdC8vIFRoaXMgc2VtYW50aWMgcGF0aCBoYXMgYmVlbiByZXNvbHZlZCBwcmV2aW91c2x5XG5cdFx0XHRyZXR1cm4gbGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoO1xuXHRcdH1cblx0XHRjb25zdCBmb3JtYXR0ZWRTZW1hbnRpY0tleXMgPSBzZW1hbnRpY0tleXMubWFwKChzaW5nbGVLZXkpID0+IHNpbmdsZUtleS4kUHJvcGVydHlQYXRoKTtcblxuXHRcdC8vIFdlIG5lZWQgcmVzb2x2ZSB0aGUgc2VtYW50aWMgcGF0aCB0byBnZXQgdGhlIHRlY2huaWNhbCBrZXlzXG5cdFx0Y29uc3QgdGVjaG5pY2FsUGF0aCA9IGF3YWl0IHRoaXMuZ2V0VGVjaG5pY2FsUGF0aEZyb21QYXRoKGN1cnJlbnRIYXNoTm9QYXJhbXMsIG1vZGVsLCBmb3JtYXR0ZWRTZW1hbnRpY0tleXMpO1xuXG5cdFx0aWYgKHRlY2huaWNhbFBhdGggJiYgdGVjaG5pY2FsUGF0aCAhPT0gcGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0Ly8gVGhlIHNlbWFudGljIHBhdGggd2FzIHJlc29sdmVkIChvdGhlcndpc2Uga2VlcCB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHRhcmdldClcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHtcblx0XHRcdFx0dGVjaG5pY2FsUGF0aDogdGVjaG5pY2FsUGF0aCxcblx0XHRcdFx0c2VtYW50aWNQYXRoOiBwYXRoVG9SZXNvbHZlXG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0ZWNobmljYWxQYXRoO1xuXHRcdH1cblx0XHRyZXR1cm4gcGF0aFRvUmVzb2x2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmFsdWF0ZSB0aGUgcGF0aCB0byBuYXZpZ2F0ZSB3aGVuIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbiBhbmQgbmF2aWdhdGluZyB0byBhIGRyYWZ0LlxuXHQgKiBJZiB0aGUgZHJhZnQgaGFzIGJlZW4gZGlzY2FyZGVkLCB3ZSBjaGFuZ2UgdGhlIHBhdGggdG8gdGhlIHNpYmxpbmcgZWxlbWVudCBhc3NvY2lhdGVkLCBvdGhlcndpc2Ugd2Uga2VlcCB0aGUgc2FtZSBwYXRoLlxuXHQgKiBXZSdyZSBub3QgZG9pbmcgaXQgb3V0c2lkZSBvZiBjb2xsYWJvcmF0aW9uIGFzIGl0J3MgYWRkaW5nIGEgcmVxdWVzdCBkdXJpbmcgbmF2aWdhdGlvbiFcblx0ICpcblx0ICogQHBhcmFtIHBhdGhUb1Jlc29sdmUgVGhlIHBhdGggd2UncmUgY2hlY2tpbmcuIElmIHRoZSBkcmFmdCBleGlzdHMsIHdlIHJldHVybiBpdCBhcyBpcywgb3RoZXJ3aXNlIHdlIHJldHVybiB0aGUgc2libGluZyBlbGVtZW50IGFzc29jaWF0ZWRcblx0ICogQHBhcmFtIG1vZGVsIFRoZSBvRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblBhcmFtZXRlciBUaGUgcGFyYW1ldGVyIG9mIHRoZSBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBzZW1hbnRpY0tleXMgVGhlIHNlbWFudGljIGtleXMgaWYgd2UgaGF2ZSBzZW1hbnRpYyBuYXZpZ2F0aW9uLCBvdGhlcndpc2UgZmFsc2Vcblx0ICogQHBhcmFtIHJvb3RFbnRpdHlOYW1lIE5hbWUgb2YgdGhlIHJvb3QgZW50aXR5XG5cdCAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIG5hdmlnYXRlIHRvXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRhc3luYyByZXNvbHZlQ29sbGFib3JhdGlvblBhdGgoXG5cdFx0cGF0aFRvUmVzb2x2ZTogc3RyaW5nLFxuXHRcdG1vZGVsOiBPRGF0YU1vZGVsLFxuXHRcdG5hdmlnYXRpb25QYXJhbWV0ZXI6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyxcblx0XHRzZW1hbnRpY0tleXM6IHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSB8IHVuZGVmaW5lZCxcblx0XHRyb290RW50aXR5TmFtZTogc3RyaW5nXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY3VycmVudEhhc2hOb1BhcmFtcyA9IHRoaXMuX29Sb3V0ZXIuZ2V0SGFzaENoYW5nZXIoKS5nZXRIYXNoKCkuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGxldCBmb3JtYXR0ZWRLZXlzOiBzdHJpbmdbXTtcblx0XHRjb25zdCBjb21wYXJhdGl2ZVBhdGggPSBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID8/IHBhdGhUb1Jlc29sdmU7XG5cdFx0aWYgKHNlbWFudGljS2V5cykge1xuXHRcdFx0Zm9ybWF0dGVkS2V5cyA9IHNlbWFudGljS2V5cy5tYXAoKHNpbmdsZUtleSkgPT4gc2luZ2xlS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3JtYXR0ZWRLZXlzID0gbWV0YU1vZGVsLmdldE9iamVjdChgLyR7cm9vdEVudGl0eU5hbWV9LyRUeXBlLyRLZXlgKTtcblx0XHR9XG5cblx0XHRjb25zdCB0ZWNobmljYWxQYXRoID0gYXdhaXQgdGhpcy5nZXRUZWNobmljYWxQYXRoRnJvbVBhdGgoY3VycmVudEhhc2hOb1BhcmFtcywgbW9kZWwsIGZvcm1hdHRlZEtleXMpO1xuXHRcdGlmICh0ZWNobmljYWxQYXRoID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gcGF0aFRvUmVzb2x2ZTtcblx0XHR9XG5cdFx0Ly8gQ29tcGFyaW5nIHBhdGggdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHdpdGggdGhlIG9uZSB3ZSBoYXZlLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIGl0IG1lYW5zIHRoZSBkcmFmdCBkb2Vzbid0IGV4aXN0LlxuXHRcdGlmICh0ZWNobmljYWxQYXRoICE9PSBjb21wYXJhdGl2ZVBhdGggJiYgbmF2aWdhdGlvblBhcmFtZXRlci51c2VDb250ZXh0KSB7XG5cdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZykge1xuXHRcdFx0XHR0aGlzLl9vUm91dGluZ1NlcnZpY2Uuc2V0TGFzdFNlbWFudGljTWFwcGluZyh7XG5cdFx0XHRcdFx0dGVjaG5pY2FsUGF0aDogdGVjaG5pY2FsUGF0aCxcblx0XHRcdFx0XHRzZW1hbnRpY1BhdGg6IHBhdGhUb1Jlc29sdmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyLnJlZGlyZWN0ZWRUb05vbkRyYWZ0ID1cblx0XHRcdFx0bWV0YU1vZGVsLmdldE9iamVjdChgLyR7cm9vdEVudGl0eU5hbWV9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJJbmZvYCk/LlR5cGVOYW1lID8/IHJvb3RFbnRpdHlOYW1lO1xuXHRcdFx0YXdhaXQgdGhpcy5yZWZyZXNoQ29udGV4dChtb2RlbCwgdGVjaG5pY2FsUGF0aCwgbmF2aWdhdGlvblBhcmFtZXRlci51c2VDb250ZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRlY2huaWNhbFBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGZyb20gYSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1RhcmdldFBhdGggVGhlIHBhdGggdG8gYnVpbGQgdGhlIGNvbnRleHQuIE5lZWRzIHRvIGNvbnRhaW4gdGVjaG5pY2FsIGtleXMgb25seS5cblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb1BhdGgoc1RhcmdldFBhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbykge1xuXHRcdGNvbnN0IG9DdXJyZW50Q29udGV4dCA9IHRoaXMuX2dldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRzQ3VycmVudFBhdGggPSBvQ3VycmVudENvbnRleHQgJiYgb0N1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdG9Vc2VDb250ZXh0ID0gb05hdmlnYXRpb25QYXJhbWV0ZXJzLnVzZUNvbnRleHQgYXMgQ29udGV4dCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cblx0XHQvLyBXZSBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCBvbmx5IGlmIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgb25lXG5cdFx0Ly8gb3IgaWYgd2UgaGF2ZSBhIGNvbnRleHQgYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGlmIChvVXNlQ29udGV4dCAmJiBvVXNlQ29udGV4dC5nZXRQYXRoKCkgPT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHRpZiAob1VzZUNvbnRleHQgIT09IG9DdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0aXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpIHx8XG5cdFx0XHRcdFx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChtZXRhTW9kZWwsIG9Vc2VDb250ZXh0LmdldFBhdGgoKSkgJiZcblx0XHRcdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgYnV0IHdlJ3JlIGluIGNvbGxhYm9yYXRpb24gZHJhZnQsIHdlIGZvcmNlIHRoZSByZWZyZXNoIChkaXNjYXJkaW5nIHBlbmRpbmcgY2hhbmdlcykgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbi5cblx0XHRcdFx0XHRcdC8vIFdoZW4gbmF2aWdhdGluZyBmcm9tIExSIHRvIE9QLCB0aGUgdmlldyBpcyBub3QgY29ubmVjdGVkIHlldCAtLT4gY2hlY2sgaWYgd2UncmUgaW4gZHJhZnQgd2l0aCBjb2xsYWJvcmF0aW9uIGZyb20gdGhlIG1ldGFtb2RlbFxuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0b1VzZUNvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9iaW5kUGFnZVRvQ29udGV4dChvVXNlQ29udGV4dCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc0N1cnJlbnRQYXRoICE9PSBzVGFyZ2V0UGF0aCkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29udGV4dCBmb3IgaXRzIHBhdGhcblx0XHRcdHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KHRoaXMuX2NyZWF0ZUNvbnRleHQoc1RhcmdldFBhdGgsIG9Nb2RlbCksIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHR9IGVsc2UgaWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uQXBwU3RhdGVDaGFuZ2VkICYmIEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdHRoaXMuX3JlZnJlc2hCaW5kaW5nQ29udGV4dChvQ3VycmVudENvbnRleHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCaW5kcyB0aGUgcGFnZSB0byBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHRvIGJlIGJvdW5kXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2JpbmRQYWdlVG9Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0IHwgbnVsbCwgb01vZGVsOiBPRGF0YU1vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbykge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG51bGwpO1xuXHRcdFx0dGhpcy5vbkFmdGVyQmluZGluZyhudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvUGFyZW50TGlzdEJpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8ICFvUGFyZW50TGlzdEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHBhcmVudEJpbmRpbmcgaXMgbm90IGEgbGlzdEJpbmRpbmcsIHdlIGNyZWF0ZSBhIG5ldyBjb250ZXh0XG5cdFx0XHRcdG9Db250ZXh0ID0gdGhpcy5fY3JlYXRlQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCksIG9Nb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuX3NldEtlZXBBbGl2ZShcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzQ29udGV4dFVzZWRJblBhZ2VzKG9Db250ZXh0KSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRydWUgLy8gTG9hZCBtZXNzYWdlcywgb3RoZXJ3aXNlIHRoZXkgZG9uJ3QgZ2V0IHJlZnJlc2hlZCBsYXRlciwgZS5nLiBmb3Igc2lkZSBlZmZlY3RzXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0Ly8gc2V0S2VlcEFsaXZlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHBhcmVudCBsaXN0YmluZGluZyBkb2Vzbid0IGhhdmUgJCRvd25SZXF1ZXN0PXRydWVcblx0XHRcdFx0Ly8gVGhpcyBjYXNlIGZvciBjdXN0b20gZnJhZ21lbnRzIGlzIHN1cHBvcnRlZCwgYnV0IGFuIGVycm9yIGlzIGxvZ2dlZCB0byBtYWtlIHRoZSBsYWNrIG9mIHN5bmNocm9uaXphdGlvbiBhcHBhcmVudFxuXHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0YFZpZXcgZm9yICR7b0NvbnRleHQuZ2V0UGF0aCgpfSB3b24ndCBiZSBzeW5jaHJvbml6ZWQuIFBhcmVudCBsaXN0QmluZGluZyBtdXN0IGhhdmUgYmluZGluZyBwYXJhbWV0ZXIgJCRvd25SZXF1ZXN0PXRydWVgXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghb1BhcmVudExpc3RCaW5kaW5nIHx8IG9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgY29udGV4dCBvdGhlcndpc2Ugd2UgZ2V0IGVycm9yc1xuXHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGJpbmRpbmcgY29udGV4dCB3aXRoIHRoZSBwcm9wZXIgYmVmb3JlL2FmdGVyIGNhbGxiYWNrc1xuXHRcdHRoaXMub25CZWZvcmVCaW5kaW5nKG9Db250ZXh0LCB7XG5cdFx0XHRlZGl0YWJsZTogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSxcblx0XHRcdGxpc3RCaW5kaW5nOiBvUGFyZW50TGlzdEJpbmRpbmcsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlNob3dQbGFjZWhvbGRlclxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQpO1xuXHRcdHRoaXMub25BZnRlckJpbmRpbmcob0NvbnRleHQsIHsgcmVkaXJlY3RlZFRvTm9uRHJhZnQ6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQgfSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGNvbnRleHQgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBUaGUgcGF0aFxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2NyZWF0ZUNvbnRleHQoc1BhdGg6IHN0cmluZywgb01vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudCxcblx0XHRcdHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCksXG5cdFx0XHRzQ29udGV4dFBhdGggPVxuXHRcdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCksXG5cdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0bVBhcmFtZXRlcnM6IGFueSA9IHtcblx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiLFxuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIixcblx0XHRcdFx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHQvLyBJbiBjYXNlIG9mIGRyYWZ0OiAkc2VsZWN0IHRoZSBzdGF0ZSBmbGFncyAoSGFzQWN0aXZlRW50aXR5LCBIYXNEcmFmdEVudGl0eSwgYW5kIElzQWN0aXZlRW50aXR5KVxuXHRcdGNvbnN0IG9EcmFmdFJvb3QgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKTtcblx0XHRjb25zdCBvRHJhZnROb2RlID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnROb2RlYCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5fZ2V0S2VlcEFsaXZlQ29udGV4dChvTW9kZWwsIHNQYXRoLCBmYWxzZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUga2VlcEFsaXZlIGNvbnRleHQgJHtzUGF0aH1gKTtcblx0XHRcdH0gZWxzZSBpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXSk7XG5cdFx0XHRcdFx0aWYgKG9EcmFmdFJvb3QpIHtcblx0XHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RPYmplY3QoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkcmFmdCBhbmQgZWRpdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aG9zZSBwcm9wZXJ0aWVzIGFyZSByZXF1ZXN0ZWQgYWdhaW4gZXZlbiBpZiB0aGV5IGFyZSBpbiB0aGUgYmluZGluZydzIGNhY2hlXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdoZW4geW91IGVkaXQgYW5kIGdvIHRvIHRoZSBzYXZlZCB2ZXJzaW9uIHlvdSBoYXZlIG5vIHdheSBvZiBzd2l0Y2hpbmcgYmFjayB0byB0aGUgZWRpdCB2ZXJzaW9uXG5cdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0b0RyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ/IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiXVxuXHRcdFx0XHRcdFx0XHQ6IFtcIkhhc0FjdGl2ZUVudGl0eVwiLCBcIkhhc0RyYWZ0RW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHNFbnRpdHlTZXQpIHtcblx0XHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdFx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBzTWVzc2FnZXNQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0XHRpZiAob0RyYWZ0Um9vdCB8fCBvRHJhZnROb2RlKSB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy4kc2VsZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ID0gXCJIYXNBY3RpdmVFbnRpdHksSGFzRHJhZnRFbnRpdHksSXNBY3RpdmVFbnRpdHlcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy4kc2VsZWN0ICs9IFwiLEhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRjb25zdCBvUHJldmlvdXNCaW5kaW5nID0gKHRoaXMuX29WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgYW55KT8uZ2V0QmluZGluZygpO1xuXHRcdFx0XHRvUHJldmlvdXNCaW5kaW5nXG5cdFx0XHRcdFx0Py5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdG9QcmV2aW91c0JpbmRpbmcuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVzZXRpbmcgdGhlIGNoYW5nZXMgdG8gdGhlIGJpbmRpbmdcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0hpZGRlbkJpbmRpbmcgPSBvTW9kZWwuYmluZENvbnRleHQoc1BhdGgsIHVuZGVmaW5lZCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVxdWVzdGVkXCIsICgpID0+IHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHRcdH0pO1xuXHRcdFx0b0hpZGRlbkJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIHRoaXMub25EYXRhUmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRyZXR1cm4gb0hpZGRlbkJpbmRpbmcuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdGFzeW5jIG9uRGF0YVJlY2VpdmVkKG9FdmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBzRXJyb3JEZXNjcmlwdGlvbiA9IG9FdmVudCAmJiBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZXJyb3JcIik7XG5cdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5fb1ZpZXcpKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLl9vVmlldyk7XG5cdFx0fVxuXG5cdFx0aWYgKHNFcnJvckRlc2NyaXB0aW9uKSB7XG5cdFx0XHQvLyBUT0RPOiBpbiBjYXNlIG9mIDQwNCB0aGUgdGV4dCBzaGFsbCBiZSBkaWZmZXJlbnRcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IGF3YWl0IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdFx0XHRsZXQgbVBhcmFtcyA9IHt9O1xuXHRcdFx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24uc3RhdHVzID09PSA1MDMpIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0aXNJbml0aWFsTG9hZDUwM0Vycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIGlmIChzRXJyb3JEZXNjcmlwdGlvbi5zdGF0dXMgPT09IDQwMCkge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JfREVTQ1JJUFRJT05cIiksXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtUGFyYW1zID0ge1xuXHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogc0Vycm9yRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRpc0RhdGFSZWNlaXZlZEVycm9yOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2hlbGxCYWNrOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMobVBhcmFtcyk7XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBjb3JlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBzaWRlIGVmZmVjdHMgb24gYSBiaW5kaW5nIGNvbnRleHQgdG8gXCJyZWZyZXNoXCIgaXQuXG5cdCAqIFRPRE86IGdldCByaWQgb2YgdGhpcyBvbmNlIHByb3ZpZGVkIGJ5IHRoZSBtb2RlbFxuXHQgKiBhIHJlZnJlc2ggb24gdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCB3b3JrIGluIGNhc2UgYSBjcmVhdGlvbiByb3cgd2l0aCBhIHRyYW5zaWVudCBjb250ZXh0IGlzXG5cdCAqIHVzZWQuIGFsc28gYSByZXF1ZXN0U2lkZUVmZmVjdHMgd2l0aCBhbiBlbXB0eSBwYXRoIHdvdWxkIGZhaWwgZHVlIHRvIHRoZSB0cmFuc2llbnQgY29udGV4dFxuXHQgKiB0aGVyZWZvcmUgd2UgZ2V0IGFsbCBkZXBlbmRlbnQgYmluZGluZ3MgKHZpYSBwcml2YXRlIG1vZGVsIG1ldGhvZCkgdG8gZGV0ZXJtaW5lIGFsbCBwYXRocyBhbmQgdGhlblxuXHQgKiByZXF1ZXN0IHRoZW0uXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHQgQ29udGV4dCB0byBiZSByZWZyZXNoZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9CaW5kaW5nQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb1BhZ2VDb21wb25lbnQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudDtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRjb25zdCBzUm9vdENvbnRleHRQYXRoID0gb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBzRW50aXR5U2V0ID0gb1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCgpO1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9XG5cdFx0XHQob1BhZ2VDb21wb25lbnQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGggJiYgb1BhZ2VDb21wb25lbnQuZ2V0Q29udGV4dFBhdGgoKSkgfHwgKHNFbnRpdHlTZXQgJiYgYC8ke3NFbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IHRoaXMuX29WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0bGV0IHNNZXNzYWdlc1BhdGg7XG5cdFx0Y29uc3QgYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogW11cblx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHRcdGxldCBhRGVwZW5kZW50QmluZGluZ3M7XG5cdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gKChvQmluZGluZy5nZXRDb250ZXh0KCkgJiYgb0JpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKSkgfHwgXCJcIikucmVwbGFjZShzUm9vdENvbnRleHRQYXRoLCBcIlwiKTsgLy8gSWYgbm8gY29udGV4dCwgdGhpcyBpcyBhbiBhYnNvbHV0ZSBiaW5kaW5nIHNvIG5vIHJlbGF0aXZlIHBhdGhcblx0XHRcdGNvbnN0IHNQYXRoID0gKHNSZWxhdGl2ZVBhdGggPyBgJHtzUmVsYXRpdmVQYXRoLnNsaWNlKDEpfS9gIDogc1JlbGF0aXZlUGF0aCkgKyBvQmluZGluZy5nZXRQYXRoKCk7XG5cblx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiAoc1BhdGggPT09IFwiXCIpIHtcblx0XHRcdFx0Ly8gbm93IGdldCB0aGUgZGVwZW5kZW50IGJpbmRpbmdzXG5cdFx0XHRcdGFEZXBlbmRlbnRCaW5kaW5ncyA9IG9CaW5kaW5nLmdldERlcGVuZGVudEJpbmRpbmdzKCk7XG5cdFx0XHRcdGlmIChhRGVwZW5kZW50QmluZGluZ3MpIHtcblx0XHRcdFx0XHQvLyBhc2sgdGhlIGRlcGVuZGVudCBiaW5kaW5ncyAoYW5kIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwSWRcblx0XHRcdFx0XHQvL2lmIChhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYURlcGVuZGVudEJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRnZXRCaW5kaW5nUGF0aHMoYURlcGVuZGVudEJpbmRpbmdzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5wdXNoKHNQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRcdFx0aWYgKGFQcm9wZXJ0eVBhdGhzLmluZGV4T2Yoc1BhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFQcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHNDb250ZXh0UGF0aCkge1xuXHRcdFx0c01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdH1cblxuXHRcdC8vIGJpbmRpbmcgb2YgdGhlIGNvbnRleHQgbXVzdCBoYXZlICQkUGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMgdHJ1ZSwgdGhpcyBib3VuZCBjb250ZXh0IG1heSBiZSBuZWVkZWQgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBkZXBlbmRlbnQgYmluZGluZ1xuXHRcdGdldEJpbmRpbmdQYXRocyhvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKTtcblxuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcy5wdXNoKHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRoc1tpXVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzID0gYVByb3BlcnR5UGF0aHM7XG5cdFx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRcdG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnB1c2goc01lc3NhZ2VzUGF0aCk7XG5cdFx0fVxuXHRcdC8vYWxsIHRoaXMgbG9naWMgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIFNpZGVFZmZlY3RzIHJlcXVlc3QgZm9yIGFuIGVtcHR5IHBhdGggKHJlZnJlc2ggZXZlcnl0aGluZyksIGFmdGVyIHRlc3RpbmcgdHJhbnNpZW50IGNvbnRleHRzXG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldHM6IHN0cmluZ1tdLCB0YXJnZXRQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHRhcmdldFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdGFyZ2V0UHJvcGVydHkuaW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdHRhcmdldHMucHVzaChpbmRleCA+IDAgPyB0YXJnZXRQcm9wZXJ0eS5zbGljZSgwLCBpbmRleCkgOiB0YXJnZXRQcm9wZXJ0eSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0cztcblx0XHR9LCBbXSk7XG5cdFx0Ly8gT0RhdGEgbW9kZWwgd2lsbCB0YWtlIGNhcmUgb2YgZHVwbGljYXRlc1xuXHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFsuLi5vU2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMsIC4uLm9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzXSwgb0JpbmRpbmdDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRCaW5kaW5nQ29udGV4dCgpOiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGNvbXBvbmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfc2V0QmluZGluZ0NvbnRleHQob0NvbnRleHQ6IGFueSkge1xuXHRcdGxldCBvUHJldmlvdXNDb250ZXh0LCBvVGFyZ2V0Q29udHJvbDtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvUHJldmlvdXNDb250ZXh0ID0gdGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0b1RhcmdldENvbnRyb2wgPSB0aGlzLl9vVmlldztcblx0XHR9XG5cblx0XHRvVGFyZ2V0Q29udHJvbC5zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRpZiAob1ByZXZpb3VzQ29udGV4dD8uaXNLZWVwQWxpdmUoKSAmJiBvUHJldmlvdXNDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKG9QcmV2aW91c0NvbnRleHQsIGZhbHNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmxleGlibGUgY29sdW1uIGxheW91dCAoRkNMKSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aWV3ICgtMSBpZiB0aGUgYXBwIGlzIG5vdCBGQ0wpLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgbGV2ZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfZ2V0RkNMTGV2ZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi5GQ0xMZXZlbDtcblx0fVxuXG5cdF9zZXRLZWVwQWxpdmUob0NvbnRleHQ6IENvbnRleHQsIGJLZWVwQWxpdmU6IGJvb2xlYW4sIGZuQmVmb3JlRGVzdHJveT86IEZ1bmN0aW9uLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbikge1xuXHRcdGlmIChvQ29udGV4dC5nZXRQYXRoKCkuZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHQvLyBXZSBrZWVwIHRoZSBjb250ZXh0IGFsaXZlIG9ubHkgaWYgdGhleSdyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiwgaS5lLiBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSAnKSdcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGJLZWVwQWxpdmUsIGZuQmVmb3JlRGVzdHJveSwgISFzTWVzc2FnZXNQYXRoICYmIGJSZXF1ZXN0TWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbDogT0RhdGFNb2RlbCwgcGF0aDogc3RyaW5nLCBiUmVxdWVzdE1lc3NhZ2VzPzogYm9vbGVhbiwgcGFyYW1ldGVycz86IGFueSk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEdldCB0aGUgcGF0aCBmb3IgdGhlIGNvbnRleHQgdGhhdCBpcyByZWFsbHkga2VwdCBhbGl2ZSAocGFydCBvZiBhIGNvbGxlY3Rpb24pXG5cdFx0Ly8gaS5lLiByZW1vdmUgYWxsIHNlZ21lbnRzIG5vdCBlbmRpbmcgd2l0aCBhICcpJ1xuXHRcdGNvbnN0IGtlcHRBbGl2ZVNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgYWRkaXRpb25uYWxTZWdtZW50czogc3RyaW5nW10gPSBbXTtcblx0XHR3aGlsZSAoa2VwdEFsaXZlU2VnbWVudHMubGVuZ3RoICYmICFrZXB0QWxpdmVTZWdtZW50c1trZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggLSAxXS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdGFkZGl0aW9ubmFsU2VnbWVudHMucHVzaChrZXB0QWxpdmVTZWdtZW50cy5wb3AoKSEpO1xuXHRcdH1cblxuXHRcdGlmIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2VwdEFsaXZlUGF0aCA9IGtlcHRBbGl2ZVNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdGNvbnN0IG9LZWVwQWxpdmVDb250ZXh0ID0gb01vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoa2VwdEFsaXZlUGF0aCwgYlJlcXVlc3RNZXNzYWdlcywgcGFyYW1ldGVycyk7XG5cblx0XHRpZiAoYWRkaXRpb25uYWxTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBvS2VlcEFsaXZlQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5yZXZlcnNlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbm5hbFBhdGggPSBhZGRpdGlvbm5hbFNlZ21lbnRzLmpvaW4oXCIvXCIpO1xuXHRcdFx0cmV0dXJuIG9Nb2RlbC5iaW5kQ29udGV4dChhZGRpdGlvbm5hbFBhdGgsIG9LZWVwQWxpdmVDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGwtc2NyZWVuIG1vZGUgd2hlbiBGQ0wgaXMgdXNlZC5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzd2l0Y2hGdWxsU2NyZWVuKCkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9GQ0xIZWxwZXJNb2RlbCA9IG9Tb3VyY2UuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIiksXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBzTGF5b3V0OiBzTmV4dExheW91dCB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKSB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJmY2xoZWxwZXJcIikuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7RUErQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBLElBU01BLGVBQWUsV0FEcEJDLGNBQWMsQ0FBQyxrREFBa0QsQ0FBQyxVQW9CakVDLGNBQWMsRUFBRSxVQU9oQkEsY0FBYyxFQUFFLFVBb0NoQkMsZUFBZSxFQUFFLFVBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsVUFLbkNILGVBQWUsRUFBRSxVQUNqQkMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBSyxDQUFDLFVBS25DSCxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxXQVFuQ0gsZUFBZSxFQUFFLFdBQ2pCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFLLENBQUMsV0FzQm5DSCxlQUFlLEVBQUUsV0F5QmpCQSxlQUFlLEVBQUUsV0FhakJBLGVBQWUsRUFBRSxXQUNqQkksY0FBYyxFQUFFLFdBNkRoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FnQmhCSixlQUFlLEVBQUUsV0FDakJJLGNBQWMsRUFBRSxXQWNoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FVaEJKLGVBQWUsRUFBRSxXQUNqQkksY0FBYyxFQUFFLFdBc0JoQkosZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0Ewb0JoQkosZUFBZSxFQUFFLFdBcU5qQkEsZUFBZSxFQUFFLFdBQ2pCSSxjQUFjLEVBQUUsV0FzQmhCSixlQUFlLEVBQUUsV0FDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNHLE1BQU0sQ0FBQztJQUFBO0lBQUE7TUFBQTtJ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
|