@sapui5/sap.fe.core 1.108.2 → 1.110.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/README.md +5 -1
- package/package.json +11 -9
- package/src/.eslintrc +7 -0
- package/src/sap/fe/core/.library +39 -37
- package/src/sap/fe/core/.supportrc +3 -3
- package/src/sap/fe/core/ActionRuntime.js +72 -27
- package/src/sap/fe/core/ActionRuntime.ts +104 -21
- package/src/sap/fe/core/AppComponent.js +102 -120
- package/src/sap/fe/core/AppComponent.ts +148 -45
- package/src/sap/fe/core/AppStateHandler.js +105 -91
- package/src/sap/fe/core/AppStateHandler.ts +85 -23
- package/src/sap/fe/core/BaseController.js +5 -20
- package/src/sap/fe/core/BaseController.ts +11 -2
- package/src/sap/fe/core/CommonUtils.js +770 -1079
- package/src/sap/fe/core/CommonUtils.ts +750 -491
- package/src/sap/fe/core/ExtensionAPI.js +69 -96
- package/src/sap/fe/core/ExtensionAPI.ts +15 -17
- package/src/sap/fe/core/PageController.js +21 -46
- package/src/sap/fe/core/PageController.ts +11 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -51
- package/src/sap/fe/core/TemplateComponent.ts +27 -16
- package/src/sap/fe/core/TemplateModel.js +18 -24
- package/src/sap/fe/core/TemplateModel.ts +25 -6
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
- package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
- package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
- package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
- package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +53 -98
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
- package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
- package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +4 -26
- package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
- package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
- package/src/sap/fe/core/controls/FileWrapper.js +51 -136
- package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
- package/src/sap/fe/core/controls/FilterBar.js +19 -54
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
- package/src/sap/fe/core/converters/ConverterContext.js +44 -98
- package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
- package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
- package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
- package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
- package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
- package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
- package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
- package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
- package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
- package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
- package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
- package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
- package/src/sap/fe/core/converters/helpers/ID.js +3 -17
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
- package/src/sap/fe/core/converters/helpers/Key.js +10 -19
- package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
- package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
- package/src/sap/fe/core/fpm/Component.js +2 -17
- package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
- package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
- package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
- package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
- package/src/sap/fe/core/helpers/EditState.js +2 -5
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
- package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
- package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
- package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
- package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
- package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
- package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
- package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
- package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
- package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
- package/src/sap/fe/core/helpers/Synchronization.js +1 -8
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library.js +9 -48
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/library.support.ts +3 -1
- package/src/sap/fe/core/library.ts +3 -8
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
- package/src/sap/fe/core/messagebundle.properties +113 -67
- package/src/sap/fe/core/messagebundle_ar.properties +20 -3
- package/src/sap/fe/core/messagebundle_bg.properties +22 -5
- package/src/sap/fe/core/messagebundle_ca.properties +21 -4
- package/src/sap/fe/core/messagebundle_cs.properties +21 -4
- package/src/sap/fe/core/messagebundle_cy.properties +22 -5
- package/src/sap/fe/core/messagebundle_da.properties +20 -3
- package/src/sap/fe/core/messagebundle_de.properties +38 -21
- package/src/sap/fe/core/messagebundle_el.properties +20 -3
- package/src/sap/fe/core/messagebundle_en.properties +38 -21
- package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
- package/src/sap/fe/core/messagebundle_es.properties +40 -23
- package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
- package/src/sap/fe/core/messagebundle_et.properties +20 -3
- package/src/sap/fe/core/messagebundle_fi.properties +20 -3
- package/src/sap/fe/core/messagebundle_fr.properties +21 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
- package/src/sap/fe/core/messagebundle_hi.properties +20 -3
- package/src/sap/fe/core/messagebundle_hr.properties +22 -5
- package/src/sap/fe/core/messagebundle_hu.properties +20 -3
- package/src/sap/fe/core/messagebundle_id.properties +20 -3
- package/src/sap/fe/core/messagebundle_it.properties +23 -6
- package/src/sap/fe/core/messagebundle_iw.properties +20 -3
- package/src/sap/fe/core/messagebundle_ja.properties +22 -5
- package/src/sap/fe/core/messagebundle_kk.properties +21 -4
- package/src/sap/fe/core/messagebundle_ko.properties +20 -3
- package/src/sap/fe/core/messagebundle_lt.properties +20 -3
- package/src/sap/fe/core/messagebundle_lv.properties +20 -3
- package/src/sap/fe/core/messagebundle_ms.properties +20 -3
- package/src/sap/fe/core/messagebundle_nl.properties +20 -3
- package/src/sap/fe/core/messagebundle_no.properties +20 -3
- package/src/sap/fe/core/messagebundle_pl.properties +21 -4
- package/src/sap/fe/core/messagebundle_pt.properties +20 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
- package/src/sap/fe/core/messagebundle_ro.properties +20 -3
- package/src/sap/fe/core/messagebundle_ru.properties +20 -3
- package/src/sap/fe/core/messagebundle_sh.properties +20 -3
- package/src/sap/fe/core/messagebundle_sk.properties +20 -3
- package/src/sap/fe/core/messagebundle_sl.properties +26 -9
- package/src/sap/fe/core/messagebundle_sv.properties +20 -3
- package/src/sap/fe/core/messagebundle_th.properties +21 -4
- package/src/sap/fe/core/messagebundle_tr.properties +20 -3
- package/src/sap/fe/core/messagebundle_uk.properties +23 -6
- package/src/sap/fe/core/messagebundle_vi.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
- package/src/sap/fe/core/operationsHelper.js +74 -101
- package/src/sap/fe/core/operationsHelper.ts +113 -44
- package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
- package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
- package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
- package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
- package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
- package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
- package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
- package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
- package/src/sap/fe/core/support/CommonHelper.js +7 -16
- package/src/sap/fe/core/support/Diagnostics.js +1 -10
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
- package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
- package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
- package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +40 -111
- package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
- package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
- package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
- package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
- package/src/sap/fe/core/templating/UIFormatters.js +40 -180
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
- package/src/sap/fe/core/type/Email.js +1 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -11
- package/ui5.yaml +0 -1
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
- package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
- package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
|
@@ -6,18 +6,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _dec, _dec2, _dec3, _dec4, _class, _class2;
|
|
9
|
-
|
|
10
9
|
var publicExtension = ClassSupport.publicExtension;
|
|
11
10
|
var methodOverride = ClassSupport.methodOverride;
|
|
12
11
|
var defineUI5Class = ClassSupport.defineUI5Class;
|
|
13
12
|
var MessageType = TableFormatterTypes.MessageType;
|
|
14
|
-
|
|
15
13
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
16
|
-
|
|
17
14
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
18
|
-
|
|
19
15
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
20
|
-
|
|
21
16
|
var MessageTypeFromCriticality = {
|
|
22
17
|
"1": MessageType.Error,
|
|
23
18
|
"2": MessageType.Warning,
|
|
@@ -31,6 +26,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
31
26
|
Information: "None",
|
|
32
27
|
None: "None"
|
|
33
28
|
};
|
|
29
|
+
|
|
34
30
|
/**
|
|
35
31
|
* Function to get a message state from a calculated criticality of type 'Target'.
|
|
36
32
|
*
|
|
@@ -38,10 +34,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
38
34
|
* @param aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue,AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
|
|
39
35
|
* @returns Returns the corresponding MessageType
|
|
40
36
|
*/
|
|
41
|
-
|
|
42
37
|
function messageTypeFromTargetCalculation(kpiValue, aThresholds) {
|
|
43
38
|
var criticalityProperty;
|
|
44
|
-
|
|
45
39
|
if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
|
|
46
40
|
criticalityProperty = MessageType.Error;
|
|
47
41
|
} else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
|
|
@@ -57,9 +51,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
57
51
|
} else {
|
|
58
52
|
criticalityProperty = MessageType.Success;
|
|
59
53
|
}
|
|
60
|
-
|
|
61
54
|
return criticalityProperty;
|
|
62
55
|
}
|
|
56
|
+
|
|
63
57
|
/**
|
|
64
58
|
* Function to get a message state from a calculated criticality of type 'Minimize'.
|
|
65
59
|
*
|
|
@@ -67,11 +61,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
67
61
|
* @param aThresholds Thresholds to be used [AcceptanceRangeHighValue,ToleranceRangeHighValue,DeviationRangeHighValue].
|
|
68
62
|
* @returns Returns the corresponding MessageType
|
|
69
63
|
*/
|
|
70
|
-
|
|
71
|
-
|
|
72
64
|
function messageTypeFromMinimizeCalculation(kpiValue, aThresholds) {
|
|
73
65
|
var criticalityProperty;
|
|
74
|
-
|
|
75
66
|
if (aThresholds[2] !== undefined && aThresholds[2] !== null && kpiValue > aThresholds[2]) {
|
|
76
67
|
criticalityProperty = MessageType.Error;
|
|
77
68
|
} else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue > aThresholds[1]) {
|
|
@@ -81,9 +72,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
81
72
|
} else {
|
|
82
73
|
criticalityProperty = MessageType.Success;
|
|
83
74
|
}
|
|
84
|
-
|
|
85
75
|
return criticalityProperty;
|
|
86
76
|
}
|
|
77
|
+
|
|
87
78
|
/**
|
|
88
79
|
* Function to get a message state from a calculated criticality of type 'Maximize'.
|
|
89
80
|
*
|
|
@@ -91,11 +82,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
91
82
|
* @param aThresholds Thresholds to be used [DeviationRangeLowValue,ToleranceRangeLowValue,AcceptanceRangeLowValue].
|
|
92
83
|
* @returns Returns the corresponding MessageType
|
|
93
84
|
*/
|
|
94
|
-
|
|
95
|
-
|
|
96
85
|
function messageTypeFromMaximizeCalculation(kpiValue, aThresholds) {
|
|
97
86
|
var criticalityProperty;
|
|
98
|
-
|
|
99
87
|
if (aThresholds[0] !== undefined && aThresholds[0] !== null && kpiValue < aThresholds[0]) {
|
|
100
88
|
criticalityProperty = MessageType.Error;
|
|
101
89
|
} else if (aThresholds[1] !== undefined && aThresholds[1] !== null && kpiValue < aThresholds[1]) {
|
|
@@ -105,45 +93,36 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
105
93
|
} else {
|
|
106
94
|
criticalityProperty = MessageType.Success;
|
|
107
95
|
}
|
|
108
|
-
|
|
109
96
|
return criticalityProperty;
|
|
110
97
|
}
|
|
98
|
+
|
|
111
99
|
/**
|
|
112
100
|
* Function to calculate a DeviationIndicator value from a trend value.
|
|
113
101
|
*
|
|
114
102
|
* @param trendValue The criticality values.
|
|
115
103
|
* @returns Returns the corresponding DeviationIndicator value
|
|
116
104
|
*/
|
|
117
|
-
|
|
118
|
-
|
|
119
105
|
function deviationIndicatorFromTrendType(trendValue) {
|
|
120
106
|
var deviationIndicator;
|
|
121
|
-
|
|
122
107
|
switch (trendValue) {
|
|
123
108
|
case 1: // StrongUp
|
|
124
|
-
|
|
125
109
|
case "1":
|
|
126
110
|
case 2: // Up
|
|
127
|
-
|
|
128
111
|
case "2":
|
|
129
112
|
deviationIndicator = "Up";
|
|
130
113
|
break;
|
|
131
|
-
|
|
132
114
|
case 4: // Down
|
|
133
|
-
|
|
134
115
|
case "4":
|
|
135
116
|
case 5: // StrongDown
|
|
136
|
-
|
|
137
117
|
case "5":
|
|
138
118
|
deviationIndicator = "Down";
|
|
139
119
|
break;
|
|
140
|
-
|
|
141
120
|
default:
|
|
142
121
|
deviationIndicator = "None";
|
|
143
122
|
}
|
|
144
|
-
|
|
145
123
|
return deviationIndicator;
|
|
146
124
|
}
|
|
125
|
+
|
|
147
126
|
/**
|
|
148
127
|
* Function to calculate a DeviationIndicator from a TrendCalculation.
|
|
149
128
|
*
|
|
@@ -153,17 +132,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
153
132
|
* @param aThresholds Array of thresholds [StrongDownDifference, DownDifference, UpDifference, StrongUpDifference]
|
|
154
133
|
* @returns Returns the corresponding DeviationIndicator value
|
|
155
134
|
*/
|
|
156
|
-
|
|
157
|
-
|
|
158
135
|
function deviationIndicatorFromCalculation(kpiValue, referenceValue, isRelative, aThresholds) {
|
|
159
136
|
var deviationIndicator;
|
|
160
|
-
|
|
161
137
|
if (!aThresholds || isRelative && !referenceValue) {
|
|
162
138
|
return "None";
|
|
163
139
|
}
|
|
164
|
-
|
|
165
140
|
var compValue = isRelative ? (kpiValue - referenceValue) / referenceValue : kpiValue - referenceValue;
|
|
166
|
-
|
|
167
141
|
if (aThresholds[0] !== undefined && aThresholds[0] !== null && compValue <= aThresholds[0]) {
|
|
168
142
|
// StrongDown --> Down
|
|
169
143
|
deviationIndicator = "Down";
|
|
@@ -180,17 +154,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
180
154
|
// Sideways --> None
|
|
181
155
|
deviationIndicator = "None";
|
|
182
156
|
}
|
|
183
|
-
|
|
184
157
|
return deviationIndicator;
|
|
185
158
|
}
|
|
159
|
+
|
|
186
160
|
/**
|
|
187
161
|
* Creates a sap.ui.model.Filter from a filter definition.
|
|
188
162
|
*
|
|
189
163
|
* @param filterDefinition The filter definition
|
|
190
164
|
* @returns Returns a sap.ui.model.Filter from the definition, or undefined if the definition is empty (no ranges)
|
|
191
165
|
*/
|
|
192
|
-
|
|
193
|
-
|
|
194
166
|
function createFilterFromDefinition(filterDefinition) {
|
|
195
167
|
if (filterDefinition.ranges.length === 0) {
|
|
196
168
|
return undefined;
|
|
@@ -206,52 +178,39 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
206
178
|
});
|
|
207
179
|
}
|
|
208
180
|
}
|
|
209
|
-
|
|
210
181
|
function getFilterStringFromDefinition(filterDefinition) {
|
|
211
182
|
var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
|
|
212
183
|
var resBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
213
184
|
var dateFormat = DateFormat.getDateInstance({
|
|
214
185
|
style: "medium"
|
|
215
186
|
}, currentLocale);
|
|
216
|
-
|
|
217
187
|
function formatRange(range) {
|
|
218
188
|
var valueLow = filterDefinition.propertyType.indexOf("Edm.Date") === 0 ? dateFormat.format(new Date(range.rangeLow)) : range.rangeLow;
|
|
219
189
|
var valueHigh = filterDefinition.propertyType.indexOf("Edm.Date") === 0 ? dateFormat.format(new Date(range.rangeHigh)) : range.rangeHigh;
|
|
220
|
-
|
|
221
190
|
switch (range.operator) {
|
|
222
191
|
case "BT":
|
|
223
192
|
return "[".concat(valueLow, " - ").concat(valueHigh, "]");
|
|
224
|
-
|
|
225
193
|
case "Contains":
|
|
226
194
|
return "*".concat(valueLow, "*");
|
|
227
|
-
|
|
228
195
|
case "GE":
|
|
229
196
|
return "\u2265".concat(valueLow);
|
|
230
|
-
|
|
231
197
|
case "GT":
|
|
232
198
|
return ">".concat(valueLow);
|
|
233
|
-
|
|
234
199
|
case "LE":
|
|
235
200
|
return "\u2264".concat(valueLow);
|
|
236
|
-
|
|
237
201
|
case "LT":
|
|
238
202
|
return "<".concat(valueLow);
|
|
239
|
-
|
|
240
203
|
case "NB":
|
|
241
204
|
return resBundle.getText("C_KPICARD_FILTERSTRING_NOT", ["[".concat(valueLow, " - ").concat(valueHigh, "]")]);
|
|
242
|
-
|
|
243
205
|
case "NE":
|
|
244
206
|
return "\u2260".concat(valueLow);
|
|
245
|
-
|
|
246
207
|
case "NotContains":
|
|
247
208
|
return resBundle.getText("C_KPICARD_FILTERSTRING_NOT", ["*".concat(valueLow, "*")]);
|
|
248
|
-
|
|
249
209
|
case "EQ":
|
|
250
210
|
default:
|
|
251
211
|
return valueLow;
|
|
252
212
|
}
|
|
253
213
|
}
|
|
254
|
-
|
|
255
214
|
if (filterDefinition.ranges.length === 0) {
|
|
256
215
|
return "";
|
|
257
216
|
} else if (filterDefinition.ranges.length === 1) {
|
|
@@ -260,10 +219,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
260
219
|
return "(".concat(filterDefinition.ranges.map(formatRange).join(","), ")");
|
|
261
220
|
}
|
|
262
221
|
}
|
|
263
|
-
|
|
264
222
|
function formatChartTitle(kpiDef) {
|
|
265
223
|
var resBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
266
|
-
|
|
267
224
|
function formatList(items) {
|
|
268
225
|
if (items.length === 0) {
|
|
269
226
|
return "";
|
|
@@ -271,18 +228,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
271
228
|
return items[0].label;
|
|
272
229
|
} else {
|
|
273
230
|
var res = items[0].label;
|
|
274
|
-
|
|
275
231
|
for (var I = 1; I < items.length - 1; I++) {
|
|
276
232
|
res += ", ".concat(items[I].label);
|
|
277
233
|
}
|
|
278
|
-
|
|
279
234
|
return resBundle.getText("C_KPICARD_ITEMSLIST", [res, items[items.length - 1].label]);
|
|
280
235
|
}
|
|
281
236
|
}
|
|
282
|
-
|
|
283
237
|
return resBundle.getText("C_KPICARD_CHARTTITLE", [formatList(kpiDef.chart.measures), formatList(kpiDef.chart.dimensions)]);
|
|
284
238
|
}
|
|
285
|
-
|
|
286
239
|
function updateChartLabelSettings(chartDefinition, oChartProperties) {
|
|
287
240
|
switch (chartDefinition.chartType) {
|
|
288
241
|
case "Donut":
|
|
@@ -306,7 +259,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
306
259
|
formatString: "ShortFloat_MFD2"
|
|
307
260
|
};
|
|
308
261
|
break;
|
|
309
|
-
|
|
310
262
|
case "bubble":
|
|
311
263
|
// Show axis title, bubble size legend, do not show data labels
|
|
312
264
|
oChartProperties.valueAxis = {
|
|
@@ -338,7 +290,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
338
290
|
visible: false
|
|
339
291
|
};
|
|
340
292
|
break;
|
|
341
|
-
|
|
342
293
|
case "scatter":
|
|
343
294
|
// Do not show data labels and axis titles
|
|
344
295
|
oChartProperties.valueAxis = {
|
|
@@ -361,7 +312,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
361
312
|
visible: false
|
|
362
313
|
};
|
|
363
314
|
break;
|
|
364
|
-
|
|
365
315
|
default:
|
|
366
316
|
// Do not show data labels and axis titles
|
|
367
317
|
oChartProperties.categoryAxis = {
|
|
@@ -382,7 +332,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
382
332
|
};
|
|
383
333
|
}
|
|
384
334
|
}
|
|
385
|
-
|
|
386
335
|
function filterMap(aObjects, aRoles) {
|
|
387
336
|
if (aRoles && aRoles.length) {
|
|
388
337
|
return aObjects.filter(function (dimension) {
|
|
@@ -396,122 +345,113 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
396
345
|
});
|
|
397
346
|
}
|
|
398
347
|
}
|
|
399
|
-
|
|
400
348
|
function getScatterBubbleChartFeeds(chartDefinition) {
|
|
401
349
|
var axis1Measures = filterMap(chartDefinition.measures, ["Axis1"]);
|
|
402
350
|
var axis2Measures = filterMap(chartDefinition.measures, ["Axis2"]);
|
|
403
351
|
var axis3Measures = filterMap(chartDefinition.measures, ["Axis3"]);
|
|
404
352
|
var otherMeasures = filterMap(chartDefinition.measures, [undefined]);
|
|
405
|
-
var seriesDimensions = filterMap(chartDefinition.dimensions, ["Series"]);
|
|
353
|
+
var seriesDimensions = filterMap(chartDefinition.dimensions, ["Series"]);
|
|
406
354
|
|
|
355
|
+
// Get the first dimension with role "Category" for the shape
|
|
407
356
|
var shapeDimension = chartDefinition.dimensions.find(function (dimension) {
|
|
408
357
|
return dimension.role === "Category";
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
var xMeasure = axis1Measures.shift() || axis2Measures.shift() || axis3Measures.shift() || otherMeasures.shift() || ""; // Measure for the y-Axis : first measure for Axis2, or second measure for Axis1 if not found, or first measure for Axis3 if not found
|
|
358
|
+
});
|
|
412
359
|
|
|
360
|
+
// Measure for the x-Axis : first measure for Axis1, or for Axis2 if not found, or for Axis3 if not found
|
|
361
|
+
var xMeasure = axis1Measures.shift() || axis2Measures.shift() || axis3Measures.shift() || otherMeasures.shift() || "";
|
|
362
|
+
// Measure for the y-Axis : first measure for Axis2, or second measure for Axis1 if not found, or first measure for Axis3 if not found
|
|
413
363
|
var yMeasure = axis2Measures.shift() || axis1Measures.shift() || axis3Measures.shift() || otherMeasures.shift() || "";
|
|
414
364
|
var res = [{
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
365
|
+
uid: "valueAxis",
|
|
366
|
+
type: "Measure",
|
|
367
|
+
values: [xMeasure]
|
|
418
368
|
}, {
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
369
|
+
uid: "valueAxis2",
|
|
370
|
+
type: "Measure",
|
|
371
|
+
values: [yMeasure]
|
|
422
372
|
}];
|
|
423
|
-
|
|
424
373
|
if (chartDefinition.chartType === "bubble") {
|
|
425
374
|
// Measure for the size of the bubble: first measure for Axis3, or remaining measure for Axis1/Axis2 if not found
|
|
426
375
|
var sizeMeasure = axis3Measures.shift() || axis1Measures.shift() || axis2Measures.shift() || otherMeasures.shift() || "";
|
|
427
376
|
res.push({
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
377
|
+
uid: "bubbleWidth",
|
|
378
|
+
type: "Measure",
|
|
379
|
+
values: [sizeMeasure]
|
|
431
380
|
});
|
|
432
|
-
}
|
|
433
|
-
|
|
381
|
+
}
|
|
434
382
|
|
|
383
|
+
// Color (optional)
|
|
435
384
|
if (seriesDimensions.length) {
|
|
436
385
|
res.push({
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
386
|
+
uid: "color",
|
|
387
|
+
type: "Dimension",
|
|
388
|
+
values: seriesDimensions
|
|
440
389
|
});
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
|
|
390
|
+
}
|
|
391
|
+
// Shape (optional)
|
|
444
392
|
if (shapeDimension) {
|
|
445
393
|
res.push({
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
394
|
+
uid: "shape",
|
|
395
|
+
type: "Dimension",
|
|
396
|
+
values: [shapeDimension.label]
|
|
449
397
|
});
|
|
450
398
|
}
|
|
451
|
-
|
|
452
399
|
return res;
|
|
453
400
|
}
|
|
454
|
-
|
|
455
401
|
function getChartFeeds(chartDefinition) {
|
|
456
402
|
var res;
|
|
457
|
-
|
|
458
403
|
switch (chartDefinition.chartType) {
|
|
459
404
|
case "Donut":
|
|
460
405
|
res = [{
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
406
|
+
uid: "size",
|
|
407
|
+
type: "Measure",
|
|
408
|
+
values: filterMap(chartDefinition.measures)
|
|
464
409
|
}, {
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
410
|
+
uid: "color",
|
|
411
|
+
type: "Dimension",
|
|
412
|
+
values: filterMap(chartDefinition.dimensions)
|
|
468
413
|
}];
|
|
469
414
|
break;
|
|
470
|
-
|
|
471
415
|
case "bubble":
|
|
472
416
|
case "scatter":
|
|
473
417
|
res = getScatterBubbleChartFeeds(chartDefinition);
|
|
474
418
|
break;
|
|
475
|
-
|
|
476
419
|
case "vertical_bullet":
|
|
477
420
|
res = [{
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
421
|
+
uid: "actualValues",
|
|
422
|
+
type: "Measure",
|
|
423
|
+
values: filterMap(chartDefinition.measures, [undefined, "Axis1"])
|
|
481
424
|
}, {
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
425
|
+
uid: "targetValues",
|
|
426
|
+
type: "Measure",
|
|
427
|
+
values: filterMap(chartDefinition.measures, ["Axis2"])
|
|
485
428
|
}, {
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
429
|
+
uid: "categoryAxis",
|
|
430
|
+
type: "Dimension",
|
|
431
|
+
values: filterMap(chartDefinition.dimensions, [undefined, "Category"])
|
|
489
432
|
}, {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
433
|
+
uid: "color",
|
|
434
|
+
type: "Dimension",
|
|
435
|
+
values: filterMap(chartDefinition.dimensions, ["Series"])
|
|
493
436
|
}];
|
|
494
437
|
break;
|
|
495
|
-
|
|
496
438
|
default:
|
|
497
439
|
res = [{
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
440
|
+
uid: "valueAxis",
|
|
441
|
+
type: "Measure",
|
|
442
|
+
values: filterMap(chartDefinition.measures)
|
|
501
443
|
}, {
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
444
|
+
uid: "categoryAxis",
|
|
445
|
+
type: "Dimension",
|
|
446
|
+
values: filterMap(chartDefinition.dimensions, [undefined, "Category"])
|
|
505
447
|
}, {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
448
|
+
uid: "color",
|
|
449
|
+
type: "Dimension",
|
|
450
|
+
values: filterMap(chartDefinition.dimensions, ["Series"])
|
|
509
451
|
}];
|
|
510
452
|
}
|
|
511
|
-
|
|
512
453
|
return res;
|
|
513
454
|
}
|
|
514
|
-
|
|
515
455
|
function getNavigationParameters(navInfo, oShellService) {
|
|
516
456
|
if (navInfo.semanticObject) {
|
|
517
457
|
if (navInfo.action) {
|
|
@@ -531,9 +471,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
531
471
|
if (!oLink) {
|
|
532
472
|
// No primary intent...
|
|
533
473
|
return undefined;
|
|
534
|
-
}
|
|
535
|
-
|
|
474
|
+
}
|
|
536
475
|
|
|
476
|
+
// Check that the primary intent is not part of the unavailable actions
|
|
537
477
|
var oInfo = oShellService.parseShellHash(oLink.intent);
|
|
538
478
|
return navInfo.unavailableActions && navInfo.unavailableActions.indexOf(oInfo.action) >= 0 ? undefined : {
|
|
539
479
|
semanticObject: oInfo.semanticObject,
|
|
@@ -548,6 +488,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
548
488
|
}) : Promise.resolve(undefined);
|
|
549
489
|
}
|
|
550
490
|
}
|
|
491
|
+
|
|
551
492
|
/**
|
|
552
493
|
* @class A controller extension for managing the KPIs in an analytical list page
|
|
553
494
|
* @name sap.fe.core.controllerextensions.KPIManagement
|
|
@@ -555,17 +496,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
555
496
|
* @private
|
|
556
497
|
* @since 1.93.0
|
|
557
498
|
*/
|
|
558
|
-
|
|
559
|
-
|
|
560
499
|
var KPIManagementControllerExtension = (_dec = defineUI5Class("sap.fe.core.controllerextensions.KPIManagement"), _dec2 = methodOverride(), _dec3 = methodOverride(), _dec4 = publicExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
561
500
|
_inheritsLoose(KPIManagementControllerExtension, _ControllerExtension);
|
|
562
|
-
|
|
563
501
|
function KPIManagementControllerExtension() {
|
|
564
502
|
return _ControllerExtension.apply(this, arguments) || this;
|
|
565
503
|
}
|
|
566
|
-
|
|
567
504
|
var _proto = KPIManagementControllerExtension.prototype;
|
|
568
|
-
|
|
569
505
|
/**
|
|
570
506
|
* Creates the card manifest for a KPI definition and stores it in a JSON model.
|
|
571
507
|
*
|
|
@@ -574,7 +510,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
574
510
|
*/
|
|
575
511
|
_proto.initCardManifest = function initCardManifest(kpiDefinition, oKPIModel) {
|
|
576
512
|
var _kpiDefinition$select;
|
|
577
|
-
|
|
578
513
|
var oCardManifest = {
|
|
579
514
|
"sap.app": {
|
|
580
515
|
id: "sap.fe",
|
|
@@ -614,8 +549,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
614
549
|
}
|
|
615
550
|
}
|
|
616
551
|
}
|
|
617
|
-
};
|
|
552
|
+
};
|
|
618
553
|
|
|
554
|
+
// Add side indicators in the card header if a target is defined for the KPI
|
|
619
555
|
if (kpiDefinition.datapoint.targetPath || kpiDefinition.datapoint.targetValue !== undefined) {
|
|
620
556
|
var resBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
621
557
|
oCardManifest["sap.card"].header.sideIndicators = [{
|
|
@@ -627,25 +563,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
627
563
|
number: "{deviationNumber}",
|
|
628
564
|
unit: "%"
|
|
629
565
|
}];
|
|
630
|
-
}
|
|
631
|
-
|
|
566
|
+
}
|
|
632
567
|
|
|
568
|
+
// Details of the card: filter descriptions
|
|
633
569
|
if ((_kpiDefinition$select = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select !== void 0 && _kpiDefinition$select.length) {
|
|
634
570
|
var aDescriptions = [];
|
|
635
571
|
kpiDefinition.selectionVariantFilterDefinitions.forEach(function (filterDefinition) {
|
|
636
572
|
var desc = getFilterStringFromDefinition(filterDefinition);
|
|
637
|
-
|
|
638
573
|
if (desc) {
|
|
639
574
|
aDescriptions.push(desc);
|
|
640
575
|
}
|
|
641
576
|
});
|
|
642
|
-
|
|
643
577
|
if (aDescriptions.length) {
|
|
644
578
|
oCardManifest["sap.card"].header.details = aDescriptions.join(", ");
|
|
645
579
|
}
|
|
646
|
-
}
|
|
647
|
-
|
|
580
|
+
}
|
|
648
581
|
|
|
582
|
+
// Chart settings: type, title, dimensions and measures in the manifest
|
|
649
583
|
oCardManifest["sap.card"].content.chartType = kpiDefinition.chart.chartType;
|
|
650
584
|
updateChartLabelSettings(kpiDefinition.chart, oCardManifest["sap.card"].content.chartProperties);
|
|
651
585
|
oCardManifest["sap.card"].content.chartProperties.title.text = formatChartTitle(kpiDefinition);
|
|
@@ -666,7 +600,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
666
600
|
manifest: oCardManifest
|
|
667
601
|
});
|
|
668
602
|
};
|
|
669
|
-
|
|
670
603
|
_proto.initNavigationInfo = function initNavigationInfo(kpiDefinition, oKPIModel, oShellService) {
|
|
671
604
|
// Add navigation
|
|
672
605
|
if (kpiDefinition.navigation) {
|
|
@@ -682,86 +615,86 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
682
615
|
return Promise.resolve();
|
|
683
616
|
}
|
|
684
617
|
};
|
|
685
|
-
|
|
686
618
|
_proto.onInit = function onInit() {
|
|
687
619
|
var _getPageModel,
|
|
688
|
-
|
|
689
|
-
|
|
620
|
+
_this = this;
|
|
690
621
|
this.aKPIDefinitions = (_getPageModel = this.getView().getController()._getPageModel()) === null || _getPageModel === void 0 ? void 0 : _getPageModel.getProperty("/kpiDefinitions");
|
|
691
|
-
|
|
692
622
|
if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
|
|
693
623
|
var oView = this.getView();
|
|
694
|
-
var oAppComponent = oView.getController().getAppComponent();
|
|
624
|
+
var oAppComponent = oView.getController().getAppComponent();
|
|
695
625
|
|
|
626
|
+
// Create a JSON model to store KPI data
|
|
696
627
|
var oKPIModel = new JSONModel();
|
|
697
628
|
oView.setModel(oKPIModel, "kpiModel");
|
|
698
629
|
this.aKPIDefinitions.forEach(function (kpiDefinition) {
|
|
699
630
|
// Create the manifest for the KPI card and store it in the KPI model
|
|
700
|
-
_this.initCardManifest(kpiDefinition, oKPIModel);
|
|
701
|
-
|
|
631
|
+
_this.initCardManifest(kpiDefinition, oKPIModel);
|
|
702
632
|
|
|
633
|
+
// Set the navigation information in the manifest
|
|
703
634
|
_this.initNavigationInfo(kpiDefinition, oKPIModel, oAppComponent.getShellServices()).catch(function (err) {
|
|
704
635
|
Log.error(err);
|
|
705
|
-
});
|
|
706
|
-
|
|
636
|
+
});
|
|
707
637
|
|
|
638
|
+
// Load tag data for the KPI
|
|
708
639
|
_this.loadKPITagData(kpiDefinition, oAppComponent.getModel(), oKPIModel).catch(function (err) {
|
|
709
640
|
Log.error(err);
|
|
710
641
|
});
|
|
711
642
|
});
|
|
712
643
|
}
|
|
713
644
|
};
|
|
714
|
-
|
|
715
645
|
_proto.onExit = function onExit() {
|
|
716
646
|
var oKPIModel = this.getView().getModel("kpiModel");
|
|
717
|
-
|
|
718
647
|
if (oKPIModel) {
|
|
719
648
|
oKPIModel.destroy();
|
|
720
649
|
}
|
|
721
650
|
};
|
|
722
|
-
|
|
723
651
|
_proto.updateDatapointValueAndCurrency = function updateDatapointValueAndCurrency(kpiDefinition, kpiContext, oKPIModel) {
|
|
724
652
|
var _kpiDefinition$datapo, _kpiDefinition$datapo2, _kpiDefinition$datapo3;
|
|
725
|
-
|
|
726
653
|
var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
|
|
727
654
|
var rawUnit = (_kpiDefinition$datapo = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo !== void 0 && _kpiDefinition$datapo.isPath ? kpiContext.getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo2 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo2 === void 0 ? void 0 : _kpiDefinition$datapo2.value;
|
|
728
|
-
var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%";
|
|
729
|
-
// Main KPI value
|
|
655
|
+
var isPercentage = ((_kpiDefinition$datapo3 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo3 === void 0 ? void 0 : _kpiDefinition$datapo3.isCurrency) === false && rawUnit === "%";
|
|
730
656
|
|
|
731
|
-
|
|
657
|
+
// /////////////////////
|
|
658
|
+
// Main KPI value
|
|
659
|
+
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
|
|
732
660
|
|
|
661
|
+
// Value formatted with a scale
|
|
733
662
|
var kpiValue = NumberFormat.getFloatInstance({
|
|
734
663
|
style: isPercentage ? undefined : "short",
|
|
735
664
|
minFractionDigits: 0,
|
|
736
665
|
maxFractionDigits: 1,
|
|
737
666
|
showScale: !isPercentage
|
|
738
667
|
}, currentLocale).format(rawValue);
|
|
739
|
-
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValue"), kpiValue);
|
|
668
|
+
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValue"), kpiValue);
|
|
740
669
|
|
|
670
|
+
// Value without a scale
|
|
741
671
|
var kpiValueUnscaled = NumberFormat.getFloatInstance({
|
|
742
672
|
maxFractionDigits: 2,
|
|
743
673
|
showScale: false,
|
|
744
674
|
groupingEnabled: true
|
|
745
675
|
}, currentLocale).format(rawValue);
|
|
746
|
-
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValueUnscaled"), kpiValueUnscaled);
|
|
676
|
+
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValueUnscaled"), kpiValueUnscaled);
|
|
747
677
|
|
|
678
|
+
// Value formatted with the scale omitted
|
|
748
679
|
var kpiValueNoScale = NumberFormat.getFloatInstance({
|
|
749
680
|
style: isPercentage ? undefined : "short",
|
|
750
681
|
minFractionDigits: 0,
|
|
751
682
|
maxFractionDigits: 1,
|
|
752
683
|
showScale: false
|
|
753
684
|
}, currentLocale).format(rawValue);
|
|
754
|
-
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValueNoScale"), kpiValueNoScale);
|
|
685
|
+
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValueNoScale"), kpiValueNoScale);
|
|
755
686
|
|
|
687
|
+
// Scale of the value
|
|
756
688
|
var kpiValueScale = NumberFormat.getFloatInstance({
|
|
757
689
|
style: isPercentage ? undefined : "short",
|
|
758
690
|
decimals: 0,
|
|
759
691
|
maxIntegerDigits: 0,
|
|
760
692
|
showScale: true
|
|
761
693
|
}, currentLocale).format(rawValue);
|
|
762
|
-
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValueScale"), kpiValueScale);
|
|
763
|
-
// Unit or currency
|
|
694
|
+
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValueScale"), kpiValueScale);
|
|
764
695
|
|
|
696
|
+
// /////////////////////
|
|
697
|
+
// Unit or currency
|
|
765
698
|
if (kpiDefinition.datapoint.unit && rawUnit) {
|
|
766
699
|
if (kpiDefinition.datapoint.unit.isCurrency) {
|
|
767
700
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainUnit"), rawUnit);
|
|
@@ -774,11 +707,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
774
707
|
}
|
|
775
708
|
}
|
|
776
709
|
};
|
|
777
|
-
|
|
778
710
|
_proto.updateDatapointCriticality = function updateDatapointCriticality(kpiDefinition, kpiContext, oKPIModel) {
|
|
779
711
|
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
|
|
780
712
|
var criticalityValue = MessageType.None;
|
|
781
|
-
|
|
782
713
|
if (kpiDefinition.datapoint.criticalityValue) {
|
|
783
714
|
// Criticality is a fixed value
|
|
784
715
|
criticalityValue = kpiDefinition.datapoint.criticalityValue;
|
|
@@ -791,26 +722,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
791
722
|
case "UI.ImprovementDirectionType/Target":
|
|
792
723
|
criticalityValue = messageTypeFromTargetCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
|
|
793
724
|
break;
|
|
794
|
-
|
|
795
725
|
case "UI.ImprovementDirectionType/Minimize":
|
|
796
726
|
criticalityValue = messageTypeFromMinimizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
|
|
797
727
|
break;
|
|
798
|
-
|
|
799
728
|
case "UI.ImprovementDirectionType/Maximize":
|
|
800
729
|
default:
|
|
801
730
|
criticalityValue = messageTypeFromMaximizeCalculation(rawValue, kpiDefinition.datapoint.criticalityCalculationThresholds);
|
|
802
731
|
break;
|
|
803
732
|
}
|
|
804
733
|
}
|
|
805
|
-
|
|
806
734
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainCriticality"), criticalityValue);
|
|
807
735
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainState"), ValueColorFromMessageType[criticalityValue] || "None");
|
|
808
736
|
};
|
|
809
|
-
|
|
810
737
|
_proto.updateDatapointTrend = function updateDatapointTrend(kpiDefinition, kpiContext, oKPIModel) {
|
|
811
738
|
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
|
|
812
739
|
var trendValue = "None";
|
|
813
|
-
|
|
814
740
|
if (kpiDefinition.datapoint.trendValue) {
|
|
815
741
|
// Trend is a fixed value
|
|
816
742
|
trendValue = kpiDefinition.datapoint.trendValue;
|
|
@@ -820,19 +746,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
820
746
|
} else if (kpiDefinition.datapoint.trendCalculationReferenceValue !== undefined || kpiDefinition.datapoint.trendCalculationReferencePath) {
|
|
821
747
|
// Calculated trend
|
|
822
748
|
var trendReferenceValue;
|
|
823
|
-
|
|
824
749
|
if (kpiDefinition.datapoint.trendCalculationReferenceValue !== undefined) {
|
|
825
750
|
trendReferenceValue = kpiDefinition.datapoint.trendCalculationReferenceValue;
|
|
826
751
|
} else {
|
|
827
752
|
trendReferenceValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.trendCalculationReferencePath || ""));
|
|
828
753
|
}
|
|
829
|
-
|
|
830
754
|
trendValue = deviationIndicatorFromCalculation(rawValue, trendReferenceValue, !!kpiDefinition.datapoint.trendCalculationIsRelative, kpiDefinition.datapoint.trendCalculationTresholds);
|
|
831
755
|
}
|
|
832
|
-
|
|
833
756
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/trend"), trendValue);
|
|
834
757
|
};
|
|
835
|
-
|
|
836
758
|
_proto.updateTargetValue = function updateTargetValue(kpiDefinition, kpiContext, oKPIModel) {
|
|
837
759
|
if (kpiDefinition.datapoint.targetValue === undefined && kpiDefinition.datapoint.targetPath === undefined) {
|
|
838
760
|
return; // No target set for the KPI
|
|
@@ -841,15 +763,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
841
763
|
var rawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.propertyPath));
|
|
842
764
|
var currentLocale = new Locale(sap.ui.getCore().getConfiguration().getLanguage());
|
|
843
765
|
var targetRawValue;
|
|
844
|
-
|
|
845
766
|
if (kpiDefinition.datapoint.targetValue !== undefined) {
|
|
846
767
|
targetRawValue = kpiDefinition.datapoint.targetValue;
|
|
847
768
|
} else {
|
|
848
769
|
targetRawValue = Number.parseFloat(kpiContext.getProperty(kpiDefinition.datapoint.targetPath || ""));
|
|
849
770
|
}
|
|
771
|
+
var deviationRawValue = targetRawValue !== 0 ? (rawValue - targetRawValue) / targetRawValue * 100 : undefined;
|
|
850
772
|
|
|
851
|
-
|
|
852
|
-
|
|
773
|
+
// Formatting
|
|
853
774
|
var targetValue = NumberFormat.getFloatInstance({
|
|
854
775
|
style: "short",
|
|
855
776
|
minFractionDigits: 0,
|
|
@@ -864,7 +785,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
864
785
|
}, currentLocale).format(targetRawValue);
|
|
865
786
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/targetNumber"), targetValue);
|
|
866
787
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/targetUnit"), targetScale);
|
|
867
|
-
|
|
868
788
|
if (deviationRawValue !== undefined) {
|
|
869
789
|
var deviationValue = NumberFormat.getFloatInstance({
|
|
870
790
|
minFractionDigits: 0,
|
|
@@ -876,6 +796,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
876
796
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/deviationNumber"), "N/A");
|
|
877
797
|
}
|
|
878
798
|
}
|
|
799
|
+
|
|
879
800
|
/**
|
|
880
801
|
* Loads tag data for a KPI, and stores it in the JSON KPI model.
|
|
881
802
|
*
|
|
@@ -884,66 +805,59 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
884
805
|
* @param oKPIModel The JSON model where the data will be stored
|
|
885
806
|
* @param loadFull If not true, loads only data for the KPI tag
|
|
886
807
|
* @returns Returns the promise that is resolved when data is loaded.
|
|
887
|
-
|
|
888
|
-
;
|
|
889
|
-
|
|
808
|
+
*/;
|
|
890
809
|
_proto.loadKPITagData = function loadKPITagData(kpiDefinition, oMainModel, oKPIModel, loadFull) {
|
|
891
810
|
var _kpiDefinition$datapo4,
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
811
|
+
_kpiDefinition$select2,
|
|
812
|
+
_this2 = this;
|
|
895
813
|
// If loadFull=false, then we're just loading data for the tag and we use the "$auto.LongRunners" groupID
|
|
896
814
|
// If loadFull=true, we're loading data for the whole KPI (tag + card) and we use the default ("$auto") groupID
|
|
897
815
|
var oListBinding = loadFull ? oMainModel.bindList("/".concat(kpiDefinition.entitySet)) : oMainModel.bindList("/".concat(kpiDefinition.entitySet), undefined, undefined, undefined, {
|
|
898
816
|
$$groupId: "$auto.LongRunners"
|
|
899
817
|
});
|
|
900
|
-
var oAggregate = {};
|
|
818
|
+
var oAggregate = {};
|
|
901
819
|
|
|
820
|
+
// Main value + currency/unit
|
|
902
821
|
if ((_kpiDefinition$datapo4 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo4 !== void 0 && _kpiDefinition$datapo4.isPath) {
|
|
903
822
|
oAggregate[kpiDefinition.datapoint.propertyPath] = {
|
|
904
823
|
unit: kpiDefinition.datapoint.unit.value
|
|
905
824
|
};
|
|
906
825
|
} else {
|
|
907
826
|
oAggregate[kpiDefinition.datapoint.propertyPath] = {};
|
|
908
|
-
}
|
|
909
|
-
|
|
827
|
+
}
|
|
910
828
|
|
|
829
|
+
// Property for criticality
|
|
911
830
|
if (kpiDefinition.datapoint.criticalityPath) {
|
|
912
831
|
oAggregate[kpiDefinition.datapoint.criticalityPath] = {};
|
|
913
|
-
}
|
|
914
|
-
|
|
832
|
+
}
|
|
915
833
|
|
|
834
|
+
// Properties for trend and trend calculation
|
|
916
835
|
if (loadFull) {
|
|
917
836
|
if (kpiDefinition.datapoint.trendPath) {
|
|
918
837
|
oAggregate[kpiDefinition.datapoint.trendPath] = {};
|
|
919
838
|
}
|
|
920
|
-
|
|
921
839
|
if (kpiDefinition.datapoint.trendCalculationReferencePath) {
|
|
922
840
|
oAggregate[kpiDefinition.datapoint.trendCalculationReferencePath] = {};
|
|
923
841
|
}
|
|
924
|
-
|
|
925
842
|
if (kpiDefinition.datapoint.targetPath) {
|
|
926
843
|
oAggregate[kpiDefinition.datapoint.targetPath] = {};
|
|
927
844
|
}
|
|
928
845
|
}
|
|
929
|
-
|
|
930
846
|
oListBinding.setAggregation({
|
|
931
847
|
aggregate: oAggregate
|
|
932
|
-
});
|
|
848
|
+
});
|
|
933
849
|
|
|
850
|
+
// Manage SelectionVariant filters
|
|
934
851
|
if ((_kpiDefinition$select2 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select2 !== void 0 && _kpiDefinition$select2.length) {
|
|
935
852
|
var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
|
|
936
853
|
return filter !== undefined;
|
|
937
854
|
});
|
|
938
855
|
oListBinding.filter(aFilters);
|
|
939
856
|
}
|
|
940
|
-
|
|
941
857
|
return oListBinding.requestContexts(0, 1).then(function (aContexts) {
|
|
942
858
|
if (aContexts.length) {
|
|
943
859
|
var _kpiDefinition$datapo5, _kpiDefinition$datapo6;
|
|
944
|
-
|
|
945
860
|
var rawUnit = (_kpiDefinition$datapo5 = kpiDefinition.datapoint.unit) !== null && _kpiDefinition$datapo5 !== void 0 && _kpiDefinition$datapo5.isPath ? aContexts[0].getProperty(kpiDefinition.datapoint.unit.value) : (_kpiDefinition$datapo6 = kpiDefinition.datapoint.unit) === null || _kpiDefinition$datapo6 === void 0 ? void 0 : _kpiDefinition$datapo6.value;
|
|
946
|
-
|
|
947
861
|
if (kpiDefinition.datapoint.unit && !rawUnit) {
|
|
948
862
|
// A unit/currency is defined, but its value is undefined --> multi-unit situation
|
|
949
863
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/mainValue"), "*");
|
|
@@ -959,18 +873,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
959
873
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/deviationNumber"), undefined);
|
|
960
874
|
} else {
|
|
961
875
|
_this2.updateDatapointValueAndCurrency(kpiDefinition, aContexts[0], oKPIModel);
|
|
962
|
-
|
|
963
876
|
_this2.updateDatapointCriticality(kpiDefinition, aContexts[0], oKPIModel);
|
|
964
|
-
|
|
965
877
|
if (loadFull) {
|
|
966
878
|
_this2.updateDatapointTrend(kpiDefinition, aContexts[0], oKPIModel);
|
|
967
|
-
|
|
968
879
|
_this2.updateTargetValue(kpiDefinition, aContexts[0], oKPIModel);
|
|
969
880
|
}
|
|
970
881
|
}
|
|
971
882
|
}
|
|
972
883
|
});
|
|
973
884
|
}
|
|
885
|
+
|
|
974
886
|
/**
|
|
975
887
|
* Loads card data for a KPI, and stores it in the JSON KPI model.
|
|
976
888
|
*
|
|
@@ -978,12 +890,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
978
890
|
* @param oMainModel The model used to load the data.
|
|
979
891
|
* @param oKPIModel The JSON model where the data will be stored
|
|
980
892
|
* @returns Returns the promise that is resolved when data is loaded.
|
|
981
|
-
|
|
982
|
-
;
|
|
983
|
-
|
|
893
|
+
*/;
|
|
984
894
|
_proto.loadKPICardData = function loadKPICardData(kpiDefinition, oMainModel, oKPIModel) {
|
|
985
895
|
var _kpiDefinition$select3;
|
|
986
|
-
|
|
987
896
|
var oListBinding = oMainModel.bindList("/".concat(kpiDefinition.entitySet));
|
|
988
897
|
var oGroup = {};
|
|
989
898
|
var oAggregate = {};
|
|
@@ -996,22 +905,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
996
905
|
oListBinding.setAggregation({
|
|
997
906
|
group: oGroup,
|
|
998
907
|
aggregate: oAggregate
|
|
999
|
-
});
|
|
908
|
+
});
|
|
1000
909
|
|
|
910
|
+
// Manage SelectionVariant filters
|
|
1001
911
|
if ((_kpiDefinition$select3 = kpiDefinition.selectionVariantFilterDefinitions) !== null && _kpiDefinition$select3 !== void 0 && _kpiDefinition$select3.length) {
|
|
1002
912
|
var aFilters = kpiDefinition.selectionVariantFilterDefinitions.map(createFilterFromDefinition).filter(function (filter) {
|
|
1003
913
|
return filter !== undefined;
|
|
1004
914
|
});
|
|
1005
915
|
oListBinding.filter(aFilters);
|
|
1006
|
-
}
|
|
1007
|
-
|
|
916
|
+
}
|
|
1008
917
|
|
|
918
|
+
// Sorting
|
|
1009
919
|
if (kpiDefinition.chart.sortOrder) {
|
|
1010
920
|
oListBinding.sort(kpiDefinition.chart.sortOrder.map(function (sortInfo) {
|
|
1011
921
|
return new Sorter(sortInfo.name, sortInfo.descending);
|
|
1012
922
|
}));
|
|
1013
923
|
}
|
|
1014
|
-
|
|
1015
924
|
return oListBinding.requestContexts(0, kpiDefinition.chart.maxItems).then(function (aContexts) {
|
|
1016
925
|
var chartData = aContexts.map(function (oContext) {
|
|
1017
926
|
var oData = {};
|
|
@@ -1026,6 +935,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
1026
935
|
oKPIModel.setProperty("/".concat(kpiDefinition.id, "/manifest/sap.card/data/json/chartData"), chartData);
|
|
1027
936
|
});
|
|
1028
937
|
}
|
|
938
|
+
|
|
1029
939
|
/**
|
|
1030
940
|
* Gets the popover to display the KPI card
|
|
1031
941
|
* The popover and the contained card for the KPIs are created if necessary.
|
|
@@ -1033,12 +943,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
1033
943
|
*
|
|
1034
944
|
* @param oKPITag The tag that triggered the popover opening.
|
|
1035
945
|
* @returns The shared popover as a promise.
|
|
1036
|
-
|
|
1037
|
-
;
|
|
1038
|
-
|
|
946
|
+
*/;
|
|
1039
947
|
_proto.getPopover = function getPopover(oKPITag) {
|
|
1040
948
|
var _this3 = this;
|
|
1041
|
-
|
|
1042
949
|
if (!this.oPopover) {
|
|
1043
950
|
return new Promise(function (resolve, reject) {
|
|
1044
951
|
Core.loadLibrary("sap/ui/integration", {
|
|
@@ -1049,7 +956,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
1049
956
|
oHost.attachAction(function (oEvent) {
|
|
1050
957
|
var sType = oEvent.getParameter("type");
|
|
1051
958
|
var oParams = oEvent.getParameter("parameters");
|
|
1052
|
-
|
|
1053
959
|
if (sType === "Navigation") {
|
|
1054
960
|
if (oParams.semanticObject) {
|
|
1055
961
|
_this3.getView().getController()._intentBasedNavigation.navigate(oParams.semanticObject, oParams.action);
|
|
@@ -1062,9 +968,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
1062
968
|
width: "25rem",
|
|
1063
969
|
height: "auto"
|
|
1064
970
|
});
|
|
1065
|
-
|
|
1066
971
|
_this3.oCard.setHost(oHost);
|
|
1067
|
-
|
|
1068
972
|
_this3.oPopover = new Popover("kpi-Popover", {
|
|
1069
973
|
showHeader: false,
|
|
1070
974
|
placement: "Auto",
|
|
@@ -1082,25 +986,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
1082
986
|
return Promise.resolve(this.oPopover);
|
|
1083
987
|
}
|
|
1084
988
|
};
|
|
1085
|
-
|
|
1086
989
|
_proto.onKPIPressed = function onKPIPressed(oKPITag, kpiID) {
|
|
1087
990
|
var _this4 = this;
|
|
1088
|
-
|
|
1089
991
|
var oKPIModel = oKPITag.getModel("kpiModel");
|
|
1090
|
-
|
|
1091
992
|
if (this.aKPIDefinitions && this.aKPIDefinitions.length) {
|
|
1092
993
|
var kpiDefinition = this.aKPIDefinitions.find(function (oDef) {
|
|
1093
994
|
return oDef.id === kpiID;
|
|
1094
995
|
});
|
|
1095
|
-
|
|
1096
996
|
if (kpiDefinition) {
|
|
1097
997
|
var oModel = oKPITag.getModel();
|
|
1098
998
|
var aPromises = [this.loadKPITagData(kpiDefinition, oModel, oKPIModel, true), this.loadKPICardData(kpiDefinition, oModel, oKPIModel), this.getPopover(oKPITag)];
|
|
1099
999
|
Promise.all(aPromises).then(function (aResults) {
|
|
1100
1000
|
_this4.oCard.setManifest(oKPIModel.getProperty("/".concat(kpiID, "/manifest")));
|
|
1101
|
-
|
|
1102
1001
|
_this4.oCard.refresh();
|
|
1103
|
-
|
|
1104
1002
|
var oPopover = aResults[2];
|
|
1105
1003
|
oPopover.openBy(oKPITag, false);
|
|
1106
1004
|
}).catch(function (err) {
|
|
@@ -1109,9 +1007,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/TableFormatterTypes", "sa
|
|
|
1109
1007
|
}
|
|
1110
1008
|
}
|
|
1111
1009
|
};
|
|
1112
|
-
|
|
1113
1010
|
return KPIManagementControllerExtension;
|
|
1114
1011
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onExit", [_dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "onExit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onKPIPressed", [_dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "onKPIPressed"), _class2.prototype)), _class2)) || _class);
|
|
1115
1012
|
return KPIManagementControllerExtension;
|
|
1116
1013
|
}, false);
|
|
1117
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiVmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZSIsIk5vbmUiLCJtZXNzYWdlVHlwZUZyb21UYXJnZXRDYWxjdWxhdGlvbiIsImtwaVZhbHVlIiwiYVRocmVzaG9sZHMiLCJjcml0aWNhbGl0eVByb3BlcnR5IiwidW5kZWZpbmVkIiwibWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbiIsIm1lc3NhZ2VUeXBlRnJvbU1heGltaXplQ2FsY3VsYXRpb24iLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwidHJlbmRWYWx1ZSIsImRldmlhdGlvbkluZGljYXRvciIsImRldmlhdGlvbkluZGljYXRvckZyb21DYWxjdWxhdGlvbiIsInJlZmVyZW5jZVZhbHVlIiwiaXNSZWxhdGl2ZSIsImNvbXBWYWx1ZSIsImNyZWF0ZUZpbHRlckZyb21EZWZpbml0aW9uIiwiZmlsdGVyRGVmaW5pdGlvbiIsInJhbmdlcyIsImxlbmd0aCIsIkZpbHRlciIsInByb3BlcnR5UGF0aCIsIm9wZXJhdG9yIiwicmFuZ2VMb3ciLCJyYW5nZUhpZ2giLCJhUmFuZ2VGaWx0ZXJzIiwibWFwIiwicmFuZ2UiLCJmaWx0ZXJzIiwiYW5kIiwiZ2V0RmlsdGVyU3RyaW5nRnJvbURlZmluaXRpb24iLCJjdXJyZW50TG9jYWxlIiwiTG9jYWxlIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0Q29uZmlndXJhdGlvbiIsImdldExhbmd1YWdlIiwicmVzQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsImZvcm1hdENoYXJ0VGl0bGUiLCJrcGlEZWYiLCJmb3JtYXRMaXN0IiwiaXRlbXMiLCJsYWJlbCIsInJlcyIsIkkiLCJjaGFydCIsIm1lYXN1cmVzIiwiZGltZW5zaW9ucyIsInVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyIsImNoYXJ0RGVmaW5pdGlvbiIsIm9DaGFydFByb3BlcnRpZXMiLCJjaGFydFR5cGUiLCJjYXRlZ29yeUF4aXMiLCJ0aXRsZSIsInZpc2libGUiLCJ2YWx1ZUF4aXMiLCJmb3JtYXRTdHJpbmciLCJwbG90QXJlYSIsImRhdGFMYWJlbCIsInR5cGUiLCJ2YWx1ZUF4aXMyIiwibGVnZW5kR3JvdXAiLCJsYXlvdXQiLCJwb3NpdGlvbiIsImFsaWdubWVudCIsInNpemVMZWdlbmQiLCJmaWx0ZXJNYXAiLCJhT2JqZWN0cyIsImFSb2xlcyIsImZpbHRlciIsImRpbWVuc2lvbiIsInJvbGUiLCJnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyIsImF4aXMxTWVhc3VyZXMiLCJheGlzMk1lYXN1cmVzIiwiYXhpczNNZWFzdXJlcyIsIm90aGVyTWVhc3VyZXMiLCJzZXJpZXNEaW1lbnNpb25zIiwic2hhcGVEaW1lbnNpb24iLCJmaW5kIiwieE1lYXN1cmUiLCJzaGlmdCIsInlNZWFzdXJlIiwic2l6ZU1lYXN1cmUiLCJwdXNoIiwiZ2V0Q2hhcnRGZWVkcyIsImdldE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibmF2SW5mbyIsIm9TaGVsbFNlcnZpY2UiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsImdldExpbmtzIiwidGhlbiIsImFMaW5rcyIsImdldFByaW1hcnlJbnRlbnQiLCJvTGluayIsIm9JbmZvIiwicGFyc2VTaGVsbEhhc2giLCJpbnRlbnQiLCJ1bmF2YWlsYWJsZUFjdGlvbnMiLCJvdXRib3VuZE5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIm91dGJvdW5kIiwiS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb24iLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiaW5pdENhcmRNYW5pZmVzdCIsImtwaURlZmluaXRpb24iLCJvS1BJTW9kZWwiLCJvQ2FyZE1hbmlmZXN0IiwiaWQiLCJ0ZWNobm9sb2d5IiwiZGF0YSIsImpzb24iLCJoZWFkZXIiLCJkYXRhcG9pbnQiLCJzdWJUaXRsZSIsImRlc2NyaXB0aW9uIiwidW5pdE9mTWVhc3VyZW1lbnQiLCJtYWluSW5kaWNhdG9yIiwibnVtYmVyIiwidW5pdCIsInN0YXRlIiwidHJlbmQiLCJjb250ZW50IiwibWluSGVpZ2h0IiwiY2hhcnRQcm9wZXJ0aWVzIiwicGF0aCIsInRhcmdldFBhdGgiLCJ0YXJnZXRWYWx1ZSIsInNpZGVJbmRpY2F0b3JzIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiYURlc2NyaXB0aW9ucyIsImZvckVhY2giLCJkZXNjIiwiZGV0YWlscyIsInRleHQiLCJ2YWx1ZSIsIm5hbWUiLCJtZWFzdXJlIiwiZmVlZHMiLCJzZXRQcm9wZXJ0eSIsIm1hbmlmZXN0IiwiaW5pdE5hdmlnYXRpb25JbmZvIiwibmF2aWdhdGlvbiIsIm9OYXZJbmZvIiwicGFyYW1ldGVycyIsIm9uSW5pdCIsImFLUElEZWZpbml0aW9ucyIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiX2dldFBhZ2VNb2RlbCIsImdldFByb3BlcnR5Iiwib1ZpZXciLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJnZXRTaGVsbFNlcnZpY2VzIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsImxvYWRLUElUYWdEYXRhIiwiZ2V0TW9kZWwiLCJvbkV4aXQiLCJkZXN0cm95IiwidXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeSIsImtwaUNvbnRleHQiLCJyYXdVbml0IiwiaXNQYXRoIiwiaXNQZXJjZW50YWdlIiwiaXNDdXJyZW5jeSIsInJhd1ZhbHVlIiwiTnVtYmVyIiwicGFyc2VGbG9hdCIsIk51bWJlckZvcm1hdCIsImdldEZsb2F0SW5zdGFuY2UiLCJtaW5GcmFjdGlvbkRpZ2l0cyIsIm1heEZyYWN0aW9uRGlnaXRzIiwic2hvd1NjYWxlIiwia3BpVmFsdWVVbnNjYWxlZCIsImdyb3VwaW5nRW5hYmxlZCIsImtwaVZhbHVlTm9TY2FsZSIsImtwaVZhbHVlU2NhbGUiLCJkZWNpbWFscyIsIm1heEludGVnZXJEaWdpdHMiLCJrcGlVbml0IiwiZ2V0VW5pdEluc3RhbmNlIiwic2hvd051bWJlciIsInVwZGF0ZURhdGFwb2ludENyaXRpY2FsaXR5IiwiY3JpdGljYWxpdHlWYWx1ZSIsImNyaXRpY2FsaXR5UGF0aCIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJ1cGRhdGVEYXRhcG9pbnRUcmVuZCIsInRyZW5kUGF0aCIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoIiwidHJlbmRSZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwidHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyIsInVwZGF0ZVRhcmdldFZhbHVlIiwidGFyZ2V0UmF3VmFsdWUiLCJkZXZpYXRpb25SYXdWYWx1ZSIsInRhcmdldFNjYWxlIiwiZGV2aWF0aW9uVmFsdWUiLCJvTWFpbk1vZGVsIiwibG9hZEZ1bGwiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImVudGl0eVNldCIsIiQkZ3JvdXBJZCIsIm9BZ2dyZWdhdGUiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0ZSIsImFGaWx0ZXJzIiwicmVxdWVzdENvbnRleHRzIiwiYUNvbnRleHRzIiwibG9hZEtQSUNhcmREYXRhIiwib0dyb3VwIiwiZ3JvdXAiLCJzb3J0T3JkZXIiLCJzb3J0Iiwic29ydEluZm8iLCJTb3J0ZXIiLCJkZXNjZW5kaW5nIiwibWF4SXRlbXMiLCJjaGFydERhdGEiLCJvQ29udGV4dCIsIm9EYXRhIiwiZ2V0UG9wb3ZlciIsIm9LUElUYWciLCJvUG9wb3ZlciIsInJlamVjdCIsImxvYWRMaWJyYXJ5IiwiYXN5bmMiLCJyZXF1aXJlIiwiQ2FyZCIsIkhvc3QiLCJvSG9zdCIsImF0dGFjaEFjdGlvbiIsIm9FdmVudCIsInNUeXBlIiwiZ2V0UGFyYW1ldGVyIiwib1BhcmFtcyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRlT3V0Ym91bmQiLCJvQ2FyZCIsIndpZHRoIiwiaGVpZ2h0Iiwic2V0SG9zdCIsIlBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiYWRkRGVwZW5kZW50Iiwib25LUElQcmVzc2VkIiwia3BpSUQiLCJvRGVmIiwib01vZGVsIiwiYVByb21pc2VzIiwiYWxsIiwiYVJlc3VsdHMiLCJzZXRNYW5pZmVzdCIsInJlZnJlc2giLCJvcGVuQnkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJLUElNYW5hZ2VtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEtQSUNoYXJ0RGVmaW5pdGlvbiwgS1BJRGVmaW5pdGlvbiwgTmF2aWdhdGlvbkluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vS1BJXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckRlZmluaXRpb24sIFJhbmdlRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvU2VsZWN0aW9uVmFyaWFudEhlbHBlclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgdHlwZSBMaXN0UmVwb3J0Q29udHJvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9MaXN0UmVwb3J0L0xpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIEdlbmVyaWNUYWcgZnJvbSBcInNhcC9tL0dlbmVyaWNUYWdcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IERhdGVGb3JtYXQgZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdC9EYXRlRm9ybWF0XCI7XG5pbXBvcnQgTnVtYmVyRm9ybWF0IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXQvTnVtYmVyRm9ybWF0XCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCJzYXAvdWkvY29yZS9Mb2NhbGVcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBTb3J0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9Tb3J0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBtZXRob2RPdmVycmlkZSwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5cbmNvbnN0IE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5OiBSZWNvcmQ8c3RyaW5nLCBNZXNzYWdlVHlwZT4gPSB7XG5cdFwiMVwiOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XCIyXCI6IE1lc3NhZ2VUeXBlLldhcm5pbmcsXG5cdFwiM1wiOiBNZXNzYWdlVHlwZS5TdWNjZXNzLFxuXHRcIjVcIjogTWVzc2FnZVR5cGUuSW5mb3JtYXRpb25cbn07XG5cbmNvbnN0IFZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGU6IFJlY29yZDxNZXNzYWdlVHlwZSwgc3RyaW5nPiA9IHtcblx0RXJyb3I6IFwiRXJyb3JcIixcblx0V2FybmluZzogXCJDcml0aWNhbFwiLFxuXHRTdWNjZXNzOiBcIkdvb2RcIixcblx0SW5mb3JtYXRpb246IFwiTm9uZVwiLFxuXHROb25lOiBcIk5vbmVcIlxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgYSBtZXNzYWdlIHN0YXRlIGZyb20gYSBjYWxjdWxhdGVkIGNyaXRpY2FsaXR5IG9mIHR5cGUgJ1RhcmdldCcuXG4gKlxuICogQHBhcmFtIGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LlxuICogQHBhcmFtIGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSxUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlLEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlLEFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSxUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSxEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZV0uXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbVRhcmdldENhbGN1bGF0aW9uKGtwaVZhbHVlOiBudW1iZXIsIGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSk6IE1lc3NhZ2VUeXBlIHtcblx0bGV0IGNyaXRpY2FsaXR5UHJvcGVydHk6IE1lc3NhZ2VUeXBlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1sxXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdH0gZWxzZSBpZiAoYVRocmVzaG9sZHNbNV0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1s1XSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzVdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzRdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s0XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1szXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IGEgbWVzc2FnZSBzdGF0ZSBmcm9tIGEgY2FsY3VsYXRlZCBjcml0aWNhbGl0eSBvZiB0eXBlICdNaW5pbWl6ZScuXG4gKlxuICogQHBhcmFtIGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LlxuICogQHBhcmFtIGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlLFRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlLERldmlhdGlvblJhbmdlSGlnaFZhbHVlXS5cbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMl0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1syXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA+IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1swXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IGEgbWVzc2FnZSBzdGF0ZSBmcm9tIGEgY2FsY3VsYXRlZCBjcml0aWNhbGl0eSBvZiB0eXBlICdNYXhpbWl6ZScuXG4gKlxuICogQHBhcmFtIGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LlxuICogQHBhcmFtIGFUaHJlc2hvbGRzIFRocmVzaG9sZHMgdG8gYmUgdXNlZCBbRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSxUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlLEFjY2VwdGFuY2VSYW5nZUxvd1ZhbHVlXS5cbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVR5cGVcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVR5cGVGcm9tTWF4aW1pemVDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2Uge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5TdWNjZXNzO1xuXHR9XG5cblx0cmV0dXJuIGNyaXRpY2FsaXR5UHJvcGVydHk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2FsY3VsYXRlIGEgRGV2aWF0aW9uSW5kaWNhdG9yIHZhbHVlIGZyb20gYSB0cmVuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdHJlbmRWYWx1ZSBUaGUgY3JpdGljYWxpdHkgdmFsdWVzLlxuICogQHJldHVybnMgUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZSh0cmVuZFZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgZGV2aWF0aW9uSW5kaWNhdG9yOiBzdHJpbmc7XG5cblx0c3dpdGNoICh0cmVuZFZhbHVlKSB7XG5cdFx0Y2FzZSAxOiAvLyBTdHJvbmdVcFxuXHRcdGNhc2UgXCIxXCI6XG5cdFx0Y2FzZSAyOiAvLyBVcFxuXHRcdGNhc2UgXCIyXCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIlVwXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgNDogLy8gRG93blxuXHRcdGNhc2UgXCI0XCI6XG5cdFx0Y2FzZSA1OiAvLyBTdHJvbmdEb3duXG5cdFx0Y2FzZSBcIjVcIjpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIERldmlhdGlvbkluZGljYXRvciBmcm9tIGEgVHJlbmRDYWxjdWxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ga3BpVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBLUElcbiAqIEBwYXJhbSByZWZlcmVuY2VWYWx1ZSBUaGUgcmVmZXJlbmNlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aFxuICogQHBhcmFtIGlzUmVsYXRpdmUgVHJ1ZSBpcyB0aGUgY29tcGFyaXNvbiBpcyByZWxhdGl2ZVxuICogQHBhcmFtIGFUaHJlc2hvbGRzIEFycmF5IG9mIHRocmVzaG9sZHMgW1N0cm9uZ0Rvd25EaWZmZXJlbmNlLCBEb3duRGlmZmVyZW5jZSwgVXBEaWZmZXJlbmNlLCBTdHJvbmdVcERpZmZlcmVuY2VdXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIERldmlhdGlvbkluZGljYXRvciB2YWx1ZVxuICovXG5mdW5jdGlvbiBkZXZpYXRpb25JbmRpY2F0b3JGcm9tQ2FsY3VsYXRpb24oXG5cdGtwaVZhbHVlOiBudW1iZXIsXG5cdHJlZmVyZW5jZVZhbHVlOiBudW1iZXIsXG5cdGlzUmVsYXRpdmU6IGJvb2xlYW4sXG5cdGFUaHJlc2hvbGRzOiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXSB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdGlmICghYVRocmVzaG9sZHMgfHwgKGlzUmVsYXRpdmUgJiYgIXJlZmVyZW5jZVZhbHVlKSkge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxuXG5cdGNvbnN0IGNvbXBWYWx1ZSA9IGlzUmVsYXRpdmUgPyAoa3BpVmFsdWUgLSByZWZlcmVuY2VWYWx1ZSkgLyByZWZlcmVuY2VWYWx1ZSA6IGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Ly8gU3Ryb25nRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYgY29tcFZhbHVlIDw9IGFUaHJlc2hvbGRzWzFdKSB7XG5cdFx0Ly8gRG93biAtLT4gRG93blxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzNdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbM10gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzNdKSB7XG5cdFx0Ly8gU3Ryb25nVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYgY29tcFZhbHVlID49IGFUaHJlc2hvbGRzWzJdKSB7XG5cdFx0Ly8gVXAgLS0+IFVwXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFNpZGV3YXlzIC0tPiBOb25lXG5cdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJOb25lXCI7XG5cdH1cblxuXHRyZXR1cm4gZGV2aWF0aW9uSW5kaWNhdG9yO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gYSBmaWx0ZXIgZGVmaW5pdGlvbi5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyRGVmaW5pdGlvbiBUaGUgZmlsdGVyIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFJldHVybnMgYSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gdGhlIGRlZmluaXRpb24sIG9yIHVuZGVmaW5lZCBpZiB0aGUgZGVmaW5pdGlvbiBpcyBlbXB0eSAobm8gcmFuZ2VzKVxuICovXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uOiBGaWx0ZXJEZWZpbml0aW9uKTogRmlsdGVyIHwgdW5kZWZpbmVkIHtcblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5ldyBGaWx0ZXIoXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCxcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VMb3csXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5yYW5nZUhpZ2hcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGFSYW5nZUZpbHRlcnMgPSBmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAoKHJhbmdlKSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IEZpbHRlcihmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5UGF0aCwgcmFuZ2Uub3BlcmF0b3IgYXMgRmlsdGVyT3BlcmF0b3IsIHJhbmdlLnJhbmdlTG93LCByYW5nZS5yYW5nZUhpZ2gpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdGZpbHRlcnM6IGFSYW5nZUZpbHRlcnMsXG5cdFx0XHRhbmQ6IGZhbHNlXG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RmlsdGVyU3RyaW5nRnJvbURlZmluaXRpb24oZmlsdGVyRGVmaW5pdGlvbjogRmlsdGVyRGVmaW5pdGlvbik6IHN0cmluZyB7XG5cdGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBuZXcgTG9jYWxlKHNhcC51aS5nZXRDb3JlKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldExhbmd1YWdlKCkpO1xuXHRjb25zdCByZXNCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRjb25zdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoeyBzdHlsZTogXCJtZWRpdW1cIiB9LCBjdXJyZW50TG9jYWxlKTtcblxuXHRmdW5jdGlvbiBmb3JtYXRSYW5nZShyYW5nZTogUmFuZ2VEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZUxvdyA9XG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5VHlwZS5pbmRleE9mKFwiRWRtLkRhdGVcIikgPT09IDAgPyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZShyYW5nZS5yYW5nZUxvdykpIDogcmFuZ2UucmFuZ2VMb3c7XG5cdFx0Y29uc3QgdmFsdWVIaWdoID1cblx0XHRcdGZpbHRlckRlZmluaXRpb24ucHJvcGVydHlUeXBlLmluZGV4T2YoXCJFZG0uRGF0ZVwiKSA9PT0gMCA/IGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKHJhbmdlLnJhbmdlSGlnaCkpIDogcmFuZ2UucmFuZ2VIaWdoO1xuXG5cdFx0c3dpdGNoIChyYW5nZS5vcGVyYXRvcikge1xuXHRcdFx0Y2FzZSBcIkJUXCI6XG5cdFx0XHRcdHJldHVybiBgWyR7dmFsdWVMb3d9IC0gJHt2YWx1ZUhpZ2h9XWA7XG5cblx0XHRcdGNhc2UgXCJDb250YWluc1wiOlxuXHRcdFx0XHRyZXR1cm4gYCoke3ZhbHVlTG93fSpgO1xuXG5cdFx0XHRjYXNlIFwiR0VcIjpcblx0XHRcdFx0cmV0dXJuIGBcXHUyMjY1JHt2YWx1ZUxvd31gO1xuXG5cdFx0XHRjYXNlIFwiR1RcIjpcblx0XHRcdFx0cmV0dXJuIGA+JHt2YWx1ZUxvd31gO1xuXG5cdFx0XHRjYXNlIFwiTEVcIjpcblx0XHRcdFx0cmV0dXJuIGBcXHUyMjY0JHt2YWx1ZUxvd31gO1xuXG5cdFx0XHRjYXNlIFwiTFRcIjpcblx0XHRcdFx0cmV0dXJuIGA8JHt2YWx1ZUxvd31gO1xuXG5cdFx0XHRjYXNlIFwiTkJcIjpcblx0XHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0ZJTFRFUlNUUklOR19OT1RcIiwgW2BbJHt2YWx1ZUxvd30gLSAke3ZhbHVlSGlnaH1dYF0pO1xuXG5cdFx0XHRjYXNlIFwiTkVcIjpcblx0XHRcdFx0cmV0dXJuIGBcXHUyMjYwJHt2YWx1ZUxvd31gO1xuXG5cdFx0XHRjYXNlIFwiTm90Q29udGFpbnNcIjpcblx0XHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0ZJTFRFUlNUUklOR19OT1RcIiwgW2AqJHt2YWx1ZUxvd30qYF0pO1xuXG5cdFx0XHRjYXNlIFwiRVFcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZUxvdztcblx0XHR9XG5cdH1cblx0aWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9IGVsc2UgaWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBmb3JtYXRSYW5nZShmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGAoJHtmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5tYXAoZm9ybWF0UmFuZ2UpLmpvaW4oXCIsXCIpfSlgO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VGl0bGUoa3BpRGVmOiBLUElEZWZpbml0aW9uKTogc3RyaW5nIHtcblx0Y29uc3QgcmVzQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblxuXHRmdW5jdGlvbiBmb3JtYXRMaXN0KGl0ZW1zOiB7IG5hbWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pIHtcblx0XHRpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9IGVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIGl0ZW1zWzBdLmxhYmVsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgcmVzID0gaXRlbXNbMF0ubGFiZWw7XG5cdFx0XHRmb3IgKGxldCBJID0gMTsgSSA8IGl0ZW1zLmxlbmd0aCAtIDE7IEkrKykge1xuXHRcdFx0XHRyZXMgKz0gYCwgJHtpdGVtc1tJXS5sYWJlbH1gO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSVRFTVNMSVNUXCIsIFtyZXMsIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLmxhYmVsXSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0NIQVJUVElUTEVcIiwgW2Zvcm1hdExpc3Qoa3BpRGVmLmNoYXJ0Lm1lYXN1cmVzKSwgZm9ybWF0TGlzdChrcGlEZWYuY2hhcnQuZGltZW5zaW9ucyldKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2hhcnRMYWJlbFNldHRpbmdzKGNoYXJ0RGVmaW5pdGlvbjogS1BJQ2hhcnREZWZpbml0aW9uLCBvQ2hhcnRQcm9wZXJ0aWVzOiBhbnkpOiB2b2lkIHtcblx0c3dpdGNoIChjaGFydERlZmluaXRpb24uY2hhcnRUeXBlKSB7XG5cdFx0Y2FzZSBcIkRvbnV0XCI6XG5cdFx0XHQvLyBTaG93IGRhdGEgbGFiZWxzLCBkbyBub3Qgc2hvdyBheGlzIHRpdGxlc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5jYXRlZ29yeUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7XG5cdFx0XHRcdHZpc2libGU6IHRydWUsXG5cdFx0XHRcdHR5cGU6IFwidmFsdWVcIixcblx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRfTUZEMlwiXG5cdFx0XHR9O1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiYnViYmxlXCI6XG5cdFx0XHQvLyBTaG93IGF4aXMgdGl0bGUsIGJ1YmJsZSBzaXplIGxlZ2VuZCwgZG8gbm90IHNob3cgZGF0YSBsYWJlbHNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpczIgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMubGVnZW5kR3JvdXAgPSB7XG5cdFx0XHRcdGxheW91dDoge1xuXHRcdFx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdFx0XHRcdGFsaWdubWVudDogXCJ0b3BMZWZ0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMuc2l6ZUxlZ2VuZCA9IHtcblx0XHRcdFx0dmlzaWJsZTogdHJ1ZVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMucGxvdEFyZWEuZGF0YUxhYmVsID0geyB2aXNpYmxlOiBmYWxzZSB9O1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwic2NhdHRlclwiOlxuXHRcdFx0Ly8gRG8gbm90IHNob3cgZGF0YSBsYWJlbHMgYW5kIGF4aXMgdGl0bGVzXG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzMiA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMucGxvdEFyZWEuZGF0YUxhYmVsID0geyB2aXNpYmxlOiBmYWxzZSB9O1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0Ly8gRG8gbm90IHNob3cgZGF0YSBsYWJlbHMgYW5kIGF4aXMgdGl0bGVzXG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLmNhdGVnb3J5QXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHsgdmlzaWJsZTogZmFsc2UgfTtcblx0fVxufVxuZnVuY3Rpb24gZmlsdGVyTWFwKGFPYmplY3RzOiB7IG5hbWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgcm9sZT86IHN0cmluZyB9W10sIGFSb2xlcz86IChzdHJpbmcgfCB1bmRlZmluZWQpW10pOiBzdHJpbmdbXSB7XG5cdGlmIChhUm9sZXMgJiYgYVJvbGVzLmxlbmd0aCkge1xuXHRcdHJldHVybiBhT2JqZWN0c1xuXHRcdFx0LmZpbHRlcigoZGltZW5zaW9uKSA9PiB7XG5cdFx0XHRcdHJldHVybiBhUm9sZXMuaW5kZXhPZihkaW1lbnNpb24ucm9sZSkgPj0gMDtcblx0XHRcdH0pXG5cdFx0XHQubWFwKChkaW1lbnNpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIGRpbWVuc2lvbi5sYWJlbDtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBhT2JqZWN0cy5tYXAoKGRpbWVuc2lvbikgPT4ge1xuXHRcdFx0cmV0dXJuIGRpbWVuc2lvbi5sYWJlbDtcblx0XHR9KTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyhjaGFydERlZmluaXRpb246IEtQSUNoYXJ0RGVmaW5pdGlvbik6IHsgdWlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgdmFsdWVzOiBzdHJpbmdbXSB9W10ge1xuXHRjb25zdCBheGlzMU1lYXN1cmVzID0gZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW1wiQXhpczFcIl0pO1xuXHRjb25zdCBheGlzMk1lYXN1cmVzID0gZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW1wiQXhpczJcIl0pO1xuXHRjb25zdCBheGlzM01lYXN1cmVzID0gZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW1wiQXhpczNcIl0pO1xuXHRjb25zdCBvdGhlck1lYXN1cmVzID0gZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW3VuZGVmaW5lZF0pO1xuXHRjb25zdCBzZXJpZXNEaW1lbnNpb25zID0gZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLCBbXCJTZXJpZXNcIl0pO1xuXG5cdC8vIEdldCB0aGUgZmlyc3QgZGltZW5zaW9uIHdpdGggcm9sZSBcIkNhdGVnb3J5XCIgZm9yIHRoZSBzaGFwZVxuXHRjb25zdCBzaGFwZURpbWVuc2lvbiA9IGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLmZpbmQoKGRpbWVuc2lvbikgPT4ge1xuXHRcdHJldHVybiBkaW1lbnNpb24ucm9sZSA9PT0gXCJDYXRlZ29yeVwiO1xuXHR9KTtcblxuXHQvLyBNZWFzdXJlIGZvciB0aGUgeC1BeGlzIDogZmlyc3QgbWVhc3VyZSBmb3IgQXhpczEsIG9yIGZvciBBeGlzMiBpZiBub3QgZm91bmQsIG9yIGZvciBBeGlzMyBpZiBub3QgZm91bmRcblx0Y29uc3QgeE1lYXN1cmUgPSBheGlzMU1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczJNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMzTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0Ly8gTWVhc3VyZSBmb3IgdGhlIHktQXhpcyA6IGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMyLCBvciBzZWNvbmQgbWVhc3VyZSBmb3IgQXhpczEgaWYgbm90IGZvdW5kLCBvciBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMyBpZiBub3QgZm91bmRcblx0Y29uc3QgeU1lYXN1cmUgPSBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczFNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMzTWVhc3VyZXMuc2hpZnQoKSB8fCBvdGhlck1lYXN1cmVzLnNoaWZ0KCkgfHwgXCJcIjtcblx0Y29uc3QgcmVzID0gW1xuXHRcdHtcblx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcInZhbHVlc1wiOiBbeE1lYXN1cmVdXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRcInVpZFwiOiBcInZhbHVlQXhpczJcIixcblx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFwidmFsdWVzXCI6IFt5TWVhc3VyZV1cblx0XHR9XG5cdF07XG5cblx0aWYgKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUgPT09IFwiYnViYmxlXCIpIHtcblx0XHQvLyBNZWFzdXJlIGZvciB0aGUgc2l6ZSBvZiB0aGUgYnViYmxlOiBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMywgb3IgcmVtYWluaW5nIG1lYXN1cmUgZm9yIEF4aXMxL0F4aXMyIGlmIG5vdCBmb3VuZFxuXHRcdGNvbnN0IHNpemVNZWFzdXJlID0gYXhpczNNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMxTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMk1lYXN1cmVzLnNoaWZ0KCkgfHwgb3RoZXJNZWFzdXJlcy5zaGlmdCgpIHx8IFwiXCI7XG5cdFx0cmVzLnB1c2goe1xuXHRcdFx0XCJ1aWRcIjogXCJidWJibGVXaWR0aFwiLFxuXHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3NpemVNZWFzdXJlXVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gQ29sb3IgKG9wdGlvbmFsKVxuXHRpZiAoc2VyaWVzRGltZW5zaW9ucy5sZW5ndGgpIHtcblx0XHRyZXMucHVzaCh7XG5cdFx0XHRcInVpZFwiOiBcImNvbG9yXCIsXG5cdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFwidmFsdWVzXCI6IHNlcmllc0RpbWVuc2lvbnNcblx0XHR9KTtcblx0fVxuXHQvLyBTaGFwZSAob3B0aW9uYWwpXG5cdGlmIChzaGFwZURpbWVuc2lvbikge1xuXHRcdHJlcy5wdXNoKHtcblx0XHRcdFwidWlkXCI6IFwic2hhcGVcIixcblx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XCJ2YWx1ZXNcIjogW3NoYXBlRGltZW5zaW9uLmxhYmVsXVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldENoYXJ0RmVlZHMoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24pOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdIHtcblx0bGV0IHJlczogeyB1aWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZXM6IHN0cmluZ1tdIH1bXTtcblxuXHRzd2l0Y2ggKGNoYXJ0RGVmaW5pdGlvbi5jaGFydFR5cGUpIHtcblx0XHRjYXNlIFwiRG9udXRcIjpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwic2l6ZVwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJjb2xvclwiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucylcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImJ1YmJsZVwiOlxuXHRcdGNhc2UgXCJzY2F0dGVyXCI6XG5cdFx0XHRyZXMgPSBnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyhjaGFydERlZmluaXRpb24pO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwidmVydGljYWxfYnVsbGV0XCI6XG5cdFx0XHRyZXMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImFjdHVhbFZhbHVlc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzLCBbdW5kZWZpbmVkLCBcIkF4aXMxXCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJ1aWRcIjogXCJ0YXJnZXRWYWx1ZXNcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJNZWFzdXJlXCIsXG5cdFx0XHRcdFx0XCJ2YWx1ZXNcIjogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW1wiQXhpczJcIl0pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW3VuZGVmaW5lZCwgXCJDYXRlZ29yeVwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSlcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJlcyA9IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHRcdFx0XCJ0eXBlXCI6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcInVpZFwiOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdFwidHlwZVwiOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdFwidmFsdWVzXCI6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW3VuZGVmaW5lZCwgXCJDYXRlZ29yeVwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwidWlkXCI6IFwiY29sb3JcIixcblx0XHRcdFx0XHRcInR5cGVcIjogXCJEaW1lbnNpb25cIixcblx0XHRcdFx0XHRcInZhbHVlc1wiOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFtcIlNlcmllc1wiXSlcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0fVxuXG5cdHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRuYXZJbmZvOiBOYXZpZ2F0aW9uSW5mbyxcblx0b1NoZWxsU2VydmljZTogYW55XG4pOiBQcm9taXNlPHsgc2VtYW50aWNPYmplY3Q/OiBzdHJpbmc7IGFjdGlvbj86IHN0cmluZzsgb3V0Ym91bmQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuXHRpZiAobmF2SW5mby5zZW1hbnRpY09iamVjdCkge1xuXHRcdGlmIChuYXZJbmZvLmFjdGlvbikge1xuXHRcdFx0Ly8gQWN0aW9uIGlzIGFscmVhZHkgc3BlY2lmaWVkOiBjaGVjayBpZiBpdCdzIGF2YWlsYWJsZSBpbiB0aGUgc2hlbGxcblx0XHRcdHJldHVybiBvU2hlbGxTZXJ2aWNlLmdldExpbmtzKHsgc2VtYW50aWNPYmplY3Q6IG5hdkluZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogbmF2SW5mby5hY3Rpb24gfSkudGhlbigoYUxpbmtzOiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYUxpbmtzLmxlbmd0aCA/IHsgc2VtYW50aWNPYmplY3Q6IG5hdkluZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogbmF2SW5mby5hY3Rpb24gfSA6IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXZSBnZXQgdGhlIHByaW1hcnkgaW50ZW50IGZyb20gdGhlIHNoZWxsXG5cdFx0XHRyZXR1cm4gb1NoZWxsU2VydmljZS5nZXRQcmltYXJ5SW50ZW50KG5hdkluZm8uc2VtYW50aWNPYmplY3QpLnRoZW4oKG9MaW5rOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIE5vIHByaW1hcnkgaW50ZW50Li4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENoZWNrIHRoYXQgdGhlIHByaW1hcnkgaW50ZW50IGlzIG5vdCBwYXJ0IG9mIHRoZSB1bmF2YWlsYWJsZSBhY3Rpb25zXG5cdFx0XHRcdGNvbnN0IG9JbmZvID0gb1NoZWxsU2VydmljZS5wYXJzZVNoZWxsSGFzaChvTGluay5pbnRlbnQpO1xuXHRcdFx0XHRyZXR1cm4gbmF2SW5mby51bmF2YWlsYWJsZUFjdGlvbnMgJiYgbmF2SW5mby51bmF2YWlsYWJsZUFjdGlvbnMuaW5kZXhPZihvSW5mby5hY3Rpb24pID49IDBcblx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdDogeyBzZW1hbnRpY09iamVjdDogb0luZm8uc2VtYW50aWNPYmplY3QsIGFjdGlvbjogb0luZm8uYWN0aW9uIH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gT3V0Ym91bmQgbmF2aWdhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0cmV0dXJuIG5hdkluZm8ub3V0Ym91bmROYXZpZ2F0aW9uID8gUHJvbWlzZS5yZXNvbHZlKHsgb3V0Ym91bmQ6IG5hdkluZm8ub3V0Ym91bmROYXZpZ2F0aW9uIH0pIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgQSBjb250cm9sbGVyIGV4dGVuc2lvbiBmb3IgbWFuYWdpbmcgdGhlIEtQSXMgaW4gYW4gYW5hbHl0aWNhbCBsaXN0IHBhZ2VcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLktQSU1hbmFnZW1lbnRcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKiBAc2luY2UgMS45My4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLktQSU1hbmFnZW1lbnRcIilcbmNsYXNzIEtQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBhS1BJRGVmaW5pdGlvbnM/OiBLUElEZWZpbml0aW9uW107XG5cdHByb3RlY3RlZCBvQ2FyZDogYW55O1xuXHRwcm90ZWN0ZWQgb1BvcG92ZXIhOiBQb3BvdmVyO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBjYXJkIG1hbmlmZXN0IGZvciBhIEtQSSBkZWZpbml0aW9uIGFuZCBzdG9yZXMgaXQgaW4gYSBKU09OIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ga3BpRGVmaW5pdGlvbiBUaGUgS1BJIGRlZmluaXRpb25cblx0ICogQHBhcmFtIG9LUElNb2RlbCBUaGUgSlNPTiBtb2RlbCBpbiB3aGljaCB0aGUgbWFuaWZlc3Qgd2lsbCBiZSBzdG9yZWRcblx0ICovXG5cdHByb3RlY3RlZCBpbml0Q2FyZE1hbmlmZXN0KGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIG9LUElNb2RlbDogSlNPTk1vZGVsKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0NhcmRNYW5pZmVzdDogYW55ID0ge1xuXHRcdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdFx0aWQ6IFwic2FwLmZlXCIsXG5cdFx0XHRcdHR5cGU6IFwiY2FyZFwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAudWlcIjoge1xuXHRcdFx0XHR0ZWNobm9sb2d5OiBcIlVJNVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJzYXAuY2FyZFwiOiB7XG5cdFx0XHRcdHR5cGU6IFwiQW5hbHl0aWNhbFwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0anNvbjoge31cblx0XHRcdFx0fSxcblx0XHRcdFx0aGVhZGVyOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJOdW1lcmljXCIsXG5cdFx0XHRcdFx0dGl0bGU6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRpdGxlLFxuXHRcdFx0XHRcdHN1YlRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHR1bml0T2ZNZWFzdXJlbWVudDogXCJ7bWFpblVuaXR9XCIsXG5cdFx0XHRcdFx0bWFpbkluZGljYXRvcjoge1xuXHRcdFx0XHRcdFx0bnVtYmVyOiBcInttYWluVmFsdWVOb1NjYWxlfVwiLFxuXHRcdFx0XHRcdFx0dW5pdDogXCJ7bWFpblZhbHVlU2NhbGV9XCIsXG5cdFx0XHRcdFx0XHRzdGF0ZTogXCJ7bWFpblN0YXRlfVwiLFxuXHRcdFx0XHRcdFx0dHJlbmQ6IFwie3RyZW5kfVwiXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0bWluSGVpZ2h0OiBcIjI1cmVtXCIsXG5cdFx0XHRcdFx0Y2hhcnRQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRwbG90QXJlYToge30sXG5cdFx0XHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwibGVmdFwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIi9jaGFydERhdGFcIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBBZGQgc2lkZSBpbmRpY2F0b3JzIGluIHRoZSBjYXJkIGhlYWRlciBpZiBhIHRhcmdldCBpcyBkZWZpbmVkIGZvciB0aGUgS1BJXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggfHwga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgcmVzQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5oZWFkZXIuc2lkZUluZGljYXRvcnMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX1RBUkdFVFwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie3RhcmdldE51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcInt0YXJnZXRVbml0fVwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aXRsZTogcmVzQnVuZGxlLmdldFRleHQoXCJDX0tQSUNBUkRfSU5ESUNBVE9SX0RFVklBVElPTlwiKSxcblx0XHRcdFx0XHRudW1iZXI6IFwie2RldmlhdGlvbk51bWJlcn1cIixcblx0XHRcdFx0XHR1bml0OiBcIiVcIlxuXHRcdFx0XHR9XG5cdFx0XHRdO1xuXHRcdH1cblxuXHRcdC8vIERldGFpbHMgb2YgdGhlIGNhcmQ6IGZpbHRlciBkZXNjcmlwdGlvbnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYURlc2NyaXB0aW9uczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zLmZvckVhY2goKGZpbHRlckRlZmluaXRpb24pID0+IHtcblx0XHRcdFx0Y29uc3QgZGVzYyA9IGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb24pO1xuXHRcdFx0XHRpZiAoZGVzYykge1xuXHRcdFx0XHRcdGFEZXNjcmlwdGlvbnMucHVzaChkZXNjKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChhRGVzY3JpcHRpb25zLmxlbmd0aCkge1xuXHRcdFx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uaGVhZGVyLmRldGFpbHMgPSBhRGVzY3JpcHRpb25zLmpvaW4oXCIsIFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDaGFydCBzZXR0aW5nczogdHlwZSwgdGl0bGUsIGRpbWVuc2lvbnMgYW5kIG1lYXN1cmVzIGluIHRoZSBtYW5pZmVzdFxuXHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5jb250ZW50LmNoYXJ0VHlwZSA9IGtwaURlZmluaXRpb24uY2hhcnQuY2hhcnRUeXBlO1xuXHRcdHVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyhrcGlEZWZpbml0aW9uLmNoYXJ0LCBvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFByb3BlcnRpZXMpO1xuXHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5jb250ZW50LmNoYXJ0UHJvcGVydGllcy50aXRsZS50ZXh0ID0gZm9ybWF0Q2hhcnRUaXRsZShrcGlEZWZpbml0aW9uKTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5kaW1lbnNpb25zID0ga3BpRGVmaW5pdGlvbi5jaGFydC5kaW1lbnNpb25zLm1hcCgoZGltZW5zaW9uKSA9PiB7XG5cdFx0XHRyZXR1cm4geyBsYWJlbDogZGltZW5zaW9uLmxhYmVsLCB2YWx1ZTogYHske2RpbWVuc2lvbi5uYW1lfX1gIH07XG5cdFx0fSk7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQubWVhc3VyZXMgPSBrcGlEZWZpbml0aW9uLmNoYXJ0Lm1lYXN1cmVzLm1hcCgobWVhc3VyZSkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbGFiZWw6IG1lYXN1cmUubGFiZWwsIHZhbHVlOiBgeyR7bWVhc3VyZS5uYW1lfX1gIH07XG5cdFx0fSk7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZmVlZHMgPSBnZXRDaGFydEZlZWRzKGtwaURlZmluaXRpb24uY2hhcnQpO1xuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfWAsIHtcblx0XHRcdG1hbmlmZXN0OiBvQ2FyZE1hbmlmZXN0XG5cdFx0fSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgaW5pdE5hdmlnYXRpb25JbmZvKGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIG9LUElNb2RlbDogSlNPTk1vZGVsLCBvU2hlbGxTZXJ2aWNlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBBZGQgbmF2aWdhdGlvblxuXHRcdGlmIChrcGlEZWZpbml0aW9uLm5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBnZXROYXZpZ2F0aW9uUGFyYW1ldGVycyhrcGlEZWZpbml0aW9uLm5hdmlnYXRpb24sIG9TaGVsbFNlcnZpY2UpLnRoZW4oKG9OYXZJbmZvKSA9PiB7XG5cdFx0XHRcdGlmIChvTmF2SW5mbykge1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvaGVhZGVyL2FjdGlvbnNgLCBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblwiLFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvTmF2SW5mb1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5hS1BJRGVmaW5pdGlvbnMgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIExpc3RSZXBvcnRDb250cm9sbGVyKS5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KFwiL2twaURlZmluaXRpb25zXCIpO1xuXG5cdFx0aWYgKHRoaXMuYUtQSURlZmluaXRpb25zICYmIHRoaXMuYUtQSURlZmluaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSAob1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIEJhc2VDb250cm9sbGVyKS5nZXRBcHBDb21wb25lbnQoKSBhcyBhbnk7XG5cblx0XHRcdC8vIENyZWF0ZSBhIEpTT04gbW9kZWwgdG8gc3RvcmUgS1BJIGRhdGFcblx0XHRcdGNvbnN0IG9LUElNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRcdG9WaWV3LnNldE1vZGVsKG9LUElNb2RlbCwgXCJrcGlNb2RlbFwiKTtcblxuXHRcdFx0dGhpcy5hS1BJRGVmaW5pdGlvbnMuZm9yRWFjaCgoa3BpRGVmaW5pdGlvbikgPT4ge1xuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIG1hbmlmZXN0IGZvciB0aGUgS1BJIGNhcmQgYW5kIHN0b3JlIGl0IGluIHRoZSBLUEkgbW9kZWxcblx0XHRcdFx0dGhpcy5pbml0Q2FyZE1hbmlmZXN0KGtwaURlZmluaXRpb24sIG9LUElNb2RlbCk7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBuYXZpZ2F0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0XHR0aGlzLmluaXROYXZpZ2F0aW9uSW5mbyhrcGlEZWZpbml0aW9uLCBvS1BJTW9kZWwsIG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpKS5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gTG9hZCB0YWcgZGF0YSBmb3IgdGhlIEtQSVxuXHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIG9BcHBDb21wb25lbnQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsLCBvS1BJTW9kZWwpLmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkV4aXQoKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRpZiAob0tQSU1vZGVsKSB7XG5cdFx0XHRvS1BJTW9kZWwuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBuZXcgTG9jYWxlKHNhcC51aS5nZXRDb3JlKCkuZ2V0Q29uZmlndXJhdGlvbigpLmdldExhbmd1YWdlKCkpO1xuXHRcdGNvbnN0IHJhd1VuaXQgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGhcblx0XHRcdD8ga3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LnZhbHVlKVxuXHRcdFx0OiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py52YWx1ZTtcblxuXHRcdGNvbnN0IGlzUGVyY2VudGFnZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzQ3VycmVuY3kgPT09IGZhbHNlICYmIHJhd1VuaXQgPT09IFwiJVwiO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gTWFpbiBLUEkgdmFsdWVcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cblx0XHQvLyBWYWx1ZSBmb3JtYXR0ZWQgd2l0aCBhIHNjYWxlXG5cdFx0Y29uc3Qga3BpVmFsdWUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IGlzUGVyY2VudGFnZSA/IHVuZGVmaW5lZCA6IFwic2hvcnRcIixcblx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRzaG93U2NhbGU6ICFpc1BlcmNlbnRhZ2Vcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZWAsIGtwaVZhbHVlKTtcblxuXHRcdC8vIFZhbHVlIHdpdGhvdXQgYSBzY2FsZVxuXHRcdGNvbnN0IGtwaVZhbHVlVW5zY2FsZWQgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDIsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2UsXG5cdFx0XHRcdGdyb3VwaW5nRW5hYmxlZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlVW5zY2FsZWRgLCBrcGlWYWx1ZVVuc2NhbGVkKTtcblxuXHRcdC8vIFZhbHVlIGZvcm1hdHRlZCB3aXRoIHRoZSBzY2FsZSBvbWl0dGVkXG5cdFx0Y29uc3Qga3BpVmFsdWVOb1NjYWxlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdChyYXdWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlTm9TY2FsZWAsIGtwaVZhbHVlTm9TY2FsZSk7XG5cblx0XHQvLyBTY2FsZSBvZiB0aGUgdmFsdWVcblx0XHRjb25zdCBrcGlWYWx1ZVNjYWxlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdGRlY2ltYWxzOiAwLFxuXHRcdFx0XHRtYXhJbnRlZ2VyRGlnaXRzOiAwLFxuXHRcdFx0XHRzaG93U2NhbGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVNjYWxlYCwga3BpVmFsdWVTY2FsZSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyBVbml0IG9yIGN1cnJlbmN5XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQgJiYgcmF3VW5pdCkge1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQuaXNDdXJyZW5jeSkge1xuXHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdGAsIHJhd1VuaXQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiB1bml0IG9mIG1lYXN1cmUsIHdlIGhhdmUgdG8gZm9ybWF0IGl0IHByb3Blcmx5XG5cdFx0XHRcdGNvbnN0IGtwaVVuaXQgPSBOdW1iZXJGb3JtYXQuZ2V0VW5pdEluc3RhbmNlKHsgc2hvd051bWJlcjogZmFsc2UgfSwgY3VycmVudExvY2FsZSkuZm9ybWF0KHJhd1ZhbHVlLCByYXdVbml0KTtcblx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRgLCBrcGlVbml0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludENyaXRpY2FsaXR5KGtwaURlZmluaXRpb246IEtQSURlZmluaXRpb24sIGtwaUNvbnRleHQ6IENvbnRleHQsIG9LUElNb2RlbDogSlNPTk1vZGVsKSB7XG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXG5cdFx0bGV0IGNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVZhbHVlKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBpcyBhIGZpeGVkIHZhbHVlXG5cdFx0XHRjcml0aWNhbGl0eVZhbHVlID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZTtcblx0XHR9IGVsc2UgaWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgY29tZXMgZnJvbSBhbm90aGVyIHByb3BlcnR5ICh2aWEgYSBwYXRoKVxuXHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9XG5cdFx0XHRcdE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5W2twaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKV0gfHwgTWVzc2FnZVR5cGUuTm9uZTtcblx0XHR9IGVsc2UgaWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzICYmIGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBjYWxjdWxhdGlvblxuXHRcdFx0c3dpdGNoIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSkge1xuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL1RhcmdldFwiOlxuXHRcdFx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPSBtZXNzYWdlVHlwZUZyb21UYXJnZXRDYWxjdWxhdGlvbihyYXdWYWx1ZSwga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWluaW1pemVcIjpcblx0XHRcdFx0XHRjcml0aWNhbGl0eVZhbHVlID0gbWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbihcblx0XHRcdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjcml0aWNhbGl0eVZhbHVlID0gbWVzc2FnZVR5cGVGcm9tTWF4aW1pemVDYWxjdWxhdGlvbihcblx0XHRcdFx0XHRcdHJhd1ZhbHVlLFxuXHRcdFx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eWAsIGNyaXRpY2FsaXR5VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblN0YXRlYCxcblx0XHRcdFZhbHVlQ29sb3JGcm9tTWVzc2FnZVR5cGVbY3JpdGljYWxpdHlWYWx1ZV0gfHwgXCJOb25lXCJcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEYXRhcG9pbnRUcmVuZChrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblxuXHRcdGxldCB0cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRWYWx1ZSkge1xuXHRcdFx0Ly8gVHJlbmQgaXMgYSBmaXhlZCB2YWx1ZVxuXHRcdFx0dHJlbmRWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kVmFsdWU7XG5cdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpIHtcblx0XHRcdC8vIFRyZW5kIGNvbWVzIGZyb20gYW5vdGhlciBwcm9wZXJ0eSB2aWEgYSBwYXRoXG5cdFx0XHR0cmVuZFZhbHVlID0gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbVRyZW5kVHlwZShrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kUGF0aCkpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUgIT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGhcblx0XHQpIHtcblx0XHRcdC8vIENhbGN1bGF0ZWQgdHJlbmRcblx0XHRcdGxldCB0cmVuZFJlZmVyZW5jZVZhbHVlOiBudW1iZXI7XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dHJlbmRSZWZlcmVuY2VWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChcblx0XHRcdFx0XHRrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoIHx8IFwiXCIpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHR0cmVuZFZhbHVlID0gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbUNhbGN1bGF0aW9uKFxuXHRcdFx0XHRyYXdWYWx1ZSxcblx0XHRcdFx0dHJlbmRSZWZlcmVuY2VWYWx1ZSxcblx0XHRcdFx0ISFrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uSXNSZWxhdGl2ZSxcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblRyZXNob2xkc1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZGAsIHRyZW5kVmFsdWUpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVUYXJnZXRWYWx1ZShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuOyAvLyBObyB0YXJnZXQgc2V0IGZvciB0aGUgS1BJXG5cdFx0fVxuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblx0XHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShzYXAudWkuZ2V0Q29yZSgpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRMYW5ndWFnZSgpKTtcblxuXHRcdGxldCB0YXJnZXRSYXdWYWx1ZTogbnVtYmVyO1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0YXJnZXRSYXdWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXRSYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aCB8fCBcIlwiKSk7XG5cdFx0fVxuXHRcdGNvbnN0IGRldmlhdGlvblJhd1ZhbHVlID0gdGFyZ2V0UmF3VmFsdWUgIT09IDAgPyAoKHJhd1ZhbHVlIC0gdGFyZ2V0UmF3VmFsdWUpIC8gdGFyZ2V0UmF3VmFsdWUpICogMTAwIDogdW5kZWZpbmVkO1xuXG5cdFx0Ly8gRm9ybWF0dGluZ1xuXHRcdGNvbnN0IHRhcmdldFZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdCh0YXJnZXRSYXdWYWx1ZSk7XG5cdFx0Y29uc3QgdGFyZ2V0U2NhbGUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdHtcblx0XHRcdFx0c3R5bGU6IFwic2hvcnRcIixcblx0XHRcdFx0ZGVjaW1hbHM6IDAsXG5cdFx0XHRcdG1heEludGVnZXJEaWdpdHM6IDAsXG5cdFx0XHRcdHNob3dTY2FsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdGN1cnJlbnRMb2NhbGVcblx0XHQpLmZvcm1hdCh0YXJnZXRSYXdWYWx1ZSk7XG5cblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXROdW1iZXJgLCB0YXJnZXRWYWx1ZSk7XG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0VW5pdGAsIHRhcmdldFNjYWxlKTtcblxuXHRcdGlmIChkZXZpYXRpb25SYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkZXZpYXRpb25WYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bWluRnJhY3Rpb25EaWdpdHM6IDAsXG5cdFx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdFx0c2hvd1NjYWxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0XHQpLmZvcm1hdChkZXZpYXRpb25SYXdWYWx1ZSk7XG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJgLCBkZXZpYXRpb25WYWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlcmAsIFwiTi9BXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkcyB0YWcgZGF0YSBmb3IgYSBLUEksIGFuZCBzdG9yZXMgaXQgaW4gdGhlIEpTT04gS1BJIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ga3BpRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgS1BJLlxuXHQgKiBAcGFyYW0gb01haW5Nb2RlbCBUaGUgbW9kZWwgdXNlZCB0byBsb2FkIHRoZSBkYXRhLlxuXHQgKiBAcGFyYW0gb0tQSU1vZGVsIFRoZSBKU09OIG1vZGVsIHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkXG5cdCAqIEBwYXJhbSBsb2FkRnVsbCBJZiBub3QgdHJ1ZSwgbG9hZHMgb25seSBkYXRhIGZvciB0aGUgS1BJIHRhZ1xuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkYXRhIGlzIGxvYWRlZC5cblx0ICovXG5cdHByb3RlY3RlZCBsb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvTWFpbk1vZGVsOiBPRGF0YU1vZGVsLCBvS1BJTW9kZWw6IEpTT05Nb2RlbCwgbG9hZEZ1bGw/OiBib29sZWFuKTogYW55IHtcblx0XHQvLyBJZiBsb2FkRnVsbD1mYWxzZSwgdGhlbiB3ZSdyZSBqdXN0IGxvYWRpbmcgZGF0YSBmb3IgdGhlIHRhZyBhbmQgd2UgdXNlIHRoZSBcIiRhdXRvLkxvbmdSdW5uZXJzXCIgZ3JvdXBJRFxuXHRcdC8vIElmIGxvYWRGdWxsPXRydWUsIHdlJ3JlIGxvYWRpbmcgZGF0YSBmb3IgdGhlIHdob2xlIEtQSSAodGFnICsgY2FyZCkgYW5kIHdlIHVzZSB0aGUgZGVmYXVsdCAoXCIkYXV0b1wiKSBncm91cElEXG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gbG9hZEZ1bGxcblx0XHRcdD8gb01haW5Nb2RlbC5iaW5kTGlzdChgLyR7a3BpRGVmaW5pdGlvbi5lbnRpdHlTZXR9YClcblx0XHRcdDogb01haW5Nb2RlbC5iaW5kTGlzdChgLyR7a3BpRGVmaW5pdGlvbi5lbnRpdHlTZXR9YCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgeyAkJGdyb3VwSWQ6IFwiJGF1dG8uTG9uZ1J1bm5lcnNcIiB9KTtcblx0XHRjb25zdCBvQWdncmVnYXRlOiBSZWNvcmQ8c3RyaW5nLCB7IHVuaXQ/OiBzdHJpbmcgfT4gPSB7fTtcblxuXHRcdC8vIE1haW4gdmFsdWUgKyBjdXJyZW5jeS91bml0XG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LmlzUGF0aCkge1xuXHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGhdID0geyB1bml0OiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LnZhbHVlIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoXSA9IHt9O1xuXHRcdH1cblxuXHRcdC8vIFByb3BlcnR5IGZvciBjcml0aWNhbGl0eVxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoXSA9IHt9O1xuXHRcdH1cblxuXHRcdC8vIFByb3BlcnRpZXMgZm9yIHRyZW5kIGFuZCB0cmVuZCBjYWxjdWxhdGlvblxuXHRcdGlmIChsb2FkRnVsbCkge1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kUGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kUGF0aF0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCkge1xuXHRcdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGgpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoXSA9IHt9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG9MaXN0QmluZGluZy5zZXRBZ2dyZWdhdGlvbih7IGFnZ3JlZ2F0ZTogb0FnZ3JlZ2F0ZSB9KTtcblxuXHRcdC8vIE1hbmFnZSBTZWxlY3Rpb25WYXJpYW50IGZpbHRlcnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUZpbHRlcnMgPSBrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5tYXAoY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24pLmZpbHRlcigoZmlsdGVyKSA9PiB7XG5cdFx0XHRcdHJldHVybiBmaWx0ZXIgIT09IHVuZGVmaW5lZDtcblx0XHRcdH0pIGFzIEZpbHRlcltdO1xuXHRcdFx0b0xpc3RCaW5kaW5nLmZpbHRlcihhRmlsdGVycyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMSkudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGlmIChhQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IHJhd1VuaXQgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGhcblx0XHRcdFx0XHQ/IGFDb250ZXh0c1swXS5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LnZhbHVlKVxuXHRcdFx0XHRcdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8udmFsdWU7XG5cblx0XHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQgJiYgIXJhd1VuaXQpIHtcblx0XHRcdFx0XHQvLyBBIHVuaXQvY3VycmVuY3kgaXMgZGVmaW5lZCwgYnV0IGl0cyB2YWx1ZSBpcyB1bmRlZmluZWQgLS0+IG11bHRpLXVuaXQgc2l0dWF0aW9uXG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlYCwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkYCwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZU5vU2NhbGVgLCBcIipcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblZhbHVlU2NhbGVgLCBcIlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVW5pdGAsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpbkNyaXRpY2FsaXR5YCwgTWVzc2FnZVR5cGUuTm9uZSk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblN0YXRlYCwgXCJOb25lXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RyZW5kYCwgXCJOb25lXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldE51bWJlcmAsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0VW5pdGAsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyYCwgdW5kZWZpbmVkKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3koa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlRGF0YXBvaW50Q3JpdGljYWxpdHkoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXG5cdFx0XHRcdFx0aWYgKGxvYWRGdWxsKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludFRyZW5kKGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblx0XHRcdFx0XHRcdHRoaXMudXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbiwgYUNvbnRleHRzWzBdLCBvS1BJTW9kZWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIGNhcmQgZGF0YSBmb3IgYSBLUEksIGFuZCBzdG9yZXMgaXQgaW4gdGhlIEpTT04gS1BJIG1vZGVsLlxuXHQgKlxuXHQgKiBAcGFyYW0ga3BpRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgS1BJLlxuXHQgKiBAcGFyYW0gb01haW5Nb2RlbCBUaGUgbW9kZWwgdXNlZCB0byBsb2FkIHRoZSBkYXRhLlxuXHQgKiBAcGFyYW0gb0tQSU1vZGVsIFRoZSBKU09OIG1vZGVsIHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGRhdGEgaXMgbG9hZGVkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvTWFpbk1vZGVsOiBPRGF0YU1vZGVsLCBvS1BJTW9kZWw6IEpTT05Nb2RlbCk6IGFueSB7XG5cdFx0Y29uc3Qgb0xpc3RCaW5kaW5nID0gb01haW5Nb2RlbC5iaW5kTGlzdChgLyR7a3BpRGVmaW5pdGlvbi5lbnRpdHlTZXR9YCk7XG5cdFx0Y29uc3Qgb0dyb3VwOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3Q+ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZTogUmVjb3JkPHN0cmluZywgT2JqZWN0PiA9IHt9O1xuXG5cdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5kaW1lbnNpb25zLmZvckVhY2goKGRpbWVuc2lvbikgPT4ge1xuXHRcdFx0b0dyb3VwW2RpbWVuc2lvbi5uYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdGtwaURlZmluaXRpb24uY2hhcnQubWVhc3VyZXMuZm9yRWFjaCgobWVhc3VyZSkgPT4ge1xuXHRcdFx0b0FnZ3JlZ2F0ZVttZWFzdXJlLm5hbWVdID0ge307XG5cdFx0fSk7XG5cdFx0b0xpc3RCaW5kaW5nLnNldEFnZ3JlZ2F0aW9uKHtcblx0XHRcdGdyb3VwOiBvR3JvdXAsXG5cdFx0XHRhZ2dyZWdhdGU6IG9BZ2dyZWdhdGVcblx0XHR9KTtcblxuXHRcdC8vIE1hbmFnZSBTZWxlY3Rpb25WYXJpYW50IGZpbHRlcnNcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYUZpbHRlcnMgPSBrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5tYXAoY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24pLmZpbHRlcigoZmlsdGVyKSA9PiB7XG5cdFx0XHRcdHJldHVybiBmaWx0ZXIgIT09IHVuZGVmaW5lZDtcblx0XHRcdH0pIGFzIEZpbHRlcltdO1xuXHRcdFx0b0xpc3RCaW5kaW5nLmZpbHRlcihhRmlsdGVycyk7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydGluZ1xuXHRcdGlmIChrcGlEZWZpbml0aW9uLmNoYXJ0LnNvcnRPcmRlcikge1xuXHRcdFx0b0xpc3RCaW5kaW5nLnNvcnQoXG5cdFx0XHRcdGtwaURlZmluaXRpb24uY2hhcnQuc29ydE9yZGVyLm1hcCgoc29ydEluZm8pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFNvcnRlcihzb3J0SW5mby5uYW1lLCBzb3J0SW5mby5kZXNjZW5kaW5nKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwga3BpRGVmaW5pdGlvbi5jaGFydC5tYXhJdGVtcykudGhlbigoYUNvbnRleHRzOiBDb250ZXh0W10pID0+IHtcblx0XHRcdGNvbnN0IGNoYXJ0RGF0YSA9IGFDb250ZXh0cy5tYXAoZnVuY3Rpb24gKG9Db250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cdFx0XHRcdGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5mb3JFYWNoKChkaW1lbnNpb24pID0+IHtcblx0XHRcdFx0XHRvRGF0YVtkaW1lbnNpb24ubmFtZV0gPSBvQ29udGV4dC5nZXRQcm9wZXJ0eShkaW1lbnNpb24ubmFtZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0Lm1lYXN1cmVzLmZvckVhY2goKG1lYXN1cmUpID0+IHtcblx0XHRcdFx0XHRvRGF0YVttZWFzdXJlLm5hbWVdID0gb0NvbnRleHQuZ2V0UHJvcGVydHkobWVhc3VyZS5uYW1lKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmV0dXJuIG9EYXRhO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2NoYXJ0RGF0YWAsIGNoYXJ0RGF0YSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcG9wb3ZlciB0byBkaXNwbGF5IHRoZSBLUEkgY2FyZFxuXHQgKiBUaGUgcG9wb3ZlciBhbmQgdGhlIGNvbnRhaW5lZCBjYXJkIGZvciB0aGUgS1BJcyBhcmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkuXG5cdCAqIFRoZSBwb3BvdmVyIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBLUElzLCBzbyBpdCdzIGNyZWF0ZWQgb25seSBvbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0tQSVRhZyBUaGUgdGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBwb3BvdmVyIG9wZW5pbmcuXG5cdCAqIEByZXR1cm5zIFRoZSBzaGFyZWQgcG9wb3ZlciBhcyBhIHByb21pc2UuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgZ2V0UG9wb3ZlcihvS1BJVGFnOiBHZW5lcmljVGFnKTogUHJvbWlzZTxQb3BvdmVyPiB7XG5cdFx0aWYgKCF0aGlzLm9Qb3BvdmVyKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRDb3JlLmxvYWRMaWJyYXJ5KFwic2FwL3VpL2ludGVncmF0aW9uXCIsIHsgYXN5bmM6IHRydWUgfSlcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShbXCJzYXAvdWkvaW50ZWdyYXRpb24vd2lkZ2V0cy9DYXJkXCIsIFwic2FwL3VpL2ludGVncmF0aW9uL0hvc3RcIl0sIChDYXJkOiBhbnksIEhvc3Q6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvSG9zdCA9IG5ldyBIb3N0KCk7XG5cblx0XHRcdFx0XHRcdFx0b0hvc3QuYXR0YWNoQWN0aW9uKChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNUeXBlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInR5cGVcIik7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1BhcmFtcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwYXJhbWV0ZXJzXCIpO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNUeXBlID09PSBcIk5hdmlnYXRpb25cIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9QYXJhbXMuc2VtYW50aWNPYmplY3QpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtcy5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUGFyYW1zLmFjdGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGVPdXRib3VuZChvUGFyYW1zLm91dGJvdW5kKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMub0NhcmQgPSBuZXcgQ2FyZCh7XG5cdFx0XHRcdFx0XHRcdFx0d2lkdGg6IFwiMjVyZW1cIixcblx0XHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiYXV0b1wiXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnNldEhvc3Qob0hvc3QpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMub1BvcG92ZXIgPSBuZXcgUG9wb3ZlcihcImtwaS1Qb3BvdmVyXCIsIHtcblx0XHRcdFx0XHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiQXV0b1wiLFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IFt0aGlzLm9DYXJkXVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRvS1BJVGFnLmFkZERlcGVuZGVudCh0aGlzLm9Qb3BvdmVyKTsgLy8gVGhlIGZpcnN0IGNsaWNrZWQgdGFnIGdldHMgdGhlIHBvcG92ZXIgYXMgZGVwZW5kZW50XG5cblx0XHRcdFx0XHRcdFx0cmVzb2x2ZSh0aGlzLm9Qb3BvdmVyKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vUG9wb3Zlcik7XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdHB1YmxpYyBvbktQSVByZXNzZWQob0tQSVRhZzogYW55LCBrcGlJRDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0tQSU1vZGVsID0gb0tQSVRhZy5nZXRNb2RlbChcImtwaU1vZGVsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGtwaURlZmluaXRpb24gPSB0aGlzLmFLUElEZWZpbml0aW9ucy5maW5kKGZ1bmN0aW9uIChvRGVmKSB7XG5cdFx0XHRcdHJldHVybiBvRGVmLmlkID09PSBrcGlJRDtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbikge1xuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvS1BJVGFnLmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IGFQcm9taXNlcyA9IFtcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElUYWdEYXRhKGtwaURlZmluaXRpb24sIG9Nb2RlbCwgb0tQSU1vZGVsLCB0cnVlKSxcblx0XHRcdFx0XHR0aGlzLmxvYWRLUElDYXJkRGF0YShrcGlEZWZpbml0aW9uLCBvTW9kZWwsIG9LUElNb2RlbCksXG5cdFx0XHRcdFx0dGhpcy5nZXRQb3BvdmVyKG9LUElUYWcpXG5cdFx0XHRcdF07XG5cblx0XHRcdFx0UHJvbWlzZS5hbGwoYVByb21pc2VzKVxuXHRcdFx0XHRcdC50aGVuKChhUmVzdWx0cykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5vQ2FyZC5zZXRNYW5pZmVzdChvS1BJTW9kZWwuZ2V0UHJvcGVydHkoYC8ke2twaUlEfS9tYW5pZmVzdGApKTtcblx0XHRcdFx0XHRcdHRoaXMub0NhcmQucmVmcmVzaCgpO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBvUG9wb3ZlciA9IGFSZXN1bHRzWzJdO1xuXHRcdFx0XHRcdFx0b1BvcG92ZXIub3BlbkJ5KG9LUElUYWcsIGZhbHNlKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1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
|
|
1014
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiVmFsdWVDb2xvckZyb21NZXNzYWdlVHlwZSIsIk5vbmUiLCJtZXNzYWdlVHlwZUZyb21UYXJnZXRDYWxjdWxhdGlvbiIsImtwaVZhbHVlIiwiYVRocmVzaG9sZHMiLCJjcml0aWNhbGl0eVByb3BlcnR5IiwidW5kZWZpbmVkIiwibWVzc2FnZVR5cGVGcm9tTWluaW1pemVDYWxjdWxhdGlvbiIsIm1lc3NhZ2VUeXBlRnJvbU1heGltaXplQ2FsY3VsYXRpb24iLCJkZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwidHJlbmRWYWx1ZSIsImRldmlhdGlvbkluZGljYXRvciIsImRldmlhdGlvbkluZGljYXRvckZyb21DYWxjdWxhdGlvbiIsInJlZmVyZW5jZVZhbHVlIiwiaXNSZWxhdGl2ZSIsImNvbXBWYWx1ZSIsImNyZWF0ZUZpbHRlckZyb21EZWZpbml0aW9uIiwiZmlsdGVyRGVmaW5pdGlvbiIsInJhbmdlcyIsImxlbmd0aCIsIkZpbHRlciIsInByb3BlcnR5UGF0aCIsIm9wZXJhdG9yIiwicmFuZ2VMb3ciLCJyYW5nZUhpZ2giLCJhUmFuZ2VGaWx0ZXJzIiwibWFwIiwicmFuZ2UiLCJmaWx0ZXJzIiwiYW5kIiwiZ2V0RmlsdGVyU3RyaW5nRnJvbURlZmluaXRpb24iLCJjdXJyZW50TG9jYWxlIiwiTG9jYWxlIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0Q29uZmlndXJhdGlvbiIsImdldExhbmd1YWdlIiwicmVzQnVuZGxlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImRhdGVGb3JtYXQiLCJEYXRlRm9ybWF0IiwiZ2V0RGF0ZUluc3RhbmNlIiwic3R5bGUiLCJmb3JtYXRSYW5nZSIsInZhbHVlTG93IiwicHJvcGVydHlUeXBlIiwiaW5kZXhPZiIsImZvcm1hdCIsIkRhdGUiLCJ2YWx1ZUhpZ2giLCJnZXRUZXh0Iiwiam9pbiIsImZvcm1hdENoYXJ0VGl0bGUiLCJrcGlEZWYiLCJmb3JtYXRMaXN0IiwiaXRlbXMiLCJsYWJlbCIsInJlcyIsIkkiLCJjaGFydCIsIm1lYXN1cmVzIiwiZGltZW5zaW9ucyIsInVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyIsImNoYXJ0RGVmaW5pdGlvbiIsIm9DaGFydFByb3BlcnRpZXMiLCJjaGFydFR5cGUiLCJjYXRlZ29yeUF4aXMiLCJ0aXRsZSIsInZpc2libGUiLCJ2YWx1ZUF4aXMiLCJmb3JtYXRTdHJpbmciLCJwbG90QXJlYSIsImRhdGFMYWJlbCIsInR5cGUiLCJ2YWx1ZUF4aXMyIiwibGVnZW5kR3JvdXAiLCJsYXlvdXQiLCJwb3NpdGlvbiIsImFsaWdubWVudCIsInNpemVMZWdlbmQiLCJmaWx0ZXJNYXAiLCJhT2JqZWN0cyIsImFSb2xlcyIsImZpbHRlciIsImRpbWVuc2lvbiIsInJvbGUiLCJnZXRTY2F0dGVyQnViYmxlQ2hhcnRGZWVkcyIsImF4aXMxTWVhc3VyZXMiLCJheGlzMk1lYXN1cmVzIiwiYXhpczNNZWFzdXJlcyIsIm90aGVyTWVhc3VyZXMiLCJzZXJpZXNEaW1lbnNpb25zIiwic2hhcGVEaW1lbnNpb24iLCJmaW5kIiwieE1lYXN1cmUiLCJzaGlmdCIsInlNZWFzdXJlIiwidWlkIiwidmFsdWVzIiwic2l6ZU1lYXN1cmUiLCJwdXNoIiwiZ2V0Q2hhcnRGZWVkcyIsImdldE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibmF2SW5mbyIsIm9TaGVsbFNlcnZpY2UiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsImdldExpbmtzIiwidGhlbiIsImFMaW5rcyIsImdldFByaW1hcnlJbnRlbnQiLCJvTGluayIsIm9JbmZvIiwicGFyc2VTaGVsbEhhc2giLCJpbnRlbnQiLCJ1bmF2YWlsYWJsZUFjdGlvbnMiLCJvdXRib3VuZE5hdmlnYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsIm91dGJvdW5kIiwiS1BJTWFuYWdlbWVudENvbnRyb2xsZXJFeHRlbnNpb24iLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiaW5pdENhcmRNYW5pZmVzdCIsImtwaURlZmluaXRpb24iLCJvS1BJTW9kZWwiLCJvQ2FyZE1hbmlmZXN0IiwiaWQiLCJ0ZWNobm9sb2d5IiwiZGF0YSIsImpzb24iLCJoZWFkZXIiLCJkYXRhcG9pbnQiLCJzdWJUaXRsZSIsImRlc2NyaXB0aW9uIiwidW5pdE9mTWVhc3VyZW1lbnQiLCJtYWluSW5kaWNhdG9yIiwibnVtYmVyIiwidW5pdCIsInN0YXRlIiwidHJlbmQiLCJjb250ZW50IiwibWluSGVpZ2h0IiwiY2hhcnRQcm9wZXJ0aWVzIiwicGF0aCIsInRhcmdldFBhdGgiLCJ0YXJnZXRWYWx1ZSIsInNpZGVJbmRpY2F0b3JzIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiYURlc2NyaXB0aW9ucyIsImZvckVhY2giLCJkZXNjIiwiZGV0YWlscyIsInRleHQiLCJ2YWx1ZSIsIm5hbWUiLCJtZWFzdXJlIiwiZmVlZHMiLCJzZXRQcm9wZXJ0eSIsIm1hbmlmZXN0IiwiaW5pdE5hdmlnYXRpb25JbmZvIiwibmF2aWdhdGlvbiIsIm9OYXZJbmZvIiwicGFyYW1ldGVycyIsIm9uSW5pdCIsImFLUElEZWZpbml0aW9ucyIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiX2dldFBhZ2VNb2RlbCIsImdldFByb3BlcnR5Iiwib1ZpZXciLCJvQXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJnZXRTaGVsbFNlcnZpY2VzIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsImxvYWRLUElUYWdEYXRhIiwiZ2V0TW9kZWwiLCJvbkV4aXQiLCJkZXN0cm95IiwidXBkYXRlRGF0YXBvaW50VmFsdWVBbmRDdXJyZW5jeSIsImtwaUNvbnRleHQiLCJyYXdVbml0IiwiaXNQYXRoIiwiaXNQZXJjZW50YWdlIiwiaXNDdXJyZW5jeSIsInJhd1ZhbHVlIiwiTnVtYmVyIiwicGFyc2VGbG9hdCIsIk51bWJlckZvcm1hdCIsImdldEZsb2F0SW5zdGFuY2UiLCJtaW5GcmFjdGlvbkRpZ2l0cyIsIm1heEZyYWN0aW9uRGlnaXRzIiwic2hvd1NjYWxlIiwia3BpVmFsdWVVbnNjYWxlZCIsImdyb3VwaW5nRW5hYmxlZCIsImtwaVZhbHVlTm9TY2FsZSIsImtwaVZhbHVlU2NhbGUiLCJkZWNpbWFscyIsIm1heEludGVnZXJEaWdpdHMiLCJrcGlVbml0IiwiZ2V0VW5pdEluc3RhbmNlIiwic2hvd051bWJlciIsInVwZGF0ZURhdGFwb2ludENyaXRpY2FsaXR5IiwiY3JpdGljYWxpdHlWYWx1ZSIsImNyaXRpY2FsaXR5UGF0aCIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJ1cGRhdGVEYXRhcG9pbnRUcmVuZCIsInRyZW5kUGF0aCIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoIiwidHJlbmRSZWZlcmVuY2VWYWx1ZSIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwidHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyIsInVwZGF0ZVRhcmdldFZhbHVlIiwidGFyZ2V0UmF3VmFsdWUiLCJkZXZpYXRpb25SYXdWYWx1ZSIsInRhcmdldFNjYWxlIiwiZGV2aWF0aW9uVmFsdWUiLCJvTWFpbk1vZGVsIiwibG9hZEZ1bGwiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImVudGl0eVNldCIsIiQkZ3JvdXBJZCIsIm9BZ2dyZWdhdGUiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0ZSIsImFGaWx0ZXJzIiwicmVxdWVzdENvbnRleHRzIiwiYUNvbnRleHRzIiwibG9hZEtQSUNhcmREYXRhIiwib0dyb3VwIiwiZ3JvdXAiLCJzb3J0T3JkZXIiLCJzb3J0Iiwic29ydEluZm8iLCJTb3J0ZXIiLCJkZXNjZW5kaW5nIiwibWF4SXRlbXMiLCJjaGFydERhdGEiLCJvQ29udGV4dCIsIm9EYXRhIiwiZ2V0UG9wb3ZlciIsIm9LUElUYWciLCJvUG9wb3ZlciIsInJlamVjdCIsImxvYWRMaWJyYXJ5IiwiYXN5bmMiLCJyZXF1aXJlIiwiQ2FyZCIsIkhvc3QiLCJvSG9zdCIsImF0dGFjaEFjdGlvbiIsIm9FdmVudCIsInNUeXBlIiwiZ2V0UGFyYW1ldGVyIiwib1BhcmFtcyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRlT3V0Ym91bmQiLCJvQ2FyZCIsIndpZHRoIiwiaGVpZ2h0Iiwic2V0SG9zdCIsIlBvcG92ZXIiLCJzaG93SGVhZGVyIiwicGxhY2VtZW50IiwiYWRkRGVwZW5kZW50Iiwib25LUElQcmVzc2VkIiwia3BpSUQiLCJvRGVmIiwib01vZGVsIiwiYVByb21pc2VzIiwiYWxsIiwiYVJlc3VsdHMiLCJzZXRNYW5pZmVzdCIsInJlZnJlc2giLCJvcGVuQnkiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJLUElNYW5hZ2VtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEtQSUNoYXJ0RGVmaW5pdGlvbiwgS1BJRGVmaW5pdGlvbiwgTmF2aWdhdGlvbkluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vS1BJXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckRlZmluaXRpb24sIFJhbmdlRGVmaW5pdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvU2VsZWN0aW9uVmFyaWFudEhlbHBlclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBHZW5lcmljVGFnIGZyb20gXCJzYXAvbS9HZW5lcmljVGFnXCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBEYXRlRm9ybWF0IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXQvRGF0ZUZvcm1hdFwiO1xuaW1wb3J0IE51bWJlckZvcm1hdCBmcm9tIFwic2FwL3VpL2NvcmUvZm9ybWF0L051bWJlckZvcm1hdFwiO1xuaW1wb3J0IExvY2FsZSBmcm9tIFwic2FwL3VpL2NvcmUvTG9jYWxlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCB0eXBlIEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuXG5jb25zdCBNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eTogUmVjb3JkPHN0cmluZywgTWVzc2FnZVR5cGU+ID0ge1xuXHRcIjFcIjogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFwiMlwiOiBNZXNzYWdlVHlwZS5XYXJuaW5nLFxuXHRcIjNcIjogTWVzc2FnZVR5cGUuU3VjY2Vzcyxcblx0XCI1XCI6IE1lc3NhZ2VUeXBlLkluZm9ybWF0aW9uXG59O1xuXG5jb25zdCBWYWx1ZUNvbG9yRnJvbU1lc3NhZ2VUeXBlOiBSZWNvcmQ8TWVzc2FnZVR5cGUsIHN0cmluZz4gPSB7XG5cdEVycm9yOiBcIkVycm9yXCIsXG5cdFdhcm5pbmc6IFwiQ3JpdGljYWxcIixcblx0U3VjY2VzczogXCJHb29kXCIsXG5cdEluZm9ybWF0aW9uOiBcIk5vbmVcIixcblx0Tm9uZTogXCJOb25lXCJcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IGEgbWVzc2FnZSBzdGF0ZSBmcm9tIGEgY2FsY3VsYXRlZCBjcml0aWNhbGl0eSBvZiB0eXBlICdUYXJnZXQnLlxuICpcbiAqIEBwYXJhbSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUsVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUsRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVdLlxuICogQHJldHVybnMgUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBNZXNzYWdlVHlwZVxuICovXG5mdW5jdGlvbiBtZXNzYWdlVHlwZUZyb21UYXJnZXRDYWxjdWxhdGlvbihrcGlWYWx1ZTogbnVtYmVyLCBhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10pOiBNZXNzYWdlVHlwZSB7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBNZXNzYWdlVHlwZTtcblxuXHRpZiAoYVRocmVzaG9sZHNbMF0gIT09IHVuZGVmaW5lZCAmJiBhVGhyZXNob2xkc1swXSAhPT0gbnVsbCAmJiBrcGlWYWx1ZSA8IGFUaHJlc2hvbGRzWzBdKSB7XG5cdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzFdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMV0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1sxXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9IGVsc2UgaWYgKGFUaHJlc2hvbGRzWzVdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbNV0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1s1XSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1s0XSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzRdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbNF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1szXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzNdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbM10pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0fSBlbHNlIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fVxuXG5cdHJldHVybiBjcml0aWNhbGl0eVByb3BlcnR5O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnTWluaW1pemUnLlxuICpcbiAqIEBwYXJhbSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0FjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSxUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSxEZXZpYXRpb25SYW5nZUhpZ2hWYWx1ZV0uXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24oa3BpVmFsdWU6IG51bWJlciwgYVRocmVzaG9sZHM6IChudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKVtdKTogTWVzc2FnZVR5cGUge1xuXHRsZXQgY3JpdGljYWxpdHlQcm9wZXJ0eTogTWVzc2FnZVR5cGU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzJdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMl0gIT09IG51bGwgJiYga3BpVmFsdWUgPiBhVGhyZXNob2xkc1syXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1sxXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzFdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMV0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGtwaVZhbHVlID4gYVRocmVzaG9sZHNbMF0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0fSBlbHNlIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fVxuXG5cdHJldHVybiBjcml0aWNhbGl0eVByb3BlcnR5O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCBhIG1lc3NhZ2Ugc3RhdGUgZnJvbSBhIGNhbGN1bGF0ZWQgY3JpdGljYWxpdHkgb2YgdHlwZSAnTWF4aW1pemUnLlxuICpcbiAqIEBwYXJhbSBrcGlWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIEtQSSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSBhVGhyZXNob2xkcyBUaHJlc2hvbGRzIHRvIGJlIHVzZWQgW0RldmlhdGlvblJhbmdlTG93VmFsdWUsVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSxBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZV0uXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIE1lc3NhZ2VUeXBlXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlRnJvbU1heGltaXplQ2FsY3VsYXRpb24oa3BpVmFsdWU6IG51bWJlciwgYVRocmVzaG9sZHM6IChudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKVtdKTogTWVzc2FnZVR5cGUge1xuXHRsZXQgY3JpdGljYWxpdHlQcm9wZXJ0eTogTWVzc2FnZVR5cGU7XG5cblx0aWYgKGFUaHJlc2hvbGRzWzBdICE9PSB1bmRlZmluZWQgJiYgYVRocmVzaG9sZHNbMF0gIT09IG51bGwgJiYga3BpVmFsdWUgPCBhVGhyZXNob2xkc1swXSkge1xuXHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1sxXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzFdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMV0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuV2FybmluZztcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1syXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzJdICE9PSBudWxsICYmIGtwaVZhbHVlIDwgYVRocmVzaG9sZHNbMl0pIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0fSBlbHNlIHtcblx0XHRjcml0aWNhbGl0eVByb3BlcnR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fVxuXG5cdHJldHVybiBjcml0aWNhbGl0eVByb3BlcnR5O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIERldmlhdGlvbkluZGljYXRvciB2YWx1ZSBmcm9tIGEgdHJlbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHRyZW5kVmFsdWUgVGhlIGNyaXRpY2FsaXR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgRGV2aWF0aW9uSW5kaWNhdG9yIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUodHJlbmRWYWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXG5cdHN3aXRjaCAodHJlbmRWYWx1ZSkge1xuXHRcdGNhc2UgMTogLy8gU3Ryb25nVXBcblx0XHRjYXNlIFwiMVwiOlxuXHRcdGNhc2UgMjogLy8gVXBcblx0XHRjYXNlIFwiMlwiOlxuXHRcdFx0ZGV2aWF0aW9uSW5kaWNhdG9yID0gXCJVcFwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIDQ6IC8vIERvd25cblx0XHRjYXNlIFwiNFwiOlxuXHRcdGNhc2UgNTogLy8gU3Ryb25nRG93blxuXHRcdGNhc2UgXCI1XCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cblx0cmV0dXJuIGRldmlhdGlvbkluZGljYXRvcjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYSBEZXZpYXRpb25JbmRpY2F0b3IgZnJvbSBhIFRyZW5kQ2FsY3VsYXRpb24uXG4gKlxuICogQHBhcmFtIGtwaVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgS1BJXG4gKiBAcGFyYW0gcmVmZXJlbmNlVmFsdWUgVGhlIHJlZmVyZW5jZSB2YWx1ZSB0byBjb21wYXJlIHdpdGhcbiAqIEBwYXJhbSBpc1JlbGF0aXZlIFRydWUgaXMgdGhlIGNvbXBhcmlzb24gaXMgcmVsYXRpdmVcbiAqIEBwYXJhbSBhVGhyZXNob2xkcyBBcnJheSBvZiB0aHJlc2hvbGRzIFtTdHJvbmdEb3duRGlmZmVyZW5jZSwgRG93bkRpZmZlcmVuY2UsIFVwRGlmZmVyZW5jZSwgU3Ryb25nVXBEaWZmZXJlbmNlXVxuICogQHJldHVybnMgUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBEZXZpYXRpb25JbmRpY2F0b3IgdmFsdWVcbiAqL1xuZnVuY3Rpb24gZGV2aWF0aW9uSW5kaWNhdG9yRnJvbUNhbGN1bGF0aW9uKFxuXHRrcGlWYWx1ZTogbnVtYmVyLFxuXHRyZWZlcmVuY2VWYWx1ZTogbnVtYmVyLFxuXHRpc1JlbGF0aXZlOiBib29sZWFuLFxuXHRhVGhyZXNob2xkczogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW10gfCB1bmRlZmluZWRcbik6IHN0cmluZyB7XG5cdGxldCBkZXZpYXRpb25JbmRpY2F0b3I6IHN0cmluZztcblxuXHRpZiAoIWFUaHJlc2hvbGRzIHx8IChpc1JlbGF0aXZlICYmICFyZWZlcmVuY2VWYWx1ZSkpIHtcblx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdH1cblxuXHRjb25zdCBjb21wVmFsdWUgPSBpc1JlbGF0aXZlID8gKGtwaVZhbHVlIC0gcmVmZXJlbmNlVmFsdWUpIC8gcmVmZXJlbmNlVmFsdWUgOiBrcGlWYWx1ZSAtIHJlZmVyZW5jZVZhbHVlO1xuXG5cdGlmIChhVGhyZXNob2xkc1swXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzBdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA8PSBhVGhyZXNob2xkc1swXSkge1xuXHRcdC8vIFN0cm9uZ0Rvd24gLS0+IERvd25cblx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1sxXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzFdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA8PSBhVGhyZXNob2xkc1sxXSkge1xuXHRcdC8vIERvd24gLS0+IERvd25cblx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIkRvd25cIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1szXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzNdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA+PSBhVGhyZXNob2xkc1szXSkge1xuXHRcdC8vIFN0cm9uZ1VwIC0tPiBVcFxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiVXBcIjtcblx0fSBlbHNlIGlmIChhVGhyZXNob2xkc1syXSAhPT0gdW5kZWZpbmVkICYmIGFUaHJlc2hvbGRzWzJdICE9PSBudWxsICYmIGNvbXBWYWx1ZSA+PSBhVGhyZXNob2xkc1syXSkge1xuXHRcdC8vIFVwIC0tPiBVcFxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiVXBcIjtcblx0fSBlbHNlIHtcblx0XHQvLyBTaWRld2F5cyAtLT4gTm9uZVxuXHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cblx0cmV0dXJuIGRldmlhdGlvbkluZGljYXRvcjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2FwLnVpLm1vZGVsLkZpbHRlciBmcm9tIGEgZmlsdGVyIGRlZmluaXRpb24uXG4gKlxuICogQHBhcmFtIGZpbHRlckRlZmluaXRpb24gVGhlIGZpbHRlciBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBSZXR1cm5zIGEgc2FwLnVpLm1vZGVsLkZpbHRlciBmcm9tIHRoZSBkZWZpbml0aW9uLCBvciB1bmRlZmluZWQgaWYgdGhlIGRlZmluaXRpb24gaXMgZW1wdHkgKG5vIHJhbmdlcylcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmlsdGVyRnJvbURlZmluaXRpb24oZmlsdGVyRGVmaW5pdGlvbjogRmlsdGVyRGVmaW5pdGlvbik6IEZpbHRlciB8IHVuZGVmaW5lZCB7XG5cdGlmIChmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGZpbHRlckRlZmluaXRpb24ucmFuZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBuZXcgRmlsdGVyKFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnJhbmdlc1swXS5vcGVyYXRvciBhcyBGaWx0ZXJPcGVyYXRvcixcblx0XHRcdGZpbHRlckRlZmluaXRpb24ucmFuZ2VzWzBdLnJhbmdlTG93LFxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0ucmFuZ2VIaWdoXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBhUmFuZ2VGaWx0ZXJzID0gZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubWFwKChyYW5nZSkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWx0ZXIoZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVBhdGgsIHJhbmdlLm9wZXJhdG9yIGFzIEZpbHRlck9wZXJhdG9yLCByYW5nZS5yYW5nZUxvdywgcmFuZ2UucmFuZ2VIaWdoKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRmaWx0ZXJzOiBhUmFuZ2VGaWx0ZXJzLFxuXHRcdFx0YW5kOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldEZpbHRlclN0cmluZ0Zyb21EZWZpbml0aW9uKGZpbHRlckRlZmluaXRpb246IEZpbHRlckRlZmluaXRpb24pOiBzdHJpbmcge1xuXHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShzYXAudWkuZ2V0Q29yZSgpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRMYW5ndWFnZSgpKTtcblx0Y29uc3QgcmVzQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0Y29uc3QgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKHsgc3R5bGU6IFwibWVkaXVtXCIgfSwgY3VycmVudExvY2FsZSk7XG5cblx0ZnVuY3Rpb24gZm9ybWF0UmFuZ2UocmFuZ2U6IFJhbmdlRGVmaW5pdGlvbik6IHN0cmluZyB7XG5cdFx0Y29uc3QgdmFsdWVMb3cgPVxuXHRcdFx0ZmlsdGVyRGVmaW5pdGlvbi5wcm9wZXJ0eVR5cGUuaW5kZXhPZihcIkVkbS5EYXRlXCIpID09PSAwID8gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUocmFuZ2UucmFuZ2VMb3cpKSA6IHJhbmdlLnJhbmdlTG93O1xuXHRcdGNvbnN0IHZhbHVlSGlnaCA9XG5cdFx0XHRmaWx0ZXJEZWZpbml0aW9uLnByb3BlcnR5VHlwZS5pbmRleE9mKFwiRWRtLkRhdGVcIikgPT09IDAgPyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZShyYW5nZS5yYW5nZUhpZ2gpKSA6IHJhbmdlLnJhbmdlSGlnaDtcblxuXHRcdHN3aXRjaCAocmFuZ2Uub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgXCJCVFwiOlxuXHRcdFx0XHRyZXR1cm4gYFske3ZhbHVlTG93fSAtICR7dmFsdWVIaWdofV1gO1xuXG5cdFx0XHRjYXNlIFwiQ29udGFpbnNcIjpcblx0XHRcdFx0cmV0dXJuIGAqJHt2YWx1ZUxvd30qYDtcblxuXHRcdFx0Y2FzZSBcIkdFXCI6XG5cdFx0XHRcdHJldHVybiBgXFx1MjI2NSR7dmFsdWVMb3d9YDtcblxuXHRcdFx0Y2FzZSBcIkdUXCI6XG5cdFx0XHRcdHJldHVybiBgPiR7dmFsdWVMb3d9YDtcblxuXHRcdFx0Y2FzZSBcIkxFXCI6XG5cdFx0XHRcdHJldHVybiBgXFx1MjI2NCR7dmFsdWVMb3d9YDtcblxuXHRcdFx0Y2FzZSBcIkxUXCI6XG5cdFx0XHRcdHJldHVybiBgPCR7dmFsdWVMb3d9YDtcblxuXHRcdFx0Y2FzZSBcIk5CXCI6XG5cdFx0XHRcdHJldHVybiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9GSUxURVJTVFJJTkdfTk9UXCIsIFtgWyR7dmFsdWVMb3d9IC0gJHt2YWx1ZUhpZ2h9XWBdKTtcblxuXHRcdFx0Y2FzZSBcIk5FXCI6XG5cdFx0XHRcdHJldHVybiBgXFx1MjI2MCR7dmFsdWVMb3d9YDtcblxuXHRcdFx0Y2FzZSBcIk5vdENvbnRhaW5zXCI6XG5cdFx0XHRcdHJldHVybiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9GSUxURVJTVFJJTkdfTk9UXCIsIFtgKiR7dmFsdWVMb3d9KmBdKTtcblxuXHRcdFx0Y2FzZSBcIkVRXCI6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWVMb3c7XG5cdFx0fVxuXHR9XG5cdGlmIChmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fSBlbHNlIGlmIChmaWx0ZXJEZWZpbml0aW9uLnJhbmdlcy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gZm9ybWF0UmFuZ2UoZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXNbMF0pO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBgKCR7ZmlsdGVyRGVmaW5pdGlvbi5yYW5nZXMubWFwKGZvcm1hdFJhbmdlKS5qb2luKFwiLFwiKX0pYDtcblx0fVxufVxuXG5mdW5jdGlvbiBmb3JtYXRDaGFydFRpdGxlKGtwaURlZjogS1BJRGVmaW5pdGlvbik6IHN0cmluZyB7XG5cdGNvbnN0IHJlc0J1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cblx0ZnVuY3Rpb24gZm9ybWF0TGlzdChpdGVtczogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSB7XG5cdFx0aWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSBlbHNlIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHJldHVybiBpdGVtc1swXS5sYWJlbDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGV0IHJlcyA9IGl0ZW1zWzBdLmxhYmVsO1xuXHRcdFx0Zm9yIChsZXQgSSA9IDE7IEkgPCBpdGVtcy5sZW5ndGggLSAxOyBJKyspIHtcblx0XHRcdFx0cmVzICs9IGAsICR7aXRlbXNbSV0ubGFiZWx9YDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lURU1TTElTVFwiLCBbcmVzLCBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5sYWJlbF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXNCdW5kbGUuZ2V0VGV4dChcIkNfS1BJQ0FSRF9DSEFSVFRJVExFXCIsIFtmb3JtYXRMaXN0KGtwaURlZi5jaGFydC5tZWFzdXJlcyksIGZvcm1hdExpc3Qoa3BpRGVmLmNoYXJ0LmRpbWVuc2lvbnMpXSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoYXJ0TGFiZWxTZXR0aW5ncyhjaGFydERlZmluaXRpb246IEtQSUNoYXJ0RGVmaW5pdGlvbiwgb0NoYXJ0UHJvcGVydGllczogYW55KTogdm9pZCB7XG5cdHN3aXRjaCAoY2hhcnREZWZpbml0aW9uLmNoYXJ0VHlwZSkge1xuXHRcdGNhc2UgXCJEb251dFwiOlxuXHRcdFx0Ly8gU2hvdyBkYXRhIGxhYmVscywgZG8gbm90IHNob3cgYXhpcyB0aXRsZXNcblx0XHRcdG9DaGFydFByb3BlcnRpZXMuY2F0ZWdvcnlBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRsYWJlbDoge1xuXHRcdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0XCJcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMucGxvdEFyZWEuZGF0YUxhYmVsID0ge1xuXHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHR0eXBlOiBcInZhbHVlXCIsXG5cdFx0XHRcdGZvcm1hdFN0cmluZzogXCJTaG9ydEZsb2F0X01GRDJcIlxuXHRcdFx0fTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImJ1YmJsZVwiOlxuXHRcdFx0Ly8gU2hvdyBheGlzIHRpdGxlLCBidWJibGUgc2l6ZSBsZWdlbmQsIGRvIG5vdCBzaG93IGRhdGEgbGFiZWxzXG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpcyA9IHtcblx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMyID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLmxlZ2VuZEdyb3VwID0ge1xuXHRcdFx0XHRsYXlvdXQ6IHtcblx0XHRcdFx0XHRwb3NpdGlvbjogXCJib3R0b21cIixcblx0XHRcdFx0XHRhbGlnbm1lbnQ6IFwidG9wTGVmdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnNpemVMZWdlbmQgPSB7XG5cdFx0XHRcdHZpc2libGU6IHRydWVcblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHsgdmlzaWJsZTogZmFsc2UgfTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcInNjYXR0ZXJcIjpcblx0XHRcdC8vIERvIG5vdCBzaG93IGRhdGEgbGFiZWxzIGFuZCBheGlzIHRpdGxlc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy52YWx1ZUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnZhbHVlQXhpczIgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0bGFiZWw6IHtcblx0XHRcdFx0XHRmb3JtYXRTdHJpbmc6IFwiU2hvcnRGbG9hdFwiXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRvQ2hhcnRQcm9wZXJ0aWVzLnBsb3RBcmVhLmRhdGFMYWJlbCA9IHsgdmlzaWJsZTogZmFsc2UgfTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8vIERvIG5vdCBzaG93IGRhdGEgbGFiZWxzIGFuZCBheGlzIHRpdGxlc1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5jYXRlZ29yeUF4aXMgPSB7XG5cdFx0XHRcdHRpdGxlOiB7XG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdG9DaGFydFByb3BlcnRpZXMudmFsdWVBeGlzID0ge1xuXHRcdFx0XHR0aXRsZToge1xuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxhYmVsOiB7XG5cdFx0XHRcdFx0Zm9ybWF0U3RyaW5nOiBcIlNob3J0RmxvYXRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0b0NoYXJ0UHJvcGVydGllcy5wbG90QXJlYS5kYXRhTGFiZWwgPSB7IHZpc2libGU6IGZhbHNlIH07XG5cdH1cbn1cbmZ1bmN0aW9uIGZpbHRlck1hcChhT2JqZWN0czogeyBuYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHJvbGU/OiBzdHJpbmcgfVtdLCBhUm9sZXM/OiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdKTogc3RyaW5nW10ge1xuXHRpZiAoYVJvbGVzICYmIGFSb2xlcy5sZW5ndGgpIHtcblx0XHRyZXR1cm4gYU9iamVjdHNcblx0XHRcdC5maWx0ZXIoKGRpbWVuc2lvbikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYVJvbGVzLmluZGV4T2YoZGltZW5zaW9uLnJvbGUpID49IDA7XG5cdFx0XHR9KVxuXHRcdFx0Lm1hcCgoZGltZW5zaW9uKSA9PiB7XG5cdFx0XHRcdHJldHVybiBkaW1lbnNpb24ubGFiZWw7XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gYU9iamVjdHMubWFwKChkaW1lbnNpb24pID0+IHtcblx0XHRcdHJldHVybiBkaW1lbnNpb24ubGFiZWw7XG5cdFx0fSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0U2NhdHRlckJ1YmJsZUNoYXJ0RmVlZHMoY2hhcnREZWZpbml0aW9uOiBLUElDaGFydERlZmluaXRpb24pOiB7IHVpZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHZhbHVlczogc3RyaW5nW10gfVtdIHtcblx0Y29uc3QgYXhpczFNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMxXCJdKTtcblx0Y29uc3QgYXhpczJNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMyXCJdKTtcblx0Y29uc3QgYXhpczNNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMzXCJdKTtcblx0Y29uc3Qgb3RoZXJNZWFzdXJlcyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFt1bmRlZmluZWRdKTtcblx0Y29uc3Qgc2VyaWVzRGltZW5zaW9ucyA9IGZpbHRlck1hcChjaGFydERlZmluaXRpb24uZGltZW5zaW9ucywgW1wiU2VyaWVzXCJdKTtcblxuXHQvLyBHZXQgdGhlIGZpcnN0IGRpbWVuc2lvbiB3aXRoIHJvbGUgXCJDYXRlZ29yeVwiIGZvciB0aGUgc2hhcGVcblx0Y29uc3Qgc2hhcGVEaW1lbnNpb24gPSBjaGFydERlZmluaXRpb24uZGltZW5zaW9ucy5maW5kKChkaW1lbnNpb24pID0+IHtcblx0XHRyZXR1cm4gZGltZW5zaW9uLnJvbGUgPT09IFwiQ2F0ZWdvcnlcIjtcblx0fSk7XG5cblx0Ly8gTWVhc3VyZSBmb3IgdGhlIHgtQXhpcyA6IGZpcnN0IG1lYXN1cmUgZm9yIEF4aXMxLCBvciBmb3IgQXhpczIgaWYgbm90IGZvdW5kLCBvciBmb3IgQXhpczMgaWYgbm90IGZvdW5kXG5cdGNvbnN0IHhNZWFzdXJlID0gYXhpczFNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMyTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzM01lYXN1cmVzLnNoaWZ0KCkgfHwgb3RoZXJNZWFzdXJlcy5zaGlmdCgpIHx8IFwiXCI7XG5cdC8vIE1lYXN1cmUgZm9yIHRoZSB5LUF4aXMgOiBmaXJzdCBtZWFzdXJlIGZvciBBeGlzMiwgb3Igc2Vjb25kIG1lYXN1cmUgZm9yIEF4aXMxIGlmIG5vdCBmb3VuZCwgb3IgZmlyc3QgbWVhc3VyZSBmb3IgQXhpczMgaWYgbm90IGZvdW5kXG5cdGNvbnN0IHlNZWFzdXJlID0gYXhpczJNZWFzdXJlcy5zaGlmdCgpIHx8IGF4aXMxTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzM01lYXN1cmVzLnNoaWZ0KCkgfHwgb3RoZXJNZWFzdXJlcy5zaGlmdCgpIHx8IFwiXCI7XG5cdGNvbnN0IHJlcyA9IFtcblx0XHR7XG5cdFx0XHR1aWQ6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHR0eXBlOiBcIk1lYXN1cmVcIixcblx0XHRcdHZhbHVlczogW3hNZWFzdXJlXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0dWlkOiBcInZhbHVlQXhpczJcIixcblx0XHRcdHR5cGU6IFwiTWVhc3VyZVwiLFxuXHRcdFx0dmFsdWVzOiBbeU1lYXN1cmVdXG5cdFx0fVxuXHRdO1xuXG5cdGlmIChjaGFydERlZmluaXRpb24uY2hhcnRUeXBlID09PSBcImJ1YmJsZVwiKSB7XG5cdFx0Ly8gTWVhc3VyZSBmb3IgdGhlIHNpemUgb2YgdGhlIGJ1YmJsZTogZmlyc3QgbWVhc3VyZSBmb3IgQXhpczMsIG9yIHJlbWFpbmluZyBtZWFzdXJlIGZvciBBeGlzMS9BeGlzMiBpZiBub3QgZm91bmRcblx0XHRjb25zdCBzaXplTWVhc3VyZSA9IGF4aXMzTWVhc3VyZXMuc2hpZnQoKSB8fCBheGlzMU1lYXN1cmVzLnNoaWZ0KCkgfHwgYXhpczJNZWFzdXJlcy5zaGlmdCgpIHx8IG90aGVyTWVhc3VyZXMuc2hpZnQoKSB8fCBcIlwiO1xuXHRcdHJlcy5wdXNoKHtcblx0XHRcdHVpZDogXCJidWJibGVXaWR0aFwiLFxuXHRcdFx0dHlwZTogXCJNZWFzdXJlXCIsXG5cdFx0XHR2YWx1ZXM6IFtzaXplTWVhc3VyZV1cblx0XHR9KTtcblx0fVxuXG5cdC8vIENvbG9yIChvcHRpb25hbClcblx0aWYgKHNlcmllc0RpbWVuc2lvbnMubGVuZ3RoKSB7XG5cdFx0cmVzLnB1c2goe1xuXHRcdFx0dWlkOiBcImNvbG9yXCIsXG5cdFx0XHR0eXBlOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0dmFsdWVzOiBzZXJpZXNEaW1lbnNpb25zXG5cdFx0fSk7XG5cdH1cblx0Ly8gU2hhcGUgKG9wdGlvbmFsKVxuXHRpZiAoc2hhcGVEaW1lbnNpb24pIHtcblx0XHRyZXMucHVzaCh7XG5cdFx0XHR1aWQ6IFwic2hhcGVcIixcblx0XHRcdHR5cGU6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHR2YWx1ZXM6IFtzaGFwZURpbWVuc2lvbi5sYWJlbF1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRDaGFydEZlZWRzKGNoYXJ0RGVmaW5pdGlvbjogS1BJQ2hhcnREZWZpbml0aW9uKTogeyB1aWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyB2YWx1ZXM6IHN0cmluZ1tdIH1bXSB7XG5cdGxldCByZXM6IHsgdWlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgdmFsdWVzOiBzdHJpbmdbXSB9W107XG5cblx0c3dpdGNoIChjaGFydERlZmluaXRpb24uY2hhcnRUeXBlKSB7XG5cdFx0Y2FzZSBcIkRvbnV0XCI6XG5cdFx0XHRyZXMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR1aWQ6IFwic2l6ZVwiLFxuXHRcdFx0XHRcdHR5cGU6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdHZhbHVlczogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcylcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHVpZDogXCJjb2xvclwiLFxuXHRcdFx0XHRcdHR5cGU6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0dmFsdWVzOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMpXG5cdFx0XHRcdH1cblx0XHRcdF07XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJidWJibGVcIjpcblx0XHRjYXNlIFwic2NhdHRlclwiOlxuXHRcdFx0cmVzID0gZ2V0U2NhdHRlckJ1YmJsZUNoYXJ0RmVlZHMoY2hhcnREZWZpbml0aW9uKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcInZlcnRpY2FsX2J1bGxldFwiOlxuXHRcdFx0cmVzID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dWlkOiBcImFjdHVhbFZhbHVlc1wiLFxuXHRcdFx0XHRcdHR5cGU6IFwiTWVhc3VyZVwiLFxuXHRcdFx0XHRcdHZhbHVlczogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5tZWFzdXJlcywgW3VuZGVmaW5lZCwgXCJBeGlzMVwiXSlcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHVpZDogXCJ0YXJnZXRWYWx1ZXNcIixcblx0XHRcdFx0XHR0eXBlOiBcIk1lYXN1cmVcIixcblx0XHRcdFx0XHR2YWx1ZXM6IGZpbHRlck1hcChjaGFydERlZmluaXRpb24ubWVhc3VyZXMsIFtcIkF4aXMyXCJdKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dWlkOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdHR5cGU6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0dmFsdWVzOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFt1bmRlZmluZWQsIFwiQ2F0ZWdvcnlcIl0pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR1aWQ6IFwiY29sb3JcIixcblx0XHRcdFx0XHR0eXBlOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdHZhbHVlczogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLCBbXCJTZXJpZXNcIl0pXG5cdFx0XHRcdH1cblx0XHRcdF07XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXMgPSBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR1aWQ6IFwidmFsdWVBeGlzXCIsXG5cdFx0XHRcdFx0dHlwZTogXCJNZWFzdXJlXCIsXG5cdFx0XHRcdFx0dmFsdWVzOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLm1lYXN1cmVzKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dWlkOiBcImNhdGVnb3J5QXhpc1wiLFxuXHRcdFx0XHRcdHR5cGU6IFwiRGltZW5zaW9uXCIsXG5cdFx0XHRcdFx0dmFsdWVzOiBmaWx0ZXJNYXAoY2hhcnREZWZpbml0aW9uLmRpbWVuc2lvbnMsIFt1bmRlZmluZWQsIFwiQ2F0ZWdvcnlcIl0pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR1aWQ6IFwiY29sb3JcIixcblx0XHRcdFx0XHR0eXBlOiBcIkRpbWVuc2lvblwiLFxuXHRcdFx0XHRcdHZhbHVlczogZmlsdGVyTWFwKGNoYXJ0RGVmaW5pdGlvbi5kaW1lbnNpb25zLCBbXCJTZXJpZXNcIl0pXG5cdFx0XHRcdH1cblx0XHRcdF07XG5cdH1cblxuXHRyZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0bmF2SW5mbzogTmF2aWdhdGlvbkluZm8sXG5cdG9TaGVsbFNlcnZpY2U6IGFueVxuKTogUHJvbWlzZTx7IHNlbWFudGljT2JqZWN0Pzogc3RyaW5nOyBhY3Rpb24/OiBzdHJpbmc7IG91dGJvdW5kPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcblx0aWYgKG5hdkluZm8uc2VtYW50aWNPYmplY3QpIHtcblx0XHRpZiAobmF2SW5mby5hY3Rpb24pIHtcblx0XHRcdC8vIEFjdGlvbiBpcyBhbHJlYWR5IHNwZWNpZmllZDogY2hlY2sgaWYgaXQncyBhdmFpbGFibGUgaW4gdGhlIHNoZWxsXG5cdFx0XHRyZXR1cm4gb1NoZWxsU2VydmljZS5nZXRMaW5rcyh7IHNlbWFudGljT2JqZWN0OiBuYXZJbmZvLnNlbWFudGljT2JqZWN0LCBhY3Rpb246IG5hdkluZm8uYWN0aW9uIH0pLnRoZW4oKGFMaW5rczogYW55W10pID0+IHtcblx0XHRcdFx0cmV0dXJuIGFMaW5rcy5sZW5ndGggPyB7IHNlbWFudGljT2JqZWN0OiBuYXZJbmZvLnNlbWFudGljT2JqZWN0LCBhY3Rpb246IG5hdkluZm8uYWN0aW9uIH0gOiB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2UgZ2V0IHRoZSBwcmltYXJ5IGludGVudCBmcm9tIHRoZSBzaGVsbFxuXHRcdFx0cmV0dXJuIG9TaGVsbFNlcnZpY2UuZ2V0UHJpbWFyeUludGVudChuYXZJbmZvLnNlbWFudGljT2JqZWN0KS50aGVuKChvTGluazogYW55KSA9PiB7XG5cdFx0XHRcdGlmICghb0xpbmspIHtcblx0XHRcdFx0XHQvLyBObyBwcmltYXJ5IGludGVudC4uLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDaGVjayB0aGF0IHRoZSBwcmltYXJ5IGludGVudCBpcyBub3QgcGFydCBvZiB0aGUgdW5hdmFpbGFibGUgYWN0aW9uc1xuXHRcdFx0XHRjb25zdCBvSW5mbyA9IG9TaGVsbFNlcnZpY2UucGFyc2VTaGVsbEhhc2gob0xpbmsuaW50ZW50KTtcblx0XHRcdFx0cmV0dXJuIG5hdkluZm8udW5hdmFpbGFibGVBY3Rpb25zICYmIG5hdkluZm8udW5hdmFpbGFibGVBY3Rpb25zLmluZGV4T2Yob0luZm8uYWN0aW9uKSA+PSAwXG5cdFx0XHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdFx0XHQ6IHsgc2VtYW50aWNPYmplY3Q6IG9JbmZvLnNlbWFudGljT2JqZWN0LCBhY3Rpb246IG9JbmZvLmFjdGlvbiB9O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIE91dGJvdW5kIG5hdmlnYXRpb24gc3BlY2lmaWVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdHJldHVybiBuYXZJbmZvLm91dGJvdW5kTmF2aWdhdGlvbiA/IFByb21pc2UucmVzb2x2ZSh7IG91dGJvdW5kOiBuYXZJbmZvLm91dGJvdW5kTmF2aWdhdGlvbiB9KSA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHR9XG59XG5cbi8qKlxuICogQGNsYXNzIEEgY29udHJvbGxlciBleHRlbnNpb24gZm9yIG1hbmFnaW5nIHRoZSBLUElzIGluIGFuIGFuYWx5dGljYWwgbGlzdCBwYWdlXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICogQHNpbmNlIDEuOTMuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5LUElNYW5hZ2VtZW50XCIpXG5jbGFzcyBLUElNYW5hZ2VtZW50Q29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYUtQSURlZmluaXRpb25zPzogS1BJRGVmaW5pdGlvbltdO1xuXHRwcm90ZWN0ZWQgb0NhcmQ6IGFueTtcblx0cHJvdGVjdGVkIG9Qb3BvdmVyITogUG9wb3ZlcjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgY2FyZCBtYW5pZmVzdCBmb3IgYSBLUEkgZGVmaW5pdGlvbiBhbmQgc3RvcmVzIGl0IGluIGEgSlNPTiBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIGtwaURlZmluaXRpb24gVGhlIEtQSSBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBvS1BJTW9kZWwgVGhlIEpTT04gbW9kZWwgaW4gd2hpY2ggdGhlIG1hbmlmZXN0IHdpbGwgYmUgc3RvcmVkXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaW5pdENhcmRNYW5pZmVzdChrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvS1BJTW9kZWw6IEpTT05Nb2RlbCk6IHZvaWQge1xuXHRcdGNvbnN0IG9DYXJkTWFuaWZlc3Q6IGFueSA9IHtcblx0XHRcdFwic2FwLmFwcFwiOiB7XG5cdFx0XHRcdGlkOiBcInNhcC5mZVwiLFxuXHRcdFx0XHR0eXBlOiBcImNhcmRcIlxuXHRcdFx0fSxcblx0XHRcdFwic2FwLnVpXCI6IHtcblx0XHRcdFx0dGVjaG5vbG9neTogXCJVSTVcIlxuXHRcdFx0fSxcblx0XHRcdFwic2FwLmNhcmRcIjoge1xuXHRcdFx0XHR0eXBlOiBcIkFuYWx5dGljYWxcIixcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGpzb246IHt9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGhlYWRlcjoge1xuXHRcdFx0XHRcdHR5cGU6IFwiTnVtZXJpY1wiLFxuXHRcdFx0XHRcdHRpdGxlOiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50aXRsZSxcblx0XHRcdFx0XHRzdWJUaXRsZToga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuZGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0dW5pdE9mTWVhc3VyZW1lbnQ6IFwie21haW5Vbml0fVwiLFxuXHRcdFx0XHRcdG1haW5JbmRpY2F0b3I6IHtcblx0XHRcdFx0XHRcdG51bWJlcjogXCJ7bWFpblZhbHVlTm9TY2FsZX1cIixcblx0XHRcdFx0XHRcdHVuaXQ6IFwie21haW5WYWx1ZVNjYWxlfVwiLFxuXHRcdFx0XHRcdFx0c3RhdGU6IFwie21haW5TdGF0ZX1cIixcblx0XHRcdFx0XHRcdHRyZW5kOiBcInt0cmVuZH1cIlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Y29udGVudDoge1xuXHRcdFx0XHRcdG1pbkhlaWdodDogXCIyNXJlbVwiLFxuXHRcdFx0XHRcdGNoYXJ0UHJvcGVydGllczoge1xuXHRcdFx0XHRcdFx0cGxvdEFyZWE6IHt9LFxuXHRcdFx0XHRcdFx0dGl0bGU6IHtcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpZ25tZW50OiBcImxlZnRcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdFx0cGF0aDogXCIvY2hhcnREYXRhXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gQWRkIHNpZGUgaW5kaWNhdG9ycyBpbiB0aGUgY2FyZCBoZWFkZXIgaWYgYSB0YXJnZXQgaXMgZGVmaW5lZCBmb3IgdGhlIEtQSVxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoIHx8IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IHJlc0J1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uaGVhZGVyLnNpZGVJbmRpY2F0b3JzID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGl0bGU6IHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lORElDQVRPUl9UQVJHRVRcIiksXG5cdFx0XHRcdFx0bnVtYmVyOiBcInt0YXJnZXROdW1iZXJ9XCIsXG5cdFx0XHRcdFx0dW5pdDogXCJ7dGFyZ2V0VW5pdH1cIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGl0bGU6IHJlc0J1bmRsZS5nZXRUZXh0KFwiQ19LUElDQVJEX0lORElDQVRPUl9ERVZJQVRJT05cIiksXG5cdFx0XHRcdFx0bnVtYmVyOiBcIntkZXZpYXRpb25OdW1iZXJ9XCIsXG5cdFx0XHRcdFx0dW5pdDogXCIlXCJcblx0XHRcdFx0fVxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHQvLyBEZXRhaWxzIG9mIHRoZSBjYXJkOiBmaWx0ZXIgZGVzY3JpcHRpb25zXG5cdFx0aWYgKGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFEZXNjcmlwdGlvbnM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRrcGlEZWZpbml0aW9uLnNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucy5mb3JFYWNoKChmaWx0ZXJEZWZpbml0aW9uKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBnZXRGaWx0ZXJTdHJpbmdGcm9tRGVmaW5pdGlvbihmaWx0ZXJEZWZpbml0aW9uKTtcblx0XHRcdFx0aWYgKGRlc2MpIHtcblx0XHRcdFx0XHRhRGVzY3JpcHRpb25zLnB1c2goZGVzYyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYURlc2NyaXB0aW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmhlYWRlci5kZXRhaWxzID0gYURlc2NyaXB0aW9ucy5qb2luKFwiLCBcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2hhcnQgc2V0dGluZ3M6IHR5cGUsIHRpdGxlLCBkaW1lbnNpb25zIGFuZCBtZWFzdXJlcyBpbiB0aGUgbWFuaWZlc3Rcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFR5cGUgPSBrcGlEZWZpbml0aW9uLmNoYXJ0LmNoYXJ0VHlwZTtcblx0XHR1cGRhdGVDaGFydExhYmVsU2V0dGluZ3Moa3BpRGVmaW5pdGlvbi5jaGFydCwgb0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuY2hhcnRQcm9wZXJ0aWVzKTtcblx0XHRvQ2FyZE1hbmlmZXN0W1wic2FwLmNhcmRcIl0uY29udGVudC5jaGFydFByb3BlcnRpZXMudGl0bGUudGV4dCA9IGZvcm1hdENoYXJ0VGl0bGUoa3BpRGVmaW5pdGlvbik7XG5cdFx0b0NhcmRNYW5pZmVzdFtcInNhcC5jYXJkXCJdLmNvbnRlbnQuZGltZW5zaW9ucyA9IGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5tYXAoKGRpbWVuc2lvbikgPT4ge1xuXHRcdFx0cmV0dXJuIHsgbGFiZWw6IGRpbWVuc2lvbi5sYWJlbCwgdmFsdWU6IGB7JHtkaW1lbnNpb24ubmFtZX19YCB9O1xuXHRcdH0pO1xuXHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5jb250ZW50Lm1lYXN1cmVzID0ga3BpRGVmaW5pdGlvbi5jaGFydC5tZWFzdXJlcy5tYXAoKG1lYXN1cmUpID0+IHtcblx0XHRcdHJldHVybiB7IGxhYmVsOiBtZWFzdXJlLmxhYmVsLCB2YWx1ZTogYHske21lYXN1cmUubmFtZX19YCB9O1xuXHRcdH0pO1xuXHRcdG9DYXJkTWFuaWZlc3RbXCJzYXAuY2FyZFwiXS5jb250ZW50LmZlZWRzID0gZ2V0Q2hhcnRGZWVkcyhrcGlEZWZpbml0aW9uLmNoYXJ0KTtcblxuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH1gLCB7XG5cdFx0XHRtYW5pZmVzdDogb0NhcmRNYW5pZmVzdFxuXHRcdH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uSW5mbyhrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBvS1BJTW9kZWw6IEpTT05Nb2RlbCwgb1NoZWxsU2VydmljZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gQWRkIG5hdmlnYXRpb25cblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5uYXZpZ2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gZ2V0TmF2aWdhdGlvblBhcmFtZXRlcnMoa3BpRGVmaW5pdGlvbi5uYXZpZ2F0aW9uLCBvU2hlbGxTZXJ2aWNlKS50aGVuKChvTmF2SW5mbykgPT4ge1xuXHRcdFx0XHRpZiAob05hdkluZm8pIHtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2hlYWRlci9hY3Rpb25zYCwgW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIk5hdmlnYXRpb25cIixcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVyczogb05hdkluZm9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuYUtQSURlZmluaXRpb25zID0gKHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi9rcGlEZWZpbml0aW9uc1wiKTtcblxuXHRcdGlmICh0aGlzLmFLUElEZWZpbml0aW9ucyAmJiB0aGlzLmFLUElEZWZpbml0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gKG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBCYXNlQ29udHJvbGxlcikuZ2V0QXBwQ29tcG9uZW50KCkgYXMgYW55O1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBKU09OIG1vZGVsIHRvIHN0b3JlIEtQSSBkYXRhXG5cdFx0XHRjb25zdCBvS1BJTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0XHRvVmlldy5zZXRNb2RlbChvS1BJTW9kZWwsIFwia3BpTW9kZWxcIik7XG5cblx0XHRcdHRoaXMuYUtQSURlZmluaXRpb25zLmZvckVhY2goKGtwaURlZmluaXRpb24pID0+IHtcblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBtYW5pZmVzdCBmb3IgdGhlIEtQSSBjYXJkIGFuZCBzdG9yZSBpdCBpbiB0aGUgS1BJIG1vZGVsXG5cdFx0XHRcdHRoaXMuaW5pdENhcmRNYW5pZmVzdChrcGlEZWZpbml0aW9uLCBvS1BJTW9kZWwpO1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgbmF2aWdhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0dGhpcy5pbml0TmF2aWdhdGlvbkluZm8oa3BpRGVmaW5pdGlvbiwgb0tQSU1vZGVsLCBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKSkuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIExvYWQgdGFnIGRhdGEgZm9yIHRoZSBLUElcblx0XHRcdFx0dGhpcy5sb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uLCBvQXBwQ29tcG9uZW50LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCwgb0tQSU1vZGVsKS5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25FeGl0KCk6IHZvaWQge1xuXHRcdGNvbnN0IG9LUElNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwia3BpTW9kZWxcIikgYXMgSlNPTk1vZGVsO1xuXG5cdFx0aWYgKG9LUElNb2RlbCkge1xuXHRcdFx0b0tQSU1vZGVsLmRlc3Ryb3koKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURhdGFwb2ludFZhbHVlQW5kQ3VycmVuY3koa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCwgb0tQSU1vZGVsOiBKU09OTW9kZWwpIHtcblx0XHRjb25zdCBjdXJyZW50TG9jYWxlID0gbmV3IExvY2FsZShzYXAudWkuZ2V0Q29yZSgpLmdldENvbmZpZ3VyYXRpb24oKS5nZXRMYW5ndWFnZSgpKTtcblx0XHRjb25zdCByYXdVbml0ID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoXG5cdFx0XHQ/IGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSlcblx0XHRcdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8udmFsdWU7XG5cblx0XHRjb25zdCBpc1BlcmNlbnRhZ2UgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc0N1cnJlbmN5ID09PSBmYWxzZSAmJiByYXdVbml0ID09PSBcIiVcIjtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIE1haW4gS1BJIHZhbHVlXG5cdFx0Y29uc3QgcmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aCkpO1xuXG5cdFx0Ly8gVmFsdWUgZm9ybWF0dGVkIHdpdGggYSBzY2FsZVxuXHRcdGNvbnN0IGtwaVZhbHVlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBpc1BlcmNlbnRhZ2UgPyB1bmRlZmluZWQgOiBcInNob3J0XCIsXG5cdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRtYXhGcmFjdGlvbkRpZ2l0czogMSxcblx0XHRcdFx0c2hvd1NjYWxlOiAhaXNQZXJjZW50YWdlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVgLCBrcGlWYWx1ZSk7XG5cblx0XHQvLyBWYWx1ZSB3aXRob3V0IGEgc2NhbGVcblx0XHRjb25zdCBrcGlWYWx1ZVVuc2NhbGVkID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAyLFxuXHRcdFx0XHRzaG93U2NhbGU6IGZhbHNlLFxuXHRcdFx0XHRncm91cGluZ0VuYWJsZWQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVVuc2NhbGVkYCwga3BpVmFsdWVVbnNjYWxlZCk7XG5cblx0XHQvLyBWYWx1ZSBmb3JtYXR0ZWQgd2l0aCB0aGUgc2NhbGUgb21pdHRlZFxuXHRcdGNvbnN0IGtwaVZhbHVlTm9TY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQocmF3VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZU5vU2NhbGVgLCBrcGlWYWx1ZU5vU2NhbGUpO1xuXG5cdFx0Ly8gU2NhbGUgb2YgdGhlIHZhbHVlXG5cdFx0Y29uc3Qga3BpVmFsdWVTY2FsZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogaXNQZXJjZW50YWdlID8gdW5kZWZpbmVkIDogXCJzaG9ydFwiLFxuXHRcdFx0XHRkZWNpbWFsczogMCxcblx0XHRcdFx0bWF4SW50ZWdlckRpZ2l0czogMCxcblx0XHRcdFx0c2hvd1NjYWxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdCkuZm9ybWF0KHJhd1ZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVTY2FsZWAsIGtwaVZhbHVlU2NhbGUpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gVW5pdCBvciBjdXJyZW5jeVxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmIHJhd1VuaXQpIHtcblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0LmlzQ3VycmVuY3kpIHtcblx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRgLCByYXdVbml0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgdW5pdCBvZiBtZWFzdXJlLCB3ZSBoYXZlIHRvIGZvcm1hdCBpdCBwcm9wZXJseVxuXHRcdFx0XHRjb25zdCBrcGlVbml0ID0gTnVtYmVyRm9ybWF0LmdldFVuaXRJbnN0YW5jZSh7IHNob3dOdW1iZXI6IGZhbHNlIH0sIGN1cnJlbnRMb2NhbGUpLmZvcm1hdChyYXdWYWx1ZSwgcmF3VW5pdCk7XG5cdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Vbml0YCwga3BpVW5pdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEYXRhcG9pbnRDcml0aWNhbGl0eShrcGlEZWZpbml0aW9uOiBLUElEZWZpbml0aW9uLCBrcGlDb250ZXh0OiBDb250ZXh0LCBvS1BJTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdGNvbnN0IHJhd1ZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5wcm9wZXJ0eVBhdGgpKTtcblxuXHRcdGxldCBjcml0aWNhbGl0eVZhbHVlID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgaXMgYSBmaXhlZCB2YWx1ZVxuXHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWU7XG5cdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGgpIHtcblx0XHRcdC8vIENyaXRpY2FsaXR5IGNvbWVzIGZyb20gYW5vdGhlciBwcm9wZXJ0eSAodmlhIGEgcGF0aClcblx0XHRcdGNyaXRpY2FsaXR5VmFsdWUgPVxuXHRcdFx0XHRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVtrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCldIHx8IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0fSBlbHNlIGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyAmJiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSkge1xuXHRcdFx0Ly8gQ3JpdGljYWxpdHkgY2FsY3VsYXRpb25cblx0XHRcdHN3aXRjaCAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9UYXJnZXRcIjpcblx0XHRcdFx0XHRjcml0aWNhbGl0eVZhbHVlID0gbWVzc2FnZVR5cGVGcm9tVGFyZ2V0Q2FsY3VsYXRpb24ocmF3VmFsdWUsIGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01pbmltaXplXCI6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbU1pbmltaXplQ2FsY3VsYXRpb24oXG5cdFx0XHRcdFx0XHRyYXdWYWx1ZSxcblx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01heGltaXplXCI6XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Y3JpdGljYWxpdHlWYWx1ZSA9IG1lc3NhZ2VUeXBlRnJvbU1heGltaXplQ2FsY3VsYXRpb24oXG5cdFx0XHRcdFx0XHRyYXdWYWx1ZSxcblx0XHRcdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluQ3JpdGljYWxpdHlgLCBjcml0aWNhbGl0eVZhbHVlKTtcblx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoXG5cdFx0XHRgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZWAsXG5cdFx0XHRWYWx1ZUNvbG9yRnJvbU1lc3NhZ2VUeXBlW2NyaXRpY2FsaXR5VmFsdWVdIHx8IFwiTm9uZVwiXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRGF0YXBvaW50VHJlbmQoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCwgb0tQSU1vZGVsOiBKU09OTW9kZWwpIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cblx0XHRsZXQgdHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXG5cdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kVmFsdWUpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgZml4ZWQgdmFsdWVcblx0XHRcdHRyZW5kVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFZhbHVlO1xuXHRcdH0gZWxzZSBpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRQYXRoKSB7XG5cdFx0XHQvLyBUcmVuZCBjb21lcyBmcm9tIGFub3RoZXIgcHJvcGVydHkgdmlhIGEgcGF0aFxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUoa3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0a3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQgfHxcblx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoXG5cdFx0KSB7XG5cdFx0XHQvLyBDYWxjdWxhdGVkIHRyZW5kXG5cdFx0XHRsZXQgdHJlbmRSZWZlcmVuY2VWYWx1ZTogbnVtYmVyO1xuXHRcdFx0aWYgKGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmVuZFJlZmVyZW5jZVZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQoXG5cdFx0XHRcdFx0a3BpQ29udGV4dC5nZXRQcm9wZXJ0eShrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCB8fCBcIlwiKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dHJlbmRWYWx1ZSA9IGRldmlhdGlvbkluZGljYXRvckZyb21DYWxjdWxhdGlvbihcblx0XHRcdFx0cmF3VmFsdWUsXG5cdFx0XHRcdHRyZW5kUmVmZXJlbmNlVmFsdWUsXG5cdFx0XHRcdCEha3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUsXG5cdFx0XHRcdGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdHJlbmRgLCB0cmVuZFZhbHVlKTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlVGFyZ2V0VmFsdWUoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwga3BpQ29udGV4dDogQ29udGV4dCwgb0tQSU1vZGVsOiBKU09OTW9kZWwpIHtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjsgLy8gTm8gdGFyZ2V0IHNldCBmb3IgdGhlIEtQSVxuXHRcdH1cblx0XHRjb25zdCByYXdWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGtwaUNvbnRleHQuZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoKSk7XG5cdFx0Y29uc3QgY3VycmVudExvY2FsZSA9IG5ldyBMb2NhbGUoc2FwLnVpLmdldENvcmUoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TGFuZ3VhZ2UoKSk7XG5cblx0XHRsZXQgdGFyZ2V0UmF3VmFsdWU6IG51bWJlcjtcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGFyZ2V0UmF3VmFsdWUgPSBrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRWYWx1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFyZ2V0UmF3VmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChrcGlDb250ZXh0LmdldFByb3BlcnR5KGtwaURlZmluaXRpb24uZGF0YXBvaW50LnRhcmdldFBhdGggfHwgXCJcIikpO1xuXHRcdH1cblx0XHRjb25zdCBkZXZpYXRpb25SYXdWYWx1ZSA9IHRhcmdldFJhd1ZhbHVlICE9PSAwID8gKChyYXdWYWx1ZSAtIHRhcmdldFJhd1ZhbHVlKSAvIHRhcmdldFJhd1ZhbHVlKSAqIDEwMCA6IHVuZGVmaW5lZDtcblxuXHRcdC8vIEZvcm1hdHRpbmdcblx0XHRjb25zdCB0YXJnZXRWYWx1ZSA9IE51bWJlckZvcm1hdC5nZXRGbG9hdEluc3RhbmNlKFxuXHRcdFx0e1xuXHRcdFx0XHRzdHlsZTogXCJzaG9ydFwiLFxuXHRcdFx0XHRtaW5GcmFjdGlvbkRpZ2l0czogMCxcblx0XHRcdFx0bWF4RnJhY3Rpb25EaWdpdHM6IDEsXG5cdFx0XHRcdHNob3dTY2FsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQodGFyZ2V0UmF3VmFsdWUpO1xuXHRcdGNvbnN0IHRhcmdldFNjYWxlID0gTnVtYmVyRm9ybWF0LmdldEZsb2F0SW5zdGFuY2UoXG5cdFx0XHR7XG5cdFx0XHRcdHN0eWxlOiBcInNob3J0XCIsXG5cdFx0XHRcdGRlY2ltYWxzOiAwLFxuXHRcdFx0XHRtYXhJbnRlZ2VyRGlnaXRzOiAwLFxuXHRcdFx0XHRzaG93U2NhbGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHRjdXJyZW50TG9jYWxlXG5cdFx0KS5mb3JtYXQodGFyZ2V0UmF3VmFsdWUpO1xuXG5cdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vdGFyZ2V0TnVtYmVyYCwgdGFyZ2V0VmFsdWUpO1xuXHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRgLCB0YXJnZXRTY2FsZSk7XG5cblx0XHRpZiAoZGV2aWF0aW9uUmF3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgZGV2aWF0aW9uVmFsdWUgPSBOdW1iZXJGb3JtYXQuZ2V0RmxvYXRJbnN0YW5jZShcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG1pbkZyYWN0aW9uRGlnaXRzOiAwLFxuXHRcdFx0XHRcdG1heEZyYWN0aW9uRGlnaXRzOiAxLFxuXHRcdFx0XHRcdHNob3dTY2FsZTogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0Y3VycmVudExvY2FsZVxuXHRcdFx0KS5mb3JtYXQoZGV2aWF0aW9uUmF3VmFsdWUpO1xuXHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vZGV2aWF0aW9uTnVtYmVyYCwgZGV2aWF0aW9uVmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9kZXZpYXRpb25OdW1iZXJgLCBcIk4vQVwiKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTG9hZHMgdGFnIGRhdGEgZm9yIGEgS1BJLCBhbmQgc3RvcmVzIGl0IGluIHRoZSBKU09OIEtQSSBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIGtwaURlZmluaXRpb24gVGhlIGRlZmluaXRpb24gb2YgdGhlIEtQSS5cblx0ICogQHBhcmFtIG9NYWluTW9kZWwgVGhlIG1vZGVsIHVzZWQgdG8gbG9hZCB0aGUgZGF0YS5cblx0ICogQHBhcmFtIG9LUElNb2RlbCBUaGUgSlNPTiBtb2RlbCB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZFxuXHQgKiBAcGFyYW0gbG9hZEZ1bGwgSWYgbm90IHRydWUsIGxvYWRzIG9ubHkgZGF0YSBmb3IgdGhlIEtQSSB0YWdcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gZGF0YSBpcyBsb2FkZWQuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgbG9hZEtQSVRhZ0RhdGEoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwgb01haW5Nb2RlbDogT0RhdGFNb2RlbCwgb0tQSU1vZGVsOiBKU09OTW9kZWwsIGxvYWRGdWxsPzogYm9vbGVhbik6IGFueSB7XG5cdFx0Ly8gSWYgbG9hZEZ1bGw9ZmFsc2UsIHRoZW4gd2UncmUganVzdCBsb2FkaW5nIGRhdGEgZm9yIHRoZSB0YWcgYW5kIHdlIHVzZSB0aGUgXCIkYXV0by5Mb25nUnVubmVyc1wiIGdyb3VwSURcblx0XHQvLyBJZiBsb2FkRnVsbD10cnVlLCB3ZSdyZSBsb2FkaW5nIGRhdGEgZm9yIHRoZSB3aG9sZSBLUEkgKHRhZyArIGNhcmQpIGFuZCB3ZSB1c2UgdGhlIGRlZmF1bHQgKFwiJGF1dG9cIikgZ3JvdXBJRFxuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IGxvYWRGdWxsXG5cdFx0XHQ/IG9NYWluTW9kZWwuYmluZExpc3QoYC8ke2twaURlZmluaXRpb24uZW50aXR5U2V0fWApXG5cdFx0XHQ6IG9NYWluTW9kZWwuYmluZExpc3QoYC8ke2twaURlZmluaXRpb24uZW50aXR5U2V0fWAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHsgJCRncm91cElkOiBcIiRhdXRvLkxvbmdSdW5uZXJzXCIgfSk7XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZTogUmVjb3JkPHN0cmluZywgeyB1bml0Pzogc3RyaW5nIH0+ID0ge307XG5cblx0XHQvLyBNYWluIHZhbHVlICsgY3VycmVuY3kvdW5pdFxuXHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0Py5pc1BhdGgpIHtcblx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQucHJvcGVydHlQYXRoXSA9IHsgdW5pdDoga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LnByb3BlcnR5UGF0aF0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBQcm9wZXJ0eSBmb3IgY3JpdGljYWxpdHlcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQuY3JpdGljYWxpdHlQYXRoKSB7XG5cdFx0XHRvQWdncmVnYXRlW2twaURlZmluaXRpb24uZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aF0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBQcm9wZXJ0aWVzIGZvciB0cmVuZCBhbmQgdHJlbmQgY2FsY3VsYXRpb25cblx0XHRpZiAobG9hZEZ1bGwpIHtcblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGgpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZFBhdGhdID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0ZVtrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aF0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC50YXJnZXRQYXRoKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGVba3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudGFyZ2V0UGF0aF0gPSB7fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRvTGlzdEJpbmRpbmcuc2V0QWdncmVnYXRpb24oeyBhZ2dyZWdhdGU6IG9BZ2dyZWdhdGUgfSk7XG5cblx0XHQvLyBNYW5hZ2UgU2VsZWN0aW9uVmFyaWFudCBmaWx0ZXJzXG5cdFx0aWYgKGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFGaWx0ZXJzID0ga3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMubWFwKGNyZWF0ZUZpbHRlckZyb21EZWZpbml0aW9uKS5maWx0ZXIoKGZpbHRlcikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZmlsdGVyICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR9KSBhcyBGaWx0ZXJbXTtcblx0XHRcdG9MaXN0QmluZGluZy5maWx0ZXIoYUZpbHRlcnMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvTGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIDEpLnRoZW4oKGFDb250ZXh0czogQ29udGV4dFtdKSA9PiB7XG5cdFx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCByYXdVbml0ID0ga3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdD8uaXNQYXRoXG5cdFx0XHRcdFx0PyBhQ29udGV4dHNbMF0uZ2V0UHJvcGVydHkoa3BpRGVmaW5pdGlvbi5kYXRhcG9pbnQudW5pdC52YWx1ZSlcblx0XHRcdFx0XHQ6IGtwaURlZmluaXRpb24uZGF0YXBvaW50LnVuaXQ/LnZhbHVlO1xuXG5cdFx0XHRcdGlmIChrcGlEZWZpbml0aW9uLmRhdGFwb2ludC51bml0ICYmICFyYXdVbml0KSB7XG5cdFx0XHRcdFx0Ly8gQSB1bml0L2N1cnJlbmN5IGlzIGRlZmluZWQsIGJ1dCBpdHMgdmFsdWUgaXMgdW5kZWZpbmVkIC0tPiBtdWx0aS11bml0IHNpdHVhdGlvblxuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZWAsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVVbnNjYWxlZGAsIFwiKlwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9tYWluVmFsdWVOb1NjYWxlYCwgXCIqXCIpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5WYWx1ZVNjYWxlYCwgXCJcIik7XG5cdFx0XHRcdFx0b0tQSU1vZGVsLnNldFByb3BlcnR5KGAvJHtrcGlEZWZpbml0aW9uLmlkfS9tYW5pZmVzdC9zYXAuY2FyZC9kYXRhL2pzb24vbWFpblVuaXRgLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5Dcml0aWNhbGl0eWAsIE1lc3NhZ2VUeXBlLk5vbmUpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL21haW5TdGF0ZWAsIFwiTm9uZVwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90cmVuZGAsIFwiTm9uZVwiKTtcblx0XHRcdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi90YXJnZXROdW1iZXJgLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL3RhcmdldFVuaXRgLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRcdG9LUElNb2RlbC5zZXRQcm9wZXJ0eShgLyR7a3BpRGVmaW5pdGlvbi5pZH0vbWFuaWZlc3Qvc2FwLmNhcmQvZGF0YS9qc29uL2RldmlhdGlvbk51bWJlcmAsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVEYXRhcG9pbnRWYWx1ZUFuZEN1cnJlbmN5KGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZURhdGFwb2ludENyaXRpY2FsaXR5KGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblxuXHRcdFx0XHRcdGlmIChsb2FkRnVsbCkge1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVEYXRhcG9pbnRUcmVuZChrcGlEZWZpbml0aW9uLCBhQ29udGV4dHNbMF0sIG9LUElNb2RlbCk7XG5cdFx0XHRcdFx0XHR0aGlzLnVwZGF0ZVRhcmdldFZhbHVlKGtwaURlZmluaXRpb24sIGFDb250ZXh0c1swXSwgb0tQSU1vZGVsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkcyBjYXJkIGRhdGEgZm9yIGEgS1BJLCBhbmQgc3RvcmVzIGl0IGluIHRoZSBKU09OIEtQSSBtb2RlbC5cblx0ICpcblx0ICogQHBhcmFtIGtwaURlZmluaXRpb24gVGhlIGRlZmluaXRpb24gb2YgdGhlIEtQSS5cblx0ICogQHBhcmFtIG9NYWluTW9kZWwgVGhlIG1vZGVsIHVzZWQgdG8gbG9hZCB0aGUgZGF0YS5cblx0ICogQHBhcmFtIG9LUElNb2RlbCBUaGUgSlNPTiBtb2RlbCB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBkYXRhIGlzIGxvYWRlZC5cblx0ICovXG5cdHByb3RlY3RlZCBsb2FkS1BJQ2FyZERhdGEoa3BpRGVmaW5pdGlvbjogS1BJRGVmaW5pdGlvbiwgb01haW5Nb2RlbDogT0RhdGFNb2RlbCwgb0tQSU1vZGVsOiBKU09OTW9kZWwpOiBhbnkge1xuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9NYWluTW9kZWwuYmluZExpc3QoYC8ke2twaURlZmluaXRpb24uZW50aXR5U2V0fWApO1xuXHRcdGNvbnN0IG9Hcm91cDogUmVjb3JkPHN0cmluZywgT2JqZWN0PiA9IHt9O1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGU6IFJlY29yZDxzdHJpbmcsIE9iamVjdD4gPSB7fTtcblxuXHRcdGtwaURlZmluaXRpb24uY2hhcnQuZGltZW5zaW9ucy5mb3JFYWNoKChkaW1lbnNpb24pID0+IHtcblx0XHRcdG9Hcm91cFtkaW1lbnNpb24ubmFtZV0gPSB7fTtcblx0XHR9KTtcblx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0Lm1lYXN1cmVzLmZvckVhY2goKG1lYXN1cmUpID0+IHtcblx0XHRcdG9BZ2dyZWdhdGVbbWVhc3VyZS5uYW1lXSA9IHt9O1xuXHRcdH0pO1xuXHRcdG9MaXN0QmluZGluZy5zZXRBZ2dyZWdhdGlvbih7XG5cdFx0XHRncm91cDogb0dyb3VwLFxuXHRcdFx0YWdncmVnYXRlOiBvQWdncmVnYXRlXG5cdFx0fSk7XG5cblx0XHQvLyBNYW5hZ2UgU2VsZWN0aW9uVmFyaWFudCBmaWx0ZXJzXG5cdFx0aWYgKGtwaURlZmluaXRpb24uc2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zPy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFGaWx0ZXJzID0ga3BpRGVmaW5pdGlvbi5zZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMubWFwKGNyZWF0ZUZpbHRlckZyb21EZWZpbml0aW9uKS5maWx0ZXIoKGZpbHRlcikgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZmlsdGVyICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR9KSBhcyBGaWx0ZXJbXTtcblx0XHRcdG9MaXN0QmluZGluZy5maWx0ZXIoYUZpbHRlcnMpO1xuXHRcdH1cblxuXHRcdC8vIFNvcnRpbmdcblx0XHRpZiAoa3BpRGVmaW5pdGlvbi5jaGFydC5zb3J0T3JkZXIpIHtcblx0XHRcdG9MaXN0QmluZGluZy5zb3J0KFxuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LnNvcnRPcmRlci5tYXAoKHNvcnRJbmZvKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBTb3J0ZXIoc29ydEluZm8ubmFtZSwgc29ydEluZm8uZGVzY2VuZGluZyk7XG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvTGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKDAsIGtwaURlZmluaXRpb24uY2hhcnQubWF4SXRlbXMpLnRoZW4oKGFDb250ZXh0czogQ29udGV4dFtdKSA9PiB7XG5cdFx0XHRjb25zdCBjaGFydERhdGEgPSBhQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBvRGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRcdFx0XHRrcGlEZWZpbml0aW9uLmNoYXJ0LmRpbWVuc2lvbnMuZm9yRWFjaCgoZGltZW5zaW9uKSA9PiB7XG5cdFx0XHRcdFx0b0RhdGFbZGltZW5zaW9uLm5hbWVdID0gb0NvbnRleHQuZ2V0UHJvcGVydHkoZGltZW5zaW9uLm5hbWUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0a3BpRGVmaW5pdGlvbi5jaGFydC5tZWFzdXJlcy5mb3JFYWNoKChtZWFzdXJlKSA9PiB7XG5cdFx0XHRcdFx0b0RhdGFbbWVhc3VyZS5uYW1lXSA9IG9Db250ZXh0LmdldFByb3BlcnR5KG1lYXN1cmUubmFtZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBvRGF0YTtcblx0XHRcdH0pO1xuXG5cdFx0XHRvS1BJTW9kZWwuc2V0UHJvcGVydHkoYC8ke2twaURlZmluaXRpb24uaWR9L21hbmlmZXN0L3NhcC5jYXJkL2RhdGEvanNvbi9jaGFydERhdGFgLCBjaGFydERhdGEpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBvcG92ZXIgdG8gZGlzcGxheSB0aGUgS1BJIGNhcmRcblx0ICogVGhlIHBvcG92ZXIgYW5kIHRoZSBjb250YWluZWQgY2FyZCBmb3IgdGhlIEtQSXMgYXJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LlxuXHQgKiBUaGUgcG9wb3ZlciBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgS1BJcywgc28gaXQncyBjcmVhdGVkIG9ubHkgb25jZS5cblx0ICpcblx0ICogQHBhcmFtIG9LUElUYWcgVGhlIHRhZyB0aGF0IHRyaWdnZXJlZCB0aGUgcG9wb3ZlciBvcGVuaW5nLlxuXHQgKiBAcmV0dXJucyBUaGUgc2hhcmVkIHBvcG92ZXIgYXMgYSBwcm9taXNlLlxuXHQgKi9cblx0cHJvdGVjdGVkIGdldFBvcG92ZXIob0tQSVRhZzogR2VuZXJpY1RhZyk6IFByb21pc2U8UG9wb3Zlcj4ge1xuXHRcdGlmICghdGhpcy5vUG9wb3Zlcikge1xuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0Q29yZS5sb2FkTGlicmFyeShcInNhcC91aS9pbnRlZ3JhdGlvblwiLCB7IGFzeW5jOiB0cnVlIH0pXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL3VpL2ludGVncmF0aW9uL3dpZGdldHMvQ2FyZFwiLCBcInNhcC91aS9pbnRlZ3JhdGlvbi9Ib3N0XCJdLCAoQ2FyZDogYW55LCBIb3N0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0hvc3QgPSBuZXcgSG9zdCgpO1xuXG5cdFx0XHRcdFx0XHRcdG9Ib3N0LmF0dGFjaEFjdGlvbigob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzVHlwZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ0eXBlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicGFyYW1ldGVyc1wiKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChzVHlwZSA9PT0gXCJOYXZpZ2F0aW9uXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUGFyYW1zLnNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9QYXJhbXMuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1BhcmFtcy5hY3Rpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlT3V0Ym91bmQob1BhcmFtcy5vdXRib3VuZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLm9DYXJkID0gbmV3IENhcmQoe1xuXHRcdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjI1cmVtXCIsXG5cdFx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcImF1dG9cIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0dGhpcy5vQ2FyZC5zZXRIb3N0KG9Ib3N0KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLm9Qb3BvdmVyID0gbmV3IFBvcG92ZXIoXCJrcGktUG9wb3ZlclwiLCB7XG5cdFx0XHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGxhY2VtZW50OiBcIkF1dG9cIixcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiBbdGhpcy5vQ2FyZF1cblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0b0tQSVRhZy5hZGREZXBlbmRlbnQodGhpcy5vUG9wb3Zlcik7IC8vIFRoZSBmaXJzdCBjbGlja2VkIHRhZyBnZXRzIHRoZSBwb3BvdmVyIGFzIGRlcGVuZGVudFxuXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUodGhpcy5vUG9wb3Zlcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMub1BvcG92ZXIpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRwdWJsaWMgb25LUElQcmVzc2VkKG9LUElUYWc6IGFueSwga3BpSUQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG9LUElNb2RlbCA9IG9LUElUYWcuZ2V0TW9kZWwoXCJrcGlNb2RlbFwiKSBhcyBKU09OTW9kZWw7XG5cblx0XHRpZiAodGhpcy5hS1BJRGVmaW5pdGlvbnMgJiYgdGhpcy5hS1BJRGVmaW5pdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBrcGlEZWZpbml0aW9uID0gdGhpcy5hS1BJRGVmaW5pdGlvbnMuZmluZChmdW5jdGlvbiAob0RlZikge1xuXHRcdFx0XHRyZXR1cm4gb0RlZi5pZCA9PT0ga3BpSUQ7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGtwaURlZmluaXRpb24pIHtcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0tQSVRhZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBhUHJvbWlzZXMgPSBbXG5cdFx0XHRcdFx0dGhpcy5sb2FkS1BJVGFnRGF0YShrcGlEZWZpbml0aW9uLCBvTW9kZWwsIG9LUElNb2RlbCwgdHJ1ZSksXG5cdFx0XHRcdFx0dGhpcy5sb2FkS1BJQ2FyZERhdGEoa3BpRGVmaW5pdGlvbiwgb01vZGVsLCBvS1BJTW9kZWwpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0UG9wb3ZlcihvS1BJVGFnKVxuXHRcdFx0XHRdO1xuXG5cdFx0XHRcdFByb21pc2UuYWxsKGFQcm9taXNlcylcblx0XHRcdFx0XHQudGhlbigoYVJlc3VsdHMpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMub0NhcmQuc2V0TWFuaWZlc3Qob0tQSU1vZGVsLmdldFByb3BlcnR5KGAvJHtrcGlJRH0vbWFuaWZlc3RgKSk7XG5cdFx0XHRcdFx0XHR0aGlzLm9DYXJkLnJlZnJlc2goKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb1BvcG92ZXIgPSBhUmVzdWx0c1syXTtcblx0XHRcdFx0XHRcdG9Qb3BvdmVyLm9wZW5CeShvS1BJVGFnLCBmYWxzZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEtQSU1hbmFnZW1lbnRDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7RUFxQkEsSUFBTUEsMEJBQXVELEdBQUc7SUFDL0QsR0FBRyxFQUFFQyxXQUFXLENBQUNDLEtBQUs7SUFDdEIsR0FBRyxFQUFFRCxXQUFXLENBQUNFLE9BQU87SUFDeEIsR0FBRyxFQUFFRixXQUFXLENBQUNHLE9BQU87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
|