@sapui5/sap.fe.core 1.113.0 → 1.115.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 +68 -5
- 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 +120 -4
- package/src/sap/fe/core/AppComponent-dbg.js +8 -2
- 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 +19 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +14 -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 +17 -11
- package/src/sap/fe/core/BaseController-dbg.js +1 -1
- package/src/sap/fe/core/BaseController.ts +13 -2
- package/src/sap/fe/core/CommonUtils-dbg.js +74 -317
- 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 +96 -473
- package/src/sap/fe/core/ExtensionAPI-dbg.js +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +2 -2
- package/src/sap/fe/core/StateFilterToSelectionVariant-dbg.js +263 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.js +6 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.js.map +1 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.ts +316 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +10 -3
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +8 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +8 -8
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.ts +7 -7
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +68 -36
- 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 +83 -43
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +12 -11
- 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 +17 -21
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +233 -133
- 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 +260 -145
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -3
- package/src/sap/fe/core/controllerextensions/Routing-dbg.js +5 -3
- package/src/sap/fe/core/controllerextensions/Routing.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Routing.ts +5 -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 +25 -18
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +40 -26
- 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 +59 -33
- 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 +23 -25
- 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/editFlow/NotApplicableContextDialog-dbg.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -3
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +73 -90
- 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 +88 -101
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +26 -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 +29 -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/facade-dbg.js +64 -4
- 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 +91 -8
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +2 -4
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -5
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +9 -9
- 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 +8 -8
- 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/adapter/SelectionVariantToStateFilters-dbg.js +435 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js +6 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.ts +532 -0
- 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/ManifestSettings-dbg.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +7 -5
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +36 -4
- 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 +45 -4
- 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 +18 -3
- 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 +18 -2
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +679 -676
- 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/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/Table-dbg.js +100 -72
- 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 +146 -99
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +37 -10
- 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 +49 -16
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +47 -18
- 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 +74 -20
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +26 -9
- 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 +24 -8
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +28 -2
- 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 +28 -9
- 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/templates/ListReportConverter-dbg.js +13 -15
- 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 +18 -54
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +12 -12
- 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 +16 -11
- 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/ValueFormatter-dbg.js +5 -11
- 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 +4 -25
- package/src/sap/fe/core/fpm/Component-dbg.js +3 -1
- package/src/sap/fe/core/fpm/Component.js +1 -1
- package/src/sap/fe/core/fpm/Component.js.map +1 -1
- package/src/sap/fe/core/fpm/Component.ts +3 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +74 -26
- 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 +116 -33
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +82 -37
- 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 +109 -56
- package/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +7 -5
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +13 -3
- 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 +28 -18
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.ts +2 -1
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
- 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 +5 -2
- 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 +5 -0
- package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +24 -2
- 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 +23 -1
- package/src/sap/fe/core/helpers/TitleHelper-dbg.js +239 -0
- package/src/sap/fe/core/helpers/TitleHelper.js +6 -0
- package/src/sap/fe/core/helpers/TitleHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/TitleHelper.ts +295 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +4 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +3 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +41 -17
- 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 +45 -21
- 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/jsx-runtime/useMDXComponents-dbg.js +8 -4
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +7 -2
- package/src/sap/fe/core/library-dbg.js +4 -3
- package/src/sap/fe/core/library-preload.js +91 -74
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/library.js.map +1 -1
- package/src/sap/fe/core/library.ts +1 -1
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +4 -3
- 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 +3 -2
- package/src/sap/fe/core/messagebundle.properties +12 -8
- package/src/sap/fe/core/messagebundle_ar.properties +7 -5
- package/src/sap/fe/core/messagebundle_bg.properties +7 -5
- package/src/sap/fe/core/messagebundle_ca.properties +7 -5
- package/src/sap/fe/core/messagebundle_cs.properties +7 -5
- package/src/sap/fe/core/messagebundle_cy.properties +7 -5
- package/src/sap/fe/core/messagebundle_da.properties +7 -5
- package/src/sap/fe/core/messagebundle_de.properties +7 -5
- package/src/sap/fe/core/messagebundle_el.properties +7 -5
- package/src/sap/fe/core/messagebundle_en.properties +7 -5
- package/src/sap/fe/core/messagebundle_en_GB.properties +6 -4
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +6 -4
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +7 -4
- package/src/sap/fe/core/messagebundle_es.properties +7 -5
- package/src/sap/fe/core/messagebundle_es_MX.properties +7 -5
- package/src/sap/fe/core/messagebundle_et.properties +7 -5
- package/src/sap/fe/core/messagebundle_fi.properties +7 -5
- package/src/sap/fe/core/messagebundle_fr.properties +7 -5
- package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -6
- package/src/sap/fe/core/messagebundle_hi.properties +7 -5
- package/src/sap/fe/core/messagebundle_hr.properties +7 -5
- package/src/sap/fe/core/messagebundle_hu.properties +7 -5
- package/src/sap/fe/core/messagebundle_id.properties +7 -5
- package/src/sap/fe/core/messagebundle_it.properties +8 -6
- package/src/sap/fe/core/messagebundle_iw.properties +7 -5
- package/src/sap/fe/core/messagebundle_ja.properties +7 -5
- package/src/sap/fe/core/messagebundle_kk.properties +7 -5
- package/src/sap/fe/core/messagebundle_ko.properties +7 -5
- package/src/sap/fe/core/messagebundle_lt.properties +7 -5
- package/src/sap/fe/core/messagebundle_lv.properties +7 -5
- package/src/sap/fe/core/messagebundle_ms.properties +7 -5
- package/src/sap/fe/core/messagebundle_nl.properties +7 -5
- package/src/sap/fe/core/messagebundle_no.properties +7 -5
- package/src/sap/fe/core/messagebundle_pl.properties +7 -5
- package/src/sap/fe/core/messagebundle_pt.properties +7 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -5
- package/src/sap/fe/core/messagebundle_ro.properties +7 -5
- package/src/sap/fe/core/messagebundle_ru.properties +7 -5
- package/src/sap/fe/core/messagebundle_sh.properties +7 -5
- package/src/sap/fe/core/messagebundle_sk.properties +7 -5
- package/src/sap/fe/core/messagebundle_sl.properties +7 -5
- package/src/sap/fe/core/messagebundle_sv.properties +7 -5
- package/src/sap/fe/core/messagebundle_th.properties +7 -5
- package/src/sap/fe/core/messagebundle_tr.properties +7 -5
- package/src/sap/fe/core/messagebundle_uk.properties +7 -5
- package/src/sap/fe/core/messagebundle_vi.properties +7 -5
- package/src/sap/fe/core/messagebundle_zh_CN.properties +7 -5
- package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -5
- package/src/sap/fe/core/operationsHelper-dbg.js +1 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -1
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/Fcl.controller.js +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.ts +8 -1
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +10 -3
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +16 -6
- 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 +10 -4
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +54 -5
- 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 +52 -6
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +31 -14
- 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 +15 -1
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +10 -4
- 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 +29 -7
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +5 -2
- 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 +9 -5
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +1 -2
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +2 -18
- package/src/sap/fe/core/templating/CommonFormatters-dbg.js +8 -8
- package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.ts +9 -9
- 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/DataFieldFormatters-dbg.js +38 -2
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +40 -0
- package/src/sap/fe/core/templating/FieldControlHelper-dbg.js +5 -6
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.ts +13 -11
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +13 -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 +13 -1
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +7 -7
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +5 -6
- 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 +6 -7
- package/src/sap/fe/core/type/TypeUtil-dbg.js +2 -2
- package/src/sap/fe/core/type/TypeUtil.js +1 -1
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
- package/src/sap/fe/core/type/TypeUtil.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +0 -243
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +0 -6
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +0 -283
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +0 -121
- package/src/sap/fe/core/controllerextensions/collaboration/UserDetails.fragment.xml +0 -11
- 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
|
@@ -11,7 +11,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
11
11
|
var finalExtension = ClassSupport.finalExtension;
|
|
12
12
|
var extensible = ClassSupport.extensible;
|
|
13
13
|
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
14
|
-
var isConnected = ActivitySync.isConnected;
|
|
15
14
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
16
15
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
17
16
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
@@ -257,6 +256,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
257
256
|
let deferred = false;
|
|
258
257
|
for (const sKey in routeArguments) {
|
|
259
258
|
const sValue = routeArguments[sKey];
|
|
259
|
+
if (typeof sValue !== "string") {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
260
262
|
if (sValue === "..." && bindingPattern.indexOf(`{${sKey}}`) >= 0) {
|
|
261
263
|
deferred = true;
|
|
262
264
|
// Sometimes in preferredMode = create, the edit button is shown in background when the
|
|
@@ -339,7 +341,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
339
341
|
* @returns A Promise
|
|
340
342
|
* @ui5-restricted
|
|
341
343
|
*/;
|
|
342
|
-
_proto._bindDeferred = function _bindDeferred(sTargetPath, oNavigationParameters) {
|
|
344
|
+
_proto._bindDeferred = async function _bindDeferred(sTargetPath, oNavigationParameters) {
|
|
343
345
|
this.onBeforeBinding(null, {
|
|
344
346
|
editable: oNavigationParameters.bTargetEditable
|
|
345
347
|
});
|
|
@@ -349,7 +351,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
349
351
|
// TODO: currently the target component creates this document but we shall move this to
|
|
350
352
|
// a central place
|
|
351
353
|
if (this._oPageComponent && this._oPageComponent.createDeferredContext) {
|
|
352
|
-
this._oPageComponent.createDeferredContext(sTargetPath, oNavigationParameters.
|
|
354
|
+
this._oPageComponent.createDeferredContext(sTargetPath, oNavigationParameters.listBindingForCreate, !!oNavigationParameters.bActionCreate);
|
|
353
355
|
}
|
|
354
356
|
}
|
|
355
357
|
const currentBindingContext = this._getBindingContext();
|
|
@@ -368,210 +370,302 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
368
370
|
/**
|
|
369
371
|
* Sets the binding context of the page from a path.
|
|
370
372
|
*
|
|
371
|
-
* @param
|
|
372
|
-
* @param
|
|
373
|
-
* @param
|
|
373
|
+
* @param targetPath The path to the context
|
|
374
|
+
* @param model The OData model
|
|
375
|
+
* @param navigationParameters Navigation parameters
|
|
374
376
|
* @returns A Promise resolved once the binding has been set on the page
|
|
375
377
|
* @ui5-restricted
|
|
376
378
|
*/;
|
|
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
|
-
});
|
|
379
|
+
_proto._bindPage = function _bindPage(targetPath, model, navigationParameters) {
|
|
380
|
+
if (targetPath === "") {
|
|
381
|
+
return Promise.resolve(this._bindPageToContext(null, model, navigationParameters));
|
|
391
382
|
}
|
|
383
|
+
return this.resolvePath(targetPath, model, navigationParameters).then(technicalPath => {
|
|
384
|
+
this._bindPageToPath(technicalPath, model, navigationParameters);
|
|
385
|
+
}).catch(error => {
|
|
386
|
+
// Error handling for erroneous metadata request
|
|
387
|
+
const resourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
388
|
+
this.navigateToMessagePage(resourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
|
|
389
|
+
title: resourceBundle.getText("C_COMMON_SAPFE_ERROR"),
|
|
390
|
+
description: error.message
|
|
391
|
+
});
|
|
392
|
+
});
|
|
392
393
|
}
|
|
393
394
|
|
|
394
395
|
/**
|
|
395
396
|
* Creates the filter to retrieve a context corresponding to a semantic path.
|
|
396
397
|
*
|
|
397
|
-
* @param
|
|
398
|
-
* @param
|
|
399
|
-
* @param
|
|
398
|
+
* @param semanticPath The semantic or technical path
|
|
399
|
+
* @param semanticKeys The semantic or technical keys for the path
|
|
400
|
+
* @param metaModel The instance of the metamodel
|
|
400
401
|
* @returns The filter
|
|
401
402
|
* @ui5-restricted
|
|
402
403
|
*/;
|
|
403
|
-
_proto.
|
|
404
|
-
const
|
|
405
|
-
if (
|
|
404
|
+
_proto.createFilterFromPath = function createFilterFromPath(semanticPath, semanticKeys, metaModel) {
|
|
405
|
+
const unquoteAndDecode = function (value) {
|
|
406
|
+
if (value.indexOf("'") === 0 && value.lastIndexOf("'") === value.length - 1) {
|
|
406
407
|
// Remove the quotes from the value and decode special chars
|
|
407
|
-
|
|
408
|
+
value = decodeURIComponent(value.substring(1, value.length - 1));
|
|
408
409
|
}
|
|
409
|
-
return
|
|
410
|
+
return value;
|
|
410
411
|
};
|
|
411
|
-
const
|
|
412
|
-
let
|
|
413
|
-
|
|
412
|
+
const keyValues = semanticPath.substring(semanticPath.indexOf("(") + 1, semanticPath.length - 1).split(",");
|
|
413
|
+
let finalKeys = semanticKeys;
|
|
414
|
+
let finalKeyValues = keyValues;
|
|
415
|
+
// If we have technical keys, IsActiveEntity will be present. We need to remove it as we're already adding them at the end.
|
|
416
|
+
if (semanticKeys.includes("IsActiveEntity")) {
|
|
417
|
+
finalKeys = semanticKeys.filter(singleKey => singleKey.indexOf("IsActiveEntity") < 0);
|
|
418
|
+
finalKeyValues = keyValues.filter(element => !element.startsWith("IsActiveEntity"));
|
|
419
|
+
}
|
|
420
|
+
if (finalKeys.length != finalKeyValues.length) {
|
|
414
421
|
return null;
|
|
415
422
|
}
|
|
416
|
-
const
|
|
417
|
-
|
|
423
|
+
const filteringCaseSensitive = ModelHelper.isFilteringCaseSensitive(metaModel);
|
|
424
|
+
let filters;
|
|
425
|
+
if (finalKeys.length === 1) {
|
|
426
|
+
// If this is a technical key, the equal is present because there's at least 2 parameters, a technical key and IsActiveEntity
|
|
427
|
+
if (finalKeyValues[0].indexOf("=") > 0) {
|
|
428
|
+
const keyPart = finalKeyValues[0].split("=");
|
|
429
|
+
finalKeyValues[0] = keyPart[1];
|
|
430
|
+
}
|
|
418
431
|
// Take the first key value
|
|
419
|
-
const
|
|
420
|
-
|
|
421
|
-
path:
|
|
432
|
+
const keyValue = unquoteAndDecode(finalKeyValues[0]);
|
|
433
|
+
filters = [new Filter({
|
|
434
|
+
path: finalKeys[0],
|
|
422
435
|
operator: FilterOperator.EQ,
|
|
423
|
-
value1:
|
|
424
|
-
caseSensitive:
|
|
436
|
+
value1: keyValue,
|
|
437
|
+
caseSensitive: filteringCaseSensitive
|
|
425
438
|
})];
|
|
426
439
|
} else {
|
|
427
440
|
const mKeyValues = {};
|
|
428
441
|
// Create a map of all key values
|
|
429
|
-
|
|
442
|
+
finalKeyValues.forEach(function (sKeyAssignment) {
|
|
430
443
|
const aParts = sKeyAssignment.split("="),
|
|
431
|
-
|
|
432
|
-
mKeyValues[aParts[0]] =
|
|
444
|
+
keyValue = unquoteAndDecode(aParts[1]);
|
|
445
|
+
mKeyValues[aParts[0]] = keyValue;
|
|
433
446
|
});
|
|
434
|
-
let
|
|
435
|
-
|
|
436
|
-
const
|
|
437
|
-
|
|
438
|
-
if (
|
|
447
|
+
let failed = false;
|
|
448
|
+
filters = finalKeys.map(function (semanticKey) {
|
|
449
|
+
const key = semanticKey,
|
|
450
|
+
value = mKeyValues[key];
|
|
451
|
+
if (value !== undefined) {
|
|
439
452
|
return new Filter({
|
|
440
|
-
path:
|
|
453
|
+
path: key,
|
|
441
454
|
operator: FilterOperator.EQ,
|
|
442
|
-
value1:
|
|
443
|
-
caseSensitive:
|
|
455
|
+
value1: value,
|
|
456
|
+
caseSensitive: filteringCaseSensitive
|
|
444
457
|
});
|
|
445
458
|
} else {
|
|
446
|
-
|
|
459
|
+
failed = true;
|
|
447
460
|
return new Filter({
|
|
448
461
|
path: "XX"
|
|
449
|
-
}); // will be
|
|
462
|
+
}); // will be ignored anyway since we return after
|
|
450
463
|
}
|
|
451
464
|
});
|
|
452
465
|
|
|
453
|
-
if (
|
|
466
|
+
if (failed) {
|
|
454
467
|
return null;
|
|
455
468
|
}
|
|
456
469
|
}
|
|
457
470
|
|
|
458
471
|
// Add a draft filter to make sure we take the draft entity if there is one
|
|
459
472
|
// Or the active entity otherwise
|
|
460
|
-
const
|
|
473
|
+
const draftFilter = new Filter({
|
|
461
474
|
filters: [new Filter("IsActiveEntity", "EQ", false), new Filter("SiblingEntity/IsActiveEntity", "EQ", null)],
|
|
462
475
|
and: false
|
|
463
476
|
});
|
|
464
|
-
|
|
465
|
-
return new Filter(
|
|
477
|
+
filters.push(draftFilter);
|
|
478
|
+
return new Filter(filters, true);
|
|
466
479
|
}
|
|
467
480
|
|
|
468
481
|
/**
|
|
469
482
|
* Converts a path with semantic keys to a path with technical keys.
|
|
470
483
|
*
|
|
471
|
-
* @param
|
|
472
|
-
* @param
|
|
473
|
-
* @param
|
|
474
|
-
* @returns A Promise containing the path with technical keys if
|
|
484
|
+
* @param pathWithParameters The path with semantic keys
|
|
485
|
+
* @param model The model for the path
|
|
486
|
+
* @param keys The semantic or technical keys for the path
|
|
487
|
+
* @returns A Promise containing the path with technical keys if pathWithParameters could be interpreted as a technical path, null otherwise
|
|
475
488
|
* @ui5-restricted
|
|
489
|
+
* @private
|
|
476
490
|
*/;
|
|
477
|
-
_proto.
|
|
478
|
-
var
|
|
479
|
-
const
|
|
480
|
-
let
|
|
481
|
-
if (!
|
|
482
|
-
// No semantic keys
|
|
483
|
-
return
|
|
491
|
+
_proto.getTechnicalPathFromPath = async function getTechnicalPathFromPath(pathWithParameters, model, keys) {
|
|
492
|
+
var _entitySetPath;
|
|
493
|
+
const metaModel = model.getMetaModel();
|
|
494
|
+
let entitySetPath = metaModel.getMetaContext(pathWithParameters).getPath();
|
|
495
|
+
if (!keys || keys.length === 0) {
|
|
496
|
+
// No semantic/technical keys
|
|
497
|
+
return null;
|
|
484
498
|
}
|
|
485
499
|
|
|
486
500
|
// Create a set of filters corresponding to all keys
|
|
487
|
-
const
|
|
488
|
-
if (
|
|
501
|
+
const filter = this.createFilterFromPath(pathWithParameters, keys, metaModel);
|
|
502
|
+
if (filter === null) {
|
|
489
503
|
// Couldn't interpret the path as a semantic one
|
|
490
|
-
return
|
|
504
|
+
return null;
|
|
491
505
|
}
|
|
492
506
|
|
|
493
507
|
// Load the corresponding object
|
|
494
|
-
if (!((
|
|
495
|
-
|
|
508
|
+
if (!((_entitySetPath = entitySetPath) !== null && _entitySetPath !== void 0 && _entitySetPath.startsWith("/"))) {
|
|
509
|
+
entitySetPath = `/${entitySetPath}`;
|
|
496
510
|
}
|
|
497
|
-
const
|
|
511
|
+
const listBinding = model.bindList(entitySetPath, undefined, undefined, filter, {
|
|
498
512
|
$$groupId: "$auto.Heroes"
|
|
499
513
|
});
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
});
|
|
514
|
+
const contexts = await listBinding.requestContexts(0, 2);
|
|
515
|
+
if (contexts.length) {
|
|
516
|
+
return contexts[0].getPath();
|
|
517
|
+
} else {
|
|
518
|
+
// No data could be loaded
|
|
519
|
+
return null;
|
|
520
|
+
}
|
|
508
521
|
}
|
|
509
522
|
|
|
510
523
|
/**
|
|
511
|
-
*
|
|
524
|
+
* Refreshes a context.
|
|
512
525
|
*
|
|
513
|
-
* @param
|
|
514
|
-
* @param
|
|
515
|
-
* @
|
|
526
|
+
* @param model The OData model
|
|
527
|
+
* @param pathToReplaceWith The path to the new context
|
|
528
|
+
* @param contextToRemove The initial context that is going to be replaced
|
|
529
|
+
* @private
|
|
530
|
+
*/;
|
|
531
|
+
_proto.refreshContext = async function refreshContext(model, pathToReplaceWith, contextToRemove) {
|
|
532
|
+
const rootViewController = this._oAppComponent.getRootViewController();
|
|
533
|
+
if (rootViewController.isFclEnabled()) {
|
|
534
|
+
const contextToReplaceWith = model.getKeepAliveContext(pathToReplaceWith);
|
|
535
|
+
contextToRemove.replaceWith(contextToReplaceWith);
|
|
536
|
+
} else {
|
|
537
|
+
EditState.setEditStateDirty();
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Checks if a path is a root draft.
|
|
543
|
+
*
|
|
544
|
+
* @param path The path to test
|
|
545
|
+
* @param metaModel The associated metadata model
|
|
546
|
+
* @returns `true` if the path is a root path
|
|
516
547
|
* @ui5-restricted
|
|
548
|
+
* @private
|
|
517
549
|
*/;
|
|
518
|
-
_proto.
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
if (!aMatches) {
|
|
550
|
+
_proto.checkDraftAvailability = function checkDraftAvailability(path, metaModel) {
|
|
551
|
+
const matches = /^[/]?(\w+)\([^/]+\)$/.exec(path);
|
|
552
|
+
if (!matches) {
|
|
522
553
|
return false;
|
|
523
554
|
}
|
|
524
555
|
// Get the entitySet name
|
|
525
|
-
const
|
|
526
|
-
// Check the entity set supports draft
|
|
527
|
-
const
|
|
528
|
-
|
|
529
|
-
return oDraftRoot || oDraftNode ? true : false;
|
|
556
|
+
const entitySetPath = `/${matches[1]}`;
|
|
557
|
+
// Check the entity set supports draft
|
|
558
|
+
const draftRoot = metaModel.getObject(`${entitySetPath}@com.sap.vocabularies.Common.v1.DraftRoot`);
|
|
559
|
+
return draftRoot ? true : false;
|
|
530
560
|
}
|
|
531
561
|
|
|
532
562
|
/**
|
|
533
|
-
* Builds a path
|
|
563
|
+
* Builds a path to navigate to from a path with SemanticKeys or technical keys.
|
|
534
564
|
*
|
|
535
|
-
* @param
|
|
536
|
-
* @param
|
|
537
|
-
* @
|
|
565
|
+
* @param pathToResolve The path to be transformed
|
|
566
|
+
* @param model The OData model
|
|
567
|
+
* @param navigationParameter The parameter of the navigation
|
|
568
|
+
* @returns String promise for the new path. If pathToResolve couldn't be interpreted as a semantic path, it is returned as is.
|
|
538
569
|
* @ui5-restricted
|
|
570
|
+
* @private
|
|
539
571
|
*/;
|
|
540
|
-
_proto.
|
|
541
|
-
|
|
542
|
-
const
|
|
543
|
-
|
|
544
|
-
|
|
572
|
+
_proto.resolvePath = async function resolvePath(pathToResolve, model, navigationParameter) {
|
|
573
|
+
var _currentHashNoParams, _currentHashNoParams2, _currentHashNoParams3;
|
|
574
|
+
const metaModel = model.getMetaModel();
|
|
575
|
+
const lastSemanticMapping = this._oRoutingService.getLastSemanticMapping();
|
|
576
|
+
let currentHashNoParams = this._oRouter.getHashChanger().getHash().split("?")[0];
|
|
577
|
+
if (((_currentHashNoParams = currentHashNoParams) === null || _currentHashNoParams === void 0 ? void 0 : _currentHashNoParams.lastIndexOf("/")) === ((_currentHashNoParams2 = currentHashNoParams) === null || _currentHashNoParams2 === void 0 ? void 0 : _currentHashNoParams2.length) - 1) {
|
|
545
578
|
// Remove trailing '/'
|
|
546
|
-
|
|
547
|
-
}
|
|
548
|
-
let
|
|
549
|
-
if (
|
|
550
|
-
|
|
551
|
-
}
|
|
552
|
-
const
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
579
|
+
currentHashNoParams = currentHashNoParams.substring(0, currentHashNoParams.length - 1);
|
|
580
|
+
}
|
|
581
|
+
let rootEntityName = (_currentHashNoParams3 = currentHashNoParams) === null || _currentHashNoParams3 === void 0 ? void 0 : _currentHashNoParams3.substr(0, currentHashNoParams.indexOf("("));
|
|
582
|
+
if (rootEntityName.indexOf("/") === 0) {
|
|
583
|
+
rootEntityName = rootEntityName.substring(1);
|
|
584
|
+
}
|
|
585
|
+
const isRootDraft = this.checkDraftAvailability(currentHashNoParams, metaModel),
|
|
586
|
+
semanticKeys = isRootDraft ? SemanticKeyHelper.getSemanticKeys(metaModel, rootEntityName) : undefined,
|
|
587
|
+
isCollaborationEnabled = ModelHelper.isCollaborationDraftSupported(metaModel);
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* 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.
|
|
591
|
+
* 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.
|
|
592
|
+
*/
|
|
593
|
+
if (isRootDraft && isCollaborationEnabled) {
|
|
594
|
+
var _navigationParameter$;
|
|
595
|
+
const isActiveEntity = (navigationParameter === null || navigationParameter === void 0 ? void 0 : (_navigationParameter$ = navigationParameter.useContext) === null || _navigationParameter$ === void 0 ? void 0 : _navigationParameter$.getProperty("IsActiveEntity")) ?? true;
|
|
596
|
+
if (!isActiveEntity) {
|
|
597
|
+
return this.resolveCollaborationPath(pathToResolve, model, navigationParameter, semanticKeys, rootEntityName);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* This is the 'normal' process.
|
|
602
|
+
* If we don't have semantic keys, the path we have is technical and can be used as is.
|
|
603
|
+
* 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
|
|
604
|
+
* Otherwise, we need to evaluate the technical path, to set up the semantic mapping (if it's been resolved).
|
|
605
|
+
*/
|
|
606
|
+
if (semanticKeys === undefined) {
|
|
607
|
+
return pathToResolve;
|
|
608
|
+
}
|
|
609
|
+
if ((lastSemanticMapping === null || lastSemanticMapping === void 0 ? void 0 : lastSemanticMapping.semanticPath) === pathToResolve) {
|
|
558
610
|
// 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
|
-
}
|
|
611
|
+
return lastSemanticMapping.technicalPath;
|
|
612
|
+
}
|
|
613
|
+
const formattedSemanticKeys = semanticKeys.map(singleKey => singleKey.$PropertyPath);
|
|
614
|
+
|
|
615
|
+
// We need resolve the semantic path to get the technical keys
|
|
616
|
+
const technicalPath = await this.getTechnicalPathFromPath(currentHashNoParams, model, formattedSemanticKeys);
|
|
617
|
+
if (technicalPath && technicalPath !== pathToResolve) {
|
|
618
|
+
// The semantic path was resolved (otherwise keep the original value for target)
|
|
619
|
+
this._oRoutingService.setLastSemanticMapping({
|
|
620
|
+
technicalPath: technicalPath,
|
|
621
|
+
semanticPath: pathToResolve
|
|
573
622
|
});
|
|
623
|
+
return technicalPath;
|
|
574
624
|
}
|
|
625
|
+
return pathToResolve;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Evaluate the path to navigate when we're in a collaboration application and navigating to a draft.
|
|
630
|
+
* If the draft has been discarded, we change the path to the sibling element associated, otherwise we keep the same path.
|
|
631
|
+
* We're not doing it outside of collaboration as it's adding a request during navigation!
|
|
632
|
+
*
|
|
633
|
+
* @param pathToResolve The path we're checking. If the draft exists, we return it as is, otherwise we return the sibling element associated
|
|
634
|
+
* @param model The oData model
|
|
635
|
+
* @param navigationParameter The parameter of the navigation
|
|
636
|
+
* @param semanticKeys The semantic keys if we have semantic navigation, otherwise false
|
|
637
|
+
* @param rootEntityName Name of the root entity
|
|
638
|
+
* @returns The path to navigate to
|
|
639
|
+
* @private
|
|
640
|
+
*/;
|
|
641
|
+
_proto.resolveCollaborationPath = async function resolveCollaborationPath(pathToResolve, model, navigationParameter, semanticKeys, rootEntityName) {
|
|
642
|
+
const lastSemanticMapping = this._oRoutingService.getLastSemanticMapping();
|
|
643
|
+
const metaModel = model.getMetaModel();
|
|
644
|
+
const currentHashNoParams = this._oRouter.getHashChanger().getHash().split("?")[0];
|
|
645
|
+
let formattedKeys;
|
|
646
|
+
const comparativePath = (lastSemanticMapping === null || lastSemanticMapping === void 0 ? void 0 : lastSemanticMapping.technicalPath) ?? pathToResolve;
|
|
647
|
+
if (semanticKeys) {
|
|
648
|
+
formattedKeys = semanticKeys.map(singleKey => singleKey.$PropertyPath);
|
|
649
|
+
} else {
|
|
650
|
+
formattedKeys = metaModel.getObject(`/${rootEntityName}/$Type/$Key`);
|
|
651
|
+
}
|
|
652
|
+
const technicalPath = await this.getTechnicalPathFromPath(currentHashNoParams, model, formattedKeys);
|
|
653
|
+
if (technicalPath === null) {
|
|
654
|
+
return pathToResolve;
|
|
655
|
+
}
|
|
656
|
+
// Comparing path that was returned from the server with the one we have. If they are different, it means the draft doesn't exist.
|
|
657
|
+
if (technicalPath !== comparativePath && navigationParameter.useContext) {
|
|
658
|
+
var _metaModel$getObject;
|
|
659
|
+
if (lastSemanticMapping) {
|
|
660
|
+
this._oRoutingService.setLastSemanticMapping({
|
|
661
|
+
technicalPath: technicalPath,
|
|
662
|
+
semanticPath: pathToResolve
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
navigationParameter.redirectedToNonDraft = ((_metaModel$getObject = metaModel.getObject(`/${rootEntityName}/@com.sap.vocabularies.UI.v1.HeaderInfo`)) === null || _metaModel$getObject === void 0 ? void 0 : _metaModel$getObject.TypeName) ?? rootEntityName;
|
|
666
|
+
await this.refreshContext(model, technicalPath, navigationParameter.useContext);
|
|
667
|
+
}
|
|
668
|
+
return technicalPath;
|
|
575
669
|
}
|
|
576
670
|
|
|
577
671
|
/**
|
|
@@ -591,6 +685,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
591
685
|
// or if we have a context already selected
|
|
592
686
|
if (oUseContext && oUseContext.getPath() === sTargetPath) {
|
|
593
687
|
if (oUseContext !== oCurrentContext) {
|
|
688
|
+
let shouldRefreshContext = false;
|
|
594
689
|
// We already have the context to be used, and it's not the current one
|
|
595
690
|
const oRootViewController = this._oAppComponent.getRootViewController();
|
|
596
691
|
|
|
@@ -600,15 +695,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
600
695
|
if (oRootViewController.isFclEnabled() && oNavigationParameters.reason === NavigationReason.RowPress) {
|
|
601
696
|
const metaModel = oUseContext.getModel().getMetaModel();
|
|
602
697
|
if (!oUseContext.getBinding().hasPendingChanges()) {
|
|
603
|
-
|
|
604
|
-
} else if (isConnected(this.getView()) || ModelHelper.isDraftSupported(metaModel, oUseContext.getPath()) && ModelHelper.isCollaborationDraftSupported(metaModel)) {
|
|
698
|
+
shouldRefreshContext = true;
|
|
699
|
+
} else if (ActivitySync.isConnected(this.getView()) || ModelHelper.isDraftSupported(metaModel, oUseContext.getPath()) && ModelHelper.isCollaborationDraftSupported(metaModel)) {
|
|
605
700
|
// If there are pending changes but we're in collaboration draft, we force the refresh (discarding pending changes) as we need to have the latest version.
|
|
606
701
|
// When navigating from LR to OP, the view is not connected yet --> check if we're in draft with collaboration from the metamodel
|
|
607
702
|
oUseContext.getBinding().resetChanges();
|
|
608
|
-
|
|
703
|
+
shouldRefreshContext = true;
|
|
609
704
|
}
|
|
610
705
|
}
|
|
611
706
|
this._bindPageToContext(oUseContext, oModel, oNavigationParameters);
|
|
707
|
+
if (shouldRefreshContext) {
|
|
708
|
+
oUseContext.refresh();
|
|
709
|
+
}
|
|
612
710
|
}
|
|
613
711
|
} else if (sCurrentPath !== sTargetPath) {
|
|
614
712
|
// We need to create a new context for its path
|
|
@@ -665,7 +763,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
665
763
|
showPlaceholder: oNavigationParameters.bShowPlaceholder
|
|
666
764
|
});
|
|
667
765
|
this._setBindingContext(oContext);
|
|
668
|
-
this.onAfterBinding(oContext
|
|
766
|
+
this.onAfterBinding(oContext, {
|
|
767
|
+
redirectedToNonDraft: oNavigationParameters === null || oNavigationParameters === void 0 ? void 0 : oNavigationParameters.redirectedToNonDraft
|
|
768
|
+
});
|
|
669
769
|
}
|
|
670
770
|
|
|
671
771
|
/**
|
|
@@ -978,4 +1078,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
978
1078
|
}(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
1079
|
return InternalRouting;
|
|
980
1080
|
}, 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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
|
|
1081
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnRlcm5hbFJvdXRpbmciLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJmaW5hbEV4dGVuc2lvbiIsIkJlZm9yZSIsIm9uRXhpdCIsIl9vUm91dGluZ1NlcnZpY2UiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJfZm5Sb3V0ZU1hdGNoZWRCb3VuZCIsIm9uSW5pdCIsIl9vVmlldyIsImJhc2UiLCJnZXRWaWV3IiwiX29BcHBDb21wb25lbnQiLCJDb21tb25VdGlscyIsImdldEFwcENvbXBvbmVudCIsIl9vUGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwiX29Sb3V0ZXIiLCJnZXRSb3V0ZXIiLCJfb1JvdXRlclByb3h5IiwiZ2V0Um91dGVyUHJveHkiLCJFcnJvciIsImdldFNlcnZpY2UiLCJ0aGVuIiwib1JvdXRpbmdTZXJ2aWNlIiwiX29uUm91dGVNYXRjaGVkIiwiYmluZCIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsIl9vVGFyZ2V0SW5mb3JtYXRpb24iLCJnZXRUYXJnZXRJbmZvcm1hdGlvbkZvciIsImNhdGNoIiwib25Sb3V0ZU1hdGNoZWQiLCJvblJvdXRlTWF0Y2hlZEZpbmlzaGVkIiwib25CZWZvcmVCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJvUm91dGluZyIsImdldENvbnRyb2xsZXIiLCJyb3V0aW5nIiwib25BZnRlckJpbmRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJvbkNvbnRleHRCb3VuZFRvVmlldyIsIm5hdmlnYXRlVG9UYXJnZXQiLCJvQ29udGV4dCIsInNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSIsImJQcmVzZXJ2ZUhpc3RvcnkiLCJvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm9EZXRhaWxSb3V0ZSIsImRldGFpbCIsInNSb3V0ZU5hbWUiLCJyb3V0ZSIsIm1QYXJhbWV0ZXJNYXBwaW5nIiwicGFyYW1ldGVycyIsIm5hdmlnYXRlVG8iLCJnZXRWaWV3RGF0YSIsIm5hdmlnYXRlVG9Sb3V0ZSIsInNUYXJnZXRSb3V0ZU5hbWUiLCJvUGFyYW1ldGVycyIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NvbnRleHRJbmZvIiwiaXNBIiwiYXN5bmNDb250ZXh0IiwiYWN0aXZhdGVSb3V0ZU1hdGNoU3luY2hyb25pemF0aW9uIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJlZGl0YWJsZSIsImJQZXJzaXN0T1BTY3JvbGwiLCJ1cGRhdGVGQ0xMZXZlbCIsImJGb3JjZUZvY3VzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJiRGVmZXJyZWRDb250ZXh0IiwiY2FsbEV4dGVuc2lvbiIsIm9JbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJzZXRQcm9wZXJ0eSIsInNvdXJjZUJpbmRpbmdDb250ZXh0IiwiZ2V0T2JqZWN0IiwiYmluZGluZ0NvbnRleHQiLCJvRXZlbnQiLCJiT3ZlcnJpZGVOYXYiLCJvbkJlZm9yZU5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZDTExldmVsIiwiX2dldEZDTExldmVsIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldFByb3BlcnR5IiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwic0hhc2giLCJnZXRIYXNoIiwiaW5kZXhPZiIsIm5hdkJhY2siLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJzRXJyb3JNZXNzYWdlIiwibmF2VG9IYXNoIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJkaXNwbGF5RXJyb3JQYWdlIiwiaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5IiwiX2lzVmlld1BhcnRPZlJvdXRlIiwicm91dGVJbmZvcm1hdGlvbiIsImFUYXJnZXRzIiwidGFyZ2V0cyIsInRhcmdldE5hbWUiLCJ2aWV3TGV2ZWwiLCJyb3V0ZUxldmVsIiwiX3NldEJpbmRpbmdDb250ZXh0IiwiX2J1aWxkQmluZGluZ1BhdGgiLCJyb3V0ZUFyZ3VtZW50cyIsImJpbmRpbmdQYXR0ZXJuIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwYXRoIiwicmVwbGFjZSIsImRlZmVycmVkIiwic0tleSIsInNWYWx1ZSIsImJUYXJnZXRFZGl0YWJsZSIsImhhc093blByb3BlcnR5IiwiYkFjdGlvbkNyZWF0ZSIsImdldFBhcmFtZXRlciIsImdldEJpbmRpbmdDb250ZXh0UGF0dGVybiIsImNvbnRleHRQYXR0ZXJuIiwidW5kZWZpbmVkIiwibUFyZ3VtZW50cyIsImdldFBhcmFtZXRlcnMiLCJhcmd1bWVudHMiLCJvTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvTW9kZWwiLCJvT3V0IiwiX2JpbmREZWZlcnJlZCIsIl9iaW5kUGFnZSIsImZpbmFsbHkiLCJ1cGRhdGVVSVN0YXRlRm9yVmlldyIsInNUYXJnZXRQYXRoIiwib0FzeW5jQ29udGV4dCIsImNyZWF0ZURlZmVycmVkQ29udGV4dCIsImxpc3RCaW5kaW5nRm9yQ3JlYXRlIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiX2dldEJpbmRpbmdDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwidGFyZ2V0UGF0aCIsIm1vZGVsIiwiX2JpbmRQYWdlVG9Db250ZXh0IiwicmVzb2x2ZVBhdGgiLCJ0ZWNobmljYWxQYXRoIiwiX2JpbmRQYWdlVG9QYXRoIiwicmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtZXNzYWdlIiwiY3JlYXRlRmlsdGVyRnJvbVBhdGgiLCJzZW1hbnRpY1BhdGgiLCJzZW1hbnRpY0tleXMiLCJtZXRhTW9kZWwiLCJ1bnF1b3RlQW5kRGVjb2RlIiwidmFsdWUiLCJsYXN0SW5kZXhPZiIsImxlbmd0aCIsImRlY29kZVVSSUNvbXBvbmVudCIsInN1YnN0cmluZyIsImtleVZhbHVlcyIsInNwbGl0IiwiZmluYWxLZXlzIiwiZmluYWxLZXlWYWx1ZXMiLCJpbmNsdWRlcyIsImZpbHRlciIsInNpbmdsZUtleSIsImVsZW1lbnQiLCJzdGFydHNXaXRoIiwiZmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsIk1vZGVsSGVscGVyIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiZmlsdGVycyIsImtleVBhcnQiLCJrZXlWYWx1ZSIsIkZpbHRlciIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsInZhbHVlMSIsImNhc2VTZW5zaXRpdmUiLCJtS2V5VmFsdWVzIiwiZm9yRWFjaCIsInNLZXlBc3NpZ25tZW50IiwiYVBhcnRzIiwiZmFpbGVkIiwibWFwIiwic2VtYW50aWNLZXkiLCJrZXkiLCJkcmFmdEZpbHRlciIsImFuZCIsInB1c2giLCJnZXRUZWNobmljYWxQYXRoRnJvbVBhdGgiLCJwYXRoV2l0aFBhcmFtZXRlcnMiLCJrZXlzIiwiZ2V0TWV0YU1vZGVsIiwiZW50aXR5U2V0UGF0aCIsImdldE1ldGFDb250ZXh0IiwiZ2V0UGF0aCIsImxpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJGdyb3VwSWQiLCJjb250ZXh0cyIsInJlcXVlc3RDb250ZXh0cyIsInJlZnJlc2hDb250ZXh0IiwicGF0aFRvUmVwbGFjZVdpdGgiLCJjb250ZXh0VG9SZW1vdmUiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJpc0ZjbEVuYWJsZWQiLCJjb250ZXh0VG9SZXBsYWNlV2l0aCIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJyZXBsYWNlV2l0aCIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiY2hlY2tEcmFmdEF2YWlsYWJpbGl0eSIsIm1hdGNoZXMiLCJleGVjIiwiZHJhZnRSb290IiwicGF0aFRvUmVzb2x2ZSIsIm5hdmlnYXRpb25QYXJhbWV0ZXIiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRIYXNoTm9QYXJhbXMiLCJnZXRIYXNoQ2hhbmdlciIsInJvb3RFbnRpdHlOYW1lIiwic3Vic3RyIiwiaXNSb290RHJhZnQiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsImlzQWN0aXZlRW50aXR5IiwidXNlQ29udGV4dCIsInJlc29sdmVDb2xsYWJvcmF0aW9uUGF0aCIsImZvcm1hdHRlZFNlbWFudGljS2V5cyIsIiRQcm9wZXJ0eVBhdGgiLCJzZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwiZm9ybWF0dGVkS2V5cyIsImNvbXBhcmF0aXZlUGF0aCIsInJlZGlyZWN0ZWRUb05vbkRyYWZ0IiwiVHlwZU5hbWUiLCJvQ3VycmVudENvbnRleHQiLCJzQ3VycmVudFBhdGgiLCJvVXNlQ29udGV4dCIsInNob3VsZFJlZnJlc2hDb250ZXh0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInJlYXNvbiIsIk5hdmlnYXRpb25SZWFzb24iLCJSb3dQcmVzcyIsIkFjdGl2aXR5U3luYyIsImlzQ29ubmVjdGVkIiwiaXNEcmFmdFN1cHBvcnRlZCIsInJlZnJlc2giLCJfY3JlYXRlQ29udGV4dCIsIkFwcFN0YXRlQ2hhbmdlZCIsImlzRWRpdFN0YXRlRGlydHkiLCJfcmVmcmVzaEJpbmRpbmdDb250ZXh0Iiwib1BhcmVudExpc3RCaW5kaW5nIiwiX3NldEtlZXBBbGl2ZSIsImlzQ29udGV4dFVzZWRJblBhZ2VzIiwiYkRyYWZ0TmF2aWdhdGlvbiIsInNob3dQbGFjZWhvbGRlciIsImJTaG93UGxhY2Vob2xkZXIiLCJzUGF0aCIsIm9QYWdlQ29tcG9uZW50Iiwic0VudGl0eVNldCIsImdldEVudGl0eVNldCIsInNDb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwib01ldGFNb2RlbCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMiLCJvRHJhZnRSb290Iiwib0RyYWZ0Tm9kZSIsIl9nZXRLZWVwQWxpdmVDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwicmVxdWVzdE9iamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNNZXNzYWdlc1BhdGgiLCIkc2VsZWN0Iiwib1ByZXZpb3VzQmluZGluZyIsImRlc3Ryb3kiLCJvSGlkZGVuQmluZGluZyIsImJpbmRDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwiQnVzeUxvY2tlciIsImxvY2siLCJvbkRhdGFSZWNlaXZlZCIsImdldEJvdW5kQ29udGV4dCIsInNFcnJvckRlc2NyaXB0aW9uIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJvUmVzb3VyY2VCdW5kbGUiLCJtZXNzYWdlSGFuZGxlciIsIm1QYXJhbXMiLCJzdGF0dXMiLCJpc0luaXRpYWxMb2FkNTAzRXJyb3IiLCJzaGVsbEJhY2siLCJpc0RhdGFSZWNlaXZlZEVycm9yIiwic2hvd01lc3NhZ2VzIiwib1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInNSb290Q29udGV4dFBhdGgiLCJhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMiLCJhUHJvcGVydHlQYXRocyIsIm9TaWRlRWZmZWN0cyIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsImdldEJpbmRpbmdQYXRocyIsIm9CaW5kaW5nIiwiYURlcGVuZGVudEJpbmRpbmdzIiwic1JlbGF0aXZlUGF0aCIsImdldENvbnRleHQiLCJzbGljZSIsImdldERlcGVuZGVudEJpbmRpbmdzIiwiaSIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwicmVkdWNlIiwidGFyZ2V0UHJvcGVydHkiLCJpbmRleCIsIm9QcmV2aW91c0NvbnRleHQiLCJvVGFyZ2V0Q29udHJvbCIsInNldEJpbmRpbmdDb250ZXh0IiwiaXNLZWVwQWxpdmUiLCJiS2VlcEFsaXZlIiwiZm5CZWZvcmVEZXN0cm95IiwiYlJlcXVlc3RNZXNzYWdlcyIsImVuZHNXaXRoIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJzZXRLZWVwQWxpdmUiLCJrZXB0QWxpdmVTZWdtZW50cyIsImFkZGl0aW9ubmFsU2VnbWVudHMiLCJwb3AiLCJrZXB0QWxpdmVQYXRoIiwiam9pbiIsIm9LZWVwQWxpdmVDb250ZXh0IiwicmV2ZXJzZSIsImFkZGl0aW9ubmFsUGF0aCIsInN3aXRjaEZ1bGxTY3JlZW4iLCJvU291cmNlIiwib0ZDTEhlbHBlck1vZGVsIiwiYklzRnVsbFNjcmVlbiIsInNOZXh0TGF5b3V0IiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9yb3V0aW5nIiwic0xheW91dCIsIndhcm5pbmciLCJjbG9zZUNvbHVtbiIsIm9WaWV3RGF0YSIsIm5vUHJlc2VydmF0aW9uQ2FjaGUiLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSW50ZXJuYWxSb3V0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBBY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgTmF2aWdhdGlvblJlYXNvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXJQcm94eSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvcm91dGluZy9Sb3V0ZXJQcm94eVwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvbkluZm8sIFJvdXRpbmdTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGVtcGxhdGVDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB7IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5cbi8qKlxuICoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uIENvbnRyb2xsZXIgZXh0ZW5zaW9ufVxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5JbnRlcm5hbFJvdXRpbmdcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS43NC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkludGVybmFsUm91dGluZ1wiKVxuY2xhc3MgSW50ZXJuYWxSb3V0aW5nIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgX29WaWV3ITogRkVWaWV3O1xuXG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb1BhZ2VDb21wb25lbnQhOiBFbmhhbmNlV2l0aFVJNTxUZW1wbGF0ZUNvbXBvbmVudD4gfCBudWxsO1xuXG5cdHByaXZhdGUgX29Sb3V0ZXIhOiBSb3V0ZXI7XG5cblx0cHJpdmF0ZSBfb1JvdXRpbmdTZXJ2aWNlITogUm91dGluZ1NlcnZpY2U7XG5cblx0cHJpdmF0ZSBfb1JvdXRlclByb3h5ITogUm91dGVyUHJveHk7XG5cblx0cHJpdmF0ZSBfZm5Sb3V0ZU1hdGNoZWRCb3VuZCE6IEZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBfb1RhcmdldEluZm9ybWF0aW9uOiBhbnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25FeGl0KCkge1xuXHRcdGlmICh0aGlzLl9vUm91dGluZ1NlcnZpY2UpIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5fZm5Sb3V0ZU1hdGNoZWRCb3VuZCk7XG5cdFx0fVxuXHR9XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0b25Jbml0KCkge1xuXHRcdHRoaXMuX29WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLl9vVmlldykgYXMgRW5oYW5jZVdpdGhVSTU8VGVtcGxhdGVDb21wb25lbnQ+O1xuXHRcdHRoaXMuX29Sb3V0ZXIgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFJvdXRlcigpO1xuXHRcdHRoaXMuX29Sb3V0ZXJQcm94eSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmICghdGhpcy5fb0FwcENvbXBvbmVudCB8fCAhdGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbnRyb2xlciBleHRlbnNpb24gJ3NhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlc2lvbnMuSW50ZXJuYWxSb3V0aW5nXCIpO1xuXHRcdH1cblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXMuX29BcHBDb21wb25lbnQgPT09IHRoaXMuX29QYWdlQ29tcG9uZW50KSB7XG5cdFx0XHQvLyBUaGUgdmlldyBpc24ndCBob3N0ZWQgaW4gYSBkZWRpY2F0ZWQgVUlDb21wb25lbnQsIGJ1dCBkaXJlY3RseSBpbiB0aGUgYXBwXG5cdFx0XHQvLyAtLT4ganVzdCBrZWVwIHRoZSB2aWV3XG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudFxuXHRcdFx0LmdldFNlcnZpY2UoXCJyb3V0aW5nU2VydmljZVwiKVxuXHRcdFx0LnRoZW4oKG9Sb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UpID0+IHtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlID0gb1JvdXRpbmdTZXJ2aWNlO1xuXHRcdFx0XHR0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kID0gdGhpcy5fb25Sb3V0ZU1hdGNoZWQuYmluZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLl9mblJvdXRlTWF0Y2hlZEJvdW5kKTtcblx0XHRcdFx0dGhpcy5fb1RhcmdldEluZm9ybWF0aW9uID0gb1JvdXRpbmdTZXJ2aWNlLmdldFRhcmdldEluZm9ybWF0aW9uRm9yKHRoaXMuX29QYWdlQ29tcG9uZW50IHx8IHRoaXMuX29WaWV3KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGNhbm5vdCB3b3JrIHdpdGhvdXQgYSAncm91dGluZ1NlcnZpY2UnIG9uIHRoZSBtYWluIEFwcENvbXBvbmVudFwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJlZCBldmVyeSB0aW1lIHRoaXMgY29udHJvbGxlciBpcyBhIG5hdmlnYXRpb24gdGFyZ2V0LlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblJvdXRlTWF0Y2hlZCgpIHtcblx0XHQvKiovXG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUm91dGVNYXRjaGVkRmluaXNoZWQoKSB7XG5cdFx0LyoqL1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzPzogYW55KSB7XG5cdFx0Y29uc3Qgb1JvdXRpbmcgPSAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5yb3V0aW5nO1xuXHRcdGlmIChvUm91dGluZyAmJiBvUm91dGluZy5vbkJlZm9yZUJpbmRpbmcpIHtcblx0XHRcdG9Sb3V0aW5nLm9uQmVmb3JlQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQWZ0ZXJCaW5kaW5nKG9CaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdCh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkub25Db250ZXh0Qm91bmRUb1ZpZXcob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBvUm91dGluZyA9ICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLnJvdXRpbmc7XG5cdFx0aWYgKG9Sb3V0aW5nICYmIG9Sb3V0aW5nLm9uQWZ0ZXJCaW5kaW5nKSB7XG5cdFx0XHRvUm91dGluZy5vbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBNZXRob2RzIHRyaWdnZXJpbmcgYSBuYXZpZ2F0aW9uIGFmdGVyIGEgdXNlciBhY3Rpb25cblx0Ly8gKGUuZy4gY2xpY2sgb24gYSB0YWJsZSByb3csIGJ1dHRvbiwgZXRjLi4uKVxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIHNOYXZpZ2F0aW9uVGFyZ2V0TmFtZSBOYW1lIG9mIHRoZSBuYXZpZ2F0aW9uIHRhcmdldFxuXHQgKiBAcGFyYW0gYlByZXNlcnZlSGlzdG9yeSBUcnVlIHRvIGZvcmNlIHRoZSBuZXcgVVJMIHRvIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJyb3dzZXIgaGlzdG9yeSAobm8gcmVwbGFjZSlcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb1RhcmdldChvQ29udGV4dDogYW55LCBzTmF2aWdhdGlvblRhcmdldE5hbWU6IHN0cmluZywgYlByZXNlcnZlSGlzdG9yeT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24gPVxuXHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQgJiZcblx0XHRcdHRoaXMuX29QYWdlQ29tcG9uZW50LmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uICYmXG5cdFx0XHR0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihzTmF2aWdhdGlvblRhcmdldE5hbWUpO1xuXHRcdGlmIChvTmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxSb3V0ZSA9IG9OYXZpZ2F0aW9uQ29uZmlndXJhdGlvbi5kZXRhaWw7XG5cdFx0XHRjb25zdCBzUm91dGVOYW1lID0gb0RldGFpbFJvdXRlLnJvdXRlO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlck1hcHBpbmcgPSBvRGV0YWlsUm91dGUucGFyYW1ldGVycztcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBzUm91dGVOYW1lLCBtUGFyYW1ldGVyTWFwcGluZywgYlByZXNlcnZlSGlzdG9yeSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvKG9Db250ZXh0LCBudWxsLCBudWxsLCBiUHJlc2VydmVIaXN0b3J5KTtcblx0XHR9XG5cdFx0dGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9uIHRhcmdldCByb3V0ZS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRSb3V0ZU5hbWUgTmFtZSBvZiB0aGUgdGFyZ2V0IHJvdXRlXG5cdCAqIEBwYXJhbSBbb1BhcmFtZXRlcnNdIFBhcmFtZXRlcnMgdG8gYmUgdXNlZCB3aXRoIHJvdXRlIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGhhc2hcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZmluYWxpemVkXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdG5hdmlnYXRlVG9Sb3V0ZShzVGFyZ2V0Um91dGVOYW1lOiBzdHJpbmcsIG9QYXJhbWV0ZXJzPzogb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX29Sb3V0aW5nU2VydmljZS5uYXZpZ2F0ZVRvUm91dGUoc1RhcmdldFJvdXRlTmFtZSwgb1BhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgdG9cblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gT3B0aW9uYWwgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRjb25zdCBvQ29udGV4dEluZm86IGFueSA9IHt9O1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5hc3luY0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gdGhlIGNvbnRleHQgaXMgZWl0aGVyIGNyZWF0ZWQgYXN5bmMgKFByb21pc2UpXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYWN0aXZhdGUgdGhlIHJvdXRlTWF0Y2hTeW5jaHJvIG9uIHRoZSBSb3V0ZXJQcm94eSB0byBhdm9pZCB0aGF0XG5cdFx0XHRcdC8vIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8gbmF2aWdhdGVUb0NvbnRleHQgY29uZmxpY3RzIHdpdGggdGhlIGN1cnJlbnQgb25lXG5cdFx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5hY3RpdmF0ZVJvdXRlTWF0Y2hTeW5jaHJvbml6YXRpb24oKTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycy5hc3luY0NvbnRleHRcblx0XHRcdFx0XHQudGhlbigoYXN5bmNDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdC8vIG9uY2UgdGhlIGNvbnRleHQgaXMgcmV0dXJuZWQgd2UgbmF2aWdhdGUgaW50byBpdFxuXHRcdFx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvQ29udGV4dChhc3luY0NvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IG1QYXJhbWV0ZXJzLmNoZWNrTm9IYXNoQ2hhbmdlLFxuXHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogbVBhcmFtZXRlcnMuZWRpdGFibGUsXG5cdFx0XHRcdFx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwsXG5cdFx0XHRcdFx0XHRcdHVwZGF0ZUZDTExldmVsOiBtUGFyYW1ldGVycy51cGRhdGVGQ0xMZXZlbCxcblx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IG1QYXJhbWV0ZXJzLmJGb3JjZUZvY3VzXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdpdGggdGhlIGFzeW5jIGNvbnRleHRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoIW1QYXJhbWV0ZXJzLmJEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gYSBsaXN0IGJpbmRpbmcgbm90IHlldCBzdXBwb3J0ZWRcblx0XHRcdFx0dGhyb3cgXCJuYXZpZ2F0aW9uIHRvIGEgbGlzdCBiaW5kaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNhbGxFeHRlbnNpb24pIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXG5cdFx0XHRvQ29udGV4dEluZm8uc291cmNlQmluZGluZ0NvbnRleHQgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdG9Db250ZXh0SW5mby5iaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm9FdmVudCkge1xuXHRcdFx0XHRvQ29udGV4dEluZm8ub0V2ZW50ID0gbVBhcmFtZXRlcnMub0V2ZW50O1xuXHRcdFx0fVxuXHRcdFx0Ly8gU3RvcmluZyB0aGUgc2VsZWN0ZWQgY29udGV4dCB0byB1c2UgaXQgaW4gaW50ZXJuYWwgcm91dGUgbmF2aWdhdGlvbiBpZiBuZWNjZXNzYXJ5LlxuXHRcdFx0Y29uc3QgYk92ZXJyaWRlTmF2ID0gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkucm91dGluZy5vbkJlZm9yZU5hdmlnYXRpb24ob0NvbnRleHRJbmZvKTtcblx0XHRcdGlmIChiT3ZlcnJpZGVOYXYpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgb0NvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycywgdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFja3dhcmRzIGZyb20gYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB0byBiZSBuYXZpZ2F0ZWQgZnJvbVxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dDogYW55LCBtUGFyYW1ldGVycz86IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAtMTtcblxuXHRcdHJldHVybiB0aGlzLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIGZvcndhcmRzIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgbmF2aWdhdGVkIHRvXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCBuYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIikgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0bVBhcmFtZXRlcnMudXBkYXRlRkNMTGV2ZWwgPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgYmFjayBpbiBoaXN0b3J5IGlmIHRoZSBjdXJyZW50IGhhc2ggY29ycmVzcG9uZHMgdG8gYSB0cmFuc2llbnQgc3RhdGUuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCkge1xuXHRcdGNvbnN0IHNIYXNoID0gdGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKTtcblxuXHRcdC8vIGlmIHRyaWdnZXJlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvICguLi4pLCB3ZSBuZWVkIHRvIG5hdmlnYXRlIGJhY2tcblx0XHRpZiAoc0hhc2guaW5kZXhPZihcIiguLi4pXCIpICE9PSAtMSkge1xuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5Lm5hdkJhY2soKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0bmF2aWdhdGVUb01lc3NhZ2VQYWdlKHNFcnJvck1lc3NhZ2U6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5fb1JvdXRlclByb3h5LmdldEhhc2goKS5pbmRleE9mKFwiaS1hY3Rpb249Y3JlYXRlXCIpID4gLTEgfHxcblx0XHRcdHRoaXMuX29Sb3V0ZXJQcm94eS5nZXRIYXNoKCkuaW5kZXhPZihcImktYWN0aW9uPWF1dG9DcmVhdGVcIikgPiAtMVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX29Sb3V0ZXJQcm94eS5uYXZUb0hhc2godGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldERlZmF1bHRDcmVhdGVIYXNoKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5GQ0xMZXZlbCA9IHRoaXMuX2dldEZDTExldmVsKCk7XG5cblx0XHRcdHJldHVybiAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmRpc3BsYXlFcnJvclBhZ2Uoc0Vycm9yTWVzc2FnZSwgbVBhcmFtZXRlcnMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBjdXJyZW50IHZpZXdzIG9uIHRoZSBzY3JlZW4gaXMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHRcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdGF0ZSBpcyBpbXBhY3RlZCBieSB0aGUgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpc0N1cnJlbnRTdGF0ZUltcGFjdGVkQnkob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9vUm91dGluZ1NlcnZpY2UuaXNDdXJyZW50U3RhdGVJbXBhY3RlZEJ5KG9Db250ZXh0KTtcblx0fVxuXG5cdF9pc1ZpZXdQYXJ0T2ZSb3V0ZShyb3V0ZUluZm9ybWF0aW9uOiBhbnkpOiBib29sZWFuIHtcblx0XHRjb25zdCBhVGFyZ2V0cyA9IHJvdXRlSW5mb3JtYXRpb24/LnRhcmdldHM7XG5cdFx0aWYgKCFhVGFyZ2V0cyB8fCBhVGFyZ2V0cy5pbmRleE9mKHRoaXMuX29UYXJnZXRJbmZvcm1hdGlvbi50YXJnZXROYW1lKSA9PT0gLTEpIHtcblx0XHRcdC8vIElmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBoYXMgYSB2aWV3IGxldmVsIGdyZWF0ZXIgdGhhbiB0aGUgcm91dGUgbGV2ZWwsIGl0IG1lYW5zIHRoaXMgdmlldyBjb21lcyBcImFmdGVyXCIgdGhlIHJvdXRlXG5cdFx0XHQvLyBpbiB0ZXJtcyBvZiBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gSW4gc3VjaCBjYXNlLCB3ZSByZW1vdmUgaXRzIGJpbmRpbmcgY29udGV4dCwgdG8gYXZvaWQgdGhpcyB2aWV3IHRvIGhhdmUgZGF0YSBpZiB3ZSBuYXZpZ2F0ZSB0byBpdCBsYXRlciBvblxuXHRcdFx0aWYgKCh0aGlzLl9vVGFyZ2V0SW5mb3JtYXRpb24udmlld0xldmVsID8/IDApID49IChyb3V0ZUluZm9ybWF0aW9uPy5yb3V0ZUxldmVsID8/IDApKSB7XG5cdFx0XHRcdHRoaXMuX3NldEJpbmRpbmdDb250ZXh0KG51bGwpOyAvLyBUaGlzIGFsc28gY2FsbCBzZXRLZWVwQWxpdmUoZmFsc2UpIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9idWlsZEJpbmRpbmdQYXRoKFxuXHRcdHJvdXRlQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBvYmplY3Q+LFxuXHRcdGJpbmRpbmdQYXR0ZXJuOiBzdHJpbmcsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mb1xuXHQpOiB7IHBhdGg6IHN0cmluZzsgZGVmZXJyZWQ6IGJvb2xlYW4gfSB7XG5cdFx0bGV0IHBhdGggPSBiaW5kaW5nUGF0dGVybi5yZXBsYWNlKFwiOj9xdWVyeTpcIiwgXCJcIik7XG5cdFx0bGV0IGRlZmVycmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gcm91dGVBcmd1bWVudHMpIHtcblx0XHRcdGNvbnN0IHNWYWx1ZSA9IHJvdXRlQXJndW1lbnRzW3NLZXldO1xuXG5cdFx0XHRpZiAodHlwZW9mIHNWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNWYWx1ZSA9PT0gXCIuLi5cIiAmJiBiaW5kaW5nUGF0dGVybi5pbmRleE9mKGB7JHtzS2V5fX1gKSA+PSAwKSB7XG5cdFx0XHRcdGRlZmVycmVkID0gdHJ1ZTtcblx0XHRcdFx0Ly8gU29tZXRpbWVzIGluIHByZWZlcnJlZE1vZGUgPSBjcmVhdGUsIHRoZSBlZGl0IGJ1dHRvbiBpcyBzaG93biBpbiBiYWNrZ3JvdW5kIHdoZW4gdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIHNob3dzIHVwLCBzZXR0aW5nIGJUYXJnZXRFZGl0YWJsZSBwYXNzZXMgZWRpdGFibGUgYXMgdHJ1ZVxuXHRcdFx0XHQvLyB0byBvbkJlZm9yZUJpbmRpbmcgaW4gX2JpbmRUYXJnZXRQYWdlIGZ1bmN0aW9uXG5cdFx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXJzLmJUYXJnZXRFZGl0YWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKGB7JHtzS2V5fX1gLCBzVmFsdWUpO1xuXHRcdH1cblx0XHRpZiAocm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0gJiYgcm91dGVBcmd1bWVudHNbXCI/cXVlcnlcIl0uaGFzT3duUHJvcGVydHkoXCJpLWFjdGlvblwiKSkge1xuXHRcdFx0bmF2aWdhdGlvblBhcmFtZXRlcnMuYkFjdGlvbkNyZWF0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gdGhlIGJpbmRpbmcgcGF0aCBpcyBhbHdheXMgYWJzb2x1dGVcblx0XHRpZiAocGF0aCAmJiBwYXRoWzBdICE9PSBcIi9cIikge1xuXHRcdFx0cGF0aCA9IGAvJHtwYXRofWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgcGF0aCwgZGVmZXJyZWQgfTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIE1ldGhvZHMgdG8gYmluZCB0aGUgcGFnZSB3aGVuIGEgcm91dGUgaXMgbWF0Y2hlZFxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHJvdXRlIGlzIG1hdGNoZWQuXG5cdCAqIEJ1aWxkcyB0aGUgYmluZGluZyBjb250ZXh0IGZyb20gdGhlIG5hdmlnYXRpb24gcGFyYW1ldGVycywgYW5kIGJpbmQgdGhlIHBhZ2UgYWNjb3JkaW5nbHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfb25Sb3V0ZU1hdGNoZWQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZm9yIHRoaXMgdmlldyBpcyBwYXJ0IG9mIHRoZSBldmVudCB0YXJnZXRzIChpLmUuIGlzIGEgdGFyZ2V0IGZvciB0aGUgY3VycmVudCByb3V0ZSkuXG5cdFx0Ly8gSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGJpbmQgaXQgLS0+IHJldHVyblxuXHRcdGlmICghdGhpcy5faXNWaWV3UGFydE9mUm91dGUob0V2ZW50LmdldFBhcmFtZXRlcihcInJvdXRlSW5mb3JtYXRpb25cIikpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0cmlldmUgdGhlIGJpbmRpbmcgY29udGV4dCBwYXR0ZXJuXG5cdFx0bGV0IGJpbmRpbmdQYXR0ZXJuO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dFBhdHRlcm4pIHtcblx0XHRcdGJpbmRpbmdQYXR0ZXJuID0gdGhpcy5fb1BhZ2VDb21wb25lbnQuZ2V0QmluZGluZ0NvbnRleHRQYXR0ZXJuKCk7XG5cdFx0fVxuXHRcdGJpbmRpbmdQYXR0ZXJuID0gYmluZGluZ1BhdHRlcm4gfHwgdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLmNvbnRleHRQYXR0ZXJuO1xuXG5cdFx0aWYgKGJpbmRpbmdQYXR0ZXJuID09PSBudWxsIHx8IGJpbmRpbmdQYXR0ZXJuID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIERvbid0IGRvIHRoaXMgaWYgd2UgYWxyZWFkeSBnb3Qgc1RhcmdldCA9PSAnJywgd2hpY2ggaXMgYSB2YWxpZCB0YXJnZXQgcGF0dGVyblxuXHRcdFx0YmluZGluZ1BhdHRlcm4gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicm91dGVQYXR0ZXJuXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcGxhY2UgdGhlIHBhcmFtZXRlcnMgYnkgdGhlaXIgdmFsdWVzIGluIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0dGVyblxuXHRcdGNvbnN0IG1Bcmd1bWVudHMgPSAob0V2ZW50LmdldFBhcmFtZXRlcnMoKSBhcyBhbnkpLmFyZ3VtZW50cztcblx0XHRjb25zdCBvTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwibmF2aWdhdGlvbkluZm9cIikgYXMgUm91dGluZ05hdmlnYXRpb25JbmZvO1xuXHRcdGNvbnN0IHsgcGF0aCwgZGVmZXJyZWQgfSA9IHRoaXMuX2J1aWxkQmluZGluZ1BhdGgobUFyZ3VtZW50cywgYmluZGluZ1BhdHRlcm4sIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cblx0XHR0aGlzLm9uUm91dGVNYXRjaGVkKCk7XG5cblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9vVmlldy5nZXRNb2RlbCgpO1xuXHRcdGxldCBvT3V0O1xuXHRcdGlmIChkZWZlcnJlZCkge1xuXHRcdFx0b091dCA9IHRoaXMuX2JpbmREZWZlcnJlZChwYXRoLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvT3V0ID0gdGhpcy5fYmluZFBhZ2UocGF0aCwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm5cblx0XHRvT3V0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5vblJvdXRlTWF0Y2hlZEZpbmlzaGVkKCk7XG5cdFx0fSk7XG5cblx0XHQodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpLnVwZGF0ZVVJU3RhdGVGb3JWaWV3KHRoaXMuX29WaWV3LCB0aGlzLl9nZXRGQ0xMZXZlbCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZlcnJlZCBiaW5kaW5nIChkdXJpbmcgb2JqZWN0IGNyZWF0aW9uKS5cblx0ICpcblx0ICogQHBhcmFtIHNUYXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBkZWZmZXJlZCBjb250ZXh0XG5cdCAqIEBwYXJhbSBvTmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdGFzeW5jIF9iaW5kRGVmZXJyZWQoc1RhcmdldFBhdGg6IHN0cmluZywgb05hdmlnYXRpb25QYXJhbWV0ZXJzOiBSb3V0aW5nTmF2aWdhdGlvbkluZm8pIHtcblx0XHR0aGlzLm9uQmVmb3JlQmluZGluZyhudWxsLCB7IGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlIH0pO1xuXG5cdFx0aWYgKG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iRGVmZXJyZWRDb250ZXh0IHx8ICFvTmF2aWdhdGlvblBhcmFtZXRlcnMub0FzeW5jQ29udGV4dCkge1xuXHRcdFx0Ly8gZWl0aGVyIHRoZSBjb250ZXh0IHNoYWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhcmdldCBwYWdlIChkZWZlcnJlZCBDb250ZXh0KSBvciBpdCBzaGFsbFxuXHRcdFx0Ly8gYmUgY3JlYXRlZCBhc3luYyBidXQgdGhlIHVzZXIgcmVmcmVzaGVkIHRoZSBwYWdlIC8gYm9va21hcmtlZCB0aGlzIFVSTFxuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoZSB0YXJnZXQgY29tcG9uZW50IGNyZWF0ZXMgdGhpcyBkb2N1bWVudCBidXQgd2Ugc2hhbGwgbW92ZSB0aGlzIHRvXG5cdFx0XHQvLyBhIGNlbnRyYWwgcGxhY2Vcblx0XHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCAmJiB0aGlzLl9vUGFnZUNvbXBvbmVudC5jcmVhdGVEZWZlcnJlZENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fb1BhZ2VDb21wb25lbnQuY3JlYXRlRGVmZXJyZWRDb250ZXh0KFxuXHRcdFx0XHRcdHNUYXJnZXRQYXRoLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5saXN0QmluZGluZ0ZvckNyZWF0ZSBhcyBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdCEhb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJBY3Rpb25DcmVhdGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLl9nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChjdXJyZW50QmluZGluZ0NvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdC8vIEZvciBub3cgcmVtb3ZlIHRoZSBwZW5kaW5nIGNoYW5nZXMgdG8gYXZvaWQgdGhlIG1vZGVsIHJhaXNlcyBlcnJvcnMgYW5kIHRoZSBvYmplY3QgcGFnZSBpcyBhdCBsZWFzdCBib3VuZFxuXHRcdFx0Ly8gSWRlYWxseSB0aGUgdXNlciBzaG91bGQgYmUgYXNrZWQgZm9yXG5cdFx0XHRjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSB0aGUgY29udGV4dCB0byBhdm9pZCBzaG93aW5nIG9sZCBkYXRhXG5cdFx0dGhpcy5fc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cblx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBwYXRoIHRvIHRoZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgYmluZGluZyBoYXMgYmVlbiBzZXQgb24gdGhlIHBhZ2Vcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2UodGFyZ2V0UGF0aDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwgbmF2aWdhdGlvblBhcmFtZXRlcnM6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbykge1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JpbmRQYWdlVG9Db250ZXh0KG51bGwsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycykpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlc29sdmVQYXRoKHRhcmdldFBhdGgsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVycylcblx0XHRcdC50aGVuKCh0ZWNobmljYWxQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb1BhdGgodGVjaG5pY2FsUGF0aCwgbW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gRXJyb3IgaGFuZGxpbmcgZm9yIGVycm9uZW91cyBtZXRhZGF0YSByZXF1ZXN0XG5cdFx0XHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblxuXHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShyZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUlwiKSwge1xuXHRcdFx0XHRcdHRpdGxlOiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGVycm9yLm1lc3NhZ2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBmaWx0ZXIgdG8gcmV0cmlldmUgYSBjb250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gYSBzZW1hbnRpYyBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2VtYW50aWNQYXRoIFRoZSBzZW1hbnRpYyBvciB0ZWNobmljYWwgcGF0aFxuXHQgKiBAcGFyYW0gc2VtYW50aWNLZXlzIFRoZSBzZW1hbnRpYyBvciB0ZWNobmljYWwga2V5cyBmb3IgdGhlIHBhdGhcblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgaW5zdGFuY2Ugb2YgdGhlIG1ldGFtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0Y3JlYXRlRmlsdGVyRnJvbVBhdGgoc2VtYW50aWNQYXRoOiBzdHJpbmcsIHNlbWFudGljS2V5czogc3RyaW5nW10sIG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpOiBGaWx0ZXIgfCBudWxsIHtcblx0XHRjb25zdCB1bnF1b3RlQW5kRGVjb2RlID0gZnVuY3Rpb24gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdFx0aWYgKHZhbHVlLmluZGV4T2YoXCInXCIpID09PSAwICYmIHZhbHVlLmxhc3RJbmRleE9mKFwiJ1wiKSA9PT0gdmFsdWUubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHQvLyBSZW1vdmUgdGhlIHF1b3RlcyBmcm9tIHRoZSB2YWx1ZSBhbmQgZGVjb2RlIHNwZWNpYWwgY2hhcnNcblx0XHRcdFx0dmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9O1xuXHRcdGNvbnN0IGtleVZhbHVlcyA9IHNlbWFudGljUGF0aC5zdWJzdHJpbmcoc2VtYW50aWNQYXRoLmluZGV4T2YoXCIoXCIpICsgMSwgc2VtYW50aWNQYXRoLmxlbmd0aCAtIDEpLnNwbGl0KFwiLFwiKTtcblxuXHRcdGxldCBmaW5hbEtleXMgPSBzZW1hbnRpY0tleXM7XG5cdFx0bGV0IGZpbmFsS2V5VmFsdWVzID0ga2V5VmFsdWVzO1xuXHRcdC8vIElmIHdlIGhhdmUgdGVjaG5pY2FsIGtleXMsIElzQWN0aXZlRW50aXR5IHdpbGwgYmUgcHJlc2VudC4gV2UgbmVlZCB0byByZW1vdmUgaXQgYXMgd2UncmUgYWxyZWFkeSBhZGRpbmcgdGhlbSBhdCB0aGUgZW5kLlxuXHRcdGlmIChzZW1hbnRpY0tleXMuaW5jbHVkZXMoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdFx0ZmluYWxLZXlzID0gc2VtYW50aWNLZXlzLmZpbHRlcigoc2luZ2xlS2V5KSA9PiBzaW5nbGVLZXkuaW5kZXhPZihcIklzQWN0aXZlRW50aXR5XCIpIDwgMCk7XG5cdFx0XHRmaW5hbEtleVZhbHVlcyA9IGtleVZhbHVlcy5maWx0ZXIoKGVsZW1lbnQpID0+ICFlbGVtZW50LnN0YXJ0c1dpdGgoXCJJc0FjdGl2ZUVudGl0eVwiKSk7XG5cdFx0fVxuXG5cdFx0aWYgKGZpbmFsS2V5cy5sZW5ndGggIT0gZmluYWxLZXlWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBmaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKG1ldGFNb2RlbCk7XG5cdFx0bGV0IGZpbHRlcnM6IEZpbHRlcltdO1xuXHRcdGlmIChmaW5hbEtleXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgdGVjaG5pY2FsIGtleSwgdGhlIGVxdWFsIGlzIHByZXNlbnQgYmVjYXVzZSB0aGVyZSdzIGF0IGxlYXN0IDIgcGFyYW1ldGVycywgYSB0ZWNobmljYWwga2V5IGFuZCBJc0FjdGl2ZUVudGl0eVxuXHRcdFx0aWYgKGZpbmFsS2V5VmFsdWVzWzBdLmluZGV4T2YoXCI9XCIpID4gMCkge1xuXHRcdFx0XHRjb25zdCBrZXlQYXJ0ID0gZmluYWxLZXlWYWx1ZXNbMF0uc3BsaXQoXCI9XCIpO1xuXHRcdFx0XHRmaW5hbEtleVZhbHVlc1swXSA9IGtleVBhcnRbMV07XG5cdFx0XHR9XG5cdFx0XHQvLyBUYWtlIHRoZSBmaXJzdCBrZXkgdmFsdWVcblx0XHRcdGNvbnN0IGtleVZhbHVlID0gdW5xdW90ZUFuZERlY29kZShmaW5hbEtleVZhbHVlc1swXSk7XG5cdFx0XHRmaWx0ZXJzID0gW1xuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRwYXRoOiBmaW5hbEtleXNbMF0sXG5cdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLFxuXHRcdFx0XHRcdHZhbHVlMToga2V5VmFsdWUsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0XHR9KVxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbUtleVZhbHVlczogYW55ID0ge307XG5cdFx0XHQvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGtleSB2YWx1ZXNcblx0XHRcdGZpbmFsS2V5VmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXlBc3NpZ25tZW50OiBzdHJpbmcpIHtcblx0XHRcdFx0Y29uc3QgYVBhcnRzID0gc0tleUFzc2lnbm1lbnQuc3BsaXQoXCI9XCIpLFxuXHRcdFx0XHRcdGtleVZhbHVlID0gdW5xdW90ZUFuZERlY29kZShhUGFydHNbMV0pO1xuXG5cdFx0XHRcdG1LZXlWYWx1ZXNbYVBhcnRzWzBdXSA9IGtleVZhbHVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGxldCBmYWlsZWQgPSBmYWxzZTtcblx0XHRcdGZpbHRlcnMgPSBmaW5hbEtleXMubWFwKGZ1bmN0aW9uIChzZW1hbnRpY0tleSkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBzZW1hbnRpY0tleSxcblx0XHRcdFx0XHR2YWx1ZSA9IG1LZXlWYWx1ZXNba2V5XTtcblxuXHRcdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdHBhdGg6IGtleSxcblx0XHRcdFx0XHRcdG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSxcblx0XHRcdFx0XHRcdHZhbHVlMTogdmFsdWUsXG5cdFx0XHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBmaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmFpbGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIlhYXCJcblx0XHRcdFx0XHR9KTsgLy8gd2lsbCBiZSBpZ25vcmVkIGFueXdheSBzaW5jZSB3ZSByZXR1cm4gYWZ0ZXJcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChmYWlsZWQpIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGEgZHJhZnQgZmlsdGVyIHRvIG1ha2Ugc3VyZSB3ZSB0YWtlIHRoZSBkcmFmdCBlbnRpdHkgaWYgdGhlcmUgaXMgb25lXG5cdFx0Ly8gT3IgdGhlIGFjdGl2ZSBlbnRpdHkgb3RoZXJ3aXNlXG5cdFx0Y29uc3QgZHJhZnRGaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHRcdGZpbHRlcnMucHVzaChkcmFmdEZpbHRlcik7XG5cblx0XHRyZXR1cm4gbmV3IEZpbHRlcihmaWx0ZXJzLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIHBhdGggd2l0aCBzZW1hbnRpYyBrZXlzIHRvIGEgcGF0aCB3aXRoIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aFdpdGhQYXJhbWV0ZXJzIFRoZSBwYXRoIHdpdGggc2VtYW50aWMga2V5c1xuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIGZvciB0aGUgcGF0aFxuXHQgKiBAcGFyYW0ga2V5cyBUaGUgc2VtYW50aWMgb3IgdGVjaG5pY2FsIGtleXMgZm9yIHRoZSBwYXRoXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBjb250YWluaW5nIHRoZSBwYXRoIHdpdGggdGVjaG5pY2FsIGtleXMgaWYgcGF0aFdpdGhQYXJhbWV0ZXJzIGNvdWxkIGJlIGludGVycHJldGVkIGFzIGEgdGVjaG5pY2FsIHBhdGgsIG51bGwgb3RoZXJ3aXNlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgZ2V0VGVjaG5pY2FsUGF0aEZyb21QYXRoKHBhdGhXaXRoUGFyYW1ldGVyczogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCwga2V5czogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgZW50aXR5U2V0UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXRoV2l0aFBhcmFtZXRlcnMpLmdldFBhdGgoKTtcblxuXHRcdGlmICgha2V5cyB8fCBrZXlzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gc2VtYW50aWMvdGVjaG5pY2FsIGtleXNcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHNldCBvZiBmaWx0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIGtleXNcblx0XHRjb25zdCBmaWx0ZXIgPSB0aGlzLmNyZWF0ZUZpbHRlckZyb21QYXRoKHBhdGhXaXRoUGFyYW1ldGVycywga2V5cywgbWV0YU1vZGVsKTtcblx0XHRpZiAoZmlsdGVyID09PSBudWxsKSB7XG5cdFx0XHQvLyBDb3VsZG4ndCBpbnRlcnByZXQgdGhlIHBhdGggYXMgYSBzZW1hbnRpYyBvbmVcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdC8vIExvYWQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0XG5cdFx0aWYgKCFlbnRpdHlTZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0ZW50aXR5U2V0UGF0aCA9IGAvJHtlbnRpdHlTZXRQYXRofWA7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QoZW50aXR5U2V0UGF0aCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZpbHRlciwge1xuXHRcdFx0JCRncm91cElkOiBcIiRhdXRvLkhlcm9lc1wiXG5cdFx0fSk7XG5cblx0XHRjb25zdCBjb250ZXh0cyA9IGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCAyKTtcblx0XHRpZiAoY29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dHNbMF0uZ2V0UGF0aCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBObyBkYXRhIGNvdWxkIGJlIGxvYWRlZFxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlZnJlc2hlcyBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIHBhdGhUb1JlcGxhY2VXaXRoIFRoZSBwYXRoIHRvIHRoZSBuZXcgY29udGV4dFxuXHQgKiBAcGFyYW0gY29udGV4dFRvUmVtb3ZlIFRoZSBpbml0aWFsIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSByZXBsYWNlZFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgcmVmcmVzaENvbnRleHQobW9kZWw6IE9EYXRhTW9kZWwsIHBhdGhUb1JlcGxhY2VXaXRoOiBzdHJpbmcsIGNvbnRleHRUb1JlbW92ZTogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX29BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0aWYgKHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3QgY29udGV4dFRvUmVwbGFjZVdpdGggPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KHBhdGhUb1JlcGxhY2VXaXRoKTtcblx0XHRcdGNvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChjb250ZXh0VG9SZXBsYWNlV2l0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBwYXRoIGlzIGEgcm9vdCBkcmFmdC5cblx0ICpcblx0ICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGVzdFxuXHQgKiBAcGFyYW0gbWV0YU1vZGVsIFRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBhIHJvb3QgcGF0aFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGNoZWNrRHJhZnRBdmFpbGFiaWxpdHkocGF0aDogc3RyaW5nLCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWF0Y2hlcyA9IC9eWy9dPyhcXHcrKVxcKFteL10rXFwpJC8uZXhlYyhwYXRoKTtcblx0XHRpZiAoIW1hdGNoZXMpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gR2V0IHRoZSBlbnRpdHlTZXQgbmFtZVxuXHRcdGNvbnN0IGVudGl0eVNldFBhdGggPSBgLyR7bWF0Y2hlc1sxXX1gO1xuXHRcdC8vIENoZWNrIHRoZSBlbnRpdHkgc2V0IHN1cHBvcnRzIGRyYWZ0XG5cdFx0Y29uc3QgZHJhZnRSb290ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHtlbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290YCk7XG5cdFx0cmV0dXJuIGRyYWZ0Um9vdCA/IHRydWUgOiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYSBwYXRoIHRvIG5hdmlnYXRlIHRvIGZyb20gYSBwYXRoIHdpdGggU2VtYW50aWNLZXlzIG9yIHRlY2huaWNhbCBrZXlzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aFRvUmVzb2x2ZSBUaGUgcGF0aCB0byBiZSB0cmFuc2Zvcm1lZFxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVyIFRoZSBwYXJhbWV0ZXIgb2YgdGhlIG5hdmlnYXRpb25cblx0ICogQHJldHVybnMgU3RyaW5nIHByb21pc2UgZm9yIHRoZSBuZXcgcGF0aC4gSWYgcGF0aFRvUmVzb2x2ZSBjb3VsZG4ndCBiZSBpbnRlcnByZXRlZCBhcyBhIHNlbWFudGljIHBhdGgsIGl0IGlzIHJldHVybmVkIGFzIGlzLlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIHJlc29sdmVQYXRoKHBhdGhUb1Jlc29sdmU6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwsIG5hdmlnYXRpb25QYXJhbWV0ZXI6IFJvdXRpbmdOYXZpZ2F0aW9uSW5mbyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX29Sb3V0aW5nU2VydmljZS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0bGV0IGN1cnJlbnRIYXNoTm9QYXJhbXMgPSB0aGlzLl9vUm91dGVyLmdldEhhc2hDaGFuZ2VyKCkuZ2V0SGFzaCgpLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGlmIChjdXJyZW50SGFzaE5vUGFyYW1zPy5sYXN0SW5kZXhPZihcIi9cIikgPT09IGN1cnJlbnRIYXNoTm9QYXJhbXM/Lmxlbmd0aCAtIDEpIHtcblx0XHRcdC8vIFJlbW92ZSB0cmFpbGluZyAnLydcblx0XHRcdGN1cnJlbnRIYXNoTm9QYXJhbXMgPSBjdXJyZW50SGFzaE5vUGFyYW1zLnN1YnN0cmluZygwLCBjdXJyZW50SGFzaE5vUGFyYW1zLmxlbmd0aCAtIDEpO1xuXHRcdH1cblxuXHRcdGxldCByb290RW50aXR5TmFtZSA9IGN1cnJlbnRIYXNoTm9QYXJhbXM/LnN1YnN0cigwLCBjdXJyZW50SGFzaE5vUGFyYW1zLmluZGV4T2YoXCIoXCIpKTtcblx0XHRpZiAocm9vdEVudGl0eU5hbWUuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdHJvb3RFbnRpdHlOYW1lID0gcm9vdEVudGl0eU5hbWUuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBpc1Jvb3REcmFmdCA9IHRoaXMuY2hlY2tEcmFmdEF2YWlsYWJpbGl0eShjdXJyZW50SGFzaE5vUGFyYW1zLCBtZXRhTW9kZWwpLFxuXHRcdFx0c2VtYW50aWNLZXlzID0gaXNSb290RHJhZnRcblx0XHRcdFx0PyAoU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG1ldGFNb2RlbCwgcm9vdEVudGl0eU5hbWUpIGFzIHsgJFByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSlcblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0XHRpc0NvbGxhYm9yYXRpb25FbmFibGVkID0gTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsKTtcblxuXHRcdC8qKlxuXHRcdCAqIElmIHRoZSBlbnRpdHkgaXMgZHJhZnQgZW5hYmxlZCwgYW5kIHdlJ3JlIGluIGEgY29sbGFib3JhdGlvbiBhcHBsaWNhdGlvbiwgYW5kIHdlJ3JlIG5hdmlnYXRpbmcgdG8gYSBkcmFmdCwgd2UncmUgdHJlYXRpbmcgaXQgYXMgYSBuZXcgcGF0aC5cblx0XHQgKiBXZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBkcmFmdCBleGlzdHMgZmlyc3QsIHRoZW4gd2UgbmF2aWdhdGUgb24gaXQgaWYgaXQgZG9lcyBleGlzdCwgb3RoZXJ3aXNlIHdlIG5hdmlnYXRlIHRvIHRoZSBzYXZlZCB2ZXJzaW9uLlxuXHRcdCAqL1xuXHRcdGlmIChpc1Jvb3REcmFmdCAmJiBpc0NvbGxhYm9yYXRpb25FbmFibGVkKSB7XG5cdFx0XHRjb25zdCBpc0FjdGl2ZUVudGl0eSA9IG5hdmlnYXRpb25QYXJhbWV0ZXI/LnVzZUNvbnRleHQ/LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPz8gdHJ1ZTtcblx0XHRcdGlmICghaXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVzb2x2ZUNvbGxhYm9yYXRpb25QYXRoKHBhdGhUb1Jlc29sdmUsIG1vZGVsLCBuYXZpZ2F0aW9uUGFyYW1ldGVyLCBzZW1hbnRpY0tleXMsIHJvb3RFbnRpdHlOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0LyoqXG5cdFx0ICogVGhpcyBpcyB0aGUgJ25vcm1hbCcgcHJvY2Vzcy5cblx0XHQgKiBJZiB3ZSBkb24ndCBoYXZlIHNlbWFudGljIGtleXMsIHRoZSBwYXRoIHdlIGhhdmUgaXMgdGVjaG5pY2FsIGFuZCBjYW4gYmUgdXNlZCBhcyBpcy5cblx0XHQgKiBJZiB0aGUgcGF0aCB0byByZXNvbHZlIGlzIHRoZSBzYW1lIGFzIHRoZSBzZW1hbnRpYyBwYXRoLCB0aGVuIHdlIGtub3cgaXMgaGFzIGJlZW4gcmVzb2x2ZWQgcHJldmlvdXNseSBhbmQgd2UgY2FuIHJldHVybiB0aGUgdGVjaG5pY2FsIHBhdGhcblx0XHQgKiBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZXZhbHVhdGUgdGhlIHRlY2huaWNhbCBwYXRoLCB0byBzZXQgdXAgdGhlIHNlbWFudGljIG1hcHBpbmcgKGlmIGl0J3MgYmVlbiByZXNvbHZlZCkuXG5cdFx0ICovXG5cdFx0aWYgKHNlbWFudGljS2V5cyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcGF0aFRvUmVzb2x2ZTtcblx0XHR9XG5cdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCA9PT0gcGF0aFRvUmVzb2x2ZSkge1xuXHRcdFx0Ly8gVGhpcyBzZW1hbnRpYyBwYXRoIGhhcyBiZWVuIHJlc29sdmVkIHByZXZpb3VzbHlcblx0XHRcdHJldHVybiBsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IGZvcm1hdHRlZFNlbWFudGljS2V5cyA9IHNlbWFudGljS2V5cy5tYXAoKHNpbmdsZUtleSkgPT4gc2luZ2xlS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXG5cdFx0Ly8gV2UgbmVlZCByZXNvbHZlIHRoZSBzZW1hbnRpYyBwYXRoIHRvIGdldCB0aGUgdGVjaG5pY2FsIGtleXNcblx0XHRjb25zdCB0ZWNobmljYWxQYXRoID0gYXdhaXQgdGhpcy5nZXRUZWNobmljYWxQYXRoRnJvbVBhdGgoY3VycmVudEhhc2hOb1BhcmFtcywgbW9kZWwsIGZvcm1hdHRlZFNlbWFudGljS2V5cyk7XG5cblx0XHRpZiAodGVjaG5pY2FsUGF0aCAmJiB0ZWNobmljYWxQYXRoICE9PSBwYXRoVG9SZXNvbHZlKSB7XG5cdFx0XHQvLyBUaGUgc2VtYW50aWMgcGF0aCB3YXMgcmVzb2x2ZWQgKG90aGVyd2lzZSBrZWVwIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGFyZ2V0KVxuXHRcdFx0dGhpcy5fb1JvdXRpbmdTZXJ2aWNlLnNldExhc3RTZW1hbnRpY01hcHBpbmcoe1xuXHRcdFx0XHR0ZWNobmljYWxQYXRoOiB0ZWNobmljYWxQYXRoLFxuXHRcdFx0XHRzZW1hbnRpY1BhdGg6IHBhdGhUb1Jlc29sdmVcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRlY2huaWNhbFBhdGg7XG5cdFx0fVxuXHRcdHJldHVybiBwYXRoVG9SZXNvbHZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlIHRoZSBwYXRoIHRvIG5hdmlnYXRlIHdoZW4gd2UncmUgaW4gYSBjb2xsYWJvcmF0aW9uIGFwcGxpY2F0aW9uIGFuZCBuYXZpZ2F0aW5nIHRvIGEgZHJhZnQuXG5cdCAqIElmIHRoZSBkcmFmdCBoYXMgYmVlbiBkaXNjYXJkZWQsIHdlIGNoYW5nZSB0aGUgcGF0aCB0byB0aGUgc2libGluZyBlbGVtZW50IGFzc29jaWF0ZWQsIG90aGVyd2lzZSB3ZSBrZWVwIHRoZSBzYW1lIHBhdGguXG5cdCAqIFdlJ3JlIG5vdCBkb2luZyBpdCBvdXRzaWRlIG9mIGNvbGxhYm9yYXRpb24gYXMgaXQncyBhZGRpbmcgYSByZXF1ZXN0IGR1cmluZyBuYXZpZ2F0aW9uIVxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aFRvUmVzb2x2ZSBUaGUgcGF0aCB3ZSdyZSBjaGVja2luZy4gSWYgdGhlIGRyYWZ0IGV4aXN0cywgd2UgcmV0dXJuIGl0IGFzIGlzLCBvdGhlcndpc2Ugd2UgcmV0dXJuIHRoZSBzaWJsaW5nIGVsZW1lbnQgYXNzb2NpYXRlZFxuXHQgKiBAcGFyYW0gbW9kZWwgVGhlIG9EYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUGFyYW1ldGVyIFRoZSBwYXJhbWV0ZXIgb2YgdGhlIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHNlbWFudGljS2V5cyBUaGUgc2VtYW50aWMga2V5cyBpZiB3ZSBoYXZlIHNlbWFudGljIG5hdmlnYXRpb24sIG90aGVyd2lzZSBmYWxzZVxuXHQgKiBAcGFyYW0gcm9vdEVudGl0eU5hbWUgTmFtZSBvZiB0aGUgcm9vdCBlbnRpdHlcblx0ICogQHJldHVybnMgVGhlIHBhdGggdG8gbmF2aWdhdGUgdG9cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIHJlc29sdmVDb2xsYWJvcmF0aW9uUGF0aChcblx0XHRwYXRoVG9SZXNvbHZlOiBzdHJpbmcsXG5cdFx0bW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0bmF2aWdhdGlvblBhcmFtZXRlcjogUm91dGluZ05hdmlnYXRpb25JbmZvLFxuXHRcdHNlbWFudGljS2V5czogeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkLFxuXHRcdHJvb3RFbnRpdHlOYW1lOiBzdHJpbmdcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fb1JvdXRpbmdTZXJ2aWNlLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBjdXJyZW50SGFzaE5vUGFyYW1zID0gdGhpcy5fb1JvdXRlci5nZXRIYXNoQ2hhbmdlcigpLmdldEhhc2goKS5zcGxpdChcIj9cIilbMF07XG5cdFx0bGV0IGZvcm1hdHRlZEtleXM6IHN0cmluZ1tdO1xuXHRcdGNvbnN0IGNvbXBhcmF0aXZlUGF0aCA9IGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPz8gcGF0aFRvUmVzb2x2ZTtcblx0XHRpZiAoc2VtYW50aWNLZXlzKSB7XG5cdFx0XHRmb3JtYXR0ZWRLZXlzID0gc2VtYW50aWNLZXlzLm1hcCgoc2luZ2xlS2V5KSA9PiBzaW5nbGVLZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvcm1hdHRlZEtleXMgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtyb290RW50aXR5TmFtZX0vJFR5cGUvJEtleWApO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRlY2huaWNhbFBhdGggPSBhd2FpdCB0aGlzLmdldFRlY2huaWNhbFBhdGhGcm9tUGF0aChjdXJyZW50SGFzaE5vUGFyYW1zLCBtb2RlbCwgZm9ybWF0dGVkS2V5cyk7XG5cdFx0aWYgKHRlY2huaWNhbFBhdGggPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBwYXRoVG9SZXNvbHZlO1xuXHRcdH1cblx0XHQvLyBDb21wYXJpbmcgcGF0aCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgb25lIHdlIGhhdmUuIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgaXQgbWVhbnMgdGhlIGRyYWZ0IGRvZXNuJ3QgZXhpc3QuXG5cdFx0aWYgKHRlY2huaWNhbFBhdGggIT09IGNvbXBhcmF0aXZlUGF0aCAmJiBuYXZpZ2F0aW9uUGFyYW1ldGVyLnVzZUNvbnRleHQpIHtcblx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nKSB7XG5cdFx0XHRcdHRoaXMuX29Sb3V0aW5nU2VydmljZS5zZXRMYXN0U2VtYW50aWNNYXBwaW5nKHtcblx0XHRcdFx0XHR0ZWNobmljYWxQYXRoOiB0ZWNobmljYWxQYXRoLFxuXHRcdFx0XHRcdHNlbWFudGljUGF0aDogcGF0aFRvUmVzb2x2ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdG5hdmlnYXRpb25QYXJhbWV0ZXIucmVkaXJlY3RlZFRvTm9uRHJhZnQgPVxuXHRcdFx0XHRtZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtyb290RW50aXR5TmFtZX0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckluZm9gKT8uVHlwZU5hbWUgPz8gcm9vdEVudGl0eU5hbWU7XG5cdFx0XHRhd2FpdCB0aGlzLnJlZnJlc2hDb250ZXh0KG1vZGVsLCB0ZWNobmljYWxQYXRoLCBuYXZpZ2F0aW9uUGFyYW1ldGVyLnVzZUNvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGVjaG5pY2FsUGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgZnJvbSBhIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzVGFyZ2V0UGF0aCBUaGUgcGF0aCB0byBidWlsZCB0aGUgY29udGV4dC4gTmVlZHMgdG8gY29udGFpbiB0ZWNobmljYWwga2V5cyBvbmx5LlxuXHQgKiBAcGFyYW0gb01vZGVsIFRoZSBPRGF0YSBtb2RlbFxuXHQgKiBAcGFyYW0gb05hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVyc1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9iaW5kUGFnZVRvUGF0aChzVGFyZ2V0UGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKSB7XG5cdFx0Y29uc3Qgb0N1cnJlbnRDb250ZXh0ID0gdGhpcy5fZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdHNDdXJyZW50UGF0aCA9IG9DdXJyZW50Q29udGV4dCAmJiBvQ3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0b1VzZUNvbnRleHQgPSBvTmF2aWdhdGlvblBhcmFtZXRlcnMudXNlQ29udGV4dCBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuXHRcdC8vIFdlIHNldCB0aGUgYmluZGluZyBjb250ZXh0IG9ubHkgaWYgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBvbmVcblx0XHQvLyBvciBpZiB3ZSBoYXZlIGEgY29udGV4dCBhbHJlYWR5IHNlbGVjdGVkXG5cdFx0aWYgKG9Vc2VDb250ZXh0ICYmIG9Vc2VDb250ZXh0LmdldFBhdGgoKSA9PT0gc1RhcmdldFBhdGgpIHtcblx0XHRcdGlmIChvVXNlQ29udGV4dCAhPT0gb0N1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGxldCBzaG91bGRSZWZyZXNoQ29udGV4dCA9IGZhbHNlO1xuXHRcdFx0XHQvLyBXZSBhbHJlYWR5IGhhdmUgdGhlIGNvbnRleHQgdG8gYmUgdXNlZCwgYW5kIGl0J3Mgbm90IHRoZSBjdXJyZW50IG9uZVxuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIEZDTCwgaWYgd2UncmUgcmV1c2luZyBhIGNvbnRleHQgZnJvbSBhIHRhYmxlICh0aHJvdWdoIG5hdmlnYXRpb24pLCB3ZSByZWZyZXNoIGl0IHRvIGF2b2lkIG91dGRhdGVkIGRhdGFcblx0XHRcdFx0Ly8gV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHJlZnJlc2ggdG8gYmUgY29tcGxldGVkIChyZXF1ZXN0UmVmcmVzaCksIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgcXVlcnkgZ29lcyBpbnRvIHRoZSBzYW1lXG5cdFx0XHRcdC8vIGJhdGNoIGFzIHRoZSBvbmVzIGZyb20gY29udHJvbHMgaW4gdGhlIHBhZ2UuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpICYmIG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWFzb24gPT09IE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3MpIHtcblx0XHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvVXNlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdGlmICghb1VzZUNvbnRleHQuZ2V0QmluZGluZygpLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0QWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKSB8fFxuXHRcdFx0XHRcdFx0KE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQobWV0YU1vZGVsLCBvVXNlQ29udGV4dC5nZXRQYXRoKCkpICYmXG5cdFx0XHRcdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1ldGFNb2RlbCkpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGJ1dCB3ZSdyZSBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0LCB3ZSBmb3JjZSB0aGUgcmVmcmVzaCAoZGlzY2FyZGluZyBwZW5kaW5nIGNoYW5nZXMpIGFzIHdlIG5lZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24uXG5cdFx0XHRcdFx0XHQvLyBXaGVuIG5hdmlnYXRpbmcgZnJvbSBMUiB0byBPUCwgdGhlIHZpZXcgaXMgbm90IGNvbm5lY3RlZCB5ZXQgLS0+IGNoZWNrIGlmIHdlJ3JlIGluIGRyYWZ0IHdpdGggY29sbGFib3JhdGlvbiBmcm9tIHRoZSBtZXRhbW9kZWxcblx0XHRcdFx0XHRcdG9Vc2VDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdHNob3VsZFJlZnJlc2hDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQob1VzZUNvbnRleHQsIG9Nb2RlbCwgb05hdmlnYXRpb25QYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKHNob3VsZFJlZnJlc2hDb250ZXh0KSB7XG5cdFx0XHRcdFx0b1VzZUNvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzQ3VycmVudFBhdGggIT09IHNUYXJnZXRQYXRoKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb250ZXh0IGZvciBpdHMgcGF0aFxuXHRcdFx0dGhpcy5fYmluZFBhZ2VUb0NvbnRleHQodGhpcy5fY3JlYXRlQ29udGV4dChzVGFyZ2V0UGF0aCwgb01vZGVsKSwgb01vZGVsLCBvTmF2aWdhdGlvblBhcmFtZXRlcnMpO1xuXHRcdH0gZWxzZSBpZiAob05hdmlnYXRpb25QYXJhbWV0ZXJzLnJlYXNvbiAhPT0gTmF2aWdhdGlvblJlYXNvbi5BcHBTdGF0ZUNoYW5nZWQgJiYgRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0dGhpcy5fcmVmcmVzaEJpbmRpbmdDb250ZXh0KG9DdXJyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJpbmRzIHRoZSBwYWdlIHRvIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgdG8gYmUgYm91bmRcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHBhcmFtIG9OYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfYmluZFBhZ2VUb0NvbnRleHQob0NvbnRleHQ6IENvbnRleHQgfCBudWxsLCBvTW9kZWw6IE9EYXRhTW9kZWwsIG9OYXZpZ2F0aW9uUGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25JbmZvKSB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcobnVsbCk7XG5cdFx0XHR0aGlzLm9uQWZ0ZXJCaW5kaW5nKG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9QYXJlbnRMaXN0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0aWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgIW9QYXJlbnRMaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHQvLyBpZiB0aGUgcGFyZW50QmluZGluZyBpcyBub3QgYSBsaXN0QmluZGluZywgd2UgY3JlYXRlIGEgbmV3IGNvbnRleHRcblx0XHRcdFx0b0NvbnRleHQgPSB0aGlzLl9jcmVhdGVDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSwgb01vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5fc2V0S2VlcEFsaXZlKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNDb250ZXh0VXNlZEluUGFnZXMob0NvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHJ1ZSAvLyBMb2FkIG1lc3NhZ2VzLCBvdGhlcndpc2UgdGhleSBkb24ndCBnZXQgcmVmcmVzaGVkIGxhdGVyLCBlLmcuIGZvciBzaWRlIGVmZmVjdHNcblx0XHRcdFx0KTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHQvLyBzZXRLZWVwQWxpdmUgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyZW50IGxpc3RiaW5kaW5nIGRvZXNuJ3QgaGF2ZSAkJG93blJlcXVlc3Q9dHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIGNhc2UgZm9yIGN1c3RvbSBmcmFnbWVudHMgaXMgc3VwcG9ydGVkLCBidXQgYW4gZXJyb3IgaXMgbG9nZ2VkIHRvIG1ha2UgdGhlIGxhY2sgb2Ygc3luY2hyb25pemF0aW9uIGFwcGFyZW50XG5cdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRgVmlldyBmb3IgJHtvQ29udGV4dC5nZXRQYXRoKCl9IHdvbid0IGJlIHN5bmNocm9uaXplZC4gUGFyZW50IGxpc3RCaW5kaW5nIG11c3QgaGF2ZSBiaW5kaW5nIHBhcmFtZXRlciAkJG93blJlcXVlc3Q9dHJ1ZWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCFvUGFyZW50TGlzdEJpbmRpbmcgfHwgb1BhcmVudExpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBjb250ZXh0IG90aGVyd2lzZSB3ZSBnZXQgZXJyb3JzXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuX2NyZWF0ZUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpLCBvTW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggdGhlIHByb3BlciBiZWZvcmUvYWZ0ZXIgY2FsbGJhY2tzXG5cdFx0dGhpcy5vbkJlZm9yZUJpbmRpbmcob0NvbnRleHQsIHtcblx0XHRcdGVkaXRhYmxlOiBvTmF2aWdhdGlvblBhcmFtZXRlcnMuYlRhcmdldEVkaXRhYmxlLFxuXHRcdFx0bGlzdEJpbmRpbmc6IG9QYXJlbnRMaXN0QmluZGluZyxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsLFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogb05hdmlnYXRpb25QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IG9OYXZpZ2F0aW9uUGFyYW1ldGVycy5iU2hvd1BsYWNlaG9sZGVyXG5cdFx0fSk7XG5cblx0XHR0aGlzLl9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dCk7XG5cdFx0dGhpcy5vbkFmdGVyQmluZGluZyhvQ29udGV4dCwgeyByZWRpcmVjdGVkVG9Ob25EcmFmdDogb05hdmlnYXRpb25QYXJhbWV0ZXJzPy5yZWRpcmVjdGVkVG9Ob25EcmFmdCB9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgY29udGV4dCBmcm9tIGEgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHNQYXRoIFRoZSBwYXRoXG5cdCAqIEBwYXJhbSBvTW9kZWwgVGhlIE9EYXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqL1xuXHRfY3JlYXRlQ29udGV4dChzUGF0aDogc3RyaW5nLCBvTW9kZWw6IE9EYXRhTW9kZWwpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LFxuXHRcdFx0c0VudGl0eVNldCA9IG9QYWdlQ29tcG9uZW50ICYmIG9QYWdlQ29tcG9uZW50LmdldEVudGl0eVNldCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQoKSxcblx0XHRcdHNDb250ZXh0UGF0aCA9XG5cdFx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uSGVyb2VzXCIsXG5cdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiLFxuXHRcdFx0XHQkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlXG5cdFx0XHR9O1xuXHRcdC8vIEluIGNhc2Ugb2YgZHJhZnQ6ICRzZWxlY3QgdGhlIHN0YXRlIGZsYWdzIChIYXNBY3RpdmVFbnRpdHksIEhhc0RyYWZ0RW50aXR5LCBhbmQgSXNBY3RpdmVFbnRpdHkpXG5cdFx0Y29uc3Qgb0RyYWZ0Um9vdCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDb250ZXh0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdGApO1xuXHRcdGNvbnN0IG9EcmFmdE5vZGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzQ29udGV4dFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVgKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9nZXRLZWVwQWxpdmVDb250ZXh0KG9Nb2RlbCwgc1BhdGgsIGZhbHNlLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBrZWVwQWxpdmUgY29udGV4dCAke3NQYXRofWApO1xuXHRcdFx0fSBlbHNlIGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG9Db250ZXh0LnJlcXVlc3RQcm9wZXJ0eShbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdKTtcblx0XHRcdFx0XHRpZiAob0RyYWZ0Um9vdCkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQucmVxdWVzdE9iamVjdChcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRyYWZ0IGFuZCBlZGl0IHdlIG5lZWQgdG8gZW5zdXJlIHRob3NlIHByb3BlcnRpZXMgYXJlIHJlcXVlc3RlZCBhZ2FpbiBldmVuIGlmIHRoZXkgYXJlIGluIHRoZSBiaW5kaW5nJ3MgY2FjaGVcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2hlbiB5b3UgZWRpdCBhbmQgZ28gdG8gdGhlIHNhdmVkIHZlcnNpb24geW91IGhhdmUgbm8gd2F5IG9mIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBlZGl0IHZlcnNpb25cblx0XHRcdFx0XHRvQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRvRHJhZnRSb290XG5cdFx0XHRcdFx0XHRcdD8gW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiLCBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdXG5cdFx0XHRcdFx0XHRcdDogW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSGFzRHJhZnRFbnRpdHlcIiwgXCJJc0FjdGl2ZUVudGl0eVwiXVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoc0VudGl0eVNldCkge1xuXHRcdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0XHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuJHNlbGVjdCA9IHNNZXNzYWdlc1BhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkcmFmdDogJHNlbGVjdCB0aGUgc3RhdGUgZmxhZ3MgKEhhc0FjdGl2ZUVudGl0eSwgSGFzRHJhZnRFbnRpdHksIGFuZCBJc0FjdGl2ZUVudGl0eSlcblx0XHRcdGlmIChvRHJhZnRSb290IHx8IG9EcmFmdE5vZGUpIHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLiRzZWxlY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgPSBcIkhhc0FjdGl2ZUVudGl0eSxIYXNEcmFmdEVudGl0eSxJc0FjdGl2ZUVudGl0eVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLiRzZWxlY3QgKz0gXCIsSGFzQWN0aXZlRW50aXR5LEhhc0RyYWZ0RW50aXR5LElzQWN0aXZlRW50aXR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9QcmV2aW91c0JpbmRpbmcgPSAodGhpcy5fb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBhbnkpPy5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdG9QcmV2aW91c0JpbmRpbmdcblx0XHRcdFx0XHQ/LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0b1ByZXZpb3VzQmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXNldGluZyB0aGUgY2hhbmdlcyB0byB0aGUgYmluZGluZ1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvSGlkZGVuQmluZGluZyA9IG9Nb2RlbC5iaW5kQ29udGV4dChzUGF0aCwgdW5kZWZpbmVkLCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdG9IaWRkZW5CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhpcy5fb1ZpZXcpO1xuXHRcdFx0fSk7XG5cdFx0XHRvSGlkZGVuQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgdGhpcy5vbkRhdGFSZWNlaXZlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHJldHVybiBvSGlkZGVuQmluZGluZy5nZXRCb3VuZENvbnRleHQoKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0YXN5bmMgb25EYXRhUmVjZWl2ZWQob0V2ZW50OiBFdmVudCkge1xuXHRcdGNvbnN0IHNFcnJvckRlc2NyaXB0aW9uID0gb0V2ZW50ICYmIG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJlcnJvclwiKTtcblx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZCh0aGlzLl9vVmlldykpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuX29WaWV3KTtcblx0XHR9XG5cblx0XHRpZiAoc0Vycm9yRGVzY3JpcHRpb24pIHtcblx0XHRcdC8vIFRPRE86IGluIGNhc2Ugb2YgNDA0IHRoZSB0ZXh0IHNoYWxsIGJlIGRpZmZlcmVudFxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gYXdhaXQgQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0XHRcdGxldCBtUGFyYW1zID0ge307XG5cdFx0XHRcdGlmIChzRXJyb3JEZXNjcmlwdGlvbi5zdGF0dXMgPT09IDUwMykge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHRpc0luaXRpYWxMb2FkNTAzRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNFcnJvckRlc2NyaXB0aW9uLnN0YXR1cyA9PT0gNDAwKSB7XG5cdFx0XHRcdFx0bVBhcmFtcyA9IHtcblx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfREFUQV9SRUNFSVZFRF9FUlJPUl9ERVNDUklQVElPTlwiKSxcblx0XHRcdFx0XHRcdGlzRGF0YVJlY2VpdmVkRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1QYXJhbXMgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzRXJyb3JEZXNjcmlwdGlvbixcblx0XHRcdFx0XHRcdGlzRGF0YVJlY2VpdmVkRXJyb3I6IHRydWUsXG5cdFx0XHRcdFx0XHRzaGVsbEJhY2s6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyhtUGFyYW1zKTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdldHRpbmcgdGhlIGNvcmUgcmVzb3VyY2UgYnVuZGxlXCIsIG9FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHNpZGUgZWZmZWN0cyBvbiBhIGJpbmRpbmcgY29udGV4dCB0byBcInJlZnJlc2hcIiBpdC5cblx0ICogVE9ETzogZ2V0IHJpZCBvZiB0aGlzIG9uY2UgcHJvdmlkZWQgYnkgdGhlIG1vZGVsXG5cdCAqIGEgcmVmcmVzaCBvbiB0aGUgYmluZGluZyBjb250ZXh0IGRvZXMgbm90IHdvcmsgaW4gY2FzZSBhIGNyZWF0aW9uIHJvdyB3aXRoIGEgdHJhbnNpZW50IGNvbnRleHQgaXNcblx0ICogdXNlZC4gYWxzbyBhIHJlcXVlc3RTaWRlRWZmZWN0cyB3aXRoIGFuIGVtcHR5IHBhdGggd291bGQgZmFpbCBkdWUgdG8gdGhlIHRyYW5zaWVudCBjb250ZXh0XG5cdCAqIHRoZXJlZm9yZSB3ZSBnZXQgYWxsIGRlcGVuZGVudCBiaW5kaW5ncyAodmlhIHByaXZhdGUgbW9kZWwgbWV0aG9kKSB0byBkZXRlcm1pbmUgYWxsIHBhdGhzIGFuZCB0aGVuXG5cdCAqIHJlcXVlc3QgdGhlbS5cblx0ICpcblx0ICogQHBhcmFtIG9CaW5kaW5nQ29udGV4dCBDb250ZXh0IHRvIGJlIHJlZnJlc2hlZFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9yZWZyZXNoQmluZGluZ0NvbnRleHQob0JpbmRpbmdDb250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvUGFnZUNvbXBvbmVudCA9IHRoaXMuX29QYWdlQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0c1NlcnZpY2UgPSB0aGlzLl9vQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdGNvbnN0IHNSb290Q29udGV4dFBhdGggPSBvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRFbnRpdHlTZXQgJiYgb1BhZ2VDb21wb25lbnQuZ2V0RW50aXR5U2V0KCk7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoID1cblx0XHRcdChvUGFnZUNvbXBvbmVudCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCAmJiBvUGFnZUNvbXBvbmVudC5nZXRDb250ZXh0UGF0aCgpKSB8fCAoc0VudGl0eVNldCAmJiBgLyR7c0VudGl0eVNldH1gKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gdGhpcy5fb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc01lc3NhZ2VzUGF0aDtcblx0XHRjb25zdCBhTmF2aWdhdGlvblByb3BlcnR5UGF0aHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVByb3BlcnR5UGF0aHM6IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBbXVxuXHRcdH07XG5cblx0XHRmdW5jdGlvbiBnZXRCaW5kaW5nUGF0aHMob0JpbmRpbmc6IGFueSkge1xuXHRcdFx0bGV0IGFEZXBlbmRlbnRCaW5kaW5ncztcblx0XHRcdGNvbnN0IHNSZWxhdGl2ZVBhdGggPSAoKG9CaW5kaW5nLmdldENvbnRleHQoKSAmJiBvQmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKSB8fCBcIlwiKS5yZXBsYWNlKHNSb290Q29udGV4dFBhdGgsIFwiXCIpOyAvLyBJZiBubyBjb250ZXh0LCB0aGlzIGlzIGFuIGFic29sdXRlIGJpbmRpbmcgc28gbm8gcmVsYXRpdmUgcGF0aFxuXHRcdFx0Y29uc3Qgc1BhdGggPSAoc1JlbGF0aXZlUGF0aCA/IGAke3NSZWxhdGl2ZVBhdGguc2xpY2UoMSl9L2AgOiBzUmVsYXRpdmVQYXRoKSArIG9CaW5kaW5nLmdldFBhdGgoKTtcblxuXHRcdFx0aWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdC8vIGlmIChzUGF0aCA9PT0gXCJcIikge1xuXHRcdFx0XHQvLyBub3cgZ2V0IHRoZSBkZXBlbmRlbnQgYmluZGluZ3Ncblx0XHRcdFx0YURlcGVuZGVudEJpbmRpbmdzID0gb0JpbmRpbmcuZ2V0RGVwZW5kZW50QmluZGluZ3MoKTtcblx0XHRcdFx0aWYgKGFEZXBlbmRlbnRCaW5kaW5ncykge1xuXHRcdFx0XHRcdC8vIGFzayB0aGUgZGVwZW5kZW50IGJpbmRpbmdzIChhbmQgb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXBJZFxuXHRcdFx0XHRcdC8vaWYgKGFEZXBlbmRlbnRCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwZW5kZW50QmluZGluZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdQYXRocyhhRGVwZW5kZW50QmluZGluZ3NbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdGlmIChhTmF2aWdhdGlvblByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzLnB1c2goc1BhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YVByb3BlcnR5QmluZGluZ1wiKSkge1xuXHRcdFx0XHRpZiAoYVByb3BlcnR5UGF0aHMuaW5kZXhPZihzUGF0aCkgPT09IC0xKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5UGF0aHMucHVzaChzUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoc0NvbnRleHRQYXRoKSB7XG5cdFx0XHRzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0NvbnRleHRQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0fVxuXG5cdFx0Ly8gYmluZGluZyBvZiB0aGUgY29udGV4dCBtdXN0IGhhdmUgJCRQYXRjaFdpdGhvdXRTaWRlRWZmZWN0cyB0cnVlLCB0aGlzIGJvdW5kIGNvbnRleHQgbWF5IGJlIG5lZWRlZCB0byBiZSBmZXRjaGVkIGZyb20gdGhlIGRlcGVuZGVudCBiaW5kaW5nXG5cdFx0Z2V0QmluZGluZ1BhdGhzKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpO1xuXG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFOYXZpZ2F0aW9uUHJvcGVydHlQYXRocy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzLnB1c2goe1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogYU5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhzW2ldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydHlQYXRocztcblx0XHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdFx0b1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMucHVzaChzTWVzc2FnZXNQYXRoKTtcblx0XHR9XG5cdFx0Ly9hbGwgdGhpcyBsb2dpYyB0byBiZSByZXBsYWNlZCB3aXRoIGEgU2lkZUVmZmVjdHMgcmVxdWVzdCBmb3IgYW4gZW1wdHkgcGF0aCAocmVmcmVzaCBldmVyeXRoaW5nKSwgYWZ0ZXIgdGVzdGluZyB0cmFuc2llbnQgY29udGV4dHNcblx0XHRvU2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyA9IG9TaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0czogc3RyaW5nW10sIHRhcmdldFByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAodGFyZ2V0UHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB0YXJnZXRQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0dGFyZ2V0cy5wdXNoKGluZGV4ID4gMCA/IHRhcmdldFByb3BlcnR5LnNsaWNlKDAsIGluZGV4KSA6IHRhcmdldFByb3BlcnR5KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YXJnZXRzO1xuXHRcdH0sIFtdKTtcblx0XHQvLyBPRGF0YSBtb2RlbCB3aWxsIHRha2UgY2FyZSBvZiBkdXBsaWNhdGVzXG5cdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoWy4uLm9TaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcywgLi4ub1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXNdLCBvQmluZGluZ0NvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgYmluZGluZyBjb250ZXh0XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEJpbmRpbmdDb250ZXh0KCk6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5fb1BhZ2VDb21wb25lbnQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vUGFnZUNvbXBvbmVudC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBvciB0aGUgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJpbmRpbmcgY29udGV4dFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9zZXRCaW5kaW5nQ29udGV4dChvQ29udGV4dDogYW55KSB7XG5cdFx0bGV0IG9QcmV2aW91c0NvbnRleHQsIG9UYXJnZXRDb250cm9sO1xuXHRcdGlmICh0aGlzLl9vUGFnZUNvbXBvbmVudCkge1xuXHRcdFx0b1ByZXZpb3VzQ29udGV4dCA9IHRoaXMuX29QYWdlQ29tcG9uZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdG9UYXJnZXRDb250cm9sID0gdGhpcy5fb1BhZ2VDb21wb25lbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9QcmV2aW91c0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRvVGFyZ2V0Q29udHJvbCA9IHRoaXMuX29WaWV3O1xuXHRcdH1cblxuXHRcdG9UYXJnZXRDb250cm9sLnNldEJpbmRpbmdDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdGlmIChvUHJldmlvdXNDb250ZXh0Py5pc0tlZXBBbGl2ZSgpICYmIG9QcmV2aW91c0NvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHR0aGlzLl9zZXRLZWVwQWxpdmUob1ByZXZpb3VzQ29udGV4dCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBmbGV4aWJsZSBjb2x1bW4gbGF5b3V0IChGQ0wpIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZpZXcgKC0xIGlmIHRoZSBhcHAgaXMgbm90IEZDTCkuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBsZXZlbFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdF9nZXRGQ0xMZXZlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb1RhcmdldEluZm9ybWF0aW9uLkZDTExldmVsO1xuXHR9XG5cblx0X3NldEtlZXBBbGl2ZShvQ29udGV4dDogQ29udGV4dCwgYktlZXBBbGl2ZTogYm9vbGVhbiwgZm5CZWZvcmVEZXN0cm95PzogRnVuY3Rpb24sIGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuKSB7XG5cdFx0aWYgKG9Db250ZXh0LmdldFBhdGgoKS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdC8vIFdlIGtlZXAgdGhlIGNvbnRleHQgYWxpdmUgb25seSBpZiB0aGV5J3JlIHBhcnQgb2YgYSBjb2xsZWN0aW9uLCBpLmUuIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCBhICcpJ1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLk1lc3NhZ2VzLyRQYXRoYCk7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoYktlZXBBbGl2ZSwgZm5CZWZvcmVEZXN0cm95LCAhIXNNZXNzYWdlc1BhdGggJiYgYlJlcXVlc3RNZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dldEtlZXBBbGl2ZUNvbnRleHQob01vZGVsOiBPRGF0YU1vZGVsLCBwYXRoOiBzdHJpbmcsIGJSZXF1ZXN0TWVzc2FnZXM/OiBib29sZWFuLCBwYXJhbWV0ZXJzPzogYW55KTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gR2V0IHRoZSBwYXRoIGZvciB0aGUgY29udGV4dCB0aGF0IGlzIHJlYWxseSBrZXB0IGFsaXZlIChwYXJ0IG9mIGEgY29sbGVjdGlvbilcblx0XHQvLyBpLmUuIHJlbW92ZSBhbGwgc2VnbWVudHMgbm90IGVuZGluZyB3aXRoIGEgJyknXG5cdFx0Y29uc3Qga2VwdEFsaXZlU2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRjb25zdCBhZGRpdGlvbm5hbFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHdoaWxlIChrZXB0QWxpdmVTZWdtZW50cy5sZW5ndGggJiYgIWtlcHRBbGl2ZVNlZ21lbnRzW2tlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCAtIDFdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0YWRkaXRpb25uYWxTZWdtZW50cy5wdXNoKGtlcHRBbGl2ZVNlZ21lbnRzLnBvcCgpISk7XG5cdFx0fVxuXG5cdFx0aWYgKGtlcHRBbGl2ZVNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBrZXB0QWxpdmVQYXRoID0ga2VwdEFsaXZlU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0Y29uc3Qgb0tlZXBBbGl2ZUNvbnRleHQgPSBvTW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChrZXB0QWxpdmVQYXRoLCBiUmVxdWVzdE1lc3NhZ2VzLCBwYXJhbWV0ZXJzKTtcblxuXHRcdGlmIChhZGRpdGlvbm5hbFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG9LZWVwQWxpdmVDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhZGRpdGlvbm5hbFNlZ21lbnRzLnJldmVyc2UoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9ubmFsUGF0aCA9IGFkZGl0aW9ubmFsU2VnbWVudHMuam9pbihcIi9cIik7XG5cdFx0XHRyZXR1cm4gb01vZGVsLmJpbmRDb250ZXh0KGFkZGl0aW9ubmFsUGF0aCwgb0tlZXBBbGl2ZUNvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyBiZXR3ZWVuIGNvbHVtbiBhbmQgZnVsbC1zY3JlZW4gbW9kZSB3aGVuIEZDTCBpcyB1c2VkLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHN3aXRjaEZ1bGxTY3JlZW4oKSB7XG5cdFx0Y29uc3Qgb1NvdXJjZSA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ZDTEhlbHBlck1vZGVsID0gb1NvdXJjZS5nZXRNb2RlbChcImZjbGhlbHBlclwiKSBhcyBKU09OTW9kZWwsXG5cdFx0XHRiSXNGdWxsU2NyZWVuID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2lzRnVsbFNjcmVlblwiKSxcblx0XHRcdHNOZXh0TGF5b3V0ID0gb0ZDTEhlbHBlck1vZGVsLmdldFByb3BlcnR5KFxuXHRcdFx0XHRiSXNGdWxsU2NyZWVuID8gXCIvYWN0aW9uQnV0dG9uc0luZm8vZXhpdEZ1bGxTY3JlZW5cIiA6IFwiL2FjdGlvbkJ1dHRvbnNJbmZvL2Z1bGxTY3JlZW5cIlxuXHRcdFx0KSxcblx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdHRoaXMuYmFzZS5fcm91dGluZy5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwgeyBzTGF5b3V0OiBzTmV4dExheW91dCB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cud2FybmluZyhcImNhbm5vdCBzd2l0Y2ggYmV0d2VlbiBjb2x1bW4gYW5kIGZ1bGxzY3JlZW5cIik7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvc2VzIHRoZSBjb2x1bW4gZm9yIHRoZSBjdXJyZW50IHZpZXcgaW4gYSBGQ0wuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkJlZm9yZSlcblx0Y2xvc2VDb2x1bW4oKSB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5fb1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnk7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLl9vVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdFx0XHRub1ByZXNlcnZhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdFx0c0xheW91dDogKHRoaXMuX29WaWV3LmdldE1vZGVsKFwiZmNsaGVscGVyXCIpIGFzIEpTT05Nb2RlbCkuZ2V0UHJvcGVydHkoXCIvYWN0aW9uQnV0dG9uc0luZm8vY2xvc2VDb2x1bW5cIilcblx0XHR9O1xuXG5cdFx0aWYgKG9WaWV3RGF0YT8udmlld0xldmVsID09PSAxICYmIE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob01ldGFNb2RlbCwgb0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMuX29WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0LCBuYXZpZ2F0aW9uUGFyYW1ldGVycyk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVybmFsUm91dGluZztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7OztFQWdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEEsSUFTTUEsZUFBZSxXQURwQkMsY0FBYyxDQUFDLGtEQUFrRCxDQUFDLFVBb0JqRUMsY0FBYyxFQUFFLFVBT2hCQSxjQUFjLEVBQUUsVUFvQ2hCQyxlQUFlLEVBQUUsVUFDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUssQ0FBQyxVQUtuQ0gsZUFBZSxFQUFF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
|