@sapui5/sap.fe.core 1.124.2 → 1.126.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 +5 -1
- package/src/sap/fe/core/ActionRuntime.js +2 -2
- package/src/sap/fe/core/ActionRuntime.ts +4 -4
- package/src/sap/fe/core/AppComponent.js +2 -2
- package/src/sap/fe/core/AppComponent.ts +1 -1
- package/src/sap/fe/core/AppStateHandler.js +2 -2
- package/src/sap/fe/core/AppStateHandler.ts +1 -1
- package/src/sap/fe/core/BaseController.js +2 -2
- package/src/sap/fe/core/BaseController.ts +1 -1
- package/src/sap/fe/core/CommonUtils.js +3 -3
- package/src/sap/fe/core/CommonUtils.ts +12 -15
- package/src/sap/fe/core/ExtensionAPI.js +2 -2
- package/src/sap/fe/core/ExtensionAPI.ts +4 -3
- package/src/sap/fe/core/PageController.js +2 -2
- package/src/sap/fe/core/PageController.ts +1 -1
- package/src/sap/fe/core/ResourceModel.js +2 -2
- package/src/sap/fe/core/ResourceModel.ts +1 -1
- package/src/sap/fe/core/ReuseComponent.js +172 -0
- package/src/sap/fe/core/ReuseComponent.ts +165 -0
- package/src/sap/fe/core/TemplateComponent.js +2 -2
- package/src/sap/fe/core/TemplateComponent.ts +5 -1
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +92 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +90 -10
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +30 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +28 -4
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +10 -16
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +19 -16
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +3 -3
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +5 -5
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +2 -2
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +1 -1
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +17 -5
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +14 -6
- package/src/sap/fe/core/controllerextensions/ContextSharing.js +2 -2
- package/src/sap/fe/core/controllerextensions/ContextSharing.ts +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +57 -43
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +61 -46
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -11
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +8 -16
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +10 -7
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +5 -5
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +22 -18
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +28 -23
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +4 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +21 -15
- package/src/sap/fe/core/controllerextensions/PageReady.ts +29 -20
- package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.js +12 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +15 -1
- package/src/sap/fe/core/controllerextensions/Recommendations.js +26 -8
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +29 -3
- package/src/sap/fe/core/controllerextensions/Routing.js +5 -7
- package/src/sap/fe/core/controllerextensions/Routing.ts +4 -4
- package/src/sap/fe/core/controllerextensions/Share.js +4 -4
- package/src/sap/fe/core/controllerextensions/Share.ts +10 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.js +20 -5
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -2
- package/src/sap/fe/core/controllerextensions/Telemetry.js +2 -2
- package/src/sap/fe/core/controllerextensions/Telemetry.ts +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js +79 -81
- package/src/sap/fe/core/controllerextensions/ViewState.ts +117 -105
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.js +3 -3
- package/src/sap/fe/core/controllerextensions/cards/CollaborationManager.ts +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +2 -2
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +17 -8
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +8 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +10 -9
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +15 -10
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +130 -158
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +240 -275
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +46 -28
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +60 -32
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +2 -2
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +1 -1
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.js +2 -2
- package/src/sap/fe/core/controllerextensions/viewState/IViewStateContributor.ts +27 -3
- package/src/sap/fe/core/controls/CommandExecution.js +2 -2
- package/src/sap/fe/core/controls/CommandExecution.ts +2 -2
- package/src/sap/fe/core/controls/ComponentLoader.js +3 -3
- package/src/sap/fe/core/controls/ComponentLoader.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +2 -2
- package/src/sap/fe/core/controls/EventDelegateHook.js +2 -2
- package/src/sap/fe/core/controls/EventDelegateHook.ts +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +51 -6
- package/src/sap/fe/core/controls/FormElementWrapper.ts +43 -2
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +3 -3
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +3 -3
- package/src/sap/fe/core/converters/ConverterContext.js +4 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +5 -2
- package/src/sap/fe/core/converters/ManifestSettings.js +8 -2
- package/src/sap/fe/core/converters/ManifestSettings.ts +25 -3
- package/src/sap/fe/core/converters/ManifestWrapper.js +12 -3
- package/src/sap/fe/core/converters/ManifestWrapper.ts +11 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js +7 -6
- package/src/sap/fe/core/converters/MetaModelConverter.ts +6 -2
- package/src/sap/fe/core/converters/annotations/DataField.js +56 -16
- package/src/sap/fe/core/converters/annotations/DataField.ts +74 -25
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +19 -18
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -5
- package/src/sap/fe/core/converters/controls/Common/Action.ts +14 -14
- package/src/sap/fe/core/converters/controls/Common/Chart.js +40 -7
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +56 -20
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +8 -11
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +23 -27
- package/src/sap/fe/core/converters/controls/Common/Form.js +10 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.js +3 -2
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +6 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +137 -48
- package/src/sap/fe/core/converters/controls/Common/Table.ts +174 -52
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +73 -21
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +91 -20
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +4 -4
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -16
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +18 -17
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +2 -2
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +9 -9
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +12 -12
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -7
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +9 -73
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +4 -74
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +5 -10
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +3 -12
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +4 -7
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FiscalFormat.js +5 -3
- package/src/sap/fe/core/formatters/FiscalFormat.ts +4 -2
- package/src/sap/fe/core/formatters/StandardFormatter.js +2 -2
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
- package/src/sap/fe/core/fpm/Component.js +3 -3
- package/src/sap/fe/core/fpm/Component.ts +3 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.js +2 -2
- package/src/sap/fe/core/helpers/AdaptiveCardExpressionCompiler.ts +1 -1
- package/src/sap/fe/core/helpers/BindingHelper.js +2 -2
- package/src/sap/fe/core/helpers/BindingHelper.ts +2 -2
- package/src/sap/fe/core/helpers/BindingToolkitEvaluator.js +2 -2
- package/src/sap/fe/core/helpers/BindingToolkitEvaluator.ts +2 -2
- package/src/sap/fe/core/helpers/DeleteHelper.js +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.ts +9 -3
- package/src/sap/fe/core/helpers/MetaModelFunction.js +5 -5
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +2 -2
- package/src/sap/fe/core/helpers/MetaPath.js +9 -3
- package/src/sap/fe/core/helpers/MetaPath.ts +8 -2
- package/src/sap/fe/core/helpers/ModelHelper.js +149 -3
- package/src/sap/fe/core/helpers/ModelHelper.ts +202 -6
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +3 -3
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +2 -2
- package/src/sap/fe/core/helpers/TitleHelper.js +4 -4
- package/src/sap/fe/core/helpers/TitleHelper.ts +4 -4
- package/src/sap/fe/core/library.js +4 -4
- package/src/sap/fe/core/library.ts +2 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +11 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +10 -2
- package/src/sap/fe/core/messagebundle.properties +8 -57
- package/src/sap/fe/core/messagebundle_ar.properties +2 -0
- package/src/sap/fe/core/messagebundle_bg.properties +2 -0
- package/src/sap/fe/core/messagebundle_ca.properties +2 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +2 -0
- package/src/sap/fe/core/messagebundle_cs.properties +2 -0
- package/src/sap/fe/core/messagebundle_cy.properties +4 -2
- package/src/sap/fe/core/messagebundle_da.properties +2 -0
- package/src/sap/fe/core/messagebundle_de.properties +2 -0
- package/src/sap/fe/core/messagebundle_el.properties +2 -0
- package/src/sap/fe/core/messagebundle_en.properties +6 -57
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +3 -36
- package/src/sap/fe/core/messagebundle_es.properties +2 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -0
- package/src/sap/fe/core/messagebundle_et.properties +2 -0
- package/src/sap/fe/core/messagebundle_fi.properties +2 -0
- package/src/sap/fe/core/messagebundle_fr.properties +2 -0
- package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -0
- package/src/sap/fe/core/messagebundle_hr.properties +2 -0
- package/src/sap/fe/core/messagebundle_hu.properties +3 -1
- package/src/sap/fe/core/messagebundle_id.properties +2 -0
- package/src/sap/fe/core/messagebundle_it.properties +2 -0
- package/src/sap/fe/core/messagebundle_iw.properties +3 -1
- package/src/sap/fe/core/messagebundle_ja.properties +2 -0
- package/src/sap/fe/core/messagebundle_kk.properties +2 -0
- package/src/sap/fe/core/messagebundle_ko.properties +2 -0
- package/src/sap/fe/core/messagebundle_lt.properties +2 -0
- package/src/sap/fe/core/messagebundle_lv.properties +2 -0
- package/src/sap/fe/core/messagebundle_mk.properties +2 -0
- package/src/sap/fe/core/messagebundle_ms.properties +2 -0
- package/src/sap/fe/core/messagebundle_nl.properties +2 -0
- package/src/sap/fe/core/messagebundle_no.properties +2 -0
- package/src/sap/fe/core/messagebundle_pl.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -0
- package/src/sap/fe/core/messagebundle_ro.properties +2 -0
- package/src/sap/fe/core/messagebundle_ru.properties +2 -0
- package/src/sap/fe/core/messagebundle_sh.properties +64 -62
- package/src/sap/fe/core/messagebundle_sk.properties +2 -0
- package/src/sap/fe/core/messagebundle_sl.properties +2 -0
- package/src/sap/fe/core/messagebundle_sr.properties +2 -0
- package/src/sap/fe/core/messagebundle_sv.properties +2 -0
- package/src/sap/fe/core/messagebundle_th.properties +2 -0
- package/src/sap/fe/core/messagebundle_tr.properties +2 -0
- package/src/sap/fe/core/messagebundle_uk.properties +3 -1
- package/src/sap/fe/core/messagebundle_vi.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
- package/src/sap/fe/core/operationsHelper.js +3 -3
- package/src/sap/fe/core/operationsHelper.ts +2 -2
- package/src/sap/fe/core/rootView/Fcl.controller.js +3 -3
- package/src/sap/fe/core/rootView/Fcl.controller.ts +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +114 -92
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +120 -106
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CollaborativeToolsServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js +6 -4
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +4 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +12 -2
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +8 -2
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +7 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +16 -9
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +22 -11
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/templating/ActionHelper.js +2 -2
- package/src/sap/fe/core/templating/ActionHelper.ts +2 -2
- package/src/sap/fe/core/templating/CommonFormatters.js +2 -2
- package/src/sap/fe/core/templating/CommonFormatters.ts +3 -3
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
- package/src/sap/fe/core/templating/DataFieldFormatters.js +4 -4
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +2 -2
- package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +2 -2
- package/src/sap/fe/core/templating/EntityTypeHelper.js +2 -2
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +2 -2
- package/src/sap/fe/core/templating/FieldControlHelper.js +2 -2
- package/src/sap/fe/core/templating/FieldControlHelper.ts +2 -2
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +2 -2
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters.js +7 -7
- package/src/sap/fe/core/templating/UIFormatters.ts +6 -6
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +1 -1
- package/src/sap/fe/core/type/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.ts +1 -1
- package/src/sap/fe/core/type/InputMask.js +124 -0
- package/src/sap/fe/core/type/InputMask.ts +131 -0
- package/ui5.yaml +19 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +0 -81
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +0 -117
- package/src/sap/fe/core/helpers/AnnotationEnum.js +0 -33
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +0 -21
- package/src/sap/fe/core/helpers/BindingToolkit.js +0 -1813
- package/src/sap/fe/core/helpers/BindingToolkit.ts +0 -2450
- package/src/sap/fe/core/helpers/ClassSupport.js +0 -584
- package/src/sap/fe/core/helpers/ClassSupport.ts +0 -697
- package/src/sap/fe/core/jsx-runtime/Fragment.js +0 -14
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +0 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +0 -93
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +0 -86
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +0 -177
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +0 -197
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +0 -237
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +0 -246
- package/src/sap/fe/core/jsx-runtime/jsx.js +0 -47
- package/src/sap/fe/core/jsx-runtime/jsx.ts +0 -71
- package/src/sap/fe/core/jsx-runtime/jsxs.js +0 -10
- package/src/sap/fe/core/jsx-runtime/jsxs.ts +0 -3
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +0 -172
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +0 -194
|
@@ -38,6 +38,7 @@ import type {
|
|
|
38
38
|
} from "@sap-ux/vocabularies-types/vocabularies/Capabilities_Edm";
|
|
39
39
|
import type { PropertyAnnotations_Common } from "@sap-ux/vocabularies-types/vocabularies/Common_Edm";
|
|
40
40
|
import type { PropertyAnnotations_Communication } from "@sap-ux/vocabularies-types/vocabularies/Communication_Edm";
|
|
41
|
+
import type { PropertyAnnotations_Core } from "@sap-ux/vocabularies-types/vocabularies/Core_Edm";
|
|
41
42
|
import type { PropertyAnnotations_Measures } from "@sap-ux/vocabularies-types/vocabularies/Measures_Edm";
|
|
42
43
|
import type { PropertyAnnotations_PersonalData } from "@sap-ux/vocabularies-types/vocabularies/PersonalData_Edm";
|
|
43
44
|
import type { PropertyAnnotations_Session } from "@sap-ux/vocabularies-types/vocabularies/Session_Edm";
|
|
@@ -62,6 +63,8 @@ import type {
|
|
|
62
63
|
EntityTypeAnnotations_UI,
|
|
63
64
|
PropertyAnnotations_UI
|
|
64
65
|
} from "@sap-ux/vocabularies-types/vocabularies/UI_Edm";
|
|
66
|
+
import type { BindingToolkitExpression } from "sap/fe/base/BindingToolkit";
|
|
67
|
+
import { constant, formatResult, getExpressionFromAnnotation } from "sap/fe/base/BindingToolkit";
|
|
65
68
|
import { AnnotationConverter } from "sap/fe/core/converters/common";
|
|
66
69
|
import {
|
|
67
70
|
isEntityContainer,
|
|
@@ -77,8 +80,6 @@ import type { DataModelObjectContext, DataModelObjectPath } from "sap/fe/core/te
|
|
|
77
80
|
import type Context from "sap/ui/model/Context";
|
|
78
81
|
import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
|
|
79
82
|
import type { ExpandPathType, MetaModelType, Rename } from "types/metamodel_types";
|
|
80
|
-
import type { BindingToolkitExpression } from "../helpers/BindingToolkit";
|
|
81
|
-
import { constant, formatResult, getExpressionFromAnnotation } from "../helpers/BindingToolkit";
|
|
82
83
|
import { prepareId } from "../helpers/StableIdHelper";
|
|
83
84
|
|
|
84
85
|
export type MetaModelActionParameter = {
|
|
@@ -97,6 +98,7 @@ export type MetaModelAction = {
|
|
|
97
98
|
$Parameter: MetaModelActionParameter[];
|
|
98
99
|
$ReturnType: {
|
|
99
100
|
$Type: string;
|
|
101
|
+
$isCollection?: boolean;
|
|
100
102
|
};
|
|
101
103
|
};
|
|
102
104
|
|
|
@@ -948,6 +950,7 @@ function prepareAction(actionRawData: MetaModelAction, actionName: string, names
|
|
|
948
950
|
isFunction: actionRawData.$kind === "Function",
|
|
949
951
|
sourceType: overloadParameters[0]?.$Type ?? "",
|
|
950
952
|
returnType: actionRawData.$ReturnType?.$Type ?? "",
|
|
953
|
+
returnCollection: actionRawData.$ReturnType?.$isCollection ?? false,
|
|
951
954
|
parameters: parameters.map((param) => ({
|
|
952
955
|
_type: "ActionParameter",
|
|
953
956
|
fullyQualifiedName: `${fullyQualifiedName}/${param.$Name}`,
|
|
@@ -1022,6 +1025,7 @@ export type MetaModelEntitySetAnnotations = Rename<"@Org.OData.Capabilities.V1."
|
|
|
1022
1025
|
|
|
1023
1026
|
export type MetaModelPropertyAnnotations = Rename<"@com.sap.vocabularies.Common.v1.", MetaModelTypes<PropertyAnnotations_Common>> &
|
|
1024
1027
|
Rename<"@com.sap.vocabularies.UI.v1.", MetaModelTypes<PropertyAnnotations_UI>> &
|
|
1028
|
+
Rename<"@Org.OData.Core.V1.", MetaModelTypes<PropertyAnnotations_Core>> &
|
|
1025
1029
|
Rename<"@Org.OData.Capabilities.V1.", MetaModelTypes<PropertyAnnotations_Capabilities>> &
|
|
1026
1030
|
Rename<"@Org.OData.Measures.V1.", MetaModelTypes<PropertyAnnotations_Measures>> &
|
|
1027
1031
|
Rename<"@com.sap.vocabularies.Analytics.v1.", MetaModelTypes<PropertyAnnotations_Analytics>> &
|
|
@@ -10,17 +10,20 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
10
10
|
var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
|
|
11
11
|
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
12
12
|
var hasStaticPercentUnit = PropertyHelper.hasStaticPercentUnit;
|
|
13
|
+
var getAssociatedUnitPropertyPath = PropertyHelper.getAssociatedUnitPropertyPath;
|
|
13
14
|
var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
|
|
14
15
|
var getAssociatedTimezoneProperty = PropertyHelper.getAssociatedTimezoneProperty;
|
|
15
16
|
var getAssociatedTextPropertyPath = PropertyHelper.getAssociatedTextPropertyPath;
|
|
16
17
|
var getAssociatedTextProperty = PropertyHelper.getAssociatedTextProperty;
|
|
17
18
|
var getAssociatedExternalIdPropertyPath = PropertyHelper.getAssociatedExternalIdPropertyPath;
|
|
18
19
|
var getAssociatedExternalIdProperty = PropertyHelper.getAssociatedExternalIdProperty;
|
|
20
|
+
var getAssociatedCurrencyPropertyPath = PropertyHelper.getAssociatedCurrencyPropertyPath;
|
|
19
21
|
var getAssociatedCurrencyProperty = PropertyHelper.getAssociatedCurrencyProperty;
|
|
20
22
|
var getDisplayMode = DisplayModeFormatter.getDisplayMode;
|
|
21
23
|
var isProperty = TypeGuards.isProperty;
|
|
22
24
|
var isPathAnnotationExpression = TypeGuards.isPathAnnotationExpression;
|
|
23
25
|
var isAnnotationOfType = TypeGuards.isAnnotationOfType;
|
|
26
|
+
var isAnnotationOfTerm = TypeGuards.isAnnotationOfTerm;
|
|
24
27
|
/**
|
|
25
28
|
* Identifies if the given dataFieldAbstract that is passed is a "DataFieldForActionAbstract".
|
|
26
29
|
* DataFieldForActionAbstract has an inline action defined.
|
|
@@ -96,13 +99,25 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
96
99
|
return isAnnotationOfType(dataFieldTarget, "com.sap.vocabularies.UI.v1.FieldGroupType");
|
|
97
100
|
}
|
|
98
101
|
|
|
102
|
+
/**
|
|
103
|
+
* Determines if the dataFieldForAnnotation is a field group.
|
|
104
|
+
*
|
|
105
|
+
* @param dataFieldForAnnotation The dataFieldForAnnotation being processed
|
|
106
|
+
* @returns True if the dataFieldForAnnotation is a field group.
|
|
107
|
+
*/
|
|
108
|
+
_exports.hasFieldGroupTarget = hasFieldGroupTarget;
|
|
109
|
+
function hasIdentificationTarget(dataFieldForAnnotation) {
|
|
110
|
+
const dataFieldTarget = dataFieldForAnnotation.Target.$target;
|
|
111
|
+
return isAnnotationOfTerm(dataFieldTarget, "com.sap.vocabularies.UI.v1.Identification");
|
|
112
|
+
}
|
|
113
|
+
|
|
99
114
|
/**
|
|
100
115
|
* Determines if the dataFieldForAnnotation is a data point.
|
|
101
116
|
*
|
|
102
117
|
* @param dataFieldForAnnotation The dataFieldForAnnotation being processed
|
|
103
118
|
* @returns True if the dataFieldForAnnotation is a data point.
|
|
104
119
|
*/
|
|
105
|
-
_exports.
|
|
120
|
+
_exports.hasIdentificationTarget = hasIdentificationTarget;
|
|
106
121
|
function hasDataPointTarget(dataFieldForAnnotation) {
|
|
107
122
|
const dataFieldTarget = dataFieldForAnnotation.Target.$target;
|
|
108
123
|
return isAnnotationOfType(dataFieldTarget, "com.sap.vocabularies.UI.v1.DataPointType");
|
|
@@ -322,7 +337,6 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
322
337
|
if (path && property) {
|
|
323
338
|
var _relatedProperties$ex2;
|
|
324
339
|
let valueIndex;
|
|
325
|
-
let currencyOrUoMIndex;
|
|
326
340
|
/* EXTERNALID */
|
|
327
341
|
const externalIdPath = getAssociatedExternalIdPropertyPath(property);
|
|
328
342
|
const externalIdProperty = getAssociatedExternalIdProperty(property);
|
|
@@ -343,6 +357,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
343
357
|
const propertyDataModelObjectPath = enhanceDataModelPath(dataModelObjectPath, externalIdPath || path);
|
|
344
358
|
const textPropertyDataModelObjectPath = enhanceDataModelPath(propertyDataModelObjectPath, textPropertyPath);
|
|
345
359
|
const textRelativePath = getContextRelativeTargetObjectPath(textPropertyDataModelObjectPath);
|
|
360
|
+
const relativePath = getContextRelativeTargetObjectPath(propertyDataModelObjectPath);
|
|
346
361
|
if ((_relatedProperties$ex2 = relatedProperties.exportSettings) !== null && _relatedProperties$ex2 !== void 0 && _relatedProperties$ex2.template) {
|
|
347
362
|
// FieldGroup use-case. Need to add each Field in new line.
|
|
348
363
|
_appendTemplate(relatedProperties, "\n");
|
|
@@ -384,20 +399,11 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
384
399
|
const timezoneProperty = getAssociatedTimezoneProperty(property);
|
|
385
400
|
const timezoneAnnotation = property === null || property === void 0 ? void 0 : (_property$annotations18 = property.annotations) === null || _property$annotations18 === void 0 ? void 0 : (_property$annotations19 = _property$annotations18.Common) === null || _property$annotations19 === void 0 ? void 0 : _property$annotations19.Timezone;
|
|
386
401
|
if (currencyOrUoMProperty) {
|
|
387
|
-
|
|
388
|
-
currencyOrUoMIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix + currencyOrUnitAnnotation.path, currencyOrUnitAnnotation.$target);
|
|
389
|
-
if (addUnitInTemplate) {
|
|
390
|
-
_appendTemplate(relatedProperties, `{${valueIndex}} {${currencyOrUoMIndex}}`);
|
|
391
|
-
} else {
|
|
392
|
-
relatedProperties.exportSettings.unitProperty = navigationPathPrefix + currencyOrUnitAnnotation.path;
|
|
393
|
-
}
|
|
394
|
-
if (currencyProperty) {
|
|
395
|
-
relatedProperties.exportSettings.isCurrency = true;
|
|
396
|
-
}
|
|
402
|
+
collectCurrencyOrUnitProperties(relatedProperties, relativePath ?? path, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, currencyProperty);
|
|
397
403
|
} else if (timezoneProperty && timezoneAnnotation !== null && timezoneAnnotation !== void 0 && timezoneAnnotation.$target) {
|
|
398
404
|
collectTimezoneProperties(property, relatedProperties, path, addUnitInTemplate);
|
|
399
405
|
} else if (((_property$Target = property.Target) === null || _property$Target === void 0 ? void 0 : (_property$Target$$tar = _property$Target.$target) === null || _property$Target$$tar === void 0 ? void 0 : _property$Target$$tar.$Type) === "com.sap.vocabularies.UI.v1.DataPointType" && !((_property$Target2 = property.Target) !== null && _property$Target2 !== void 0 && (_property$Target2$$ta = _property$Target2.$target) !== null && _property$Target2$$ta !== void 0 && _property$Target2$$ta.ValueFormat) || ((_property$annotations20 = property.annotations) === null || _property$annotations20 === void 0 ? void 0 : (_property$annotations21 = _property$annotations20.UI) === null || _property$annotations21 === void 0 ? void 0 : (_property$annotations22 = _property$annotations21.DataFieldDefault) === null || _property$annotations22 === void 0 ? void 0 : (_property$annotations23 = _property$annotations22.Target) === null || _property$annotations23 === void 0 ? void 0 : (_property$annotations24 = _property$annotations23.$target) === null || _property$annotations24 === void 0 ? void 0 : _property$annotations24.$Type) === "com.sap.vocabularies.UI.v1.DataPointType") {
|
|
400
|
-
collectDataPointProperties(property, relatedProperties,
|
|
406
|
+
collectDataPointProperties(property, relatedProperties, relativePath);
|
|
401
407
|
} else if (property.$Type === "com.sap.vocabularies.Communication.v1.ContactType") {
|
|
402
408
|
var _property$fn, _property$fn2;
|
|
403
409
|
const contactProperty = (_property$fn = property.fn) === null || _property$fn === void 0 ? void 0 : _property$fn.$target;
|
|
@@ -459,12 +465,16 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
459
465
|
*/
|
|
460
466
|
function collectDataPointProperties(property, relatedProperties, path) {
|
|
461
467
|
var _property$Target3, _property$Target3$$ta, _property$Target4, _property$annotations27, _property$annotations28;
|
|
468
|
+
// path must not be undefined, getContextRelativeTargetObjectPath may return undefined
|
|
469
|
+
if (path === undefined) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
462
472
|
const dataPointProperty = (_property$Target3 = property.Target) === null || _property$Target3 === void 0 ? void 0 : (_property$Target3$$ta = _property$Target3.$target) === null || _property$Target3$$ta === void 0 ? void 0 : _property$Target3$$ta.Value.$target;
|
|
463
473
|
const datapointTarget = (_property$Target4 = property.Target) === null || _property$Target4 === void 0 ? void 0 : _property$Target4.$target;
|
|
464
474
|
const navigationPathPrefix = _getNavigationPathPrefix(path);
|
|
465
475
|
// DataPoint use-case using DataFieldDefault.
|
|
466
476
|
const dataPointDefaultProperty = (_property$annotations27 = property.annotations) === null || _property$annotations27 === void 0 ? void 0 : (_property$annotations28 = _property$annotations27.UI) === null || _property$annotations28 === void 0 ? void 0 : _property$annotations28.DataFieldDefault;
|
|
467
|
-
const valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties,
|
|
477
|
+
const valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, dataPointDefaultProperty ? property : dataPointProperty);
|
|
468
478
|
// If we have a DataPoint without visualization, or a Number, we don't have a TargetValue/MaximumValue
|
|
469
479
|
if (getDataPointVisualization(dataPointDefaultProperty ? property : datapointTarget) === "UI.VisualizationType/Number") {
|
|
470
480
|
return;
|
|
@@ -506,6 +516,36 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
506
516
|
}
|
|
507
517
|
}
|
|
508
518
|
|
|
519
|
+
/**
|
|
520
|
+
* Collect the related properties from a property with currencies or units.
|
|
521
|
+
*
|
|
522
|
+
* @param relatedProperties The related properties identified so far for the column.
|
|
523
|
+
* @param relativePath The property relative path.
|
|
524
|
+
* @param addUnitInTemplate Specify if the unit should be added in the template.
|
|
525
|
+
* @param propertyDataModelObjectPath The data model object path of the property to be considered.
|
|
526
|
+
* @param currencyOrUoMProperty The currency or unit of measure property linked to the column.
|
|
527
|
+
* @param currencyProperty The currency property linked to the column.
|
|
528
|
+
*/
|
|
529
|
+
function collectCurrencyOrUnitProperties(relatedProperties, relativePath, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, currencyProperty) {
|
|
530
|
+
const property = propertyDataModelObjectPath.targetObject;
|
|
531
|
+
if (property) {
|
|
532
|
+
const currencyOrUnitPropertyPath = getAssociatedCurrencyPropertyPath(property) || getAssociatedUnitPropertyPath(property);
|
|
533
|
+
const unitOrCurrencyPropertyDataModelObjectPath = enhanceDataModelPath(propertyDataModelObjectPath, currencyOrUnitPropertyPath);
|
|
534
|
+
const unitOrCurrencyRelativePath = getContextRelativeTargetObjectPath(unitOrCurrencyPropertyDataModelObjectPath);
|
|
535
|
+
const valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, relativePath, property);
|
|
536
|
+
const currencyOrUoMIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, unitOrCurrencyRelativePath, currencyOrUoMProperty);
|
|
537
|
+
if (addUnitInTemplate) {
|
|
538
|
+
_appendTemplate(relatedProperties, `{${valueIndex}} {${currencyOrUoMIndex}}`);
|
|
539
|
+
} else {
|
|
540
|
+
relatedProperties.exportSettings.unitProperty = unitOrCurrencyRelativePath;
|
|
541
|
+
}
|
|
542
|
+
if (currencyProperty) {
|
|
543
|
+
relatedProperties.exportSettings.isCurrency = true;
|
|
544
|
+
}
|
|
545
|
+
relatedProperties.exportSettings.scale = property.scale;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
|
|
509
549
|
/**
|
|
510
550
|
* Collect properties consumed by a DataField.
|
|
511
551
|
* This is for populating the ComplexPropertyInfos of the table delegate.
|
|
@@ -514,7 +554,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
514
554
|
* @param converterContext The converter context.
|
|
515
555
|
* @param tableType The table type.
|
|
516
556
|
* @param relatedProperties The properties identified so far.
|
|
517
|
-
* @param isEmbedded True if the DataField is embedded in another annotation (
|
|
557
|
+
* @param isEmbedded True if the DataField is embedded in another annotation (such as FieldGroup).
|
|
518
558
|
* @returns The properties related to the DataField.
|
|
519
559
|
*/
|
|
520
560
|
function collectRelatedPropertiesRecursively(dataField, converterContext, tableType) {
|
|
@@ -614,4 +654,4 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
|
|
|
614
654
|
_exports.getDataFieldDataType = getDataFieldDataType;
|
|
615
655
|
return _exports;
|
|
616
656
|
}, false);
|
|
617
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldCIsInRhcmdldE9iamVjdCIsImlzQWN0aW9uV2l0aERpYWxvZyIsInVuZGVmaW5lZCIsImFjdGlvbiIsIkFjdGlvblRhcmdldCIsImJDcml0aWNhbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiSXNBY3Rpb25Dcml0aWNhbCIsInBhcmFtZXRlcnMiLCJsZW5ndGgiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50Iiwic291cmNlIiwidGFyZ2V0VmFsdWUiLCJpc1Byb3BlcnR5IiwiZGF0YVBvaW50IiwiVUkiLCJEYXRhRmllbGREZWZhdWx0IiwiVGFyZ2V0VmFsdWUiLCJNYXhpbXVtVmFsdWUiLCJ0b1N0cmluZyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsInByb3BlcnR5IiwiaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQiLCJWaXN1YWxpemF0aW9uIiwiaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJWYWx1ZSIsIlNlbWFudGljT2JqZWN0IiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIl9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeCIsInBhdGgiLCJpbmNsdWRlcyIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiSGlkZGVuIiwiaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JpdGljYWxpdHkiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHlQYXRoIiwiX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgiLCJrZXkiLCJ2YWx1ZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwicHJvcGVydGllcyIsImFubm90YXRpb25Qcm9wZXJ0eSIsIk9iamVjdCIsImtleXMiLCJpbmRleE9mIiwiX2FwcGVuZFRlbXBsYXRlIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsImlnbm9yZVNlbGYiLCJhZGRVbml0SW5UZW1wbGF0ZSIsImlzQW5ub3RhdGVkQXNIaWRkZW4iLCJ2YWx1ZUluZGV4IiwiY3VycmVuY3lPclVvTUluZGV4IiwiZXh0ZXJuYWxJZFBhdGgiLCJnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5UGF0aCIsImV4dGVybmFsSWRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHkiLCJ0ZXh0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJ0ZXh0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImdldENvbnRleHRQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwid3JhcCIsInBhdGhGb3JUZXh0IiwicHJvcGVydHlGb3JUZXh0IiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uSW5kZXgiLCJjdXJyZW5jeVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJ1bml0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZUFubm90YXRpb24iLCJUaW1lem9uZSIsImlzQ3VycmVuY3kiLCJjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzIiwiVmFsdWVGb3JtYXQiLCJjb2xsZWN0RGF0YVBvaW50UHJvcGVydGllcyIsImNvbnRhY3RQcm9wZXJ0eSIsImZuIiwiY29udGFjdFByb3BlcnR5UGF0aCIsInVuaXQiLCJ0aW1lem9uZSIsImdldERhdGFQb2ludFZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsImRhdGFwb2ludFRhcmdldCIsImRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSIsImRhdGFQb2ludEluZGV4IiwibmFtZSIsImRhdGFQb2ludFRhcmdldFZhbHVlIiwiaGFzU3RhdGljUGVyY2VudFVuaXQiLCJ0aW1lem9uZU9yVW9NSW5kZXgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRW1iZWRkZWQiLCJpc1N0YXRpY2FsbHlIaWRkZW4iLCJpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiIsIkRhdGEiLCJmb3JFYWNoIiwiaW5uZXJEYXRhRmllbGQiLCJkYXRhRmllbGRDb250YWN0IiwiZ2V0RGF0YUZpZWxkRGF0YVR5cGUiLCJvRGF0YUZpZWxkIiwidHlwZSIsInNEYXRhVHlwZSIsIiRQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJEYXRhRmllbGQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVGVybSwgRGVjaW1hbCwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBQcmltaXRpdmVUeXBlLCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tdW5pY2F0aW9uXCI7XG5pbXBvcnQgeyBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tdW5pY2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uLFxuXHREYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHREYXRhUG9pbnQsXG5cdERhdGFQb2ludFR5cGUsXG5cdERhdGFQb2ludFR5cGVUeXBlcyxcblx0RmllbGRHcm91cFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcywgVmlzdWFsaXphdGlvblR5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbkV4cG9ydFNldHRpbmdzLCBUYWJsZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB7IGlzQW5ub3RhdGlvbk9mVHlwZSwgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIGlzUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0aGFzU3RhdGljUGVyY2VudFVuaXRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLCB0eXBlIERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwiLi4vLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERpc3BsYXlNb2RlIH0gZnJvbSBcIi4uLy4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCIuLi9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB7IGFubm90YXRpb25Qcm9wZXJ0eTogUHJvcGVydHk7IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGUgfT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncztcbn07XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0XCIuXG4gKiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCBoYXMgYW4gaW5saW5lIGFjdGlvbiBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcykuaGFzT3duUHJvcGVydHkoXCJBY3Rpb25cIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiLlxuICogaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkXG4pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb247XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiLlxuICogRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkVHlwZXNcIi5cbiAqIERhdGFGaWVsZCBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRUeXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFwiLlxuICogRGF0YUZpZWxkIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZSB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGQoZGF0YUZpZWxkOiBEYXRhRmllbGQgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZCB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/Lmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRmllbGRHcm91cFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdHJldHVybiBpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGRhdGEgcG9pbnQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZGF0YSBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RhdGFQb2ludFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdHJldHVybiBpc0Fubm90YXRpb25PZlR5cGU8RGF0YVBvaW50PihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YSBtb2RlbCBvYmplY3QgcGF0aCB0YXJnZXRpbmcgYSBkYXRhRmllbGQgZm9yIGFjdGlvbiBvcGVucyB1cCBhIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU1vZGVsT2JqZWN0UGF0aEZvckFjdGlvbldpdGhEaWFsb2coXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz5cbik6IFwiRGlhbG9nXCIgfCBcIk5vbmVcIiB7XG5cdGNvbnN0IHRhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRyZXR1cm4gaXNBY3Rpb25XaXRoRGlhbG9nKGlzRGF0YUZpZWxkRm9yQWN0aW9uKHRhcmdldCkgPyB0YXJnZXQgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgZm9yIGFjdGlvblxuICogQHJldHVybnMgYERpYWxvZ2AgfCBgTm9uZWAgaWYgYSBkaWFsb2cgaXMgbmVlZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbldpdGhEaWFsb2coZGF0YUZpZWxkPzogRGF0YUZpZWxkRm9yQWN0aW9uKTogXCJEaWFsb2dcIiB8IFwiTm9uZVwiIHtcblx0Y29uc3QgYWN0aW9uID0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ7XG5cdGlmIChhY3Rpb24pIHtcblx0XHRjb25zdCBiQ3JpdGljYWwgPSBhY3Rpb24uYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNBY3Rpb25Dcml0aWNhbDtcblx0XHRpZiAoYWN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMSB8fCBiQ3JpdGljYWwpIHtcblx0XHRcdHJldHVybiBcIkRpYWxvZ1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgVGFyZ2V0VmFsdWUgZnJvbSBhIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSB0YXJnZXQgcHJvcGVydHkgb3IgRGF0YVBvaW50XG4gKiBAcmV0dXJucyBUaGUgVGFyZ2V0VmFsdWUgYXMgYSBkZWNpbWFsIG9yIGEgcHJvcGVydHkgcGF0aFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHNvdXJjZTogUHJvcGVydHkgfCBEYXRhUG9pbnRUeXBlKTogUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nIHtcblx0bGV0IHRhcmdldFZhbHVlOiBEZWNpbWFsIHwgdW5kZWZpbmVkIHwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nO1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0Y29uc3QgZGF0YVBvaW50ID0gKHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlO1xuXHRcdHRhcmdldFZhbHVlID0gZGF0YVBvaW50Py5UYXJnZXRWYWx1ZSA/PyBkYXRhUG9pbnQ/Lk1heGltdW1WYWx1ZTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRWYWx1ZSA9IHNvdXJjZS5UYXJnZXRWYWx1ZSA/PyBzb3VyY2UuTWF4aW11bVZhbHVlO1xuXHR9XG5cdGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09IFwibnVtYmVyXCIpIHtcblx0XHRyZXR1cm4gdGFyZ2V0VmFsdWUudG9TdHJpbmcoKTtcblx0fVxuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0VmFsdWUpID8gdGFyZ2V0VmFsdWUgOiBcIjEwMFwiO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIERhdGFQb2ludCB3aXRoaW4gYSBEYXRhRmllbGREZWZhdWx0LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IGhhcyBhIERhdGFQb2ludCB3aXRoaW4gdGhlIERhdGFGaWVsZERlZmF1bHQsIGZhbHNlIGVsc2VcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIGRlZmF1bHQgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZpc3VhbGl6YXRpb24gdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgaXMgYSBSYXRpbmdcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoKHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIEFubm90YXRpb25UZXJtPERhdGFQb2ludD4pXG5cdFx0XHQ/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUmF0aW5nXCJcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwcm9wZXJ0eSB1c2VzIGEgUHJvZ3Jlc3MgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgb3IgYSBkaXJlY3QgRGF0YVBvaW50LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2aXN1YWxpemF0aW9uIGlzIGEgUHJvZ3Jlc3NcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSAmJiBpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSkge1xuXHRcdHByb3BlcnR5ID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjtcblx0fVxuXHRyZXR1cm4gKChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZSk/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUHJvZ3Jlc3NcIjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdFBhdGgoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0b2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHlcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICh0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0aWYgKGlzRGF0YUZpZWxkVHlwZXMob2JqZWN0KSAmJiBvYmplY3QuVmFsdWU/LiR0YXJnZXQpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gb2JqZWN0LlZhbHVlPy4kdGFyZ2V0O1xuXHRcdFx0aWYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHk/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc1Byb3BlcnR5KG9iamVjdCkpIHtcblx0XHRcdGlmIChvYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChvYmplY3Q/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBmb3IgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vXG4gKi9cbmZ1bmN0aW9uIF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRpZiAocGF0aCkge1xuXHRcdHJldHVybiBwYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiBcIlwiO1xuXHR9XG5cdHJldHVybiBcIlwiO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuICpcbiAqIEZvciBlLmcuIElmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFByb3BlcnR5IG9yIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUGF0aFByZWZpeCBOYXZpZ2F0aW9uIHBhdGggcHJlZml4LCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUYWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmZ1bmN0aW9uIF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUoXG5cdHRhcmdldDogUHJpbWl0aXZlVHlwZSxcblx0bmF2aWdhdGlvblBhdGhQcmVmaXg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb24gPSB0YXJnZXQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdFx0aWYgKGhpZGRlbkFubm90YXRpb24/LnBhdGggJiYgaXNQcm9wZXJ0eShoaWRkZW5Bbm5vdGF0aW9uLiR0YXJnZXQpKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBoaWRkZW5Bbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHQvLyBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBhZGRlZCB0byBhZGRpdGlvbmFsUHJvcGVydGllcyBtYXAgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1toaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoXSA9IGhpZGRlbkFubm90YXRpb24uJHRhcmdldDtcblx0XHR9XG5cblx0XHRjb25zdCBjcml0aWNhbGl0eSA9IHRhcmdldC5Dcml0aWNhbGl0eTtcblx0XHRpZiAoY3JpdGljYWxpdHk/LnBhdGggJiYgaXNQcm9wZXJ0eShjcml0aWNhbGl0eT8uJHRhcmdldCkpIHtcblx0XHRcdGNvbnN0IGNyaXRpY2FsaXR5UHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjcml0aWNhbGl0eS5wYXRoO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXNbY3JpdGljYWxpdHlQcm9wZXJ0eVBhdGhdID0gY3JpdGljYWxpdHk/LiR0YXJnZXQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyB0byBwdXNoIHVuaXF1ZSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzXG4gKiBAcGFyYW0ga2V5IFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgcHJvcGVydHksIGRlc2NyaXB0aW9uIHByb3BlcnR5Li4uXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gVGhlIGRpc3BsYXkgbW9kZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiB0ZXh0IGFycmFuZ2VtZW50XG4gKiBAcmV0dXJucyBJbmRleCBhdCB3aGljaCB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlXG4gKi9cbmZ1bmN0aW9uIF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0a2V5OiBzdHJpbmcsXG5cdHZhbHVlOiBQcm9wZXJ0eSxcblx0ZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24/OiBEaXNwbGF5TW9kZVxuKTogbnVtYmVyIHtcblx0aWYgKCFyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzW2tleV0gPSB7IGFubm90YXRpb25Qcm9wZXJ0eTogdmFsdWUgfTtcblx0XHRpZiAoZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24pIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXNba2V5XS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiA9IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykuaW5kZXhPZihrZXkpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIHRvIGFwcGVuZCB0aGUgZXhwb3J0IHNldHRpbmdzIHRlbXBsYXRlIHdpdGggYSBmb3JtYXR0ZWQgdGV4dC5cbiAqXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNcbiAqIEBwYXJhbSB2YWx1ZSBGb3JtYXR0ZWQgdGV4dFxuICovXG5mdW5jdGlvbiBfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGVcblx0XHQ/IGAke3JlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlfSR7dmFsdWV9YFxuXHRcdDogYCR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkncyBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBpZ25vcmVTZWxmIFdoZXRoZXIgdG8gZXhjbHVkZSB0aGUgc2FtZSBwcm9wZXJ0eSBmcm9tIHRoZSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgVHJ1ZSBpZiB0aGUgdW5pdC9jdXJyZW5jeSBwcm9wZXJ0eSBuZWVkcyB0byBiZSBhZGRlZCBpbiB0aGUgZXhwb3J0IHRlbXBsYXRlXG4gKiBAcGFyYW0gaXNBbm5vdGF0ZWRBc0hpZGRlbiBUcnVlIGlmIHRoZSBEYXRhRmllbGQgb3IgdGhlIHByb3BlcnR5IGFyZSBzdGF0aWNhbGx5IGhpZGRlblxuICogQHJldHVybnMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRwYXRoOiBzdHJpbmcsXG5cdHByb3BlcnR5OiBQcmltaXRpdmVUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpZ25vcmVTZWxmOiBib29sZWFuLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7XG5cdFx0cHJvcGVydGllczoge30sXG5cdFx0YWRkaXRpb25hbFByb3BlcnRpZXM6IHt9LFxuXHRcdGV4cG9ydFNldHRpbmdzOiB7fVxuXHR9LFxuXHRhZGRVbml0SW5UZW1wbGF0ZSA9IGZhbHNlLFxuXHRpc0Fubm90YXRlZEFzSGlkZGVuID0gZmFsc2Vcbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAocGF0aCAmJiBwcm9wZXJ0eSkge1xuXHRcdGxldCB2YWx1ZUluZGV4OiBudW1iZXI7XG5cdFx0bGV0IGN1cnJlbmN5T3JVb01JbmRleDogbnVtYmVyO1xuXHRcdC8qIEVYVEVSTkFMSUQgKi9cblx0XHRjb25zdCBleHRlcm5hbElkUGF0aCA9IGdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0XHRjb25zdCBleHRlcm5hbElkUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5KHByb3BlcnR5KTtcblxuXHRcdGlmIChpc0Fubm90YXRlZEFzSGlkZGVuKSB7XG5cdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHlcblx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG5cdFx0fVxuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIFRleHQgYW5ub3RhdGlvbi5cblx0XHRjb25zdCB0ZXh0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgoZXh0ZXJuYWxJZFByb3BlcnR5IHx8IHByb3BlcnR5KTtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5KGV4dGVybmFsSWRQcm9wZXJ0eSB8fCBwcm9wZXJ0eSk7XG5cblx0XHQvLyBnZXQgdGhlIERhdGFNb2RlbE9iamVjdFBhdGggZm9yIHRoZSBjb2x1bW5cblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCBleHRlcm5hbElkUGF0aCB8fCBwYXRoKTtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGV4dFByb3BlcnR5UGF0aCk7XG5cdFx0Y29uc3QgdGV4dFJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgodGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cblx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlKSB7XG5cdFx0XHQvLyBGaWVsZEdyb3VwIHVzZS1jYXNlLiBOZWVkIHRvIGFkZCBlYWNoIEZpZWxkIGluIG5ldyBsaW5lLlxuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBcIlxcblwiKTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLndyYXAgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0ZXh0UHJvcGVydHkgJiYgdGV4dFJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgcGF0aEZvclRleHQgPSBleHRlcm5hbElkUGF0aCA/IGV4dGVybmFsSWRQYXRoIDogcGF0aDtcblx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yVGV4dCA9IGV4dGVybmFsSWRQcm9wZXJ0eSA/IGV4dGVybmFsSWRQcm9wZXJ0eSA6IHByb3BlcnR5O1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIFRleHQgQXJyYW5nZW1lbnQuXG5cdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5Rm9yVGV4dCwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRcdGxldCBkZXNjcmlwdGlvbkluZGV4OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgdGV4dFJlbGF0aXZlUGF0aCwgdGV4dFByb3BlcnR5LCBcIkRlc2NyaXB0aW9uXCIpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske2Rlc2NyaXB0aW9uSW5kZXh9fWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoRm9yVGV4dCwgcHJvcGVydHlGb3JUZXh0KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRleHRSZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHR0ZXh0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcIlZhbHVlRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFwiRGVzY3JpcHRpb25WYWx1ZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgZmllbGQgY29udGFpbmluZyBDdXJyZW5jeSBPciBVbml0IFByb3BlcnRpZXMgb3IgVGltZXpvbmVcblx0XHRcdGNvbnN0IGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGN1cnJlbmN5UHJvcGVydHkgPz8gdW5pdFByb3BlcnR5O1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiA9XG5cdFx0XHRcdHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXG5cdFx0XHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRjdXJyZW5jeU9yVW9NSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbi5wYXRoLFxuXHRcdFx0XHRcdGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbi4kdGFyZ2V0IVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gIHske2N1cnJlbmN5T3JVb01JbmRleH19YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5ID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24ucGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY3VycmVuY3lQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmlzQ3VycmVuY3kgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lUHJvcGVydHkgJiYgdGltZXpvbmVBbm5vdGF0aW9uPy4kdGFyZ2V0KSB7XG5cdFx0XHRcdGNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBhZGRVbml0SW5UZW1wbGF0ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSAmJiAhcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZUZvcm1hdCkgfHxcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoKTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuJFR5cGUgPT09IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGUpIHtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5ID0gcHJvcGVydHkuZm4/LiR0YXJnZXQ7XG5cdFx0XHRcdGNvbnN0IGNvbnRhY3RQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5mbj8ucGF0aDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjb250YWN0UHJvcGVydHlQYXRoIDogY29udGFjdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRjb250YWN0UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHR9IGVsc2UgaWYgKCFpZ25vcmVTZWxmKSB7XG5cdFx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eVxuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRcdGlmIChjdXJyZW5jeU9yVW5pdEFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy51bml0ID0gYCR7Y3VycmVuY3lPclVuaXRBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgY3VycmVuY3kvdW5pdFxuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSkge1xuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MuaXNDdXJyZW5jeSA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lQW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRpbWV6b25lID0gYCR7dGltZXpvbmVBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgdGltZXpvbmVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShwcm9wZXJ0eSwgbmF2aWdhdGlvblBhdGhQcmVmaXgsIHRhYmxlVHlwZSwgcmVsYXRlZFByb3BlcnRpZXMpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllcykubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eSBpZiBub3QgY29sbGVjdGVkIGFscmVhZHkuXG5cdFx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGFyZSBtYWRlIGF2YWlsYWJsZSBvbmx5IHRvIGNvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdHlwZSBvZiBWaXN1YWxpemF0aW9uIG9mIHRoZSBEYXRhUG9pbnQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBTb3VyY2Ugb2YgdGhlIERhdGFQb2ludC5cbiAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIFZpc3VhbGl6YXRpb24gb3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YVBvaW50VmlzdWFsaXphdGlvbihzb3VyY2U6IFByb3BlcnR5IHwgRGF0YVBvaW50VHlwZSk6IFZpc3VhbGl6YXRpb25UeXBlIHtcblx0bGV0IGRhdGFQb2ludDogRGF0YVBvaW50VHlwZTtcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGRhdGFQb2ludCA9IChzb3VyY2UuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZTtcblx0fSBlbHNlIHtcblx0XHRkYXRhUG9pbnQgPSBzb3VyY2U7XG5cdH1cblx0cmV0dXJuIGRhdGFQb2ludC5WaXN1YWxpemF0aW9uID8/IFZpc3VhbGl6YXRpb25UeXBlLk51bWJlcjtcbn1cblxuLyoqXG4gKlx0Q29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBEYXRhUG9pbnQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzKHByb3BlcnR5OiBQcmltaXRpdmVUeXBlLCByZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbywgcGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdGNvbnN0IGRhdGFQb2ludFByb3BlcnR5ID0gcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRjb25zdCBkYXRhcG9pbnRUYXJnZXQgPSBwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ7XG5cdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXHQvLyBEYXRhUG9pbnQgdXNlLWNhc2UgdXNpbmcgRGF0YUZpZWxkRGVmYXVsdC5cblx0Y29uc3QgZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5ID0gcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRjb25zdCB2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHBhdGggOiBwYXRoLFxuXHRcdGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHlcblx0KTtcblx0Ly8gSWYgd2UgaGF2ZSBhIERhdGFQb2ludCB3aXRob3V0IHZpc3VhbGl6YXRpb24sIG9yIGEgTnVtYmVyLCB3ZSBkb24ndCBoYXZlIGEgVGFyZ2V0VmFsdWUvTWF4aW11bVZhbHVlXG5cdGlmIChnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YXBvaW50VGFyZ2V0KSA9PT0gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHRhcmdldFZhbHVlID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFwb2ludFRhcmdldCk7XG5cdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRWYWx1ZSkpIHtcblx0XHRpZiAodGFyZ2V0VmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly9pbiBjYXNlIGl0J3MgYSBkeW5hbWljIHRhcmdldFZhbHVlXG5cdFx0XHRjb25zdCBkYXRhUG9pbnRJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSA6IHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSxcblx0XHRcdFx0dGFyZ2V0VmFsdWUuJHRhcmdldFxuXHRcdFx0KTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWUucGF0aDtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fS97JHtkYXRhUG9pbnRJbmRleH19YCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHkpICYmIGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQocHJvcGVydHkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IFwiJVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWU7XG5cdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdH1cbn1cblxuLyoqXG4gKlx0Q29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSB3aXRoIFRpbWV6b25lLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGguXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgU2hvdWxkIHdlIGFkZCB0aGUgdW5pdCBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICovXG5mdW5jdGlvbiBjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzKFxuXHRwcm9wZXJ0eTogUHJpbWl0aXZlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHBhdGg6IHN0cmluZyxcblx0YWRkVW5pdEluVGVtcGxhdGU6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRjb25zdCB0aW1lem9uZUFubm90YXRpb24gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24uVGltZXpvbmU7XG5cdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXHRjb25zdCB2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblxuXHRjb25zdCB0aW1lem9uZU9yVW9NSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRpbWV6b25lQW5ub3RhdGlvbi5wYXRoLFxuXHRcdHRpbWV6b25lQW5ub3RhdGlvbi4kdGFyZ2V0XG5cdCk7XG5cdGlmIChhZGRVbml0SW5UZW1wbGF0ZSkge1xuXHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fSAgeyR7dGltZXpvbmVPclVvTUluZGV4fX1gKTtcblx0fSBlbHNlIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50aW1lem9uZVByb3BlcnR5ID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyB0aW1lem9uZUFubm90YXRpb24ucGF0aDtcblx0fVxufVxuXG4vKipcbiAqIENvbGxlY3QgcHJvcGVydGllcyBjb25zdW1lZCBieSBhIERhdGFGaWVsZC5cbiAqIFRoaXMgaXMgZm9yIHBvcHVsYXRpbmcgdGhlIENvbXBsZXhQcm9wZXJ0eUluZm9zIG9mIHRoZSB0YWJsZSBkZWxlZ2F0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgaWRlbnRpZmllZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gaXNFbWJlZGRlZCBUcnVlIGlmIHRoZSBEYXRhRmllbGQgaXMgZW1iZWRkZWQgaW4gYW5vdGhlciBhbm5vdGF0aW9uIChlLmcuIEZpZWxkR3JvdXApLlxuICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgRGF0YUZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSxcblx0XHRleHBvcnRTZXR0aW5nczoge31cblx0fSxcblx0aXNFbWJlZGRlZCA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0bGV0IGlzU3RhdGljYWxseUhpZGRlbiA9IGZhbHNlO1xuXHRzd2l0Y2ggKGRhdGFGaWVsZD8uJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGlmIChkYXRhRmllbGQuVmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBkYXRhRmllbGQuVmFsdWU7XG5cdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdHByb3BlcnR5LnBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkuJHRhcmdldCxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRpc0VtYmVkZGVkLFxuXHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZTpcblx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRcdGlubmVyRGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZTpcblx0XHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb250YWN0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0IGFzIENvbnRhY3Q7XG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQudmFsdWUsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGRDb250YWN0LFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbixcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc1Byb3BlcnR5KG9EYXRhRmllbGQpKSB7XG5cdFx0cmV0dXJuIG9EYXRhRmllbGQudHlwZTtcblx0fVxuXHRsZXQgc0RhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN3aXRjaCAob0RhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRpZiAoZGF0YUZpZWxkVGFyZ2V0LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZFRhcmdldC5mbikpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuZm4uJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGRUYXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiRQYXRoPy4kVHlwZSB8fCBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZS5nLiBGaWVsZEdyb3VwIG9yIENoYXJ0XG5cdFx0XHRcdFx0Ly8gRmllbGRHcm91cCBQcm9wZXJ0aWVzIGhhdmUgbm8gdHlwZSwgc28gd2UgZGVmaW5lIGl0IGFzIGEgYm9vbGVhbiB0eXBlIHRvIHByZXZlbnQgZXhjZXB0aW9ucyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB3aWR0aFxuXHRcdFx0XHRcdHNEYXRhVHlwZSA9XG5cdFx0XHRcdFx0XHRvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0RGVmaW5pdGlvblR5cGVcIiA/IHVuZGVmaW5lZCA6IFwiRWRtLkJvb2xlYW5cIjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gc0RhdGFUeXBlO1xufTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQSw0QkFBNEIsQ0FBQ0MsU0FBaUMsRUFBZ0Q7SUFDN0gsT0FBUUEsU0FBUyxDQUFxQ0MsY0FBYyxDQUFDLFFBQVEsQ0FBQztFQUMvRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BO0VBT08sU0FBU0Msd0JBQXdCLENBQ3ZDRixTQUFrRSxFQUM1QjtJQUN0QyxPQUFPLENBQUFBLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFRyxLQUFLLHlEQUE2QztFQUNyRTtFQUFDO0VBRU0sU0FBU0Msb0JBQW9CLENBQUNKLFNBQTZDLEVBQW1DO0lBQ3BILE9BQU8sQ0FBQUEsU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUVHLEtBQUsscURBQXlDO0VBQ2pFOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkE7RUFPTyxTQUFTRSxtQ0FBbUMsQ0FBQ0wsU0FBaUMsRUFBa0Q7SUFDdEksT0FBT0EsU0FBUyxDQUFDRyxLQUFLLG1FQUF3RDtFQUMvRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BO0VBT08sU0FBU0csZ0JBQWdCLENBQUNOLFNBQTJDLEVBQStCO0lBQzFHLE9BQVFBLFNBQVMsQ0FBb0JDLGNBQWMsQ0FBQyxPQUFPLENBQUM7RUFDN0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQTtFQU9PLFNBQVNNLFdBQVcsQ0FBQ1AsU0FBOEIsRUFBMEI7SUFDbkYsT0FBUUEsU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQWdCQyxjQUFjLENBQUMsT0FBTyxDQUFDO0VBQ3pEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBO0VBTU8sU0FBU08sbUJBQW1CLENBQUNDLHNCQUE4QyxFQUFXO0lBQzVGLE1BQU1DLGVBQWUsR0FBR0Qsc0JBQXNCLENBQUNFLE1BQU0sQ0FBQ0MsT0FBTztJQUM3RCxPQUFPQyxrQkFBa0IsQ0FBYUgsZUFBZSw4Q0FBbUM7RUFDekY7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFNTyxTQUFTSSxrQkFBa0IsQ0FBQ0wsc0JBQThDLEVBQVc7SUFDM0YsTUFBTUMsZUFBZSxHQUFHRCxzQkFBc0IsQ0FBQ0UsTUFBTSxDQUFDQyxPQUFPO0lBQzdELE9BQU9DLGtCQUFrQixDQUFZSCxlQUFlLDZDQUFrQztFQUN2Rjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQTtFQU1PLFNBQVNLLHdDQUF3QyxDQUN2REMsbUJBQWdFLEVBQzVDO0lBQ3BCLE1BQU1DLE1BQU0sR0FBR0QsbUJBQW1CLENBQUNFLFlBQVk7SUFDL0MsT0FBT0Msa0JBQWtCLENBQUNmLG9CQUFvQixDQUFDYSxNQUFNLENBQUMsR0FBR0EsTUFBTSxHQUFHRyxTQUFTLENBQUM7RUFDN0U7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFNTyxTQUFTRCxrQkFBa0IsQ0FBQ25CLFNBQThCLEVBQXFCO0lBQ3JGLE1BQU1xQixNQUFNLEdBQUdyQixTQUFTLGFBQVRBLFNBQVMsdUJBQVRBLFNBQVMsQ0FBRXNCLFlBQVk7SUFDdEMsSUFBSUQsTUFBTSxFQUFFO01BQUE7TUFDWCxNQUFNRSxTQUFTLDBCQUFHRixNQUFNLENBQUNHLFdBQVcsaUZBQWxCLG9CQUFvQkMsTUFBTSwwREFBMUIsc0JBQTRCQyxnQkFBZ0I7TUFDOUQsSUFBSUwsTUFBTSxDQUFDTSxVQUFVLENBQUNDLE1BQU0sR0FBRyxDQUFDLElBQUlMLFNBQVMsRUFBRTtRQUM5QyxPQUFPLFFBQVE7TUFDaEIsQ0FBQyxNQUFNO1FBQ04sT0FBTyxNQUFNO01BQ2Q7SUFDRCxDQUFDLE1BQU07TUFDTixPQUFPLE1BQU07SUFDZDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBO0VBT08sU0FBU00seUJBQXlCLENBQUNDLE1BQWdDLEVBQThDO0lBQ3ZILElBQUlDLFdBQTZFO0lBQ2pGLElBQUlDLFVBQVUsQ0FBQ0YsTUFBTSxDQUFDLEVBQUU7TUFBQTtNQUN2QixNQUFNRyxTQUFTLDBCQUFJSCxNQUFNLENBQUNOLFdBQVcsaUZBQWxCLG9CQUFvQlUsRUFBRSxvRkFBdEIsc0JBQXdCQyxnQkFBZ0IscUZBQXpDLHVCQUFzRXhCLE1BQU0sMkRBQTVFLHVCQUE4RUMsT0FBd0I7TUFDeEhtQixXQUFXLEdBQUcsQ0FBQUUsU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUVHLFdBQVcsTUFBSUgsU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUVJLFlBQVk7SUFDaEUsQ0FBQyxNQUFNO01BQ05OLFdBQVcsR0FBR0QsTUFBTSxDQUFDTSxXQUFXLElBQUlOLE1BQU0sQ0FBQ08sWUFBWTtJQUN4RDtJQUNBLElBQUksT0FBT04sV0FBVyxLQUFLLFFBQVEsRUFBRTtNQUNwQyxPQUFPQSxXQUFXLENBQUNPLFFBQVEsRUFBRTtJQUM5QjtJQUNBLE9BQU9DLDBCQUEwQixDQUFDUixXQUFXLENBQUMsR0FBR0EsV0FBVyxHQUFHLEtBQUs7RUFDckU7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFPTyxNQUFNUywrQkFBK0IsR0FBRyxVQUFVQyxRQUFrQixFQUFXO0lBQUE7SUFDckYsT0FDQywwQkFBQ0EsUUFBUSxDQUFDakIsV0FBVyxvRkFBcEIsc0JBQXNCVSxFQUFFLHFGQUF4Qix1QkFBMEJDLGdCQUFnQixxRkFBM0MsdUJBQXdFeEIsTUFBTSxxRkFBOUUsdUJBQWdGQyxPQUFPLDJEQUF2Rix1QkFBeUZULEtBQUssZ0RBQW9DO0VBRXBJLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFPTyxNQUFNdUMseUNBQXlDLEdBQUcsVUFBVUQsUUFBa0IsRUFBVztJQUFBO0lBQy9GLE9BQ0NELCtCQUErQixDQUFDQyxRQUFRLENBQUMsSUFDekMsMkJBQUVBLFFBQVEsQ0FBQ2pCLFdBQVcscUZBQXBCLHVCQUFzQlUsRUFBRSxxRkFBeEIsdUJBQTBCQyxnQkFBZ0IscUZBQTNDLHVCQUF3RXhCLE1BQU0sc0ZBQTlFLHVCQUFnRkMsT0FBTyw0REFBeEYsd0JBQ0crQixhQUFhLE1BQUssNkJBQTZCO0VBRXBELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE7RUFPTyxNQUFNQyw0QkFBNEIsR0FBRyxVQUFVSCxRQUEyQyxFQUFXO0lBQUE7SUFDM0csSUFBSVQsVUFBVSxDQUFDUyxRQUFRLENBQUMsSUFBSUQsK0JBQStCLENBQUNDLFFBQVEsQ0FBQyxFQUFFO01BQUE7TUFDdEVBLFFBQVEsOEJBQUdBLFFBQVEsQ0FBQ2pCLFdBQVcsQ0FBQ1UsRUFBRSw0REFBdkIsd0JBQXlCQyxnQkFBMEM7SUFDL0U7SUFDQSxPQUFPLFlBQUVNLFFBQVEsQ0FBNEI5QixNQUFNLCtEQUEzQyxRQUE2Q0MsT0FBTyxvREFBckQsZ0JBQXlFK0IsYUFBYSxNQUFLLCtCQUErQjtFQUNsSSxDQUFDO0VBQUM7RUFFSyxTQUFTRSxxQkFBcUIsQ0FDcENDLGdCQUF5RCxFQUN6REMsTUFBeUMsRUFDcEI7SUFDckIsSUFBSSxPQUFPQSxNQUFNLEtBQUssUUFBUSxFQUFFO01BQUE7TUFDL0IsSUFBSXpDLGdCQUFnQixDQUFDeUMsTUFBTSxDQUFDLHFCQUFJQSxNQUFNLENBQUNDLEtBQUssMENBQVosY0FBY3BDLE9BQU8sRUFBRTtRQUFBO1FBQ3RELE1BQU02QixRQUFRLHFCQUFHTSxNQUFNLENBQUNDLEtBQUssbURBQVosZUFBY3BDLE9BQU87UUFDdEMsSUFBSSxDQUFBNkIsUUFBUSxhQUFSQSxRQUFRLGtEQUFSQSxRQUFRLENBQUVqQixXQUFXLHVGQUFyQix3QkFBdUJDLE1BQU0sNERBQTdCLHdCQUErQndCLGNBQWMsTUFBSzdCLFNBQVMsRUFBRTtVQUNoRSxPQUFPMEIsZ0JBQWdCLENBQUNJLCtCQUErQixDQUFDVCxRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRVUsa0JBQWtCLENBQUM7UUFDdEY7TUFDRCxDQUFDLE1BQU0sSUFBSW5CLFVBQVUsQ0FBQ2UsTUFBTSxDQUFDLEVBQUU7UUFBQTtRQUM5QixJQUFJLENBQUFBLE1BQU0sYUFBTkEsTUFBTSw4Q0FBTkEsTUFBTSxDQUFFdkIsV0FBVyxpRkFBbkIsb0JBQXFCQyxNQUFNLDBEQUEzQixzQkFBNkJ3QixjQUFjLE1BQUs3QixTQUFTLEVBQUU7VUFDOUQsT0FBTzBCLGdCQUFnQixDQUFDSSwrQkFBK0IsQ0FBQ0gsTUFBTSxhQUFOQSxNQUFNLHVCQUFOQSxNQUFNLENBQUVJLGtCQUFrQixDQUFDO1FBQ3BGO01BQ0Q7SUFDRDtJQUNBLE9BQU8vQixTQUFTO0VBQ2pCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBO0VBTUEsU0FBU2dDLHdCQUF3QixDQUFDQyxJQUF3QixFQUFVO0lBQ25FLElBQUlBLElBQUksRUFBRTtNQUNULE9BQU9BLElBQUksQ0FBQ0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHRCxJQUFJLENBQUNFLFNBQVMsQ0FBQyxDQUFDLEVBQUVGLElBQUksQ0FBQ0csV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUU7SUFDOUU7SUFDQSxPQUFPLEVBQUU7RUFDVjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0MsOENBQThDLENBQ3REeEMsTUFBcUIsRUFDckJ5QyxvQkFBNEIsRUFDNUJDLFNBQW9CLEVBQ3BCQyxpQkFBc0MsRUFDaEI7SUFDdEIsSUFBSUQsU0FBUyxLQUFLLGlCQUFpQixFQUFFO01BQUE7TUFDcEMsTUFBTUUsZ0JBQWdCLDBCQUFHNUMsTUFBTSxDQUFDTyxXQUFXLGlGQUFsQixvQkFBb0JVLEVBQUUsMERBQXRCLHNCQUF3QjRCLE1BQU07TUFDdkQsSUFBSUQsZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsZUFBaEJBLGdCQUFnQixDQUFFUixJQUFJLElBQUlyQixVQUFVLENBQUM2QixnQkFBZ0IsQ0FBQ2pELE9BQU8sQ0FBQyxFQUFFO1FBQ25FLE1BQU1tRCw0QkFBNEIsR0FBR0wsb0JBQW9CLEdBQUdHLGdCQUFnQixDQUFDUixJQUFJO1FBQ2pGO1FBQ0FPLGlCQUFpQixDQUFDSSxvQkFBb0IsQ0FBQ0QsNEJBQTRCLENBQUMsR0FBR0YsZ0JBQWdCLENBQUNqRCxPQUFPO01BQ2hHO01BRUEsTUFBTXFELFdBQVcsR0FBR2hELE1BQU0sQ0FBQ2lELFdBQVc7TUFDdEMsSUFBSUQsV0FBVyxhQUFYQSxXQUFXLGVBQVhBLFdBQVcsQ0FBRVosSUFBSSxJQUFJckIsVUFBVSxDQUFDaUMsV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUVyRCxPQUFPLENBQUMsRUFBRTtRQUMxRCxNQUFNdUQsdUJBQXVCLEdBQUdULG9CQUFvQixHQUFHTyxXQUFXLENBQUNaLElBQUk7UUFDdkVPLGlCQUFpQixDQUFDSSxvQkFBb0IsQ0FBQ0csdUJBQXVCLENBQUMsR0FBR0YsV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUVyRCxPQUFPO01BQ3ZGO0lBQ0Q7SUFDQSxPQUFPZ0QsaUJBQWlCO0VBQ3pCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNRLGdDQUFnQyxDQUN4Q1IsaUJBQXNDLEVBQ3RDUyxHQUFXLEVBQ1hDLEtBQWUsRUFDZkMsc0NBQW9ELEVBQzNDO0lBQ1QsSUFBSSxDQUFDWCxpQkFBaUIsQ0FBQ1ksVUFBVSxDQUFDdkUsY0FBYyxDQUFDb0UsR0FBRyxDQUFDLEVBQUU7TUFDdERULGlCQUFpQixDQUFDWSxVQUFVLENBQUNILEdBQUcsQ0FBQyxHQUFHO1FBQUVJLGtCQUFrQixFQUFFSDtNQUFNLENBQUM7TUFDakUsSUFBSUMsc0NBQXNDLEVBQUU7UUFDM0NYLGlCQUFpQixDQUFDWSxVQUFVLENBQUNILEdBQUcsQ0FBQyxDQUFDRSxzQ0FBc0MsR0FBR0Esc0NBQXNDO01BQ2xIO0lBQ0Q7SUFDQSxPQUFPRyxNQUFNLENBQUNDLElBQUksQ0FBQ2YsaUJBQWlCLENBQUNZLFVBQVUsQ0FBQyxDQUFDSSxPQUFPLENBQUNQLEdBQUcsQ0FBQztFQUM5RDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTUSxlQUFlLENBQUNqQixpQkFBc0MsRUFBRVUsS0FBYSxFQUFRO0lBQUE7SUFDckZWLGlCQUFpQixDQUFDa0IsY0FBYyxDQUFDQyxRQUFRLEdBQUcseUJBQUFuQixpQkFBaUIsQ0FBQ2tCLGNBQWMsa0RBQWhDLHNCQUFrQ0MsUUFBUSxHQUNsRixHQUFFbkIsaUJBQWlCLENBQUNrQixjQUFjLENBQUNDLFFBQVMsR0FBRVQsS0FBTSxFQUFDLEdBQ3JELEdBQUVBLEtBQU0sRUFBQztFQUNkOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU1Usd0JBQXdCLENBQ3ZDM0IsSUFBWSxFQUNaWixRQUF1QixFQUN2QkssZ0JBQWtDLEVBQ2xDbUMsVUFBbUIsRUFDbkJ0QixTQUFvQixFQVFFO0lBQUEsSUFQdEJDLGlCQUFzQyx1RUFBRztNQUN4Q1ksVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkUixvQkFBb0IsRUFBRSxDQUFDLENBQUM7TUFDeEJjLGNBQWMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFBQSxJQUNESSxpQkFBaUIsdUVBQUcsS0FBSztJQUFBLElBQ3pCQyxtQkFBbUIsdUVBQUcsS0FBSztJQUUzQixJQUFJOUIsSUFBSSxJQUFJWixRQUFRLEVBQUU7TUFBQTtNQUNyQixJQUFJMkMsVUFBa0I7TUFDdEIsSUFBSUMsa0JBQTBCO01BQzlCO01BQ0EsTUFBTUMsY0FBYyxHQUFHQyxtQ0FBbUMsQ0FBQzlDLFFBQVEsQ0FBQztNQUNwRSxNQUFNK0Msa0JBQWtCLEdBQUdDLCtCQUErQixDQUFDaEQsUUFBUSxDQUFDO01BRXBFLElBQUkwQyxtQkFBbUIsRUFBRTtRQUN4QjtRQUNBQyxVQUFVLEdBQUdoQixnQ0FBZ0MsQ0FBQ1IsaUJBQWlCLEVBQUVQLElBQUksRUFBRVosUUFBUSxDQUFDO1FBQ2hGb0MsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBR3dCLFVBQVcsR0FBRSxDQUFDO1FBQ3JELE9BQU94QixpQkFBaUI7TUFDekI7TUFDQSxNQUFNRixvQkFBb0IsR0FBR04sd0JBQXdCLENBQUNDLElBQUksQ0FBQzs7TUFFM0Q7TUFDQSxNQUFNcUMsZ0JBQWdCLEdBQUdDLDZCQUE2QixDQUFDSCxrQkFBa0IsSUFBSS9DLFFBQVEsQ0FBQztNQUN0RixNQUFNbUQsWUFBWSxHQUFHQyx5QkFBeUIsQ0FBQ0wsa0JBQWtCLElBQUkvQyxRQUFRLENBQUM7O01BRTlFO01BQ0EsTUFBTXpCLG1CQUFtQixHQUFHOEIsZ0JBQWdCLENBQUNnRCxzQkFBc0IsQ0FBQ2hELGdCQUFnQixDQUFDaUQsY0FBYyxFQUFFLENBQUMsQ0FBQ0Msc0JBQXNCLEVBQUU7TUFDL0gsTUFBTUMsMkJBQTJCLEdBQUdDLG9CQUFvQixDQUFXbEYsbUJBQW1CLEVBQUVzRSxjQUFjLElBQUlqQyxJQUFJLENBQUM7TUFDL0csTUFBTThDLCtCQUErQixHQUFHRCxvQkFBb0IsQ0FBV0QsMkJBQTJCLEVBQUVQLGdCQUFnQixDQUFDO01BQ3JILE1BQU1VLGdCQUFnQixHQUFHQyxrQ0FBa0MsQ0FBQ0YsK0JBQStCLENBQUM7TUFFNUYsOEJBQUl2QyxpQkFBaUIsQ0FBQ2tCLGNBQWMsbURBQWhDLHVCQUFrQ0MsUUFBUSxFQUFFO1FBQy9DO1FBQ0FGLGVBQWUsQ0FBQ2pCLGlCQUFpQixFQUFFLElBQUksQ0FBQztRQUN4Q0EsaUJBQWlCLENBQUNrQixjQUFjLENBQUN3QixJQUFJLEdBQUcsSUFBSTtNQUM3QztNQUVBLElBQUlWLFlBQVksSUFBSVEsZ0JBQWdCLEVBQUU7UUFDckMsTUFBTUcsV0FBVyxHQUFHakIsY0FBYyxHQUFHQSxjQUFjLEdBQUdqQyxJQUFJO1FBQzFELE1BQU1tRCxlQUFlLEdBQUdoQixrQkFBa0IsR0FBR0Esa0JBQWtCLEdBQUcvQyxRQUFRO1FBQzFFO1FBQ0EsTUFBTWdFLFdBQVcsR0FBR0MsY0FBYyxDQUFDRixlQUFlLEVBQUVQLDJCQUEyQixDQUFDO1FBQ2hGLElBQUlVLGdCQUF3QjtRQUM1QixRQUFRRixXQUFXO1VBQ2xCLEtBQUssYUFBYTtZQUNqQkUsZ0JBQWdCLEdBQUd2QyxnQ0FBZ0MsQ0FBQ1IsaUJBQWlCLEVBQUV3QyxnQkFBZ0IsRUFBRVIsWUFBWSxFQUFFLGFBQWEsQ0FBQztZQUNySGYsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBRytDLGdCQUFpQixHQUFFLENBQUM7WUFDM0Q7VUFFRCxLQUFLLGtCQUFrQjtZQUN0QnZCLFVBQVUsR0FBR2hCLGdDQUFnQyxDQUFDUixpQkFBaUIsRUFBRTJDLFdBQVcsRUFBRUMsZUFBZSxDQUFDO1lBQzlGRyxnQkFBZ0IsR0FBR3ZDLGdDQUFnQyxDQUNsRFIsaUJBQWlCLEVBQ2pCd0MsZ0JBQWdCLEVBQ2hCUixZQUFZLEVBQ1osa0JBQWtCLENBQ2xCO1lBQ0RmLGVBQWUsQ0FBQ2pCLGlCQUFpQixFQUFHLElBQUd3QixVQUFXLE9BQU11QixnQkFBaUIsSUFBRyxDQUFDO1lBQzdFO1VBRUQsS0FBSyxrQkFBa0I7WUFDdEJ2QixVQUFVLEdBQUdoQixnQ0FBZ0MsQ0FBQ1IsaUJBQWlCLEVBQUUyQyxXQUFXLEVBQUVDLGVBQWUsQ0FBQztZQUM5RkcsZ0JBQWdCLEdBQUd2QyxnQ0FBZ0MsQ0FDbERSLGlCQUFpQixFQUNqQndDLGdCQUFnQixFQUNoQlIsWUFBWSxFQUNaLGtCQUFrQixDQUNsQjtZQUNEZixlQUFlLENBQUNqQixpQkFBaUIsRUFBRyxJQUFHK0MsZ0JBQWlCLE9BQU12QixVQUFXLElBQUcsQ0FBQztZQUM3RTtVQUNEO1lBQ0NBLFVBQVUsR0FBR2hCLGdDQUFnQyxDQUFDUixpQkFBaUIsRUFBRTJDLFdBQVcsRUFBRUMsZUFBZSxDQUFDO1lBQzlGM0IsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBR3dCLFVBQVcsR0FBRSxDQUFDO1lBQ3JEO1FBQU07TUFFVCxDQUFDLE1BQU07UUFBQTtRQUNOO1FBQ0EsTUFBTXdCLGdCQUFnQixHQUFHQyw2QkFBNkIsQ0FBQ3BFLFFBQVEsQ0FBQztRQUNoRSxNQUFNcUUsWUFBWSxHQUFHQyx5QkFBeUIsQ0FBQ3RFLFFBQVEsQ0FBQztRQUN4RCxNQUFNdUUscUJBQXFCLEdBQUdKLGdCQUFnQixJQUFJRSxZQUFZO1FBQzlELE1BQU1HLHdCQUEwRCxHQUMvRCxDQUFBeEUsUUFBUSxhQUFSQSxRQUFRLGtEQUFSQSxRQUFRLENBQUVqQixXQUFXLHVGQUFyQix3QkFBdUIwRixRQUFRLDREQUEvQix3QkFBaUNDLFdBQVcsTUFBSTFFLFFBQVEsYUFBUkEsUUFBUSxrREFBUkEsUUFBUSxDQUFFakIsV0FBVyx1RkFBckIsd0JBQXVCMEYsUUFBUSw0REFBL0Isd0JBQWlDRSxJQUFJO1FBQ3RGLE1BQU1DLGdCQUFnQixHQUFHQyw2QkFBNkIsQ0FBQzdFLFFBQVEsQ0FBQztRQUNoRSxNQUFNOEUsa0JBQWtCLEdBQUc5RSxRQUFRLGFBQVJBLFFBQVEsa0RBQVJBLFFBQVEsQ0FBRWpCLFdBQVcsdUZBQXJCLHdCQUF1QkMsTUFBTSw0REFBN0Isd0JBQStCK0YsUUFBUTtRQUVsRSxJQUFJUixxQkFBcUIsRUFBRTtVQUMxQjVCLFVBQVUsR0FBR2hCLGdDQUFnQyxDQUFDUixpQkFBaUIsRUFBRVAsSUFBSSxFQUFFWixRQUFRLENBQUM7VUFDaEY0QyxrQkFBa0IsR0FBR2pCLGdDQUFnQyxDQUNwRFIsaUJBQWlCLEVBQ2pCRixvQkFBb0IsR0FBR3VELHdCQUF3QixDQUFDNUQsSUFBSSxFQUNwRDRELHdCQUF3QixDQUFDckcsT0FBTyxDQUNoQztVQUNELElBQUlzRSxpQkFBaUIsRUFBRTtZQUN0QkwsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBR3dCLFVBQVcsT0FBTUMsa0JBQW1CLEdBQUUsQ0FBQztVQUMvRSxDQUFDLE1BQU07WUFDTnpCLGlCQUFpQixDQUFDa0IsY0FBYyxDQUFDZ0MsWUFBWSxHQUFHcEQsb0JBQW9CLEdBQUd1RCx3QkFBd0IsQ0FBQzVELElBQUk7VUFDckc7VUFDQSxJQUFJdUQsZ0JBQWdCLEVBQUU7WUFDckJoRCxpQkFBaUIsQ0FBQ2tCLGNBQWMsQ0FBQzJDLFVBQVUsR0FBRyxJQUFJO1VBQ25EO1FBQ0QsQ0FBQyxNQUFNLElBQUlKLGdCQUFnQixJQUFJRSxrQkFBa0IsYUFBbEJBLGtCQUFrQixlQUFsQkEsa0JBQWtCLENBQUUzRyxPQUFPLEVBQUU7VUFDM0Q4Ryx5QkFBeUIsQ0FBQ2pGLFFBQVEsRUFBRW1CLGlCQUFpQixFQUFFUCxJQUFJLEVBQUU2QixpQkFBaUIsQ0FBQztRQUNoRixDQUFDLE1BQU0sSUFDTCxxQkFBQXpDLFFBQVEsQ0FBQzlCLE1BQU0sOEVBQWYsaUJBQWlCQyxPQUFPLDBEQUF4QixzQkFBMEJULEtBQUssZ0RBQW9DLElBQUksdUJBQUNzQyxRQUFRLENBQUM5QixNQUFNLHVFQUFmLGtCQUFpQkMsT0FBTyxrREFBeEIsc0JBQTBCK0csV0FBVyxLQUM5Ryw0QkFBQWxGLFFBQVEsQ0FBQ2pCLFdBQVcsdUZBQXBCLHdCQUFzQlUsRUFBRSx1RkFBeEIsd0JBQTBCQyxnQkFBZ0IsdUZBQTFDLHdCQUE0Q3hCLE1BQU0sdUZBQWxELHdCQUFvREMsT0FBTyw0REFBM0Qsd0JBQTZEVCxLQUFLLGdEQUFvQyxFQUNyRztVQUNEeUgsMEJBQTBCLENBQUNuRixRQUFRLEVBQUVtQixpQkFBaUIsRUFBRVAsSUFBSSxDQUFDO1FBQzlELENBQUMsTUFBTSxJQUFJWixRQUFRLENBQUN0QyxLQUFLLHdEQUE2QyxFQUFFO1VBQUE7VUFDdkUsTUFBTTBILGVBQWUsbUJBQUdwRixRQUFRLENBQUNxRixFQUFFLGlEQUFYLGFBQWFsSCxPQUFPO1VBQzVDLE1BQU1tSCxtQkFBbUIsb0JBQUd0RixRQUFRLENBQUNxRixFQUFFLGtEQUFYLGNBQWF6RSxJQUFJO1VBQzdDK0IsVUFBVSxHQUFHaEIsZ0NBQWdDLENBQzVDUixpQkFBaUIsRUFDakJGLG9CQUFvQixHQUFHQSxvQkFBb0IsR0FBR3FFLG1CQUFtQixHQUFHQSxtQkFBbUIsRUFDdkZGLGVBQWUsQ0FDZjtVQUNEaEQsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBR3dCLFVBQVcsR0FBRSxDQUFDO1FBQ3RELENBQUMsTUFBTSxJQUFJLENBQUNILFVBQVUsRUFBRTtVQUN2QjtVQUNBRyxVQUFVLEdBQUdoQixnQ0FBZ0MsQ0FBQ1IsaUJBQWlCLEVBQUVQLElBQUksRUFBRVosUUFBUSxDQUFDO1VBQ2hGb0MsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBR3dCLFVBQVcsR0FBRSxDQUFDO1VBQ3JELElBQUk2Qix3QkFBd0IsRUFBRTtZQUFBO1lBQzdCckQsaUJBQWlCLENBQUNrQixjQUFjLENBQUNrRCxJQUFJLEdBQUksR0FBRWYsd0JBQXlCLEVBQUMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUl4RSxRQUFRLGFBQVJBLFFBQVEsMENBQVJBLFFBQVEsQ0FBRWpCLFdBQVcsK0VBQXJCLHdCQUF1QjBGLFFBQVEsb0RBQS9CLHdCQUFpQ0MsV0FBVyxFQUFFO2NBQ2pEdkQsaUJBQWlCLENBQUNrQixjQUFjLENBQUMyQyxVQUFVLEdBQUcsSUFBSTtZQUNuRDtVQUNELENBQUMsTUFBTSxJQUFJRixrQkFBa0IsRUFBRTtZQUM5QjNELGlCQUFpQixDQUFDa0IsY0FBYyxDQUFDbUQsUUFBUSxHQUFJLEdBQUVWLGtCQUFtQixFQUFDLENBQUMsQ0FBQztVQUN0RTtRQUNEO01BQ0Q7O01BRUEzRCxpQkFBaUIsR0FBR0gsOENBQThDLENBQUNoQixRQUFRLEVBQUVpQixvQkFBb0IsRUFBRUMsU0FBUyxFQUFFQyxpQkFBaUIsQ0FBQztNQUNoSSxJQUFJYyxNQUFNLENBQUNDLElBQUksQ0FBQ2YsaUJBQWlCLENBQUNJLG9CQUFvQixDQUFDLENBQUNwQyxNQUFNLEdBQUcsQ0FBQyxJQUFJOEMsTUFBTSxDQUFDQyxJQUFJLENBQUNmLGlCQUFpQixDQUFDWSxVQUFVLENBQUMsQ0FBQzVDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0g7UUFDQTtRQUNBd0QsVUFBVSxHQUFHaEIsZ0NBQWdDLENBQUNSLGlCQUFpQixFQUFFUCxJQUFJLEVBQUVaLFFBQVEsQ0FBQztRQUNoRm9DLGVBQWUsQ0FBQ2pCLGlCQUFpQixFQUFHLElBQUd3QixVQUFXLEdBQUUsQ0FBQztNQUN0RDtJQUNEO0lBQ0EsT0FBT3hCLGlCQUFpQjtFQUN6Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQTtFQU1BLFNBQVNzRSx5QkFBeUIsQ0FBQ3BHLE1BQWdDLEVBQXFCO0lBQ3ZGLElBQUlHLFNBQXdCO0lBQzVCLElBQUlELFVBQVUsQ0FBQ0YsTUFBTSxDQUFDLEVBQUU7TUFBQTtNQUN2QkcsU0FBUywyQkFBSUgsTUFBTSxDQUFDTixXQUFXLGtGQUFsQixxQkFBb0JVLEVBQUUsb0ZBQXRCLHNCQUF3QkMsZ0JBQWdCLHFGQUF6Qyx1QkFBc0V4QixNQUFNLDJEQUE1RSx1QkFBOEVDLE9BQXdCO0lBQ25ILENBQUMsTUFBTTtNQUNOcUIsU0FBUyxHQUFHSCxNQUFNO0lBQ25CO0lBQ0EsT0FBT0csU0FBUyxDQUFDVSxhQUFhLGlDQUE0QjtFQUMzRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU2lGLDBCQUEwQixDQUFDbkYsUUFBdUIsRUFBRW1CLGlCQUFzQyxFQUFFUCxJQUFZLEVBQVE7SUFBQTtJQUN4SCxNQUFNOEUsaUJBQWlCLHdCQUFHMUYsUUFBUSxDQUFDOUIsTUFBTSwrRUFBZixrQkFBaUJDLE9BQU8sMERBQXhCLHNCQUEwQm9DLEtBQUssQ0FBQ3BDLE9BQW1CO0lBQzdFLE1BQU13SCxlQUFlLHdCQUFHM0YsUUFBUSxDQUFDOUIsTUFBTSxzREFBZixrQkFBaUJDLE9BQU87SUFDaEQsTUFBTThDLG9CQUFvQixHQUFHTix3QkFBd0IsQ0FBQ0MsSUFBSSxDQUFDO0lBQzNEO0lBQ0EsTUFBTWdGLHdCQUF3Qiw4QkFBRzVGLFFBQVEsQ0FBQ2pCLFdBQVcsdUZBQXBCLHdCQUFzQlUsRUFBRSw0REFBeEIsd0JBQTBCQyxnQkFBZ0I7SUFDM0UsTUFBTWlELFVBQVUsR0FBR2hCLGdDQUFnQyxDQUNsRFIsaUJBQWlCLEVBQ2pCRixvQkFBb0IsR0FBR0Esb0JBQW9CLEdBQUdMLElBQUksR0FBR0EsSUFBSSxFQUN6RGdGLHdCQUF3QixHQUFHNUYsUUFBUSxHQUFHMEYsaUJBQWlCLENBQ3ZEO0lBQ0Q7SUFDQSxJQUFJRCx5QkFBeUIsQ0FBQ0csd0JBQXdCLEdBQUc1RixRQUFRLEdBQUcyRixlQUFlLENBQUMsa0NBQTZCLEVBQUU7TUFDbEg7SUFDRDtJQUNBLE1BQU1yRyxXQUFXLEdBQUdGLHlCQUF5QixDQUFDd0csd0JBQXdCLEdBQUc1RixRQUFRLEdBQUcyRixlQUFlLENBQUM7SUFDcEcsSUFBSTdGLDBCQUEwQixDQUFDUixXQUFXLENBQUMsRUFBRTtNQUM1QyxJQUFJQSxXQUFXLENBQUNuQixPQUFPLEVBQUU7UUFDeEI7UUFDQSxNQUFNMEgsY0FBYyxHQUFHbEUsZ0NBQWdDLENBQ3REUixpQkFBaUIsRUFDakJGLG9CQUFvQixHQUFHQSxvQkFBb0IsR0FBRzNCLFdBQVcsQ0FBQ25CLE9BQU8sQ0FBQzJILElBQUksR0FBR3hHLFdBQVcsQ0FBQ25CLE9BQU8sQ0FBQzJILElBQUksRUFDakd4RyxXQUFXLENBQUNuQixPQUFPLENBQ25CO1FBQ0RnRCxpQkFBaUIsQ0FBQ2tCLGNBQWMsQ0FBQzBELG9CQUFvQixHQUFHekcsV0FBVyxDQUFDc0IsSUFBSTtRQUN4RXdCLGVBQWUsQ0FBQ2pCLGlCQUFpQixFQUFHLElBQUd3QixVQUFXLE1BQUtrRCxjQUFlLEdBQUUsQ0FBQztNQUMxRTtJQUNELENBQUMsTUFBTSxJQUFJRyxvQkFBb0IsQ0FBQ0osd0JBQXdCLEdBQUc1RixRQUFRLEdBQUcwRixpQkFBaUIsQ0FBQyxJQUFJdkYsNEJBQTRCLENBQUNILFFBQVEsQ0FBQyxFQUFFO01BQ25JbUIsaUJBQWlCLENBQUNrQixjQUFjLENBQUNrRCxJQUFJLEdBQUcsR0FBRztJQUM1QyxDQUFDLE1BQU07TUFDTnBFLGlCQUFpQixDQUFDa0IsY0FBYyxDQUFDMEQsb0JBQW9CLEdBQUd6RyxXQUFXO01BQ25FOEMsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBR3dCLFVBQVcsS0FBSXJELFdBQVksRUFBQyxDQUFDO0lBQ3JFO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUzJGLHlCQUF5QixDQUNqQ2pGLFFBQXVCLEVBQ3ZCbUIsaUJBQXNDLEVBQ3RDUCxJQUFZLEVBQ1o2QixpQkFBMEIsRUFDbkI7SUFDUCxNQUFNcUMsa0JBQWtCLEdBQUc5RSxRQUFRLENBQUNqQixXQUFXLENBQUNDLE1BQU0sQ0FBQytGLFFBQVE7SUFDL0QsTUFBTTlELG9CQUFvQixHQUFHTix3QkFBd0IsQ0FBQ0MsSUFBSSxDQUFDO0lBQzNELE1BQU0rQixVQUFVLEdBQUdoQixnQ0FBZ0MsQ0FBQ1IsaUJBQWlCLEVBQUVQLElBQUksRUFBRVosUUFBUSxDQUFDO0lBRXRGLE1BQU1pRyxrQkFBa0IsR0FBR3RFLGdDQUFnQyxDQUMxRFIsaUJBQWlCLEVBQ2pCRixvQkFBb0IsR0FBRzZELGtCQUFrQixDQUFDbEUsSUFBSSxFQUM5Q2tFLGtCQUFrQixDQUFDM0csT0FBTyxDQUMxQjtJQUNELElBQUlzRSxpQkFBaUIsRUFBRTtNQUN0QkwsZUFBZSxDQUFDakIsaUJBQWlCLEVBQUcsSUFBR3dCLFVBQVcsT0FBTXNELGtCQUFtQixHQUFFLENBQUM7SUFDL0UsQ0FBQyxNQUFNO01BQ045RSxpQkFBaUIsQ0FBQ2tCLGNBQWMsQ0FBQ3VDLGdCQUFnQixHQUFHM0Qsb0JBQW9CLEdBQUc2RCxrQkFBa0IsQ0FBQ2xFLElBQUk7SUFDbkc7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU3NGLG1DQUFtQyxDQUNsRDNJLFNBQWlDLEVBQ2pDOEMsZ0JBQWtDLEVBQ2xDYSxTQUFvQixFQU9FO0lBQUE7SUFBQSxJQU50QkMsaUJBQXNDLHVFQUFHO01BQ3hDWSxVQUFVLEVBQUUsQ0FBQyxDQUFDO01BQ2RSLG9CQUFvQixFQUFFLENBQUMsQ0FBQztNQUN4QmMsY0FBYyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUFBLElBQ0Q4RCxVQUFVLHVFQUFHLEtBQUs7SUFFbEIsSUFBSUMsa0JBQWtCLEdBQUcsS0FBSztJQUM5QixRQUFRN0ksU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUVHLEtBQUs7TUFDdkI7TUFDQTtNQUNBO01BQ0E7TUFDQTtRQUNDLElBQUlILFNBQVMsQ0FBQ2dELEtBQUssRUFBRTtVQUNwQixNQUFNUCxRQUFRLEdBQUd6QyxTQUFTLENBQUNnRCxLQUFLO1VBQ2hDNkYsa0JBQWtCLEdBQUdDLG1DQUFtQyxDQUFDOUksU0FBUyxDQUFDO1VBQ25FNEQsaUJBQWlCLEdBQUdvQix3QkFBd0IsQ0FDM0N2QyxRQUFRLENBQUNZLElBQUksRUFDYlosUUFBUSxDQUFDN0IsT0FBTyxFQUNoQmtDLGdCQUFnQixFQUNoQixLQUFLLEVBQ0xhLFNBQVMsRUFDVEMsaUJBQWlCLEVBQ2pCZ0YsVUFBVSxFQUNWQyxrQkFBa0IsQ0FDbEI7VUFDRCxNQUFNbkYsb0JBQW9CLEdBQUdOLHdCQUF3QixDQUFDWCxRQUFRLENBQUNZLElBQUksQ0FBQztVQUNwRU8saUJBQWlCLEdBQUdILDhDQUE4QyxDQUNqRXpELFNBQVMsRUFDVDBELG9CQUFvQixFQUNwQkMsU0FBUyxFQUNUQyxpQkFBaUIsQ0FDakI7UUFDRjtRQUNBO01BRUQ7TUFDQTtRQUNDO01BRUQ7UUFDQyw2QkFBUTVELFNBQVMsQ0FBQ1csTUFBTSwrRUFBaEIsa0JBQWtCQyxPQUFPLDBEQUF6QixzQkFBMkJULEtBQUs7VUFDdkM7WUFDQywwQkFBQUgsU0FBUyxDQUFDVyxNQUFNLENBQUNDLE9BQU8sQ0FBQ21JLElBQUksMkRBQTdCLHVCQUErQkMsT0FBTyxDQUFFQyxjQUFzQyxJQUFLO2NBQ2xGckYsaUJBQWlCLEdBQUcrRSxtQ0FBbUMsQ0FDdERNLGNBQWMsRUFDZG5HLGdCQUFnQixFQUNoQmEsU0FBUyxFQUNUQyxpQkFBaUIsRUFDakIsSUFBSSxDQUNKO1lBQ0YsQ0FBQyxDQUFDO1lBQ0Y7VUFFRDtZQUNDaUYsa0JBQWtCLEdBQUdDLG1DQUFtQyxDQUFDOUksU0FBUyxDQUFDO1lBQ25FNEQsaUJBQWlCLEdBQUdvQix3QkFBd0IsQ0FDM0NoRixTQUFTLENBQUNXLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDb0MsS0FBSyxDQUFDSyxJQUFJLEVBQ25DckQsU0FBUyxFQUNUOEMsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTGEsU0FBUyxFQUNUQyxpQkFBaUIsRUFDakJnRixVQUFVLEVBQ1ZDLGtCQUFrQixDQUNsQjtZQUNEO1VBRUQ7WUFDQyxNQUFNSyxnQkFBZ0IsR0FBR2xKLFNBQVMsQ0FBQ1csTUFBTSxDQUFDQyxPQUFrQjtZQUM1RGlJLGtCQUFrQixHQUFHQyxtQ0FBbUMsQ0FBQzlJLFNBQVMsQ0FBQztZQUNuRTRELGlCQUFpQixHQUFHb0Isd0JBQXdCLENBQzNDaEYsU0FBUyxDQUFDVyxNQUFNLENBQUMyRCxLQUFLLEVBQ3RCNEUsZ0JBQWdCLEVBQ2hCcEcsZ0JBQWdCLEVBQ2hCK0Ysa0JBQWtCLEVBQ2xCbEYsU0FBUyxFQUNUQyxpQkFBaUIsRUFDakJnRixVQUFVLEVBQ1ZDLGtCQUFrQixDQUNsQjtZQUNEO1VBQ0Q7WUFDQztRQUFNO1FBRVI7TUFFRDtRQUNDO0lBQU07SUFHUixPQUFPakYsaUJBQWlCO0VBQ3pCO0VBQUM7RUFFTSxNQUFNdUYsb0JBQW9CLEdBQUcsVUFBVUMsVUFBNkMsRUFBc0I7SUFBQTtJQUNoSCxJQUFJcEgsVUFBVSxDQUFDb0gsVUFBVSxDQUFDLEVBQUU7TUFDM0IsT0FBT0EsVUFBVSxDQUFDQyxJQUFJO0lBQ3ZCO0lBQ0EsSUFBSUMsU0FBNkI7SUFDakMsUUFBUUYsVUFBVSxDQUFDakosS0FBSztNQUN2QjtNQUNBO01BQ0E7TUFDQTtRQUNDbUosU0FBUyxHQUFHbEksU0FBUztRQUNyQjtNQUVEO01BQ0E7TUFDQTtNQUNBO01BQ0E7UUFDQ2tJLFNBQVMsR0FBSUYsVUFBVSxhQUFWQSxVQUFVLGlDQUFWQSxVQUFVLENBQWdCcEcsS0FBSyw2REFBaEMsT0FBa0NwQyxPQUFPLG1EQUF6QyxlQUEyQ3lJLElBQUk7UUFDM0Q7TUFFRDtNQUNBO1FBQ0MsMEJBQUlELFVBQVUsQ0FBQ3pJLE1BQU0sd0VBQWpCLG1CQUFtQkMsT0FBTyxrREFBMUIsc0JBQTRCVCxLQUFLLEVBQUU7VUFDdEMsTUFBTU8sZUFBZSxHQUFHMEksVUFBVSxDQUFDekksTUFBTSxDQUFDQyxPQUFPO1VBQ2pELElBQUlGLGVBQWUsQ0FBQ1AsS0FBSyx3REFBNkMsSUFBSW9DLDBCQUEwQixDQUFDN0IsZUFBZSxDQUFDb0gsRUFBRSxDQUFDLEVBQUU7WUFBQTtZQUN6SHdCLFNBQVMsNEJBQUc1SSxlQUFlLENBQUNvSCxFQUFFLENBQUNsSCxPQUFPLDBEQUExQixzQkFBNEJ5SSxJQUFJO1VBQzdDLENBQUMsTUFBTSxJQUFJM0ksZUFBZSxDQUFDUCxLQUFLLCtDQUFvQyxFQUFFO1lBQUE7WUFDckVtSixTQUFTLEdBQUcsMEJBQUE1SSxlQUFlLENBQUNzQyxLQUFLLG9GQUFyQixzQkFBdUJ1RyxLQUFLLDJEQUE1Qix1QkFBOEJwSixLQUFLLGdDQUFJTyxlQUFlLENBQUNzQyxLQUFLLHFGQUFyQix1QkFBdUJwQyxPQUFPLDJEQUE5Qix1QkFBZ0N5SSxJQUFJO1VBQ3hGLENBQUMsTUFBTTtZQUNOO1lBQ0E7WUFDQUMsU0FBUyxHQUNSRixVQUFVLENBQUN6SSxNQUFNLENBQUNDLE9BQU8sQ0FBQ1QsS0FBSyxLQUFLLGdEQUFnRCxHQUFHaUIsU0FBUyxHQUFHLGFBQWE7VUFDbEg7UUFDRCxDQUFDLE1BQU07VUFDTmtJLFNBQVMsR0FBR2xJLFNBQVM7UUFDdEI7UUFDQTtJQUFNO0lBR1IsT0FBT2tJLFNBQVM7RUFDakIsQ0FBQztFQUFDO0VBQUE7QUFBQSJ9
|
|
657
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNJZGVudGlmaWNhdGlvblRhcmdldCIsImlzQW5ub3RhdGlvbk9mVGVybSIsImhhc0RhdGFQb2ludFRhcmdldCIsImlzRGF0YU1vZGVsT2JqZWN0UGF0aEZvckFjdGlvbldpdGhEaWFsb2ciLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwidGFyZ2V0IiwidGFyZ2V0T2JqZWN0IiwiaXNBY3Rpb25XaXRoRGlhbG9nIiwidW5kZWZpbmVkIiwiYWN0aW9uIiwiQWN0aW9uVGFyZ2V0IiwiYkNyaXRpY2FsIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJJc0FjdGlvbkNyaXRpY2FsIiwicGFyYW1ldGVycyIsImxlbmd0aCIsImdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQiLCJzb3VyY2UiLCJ0YXJnZXRWYWx1ZSIsImlzUHJvcGVydHkiLCJkYXRhUG9pbnQiLCJVSSIsIkRhdGFGaWVsZERlZmF1bHQiLCJUYXJnZXRWYWx1ZSIsIk1heGltdW1WYWx1ZSIsInRvU3RyaW5nIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0IiwicHJvcGVydHkiLCJpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCIsIlZpc3VhbGl6YXRpb24iLCJpc0FQcm9ncmVzc1R5cGVGcm9tRGF0YVBvaW50IiwiZ2V0U2VtYW50aWNPYmplY3RQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm9iamVjdCIsIlZhbHVlIiwiU2VtYW50aWNPYmplY3QiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiX2dldE5hdmlnYXRpb25QYXRoUHJlZml4IiwicGF0aCIsImluY2x1ZGVzIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlIiwibmF2aWdhdGlvblBhdGhQcmVmaXgiLCJ0YWJsZVR5cGUiLCJyZWxhdGVkUHJvcGVydGllcyIsImhpZGRlbkFubm90YXRpb24iLCJIaWRkZW4iLCJoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjcml0aWNhbGl0eSIsIkNyaXRpY2FsaXR5IiwiY3JpdGljYWxpdHlQcm9wZXJ0eVBhdGgiLCJfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleCIsImtleSIsInZhbHVlIiwiZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24iLCJwcm9wZXJ0aWVzIiwiYW5ub3RhdGlvblByb3BlcnR5IiwiT2JqZWN0Iiwia2V5cyIsImluZGV4T2YiLCJfYXBwZW5kVGVtcGxhdGUiLCJleHBvcnRTZXR0aW5ncyIsInRlbXBsYXRlIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIiwiaWdub3JlU2VsZiIsImFkZFVuaXRJblRlbXBsYXRlIiwiaXNBbm5vdGF0ZWRBc0hpZGRlbiIsInZhbHVlSW5kZXgiLCJleHRlcm5hbElkUGF0aCIsImdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHlQYXRoIiwiZXh0ZXJuYWxJZFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eSIsInRleHRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsInRleHRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwiZ2V0Q29udGV4dFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJ0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwidGV4dFJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJ3cmFwIiwicGF0aEZvclRleHQiLCJwcm9wZXJ0eUZvclRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwiZGVzY3JpcHRpb25JbmRleCIsImN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsInVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHkiLCJjdXJyZW5jeU9yVW5pdEFubm90YXRpb24iLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwiVW5pdCIsInRpbWV6b25lUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSIsInRpbWV6b25lQW5ub3RhdGlvbiIsIlRpbWV6b25lIiwiY29sbGVjdEN1cnJlbmN5T3JVbml0UHJvcGVydGllcyIsImNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMiLCJWYWx1ZUZvcm1hdCIsImNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzIiwiY29udGFjdFByb3BlcnR5IiwiZm4iLCJjb250YWN0UHJvcGVydHlQYXRoIiwidW5pdCIsImlzQ3VycmVuY3kiLCJ0aW1lem9uZSIsImdldERhdGFQb2ludFZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsImRhdGFwb2ludFRhcmdldCIsImRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSIsImRhdGFQb2ludEluZGV4IiwibmFtZSIsImRhdGFQb2ludFRhcmdldFZhbHVlIiwiaGFzU3RhdGljUGVyY2VudFVuaXQiLCJ0aW1lem9uZU9yVW9NSW5kZXgiLCJjdXJyZW5jeU9yVW5pdFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwidW5pdE9yQ3VycmVuY3lQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJ1bml0T3JDdXJyZW5jeVJlbGF0aXZlUGF0aCIsImN1cnJlbmN5T3JVb01JbmRleCIsInNjYWxlIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJpc0VtYmVkZGVkIiwiaXNTdGF0aWNhbGx5SGlkZGVuIiwiaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4iLCJEYXRhIiwiZm9yRWFjaCIsImlubmVyRGF0YUZpZWxkIiwiZGF0YUZpZWxkQ29udGFjdCIsImdldERhdGFGaWVsZERhdGFUeXBlIiwib0RhdGFGaWVsZCIsInR5cGUiLCJzRGF0YVR5cGUiLCIkUGF0aCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRGF0YUZpZWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQW5ub3RhdGlvblRlcm0sIERlY2ltYWwsIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUHJpbWl0aXZlVHlwZSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29udGFjdCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbXVuaWNhdGlvblwiO1xuaW1wb3J0IHsgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbXVuaWNhdGlvblwiO1xuaW1wb3J0IHR5cGUge1xuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlLFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdElkZW50aWZpY2F0aW9uLFxuXHRSZWZlcmVuY2VGYWNldFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMsIFZpc3VhbGl6YXRpb25UeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FeHBvcnRTZXR0aW5ncywgVGFibGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBpc0Fubm90YXRpb25PZlRlcm0sIGlzQW5ub3RhdGlvbk9mVHlwZSwgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIGlzUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0aGFzU3RhdGljUGVyY2VudFVuaXRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLCB0eXBlIERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwiLi4vLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERpc3BsYXlNb2RlIH0gZnJvbSBcIi4uLy4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCIuLi9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB7IGFubm90YXRpb25Qcm9wZXJ0eTogUHJvcGVydHk7IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGUgfT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncztcbn07XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0XCIuXG4gKiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCBoYXMgYW4gaW5saW5lIGFjdGlvbiBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcykuaGFzT3duUHJvcGVydHkoXCJBY3Rpb25cIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiLlxuICogaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkXG4pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb247XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiLlxuICogRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkVHlwZXNcIi5cbiAqIERhdGFGaWVsZCBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRUeXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFwiLlxuICogRGF0YUZpZWxkIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZSB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGQoZGF0YUZpZWxkOiBEYXRhRmllbGQgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZCB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/Lmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRmllbGRHcm91cFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHwgUmVmZXJlbmNlRmFjZXQpOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNJZGVudGlmaWNhdGlvblRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHwgUmVmZXJlbmNlRmFjZXQpOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVGVybTxJZGVudGlmaWNhdGlvbj4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UZXJtcy5JZGVudGlmaWNhdGlvbik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGRhdGEgcG9pbnQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZGF0YSBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RhdGFQb2ludFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdHJldHVybiBpc0Fubm90YXRpb25PZlR5cGU8RGF0YVBvaW50PihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YSBtb2RlbCBvYmplY3QgcGF0aCB0YXJnZXRpbmcgYSBkYXRhRmllbGQgZm9yIGFjdGlvbiBvcGVucyB1cCBhIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU1vZGVsT2JqZWN0UGF0aEZvckFjdGlvbldpdGhEaWFsb2coXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz5cbik6IFwiRGlhbG9nXCIgfCBcIk5vbmVcIiB7XG5cdGNvbnN0IHRhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRyZXR1cm4gaXNBY3Rpb25XaXRoRGlhbG9nKGlzRGF0YUZpZWxkRm9yQWN0aW9uKHRhcmdldCkgPyB0YXJnZXQgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgZm9yIGFjdGlvblxuICogQHJldHVybnMgYERpYWxvZ2AgfCBgTm9uZWAgaWYgYSBkaWFsb2cgaXMgbmVlZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbldpdGhEaWFsb2coZGF0YUZpZWxkPzogRGF0YUZpZWxkRm9yQWN0aW9uKTogXCJEaWFsb2dcIiB8IFwiTm9uZVwiIHtcblx0Y29uc3QgYWN0aW9uID0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ7XG5cdGlmIChhY3Rpb24pIHtcblx0XHRjb25zdCBiQ3JpdGljYWwgPSBhY3Rpb24uYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNBY3Rpb25Dcml0aWNhbDtcblx0XHRpZiAoYWN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMSB8fCBiQ3JpdGljYWwpIHtcblx0XHRcdHJldHVybiBcIkRpYWxvZ1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgVGFyZ2V0VmFsdWUgZnJvbSBhIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSB0YXJnZXQgcHJvcGVydHkgb3IgRGF0YVBvaW50XG4gKiBAcmV0dXJucyBUaGUgVGFyZ2V0VmFsdWUgYXMgYSBkZWNpbWFsIG9yIGEgcHJvcGVydHkgcGF0aFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHNvdXJjZTogUHJvcGVydHkgfCBEYXRhUG9pbnRUeXBlKTogUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nIHtcblx0bGV0IHRhcmdldFZhbHVlOiBEZWNpbWFsIHwgdW5kZWZpbmVkIHwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nO1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0Y29uc3QgZGF0YVBvaW50ID0gKHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlO1xuXHRcdHRhcmdldFZhbHVlID0gZGF0YVBvaW50Py5UYXJnZXRWYWx1ZSA/PyBkYXRhUG9pbnQ/Lk1heGltdW1WYWx1ZTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRWYWx1ZSA9IHNvdXJjZS5UYXJnZXRWYWx1ZSA/PyBzb3VyY2UuTWF4aW11bVZhbHVlO1xuXHR9XG5cdGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09IFwibnVtYmVyXCIpIHtcblx0XHRyZXR1cm4gdGFyZ2V0VmFsdWUudG9TdHJpbmcoKTtcblx0fVxuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0VmFsdWUpID8gdGFyZ2V0VmFsdWUgOiBcIjEwMFwiO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIERhdGFQb2ludCB3aXRoaW4gYSBEYXRhRmllbGREZWZhdWx0LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IGhhcyBhIERhdGFQb2ludCB3aXRoaW4gdGhlIERhdGFGaWVsZERlZmF1bHQsIGZhbHNlIGVsc2VcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIGRlZmF1bHQgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZpc3VhbGl6YXRpb24gdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgaXMgYSBSYXRpbmdcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoKHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIEFubm90YXRpb25UZXJtPERhdGFQb2ludD4pXG5cdFx0XHQ/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUmF0aW5nXCJcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwcm9wZXJ0eSB1c2VzIGEgUHJvZ3Jlc3MgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgb3IgYSBkaXJlY3QgRGF0YVBvaW50LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2aXN1YWxpemF0aW9uIGlzIGEgUHJvZ3Jlc3NcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSAmJiBpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSkge1xuXHRcdHByb3BlcnR5ID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjtcblx0fVxuXHRyZXR1cm4gKChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZSk/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUHJvZ3Jlc3NcIjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdFBhdGgoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0b2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHlcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICh0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0aWYgKGlzRGF0YUZpZWxkVHlwZXMob2JqZWN0KSAmJiBvYmplY3QuVmFsdWU/LiR0YXJnZXQpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gb2JqZWN0LlZhbHVlPy4kdGFyZ2V0O1xuXHRcdFx0aWYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHk/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc1Byb3BlcnR5KG9iamVjdCkpIHtcblx0XHRcdGlmIChvYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChvYmplY3Q/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBmb3IgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vXG4gKi9cbmZ1bmN0aW9uIF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRpZiAocGF0aCkge1xuXHRcdHJldHVybiBwYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiBcIlwiO1xuXHR9XG5cdHJldHVybiBcIlwiO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuICpcbiAqIEZvciBlLmcuIElmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFByb3BlcnR5IG9yIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUGF0aFByZWZpeCBOYXZpZ2F0aW9uIHBhdGggcHJlZml4LCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUYWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmZ1bmN0aW9uIF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUoXG5cdHRhcmdldDogUHJpbWl0aXZlVHlwZSxcblx0bmF2aWdhdGlvblBhdGhQcmVmaXg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb24gPSB0YXJnZXQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdFx0aWYgKGhpZGRlbkFubm90YXRpb24/LnBhdGggJiYgaXNQcm9wZXJ0eShoaWRkZW5Bbm5vdGF0aW9uLiR0YXJnZXQpKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBoaWRkZW5Bbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHQvLyBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBhZGRlZCB0byBhZGRpdGlvbmFsUHJvcGVydGllcyBtYXAgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1toaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoXSA9IGhpZGRlbkFubm90YXRpb24uJHRhcmdldDtcblx0XHR9XG5cblx0XHRjb25zdCBjcml0aWNhbGl0eSA9IHRhcmdldC5Dcml0aWNhbGl0eTtcblx0XHRpZiAoY3JpdGljYWxpdHk/LnBhdGggJiYgaXNQcm9wZXJ0eShjcml0aWNhbGl0eT8uJHRhcmdldCkpIHtcblx0XHRcdGNvbnN0IGNyaXRpY2FsaXR5UHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjcml0aWNhbGl0eS5wYXRoO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXNbY3JpdGljYWxpdHlQcm9wZXJ0eVBhdGhdID0gY3JpdGljYWxpdHk/LiR0YXJnZXQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyB0byBwdXNoIHVuaXF1ZSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzXG4gKiBAcGFyYW0ga2V5IFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgcHJvcGVydHksIGRlc2NyaXB0aW9uIHByb3BlcnR5Li4uXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gVGhlIGRpc3BsYXkgbW9kZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiB0ZXh0IGFycmFuZ2VtZW50XG4gKiBAcmV0dXJucyBJbmRleCBhdCB3aGljaCB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlXG4gKi9cbmZ1bmN0aW9uIF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0a2V5OiBzdHJpbmcsXG5cdHZhbHVlOiBQcm9wZXJ0eSxcblx0ZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24/OiBEaXNwbGF5TW9kZVxuKTogbnVtYmVyIHtcblx0aWYgKCFyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzW2tleV0gPSB7IGFubm90YXRpb25Qcm9wZXJ0eTogdmFsdWUgfTtcblx0XHRpZiAoZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24pIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXNba2V5XS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiA9IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykuaW5kZXhPZihrZXkpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIHRvIGFwcGVuZCB0aGUgZXhwb3J0IHNldHRpbmdzIHRlbXBsYXRlIHdpdGggYSBmb3JtYXR0ZWQgdGV4dC5cbiAqXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNcbiAqIEBwYXJhbSB2YWx1ZSBGb3JtYXR0ZWQgdGV4dFxuICovXG5mdW5jdGlvbiBfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGVcblx0XHQ/IGAke3JlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlfSR7dmFsdWV9YFxuXHRcdDogYCR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkncyBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBpZ25vcmVTZWxmIFdoZXRoZXIgdG8gZXhjbHVkZSB0aGUgc2FtZSBwcm9wZXJ0eSBmcm9tIHRoZSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgVHJ1ZSBpZiB0aGUgdW5pdC9jdXJyZW5jeSBwcm9wZXJ0eSBuZWVkcyB0byBiZSBhZGRlZCBpbiB0aGUgZXhwb3J0IHRlbXBsYXRlXG4gKiBAcGFyYW0gaXNBbm5vdGF0ZWRBc0hpZGRlbiBUcnVlIGlmIHRoZSBEYXRhRmllbGQgb3IgdGhlIHByb3BlcnR5IGFyZSBzdGF0aWNhbGx5IGhpZGRlblxuICogQHJldHVybnMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRwYXRoOiBzdHJpbmcsXG5cdHByb3BlcnR5OiBQcmltaXRpdmVUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpZ25vcmVTZWxmOiBib29sZWFuLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7XG5cdFx0cHJvcGVydGllczoge30sXG5cdFx0YWRkaXRpb25hbFByb3BlcnRpZXM6IHt9LFxuXHRcdGV4cG9ydFNldHRpbmdzOiB7fVxuXHR9LFxuXHRhZGRVbml0SW5UZW1wbGF0ZSA9IGZhbHNlLFxuXHRpc0Fubm90YXRlZEFzSGlkZGVuID0gZmFsc2Vcbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAocGF0aCAmJiBwcm9wZXJ0eSkge1xuXHRcdGxldCB2YWx1ZUluZGV4OiBudW1iZXI7XG5cdFx0LyogRVhURVJOQUxJRCAqL1xuXHRcdGNvbnN0IGV4dGVybmFsSWRQYXRoID0gZ2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRcdGNvbnN0IGV4dGVybmFsSWRQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHkocHJvcGVydHkpO1xuXG5cdFx0aWYgKGlzQW5ub3RhdGVkQXNIaWRkZW4pIHtcblx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eVxuXHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcblx0XHR9XG5cdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aCk7XG5cblx0XHQvLyBDaGVjayBmb3IgVGV4dCBhbm5vdGF0aW9uLlxuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChleHRlcm5hbElkUHJvcGVydHkgfHwgcHJvcGVydHkpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkoZXh0ZXJuYWxJZFByb3BlcnR5IHx8IHByb3BlcnR5KTtcblxuXHRcdC8vIGdldCB0aGUgRGF0YU1vZGVsT2JqZWN0UGF0aCBmb3IgdGhlIGNvbHVtblxuXHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpKS5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIGV4dGVybmFsSWRQYXRoIHx8IHBhdGgpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0ZXh0UHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCB0ZXh0UmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCh0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cblx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlKSB7XG5cdFx0XHQvLyBGaWVsZEdyb3VwIHVzZS1jYXNlLiBOZWVkIHRvIGFkZCBlYWNoIEZpZWxkIGluIG5ldyBsaW5lLlxuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBcIlxcblwiKTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLndyYXAgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0ZXh0UHJvcGVydHkgJiYgdGV4dFJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgcGF0aEZvclRleHQgPSBleHRlcm5hbElkUGF0aCA/IGV4dGVybmFsSWRQYXRoIDogcGF0aDtcblx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yVGV4dCA9IGV4dGVybmFsSWRQcm9wZXJ0eSA/IGV4dGVybmFsSWRQcm9wZXJ0eSA6IHByb3BlcnR5O1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIFRleHQgQXJyYW5nZW1lbnQuXG5cdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5Rm9yVGV4dCwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRcdGxldCBkZXNjcmlwdGlvbkluZGV4OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgdGV4dFJlbGF0aXZlUGF0aCwgdGV4dFByb3BlcnR5LCBcIkRlc2NyaXB0aW9uXCIpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske2Rlc2NyaXB0aW9uSW5kZXh9fWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoRm9yVGV4dCwgcHJvcGVydHlGb3JUZXh0KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRleHRSZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHR0ZXh0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcIlZhbHVlRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFwiRGVzY3JpcHRpb25WYWx1ZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgZmllbGQgY29udGFpbmluZyBDdXJyZW5jeSBPciBVbml0IFByb3BlcnRpZXMgb3IgVGltZXpvbmVcblx0XHRcdGNvbnN0IGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGN1cnJlbmN5UHJvcGVydHkgPz8gdW5pdFByb3BlcnR5O1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiA9XG5cdFx0XHRcdHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXG5cdFx0XHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbGxlY3RDdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0cmVsYXRpdmVQYXRoID8/IHBhdGgsXG5cdFx0XHRcdFx0YWRkVW5pdEluVGVtcGxhdGUsXG5cdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0XHRcdGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSxcblx0XHRcdFx0XHRjdXJyZW5jeVByb3BlcnR5XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lUHJvcGVydHkgJiYgdGltZXpvbmVBbm5vdGF0aW9uPy4kdGFyZ2V0KSB7XG5cdFx0XHRcdGNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBhZGRVbml0SW5UZW1wbGF0ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSAmJiAhcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZUZvcm1hdCkgfHxcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCByZWxhdGl2ZVBhdGgpO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZSkge1xuXHRcdFx0XHRjb25zdCBjb250YWN0UHJvcGVydHkgPSBwcm9wZXJ0eS5mbj8uJHRhcmdldDtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5UGF0aCA9IHByb3BlcnR5LmZuPy5wYXRoO1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGNvbnRhY3RQcm9wZXJ0eVBhdGggOiBjb250YWN0UHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdGNvbnRhY3RQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdH0gZWxzZSBpZiAoIWlnbm9yZVNlbGYpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0aWYgKGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXQgPSBgJHtjdXJyZW5jeU9yVW5pdEFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCBjdXJyZW5jeS91bml0XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5KSB7XG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5pc0N1cnJlbmN5ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmVBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGltZXpvbmUgPSBgJHt0aW1lem9uZUFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCB0aW1lem9uZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKHByb3BlcnR5LCBuYXZpZ2F0aW9uUGF0aFByZWZpeCwgdGFibGVUeXBlLCByZWxhdGVkUHJvcGVydGllcyk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKS5sZW5ndGggPiAwICYmIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5IGlmIG5vdCBjb2xsZWN0ZWQgYWxyZWFkeS5cblx0XHRcdC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgYWRkaXRpb25hbFByb3BlcnRpZXMgYXJlIG1hZGUgYXZhaWxhYmxlIG9ubHkgdG8gY29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIFZpc3VhbGl6YXRpb24gb2YgdGhlIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFNvdXJjZSBvZiB0aGUgRGF0YVBvaW50LlxuICogQHJldHVybnMgVGhlIHR5cGUgb2YgVmlzdWFsaXphdGlvbiBvciB1bmRlZmluZWQgaWYgdGhlcmUncyBub25lLlxuICovXG5mdW5jdGlvbiBnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKHNvdXJjZTogUHJvcGVydHkgfCBEYXRhUG9pbnRUeXBlKTogVmlzdWFsaXphdGlvblR5cGUge1xuXHRsZXQgZGF0YVBvaW50OiBEYXRhUG9pbnRUeXBlO1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0ZGF0YVBvaW50ID0gKHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFQb2ludCA9IHNvdXJjZTtcblx0fVxuXHRyZXR1cm4gZGF0YVBvaW50LlZpc3VhbGl6YXRpb24gPz8gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyO1xufVxuXG4vKipcbiAqXHRDb2xsZWN0IHRoZSByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqL1xuZnVuY3Rpb24gY29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLCBwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0Ly8gcGF0aCBtdXN0IG5vdCBiZSB1bmRlZmluZWQsIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGggbWF5IHJldHVybiB1bmRlZmluZWRcblx0aWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCBkYXRhUG9pbnRQcm9wZXJ0eSA9IHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0O1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Ly8gRGF0YVBvaW50IHVzZS1jYXNlIHVzaW5nIERhdGFGaWVsZERlZmF1bHQuXG5cdGNvbnN0IGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFQb2ludFByb3BlcnR5KTtcblx0Ly8gSWYgd2UgaGF2ZSBhIERhdGFQb2ludCB3aXRob3V0IHZpc3VhbGl6YXRpb24sIG9yIGEgTnVtYmVyLCB3ZSBkb24ndCBoYXZlIGEgVGFyZ2V0VmFsdWUvTWF4aW11bVZhbHVlXG5cdGlmIChnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YXBvaW50VGFyZ2V0KSA9PT0gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHRhcmdldFZhbHVlID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFwb2ludFRhcmdldCk7XG5cdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRWYWx1ZSkpIHtcblx0XHRpZiAodGFyZ2V0VmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly9pbiBjYXNlIGl0J3MgYSBkeW5hbWljIHRhcmdldFZhbHVlXG5cdFx0XHRjb25zdCBkYXRhUG9pbnRJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSA6IHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSxcblx0XHRcdFx0dGFyZ2V0VmFsdWUuJHRhcmdldFxuXHRcdFx0KTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWUucGF0aDtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fS97JHtkYXRhUG9pbnRJbmRleH19YCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHkpICYmIGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQocHJvcGVydHkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IFwiJVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWU7XG5cdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdH1cbn1cblxuLyoqXG4gKlx0Q29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSB3aXRoIFRpbWV6b25lLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGguXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgU2hvdWxkIHdlIGFkZCB0aGUgdW5pdCBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICovXG5mdW5jdGlvbiBjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzKFxuXHRwcm9wZXJ0eTogUHJpbWl0aXZlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHBhdGg6IHN0cmluZyxcblx0YWRkVW5pdEluVGVtcGxhdGU6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRjb25zdCB0aW1lem9uZUFubm90YXRpb24gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24uVGltZXpvbmU7XG5cdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXHRjb25zdCB2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblxuXHRjb25zdCB0aW1lem9uZU9yVW9NSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRpbWV6b25lQW5ub3RhdGlvbi5wYXRoLFxuXHRcdHRpbWV6b25lQW5ub3RhdGlvbi4kdGFyZ2V0XG5cdCk7XG5cdGlmIChhZGRVbml0SW5UZW1wbGF0ZSkge1xuXHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fSAgeyR7dGltZXpvbmVPclVvTUluZGV4fX1gKTtcblx0fSBlbHNlIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50aW1lem9uZVByb3BlcnR5ID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyB0aW1lem9uZUFubm90YXRpb24ucGF0aDtcblx0fVxufVxuXG4vKipcbiAqIENvbGxlY3QgdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkgd2l0aCBjdXJyZW5jaWVzIG9yIHVuaXRzLlxuICpcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyIGZvciB0aGUgY29sdW1uLlxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcHJvcGVydHkgcmVsYXRpdmUgcGF0aC5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBTcGVjaWZ5IGlmIHRoZSB1bml0IHNob3VsZCBiZSBhZGRlZCBpbiB0aGUgdGVtcGxhdGUuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSBUaGUgY3VycmVuY3kgb3IgdW5pdCBvZiBtZWFzdXJlIHByb3BlcnR5IGxpbmtlZCB0byB0aGUgY29sdW1uLlxuICogQHBhcmFtIGN1cnJlbmN5UHJvcGVydHkgVGhlIGN1cnJlbmN5IHByb3BlcnR5IGxpbmtlZCB0byB0aGUgY29sdW1uLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0Q3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzKFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuLFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRjdXJyZW5jeU9yVW9NUHJvcGVydHk6IFByb3BlcnR5LFxuXHRjdXJyZW5jeVByb3BlcnR5PzogUHJvcGVydHlcbik6IHZvaWQge1xuXHRjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdGlmIChwcm9wZXJ0eSkge1xuXHRcdGNvbnN0IGN1cnJlbmN5T3JVbml0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgdW5pdE9yQ3VycmVuY3lQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oXG5cdFx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRjdXJyZW5jeU9yVW5pdFByb3BlcnR5UGF0aFxuXHRcdCk7XG5cdFx0Y29uc3QgdW5pdE9yQ3VycmVuY3lSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHVuaXRPckN1cnJlbmN5UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRjb25zdCB2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHJlbGF0aXZlUGF0aCwgcHJvcGVydHkpO1xuXHRcdGNvbnN0IGN1cnJlbmN5T3JVb01JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCB1bml0T3JDdXJyZW5jeVJlbGF0aXZlUGF0aCEsIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSk7XG5cdFx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gIHske2N1cnJlbmN5T3JVb01JbmRleH19YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSA9IHVuaXRPckN1cnJlbmN5UmVsYXRpdmVQYXRoO1xuXHRcdH1cblx0XHRpZiAoY3VycmVuY3lQcm9wZXJ0eSkge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MuaXNDdXJyZW5jeSA9IHRydWU7XG5cdFx0fVxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnNjYWxlID0gcHJvcGVydHkuc2NhbGU7XG5cdH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IHByb3BlcnRpZXMgY29uc3VtZWQgYnkgYSBEYXRhRmllbGQuXG4gKiBUaGlzIGlzIGZvciBwb3B1bGF0aW5nIHRoZSBDb21wbGV4UHJvcGVydHlJbmZvcyBvZiB0aGUgdGFibGUgZGVsZWdhdGUuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgRGF0YUZpZWxkIGZvciB3aGljaCB0aGUgcHJvcGVydGllcyBuZWVkIHRvIGJlIGlkZW50aWZpZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIGlzRW1iZWRkZWQgVHJ1ZSBpZiB0aGUgRGF0YUZpZWxkIGlzIGVtYmVkZGVkIGluIGFub3RoZXIgYW5ub3RhdGlvbiAoc3VjaCBhcyBGaWVsZEdyb3VwKS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhlIERhdGFGaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHtcblx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRhZGRpdGlvbmFsUHJvcGVydGllczoge30sXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IHt9XG5cdH0sXG5cdGlzRW1iZWRkZWQgPSBmYWxzZVxuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdGxldCBpc1N0YXRpY2FsbHlIaWRkZW4gPSBmYWxzZTtcblx0c3dpdGNoIChkYXRhRmllbGQ/LiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRpZiAoZGF0YUZpZWxkLlZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZGF0YUZpZWxkLlZhbHVlO1xuXHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRwcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LiR0YXJnZXQsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocHJvcGVydHkucGF0aCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShcblx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXgsXG5cdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRzd2l0Y2ggKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlKSB7XG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGU6XG5cdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LkRhdGE/LmZvckVhY2goKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0XHRpbm5lckRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5WYWx1ZS5wYXRoLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRpc0VtYmVkZGVkLFxuXHRcdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGU6XG5cdFx0XHRcdFx0Y29uc3QgZGF0YUZpZWxkQ29udGFjdCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCBhcyBDb250YWN0O1xuXHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCk7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LnZhbHVlLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkQ29udGFjdCxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4sXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhRmllbGREYXRhVHlwZSA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoaXNQcm9wZXJ0eShvRGF0YUZpZWxkKSkge1xuXHRcdHJldHVybiBvRGF0YUZpZWxkLnR5cGU7XG5cdH1cblx0bGV0IHNEYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRzd2l0Y2ggKG9EYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHNEYXRhVHlwZSA9IChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGlmIChvRGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdFx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gb0RhdGFGaWVsZC5UYXJnZXQuJHRhcmdldDtcblx0XHRcdFx0aWYgKGRhdGFGaWVsZFRhcmdldC4kVHlwZSA9PT0gQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZSAmJiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihkYXRhRmllbGRUYXJnZXQuZm4pKSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gZGF0YUZpZWxkVGFyZ2V0LmZuLiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkVGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gZGF0YUZpZWxkVGFyZ2V0LlZhbHVlPy4kUGF0aD8uJFR5cGUgfHwgZGF0YUZpZWxkVGFyZ2V0LlZhbHVlPy4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGUuZy4gRmllbGRHcm91cCBvciBDaGFydFxuXHRcdFx0XHRcdC8vIEZpZWxkR3JvdXAgUHJvcGVydGllcyBoYXZlIG5vIHR5cGUsIHNvIHdlIGRlZmluZSBpdCBhcyBhIGJvb2xlYW4gdHlwZSB0byBwcmV2ZW50IGV4Y2VwdGlvbnMgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgd2lkdGhcblx0XHRcdFx0XHRzRGF0YVR5cGUgPVxuXHRcdFx0XHRcdFx0b0RhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydERlZmluaXRpb25UeXBlXCIgPyB1bmRlZmluZWQgOiBcIkVkbS5Cb29sZWFuXCI7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNEYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIHNEYXRhVHlwZTtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBOENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsNEJBQTRCLENBQUNDLFNBQWlDLEVBQWdEO0lBQzdILE9BQVFBLFNBQVMsQ0FBcUNDLGNBQWMsQ0FBQyxRQUFRLENBQUM7RUFDL0U7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQTtFQU9PLFNBQVNDLHdCQUF3QixDQUN2Q0YsU0FBa0UsRUFDNUI7SUFDdEMsT0FBTyxDQUFBQSxTQUFTLGFBQVRBLFNBQVMsdUJBQVRBLFNBQVMsQ0FBRUcsS0FBSyx5REFBNkM7RUFDckU7RUFBQztFQUVNLFNBQVNDLG9CQUFvQixDQUFDSixTQUE2QyxFQUFtQztJQUNwSCxPQUFPLENBQUFBLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFRyxLQUFLLHFEQUF5QztFQUNqRTs7RUFFQTtBQUNBO0FBQ0E7QUFD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
|