@sapui5/sap.fe.core 1.102.0 → 1.103.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 +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +62 -26
- package/src/sap/fe/core/AppComponent.ts +56 -40
- package/src/sap/fe/core/AppStateHandler.js +10 -10
- package/src/sap/fe/core/AppStateHandler.ts +9 -9
- package/src/sap/fe/core/BaseController.js +11 -9
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +236 -109
- package/src/sap/fe/core/CommonUtils.ts +252 -136
- package/src/sap/fe/core/ExtensionAPI.js +24 -27
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +4 -4
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -6
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +8 -8
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
- package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
- package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +22 -22
- package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
- package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
- package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +11 -25
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +2 -2
- package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
- package/src/sap/fe/core/controls/FilterBar.js +6 -2
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
- package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
- package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
- package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
- package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
- package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
- package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
- package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
- package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
- package/src/sap/fe/core/converters/helpers/ID.js +46 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
- package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
- package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
- package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +49 -35
- package/src/sap/fe/core/messagebundle_ar.properties +13 -5
- package/src/sap/fe/core/messagebundle_bg.properties +13 -5
- package/src/sap/fe/core/messagebundle_ca.properties +13 -5
- package/src/sap/fe/core/messagebundle_cs.properties +13 -5
- package/src/sap/fe/core/messagebundle_cy.properties +14 -6
- package/src/sap/fe/core/messagebundle_da.properties +13 -5
- package/src/sap/fe/core/messagebundle_de.properties +15 -7
- package/src/sap/fe/core/messagebundle_el.properties +14 -6
- package/src/sap/fe/core/messagebundle_en.properties +9 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
- package/src/sap/fe/core/messagebundle_es.properties +13 -5
- package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
- package/src/sap/fe/core/messagebundle_et.properties +13 -5
- package/src/sap/fe/core/messagebundle_fi.properties +14 -6
- package/src/sap/fe/core/messagebundle_fr.properties +14 -6
- package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
- package/src/sap/fe/core/messagebundle_hi.properties +14 -6
- package/src/sap/fe/core/messagebundle_hr.properties +14 -6
- package/src/sap/fe/core/messagebundle_hu.properties +13 -5
- package/src/sap/fe/core/messagebundle_id.properties +13 -5
- package/src/sap/fe/core/messagebundle_it.properties +33 -25
- package/src/sap/fe/core/messagebundle_iw.properties +13 -5
- package/src/sap/fe/core/messagebundle_ja.properties +14 -6
- package/src/sap/fe/core/messagebundle_kk.properties +13 -5
- package/src/sap/fe/core/messagebundle_ko.properties +13 -5
- package/src/sap/fe/core/messagebundle_lt.properties +13 -5
- package/src/sap/fe/core/messagebundle_lv.properties +14 -6
- package/src/sap/fe/core/messagebundle_ms.properties +13 -5
- package/src/sap/fe/core/messagebundle_nl.properties +13 -5
- package/src/sap/fe/core/messagebundle_no.properties +13 -5
- package/src/sap/fe/core/messagebundle_pl.properties +13 -5
- package/src/sap/fe/core/messagebundle_pt.properties +13 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
- package/src/sap/fe/core/messagebundle_ro.properties +13 -5
- package/src/sap/fe/core/messagebundle_ru.properties +13 -5
- package/src/sap/fe/core/messagebundle_sh.properties +13 -5
- package/src/sap/fe/core/messagebundle_sk.properties +13 -5
- package/src/sap/fe/core/messagebundle_sl.properties +17 -9
- package/src/sap/fe/core/messagebundle_sv.properties +14 -6
- package/src/sap/fe/core/messagebundle_th.properties +13 -5
- package/src/sap/fe/core/messagebundle_tr.properties +13 -5
- package/src/sap/fe/core/messagebundle_uk.properties +13 -5
- package/src/sap/fe/core/messagebundle_vi.properties +13 -5
- package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
- package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
- package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +10 -9
- package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +148 -93
- package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
- package/src/sap/fe/core/type/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -28,15 +28,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
28
28
|
* @name sap.fe.core.actions.draft#createDraftFromActiveDocument
|
|
29
29
|
* @memberof sap.fe.core.actions.draft
|
|
30
30
|
* @static
|
|
31
|
-
* @param
|
|
32
|
-
* @param
|
|
33
|
-
* @param
|
|
34
|
-
* @param
|
|
35
|
-
* @param
|
|
36
|
-
* @param
|
|
37
|
-
* @param
|
|
38
|
-
* @param
|
|
39
|
-
* @returns
|
|
31
|
+
* @param oContext Context of the active document for the new draft
|
|
32
|
+
* @param oAppComponent The AppComponent
|
|
33
|
+
* @param mParameters The parameters
|
|
34
|
+
* @param [mParameters.oView] The view
|
|
35
|
+
* @param [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
|
|
36
|
+
* @param [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
|
|
37
|
+
* @param [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
|
|
38
|
+
* @param [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
|
|
39
|
+
* @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
40
40
|
* @private
|
|
41
41
|
* @ui5-restricted
|
|
42
42
|
*/
|
|
@@ -49,14 +49,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
49
49
|
/**
|
|
50
50
|
* Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
|
|
51
51
|
*
|
|
52
|
-
* @param
|
|
53
|
-
* @returns
|
|
52
|
+
* @param bOverwrite Overwrite the change or not
|
|
53
|
+
* @returns Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
|
|
54
54
|
*/
|
|
55
55
|
function overwriteOnDemand(bOverwrite) {
|
|
56
56
|
if (bOverwrite) {
|
|
57
57
|
//Overwrite existing changes
|
|
58
58
|
var oModel = oContext.getModel();
|
|
59
|
-
var draftDataContext = oModel.bindContext(oContext.getPath()
|
|
59
|
+
var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
|
|
60
60
|
var oResourceBundle;
|
|
61
61
|
return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
|
|
62
62
|
oResourceBundle = _oResourceBundle;
|
|
@@ -83,7 +83,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
return Promise.reject(new Error("Draft creation aborted for document: "
|
|
86
|
+
return Promise.reject(new Error("Draft creation aborted for document: ".concat(oContext.getPath())));
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
function showMessageBox(sUnsavedChangesMsg) {
|
|
@@ -106,7 +106,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
106
106
|
text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
|
|
107
107
|
press: function () {
|
|
108
108
|
oDialog.close();
|
|
109
|
-
reject("Draft creation aborted for document: "
|
|
109
|
+
reject("Draft creation aborted for document: ".concat(oContext.getPath()));
|
|
110
110
|
}
|
|
111
111
|
}),
|
|
112
112
|
afterClose: function () {
|
|
@@ -129,7 +129,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
129
129
|
var bExecute = mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true;
|
|
130
130
|
|
|
131
131
|
if (!bExecute) {
|
|
132
|
-
throw new Error("Draft creation was aborted by extension for document: "
|
|
132
|
+
throw new Error("Draft creation was aborted by extension for document: ".concat(oContext.getPath()));
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
var openingSiblingContext = false;
|
|
@@ -160,7 +160,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
160
160
|
}();
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
var oDraftContext
|
|
163
|
+
var oDraftContext;
|
|
164
164
|
|
|
165
165
|
var _temp = _catch(function () {
|
|
166
166
|
return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow)).then(function (_draft$executeDraftEd) {
|
|
@@ -169,6 +169,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
169
169
|
}, function (oResponse) {
|
|
170
170
|
return function () {
|
|
171
171
|
if (bRunPreserveChangesFlow && oResponse.status === 409) {
|
|
172
|
+
messageHandling.removeBoundTransitionMessages();
|
|
172
173
|
messageHandling.removeUnboundTransitionMessages();
|
|
173
174
|
return function () {
|
|
174
175
|
if (ActivitySync.isCollaborationEnabled(mParameters.oView)) {
|
|
@@ -185,10 +186,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
185
186
|
});
|
|
186
187
|
}
|
|
187
188
|
}();
|
|
188
|
-
} else {
|
|
189
|
-
|
|
190
|
-
throw new Error(oResponse);
|
|
191
|
-
}
|
|
189
|
+
} else if (!(oResponse && oResponse.canceled)) {
|
|
190
|
+
throw new Error(oResponse);
|
|
192
191
|
}
|
|
193
192
|
}();
|
|
194
193
|
});
|
|
@@ -210,12 +209,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
210
209
|
* @name sap.fe.core.actions.draft#activateDocument
|
|
211
210
|
* @memberof sap.fe.core.actions.draft
|
|
212
211
|
* @static
|
|
213
|
-
* @param
|
|
214
|
-
* @param
|
|
215
|
-
* @param
|
|
216
|
-
* @param
|
|
217
|
-
* @param
|
|
218
|
-
* @returns
|
|
212
|
+
* @param oContext Context of the active document for the new draft
|
|
213
|
+
* @param oAppComponent The AppComponent
|
|
214
|
+
* @param mParameters The parameters
|
|
215
|
+
* @param [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
|
|
216
|
+
* @param [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
|
|
217
|
+
* @returns Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
219
218
|
* @private
|
|
220
219
|
* @ui5-restricted
|
|
221
220
|
*/
|
|
@@ -225,9 +224,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
225
224
|
* This method creates a sibling context for a subobject page and calculates a sibling path for all intermediate paths
|
|
226
225
|
* between the object page and the subobject page.
|
|
227
226
|
*
|
|
228
|
-
* @param
|
|
229
|
-
* @param
|
|
230
|
-
* @returns
|
|
227
|
+
* @param rootCurrentContext The context for the root of the draft
|
|
228
|
+
* @param rightmostCurrentContext The context of the subobject page
|
|
229
|
+
* @returns The siblingInformation object
|
|
231
230
|
*/
|
|
232
231
|
var computeSiblingInformation = function (rootCurrentContext, rightmostCurrentContext) {
|
|
233
232
|
try {
|
|
@@ -258,7 +257,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
258
257
|
var canonicalPathPromises = segments.map(function (segment) {
|
|
259
258
|
currentPath += "/".concat(segment);
|
|
260
259
|
oldPaths.unshift(currentPath);
|
|
261
|
-
var siblingContext = model.bindContext(currentPath
|
|
260
|
+
var siblingContext = model.bindContext("".concat(currentPath, "/SiblingEntity")).getBoundContext();
|
|
262
261
|
return siblingContext.requestCanonicalPath();
|
|
263
262
|
}); // //////////////////////////////////////////////////////////////////
|
|
264
263
|
// 3. Reconstruct the full paths from canonical paths (for path mapping)
|
|
@@ -314,18 +313,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
314
313
|
|
|
315
314
|
/**
|
|
316
315
|
* Callback to approve or reject the creation of a draft
|
|
316
|
+
*
|
|
317
317
|
* @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
|
|
318
318
|
* @function
|
|
319
319
|
* @static
|
|
320
320
|
* @abstract
|
|
321
321
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
322
322
|
* @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
|
|
323
|
-
*
|
|
324
323
|
* @private
|
|
325
324
|
*/
|
|
326
325
|
|
|
327
326
|
/**
|
|
328
327
|
* Callback after a draft was successully created
|
|
328
|
+
*
|
|
329
329
|
* @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
|
|
330
330
|
* @function
|
|
331
331
|
* @static
|
|
@@ -333,21 +333,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
333
333
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
|
|
334
334
|
* @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
|
|
335
335
|
* @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
|
|
336
|
-
*
|
|
337
336
|
* @private
|
|
338
337
|
*/
|
|
339
338
|
|
|
340
339
|
/**
|
|
341
340
|
* Callback to approve or reject overwriting an unsaved draft of another user
|
|
341
|
+
*
|
|
342
342
|
* @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
|
|
343
343
|
* @function
|
|
344
344
|
* @public
|
|
345
345
|
* @static
|
|
346
346
|
* @abstract
|
|
347
|
-
*
|
|
348
347
|
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
349
348
|
* @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
|
|
350
|
-
*
|
|
351
349
|
* @ui5-restricted
|
|
352
350
|
*/
|
|
353
351
|
|
|
@@ -374,9 +372,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
374
372
|
/**
|
|
375
373
|
* Determines action name for a draft operation.
|
|
376
374
|
*
|
|
377
|
-
* @param
|
|
378
|
-
* @param
|
|
379
|
-
* @returns
|
|
375
|
+
* @param oContext The context that should be bound to the operation
|
|
376
|
+
* @param sOperation The operation name
|
|
377
|
+
* @returns The name of the draft operation
|
|
380
378
|
*/
|
|
381
379
|
|
|
382
380
|
(function (NavigationType) {
|
|
@@ -388,27 +386,27 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
388
386
|
var oModel = oContext.getModel(),
|
|
389
387
|
oMetaModel = oModel.getMetaModel(),
|
|
390
388
|
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
391
|
-
return oMetaModel.getObject(sEntitySetPath
|
|
389
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "@com.sap.vocabularies.Common.v1.DraftRoot/").concat(sOperation));
|
|
392
390
|
}
|
|
393
391
|
/**
|
|
394
392
|
* Creates an operation context binding for the given context and operation.
|
|
395
393
|
*
|
|
396
|
-
* @param
|
|
397
|
-
* @param
|
|
394
|
+
* @param oContext The context that should be bound to the operation
|
|
395
|
+
* @param sOperation The operation (action or function import)
|
|
398
396
|
* @param oOptions Options to create the operation context
|
|
399
|
-
* @returns
|
|
397
|
+
* @returns The context binding of the bound operation
|
|
400
398
|
*/
|
|
401
399
|
|
|
402
400
|
|
|
403
401
|
function createOperation(oContext, sOperation, oOptions) {
|
|
404
402
|
var sOperationName = getActionName(oContext, sOperation);
|
|
405
|
-
return oContext.getModel().bindContext(sOperationName
|
|
403
|
+
return oContext.getModel().bindContext("".concat(sOperationName, "(...)"), oContext, oOptions);
|
|
406
404
|
}
|
|
407
405
|
/**
|
|
408
406
|
* Check if optional draft prepare action exists.
|
|
409
407
|
*
|
|
410
|
-
* @param
|
|
411
|
-
* @returns
|
|
408
|
+
* @param oContext The context that should be bound to the operation
|
|
409
|
+
* @returns True if a a prepare action exists
|
|
412
410
|
*/
|
|
413
411
|
|
|
414
412
|
|
|
@@ -419,9 +417,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
419
417
|
* Creates a new draft from an active document.
|
|
420
418
|
*
|
|
421
419
|
* @function
|
|
422
|
-
* @param
|
|
423
|
-
* @param
|
|
424
|
-
* @returns
|
|
420
|
+
* @param oContext Context for which the action should be performed
|
|
421
|
+
* @param bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
|
|
422
|
+
* @returns Resolve function returns the context of the operation
|
|
425
423
|
* @private
|
|
426
424
|
* @ui5-restricted
|
|
427
425
|
*/
|
|
@@ -451,10 +449,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
451
449
|
* Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
|
|
452
450
|
*
|
|
453
451
|
* @function
|
|
454
|
-
* @param
|
|
455
|
-
* @param
|
|
456
|
-
* @param
|
|
457
|
-
* @returns
|
|
452
|
+
* @param oContext Context for which the action should be performed
|
|
453
|
+
* @param oAppComponent The AppComponent
|
|
454
|
+
* @param [sGroupId] The optional batch group in which the operation is to be executed
|
|
455
|
+
* @returns Resolve function returns the context of the operation
|
|
458
456
|
* @private
|
|
459
457
|
* @ui5-restricted
|
|
460
458
|
*/
|
|
@@ -478,9 +476,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
478
476
|
}).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
|
|
479
477
|
function () {
|
|
480
478
|
if (bHasPrepareAction) {
|
|
481
|
-
var
|
|
479
|
+
var actionName = getActionName(oContext, draftOperations.PREPARE),
|
|
482
480
|
oSideEffectsService = oAppComponent.getSideEffectsService(),
|
|
483
|
-
oBindingParameters = oSideEffectsService.getODataActionSideEffects(
|
|
481
|
+
oBindingParameters = oSideEffectsService.getODataActionSideEffects(actionName, oContext),
|
|
484
482
|
aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
|
|
485
483
|
|
|
486
484
|
if (aTargetPaths && aTargetPaths.length > 0) {
|
|
@@ -504,9 +502,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
504
502
|
* Execute a preparation action.
|
|
505
503
|
*
|
|
506
504
|
* @function
|
|
507
|
-
* @param
|
|
508
|
-
* @param
|
|
509
|
-
* @returns
|
|
505
|
+
* @param oContext Context for which the action should be performed
|
|
506
|
+
* @param groupId The optional batch group in which we want to execute the operation
|
|
507
|
+
* @returns Resolve function returns the context of the operation
|
|
510
508
|
* @private
|
|
511
509
|
* @ui5-restricted
|
|
512
510
|
*/
|
|
@@ -531,8 +529,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
531
529
|
* Determines the message path for a context.
|
|
532
530
|
*
|
|
533
531
|
* @function
|
|
534
|
-
* @param
|
|
535
|
-
* @returns
|
|
532
|
+
* @param oContext Context for which the path shall be determined
|
|
533
|
+
* @returns Message path, empty if not annotated
|
|
536
534
|
* @private
|
|
537
535
|
* @ui5-restricted
|
|
538
536
|
*/
|
|
@@ -542,15 +540,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
542
540
|
var oModel = oContext.getModel(),
|
|
543
541
|
oMetaModel = oModel.getMetaModel(),
|
|
544
542
|
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
545
|
-
return oMetaModel.getObject(sEntitySetPath
|
|
543
|
+
return oMetaModel.getObject("".concat(sEntitySetPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
546
544
|
}
|
|
547
545
|
/**
|
|
548
546
|
* Requests the messages if annotated for a given context.
|
|
549
547
|
*
|
|
550
548
|
* @function
|
|
551
|
-
* @param
|
|
552
|
-
* @param
|
|
553
|
-
* @returns
|
|
549
|
+
* @param oContext Context for which the messages shall be requested
|
|
550
|
+
* @param oSideEffectsService Service for the SideEffects on SAP Fiori elements
|
|
551
|
+
* @returns Promise which is resolved once messages were requested
|
|
554
552
|
* @private
|
|
555
553
|
* @ui5-restricted
|
|
556
554
|
*/
|
|
@@ -571,8 +569,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
571
569
|
* Executes discard of a draft function using HTTP Post.
|
|
572
570
|
*
|
|
573
571
|
* @function
|
|
574
|
-
* @param
|
|
575
|
-
* @returns
|
|
572
|
+
* @param oContext Context for which the action should be performed
|
|
573
|
+
* @returns Resolve function returns the context of the operation
|
|
576
574
|
* @private
|
|
577
575
|
* @ui5-restricted
|
|
578
576
|
*/
|
|
@@ -602,7 +600,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
602
600
|
|
|
603
601
|
return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
|
|
604
602
|
if (!bExecute) {
|
|
605
|
-
return Promise.reject(new Error("Activation of the document was aborted by extension for document: "
|
|
603
|
+
return Promise.reject(new Error("Activation of the document was aborted by extension for document: ".concat(oContext.getPath())));
|
|
606
604
|
}
|
|
607
605
|
|
|
608
606
|
if (!hasPrepareAction(oContext)) {
|
|
@@ -635,9 +633,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
635
633
|
* @name sap.fe.core.actions.draft#deleteDraft
|
|
636
634
|
* @memberof sap.fe.core.actions.draft
|
|
637
635
|
* @static
|
|
638
|
-
* @param
|
|
636
|
+
* @param oContext Context of the document to be discarded
|
|
639
637
|
* @private
|
|
640
|
-
* @returns
|
|
638
|
+
* @returns A Promise resolved when the context is deleted
|
|
641
639
|
* @ui5-restricted
|
|
642
640
|
*/
|
|
643
641
|
|
|
@@ -675,7 +673,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
675
673
|
function processDataLossOrDraftDiscardConfirmation(fnProcessFunction, fnCancelFunction, oContext, oController, bSkipBindingToView) {
|
|
676
674
|
var navigationType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : NavigationType.BackNavigation;
|
|
677
675
|
var oModel = oContext.getModel();
|
|
678
|
-
var draftDataContext = oModel.bindContext(oContext.getPath()
|
|
676
|
+
var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
|
|
679
677
|
var collaborationConnected = ActivitySync.isConnected(oController.getView());
|
|
680
678
|
var processFunctionForDrafts = !collaborationConnected ? fnProcessFunction : function () {
|
|
681
679
|
ActivitySync.disconnect(oController.getView());
|
|
@@ -701,61 +699,55 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
701
699
|
} else {
|
|
702
700
|
processFunctionForDrafts();
|
|
703
701
|
}
|
|
704
|
-
} else {
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
702
|
+
} else if (!oContext.getObject().HasActiveEntity) {
|
|
703
|
+
// There is no active entity so we are editing either newly created data or
|
|
704
|
+
// a draft which has never been saved to active version
|
|
705
|
+
// Since we want to react differently in the two situations, we have to check the
|
|
706
|
+
// dirty state
|
|
707
|
+
if (EditState.isEditStateDirty()) {
|
|
708
|
+
// In this case data is being newly created and then we always want to
|
|
709
|
+
// show the dataloss dialog on navigation
|
|
710
|
+
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
711
|
+
} else {
|
|
712
|
+
// We are editing a draft which has been created earlier but never saved to active
|
|
713
|
+
// version and since the edit state is not dirty, there have been no user changes
|
|
714
|
+
// so in this case we want to silently navigate and do nothing
|
|
715
|
+
processFunctionForDrafts();
|
|
716
|
+
}
|
|
717
|
+
} else if (draftAdminData.CreationDateTime === draftAdminData.LastChangeDateTime) {
|
|
718
|
+
// We are editing a draft for an existing active entity
|
|
719
|
+
// The CreationDateTime and LastChangeDateTime are equal, so this draft was
|
|
720
|
+
// never saved before, hence we're currently editing a newly created draft for
|
|
721
|
+
// an existing active entity for the first time.
|
|
722
|
+
// Also there have so far been no changes made to the draft and in this
|
|
723
|
+
// case we want to silently navigate and delete the draftin case of a back
|
|
724
|
+
// navigation but in case of a forward navigation we want to silently keep it!
|
|
725
|
+
if (navigationType === NavigationType.BackNavigation) {
|
|
726
|
+
var mParameters = {
|
|
727
|
+
skipDiscardPopover: true
|
|
728
|
+
};
|
|
729
|
+
oController.editFlow.cancelDocument(oContext, mParameters).then(function () {
|
|
718
730
|
processFunctionForDrafts();
|
|
719
|
-
}
|
|
731
|
+
}).catch(function (error) {
|
|
732
|
+
Log.error("Error while canceling the document", error);
|
|
733
|
+
});
|
|
720
734
|
} else {
|
|
721
|
-
//
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
// never saved before, hence we're currently editing a newly created draft for
|
|
725
|
-
// an existing active entity for the first time.
|
|
726
|
-
// Also there have so far been no changes made to the draft and in this
|
|
727
|
-
// case we want to silently navigate and delete the draft in case of a back
|
|
728
|
-
// navigation but in case of a forward navigation we want to silently keep it!
|
|
729
|
-
if (navigationType === NavigationType.BackNavigation) {
|
|
730
|
-
var mParameters = {
|
|
731
|
-
skipDiscardPopover: true
|
|
732
|
-
};
|
|
733
|
-
oController.editFlow.cancelDocument(oContext, mParameters).then(function () {
|
|
734
|
-
processFunctionForDrafts();
|
|
735
|
-
}).catch(function (error) {
|
|
736
|
-
Log.error("Error while canceling the document", error);
|
|
737
|
-
});
|
|
738
|
-
} else {
|
|
739
|
-
// In case of a forward navigation we silently keep the draft and only
|
|
740
|
-
// execute the followup function.
|
|
741
|
-
processFunctionForDrafts();
|
|
742
|
-
}
|
|
743
|
-
} else {
|
|
744
|
-
// The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
|
|
745
|
-
// an existing draft and need to distinguish depending on if any changes
|
|
746
|
-
// have been made in the current editing session or not
|
|
747
|
-
if (EditState.isEditStateDirty()) {
|
|
748
|
-
// Changes have been made in the current editing session so we want
|
|
749
|
-
// to show the dataloss dialog and let the user decide
|
|
750
|
-
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
751
|
-
} else {
|
|
752
|
-
// The user started editing the existing draft but did not make any changes
|
|
753
|
-
// in the current editing session, so in this case we do not want
|
|
754
|
-
// to show the dataloss dialog but just keep the draft
|
|
755
|
-
processFunctionForDrafts();
|
|
756
|
-
}
|
|
757
|
-
}
|
|
735
|
+
// In case of a forward navigation we silently keep the draft and only
|
|
736
|
+
// execute the followup function.
|
|
737
|
+
processFunctionForDrafts();
|
|
758
738
|
}
|
|
739
|
+
} else if (EditState.isEditStateDirty()) {
|
|
740
|
+
// The CreationDateTime and LastChangeDateTime are NOT equal, so we are currently editing
|
|
741
|
+
// an existing draft and need to distinguish depending on if any changes
|
|
742
|
+
// have been made in the current editing session or not
|
|
743
|
+
// Changes have been made in the current editing session so we want
|
|
744
|
+
// to show the dataloss dialog and let the user decide
|
|
745
|
+
DataLossOrDraftDiscardHandler.performAfterDiscardorKeepDraft(processFunctionForDrafts, fnCancelFunction, oController, bSkipBindingToView);
|
|
746
|
+
} else {
|
|
747
|
+
// The user started editing the existing draft but did not make any changes
|
|
748
|
+
// in the current editing session, so in this case we do not want
|
|
749
|
+
// to show the dataloss dialog but just keep the draft
|
|
750
|
+
processFunctionForDrafts();
|
|
759
751
|
}
|
|
760
752
|
} else {
|
|
761
753
|
fnProcessFunction();
|
|
@@ -777,4 +769,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
777
769
|
};
|
|
778
770
|
return draft;
|
|
779
771
|
}, false);
|
|
780
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwiQWN0aXZpdHlTeW5jIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzaWJsaW5nSW5mbyIsInNpYmxpbmdDb250ZXh0IiwiZ2V0Q29udHJvbGxlciIsIl9yb3V0aW5nIiwiX2NyZWF0ZUJpbmRpbmdDb250ZXh0IiwidGFyZ2V0Q29udGV4dCIsImZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQiLCJjYW5jZWxlZCIsImV4YyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0Iiwic3RhcnRzV2l0aCIsIkxvZyIsIm1vZGVsIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJjYW5vbmljYWxQYXRoUHJvbWlzZXMiLCJtYXAiLCJzZWdtZW50IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJhbGwiLCJjYW5vbmljYWxQYXRocyIsInNpYmxpbmdQYXRoIiwiZm9yRWFjaCIsImNhbm9uaWNhbFBhdGgiLCJpbmRleCIsIm5hdmlnYXRpb24iLCJrZXlzIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInVuZGVmaW5lZCIsIkFDVElWQVRJT04iLCJESVNDQVJEIiwiUFJFUEFSRSIsIk5hdmlnYXRpb25UeXBlIiwic09wZXJhdGlvbiIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIm9PcGVyYXRpb24iLCJzZXRQYXJhbWV0ZXIiLCJzR3JvdXBJZCIsInNBY3Rpb25OYW1lIiwib0VkaXRQcm9taXNlIiwiZXhlY3V0ZSIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJnZXRCaW5kaW5nIiwiaXNBIiwib0RyYWZ0RG9jdW1lbnRDb250ZXh0Iiwic3VibWl0QmF0Y2giLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJjYXRjaCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJyZXF1ZXN0TWVzc2FnZXMiLCJleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbiIsImdyb3VwSWQiLCJnZXRHcm91cElkIiwiZ2V0TWVzc2FnZXNQYXRoIiwic01lc3NhZ2VzUGF0aCIsIiRQcm9wZXJ0eVBhdGgiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJhY3RpdmF0ZURvY3VtZW50IiwiZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50Iiwic0JhdGNoR3JvdXAiLCJvUHJlcGFyZVByb21pc2UiLCJvQWN0aXZhdGVQcm9taXNlIiwidmFsdWVzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJkZWxldGVEcmFmdCIsInNEaXNjYXJkQWN0aW9uIiwiYklzQWN0aXZlRW50aXR5IiwiSXNBY3RpdmVFbnRpdHkiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJuYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiY29sbGFib3JhdGlvbkNvbm5lY3RlZCIsImlzQ29ubmVjdGVkIiwiZ2V0VmlldyIsInByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyIsImRpc2Nvbm5lY3QiLCJhcmdzIiwiYXBwbHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsImdldEFwcENvbXBvbmVudCIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJEYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlciIsInBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdCIsIkhhc0FjdGl2ZUVudGl0eSIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlZGl0RmxvdyIsImNhbmNlbERvY3VtZW50Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBZ2pCTyxrQkFBZ0JBLElBQWhCLEVBQXNC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QUExRDtBQUNBLE9BN0ZGO0FBOEZBO0FBQ0Q7O0FBRUQsTUFBTW5GLEtBQUssR0FBRztBQUNiL0UsSUFBQUEsNkJBQTZCLEVBQUVBLDZCQURsQjtBQUViNkssSUFBQUEsZ0JBQWdCLEVBQUVBLGdCQUZMO0FBR2JPLElBQUFBLFdBQVcsRUFBRUEsV0FIQTtBQUliaEosSUFBQUEsc0JBQXNCLEVBQUVBLHNCQUpYO0FBS2JnRCxJQUFBQSx5QkFBeUIsRUFBRUEseUJBTGQ7QUFNYnVHLElBQUFBLHlDQUF5QyxFQUFFQSx5Q0FOOUI7QUFPYjVELElBQUFBLGNBQWMsRUFBRUE7QUFQSCxHQUFkO1NBVWVoRCxLIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgeyBDb3JlRXggfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyB1c2VkIGluIHRoZSBmdW5jdGlvbnNcbiAqXG4gKlxuICogQGF1dGhvciBTQVAgU0VcbiAqIEBzaW5jZSAxLjU0LjBcbiAqIEBpbnRlcmZhY2VcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3QgdGhlIGNyZWF0aW9uIG9mIGEgZHJhZnRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7KGJvb2xlYW58UHJvbWlzZSl9IEFwcHJvdmFsIG9mIGRyYWZ0IGNyZWF0aW9uIFt0cnVlfGZhbHNlXSBvciBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYm9vbGVhbiB2YWx1ZVxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBhZnRlciBhIGRyYWZ0IHdhcyBzdWNjZXNzdWxseSBjcmVhdGVkXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5hZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG4gKiBAZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0XG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGFwcHJvdmUgb3IgcmVqZWN0IG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay53aGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZFxuICogQGZ1bmN0aW9uXG4gKiBAcHVibGljXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgdG8gb3ZlcndyaXRlIHVuc2F2ZWQgZHJhZnQgW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbi8qIENvbnN0YW50cyBmb3IgZHJhZnQgb3BlcmF0aW9ucyAqL1xuY29uc3QgZHJhZnRPcGVyYXRpb25zID0ge1xuXHRFRElUOiBcIkVkaXRBY3Rpb25cIixcblx0QUNUSVZBVElPTjogXCJBY3RpdmF0aW9uQWN0aW9uXCIsXG5cdERJU0NBUkQ6IFwiRGlzY2FyZEFjdGlvblwiLFxuXHRQUkVQQVJFOiBcIlByZXBhcmF0aW9uQWN0aW9uXCJcbn07XG4vKiBFbnVtIGZvciBuYXZpZ2F0aW9uIHR5cGVzICovXG5lbnVtIE5hdmlnYXRpb25UeXBlIHtcblx0QmFja05hdmlnYXRpb24gPSBcIkJhY2tOYXZpZ2F0aW9uXCIsXG5cdEZvcndhcmROYXZpZ2F0aW9uID0gXCJGb3J3YXJkTmF2aWdhdGlvblwiXG59XG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAcHJpdmF0ZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU0LjBcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgYWN0aW9uIG5hbWUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9cIiArIHNPcGVyYXRpb24pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiAoYWN0aW9uIG9yIGZ1bmN0aW9uIGltcG9ydClcbiAqIEBwYXJhbSBvT3B0aW9ucyBPcHRpb25zIHRvIGNyZWF0ZSB0aGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ30gVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogYW55LCBzT3BlcmF0aW9uOiBzdHJpbmcsIG9PcHRpb25zPzogYW55KSB7XG5cdGNvbnN0IHNPcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgc09wZXJhdGlvbik7XG5cblx0cmV0dXJuIG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc09wZXJhdGlvbk5hbWUgKyBcIiguLi4pXCIsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG4vKipcbiAqIENoZWNrIGlmIG9wdGlvbmFsIGRyYWZ0IHByZXBhcmUgYWN0aW9uIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlQ2hhbmdlcyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBwcmVzZXJ2ZWQgYW5kIGFuIGVycm9yIG1lc3NhZ2UgKGh0dHAgc3RhdHVzIDQwOSkgaXMgc2VuZCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQ6IGFueSwgYlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbikge1xuXHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcHRpb25zID0geyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfTtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCwgb09wdGlvbnMpO1xuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiUHJlc2VydmVDaGFuZ2VzXCIsIGJQcmVzZXJ2ZUNoYW5nZXMpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBsb2NhbEkxOG5SZWYgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpO1xuXHRcdC8vSWYgdGhlIGNvbnRleHQgaXMgY29taW5nIGZyb20gYSBsaXN0IGJpbmRpbmcgd2UgcGFzcyB0aGUgZmxhZyB0cnVlIHRvIHJlcGxhY2UgdGhlIGNvbnRleHQgYnkgdGhlIGFjdGl2ZSBvbmVcblx0XHRjb25zdCBvRWRpdFByb21pc2UgPSBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EcmFmdERvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnREb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblx0XHRvT3BlcmF0aW9uLmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdHJldHVybiBvRWRpdFByb21pc2U7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBlZGl0IHRoaXMgZHJhZnQgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBBY3RpdmF0ZXMgYSBkcmFmdCBkb2N1bWVudC4gVGhlIGRyYWZ0IHdpbGwgcmVwbGFjZSB0aGUgc2libGluZyBlbnRpdHkgYW5kIHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgYmFjayBlbmQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0dyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQ+fSBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0OiBhbnksIG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgc0dyb3VwSWQ/OiBzdHJpbmcpIHtcblx0Y29uc3QgYkhhc1ByZXBhcmVBY3Rpb24gPSBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KTtcblxuXHQvLyBBY2NvcmRpbmcgdG8gdGhlIGRyYWZ0IHNwZWMgaWYgdGhlIHNlcnZpY2UgY29udGFpbnMgYSBwcmVwYXJlIGFjdGlvbiBhbmQgd2UgdHJpZ2dlciBib3RoIHByZXBhcmUgYW5kXG5cdC8vIGFjdGl2YXRlIGluIG9uZSAkYmF0Y2ggdGhlIGFjdGl2YXRlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aCBpRi1NYXRjaD0qXG5cdGNvbnN0IGJJZ25vcmVFdGFnID0gYkhhc1ByZXBhcmVBY3Rpb247XG5cblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkFDVElWQVRJT04sIHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH0pO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRiSWdub3JlRXRhZyxcblx0XHRcdFx0c0dyb3VwSWQgPyBDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChkcmFmdCwgc0dyb3VwSWQsIHNBY3Rpb25OYW1lLCBvQ29udGV4dC5nZXRNb2RlbCgpKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpIC8vM3JkIHBhcmFtZXRlcjwtLS0tLS1cblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHQvL2lmIEFDVElWQVRFIGFjdGlvbiBmYWlscyB0aGVuIHdlIHJlcXVlc3QgZWl0aGVyIHRoZSBzaWRlRWZmZWN0cyBhZ2FpbnN0IFBSRVBBUkUgYWN0aW9uIChpZiBhbm5vdGF0ZWQpIG9yIHRoZSBtZXNzYWdlcyBhcyBmYWxsYmFjazpcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKS5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBJZCBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggd2Ugd2FudCB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0OiBDb250ZXh0LCBncm91cElkPzogc3RyaW5nKSB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIG1lc3NhZ2UgcGF0aCBmb3IgYSBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIHBhdGggc2hhbGwgYmUgZGV0ZXJtaW5lZFxuICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZSBwYXRoLCBlbXB0eSBpZiBub3QgYW5ub3RhdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcbn1cbi8qKlxuICogUmVxdWVzdHMgdGhlIG1lc3NhZ2VzIGlmIGFubm90YXRlZCBmb3IgYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSBtZXNzYWdlcyB3ZXJlIHJlcXVlc3RlZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQ6IGFueSwgb1NpZGVFZmZlY3RzU2VydmljZTogU2lkZUVmZmVjdHNTZXJ2aWNlKSB7XG5cdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlc1BhdGgob0NvbnRleHQpO1xuXHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdHJldHVybiBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkUHJvcGVydHlQYXRoOiBzTWVzc2FnZXNQYXRoIH1dIGFzIGFueSwgb0NvbnRleHQpO1xuXHR9XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUG9zdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9EaXNjYXJkT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpO1xuXHRcdC8vIGFzIHRoZSBkaXNjYXJkIGFjdGlvbiBkb2VzbnQnIHNlbmQgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIHRoZSByZXNwb25zZSB3ZSBkbyBub3QgdXNlIHRoZSByZXBsYWNlIGluIGNhY2hlXG5cdFx0Y29uc3Qgb0Rpc2NhcmRQcm9taXNlID0gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0XG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFoIHNlZ21lbnRcblx0XHQvLyBFeGFtcGxlOiBmb3IgW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cdFx0Ly8gLS0+IHJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIGZvciBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZCkvU2libGluZ0VudGl0eVwiXG5cdFx0Y29uc3Qgb2xkUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgbmV3UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0bGV0IGN1cnJlbnRQYXRoID0gXCJcIjtcblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoY3VycmVudFBhdGggKyBcIi9TaWJsaW5nRW50aXR5XCIpLmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbiA9IHNlZ21lbnRzW2luZGV4XS5yZXBsYWNlKC9cXCguKiQvLCBcIlwiKTsgLy8gS2VlcCBvbmx5IG5hdmlnYXRpb24gbmFtZSBmcm9tIHRoZSBzZWdtZW50LCBpLmUuIGFhYSh4eHgpIC0tPiBhYWFcblx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmbXJvIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHNpYmxpbmdQYXRoKS5nZXRCb3VuZENvbnRleHQoKSBhcyBDb250ZXh0LCAvLyBDcmVhdGUgdGhlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHQgZnJvbSBpdHMgcGF0aFxuXHRcdFx0cGF0aE1hcHBpbmc6IG9sZFBhdGhzLm1hcCgob2xkUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRvbGRQYXRoLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld1BhdGhzW2luZGV4XVxuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIEEgY2Fub25pY2FsIHBhdGggY291bGRuJ3QgYmUgcmVzb2x2ZWQgKGJlY2F1c2UgYSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtBcHBDb21wb25lbnR9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkcmFmdCBkb2N1bWVudCB3YXMgY3JlYXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay53aGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZH0gW21QYXJhbWV0ZXJzLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRdIENhbGxiYWNrIGZvciBkZWNpZGluZyBvbiBvdmVyd3JpdGluZyBhbiB1bnNhdmVkIGNoYW5nZSBieSBhbm90aGVyIHVzZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IFZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0Zm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZD86IGFueTtcblx0fVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0YlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgPVxuXHRcdFx0dHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcInVuZGVmaW5lZFwiIHx8ICh0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwiYm9vbGVhblwiICYmIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzKTsgLy9kZWZhdWx0IHRydWVcblxuXHQvKipcblx0ICogT3ZlcndyaXRlIG9yIHJlamVjdCBiYXNlZCBvbiBmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGJPdmVyd3JpdGUgT3ZlcndyaXRlIHRoZSBjaGFuZ2Ugb3Igbm90XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB7QGxpbmsgc2FwLmZlLmNvcmUuYWN0aW9ucyNleGVjdXRlRHJhZnRFZGl0QWN0aW9ufVxuXHQgKi9cblx0ZnVuY3Rpb24gb3ZlcndyaXRlT25EZW1hbmQoYk92ZXJ3cml0ZTogYW55KSB7XG5cdFx0aWYgKGJPdmVyd3JpdGUpIHtcblx0XHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0bGV0IG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRcdHJldHVybiAoKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKF9vUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IF9vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0XHRcdHNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBhbnkpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9XQVJOSU5HXCIpLFxuXHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0XHR0ZXh0OiBzVW5zYXZlZENoYW5nZXNNc2dcblx0XHRcdFx0fSksXG5cdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIiksXG5cdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHQ/IG1QYXJhbS5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdylcblx0XHQ6IHRydWU7XG5cblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXHRsZXQgb3BlbmluZ1NpYmxpbmdDb250ZXh0ID0gZmFsc2U7XG5cdHRyeSB7XG5cdFx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBudWxsID0gbnVsbDtcblx0XHR0cnkge1xuXHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KTtcblx0XHR9IGNhdGNoIChvUmVzcG9uc2U6IGFueSkge1xuXHRcdFx0Ly9Pbmx5IGNhbGwgYmFjayBpZiBlcnJvciA0MDlcblx0XHRcdGlmIChiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyAmJiBvUmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9yb3V0aW5nLl9jcmVhdGVCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9Db250ZXh0LmdldE1vZGVsKClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdG9wZW5pbmdTaWJsaW5nQ29udGV4dCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVPbkRlbWFuZChcblx0XHRcdFx0XHRcdG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkID8gbVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQoKSA6IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoIShvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvcGVuaW5nU2libGluZ0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdH1cblxuXHRcdG9EcmFmdENvbnRleHQgPVxuXHRcdFx0b0RyYWZ0Q29udGV4dCAmJiBtUGFyYW0uZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50XG5cdFx0XHRcdD8gbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgb0RyYWZ0Q29udGV4dClcblx0XHRcdFx0OiBvRHJhZnRDb250ZXh0O1xuXG5cdFx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCk7XG5cdFx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0KTtcblxuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBjYXRjaCAoZXhjOiBhbnkpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWUpXG5cdFx0LnRoZW4oZnVuY3Rpb24gKGJFeGVjdXRlOiBhbnkpIHtcblx0XHRcdGlmICghYkV4ZWN1dGUpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiZHJhZnRcIjtcblx0XHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXApO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBkZWxldGVEcmFmdChvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpLFxuXHRcdGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vVXNlIERpc2NhcmQgUG9zdCBBY3Rpb24gaWYgaXQgaXMgYSBkcmFmdCBlbnRpdHkgYW5kIGRpc2NhcmQgYWN0aW9uIGV4aXN0c1xuXHRcdHJldHVybiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0KTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSBmblByb2Nlc3NGdW5jdGlvblxuICogQHBhcmFtIGZuQ2FuY2VsRnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dFxuICogQHBhcmFtIG9Db250cm9sbGVyXG4gKiBAcGFyYW0gYlNraXBCaW5kaW5nVG9WaWV3XG4gKiBAcGFyYW0gbmF2aWdhdGlvblR5cGVcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdGZuUHJvY2Vzc0Z1bmN0aW9uOiBhbnksXG5cdGZuQ2FuY2VsRnVuY3Rpb246IGFueSxcblx0b0NvbnRleHQ6IGFueSxcblx0b0NvbnRyb2xsZXI6IGFueSxcblx0YlNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbixcblx0bmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlID0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cbikge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3Qob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24uYXBwbHkobnVsbCwgLi4uYXJncyk7XG5cdFx0ICB9O1xuXG5cdGlmIChcblx0XHRvQ29udGV4dCAmJlxuXHRcdG9Db250ZXh0LmdldE9iamVjdCgpICYmXG5cdFx0KCFvQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB8fCBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSlcblx0KSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHRkcmFmdERhdGFDb250ZXh0XG5cdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0XHRcdFx0XHRcdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdFx0XHRcdFx0XHQvLyBmb3IgRkNMLlxuXHRcdFx0XHRcdFx0aWYgKCEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSkge1xuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVGhlcmUgaXMgbm8gYWN0aXZlIGVudGl0eSBzbyB3ZSBhcmUgZWRpdGluZyBlaXRoZXIgbmV3bHkgY3JlYXRlZCBkYXRhIG9yXG5cdFx0XHRcdFx0XHRcdC8vIGEgZHJhZnQgd2hpY2ggaGFzIG5ldmVyIGJlZW4gc2F2ZWQgdG8gYWN0aXZlIHZlcnNpb25cblx0XHRcdFx0XHRcdFx0Ly8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXG5cdFx0XHRcdFx0XHRcdC8vIGRpcnR5IHN0YXRlXG5cdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlIGRhdGEgaXMgYmVpbmcgbmV3bHkgY3JlYXRlZCBhbmQgdGhlbiB3ZSBhbHdheXMgd2FudCB0b1xuXHRcdFx0XHRcdFx0XHRcdC8vIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBvbiBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0XHRcdFx0RGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0Zm5DYW5jZWxGdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdmVyc2lvbiBhbmQgc2luY2UgdGhlIGVkaXQgc3RhdGUgaXMgbm90IGRpcnR5LCB0aGVyZSBoYXZlIGJlZW4gbm8gdXNlciBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc28gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRvIG5vdGhpbmdcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHRcdFx0XHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gbmV2ZXIgc2F2ZWQgYmVmb3JlLCBoZW5jZSB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZyBhIG5ld2x5IGNyZWF0ZWQgZHJhZnQgZm9yXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0XHRcdFx0XHRcdFx0XHQvLyBjYXNlIHdlIHdhbnQgdG8gc2lsZW50bHkgbmF2aWdhdGUgYW5kIGRlbGV0ZSB0aGUgZHJhZnQgaW4gY2FzZSBvZiBhIGJhY2tcblx0XHRcdFx0XHRcdFx0XHQvLyBuYXZpZ2F0aW9uIGJ1dCBpbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gc2lsZW50bHkga2VlcCBpdCFcblx0XHRcdFx0XHRcdFx0XHRpZiAobmF2aWdhdGlvblR5cGUgPT09IE5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjYW5jZWxpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmb3J3YXJkIG5hdmlnYXRpb24gd2Ugc2lsZW50bHkga2VlcCB0aGUgZHJhZnQgYW5kIG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYW4gZXhpc3RpbmcgZHJhZnQgYW5kIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGVwZW5kaW5nIG9uIGlmIGFueSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIG9yIG5vdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBDaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBzbyB3ZSB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYW5kIGxldCB0aGUgdXNlciBkZWNpZGVcblx0XHRcdFx0XHRcdFx0XHRcdERhdGFMb3NzT3JEcmFmdERpc2NhcmRIYW5kbGVyLnBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbkNhbmNlbEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udHJvbGxlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgdXNlciBzdGFydGVkIGVkaXRpbmcgdGhlIGV4aXN0aW5nIGRyYWZ0IGJ1dCBkaWQgbm90IG1ha2UgYW55IGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiwgc28gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0byBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgYnV0IGp1c3Qga2VlcCB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmblByb2Nlc3NGdW5jdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgZHJhZnREYXRhQ29udGV4dCBpbmZvcm1hdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogcHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdE5hdmlnYXRpb25UeXBlOiBOYXZpZ2F0aW9uVHlwZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnQ7XG4iXX0=
|
|
772
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJBY3Rpdml0eVN5bmMiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInNpYmxpbmdJbmZvIiwic2libGluZ0NvbnRleHQiLCJnZXRDb250cm9sbGVyIiwiX3JvdXRpbmciLCJfY3JlYXRlQmluZGluZ0NvbnRleHQiLCJ0YXJnZXRDb250ZXh0IiwiZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCIsImNhbmNlbGVkIiwiZXhjIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJzdGFydHNXaXRoIiwiTG9nIiwibW9kZWwiLCJhZGRpdGlvbmFsUGF0aCIsInJlcGxhY2UiLCJzZWdtZW50cyIsInN1YnN0cmluZyIsInNwbGl0IiwidW5zaGlmdCIsIm9sZFBhdGhzIiwibmV3UGF0aHMiLCJjdXJyZW50UGF0aCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImFsbCIsImNhbm9uaWNhbFBhdGhzIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwidW5kZWZpbmVkIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiTmF2aWdhdGlvblR5cGUiLCJzT3BlcmF0aW9uIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRPYmplY3QiLCJjcmVhdGVPcGVyYXRpb24iLCJvT3B0aW9ucyIsInNPcGVyYXRpb25OYW1lIiwiaGFzUHJlcGFyZUFjdGlvbiIsImdldFByb3BlcnR5IiwiJCRpbmhlcml0RXhwYW5kU2VsZWN0Iiwib09wZXJhdGlvbiIsInNldFBhcmFtZXRlciIsInNHcm91cElkIiwic0FjdGlvbk5hbWUiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwiZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkIiwiYmluZCIsImdldEJpbmRpbmciLCJpc0EiLCJvRHJhZnREb2N1bWVudENvbnRleHQiLCJzdWJtaXRCYXRjaCIsImV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24iLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsImNhdGNoIiwiYWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJyZXF1ZXN0TWVzc2FnZXMiLCJleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbiIsImdyb3VwSWQiLCJnZXRHcm91cElkIiwiZ2V0TWVzc2FnZXNQYXRoIiwic01lc3NhZ2VzUGF0aCIsIiRQcm9wZXJ0eVBhdGgiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJhY3RpdmF0ZURvY3VtZW50IiwiZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50Iiwic0JhdGNoR3JvdXAiLCJvUHJlcGFyZVByb21pc2UiLCJvQWN0aXZhdGVQcm9taXNlIiwidmFsdWVzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJkZWxldGVEcmFmdCIsInNEaXNjYXJkQWN0aW9uIiwiYklzQWN0aXZlRW50aXR5IiwiSXNBY3RpdmVFbnRpdHkiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiZm5Qcm9jZXNzRnVuY3Rpb24iLCJmbkNhbmNlbEZ1bmN0aW9uIiwib0NvbnRyb2xsZXIiLCJiU2tpcEJpbmRpbmdUb1ZpZXciLCJuYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiY29sbGFib3JhdGlvbkNvbm5lY3RlZCIsImlzQ29ubmVjdGVkIiwiZ2V0VmlldyIsInByb2Nlc3NGdW5jdGlvbkZvckRyYWZ0cyIsImRpc2Nvbm5lY3QiLCJhcmdzIiwiYXBwbHkiLCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YSIsImdldEFwcENvbXBvbmVudCIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImlzRmNsRW5hYmxlZCIsIkNyZWF0aW9uRGF0ZVRpbWUiLCJMYXN0Q2hhbmdlRGF0ZVRpbWUiLCJEYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlciIsInBlcmZvcm1BZnRlckRpc2NhcmRvcktlZXBEcmFmdCIsIkhhc0FjdGl2ZUVudGl0eSIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJlZGl0RmxvdyIsImNhbmNlbERvY3VtZW50Il0sIm1hcHBpbmdzIjoi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QUFBQSw2QkFBNkIsRUFBRUEsNkJBRGxCO0FBRWIrSyxJQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBRkw7QUFHYk8sSUFBQUEsV0FBVyxFQUFFQSxXQUhBO0FBSWJsSixJQUFBQSxzQkFBc0IsRUFBRUEsc0JBSlg7QUFLYmlELElBQUFBLHlCQUF5QixFQUFFQSx5QkFMZDtBQU1id0csSUFBQUEseUNBQXlDLEVBQUVBLHlDQU45QjtBQU9iN0QsSUFBQUEsY0FBYyxFQUFFQTtBQVBILEdBQWQ7U0FVZWpELEsiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL0RhdGFMb3NzT3JEcmFmdERpc2NhcmQvRGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCwgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IFY0Q29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNhbGxiYWNrcyB1c2VkIGluIHRoZSBmdW5jdGlvbnNcbiAqXG4gKlxuICogQGF1dGhvciBTQVAgU0VcbiAqIEBzaW5jZSAxLjU0LjBcbiAqIEBpbnRlcmZhY2VcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3QgdGhlIGNyZWF0aW9uIG9mIGEgZHJhZnRcbiAqXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5iZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCBvZiBkcmFmdCBjcmVhdGlvbiBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBhZnRlciBhIGRyYWZ0IHdhcyBzdWNjZXNzdWxseSBjcmVhdGVkXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAYWJzdHJhY3RcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGFwcHJvdmUgb3IgcmVqZWN0IG92ZXJ3cml0aW5nIGFuIHVuc2F2ZWQgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKlxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2sud2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRcbiAqIEBmdW5jdGlvblxuICogQHB1YmxpY1xuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgdG8gb3ZlcndyaXRlIHVuc2F2ZWQgZHJhZnQgW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qIEVudW0gZm9yIG5hdmlnYXRpb24gdHlwZXMgKi9cbmVudW0gTmF2aWdhdGlvblR5cGUge1xuXHRCYWNrTmF2aWdhdGlvbiA9IFwiQmFja05hdmlnYXRpb25cIixcblx0Rm9yd2FyZE5hdmlnYXRpb24gPSBcIkZvcndhcmROYXZpZ2F0aW9uXCJcbn1cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBWNENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn1gKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBvcGVyYXRpb24gY29udGV4dCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcsIG9PcHRpb25zPzogYW55KSB7XG5cdGNvbnN0IHNPcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgc09wZXJhdGlvbik7XG5cblx0cmV0dXJuIG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYCR7c09wZXJhdGlvbk5hbWV9KC4uLilgLCBvQ29udGV4dCwgb09wdGlvbnMpO1xufVxuLyoqXG4gKiBDaGVjayBpZiBvcHRpb25hbCBkcmFmdCBwcmVwYXJlIGFjdGlvbiBleGlzdHMuXG4gKlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIFRydWUgaWYgYSBhIHByZXBhcmUgYWN0aW9uIGV4aXN0c1xuICovXG5mdW5jdGlvbiBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0OiBWNENvbnRleHQpIHtcblx0cmV0dXJuICEhZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGRyYWZ0IGZyb20gYW4gYWN0aXZlIGRvY3VtZW50LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGJQcmVzZXJ2ZUNoYW5nZXMgSWYgdHJ1ZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgcHJlc2VydmVkIGFuZCBhbiBlcnJvciBtZXNzYWdlIChodHRwIHN0YXR1cyA0MDkpIGlzIHNlbmQgZnJvbSB0aGUgYmFja2VuZCwgb3RoZXJ3aXNlIGZhbHNlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBvdmVyd3JpdHRlbjwvbGk+XG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0OiBWNENvbnRleHQsIGJQcmVzZXJ2ZUNoYW5nZXM6IGJvb2xlYW4pOiBQcm9taXNlPFY0Q29udGV4dD4ge1xuXHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcHRpb25zID0geyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfTtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCwgb09wdGlvbnMpO1xuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiUHJlc2VydmVDaGFuZ2VzXCIsIGJQcmVzZXJ2ZUNoYW5nZXMpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBsb2NhbEkxOG5SZWYgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpO1xuXHRcdC8vSWYgdGhlIGNvbnRleHQgaXMgY29taW5nIGZyb20gYSBsaXN0IGJpbmRpbmcgd2UgcGFzcyB0aGUgZmxhZyB0cnVlIHRvIHJlcGxhY2UgdGhlIGNvbnRleHQgYnkgdGhlIGFjdGl2ZSBvbmVcblx0XHRjb25zdCBvRWRpdFByb21pc2UgPSBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EcmFmdERvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRHJhZnREb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblx0XHRvT3BlcmF0aW9uLmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0dyb3VwSWQpO1xuXHRcdHJldHVybiBvRWRpdFByb21pc2U7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBlZGl0IHRoaXMgZHJhZnQgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBBY3RpdmF0ZXMgYSBkcmFmdCBkb2N1bWVudC4gVGhlIGRyYWZ0IHdpbGwgcmVwbGFjZSB0aGUgc2libGluZyBlbnRpdHkgYW5kIHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgYmFjayBlbmQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gW3NHcm91cElkXSBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyB0byBiZSBleGVjdXRlZFxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0LCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIHNHcm91cElkPzogc3RyaW5nKTogUHJvbWlzZTxWNENvbnRleHQ+IHtcblx0Y29uc3QgYkhhc1ByZXBhcmVBY3Rpb24gPSBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KTtcblxuXHQvLyBBY2NvcmRpbmcgdG8gdGhlIGRyYWZ0IHNwZWMgaWYgdGhlIHNlcnZpY2UgY29udGFpbnMgYSBwcmVwYXJlIGFjdGlvbiBhbmQgd2UgdHJpZ2dlciBib3RoIHByZXBhcmUgYW5kXG5cdC8vIGFjdGl2YXRlIGluIG9uZSAkYmF0Y2ggdGhlIGFjdGl2YXRlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aCBpRi1NYXRjaD0qXG5cdGNvbnN0IGJJZ25vcmVFdGFnID0gYkhhc1ByZXBhcmVBY3Rpb247XG5cblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkFDVElWQVRJT04sIHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH0pO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoXG5cdFx0XHRcdHNHcm91cElkLFxuXHRcdFx0XHRiSWdub3JlRXRhZyxcblx0XHRcdFx0c0dyb3VwSWQgPyBDb21tb25VdGlscy5mbk9uU3RyaWN0SGFuZGxpbmdGYWlsZWQuYmluZChkcmFmdCwgc0dyb3VwSWQsIHNBY3Rpb25OYW1lLCBvQ29udGV4dC5nZXRNb2RlbCgpKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHQpIC8vM3JkIHBhcmFtZXRlcjwtLS0tLS1cblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHQvL2lmIEFDVElWQVRFIGFjdGlvbiBmYWlscyB0aGVuIHdlIHJlcXVlc3QgZWl0aGVyIHRoZSBzaWRlRWZmZWN0cyBhZ2FpbnN0IFBSRVBBUkUgYWN0aW9uIChpZiBhbm5vdGF0ZWQpIG9yIHRoZSBtZXNzYWdlcyBhcyBmYWxsYmFjazpcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nUGFyYW1ldGVycyA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhhY3Rpb25OYW1lLCBvQ29udGV4dCksXG5cdFx0XHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0UGF0aHMsIG9Db250ZXh0KS5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dCwgb1NpZGVFZmZlY3RzU2VydmljZSkuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cbi8qKlxuICogRXhlY3V0ZSBhIHByZXBhcmF0aW9uIGFjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQ6IFY0Q29udGV4dCwgZ3JvdXBJZD86IHN0cmluZykge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG5cblx0XHQvLyBUT0RPOiBzaWRlIGVmZmVjdHMgcXVhbGlmaWVyIHNoYWxsIGJlIGV2ZW4gZGVwcmVjYXRlZCB0byBiZSBjaGVja2VkXG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJTaWRlRWZmZWN0c1F1YWxpZmllclwiLCBcIlwiKTtcblxuXHRcdGNvbnN0IHNHcm91cElkID0gZ3JvdXBJZCB8fCBvT3BlcmF0aW9uLmdldEdyb3VwSWQoKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoc0dyb3VwSWQpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25cIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBwcmVwYXJhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBtZXNzYWdlIHBhdGggZm9yIGEgY29udGV4dC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgcGF0aCBzaGFsbCBiZSBkZXRlcm1pbmVkXG4gKiBAcmV0dXJucyBNZXNzYWdlIHBhdGgsIGVtcHR5IGlmIG5vdCBhbm5vdGF0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0OiBWNENvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xufVxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dDogVjRDb250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UpIHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dCk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICRQcm9wZXJ0eVBhdGg6IHNNZXNzYWdlc1BhdGggfV0gYXMgYW55LCBvQ29udGV4dCk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dDogVjRDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9EaXNjYXJkT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpO1xuXHRcdC8vIGFzIHRoZSBkaXNjYXJkIGFjdGlvbiBkb2VzbnQnIHNlbmQgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIHRoZSByZXNwb25zZSB3ZSBkbyBub3QgdXNlIHRoZSByZXBsYWNlIGluIGNhY2hlXG5cdFx0Y29uc3Qgb0Rpc2NhcmRQcm9taXNlID0gb0Rpc2NhcmRPcGVyYXRpb24uZXhlY3V0ZShcblx0XHRcdHNHcm91cElkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0Q29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9EaXNjYXJkUHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyBUaGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dFxuKTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHR9XG5cblx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0dHJ5IHtcblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAxLiBGaW5kIGFsbCBzZWdtZW50cyBiZXR3ZWVuIHRoZSByb290IG9iamVjdCBhbmQgdGhlIHN1Yi1vYmplY3Rcblx0XHQvLyBFeGFtcGxlOiBmb3Igcm9vdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKSBhbmQgcmlnaHRNb3N0ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpXG5cdFx0Ly8gLS0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblxuXHRcdC8vIEZpbmQgYWxsIHNlZ21lbnRzIGluIHRoZSByaWdodG1vc3QgcGF0aFxuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2Uocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSwgXCJcIik7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBhZGRpdGlvbmFsUGF0aCA/IGFkZGl0aW9uYWxQYXRoLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIikgOiBbXTtcblx0XHQvLyBGaXJzdCBzZWdtZW50IGlzIGFsd2F5cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSByb290IG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gJy8nIGluIGNhc2Ugb2YgYSBwYXJhbWV0cml6ZWQgZW50aXR5XG5cdFx0c2VnbWVudHMudW5zaGlmdChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAyLiBSZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBvZiB0aGUgc2libGluZyBlbnRpdHkgZm9yIGVhaCBzZWdtZW50XG5cdFx0Ly8gRXhhbXBsZTogZm9yIFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXHRcdC8vIC0tPiByZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBmb3IgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpL1NpYmxpbmdFbnRpdHlcIlxuXHRcdGNvbnN0IG9sZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG5ld1BhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aFByb21pc2VzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XG5cdFx0XHRjdXJyZW50UGF0aCArPSBgLyR7c2VnbWVudH1gO1xuXHRcdFx0b2xkUGF0aHMudW5zaGlmdChjdXJyZW50UGF0aCk7XG5cdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke2N1cnJlbnRQYXRofS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbiA9IHNlZ21lbnRzW2luZGV4XS5yZXBsYWNlKC9cXCguKiQvLCBcIlwiKTsgLy8gS2VlcCBvbmx5IG5hdmlnYXRpb24gbmFtZSBmcm9tIHRoZSBzZWdtZW50LCBpLmUuIGFhYSh4eHgpIC0tPiBhYWFcblx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmbXJvIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHNpYmxpbmdQYXRoKS5nZXRCb3VuZENvbnRleHQoKSwgLy8gQ3JlYXRlIHRoZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0IGZyb20gaXRzIHBhdGhcblx0XHRcdHBhdGhNYXBwaW5nOiBvbGRQYXRocy5tYXAoKG9sZFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkUGF0aCxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdQYXRoc1tpbmRleF1cblx0XHRcdFx0fTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBBIGNhbm9uaWNhbCBwYXRoIGNvdWxkbid0IGJlIHJlc29sdmVkIChiZWNhdXNlIGEgc2libGluZyBkb2Vzbid0IGV4aXN0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY29yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub1ZpZXddIFRoZSB2aWV3XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIHZldG8gYmVmb3JlIGNyZWF0ZSByZXF1ZXN0IGlzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkcmFmdCBkb2N1bWVudCB3YXMgY3JlYXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXSBDYWxsYmFjayBmb3IgZGVjaWRpbmcgb24gb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBjaGFuZ2UgYnkgYW5vdGhlciB1c2VyXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IFZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0Zm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZD86IGFueTtcblx0fVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0YlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgPVxuXHRcdFx0dHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcInVuZGVmaW5lZFwiIHx8ICh0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwiYm9vbGVhblwiICYmIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzKTsgLy9kZWZhdWx0IHRydWVcblxuXHQvKipcblx0ICogT3ZlcndyaXRlIG9yIHJlamVjdCBiYXNlZCBvbiBmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYk92ZXJ3cml0ZSBPdmVyd3JpdGUgdGhlIGNoYW5nZSBvciBub3Rcblx0ICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGZ1bmN0aW9uIG92ZXJ3cml0ZU9uRGVtYW5kKGJPdmVyd3JpdGU6IGJvb2xlYW4pIHtcblx0XHRpZiAoYk92ZXJ3cml0ZSkge1xuXHRcdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0bGV0IG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRcdHJldHVybiAoKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKF9vUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IF9vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0XHRcdHNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfRFJBRlRfT0JKRUNUX1BBR0VfV0FSTklOR1wiKSxcblx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0dGV4dDogc1Vuc2F2ZWRDaGFuZ2VzTXNnXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlamVjdChgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSksXG5cdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHR9XG5cblx0Y29uc3QgYkV4ZWN1dGUgPSBtUGFyYW0uZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdD8gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KVxuXHRcdDogdHJ1ZTtcblxuXHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBEcmFmdCBjcmVhdGlvbiB3YXMgYWJvcnRlZCBieSBleHRlbnNpb24gZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXHRsZXQgb3BlbmluZ1NpYmxpbmdDb250ZXh0ID0gZmFsc2U7XG5cdHRyeSB7XG5cdFx0bGV0IG9EcmFmdENvbnRleHQ6IFY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHR0cnkge1xuXHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KTtcblx0XHR9IGNhdGNoIChvUmVzcG9uc2U6IGFueSkge1xuXHRcdFx0Ly9Pbmx5IGNhbGwgYmFjayBpZiBlcnJvciA0MDlcblx0XHRcdGlmIChiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyAmJiBvUmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdGlmIChBY3Rpdml0eVN5bmMuaXNDb2xsYWJvcmF0aW9uRW5hYmxlZChtUGFyYW1ldGVycy5vVmlldykpIHtcblx0XHRcdFx0XHRjb25zdCBzaWJsaW5nSW5mbyA9IGF3YWl0IGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0KTtcblx0XHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5fcm91dGluZy5fY3JlYXRlQmluZGluZ0NvbnRleHQoXG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbz8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRvcGVuaW5nU2libGluZ0NvbnRleHQgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgb3ZlcndyaXRlT25EZW1hbmQoXG5cdFx0XHRcdFx0XHRtUGFyYW0uZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCA/IG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkKCkgOiB0cnVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICghKG9SZXNwb25zZSAmJiBvUmVzcG9uc2UuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob3BlbmluZ1NpYmxpbmdDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHR9XG5cblx0XHRvRHJhZnRDb250ZXh0ID1cblx0XHRcdG9EcmFmdENvbnRleHQgJiYgbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdFx0XHQ/IG1QYXJhbS5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIG9EcmFmdENvbnRleHQpXG5cdFx0XHRcdDogb0RyYWZ0Q29udGV4dDtcblxuXHRcdGlmIChvRHJhZnRDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBzRWRpdEFjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9EcmFmdENvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0cyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzRWRpdEFjdGlvbk5hbWUsIG9EcmFmdENvbnRleHQpO1xuXHRcdFx0aWYgKG9TaWRlRWZmZWN0cz8udHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKG9TaWRlRWZmZWN0cywgb0RyYWZ0Q29udGV4dCk7XG5cblx0XHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2ggKGV4YzogYW55KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGV4Yyk7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjYWN0aXZhdGVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIHZldG8gYmVmb3JlIGNyZWF0ZSByZXF1ZXN0IGlzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGFjdGl2YXRlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBWNENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHsgZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50PzogYW55OyBmbkFmdGVyQWN0aXZhdGVEb2N1bWVudD86IGFueSB9XG4pIHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHR9XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUobVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCA/IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQpIDogdHJ1ZSlcblx0XHQudGhlbihmdW5jdGlvbiAoYkV4ZWN1dGU6IGFueSkge1xuXHRcdFx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBBY3RpdmF0aW9uIG9mIHRoZSBkb2N1bWVudCB3YXMgYWJvcnRlZCBieSBleHRlbnNpb24gZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQsIG9BcHBDb21wb25lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiZHJhZnRcIjtcblx0XHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXApO1xuXHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cblx0XHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCBzQmF0Y2hHcm91cCk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbiAob0FjdGl2ZURvY3VtZW50Q29udGV4dDogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuXHRcdFx0XHRtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIGNvbnRleHQgaXMgZGVsZXRlZFxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZURyYWZ0KG9Db250ZXh0OiBWNENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0Y29uc3Qgc0Rpc2NhcmRBY3Rpb24gPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCksXG5cdFx0YklzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cblx0aWYgKGJJc0FjdGl2ZUVudGl0eSB8fCAoIWJJc0FjdGl2ZUVudGl0eSAmJiAhc0Rpc2NhcmRBY3Rpb24pKSB7XG5cdFx0Ly9Vc2UgRGVsZXRlIGluIGNhc2Ugb2YgYWN0aXZlIGVudGl0eSBhbmQgbm8gZGlzY2FyZCBhY3Rpb24gYXZhaWxhYmxlIGZvciBkcmFmdFxuXHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHRcblx0XHRcdFx0LmdldEJpbmRpbmcoKVxuXHRcdFx0XHQucmVzZXRDaGFuZ2VzKClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly9Vc2UgRGlzY2FyZCBQb3N0IEFjdGlvbiBpZiBpdCBpcyBhIGRyYWZ0IGVudGl0eSBhbmQgZGlzY2FyZCBhY3Rpb24gZXhpc3RzXG5cdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24ob0NvbnRleHQpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIGZuUHJvY2Vzc0Z1bmN0aW9uXG4gKiBAcGFyYW0gZm5DYW5jZWxGdW5jdGlvblxuICogQHBhcmFtIG9Db250ZXh0XG4gKiBAcGFyYW0gb0NvbnRyb2xsZXJcbiAqIEBwYXJhbSBiU2tpcEJpbmRpbmdUb1ZpZXdcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uVHlwZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0Zm5Qcm9jZXNzRnVuY3Rpb246IGFueSxcblx0Zm5DYW5jZWxGdW5jdGlvbjogYW55LFxuXHRvQ29udGV4dDogYW55LFxuXHRvQ29udHJvbGxlcjogYW55LFxuXHRiU2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuLFxuXHRuYXZpZ2F0aW9uVHlwZTogTmF2aWdhdGlvblR5cGUgPSBOYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXG5cdGNvbnN0IGNvbGxhYm9yYXRpb25Db25uZWN0ZWQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0Y29uc3QgcHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzID0gIWNvbGxhYm9yYXRpb25Db25uZWN0ZWRcblx0XHQ/IGZuUHJvY2Vzc0Z1bmN0aW9uXG5cdFx0OiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3Qob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0XHRcdFx0Zm5Qcm9jZXNzRnVuY3Rpb24uYXBwbHkobnVsbCwgLi4uYXJncyk7XG5cdFx0ICB9O1xuXG5cdGlmIChcblx0XHRvQ29udGV4dCAmJlxuXHRcdG9Db250ZXh0LmdldE9iamVjdCgpICYmXG5cdFx0KCFvQ29udGV4dC5nZXRPYmplY3QoKS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YSB8fCBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSlcblx0KSB7XG5cdFx0Zm5Qcm9jZXNzRnVuY3Rpb24oKTtcblx0fSBlbHNlIHtcblx0XHRkcmFmdERhdGFDb250ZXh0XG5cdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIEZDTCBtb2RlIHNvIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG9cblx0XHRcdFx0XHRcdC8vIHRoZSBvbGQgbG9naWMgc2luY2UgdGhlIGRpcnR5IHN0YXRlIGhhbmRsaW5nIGlzIG5vdCBwcm9wZXJseSB3b3JraW5nXG5cdFx0XHRcdFx0XHQvLyBmb3IgRkNMLlxuXHRcdFx0XHRcdFx0aWYgKCEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKSkge1xuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZXJlIGlzIG5vIGFjdGl2ZSBlbnRpdHkgc28gd2UgYXJlIGVkaXRpbmcgZWl0aGVyIG5ld2x5IGNyZWF0ZWQgZGF0YSBvclxuXHRcdFx0XHRcdFx0Ly8gYSBkcmFmdCB3aGljaCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBhY3RpdmUgdmVyc2lvblxuXHRcdFx0XHRcdFx0Ly8gU2luY2Ugd2Ugd2FudCB0byByZWFjdCBkaWZmZXJlbnRseSBpbiB0aGUgdHdvIHNpdHVhdGlvbnMsIHdlIGhhdmUgdG8gY2hlY2sgdGhlXG5cdFx0XHRcdFx0XHQvLyBkaXJ0eSBzdGF0ZVxuXHRcdFx0XHRcdFx0aWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlIGRhdGEgaXMgYmVpbmcgbmV3bHkgY3JlYXRlZCBhbmQgdGhlbiB3ZSBhbHdheXMgd2FudCB0b1xuXHRcdFx0XHRcdFx0XHQvLyBzaG93IHRoZSBkYXRhbG9zcyBkaWFsb2cgb24gbmF2aWdhdGlvblxuXHRcdFx0XHRcdFx0XHREYXRhTG9zc09yRHJhZnREaXNjYXJkSGFuZGxlci5wZXJmb3JtQWZ0ZXJEaXNjYXJkb3JLZWVwRHJhZnQoXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzLFxuXHRcdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0YlNraXBCaW5kaW5nVG9WaWV3XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBhcmUgZWRpdGluZyBhIGRyYWZ0IHdoaWNoIGhhcyBiZWVuIGNyZWF0ZWQgZWFybGllciBidXQgbmV2ZXIgc2F2ZWQgdG8gYWN0aXZlXG5cdFx0XHRcdFx0XHRcdC8vIHZlcnNpb24gYW5kIHNpbmNlIHRoZSBlZGl0IHN0YXRlIGlzIG5vdCBkaXJ0eSwgdGhlcmUgaGF2ZSBiZWVuIG5vIHVzZXIgY2hhbmdlc1xuXHRcdFx0XHRcdFx0XHQvLyBzbyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBzaWxlbnRseSBuYXZpZ2F0ZSBhbmQgZG8gbm90aGluZ1xuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgPT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZSkge1xuXHRcdFx0XHRcdFx0Ly8gV2UgYXJlIGVkaXRpbmcgYSBkcmFmdCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGVudGl0eVxuXHRcdFx0XHRcdFx0Ly8gVGhlIENyZWF0aW9uRGF0ZVRpbWUgYW5kIExhc3RDaGFuZ2VEYXRlVGltZSBhcmUgZXF1YWwsIHNvIHRoaXMgZHJhZnQgd2FzXG5cdFx0XHRcdFx0XHQvLyBuZXZlciBzYXZlZCBiZWZvcmUsIGhlbmNlIHdlJ3JlIGN1cnJlbnRseSBlZGl0aW5nIGEgbmV3bHkgY3JlYXRlZCBkcmFmdCBmb3Jcblx0XHRcdFx0XHRcdC8vIGFuIGV4aXN0aW5nIGFjdGl2ZSBlbnRpdHkgZm9yIHRoZSBmaXJzdCB0aW1lLlxuXHRcdFx0XHRcdFx0Ly8gQWxzbyB0aGVyZSBoYXZlIHNvIGZhciBiZWVuIG5vIGNoYW5nZXMgbWFkZSB0byB0aGUgZHJhZnQgYW5kIGluIHRoaXNcblx0XHRcdFx0XHRcdC8vIGNhc2Ugd2Ugd2FudCB0byBzaWxlbnRseSBuYXZpZ2F0ZSBhbmQgZGVsZXRlIHRoZSBkcmFmdGluIGNhc2Ugb2YgYSBiYWNrXG5cdFx0XHRcdFx0XHQvLyBuYXZpZ2F0aW9uIGJ1dCBpbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gc2lsZW50bHkga2VlcCBpdCFcblx0XHRcdFx0XHRcdGlmIChuYXZpZ2F0aW9uVHlwZSA9PT0gTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHRcdFx0c2tpcERpc2NhcmRQb3BvdmVyOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLmVkaXRGbG93XG5cdFx0XHRcdFx0XHRcdFx0LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaCgoZXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY2FuY2VsaW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgZm9yd2FyZCBuYXZpZ2F0aW9uIHdlIHNpbGVudGx5IGtlZXAgdGhlIGRyYWZ0IGFuZCBvbmx5XG5cdFx0XHRcdFx0XHRcdC8vIGV4ZWN1dGUgdGhlIGZvbGxvd3VwIGZ1bmN0aW9uLlxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKEVkaXRTdGF0ZS5pc0VkaXRTdGF0ZURpcnR5KCkpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBDcmVhdGlvbkRhdGVUaW1lIGFuZCBMYXN0Q2hhbmdlRGF0ZVRpbWUgYXJlIE5PVCBlcXVhbCwgc28gd2UgYXJlIGN1cnJlbnRseSBlZGl0aW5nXG5cdFx0XHRcdFx0XHQvLyBhbiBleGlzdGluZyBkcmFmdCBhbmQgbmVlZCB0byBkaXN0aW5ndWlzaCBkZXBlbmRpbmcgb24gaWYgYW55IGNoYW5nZXNcblx0XHRcdFx0XHRcdC8vIGhhdmUgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGVkaXRpbmcgc2Vzc2lvbiBvciBub3Rcblx0XHRcdFx0XHRcdC8vIENoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uIHNvIHdlIHdhbnRcblx0XHRcdFx0XHRcdC8vIHRvIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBhbmQgbGV0IHRoZSB1c2VyIGRlY2lkZVxuXHRcdFx0XHRcdFx0RGF0YUxvc3NPckRyYWZ0RGlzY2FyZEhhbmRsZXIucGVyZm9ybUFmdGVyRGlzY2FyZG9yS2VlcERyYWZ0KFxuXHRcdFx0XHRcdFx0XHRwcm9jZXNzRnVuY3Rpb25Gb3JEcmFmdHMsXG5cdFx0XHRcdFx0XHRcdGZuQ2FuY2VsRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdG9Db250cm9sbGVyLFxuXHRcdFx0XHRcdFx0XHRiU2tpcEJpbmRpbmdUb1ZpZXdcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoZSB1c2VyIHN0YXJ0ZWQgZWRpdGluZyB0aGUgZXhpc3RpbmcgZHJhZnQgYnV0IGRpZCBub3QgbWFrZSBhbnkgY2hhbmdlc1xuXHRcdFx0XHRcdFx0Ly8gaW4gdGhlIGN1cnJlbnQgZWRpdGluZyBzZXNzaW9uLCBzbyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnRcblx0XHRcdFx0XHRcdC8vIHRvIHNob3cgdGhlIGRhdGFsb3NzIGRpYWxvZyBidXQganVzdCBrZWVwIHRoZSBkcmFmdFxuXHRcdFx0XHRcdFx0cHJvY2Vzc0Z1bmN0aW9uRm9yRHJhZnRzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZuUHJvY2Vzc0Z1bmN0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSBkcmFmdERhdGFDb250ZXh0IGluZm9ybWF0aW9uXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxufVxuXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnQsXG5cdGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb246IGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24sXG5cdGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb246IGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24sXG5cdHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uOiBwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IE5hdmlnYXRpb25UeXBlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdfQ==
|