@sapui5/sap.fe.core 1.98.0 → 1.101.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -5
- package/src/sap/fe/core/.library +2 -3
- package/src/sap/fe/core/AnnotationHelper.js +328 -405
- package/src/sap/fe/core/AnnotationHelper.ts +321 -0
- package/src/sap/fe/core/AppComponent.js +382 -399
- package/src/sap/fe/core/AppComponent.ts +397 -0
- package/src/sap/fe/core/AppStateHandler.js +198 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +83 -58
- package/src/sap/fe/core/BaseController.ts +67 -0
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2221 -2399
- package/src/sap/fe/core/CommonUtils.ts +2248 -0
- package/src/sap/fe/core/ExtensionAPI.js +280 -274
- package/src/sap/fe/core/ExtensionAPI.ts +242 -0
- package/src/sap/fe/core/PageController.js +219 -131
- package/src/sap/fe/core/PageController.ts +129 -0
- package/src/sap/fe/core/RouterProxy.js +936 -823
- package/src/sap/fe/core/RouterProxy.ts +854 -0
- package/src/sap/fe/core/Synchronization.js +41 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +248 -164
- package/src/sap/fe/core/TemplateComponent.ts +161 -0
- package/src/sap/fe/core/TemplateModel.js +77 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1575 -1664
- package/src/sap/fe/core/TransactionHelper.ts +1736 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +406 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +362 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +146 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +129 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +264 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +246 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +100 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +663 -608
- package/src/sap/fe/core/actions/draft.ts +669 -0
- package/src/sap/fe/core/actions/messageHandling.js +576 -514
- package/src/sap/fe/core/actions/messageHandling.ts +562 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1093 -1215
- package/src/sap/fe/core/actions/operations.ts +1193 -0
- package/src/sap/fe/core/actions/sticky.js +114 -104
- package/src/sap/fe/core/actions/sticky.ts +119 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +60 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +37 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +165 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +178 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +707 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +628 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +436 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +431 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1855 -1827
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1792 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +60 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +717 -512
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +785 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -815
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +810 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1057 -1004
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1001 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +498 -533
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +36 -32
- package/src/sap/fe/core/controllerextensions/MassEdit.js +142 -77
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +155 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +222 -236
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +215 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +312 -345
- package/src/sap/fe/core/controllerextensions/PageReady.ts +63 -55
- package/src/sap/fe/core/controllerextensions/Paginator.js +189 -175
- package/src/sap/fe/core/controllerextensions/Paginator.ts +169 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -149
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +149 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +145 -121
- package/src/sap/fe/core/controllerextensions/Routing.ts +131 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +231 -268
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +603 -644
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +79 -79
- package/src/sap/fe/core/controllerextensions/ViewState.js +775 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +796 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/Any.js +28 -0
- package/src/sap/fe/core/controls/Any.ts +30 -0
- package/src/sap/fe/core/controls/CommandExecution.js +93 -68
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +166 -79
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +74 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +366 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +278 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +168 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +116 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +44 -5
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +164 -122
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +155 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +213 -153
- package/src/sap/fe/core/controls/FieldWrapper.ts +104 -0
- package/src/sap/fe/core/controls/FileWrapper.js +313 -0
- package/src/sap/fe/core/controls/FileWrapper.ts +169 -0
- package/src/sap/fe/core/controls/FilterBar.js +198 -159
- package/src/sap/fe/core/controls/FilterBar.ts +148 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +101 -39
- package/src/sap/fe/core/controls/FormElementWrapper.ts +37 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +148 -115
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +102 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +301 -265
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +252 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +186 -140
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +37 -42
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +76 -74
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +71 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -379
- package/src/sap/fe/core/converters/ConverterContext.ts +23 -19
- package/src/sap/fe/core/converters/ManifestSettings.js +13 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -2
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -365
- package/src/sap/fe/core/converters/ManifestWrapper.ts +19 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +16 -11
- package/src/sap/fe/core/converters/MetaModelConverter.ts +21 -18
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
- package/src/sap/fe/core/converters/annotations/DataField.js +26 -13
- package/src/sap/fe/core/converters/annotations/DataField.ts +40 -17
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
- package/src/sap/fe/core/converters/controls/Common/Action.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/Action.ts +22 -21
- package/src/sap/fe/core/converters/controls/Common/Chart.js +12 -10
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -14
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +9 -7
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -5
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +562 -218
- package/src/sap/fe/core/converters/controls/Common/Table.ts +670 -320
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +218 -94
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +265 -159
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +495 -77
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +535 -130
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +20 -18
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +10 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +13 -16
- package/src/sap/fe/core/converters/helpers/Aggregation.js +117 -127
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +0 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +54 -30
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +69 -43
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +52 -28
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +111 -74
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +11 -9
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +8 -8
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -98
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -12
- package/src/sap/fe/core/formatters/KPIFormatter.ts +4 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
- package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +4 -4
- package/src/sap/fe/core/formatters/ValueFormatter.ts +5 -7
- package/src/sap/fe/core/fpm/Component.js +81 -55
- package/src/sap/fe/core/fpm/Component.ts +43 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +324 -310
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +370 -341
- package/src/sap/fe/core/helpers/BindingExpression.js +319 -360
- package/src/sap/fe/core/helpers/BindingExpression.ts +323 -397
- package/src/sap/fe/core/helpers/ClassSupport.js +321 -168
- package/src/sap/fe/core/helpers/ClassSupport.ts +362 -158
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
- package/src/sap/fe/core/helpers/MassEditHelper.js +736 -676
- package/src/sap/fe/core/helpers/MassEditHelper.ts +803 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +281 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +273 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +197 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +336 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -10
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -10
- package/src/sap/fe/core/jsx-runtime/jsx.js +35 -5
- package/src/sap/fe/core/jsx-runtime/jsx.ts +23 -9
- package/src/sap/fe/core/library.js +426 -451
- package/src/sap/fe/core/library.support.js +23 -33
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +5 -5
- package/src/sap/fe/core/messagebundle.properties +63 -18
- package/src/sap/fe/core/messagebundle_ar.properties +37 -6
- package/src/sap/fe/core/messagebundle_bg.properties +37 -6
- package/src/sap/fe/core/messagebundle_ca.properties +37 -6
- package/src/sap/fe/core/messagebundle_cs.properties +38 -7
- package/src/sap/fe/core/messagebundle_cy.properties +37 -6
- package/src/sap/fe/core/messagebundle_da.properties +37 -6
- package/src/sap/fe/core/messagebundle_de.properties +37 -6
- package/src/sap/fe/core/messagebundle_el.properties +37 -6
- package/src/sap/fe/core/messagebundle_en.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_GB.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -6
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +37 -6
- package/src/sap/fe/core/messagebundle_es.properties +37 -6
- package/src/sap/fe/core/messagebundle_es_MX.properties +37 -6
- package/src/sap/fe/core/messagebundle_et.properties +37 -6
- package/src/sap/fe/core/messagebundle_fi.properties +38 -7
- package/src/sap/fe/core/messagebundle_fr.properties +43 -12
- package/src/sap/fe/core/messagebundle_fr_CA.properties +45 -14
- package/src/sap/fe/core/messagebundle_hi.properties +43 -12
- package/src/sap/fe/core/messagebundle_hr.properties +43 -12
- package/src/sap/fe/core/messagebundle_hu.properties +37 -6
- package/src/sap/fe/core/messagebundle_id.properties +38 -7
- package/src/sap/fe/core/messagebundle_it.properties +37 -6
- package/src/sap/fe/core/messagebundle_iw.properties +37 -6
- package/src/sap/fe/core/messagebundle_ja.properties +36 -5
- package/src/sap/fe/core/messagebundle_kk.properties +43 -12
- package/src/sap/fe/core/messagebundle_ko.properties +37 -6
- package/src/sap/fe/core/messagebundle_lt.properties +37 -6
- package/src/sap/fe/core/messagebundle_lv.properties +44 -13
- package/src/sap/fe/core/messagebundle_ms.properties +42 -11
- package/src/sap/fe/core/messagebundle_nl.properties +37 -6
- package/src/sap/fe/core/messagebundle_no.properties +37 -6
- package/src/sap/fe/core/messagebundle_pl.properties +37 -6
- package/src/sap/fe/core/messagebundle_pt.properties +38 -7
- package/src/sap/fe/core/messagebundle_pt_PT.properties +37 -6
- package/src/sap/fe/core/messagebundle_ro.properties +37 -6
- package/src/sap/fe/core/messagebundle_ru.properties +37 -6
- package/src/sap/fe/core/messagebundle_sh.properties +39 -8
- package/src/sap/fe/core/messagebundle_sk.properties +37 -6
- package/src/sap/fe/core/messagebundle_sl.properties +43 -12
- package/src/sap/fe/core/messagebundle_sv.properties +38 -7
- package/src/sap/fe/core/messagebundle_th.properties +36 -5
- package/src/sap/fe/core/messagebundle_tr.properties +39 -8
- package/src/sap/fe/core/messagebundle_uk.properties +37 -6
- package/src/sap/fe/core/messagebundle_vi.properties +37 -6
- package/src/sap/fe/core/messagebundle_zh_CN.properties +37 -6
- package/src/sap/fe/core/messagebundle_zh_TW.properties +43 -12
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +47 -73
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +211 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +70 -96
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -8
- package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +963 -899
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +907 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +694 -741
- package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -40
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +572 -643
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +67 -96
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -487
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +449 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +48 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +11 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -4
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/templating/DataModelPathHelper.js +91 -90
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +126 -123
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +23 -3
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +26 -5
- package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +138 -79
- package/src/sap/fe/core/templating/FilterHelper.ts +148 -79
- package/src/sap/fe/core/templating/PropertyHelper.js +16 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +31 -24
- package/src/sap/fe/core/templating/UIFormatters.js +179 -43
- package/src/sap/fe/core/templating/UIFormatters.ts +190 -61
- package/src/sap/fe/core/type/Email.js +26 -8
- package/src/sap/fe/core/type/Email.ts +10 -11
- package/ui5.yaml +0 -3
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +0 -74
|
@@ -2,43 +2,48 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["
|
|
5
|
+
sap.ui.define(["sap/fe/core/converters/annotations/DataField", "sap/fe/core/converters/controls/Common/Action", "sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/converters/helpers/Key", "sap/fe/core/formatters/TableFormatter", "sap/fe/core/formatters/TableFormatterTypes", "sap/fe/core/helpers/BindingExpression", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templating/EntitySetHelper", "sap/fe/core/templating/PropertyHelper", "../../helpers/Aggregation", "../../helpers/ID", "../../ManifestSettings", "./Criticality", "./table/StandardActions"], function (DataField, Action, BindingHelper, ConfigurableObject, IssueManager, Key, tableFormatters, TableFormatterTypes, BindingExpression, StableIdHelper, DataModelPathHelper, DisplayModeFormatter, EntitySetHelper, PropertyHelper, Aggregation, ID, ManifestSettings, Criticality, StandardActions) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
|
-
var
|
|
9
|
+
var isInDisplayMode = StandardActions.isInDisplayMode;
|
|
10
10
|
var isDraftOrStickySupported = StandardActions.isDraftOrStickySupported;
|
|
11
|
-
var getStandardActionMassEdit = StandardActions.getStandardActionMassEdit;
|
|
12
11
|
var getStandardActionPaste = StandardActions.getStandardActionPaste;
|
|
12
|
+
var getStandardActionMassEdit = StandardActions.getStandardActionMassEdit;
|
|
13
13
|
var getStandardActionDelete = StandardActions.getStandardActionDelete;
|
|
14
14
|
var getStandardActionCreate = StandardActions.getStandardActionCreate;
|
|
15
|
+
var getRestrictions = StandardActions.getRestrictions;
|
|
16
|
+
var getMassEditVisibility = StandardActions.getMassEditVisibility;
|
|
17
|
+
var getInsertUpdateActionsTemplating = StandardActions.getInsertUpdateActionsTemplating;
|
|
15
18
|
var getDeleteVisibility = StandardActions.getDeleteVisibility;
|
|
16
|
-
var
|
|
19
|
+
var getCreationRow = StandardActions.getCreationRow;
|
|
20
|
+
var getCreateVisibility = StandardActions.getCreateVisibility;
|
|
17
21
|
var generateStandardActionsContext = StandardActions.generateStandardActionsContext;
|
|
18
|
-
var getNonSortablePropertiesRestrictions = EntitySetHelper.getNonSortablePropertiesRestrictions;
|
|
19
22
|
var getMessageTypeFromCriticalityType = Criticality.getMessageTypeFromCriticalityType;
|
|
20
|
-
var
|
|
21
|
-
var
|
|
23
|
+
var VisualizationType = ManifestSettings.VisualizationType;
|
|
24
|
+
var VariantManagementType = ManifestSettings.VariantManagementType;
|
|
25
|
+
var TemplateType = ManifestSettings.TemplateType;
|
|
26
|
+
var SelectionMode = ManifestSettings.SelectionMode;
|
|
27
|
+
var Importance = ManifestSettings.Importance;
|
|
28
|
+
var HorizontalAlign = ManifestSettings.HorizontalAlign;
|
|
29
|
+
var CreationMode = ManifestSettings.CreationMode;
|
|
30
|
+
var AvailabilityType = ManifestSettings.AvailabilityType;
|
|
31
|
+
var ActionType = ManifestSettings.ActionType;
|
|
32
|
+
var TableID = ID.TableID;
|
|
22
33
|
var AggregationHelper = Aggregation.AggregationHelper;
|
|
23
|
-
var
|
|
34
|
+
var isProperty = PropertyHelper.isProperty;
|
|
24
35
|
var isPathExpression = PropertyHelper.isPathExpression;
|
|
25
|
-
var
|
|
36
|
+
var getTargetValueOnDataPoint = PropertyHelper.getTargetValueOnDataPoint;
|
|
26
37
|
var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
var
|
|
30
|
-
var
|
|
31
|
-
var IssueCategory = IssueManager.IssueCategory;
|
|
32
|
-
var replaceSpecialChars = StableIdHelper.replaceSpecialChars;
|
|
38
|
+
var getAssociatedCurrencyProperty = PropertyHelper.getAssociatedCurrencyProperty;
|
|
39
|
+
var getNonSortablePropertiesRestrictions = EntitySetHelper.getNonSortablePropertiesRestrictions;
|
|
40
|
+
var getDisplayMode = DisplayModeFormatter.getDisplayMode;
|
|
41
|
+
var EDM_TYPE_MAPPING = DisplayModeFormatter.EDM_TYPE_MAPPING;
|
|
33
42
|
var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
|
|
34
43
|
var isPathSearchable = DataModelPathHelper.isPathSearchable;
|
|
35
44
|
var isPathDeletable = DataModelPathHelper.isPathDeletable;
|
|
36
45
|
var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
|
|
37
|
-
var
|
|
38
|
-
var KeyHelper = Key.KeyHelper;
|
|
39
|
-
var UI = BindingHelper.UI;
|
|
40
|
-
var bindingContextPathVisitor = BindingHelper.bindingContextPathVisitor;
|
|
41
|
-
var Draft = BindingHelper.Draft;
|
|
46
|
+
var replaceSpecialChars = StableIdHelper.replaceSpecialChars;
|
|
42
47
|
var resolveBindingString = BindingExpression.resolveBindingString;
|
|
43
48
|
var or = BindingExpression.or;
|
|
44
49
|
var not = BindingExpression.not;
|
|
@@ -51,6 +56,20 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
51
56
|
var bindingExpression = BindingExpression.bindingExpression;
|
|
52
57
|
var annotationExpression = BindingExpression.annotationExpression;
|
|
53
58
|
var and = BindingExpression.and;
|
|
59
|
+
var MessageType = TableFormatterTypes.MessageType;
|
|
60
|
+
var KeyHelper = Key.KeyHelper;
|
|
61
|
+
var IssueType = IssueManager.IssueType;
|
|
62
|
+
var IssueSeverity = IssueManager.IssueSeverity;
|
|
63
|
+
var IssueCategoryType = IssueManager.IssueCategoryType;
|
|
64
|
+
var IssueCategory = IssueManager.IssueCategory;
|
|
65
|
+
var Placement = ConfigurableObject.Placement;
|
|
66
|
+
var insertCustomElements = ConfigurableObject.insertCustomElements;
|
|
67
|
+
var UI = BindingHelper.UI;
|
|
68
|
+
var Entity = BindingHelper.Entity;
|
|
69
|
+
var bindingContextPathVisitor = BindingHelper.bindingContextPathVisitor;
|
|
70
|
+
var removeDuplicateActions = Action.removeDuplicateActions;
|
|
71
|
+
var isActionNavigable = Action.isActionNavigable;
|
|
72
|
+
var getActionsFromManifest = Action.getActionsFromManifest;
|
|
54
73
|
var isDataFieldTypes = DataField.isDataFieldTypes;
|
|
55
74
|
var isDataFieldForActionAbstract = DataField.isDataFieldForActionAbstract;
|
|
56
75
|
var isDataFieldAlwaysHidden = DataField.isDataFieldAlwaysHidden;
|
|
@@ -58,20 +77,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
58
77
|
var getDataFieldDataType = DataField.getDataFieldDataType;
|
|
59
78
|
var collectRelatedPropertiesRecursively = DataField.collectRelatedPropertiesRecursively;
|
|
60
79
|
var collectRelatedProperties = DataField.collectRelatedProperties;
|
|
61
|
-
var Placement = ConfigurableObject.Placement;
|
|
62
|
-
var insertCustomElements = ConfigurableObject.insertCustomElements;
|
|
63
|
-
var removeDuplicateActions = Action.removeDuplicateActions;
|
|
64
|
-
var isActionNavigable = Action.isActionNavigable;
|
|
65
|
-
var getActionsFromManifest = Action.getActionsFromManifest;
|
|
66
|
-
var TableID = ID.TableID;
|
|
67
|
-
var VisualizationType = ManifestSettings.VisualizationType;
|
|
68
|
-
var VariantManagementType = ManifestSettings.VariantManagementType;
|
|
69
|
-
var TemplateType = ManifestSettings.TemplateType;
|
|
70
|
-
var SelectionMode = ManifestSettings.SelectionMode;
|
|
71
|
-
var HorizontalAlign = ManifestSettings.HorizontalAlign;
|
|
72
|
-
var CreationMode = ManifestSettings.CreationMode;
|
|
73
|
-
var AvailabilityType = ManifestSettings.AvailabilityType;
|
|
74
|
-
var ActionType = ManifestSettings.ActionType;
|
|
75
80
|
|
|
76
81
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
77
82
|
|
|
@@ -81,6 +86,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
81
86
|
|
|
82
87
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
83
88
|
|
|
89
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
90
|
+
|
|
84
91
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
85
92
|
|
|
86
93
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
@@ -147,6 +154,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
147
154
|
var manifestColumns = getColumnsFromManifest(converterContext.getManifestControlConfiguration(visualizationPath).columns, annotationColumns, converterContext, converterContext.getAnnotationEntityType(lineItemAnnotation), navigationSettings);
|
|
148
155
|
return insertCustomElements(annotationColumns, manifestColumns, {
|
|
149
156
|
width: "overwrite",
|
|
157
|
+
importance: "overwrite",
|
|
150
158
|
isNavigable: "overwrite",
|
|
151
159
|
availability: "overwrite",
|
|
152
160
|
settings: "overwrite",
|
|
@@ -320,17 +328,25 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
320
328
|
});
|
|
321
329
|
|
|
322
330
|
if (oProperty) {
|
|
323
|
-
var
|
|
331
|
+
var _oProperty$annotation5;
|
|
324
332
|
|
|
325
|
-
var
|
|
333
|
+
var oUnit = getAssociatedCurrencyProperty(oProperty) || getAssociatedUnitProperty(oProperty);
|
|
326
334
|
|
|
327
|
-
if (
|
|
328
|
-
var oUnitColumn = findColumnByPath(
|
|
335
|
+
if (oUnit) {
|
|
336
|
+
var oUnitColumn = findColumnByPath(oUnit.name);
|
|
329
337
|
oTableColumn.unit = oUnitColumn === null || oUnitColumn === void 0 ? void 0 : oUnitColumn.name;
|
|
338
|
+
} else {
|
|
339
|
+
var _oProperty$annotation, _oProperty$annotation2, _oProperty$annotation3, _oProperty$annotation4;
|
|
340
|
+
|
|
341
|
+
var sUnit = (oProperty === null || oProperty === void 0 ? void 0 : (_oProperty$annotation = oProperty.annotations) === null || _oProperty$annotation === void 0 ? void 0 : (_oProperty$annotation2 = _oProperty$annotation.Measures) === null || _oProperty$annotation2 === void 0 ? void 0 : _oProperty$annotation2.ISOCurrency) || (oProperty === null || oProperty === void 0 ? void 0 : (_oProperty$annotation3 = oProperty.annotations) === null || _oProperty$annotation3 === void 0 ? void 0 : (_oProperty$annotation4 = _oProperty$annotation3.Measures) === null || _oProperty$annotation4 === void 0 ? void 0 : _oProperty$annotation4.Unit);
|
|
342
|
+
|
|
343
|
+
if (sUnit) {
|
|
344
|
+
oTableColumn.unitText = "".concat(sUnit);
|
|
345
|
+
}
|
|
330
346
|
}
|
|
331
347
|
|
|
332
348
|
var displayMode = getDisplayMode(oProperty),
|
|
333
|
-
textAnnotation = (_oProperty$
|
|
349
|
+
textAnnotation = (_oProperty$annotation5 = oProperty.annotations.Common) === null || _oProperty$annotation5 === void 0 ? void 0 : _oProperty$annotation5.Text;
|
|
334
350
|
|
|
335
351
|
if (isPathExpression(textAnnotation) && displayMode !== "Value") {
|
|
336
352
|
var oTextColumn = findColumnByPath(textAnnotation.path);
|
|
@@ -365,7 +381,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
365
381
|
control: tableManifestConfig,
|
|
366
382
|
actions: removeDuplicateActions(getTableActions(lineItemAnnotation, visualizationPath, converterContext, navigationSettings)),
|
|
367
383
|
columns: columns,
|
|
368
|
-
enableDataStateFilter: converterContext.getTemplateType() === "ObjectPage",
|
|
369
384
|
operationAvailableMap: JSON.stringify(operationAvailableMap),
|
|
370
385
|
operationAvailableProperties: getOperationAvailableProperties(operationAvailableMap, converterContext)
|
|
371
386
|
};
|
|
@@ -386,7 +401,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
386
401
|
control: tableManifestConfig,
|
|
387
402
|
actions: [],
|
|
388
403
|
columns: columns,
|
|
389
|
-
enableDataStateFilter: converterContext.getTemplateType() === "ObjectPage",
|
|
390
404
|
operationAvailableMap: JSON.stringify(operationAvailableMap),
|
|
391
405
|
operationAvailableProperties: getOperationAvailableProperties(operationAvailableMap, converterContext)
|
|
392
406
|
};
|
|
@@ -448,6 +462,24 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
448
462
|
|
|
449
463
|
return operationAvailableMap;
|
|
450
464
|
}
|
|
465
|
+
/**
|
|
466
|
+
* Gets updatable propertyPath for the current entityset if valid.
|
|
467
|
+
*
|
|
468
|
+
* @param converterContext The instance of the converter context
|
|
469
|
+
* @returns {string} The updatable property for the rows
|
|
470
|
+
*/
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
function getCurrentEntitySetUpdatablePath(converterContext) {
|
|
474
|
+
var _entitySet$annotation, _entitySet$annotation2, _entitySet$annotation3;
|
|
475
|
+
|
|
476
|
+
var restrictions = getRestrictions(converterContext);
|
|
477
|
+
var entitySet = converterContext.getEntitySet();
|
|
478
|
+
var updatable = restrictions.isUpdatable;
|
|
479
|
+
var isOnlyDynamicOnCurrentEntity = !isConstant(updatable.expression) && updatable.navigationExpression._type === "Unresolvable";
|
|
480
|
+
var updatablePropertyPath = entitySet === null || entitySet === void 0 ? void 0 : (_entitySet$annotation = entitySet.annotations.Capabilities) === null || _entitySet$annotation === void 0 ? void 0 : (_entitySet$annotation2 = _entitySet$annotation.UpdateRestrictions) === null || _entitySet$annotation2 === void 0 ? void 0 : (_entitySet$annotation3 = _entitySet$annotation2.Updatable) === null || _entitySet$annotation3 === void 0 ? void 0 : _entitySet$annotation3.path;
|
|
481
|
+
return isOnlyDynamicOnCurrentEntity ? updatablePropertyPath : "";
|
|
482
|
+
}
|
|
451
483
|
/**
|
|
452
484
|
* Method to retrieve all property paths assigned to the Core.OperationAvailable annotation.
|
|
453
485
|
*
|
|
@@ -670,9 +702,11 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
670
702
|
|
|
671
703
|
_exports.getCapabilityRestriction = getCapabilityRestriction;
|
|
672
704
|
|
|
673
|
-
function getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, isEntitySet, targetCapabilities,
|
|
705
|
+
function getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, isEntitySet, targetCapabilities, deleteButtonVisibilityExpression) {
|
|
674
706
|
var _tableManifestSetting;
|
|
675
707
|
|
|
708
|
+
var massEditVisibilityExpression = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : constant(false);
|
|
709
|
+
|
|
676
710
|
if (!lineItemAnnotation) {
|
|
677
711
|
return SelectionMode.None;
|
|
678
712
|
}
|
|
@@ -685,18 +719,32 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
685
719
|
var isParentDeletable, parentEntitySetDeletable;
|
|
686
720
|
|
|
687
721
|
if (converterContext.getTemplateType() === TemplateType.ObjectPage) {
|
|
688
|
-
isParentDeletable = isPathDeletable(converterContext.getDataModelObjectPath()
|
|
722
|
+
isParentDeletable = isPathDeletable(converterContext.getDataModelObjectPath());
|
|
689
723
|
parentEntitySetDeletable = isParentDeletable ? compileBinding(isParentDeletable, true) : isParentDeletable;
|
|
690
724
|
}
|
|
691
725
|
|
|
692
|
-
|
|
693
|
-
|
|
726
|
+
var bMassEditEnabled = !isConstant(massEditVisibilityExpression) || massEditVisibilityExpression.value !== false;
|
|
727
|
+
|
|
728
|
+
if (selectionMode && selectionMode === SelectionMode.None && deleteButtonVisibilityExpression) {
|
|
729
|
+
if (converterContext.getTemplateType() === TemplateType.ObjectPage && bMassEditEnabled) {
|
|
730
|
+
// Mass Edit in OP is enabled only in edit mode.
|
|
731
|
+
return compileBinding(ifElse(and(UI.IsEditable, massEditVisibilityExpression), constant("Multi"), ifElse(deleteButtonVisibilityExpression, constant("Multi"), constant("None"))));
|
|
732
|
+
} else if (bMassEditEnabled) {
|
|
733
|
+
return SelectionMode.Multi;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
return compileBinding(ifElse(deleteButtonVisibilityExpression, constant("Multi"), constant("None")));
|
|
694
737
|
}
|
|
695
738
|
|
|
696
739
|
if (!selectionMode || selectionMode === SelectionMode.Auto) {
|
|
697
740
|
selectionMode = SelectionMode.Multi;
|
|
698
741
|
}
|
|
699
742
|
|
|
743
|
+
if (bMassEditEnabled) {
|
|
744
|
+
// Override default selection mode when mass edit is visible
|
|
745
|
+
selectionMode = selectionMode === SelectionMode.Single ? SelectionMode.Single : SelectionMode.Multi;
|
|
746
|
+
}
|
|
747
|
+
|
|
700
748
|
if (hasBoundActionsAlwaysVisibleInToolBar(lineItemAnnotation, converterContext.getEntityType()) || hasCustomActionsAlwaysVisibleInToolBar(manifestActions)) {
|
|
701
749
|
return selectionMode;
|
|
702
750
|
}
|
|
@@ -704,31 +752,42 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
704
752
|
aHiddenBindingExpressions = getUIHiddenExpForActionsRequiringContext(lineItemAnnotation, converterContext.getEntityType(), converterContext.getDataModelObjectPath(), isEntitySet);
|
|
705
753
|
aVisibleBindingExpressions = getVisibleExpForCustomActionsRequiringContext(manifestActions); // No action requiring a context:
|
|
706
754
|
|
|
707
|
-
if (aHiddenBindingExpressions.length === 0 && aVisibleBindingExpressions.length === 0 &&
|
|
755
|
+
if (aHiddenBindingExpressions.length === 0 && aVisibleBindingExpressions.length === 0 && (deleteButtonVisibilityExpression || bMassEditEnabled)) {
|
|
708
756
|
if (!isEntitySet) {
|
|
709
|
-
|
|
710
|
-
|
|
757
|
+
// Example: OP case
|
|
758
|
+
if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false" || bMassEditEnabled) {
|
|
759
|
+
// Building expression for delete and mass edit
|
|
760
|
+
var buttonVisibilityExpression = or(deleteButtonVisibilityExpression || true, // default delete visibility as true
|
|
761
|
+
massEditVisibilityExpression);
|
|
762
|
+
return compileBinding(ifElse(and(UI.IsEditable, buttonVisibilityExpression), constant(selectionMode), constant(SelectionMode.None)));
|
|
711
763
|
} else {
|
|
712
764
|
return SelectionMode.None;
|
|
713
765
|
} // EntitySet deletable:
|
|
714
766
|
|
|
715
|
-
} else if (
|
|
716
|
-
|
|
767
|
+
} else if (bMassEditEnabled) {
|
|
768
|
+
// example: LR scenario
|
|
769
|
+
return selectionMode;
|
|
770
|
+
} else if (targetCapabilities.isDeletable && deleteButtonVisibilityExpression) {
|
|
771
|
+
return compileBinding(ifElse(deleteButtonVisibilityExpression, constant(selectionMode), constant("None"))); // EntitySet not deletable:
|
|
717
772
|
} else {
|
|
718
773
|
return SelectionMode.None;
|
|
719
774
|
} // There are actions requiring a context:
|
|
720
775
|
|
|
721
776
|
} else if (!isEntitySet) {
|
|
722
|
-
|
|
723
|
-
|
|
777
|
+
// Example: OP case
|
|
778
|
+
if (targetCapabilities.isDeletable || parentEntitySetDeletable !== "false" || bMassEditEnabled) {
|
|
779
|
+
// Use selectionMode in edit mode if delete is enabled or mass edit is visible
|
|
780
|
+
var editModebuttonVisibilityExpression = ifElse(bMassEditEnabled && !targetCapabilities.isDeletable, massEditVisibilityExpression, constant(true));
|
|
781
|
+
return compileBinding(ifElse(and(UI.IsEditable, editModebuttonVisibilityExpression), constant(selectionMode), ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None))));
|
|
724
782
|
} else {
|
|
725
783
|
return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None)));
|
|
726
784
|
} //EntitySet deletable:
|
|
727
785
|
|
|
728
|
-
} else if (targetCapabilities.isDeletable) {
|
|
729
|
-
|
|
786
|
+
} else if (targetCapabilities.isDeletable || bMassEditEnabled) {
|
|
787
|
+
// Example: LR scenario
|
|
788
|
+
return selectionMode; //EntitySet not deletable:
|
|
730
789
|
} else {
|
|
731
|
-
return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions))), constant(selectionMode), constant(SelectionMode.None)));
|
|
790
|
+
return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aHiddenBindingExpressions.concat(aVisibleBindingExpressions)).concat([massEditVisibilityExpression])), constant(selectionMode), constant(SelectionMode.None)));
|
|
732
791
|
}
|
|
733
792
|
}
|
|
734
793
|
/**
|
|
@@ -810,7 +869,13 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
810
869
|
}
|
|
811
870
|
}
|
|
812
871
|
|
|
813
|
-
|
|
872
|
+
var aMissingKeys = [];
|
|
873
|
+
targetEntityType === null || targetEntityType === void 0 ? void 0 : targetEntityType.keys.forEach(function (key) {
|
|
874
|
+
if (key.name !== "IsActiveEntity") {
|
|
875
|
+
aMissingKeys.push(bindingExpression(key.name, undefined));
|
|
876
|
+
}
|
|
877
|
+
});
|
|
878
|
+
return formatResult([defaultHighlightRowDefinition, bindingExpression("filteredMessages", "internal"), isDraftRoot && Entity.HasActive, isDraftRoot && Entity.IsActive, "".concat(isDraftRoot)].concat(aMissingKeys), tableFormatters.rowHighlighting, targetEntityType);
|
|
814
879
|
}
|
|
815
880
|
|
|
816
881
|
function _getCreationBehaviour(lineItemAnnotation, tableManifestConfiguration, converterContext, navigationSettings) {
|
|
@@ -818,7 +883,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
818
883
|
|
|
819
884
|
var navigation = (navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.create) || (navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.detail); // cross-app
|
|
820
885
|
|
|
821
|
-
if (
|
|
886
|
+
if (navigation !== null && navigation !== void 0 && navigation.outbound && navigation.outboundDetail && navigationSettings !== null && navigationSettings !== void 0 && navigationSettings.create) {
|
|
822
887
|
return {
|
|
823
888
|
mode: "External",
|
|
824
889
|
outbound: navigation.outbound,
|
|
@@ -940,7 +1005,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
940
1005
|
var additionalPropertyNames = Object.keys(relatedPropertiesInfo.additionalProperties);
|
|
941
1006
|
var columnInfo = getColumnDefinitionFromProperty(property, converterContext.getEntitySetBasedAnnotationPath(property.fullyQualifiedName), property.name, true, true, nonSortableColumns, aggregationHelper, converterContext);
|
|
942
1007
|
var semanticKeys = converterContext.getAnnotationsByTerm("Common", "com.sap.vocabularies.Common.v1.SemanticKey", [converterContext.getEntityType()])[0];
|
|
943
|
-
var oColumnDraftIndicator = getDefaultDraftIndicatorForColumn(columnInfo.name, semanticKeys);
|
|
1008
|
+
var oColumnDraftIndicator = getDefaultDraftIndicatorForColumn(columnInfo.name, semanticKeys, false, null);
|
|
944
1009
|
|
|
945
1010
|
if (Object.keys(oColumnDraftIndicator).length > 0) {
|
|
946
1011
|
columnInfo.formatOptions = _objectSpread({}, oColumnDraftIndicator);
|
|
@@ -951,7 +1016,15 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
951
1016
|
columnInfo.exportSettings = _objectSpread(_objectSpread({}, columnInfo.exportSettings), {}, {
|
|
952
1017
|
template: relatedPropertiesInfo.exportSettingsTemplate,
|
|
953
1018
|
wrap: relatedPropertiesInfo.exportSettingsWrapping
|
|
954
|
-
});
|
|
1019
|
+
});
|
|
1020
|
+
|
|
1021
|
+
if (relatedPropertiesInfo.exportUnitName) {
|
|
1022
|
+
columnInfo.exportSettings.unitProperty = relatedPropertiesInfo.exportUnitName;
|
|
1023
|
+
columnInfo.exportSettings.type = "Currency"; // Force to a currency because there's a unitProperty (otherwise the value isn't properly formatted when exported)
|
|
1024
|
+
} else if (relatedPropertiesInfo.exportUnitString) {
|
|
1025
|
+
columnInfo.exportSettings.unit = relatedPropertiesInfo.exportUnitString;
|
|
1026
|
+
} // Collect information of related columns to be created.
|
|
1027
|
+
|
|
955
1028
|
|
|
956
1029
|
relatedPropertyNames.forEach(function (name) {
|
|
957
1030
|
columnsToBeCreated[name] = relatedPropertiesInfo.properties[name];
|
|
@@ -978,8 +1051,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
978
1051
|
* @param {string} fullPropertyPath The full path to the target property
|
|
979
1052
|
* @param {string} relativePath The relative path to the target property based on the context
|
|
980
1053
|
* @param {boolean} useDataFieldPrefix Should be prefixed with "DataField::", else it will be prefixed with "Property::"
|
|
981
|
-
* @param {boolean} availableForAdaptation Decides whether column should be available for adaptation
|
|
982
|
-
* @param {string[]} nonSortableColumns The array of all non
|
|
1054
|
+
* @param {boolean} availableForAdaptation Decides whether the column should be available for adaptation
|
|
1055
|
+
* @param {string[]} nonSortableColumns The array of all non-sortable column names
|
|
983
1056
|
* @param {AggregationHelper} aggregationHelper The aggregationHelper for the entity
|
|
984
1057
|
* @param {ConverterContext} converterContext The converter context
|
|
985
1058
|
* @returns {AnnotationTableColumn} The annotation column definition
|
|
@@ -989,7 +1062,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
989
1062
|
_exports.getColumnsFromEntityType = getColumnsFromEntityType;
|
|
990
1063
|
|
|
991
1064
|
var getColumnDefinitionFromProperty = function (property, fullPropertyPath, relativePath, useDataFieldPrefix, availableForAdaptation, nonSortableColumns, aggregationHelper, converterContext) {
|
|
992
|
-
var _property$annotations, _property$annotations2, _property$annotations3, _annotations2, _annotations2$UI, _annotations2$UI$Data, _annotations2$UI$Data2, _annotations2$UI$Data3, _annotations2$UI$Data4;
|
|
1065
|
+
var _property$annotations, _property$annotations2, _property$annotations3, _annotations2, _annotations2$UI, _annotations2$UI$Data, _annotations2$UI$Data2, _annotations2$UI$Data3, _annotations2$UI$Data4, _annotations3, _annotations3$UI;
|
|
993
1066
|
|
|
994
1067
|
var name = useDataFieldPrefix ? relativePath : "Property::" + relativePath;
|
|
995
1068
|
var key = (useDataFieldPrefix ? "DataField::" : "Property::") + replaceSpecialChars(relativePath);
|
|
@@ -1004,6 +1077,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1004
1077
|
var sDateInputFormat = property.type === "Edm.Date" ? "YYYY-MM-DD" : undefined;
|
|
1005
1078
|
var dataType = getDataFieldDataType(property);
|
|
1006
1079
|
var propertyTypeConfig = !isDataPointFakeProperty ? getTypeConfig(property, dataType) : undefined;
|
|
1080
|
+
var semanticKeys = converterContext.getAnnotationsByTerm("Common", "com.sap.vocabularies.Common.v1.SemanticKey", [converterContext.getEntityType()])[0];
|
|
1007
1081
|
var oTypeConfig = !isDataPointFakeProperty ? {
|
|
1008
1082
|
className: property.type || dataType,
|
|
1009
1083
|
oFormatOptions: propertyTypeConfig.formatOptions,
|
|
@@ -1019,6 +1093,21 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1019
1093
|
trueValue: property.type === "Edm.Boolean" ? "Yes" : undefined,
|
|
1020
1094
|
falseValue: property.type === "Edm.Boolean" ? "No" : undefined
|
|
1021
1095
|
};
|
|
1096
|
+
|
|
1097
|
+
if (!isDataPointFakeProperty) {
|
|
1098
|
+
var _property$annotations4, _property$annotations5, _property$annotations6, _property$annotations7;
|
|
1099
|
+
|
|
1100
|
+
var oUnitProperty = getAssociatedCurrencyProperty(property) || getAssociatedUnitProperty(property);
|
|
1101
|
+
var sUnitText = (property === null || property === void 0 ? void 0 : (_property$annotations4 = property.annotations) === null || _property$annotations4 === void 0 ? void 0 : (_property$annotations5 = _property$annotations4.Measures) === null || _property$annotations5 === void 0 ? void 0 : _property$annotations5.ISOCurrency) || (property === null || property === void 0 ? void 0 : (_property$annotations6 = property.annotations) === null || _property$annotations6 === void 0 ? void 0 : (_property$annotations7 = _property$annotations6.Measures) === null || _property$annotations7 === void 0 ? void 0 : _property$annotations7.Unit);
|
|
1102
|
+
|
|
1103
|
+
if (oUnitProperty) {
|
|
1104
|
+
exportSettings.unitProperty = oUnitProperty.name;
|
|
1105
|
+
exportSettings.type = "Currency"; // Force to a currency because there's a unitProperty (otherwise the value isn't properly formatted when exported)
|
|
1106
|
+
} else if (sUnitText) {
|
|
1107
|
+
exportSettings.unit = "".concat(sUnitText);
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1022
1111
|
var oColumn = {
|
|
1023
1112
|
key: key,
|
|
1024
1113
|
isGroupable: !isDataPointFakeProperty && !isHidden ? aggregationHelper.isPropertyGroupable(property) : false,
|
|
@@ -1040,7 +1129,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1040
1129
|
typeConfig: oTypeConfig,
|
|
1041
1130
|
visualSettings: isDataPointFakeProperty ? {
|
|
1042
1131
|
widthCalculation: null
|
|
1043
|
-
} : undefined
|
|
1132
|
+
} : undefined,
|
|
1133
|
+
importance: getImportance((_annotations3 = property.annotations) === null || _annotations3 === void 0 ? void 0 : (_annotations3$UI = _annotations3.UI) === null || _annotations3$UI === void 0 ? void 0 : _annotations3$UI.DataFieldDefault, semanticKeys)
|
|
1044
1134
|
};
|
|
1045
1135
|
|
|
1046
1136
|
var sTooltip = _getTooltip(property);
|
|
@@ -1068,8 +1158,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1068
1158
|
|
|
1069
1159
|
case "com.sap.vocabularies.UI.v1.DataFieldWithAction":
|
|
1070
1160
|
case "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation":
|
|
1071
|
-
return false;
|
|
1072
|
-
|
|
1073
1161
|
case "com.sap.vocabularies.UI.v1.DataField":
|
|
1074
1162
|
case "com.sap.vocabularies.UI.v1.DataFieldWithUrl":
|
|
1075
1163
|
case "com.sap.vocabularies.UI.v1.DataFieldForAnnotation":
|
|
@@ -1087,15 +1175,17 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1087
1175
|
* SAP Fiori elements will evaluate either the UI.Hidden annotation defined on the annotation itself or on the target property.
|
|
1088
1176
|
*
|
|
1089
1177
|
* @param {DataModelObjectPath} dataFieldModelPath The metapath referring to the annotation that is evaluated by SAP Fiori elements.
|
|
1090
|
-
* @param {
|
|
1178
|
+
* @param {object} [formatOptions] FormatOptions optional.
|
|
1179
|
+
* @param {boolean} formatOptions.isAnalytics This flag is used to check if the analytic table has GroupHeader expanded.
|
|
1091
1180
|
* @param {boolean} [returnExpression] ReturnExpression optional.
|
|
1092
1181
|
* @returns {BindingExpression<string>} An expression that you can bind to the UI.
|
|
1093
1182
|
*/
|
|
1094
1183
|
|
|
1095
1184
|
|
|
1096
|
-
var _getVisibleExpression = function (dataFieldModelPath, formatOptions
|
|
1185
|
+
var _getVisibleExpression = function (dataFieldModelPath, formatOptions) {
|
|
1097
1186
|
var _targetObject$Target, _targetObject$Target$, _targetObject$annotat, _targetObject$annotat2, _propertyValue$annota, _propertyValue$annota2;
|
|
1098
1187
|
|
|
1188
|
+
var returnExpression = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1099
1189
|
var targetObject = dataFieldModelPath.targetObject;
|
|
1100
1190
|
var propertyValue;
|
|
1101
1191
|
|
|
@@ -1139,7 +1229,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1139
1229
|
/**
|
|
1140
1230
|
* Returns hidden binding expressions for a field group.
|
|
1141
1231
|
* @param {DataFieldAbstractTypes} dataFieldGroup DataField defined in the annotations
|
|
1142
|
-
* @param {
|
|
1232
|
+
* @param {object} fieldFormatOptions FormatOptions optional.
|
|
1233
|
+
* @param {boolean} fieldFormatOptions.isAnalytics This flag is used to check if the analytic table has GroupHeader expanded.
|
|
1143
1234
|
* @returns {BindingExpression<string>} Compile binding of field group expressions.
|
|
1144
1235
|
* @private
|
|
1145
1236
|
*/
|
|
@@ -1161,6 +1252,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1161
1252
|
}, fieldFormatOptions, true));
|
|
1162
1253
|
});
|
|
1163
1254
|
return compileBinding(ifElse(or.apply(void 0, _toConsumableArray(aFieldGroupHiddenExpressions)), constant(true), constant(false)));
|
|
1255
|
+
} else {
|
|
1256
|
+
return undefined;
|
|
1164
1257
|
}
|
|
1165
1258
|
};
|
|
1166
1259
|
/**
|
|
@@ -1180,9 +1273,9 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1180
1273
|
}
|
|
1181
1274
|
|
|
1182
1275
|
if (isProperty(property)) {
|
|
1183
|
-
var _property$
|
|
1276
|
+
var _property$annotations8, _property$annotations9, _dataFieldDefault$Lab, _property$annotations10, _property$annotations11;
|
|
1184
1277
|
|
|
1185
|
-
var dataFieldDefault = (_property$
|
|
1278
|
+
var dataFieldDefault = (_property$annotations8 = property.annotations) === null || _property$annotations8 === void 0 ? void 0 : (_property$annotations9 = _property$annotations8.UI) === null || _property$annotations9 === void 0 ? void 0 : _property$annotations9.DataFieldDefault;
|
|
1186
1279
|
|
|
1187
1280
|
if (dataFieldDefault && !dataFieldDefault.qualifier && (_dataFieldDefault$Lab = dataFieldDefault.Label) !== null && _dataFieldDefault$Lab !== void 0 && _dataFieldDefault$Lab.valueOf()) {
|
|
1188
1281
|
var _dataFieldDefault$Lab2;
|
|
@@ -1190,7 +1283,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1190
1283
|
return compileBinding(annotationExpression((_dataFieldDefault$Lab2 = dataFieldDefault.Label) === null || _dataFieldDefault$Lab2 === void 0 ? void 0 : _dataFieldDefault$Lab2.valueOf()));
|
|
1191
1284
|
}
|
|
1192
1285
|
|
|
1193
|
-
return compileBinding(annotationExpression(((_property$
|
|
1286
|
+
return compileBinding(annotationExpression(((_property$annotations10 = property.annotations.Common) === null || _property$annotations10 === void 0 ? void 0 : (_property$annotations11 = _property$annotations10.Label) === null || _property$annotations11 === void 0 ? void 0 : _property$annotations11.valueOf()) || property.name));
|
|
1194
1287
|
} else if (isDataFieldTypes(property)) {
|
|
1195
1288
|
var _property$Label2, _property$Value, _property$Value$$targ, _property$Value$$targ2, _property$Value$$targ3, _property$Value$$targ4, _property$Value2, _property$Value2$$tar;
|
|
1196
1289
|
|
|
@@ -1234,6 +1327,10 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1234
1327
|
return undefined;
|
|
1235
1328
|
}
|
|
1236
1329
|
};
|
|
1330
|
+
|
|
1331
|
+
function getRowStatusVisibility() {
|
|
1332
|
+
return formatResult([bindingExpression("semanticKeyHasDraftIndicator", "internal"), bindingExpression("filteredMessages", "internal")], tableFormatters.getErrorStatusTextVisibilityFormatter);
|
|
1333
|
+
}
|
|
1237
1334
|
/**
|
|
1238
1335
|
* Creates a PropertyInfo for each identified property consumed by a LineItem.
|
|
1239
1336
|
*
|
|
@@ -1246,6 +1343,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1246
1343
|
*/
|
|
1247
1344
|
|
|
1248
1345
|
|
|
1346
|
+
_exports.getRowStatusVisibility = getRowStatusVisibility;
|
|
1347
|
+
|
|
1249
1348
|
var _createRelatedColumns = function (columnsToBeCreated, existingColumns, nonSortableColumns, converterContext, entityType) {
|
|
1250
1349
|
var relatedColumns = [];
|
|
1251
1350
|
var relatedPropertyNameMap = {};
|
|
@@ -1359,6 +1458,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1359
1458
|
case "com.sap.vocabularies.UI.v1.DataField":
|
|
1360
1459
|
case "com.sap.vocabularies.UI.v1.DataFieldWithNavigationPath":
|
|
1361
1460
|
case "com.sap.vocabularies.UI.v1.DataFieldWithUrl":
|
|
1461
|
+
case "com.sap.vocabularies.UI.v1.DataFieldWithIntentBasedNavigation":
|
|
1462
|
+
case "com.sap.vocabularies.UI.v1.DataFieldWithAction":
|
|
1362
1463
|
relativePath = dataField === null || dataField === void 0 ? void 0 : (_Value = dataField.Value) === null || _Value === void 0 ? void 0 : _Value.path;
|
|
1363
1464
|
break;
|
|
1364
1465
|
|
|
@@ -1443,39 +1544,224 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1443
1544
|
textLinesEdit: 4
|
|
1444
1545
|
};
|
|
1445
1546
|
}
|
|
1547
|
+
|
|
1548
|
+
function _findSemanticKeyValues(semanticKeys, name) {
|
|
1549
|
+
var aSemanticKeyValues = [];
|
|
1550
|
+
var bSemanticKeyFound = false;
|
|
1551
|
+
|
|
1552
|
+
for (var i = 0; i < semanticKeys.length; i++) {
|
|
1553
|
+
aSemanticKeyValues.push(semanticKeys[i].value);
|
|
1554
|
+
|
|
1555
|
+
if (semanticKeys[i].value === name) {
|
|
1556
|
+
bSemanticKeyFound = true;
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
return {
|
|
1561
|
+
values: aSemanticKeyValues,
|
|
1562
|
+
semanticKeyFound: bSemanticKeyFound
|
|
1563
|
+
};
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
function _findProperties(semanticKeyValues, fieldGroupProperties) {
|
|
1567
|
+
var semanticKeyHasPropertyInFieldGroup = false;
|
|
1568
|
+
var sPropertyPath;
|
|
1569
|
+
|
|
1570
|
+
if (semanticKeyValues && semanticKeyValues.length >= 1 && fieldGroupProperties && fieldGroupProperties.length >= 1) {
|
|
1571
|
+
for (var i = 0; i < semanticKeyValues.length; i++) {
|
|
1572
|
+
if ([semanticKeyValues[i]].some(function (tmp) {
|
|
1573
|
+
return fieldGroupProperties.indexOf(tmp) >= 0;
|
|
1574
|
+
})) {
|
|
1575
|
+
semanticKeyHasPropertyInFieldGroup = true;
|
|
1576
|
+
sPropertyPath = semanticKeyValues[i];
|
|
1577
|
+
break;
|
|
1578
|
+
}
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
return {
|
|
1583
|
+
semanticKeyHasPropertyInFieldGroup: semanticKeyHasPropertyInFieldGroup,
|
|
1584
|
+
fieldGroupPropertyPath: sPropertyPath
|
|
1585
|
+
};
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
function _findSemanticKeyValuesInFieldGroup(dataFieldGroup, semanticKeyValues) {
|
|
1589
|
+
var _dataFieldGroup$Targe4, _dataFieldGroup$Targe5;
|
|
1590
|
+
|
|
1591
|
+
var aProperties = [];
|
|
1592
|
+
var _propertiesFound = {
|
|
1593
|
+
semanticKeyHasPropertyInFieldGroup: false,
|
|
1594
|
+
fieldGroupPropertyPath: undefined
|
|
1595
|
+
};
|
|
1596
|
+
|
|
1597
|
+
if (dataFieldGroup && dataFieldGroup.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && ((_dataFieldGroup$Targe4 = dataFieldGroup.Target) === null || _dataFieldGroup$Targe4 === void 0 ? void 0 : (_dataFieldGroup$Targe5 = _dataFieldGroup$Targe4.$target) === null || _dataFieldGroup$Targe5 === void 0 ? void 0 : _dataFieldGroup$Targe5.$Type) === "com.sap.vocabularies.UI.v1.FieldGroupType") {
|
|
1598
|
+
var _dataFieldGroup$Targe6;
|
|
1599
|
+
|
|
1600
|
+
(_dataFieldGroup$Targe6 = dataFieldGroup.Target.$target.Data) === null || _dataFieldGroup$Targe6 === void 0 ? void 0 : _dataFieldGroup$Targe6.forEach(function (innerDataField) {
|
|
1601
|
+
if ((innerDataField.$Type === "com.sap.vocabularies.UI.v1.DataField" || innerDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldWithUrl") && innerDataField.Value) {
|
|
1602
|
+
aProperties.push(innerDataField.Value.path);
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
_propertiesFound = _findProperties(semanticKeyValues, aProperties);
|
|
1606
|
+
});
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
return {
|
|
1610
|
+
semanticKeyHasPropertyInFieldGroup: _propertiesFound.semanticKeyHasPropertyInFieldGroup,
|
|
1611
|
+
propertyPath: _propertiesFound.fieldGroupPropertyPath
|
|
1612
|
+
};
|
|
1613
|
+
}
|
|
1446
1614
|
/**
|
|
1447
1615
|
* Returns default format options with draftIndicator for a column.
|
|
1448
1616
|
* @param name
|
|
1449
1617
|
* @param semanticKeys
|
|
1618
|
+
* @param isFieldGroupColumn
|
|
1619
|
+
* @param dataFieldGroup
|
|
1450
1620
|
* @returns {FormatOptionsType} Collection of format options with default values
|
|
1451
1621
|
*/
|
|
1452
1622
|
|
|
1453
1623
|
|
|
1454
|
-
function getDefaultDraftIndicatorForColumn(name, semanticKeys) {
|
|
1455
|
-
var bSemanticKeyFound = false;
|
|
1456
|
-
var aSemanticKeyValues = [];
|
|
1457
|
-
|
|
1624
|
+
function getDefaultDraftIndicatorForColumn(name, semanticKeys, isFieldGroupColumn, dataFieldGroup) {
|
|
1458
1625
|
if (!semanticKeys) {
|
|
1459
1626
|
return {};
|
|
1460
1627
|
}
|
|
1461
1628
|
|
|
1462
|
-
|
|
1463
|
-
aSemanticKeyValues.push(semanticKeys[i].value);
|
|
1629
|
+
var semanticKey = _findSemanticKeyValues(semanticKeys, name);
|
|
1464
1630
|
|
|
1465
|
-
|
|
1466
|
-
bSemanticKeyFound = true;
|
|
1467
|
-
}
|
|
1468
|
-
}
|
|
1631
|
+
var semanticKeyInFieldGroup = _findSemanticKeyValuesInFieldGroup(dataFieldGroup, semanticKey.values);
|
|
1469
1632
|
|
|
1470
|
-
if (
|
|
1633
|
+
if (semanticKey.semanticKeyFound) {
|
|
1471
1634
|
return {
|
|
1472
1635
|
hasDraftIndicator: true,
|
|
1473
|
-
semantickeys:
|
|
1636
|
+
semantickeys: semanticKey.values,
|
|
1637
|
+
objectStatusTextVisibility: compileBinding(getRowStatusVisibility())
|
|
1474
1638
|
};
|
|
1475
1639
|
} else {
|
|
1476
|
-
|
|
1640
|
+
if (!semanticKeyInFieldGroup.semanticKeyHasPropertyInFieldGroup) {
|
|
1641
|
+
return {};
|
|
1642
|
+
} else {
|
|
1643
|
+
// Semantic Key has a property in a FieldGroup
|
|
1644
|
+
return {
|
|
1645
|
+
FieldGroupDraftIndicatorPropertyPath: semanticKeyInFieldGroup.propertyPath,
|
|
1646
|
+
FieldGroupName: name
|
|
1647
|
+
};
|
|
1648
|
+
}
|
|
1477
1649
|
}
|
|
1478
1650
|
}
|
|
1651
|
+
|
|
1652
|
+
function _getImpNumber(dataField) {
|
|
1653
|
+
var _dataField$annotation20, _dataField$annotation21;
|
|
1654
|
+
|
|
1655
|
+
var importance = dataField === null || dataField === void 0 ? void 0 : (_dataField$annotation20 = dataField.annotations) === null || _dataField$annotation20 === void 0 ? void 0 : (_dataField$annotation21 = _dataField$annotation20.UI) === null || _dataField$annotation21 === void 0 ? void 0 : _dataField$annotation21.Importance;
|
|
1656
|
+
|
|
1657
|
+
if (importance && importance.includes("UI.ImportanceType/High")) {
|
|
1658
|
+
return 3;
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
if (importance && importance.includes("UI.ImportanceType/Medium")) {
|
|
1662
|
+
return 2;
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
if (importance && importance.includes("UI.ImportanceType/Low")) {
|
|
1666
|
+
return 1;
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
return 0;
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
function _getDataFieldImportance(dataField) {
|
|
1673
|
+
var _dataField$annotation22, _dataField$annotation23;
|
|
1674
|
+
|
|
1675
|
+
var importance = dataField === null || dataField === void 0 ? void 0 : (_dataField$annotation22 = dataField.annotations) === null || _dataField$annotation22 === void 0 ? void 0 : (_dataField$annotation23 = _dataField$annotation22.UI) === null || _dataField$annotation23 === void 0 ? void 0 : _dataField$annotation23.Importance;
|
|
1676
|
+
return importance ? importance.split("/")[1] : Importance.None;
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
function _getMaxImportance(fields) {
|
|
1680
|
+
if (fields && fields.length > 0) {
|
|
1681
|
+
var maxImpNumber = -1;
|
|
1682
|
+
var impNumber = -1;
|
|
1683
|
+
var DataFieldWithMaxImportance;
|
|
1684
|
+
|
|
1685
|
+
var _iterator = _createForOfIteratorHelper(fields),
|
|
1686
|
+
_step;
|
|
1687
|
+
|
|
1688
|
+
try {
|
|
1689
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
1690
|
+
var field = _step.value;
|
|
1691
|
+
impNumber = _getImpNumber(field);
|
|
1692
|
+
|
|
1693
|
+
if (impNumber > maxImpNumber) {
|
|
1694
|
+
maxImpNumber = impNumber;
|
|
1695
|
+
DataFieldWithMaxImportance = field;
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
} catch (err) {
|
|
1699
|
+
_iterator.e(err);
|
|
1700
|
+
} finally {
|
|
1701
|
+
_iterator.f();
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
return _getDataFieldImportance(DataFieldWithMaxImportance);
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1707
|
+
return Importance.None;
|
|
1708
|
+
}
|
|
1709
|
+
/**
|
|
1710
|
+
* Returns the importance value for a column.
|
|
1711
|
+
*
|
|
1712
|
+
* @param dataField
|
|
1713
|
+
* @param semanticKeys
|
|
1714
|
+
* @returns {Importance} The importance value
|
|
1715
|
+
*/
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
function getImportance(dataField, semanticKeys) {
|
|
1719
|
+
var _Value4;
|
|
1720
|
+
|
|
1721
|
+
//Evaluate default Importance is not set explicitly
|
|
1722
|
+
var fieldsWithImportance, mapSemanticKeys; //Check if semanticKeys are defined at the EntitySet level
|
|
1723
|
+
|
|
1724
|
+
if (semanticKeys && semanticKeys.length > 0) {
|
|
1725
|
+
mapSemanticKeys = semanticKeys.map(function (key) {
|
|
1726
|
+
return key.value;
|
|
1727
|
+
});
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
if (!dataField) {
|
|
1731
|
+
return undefined;
|
|
1732
|
+
}
|
|
1733
|
+
|
|
1734
|
+
if (dataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation") {
|
|
1735
|
+
var fieldGroupData = dataField.Target["$target"]["Data"],
|
|
1736
|
+
fieldGroupHasSemanticKey = fieldGroupData && fieldGroupData.some(function (fieldGroupDataField) {
|
|
1737
|
+
var _Value2, _Value3;
|
|
1738
|
+
|
|
1739
|
+
return (fieldGroupDataField === null || fieldGroupDataField === void 0 ? void 0 : (_Value2 = fieldGroupDataField.Value) === null || _Value2 === void 0 ? void 0 : _Value2.path) && fieldGroupDataField.$Type !== "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && mapSemanticKeys && mapSemanticKeys.includes(fieldGroupDataField === null || fieldGroupDataField === void 0 ? void 0 : (_Value3 = fieldGroupDataField.Value) === null || _Value3 === void 0 ? void 0 : _Value3.path);
|
|
1740
|
+
}); //If a FieldGroup contains a semanticKey, importance set to High
|
|
1741
|
+
|
|
1742
|
+
if (fieldGroupHasSemanticKey) {
|
|
1743
|
+
return Importance.High;
|
|
1744
|
+
} else {
|
|
1745
|
+
var _dataField$annotation24, _dataField$annotation25;
|
|
1746
|
+
|
|
1747
|
+
//If the DataFieldForAnnotation has an Importance we take it
|
|
1748
|
+
if (dataField !== null && dataField !== void 0 && (_dataField$annotation24 = dataField.annotations) !== null && _dataField$annotation24 !== void 0 && (_dataField$annotation25 = _dataField$annotation24.UI) !== null && _dataField$annotation25 !== void 0 && _dataField$annotation25.Importance) {
|
|
1749
|
+
return _getDataFieldImportance(dataField);
|
|
1750
|
+
} // else the highest importance (if any) is returned
|
|
1751
|
+
|
|
1752
|
+
|
|
1753
|
+
fieldsWithImportance = fieldGroupData && fieldGroupData.filter(function (item) {
|
|
1754
|
+
var _item$annotations, _item$annotations$UI;
|
|
1755
|
+
|
|
1756
|
+
return item === null || item === void 0 ? void 0 : (_item$annotations = item.annotations) === null || _item$annotations === void 0 ? void 0 : (_item$annotations$UI = _item$annotations.UI) === null || _item$annotations$UI === void 0 ? void 0 : _item$annotations$UI.Importance;
|
|
1757
|
+
});
|
|
1758
|
+
return _getMaxImportance(fieldsWithImportance);
|
|
1759
|
+
} //If the current field is a semanticKey, importance set to High
|
|
1760
|
+
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
return dataField.Value && dataField !== null && dataField !== void 0 && (_Value4 = dataField.Value) !== null && _Value4 !== void 0 && _Value4.path && mapSemanticKeys && mapSemanticKeys.includes(dataField.Value.path) ? Importance.High : _getDataFieldImportance(dataField);
|
|
1764
|
+
}
|
|
1479
1765
|
/**
|
|
1480
1766
|
* Returns line items from metadata annotations.
|
|
1481
1767
|
*
|
|
@@ -1486,6 +1772,8 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1486
1772
|
*/
|
|
1487
1773
|
|
|
1488
1774
|
|
|
1775
|
+
_exports.getImportance = getImportance;
|
|
1776
|
+
|
|
1489
1777
|
var getColumnsFromAnnotations = function (lineItemAnnotation, visualizationPath, converterContext) {
|
|
1490
1778
|
var _tableManifestSetting2;
|
|
1491
1779
|
|
|
@@ -1527,7 +1815,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1527
1815
|
var dataType = getDataFieldDataType(lineItem);
|
|
1528
1816
|
var sDateInputFormat = dataType === "Edm.Date" ? "YYYY-MM-DD" : undefined;
|
|
1529
1817
|
|
|
1530
|
-
var formatOptions = _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), getDefaultDraftIndicatorForColumn(name, semanticKeys));
|
|
1818
|
+
var formatOptions = _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), getDefaultDraftIndicatorForColumn(name, semanticKeys, isFieldGroupColumn, lineItem));
|
|
1531
1819
|
|
|
1532
1820
|
var fieldGroupHiddenExpressions;
|
|
1533
1821
|
|
|
@@ -1544,6 +1832,14 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1544
1832
|
trueValue: dataType === "Edm.Boolean" ? "Yes" : undefined,
|
|
1545
1833
|
falseValue: dataType === "Edm.Boolean" ? "No" : undefined
|
|
1546
1834
|
};
|
|
1835
|
+
|
|
1836
|
+
if (relatedPropertiesInfo.exportUnitName) {
|
|
1837
|
+
exportSettings.unitProperty = relatedPropertiesInfo.exportUnitName;
|
|
1838
|
+
exportSettings.type = "Currency"; // Force to a currency because there's a unitProperty (otherwise the value isn't properly formatted when exported)
|
|
1839
|
+
} else if (relatedPropertiesInfo.exportUnitString) {
|
|
1840
|
+
exportSettings.unit = relatedPropertiesInfo.exportUnitString;
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1547
1843
|
var propertyTypeConfig = dataType && getTypeConfig(lineItem, dataType);
|
|
1548
1844
|
var oTypeConfig = propertyTypeConfig ? {
|
|
1549
1845
|
className: dataType,
|
|
@@ -1556,17 +1852,18 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1556
1852
|
// In case of text arrangement annotation with display mode as text only, exclude text property from the width calculation
|
|
1557
1853
|
visualSettings = {
|
|
1558
1854
|
widthCalculation: {
|
|
1559
|
-
excludeProperties: "Property::" + relatedPropertiesInfo.visualSettingsToBeExcluded
|
|
1855
|
+
excludeProperties: ["Property::" + relatedPropertiesInfo.visualSettingsToBeExcluded]
|
|
1560
1856
|
}
|
|
1561
1857
|
};
|
|
1562
1858
|
} else if (!dataType || !oTypeConfig) {
|
|
1563
1859
|
// for charts
|
|
1564
1860
|
visualSettings.widthCalculation = null;
|
|
1565
1861
|
} // TODO: For situation POC - increase width of the column with the situations indicator - works for the situations demo app only!
|
|
1566
|
-
// Might be a good idea to move the complete column width determination to the converter, that would allow us to widen
|
|
1862
|
+
// Might be a good idea to move the complete column width determination to the converter, that would allow us to widen
|
|
1863
|
+
// the columns as needed. This workaround only deals with Date columns.
|
|
1567
1864
|
|
|
1568
1865
|
|
|
1569
|
-
var _getDefaultDraftIndic = getDefaultDraftIndicatorForColumn(name, semanticKeys),
|
|
1866
|
+
var _getDefaultDraftIndic = getDefaultDraftIndicatorForColumn(name, semanticKeys, isFieldGroupColumn, lineItem),
|
|
1570
1867
|
hasDraftIndicator = _getDefaultDraftIndic.hasDraftIndicator;
|
|
1571
1868
|
|
|
1572
1869
|
var widthOverride = (_FE = converterContext.getEntityType().annotations.FE) !== null && _FE !== void 0 && _FE.Situations && hasDraftIndicator && lineItem.$Type === "com.sap.vocabularies.UI.v1.DataField" && lineItem.Value.$target.type === "Edm.Date" ? "11em" : undefined;
|
|
@@ -1588,6 +1885,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1588
1885
|
additionalPropertyInfos: additionalPropertyNames.length > 0 ? additionalPropertyNames : undefined,
|
|
1589
1886
|
exportSettings: exportSettings,
|
|
1590
1887
|
width: ((_lineItem$annotations = lineItem.annotations) === null || _lineItem$annotations === void 0 ? void 0 : (_lineItem$annotations2 = _lineItem$annotations.HTML5) === null || _lineItem$annotations2 === void 0 ? void 0 : (_lineItem$annotations3 = _lineItem$annotations2.CssDefaults) === null || _lineItem$annotations3 === void 0 ? void 0 : _lineItem$annotations3.width) || widthOverride || undefined,
|
|
1888
|
+
importance: getImportance(lineItem, semanticKeys),
|
|
1591
1889
|
isNavigable: true,
|
|
1592
1890
|
formatOptions: formatOptions,
|
|
1593
1891
|
exportContactProperty: relatedPropertiesInfo.exportSettingsContactProperty,
|
|
@@ -1710,7 +2008,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1710
2008
|
|
|
1711
2009
|
var propertyInfos = _getPropertyNames(manifestColumn.properties, annotationColumns, converterContext, entityType);
|
|
1712
2010
|
|
|
1713
|
-
if (!(manifestColumn !== null && manifestColumn !== void 0 && manifestColumn.template) && !isAnnotationColumn) {
|
|
2011
|
+
if (!(manifestColumn !== null && manifestColumn !== void 0 && manifestColumn.template) && (manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.type) !== "Slot" && !isAnnotationColumn) {
|
|
1714
2012
|
var _IssueCategoryType$An;
|
|
1715
2013
|
|
|
1716
2014
|
var Message = "The annotation column '" + key + "' referenced in the manifest is not found";
|
|
@@ -1724,6 +2022,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1724
2022
|
name: "CustomColumn::" + key,
|
|
1725
2023
|
header: manifestColumn.header,
|
|
1726
2024
|
width: manifestColumn.width || undefined,
|
|
2025
|
+
importance: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.importance, Importance.None, isAnnotationColumn),
|
|
1727
2026
|
horizontalAlign: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.horizontalAlign, HorizontalAlign.Begin, isAnnotationColumn),
|
|
1728
2027
|
type: manifestColumn.type === "Slot" ? ColumnType.Slot : ColumnType.Default,
|
|
1729
2028
|
availability: _getManifestOrDefaultValue(manifestColumn === null || manifestColumn === void 0 ? void 0 : manifestColumn.availability, AvailabilityType.Default, isAnnotationColumn),
|
|
@@ -1736,7 +2035,7 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1736
2035
|
settings: manifestColumn.settings,
|
|
1737
2036
|
sortable: false,
|
|
1738
2037
|
propertyInfos: propertyInfos,
|
|
1739
|
-
formatOptions: _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), manifestColumn.formatOptions),
|
|
2038
|
+
formatOptions: _getManifestOrDefaultValue(manifestColumn.formatOptions, _objectSpread(_objectSpread({}, getDefaultFormatOptionsForTable()), manifestColumn.formatOptions), isAnnotationColumn),
|
|
1740
2039
|
exportSettings: {
|
|
1741
2040
|
template: propertyInfos ? _appendCustomTemplate(propertyInfos) : undefined,
|
|
1742
2041
|
fieldLabel: propertyInfos ? manifestColumn.header : undefined,
|
|
@@ -1799,9 +2098,14 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1799
2098
|
aPersonalization.push("Sort");
|
|
1800
2099
|
aPersonalization.push("Column");
|
|
1801
2100
|
|
|
1802
|
-
if (
|
|
1803
|
-
|
|
1804
|
-
|
|
2101
|
+
if (converterContext.getTemplateType() === TemplateType.ListReport) {
|
|
2102
|
+
if (variantManagement === VariantManagementType.Control || _isFilterBarHidden(manifestWrapper, converterContext)) {
|
|
2103
|
+
// Feature parity with V2.
|
|
2104
|
+
// Enable table filtering by default only in case of Control level variant management.
|
|
2105
|
+
// Or when the LR filter bar is hidden via manifest setting
|
|
2106
|
+
aPersonalization.push("Filter");
|
|
2107
|
+
}
|
|
2108
|
+
} else {
|
|
1805
2109
|
aPersonalization.push("Filter");
|
|
1806
2110
|
}
|
|
1807
2111
|
|
|
@@ -1815,6 +2119,23 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1815
2119
|
|
|
1816
2120
|
return undefined;
|
|
1817
2121
|
}
|
|
2122
|
+
/**
|
|
2123
|
+
* Returns a boolean suggesting if a filter bar is being used on the page.
|
|
2124
|
+
*
|
|
2125
|
+
* Chart has a dependency to filter bar (issue with loading data). Once resolved, the check for chart should be removed here.
|
|
2126
|
+
* Until then, hiding filter bar is now allowed if a chart is being used on LR.
|
|
2127
|
+
*
|
|
2128
|
+
* @param {ManifestWrapper} manifestWrapper Manifest settings getter for the page
|
|
2129
|
+
* @param {ConverterContext} converterContext The instance of the converter context
|
|
2130
|
+
* @returns {boolean} Boolean suggesting if a filter bar is being used on the page.
|
|
2131
|
+
*/
|
|
2132
|
+
|
|
2133
|
+
|
|
2134
|
+
_exports.getP13nMode = getP13nMode;
|
|
2135
|
+
|
|
2136
|
+
function _isFilterBarHidden(manifestWrapper, converterContext) {
|
|
2137
|
+
return manifestWrapper.isFilterBarHidden() && !converterContext.getManifestWrapper().hasMultipleVisualizations() && converterContext.getTemplateType() !== TemplateType.AnalyticalListPage;
|
|
2138
|
+
}
|
|
1818
2139
|
/**
|
|
1819
2140
|
* Returns a JSON string containing the sort conditions for the presentation variant.
|
|
1820
2141
|
*
|
|
@@ -1825,8 +2146,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1825
2146
|
*/
|
|
1826
2147
|
|
|
1827
2148
|
|
|
1828
|
-
_exports.getP13nMode = getP13nMode;
|
|
1829
|
-
|
|
1830
2149
|
function getSortConditions(converterContext, presentationVariantAnnotation, columns) {
|
|
1831
2150
|
// Currently navigation property is not supported as sorter
|
|
1832
2151
|
var nonSortableProperties = getNonSortablePropertiesRestrictions(converterContext.getEntitySet());
|
|
@@ -1953,26 +2272,30 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1953
2272
|
var targetCapabilities = getCapabilityRestriction(converterContext);
|
|
1954
2273
|
var navigationTargetPath = getNavigationTargetPath(converterContext, navigationPropertyPath);
|
|
1955
2274
|
var navigationSettings = pageManifestSettings.getNavigationConfiguration(navigationTargetPath);
|
|
1956
|
-
|
|
1957
|
-
var
|
|
1958
|
-
|
|
2275
|
+
|
|
2276
|
+
var creationBehaviour = _getCreationBehaviour(lineItemAnnotation, tableManifestConfiguration, converterContext, navigationSettings);
|
|
2277
|
+
|
|
2278
|
+
var standardActionsContext = generateStandardActionsContext(converterContext, creationBehaviour.mode, tableManifestConfiguration, viewConfiguration);
|
|
2279
|
+
var deleteButtonVisibilityExpression = getDeleteVisibility(converterContext, standardActionsContext);
|
|
2280
|
+
var createButtonVisibilityExpression = getCreateVisibility(converterContext, standardActionsContext);
|
|
2281
|
+
var massEditButtonVisibilityExpression = getMassEditVisibility(converterContext, standardActionsContext);
|
|
2282
|
+
var isInsertUpdateTemplated = getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrStickySupported(converterContext), compileBinding(createButtonVisibilityExpression) === "false");
|
|
2283
|
+
var selectionMode = getSelectionMode(lineItemAnnotation, visualizationPath, converterContext, hasAbsolutePath, targetCapabilities, deleteButtonVisibilityExpression, massEditButtonVisibilityExpression);
|
|
1959
2284
|
var threshold = navigationPropertyPath ? 10 : 30;
|
|
1960
2285
|
|
|
1961
2286
|
if (presentationVariantAnnotation !== null && presentationVariantAnnotation !== void 0 && presentationVariantAnnotation.MaxItems) {
|
|
1962
2287
|
threshold = presentationVariantAnnotation.MaxItems.valueOf();
|
|
1963
2288
|
}
|
|
1964
2289
|
|
|
1965
|
-
var creationBehaviour = _getCreationBehaviour(lineItemAnnotation, tableManifestConfiguration, converterContext, navigationSettings);
|
|
1966
|
-
|
|
1967
2290
|
var variantManagement = pageManifestSettings.getVariantManagement();
|
|
1968
2291
|
var isSearchable = isPathSearchable(converterContext.getDataModelObjectPath());
|
|
1969
|
-
var
|
|
2292
|
+
var standardActions = {
|
|
1970
2293
|
create: getStandardActionCreate(converterContext, standardActionsContext),
|
|
1971
2294
|
"delete": getStandardActionDelete(converterContext, standardActionsContext),
|
|
1972
|
-
paste: getStandardActionPaste(converterContext, standardActionsContext),
|
|
1973
|
-
massEdit: getStandardActionMassEdit(converterContext, standardActionsContext,
|
|
2295
|
+
paste: getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateTemplated),
|
|
2296
|
+
massEdit: getStandardActionMassEdit(converterContext, standardActionsContext),
|
|
2297
|
+
creationRow: getCreationRow(converterContext, standardActionsContext)
|
|
1974
2298
|
};
|
|
1975
|
-
var isInsertUpdateTemplated = getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrStickySupported(converterContext), tableActions.create.visible === "false");
|
|
1976
2299
|
return {
|
|
1977
2300
|
id: id,
|
|
1978
2301
|
entityName: entitySet ? entitySet.name : "",
|
|
@@ -1981,13 +2304,14 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
1981
2304
|
row: _getRowConfigurationProperty(lineItemAnnotation, visualizationPath, converterContext, navigationSettings, navigationTargetPath),
|
|
1982
2305
|
p13nMode: p13nMode,
|
|
1983
2306
|
standardActions: {
|
|
1984
|
-
actions:
|
|
1985
|
-
isInsertUpdateTemplated: isInsertUpdateTemplated
|
|
2307
|
+
actions: standardActions,
|
|
2308
|
+
isInsertUpdateTemplated: isInsertUpdateTemplated,
|
|
2309
|
+
updatablePropertyPath: getCurrentEntitySetUpdatablePath(converterContext)
|
|
1986
2310
|
},
|
|
1987
2311
|
displayMode: isInDisplayMode(converterContext, viewConfiguration),
|
|
1988
2312
|
create: creationBehaviour,
|
|
1989
2313
|
selectionMode: selectionMode,
|
|
1990
|
-
autoBindOnInit: converterContext.getTemplateType() !== TemplateType.ListReport && converterContext.getTemplateType() !== TemplateType.AnalyticalListPage && !(viewConfiguration &&
|
|
2314
|
+
autoBindOnInit: _isFilterBarHidden(pageManifestSettings, converterContext) || converterContext.getTemplateType() !== TemplateType.ListReport && converterContext.getTemplateType() !== TemplateType.AnalyticalListPage && !(viewConfiguration && pageManifestSettings.hasMultipleVisualizations(viewConfiguration)),
|
|
1991
2315
|
variantManagement: variantManagement === "Control" && !p13nMode ? VariantManagementType.None : variantManagement,
|
|
1992
2316
|
threshold: threshold,
|
|
1993
2317
|
sortConditions: getSortConditions(converterContext, presentationVariantAnnotation, columns),
|
|
@@ -2038,17 +2362,6 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
2038
2362
|
|
|
2039
2363
|
return exportDataType;
|
|
2040
2364
|
}
|
|
2041
|
-
|
|
2042
|
-
function isInDisplayMode(converterContext, viewConfiguration) {
|
|
2043
|
-
var templateType = converterContext.getTemplateType();
|
|
2044
|
-
|
|
2045
|
-
if (templateType === TemplateType.ListReport || templateType === TemplateType.AnalyticalListPage || viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)) {
|
|
2046
|
-
return true;
|
|
2047
|
-
} // updatable will be handled at the property level
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
return false;
|
|
2051
|
-
}
|
|
2052
2365
|
/**
|
|
2053
2366
|
* Split the visualization path into the navigation property path and annotation.
|
|
2054
2367
|
*
|
|
@@ -2103,154 +2416,185 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
2103
2416
|
|
|
2104
2417
|
_exports.getSelectionVariantConfiguration = getSelectionVariantConfiguration;
|
|
2105
2418
|
|
|
2106
|
-
function
|
|
2107
|
-
var _tableSettings$
|
|
2419
|
+
function _getFullScreenBasedOnDevice(tableSettings, converterContext, isIphone) {
|
|
2420
|
+
var _tableSettings$enable;
|
|
2108
2421
|
|
|
2109
|
-
|
|
2110
|
-
var
|
|
2111
|
-
var tableSettings = tableManifestSettings && tableManifestSettings.tableSettings || {};
|
|
2112
|
-
var quickSelectionVariant;
|
|
2113
|
-
var quickFilterPaths = [];
|
|
2114
|
-
var enableExport = true;
|
|
2115
|
-
var creationMode = CreationMode.NewPage;
|
|
2116
|
-
var filters;
|
|
2117
|
-
var createAtEnd = true;
|
|
2118
|
-
var disableAddRowButtonForEmptyData = false;
|
|
2119
|
-
var customValidationFunction;
|
|
2120
|
-
var condensedTableLayout = false;
|
|
2121
|
-
var hideTableTitle = false;
|
|
2122
|
-
var tableType = "ResponsiveTable";
|
|
2123
|
-
var enableFullScreen = false;
|
|
2124
|
-
var selectionLimit = 200;
|
|
2125
|
-
var multiSelectMode;
|
|
2126
|
-
var enableAutoColumnWidth = !converterContext.getManifestWrapper().isPhone();
|
|
2127
|
-
var enablePaste = tableSettings.enablePaste !== undefined ? tableSettings.enablePaste : converterContext.getTemplateType() === "ObjectPage"; // Paste is disabled by default excepted for OP
|
|
2422
|
+
// If enableFullScreen is not set, use as default true on phone and false otherwise
|
|
2423
|
+
var enableFullScreen = (_tableSettings$enable = tableSettings.enableFullScreen) !== null && _tableSettings$enable !== void 0 ? _tableSettings$enable : isIphone; // Make sure that enableFullScreen is not set on ListReport for desktop or tablet
|
|
2128
2424
|
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2425
|
+
if (!isIphone && enableFullScreen && converterContext.getTemplateType() === TemplateType.ListReport) {
|
|
2426
|
+
enableFullScreen = false;
|
|
2427
|
+
converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, IssueType.FULLSCREENMODE_NOT_ON_LISTREPORT);
|
|
2428
|
+
}
|
|
2132
2429
|
|
|
2133
|
-
|
|
2134
|
-
|
|
2430
|
+
return enableFullScreen;
|
|
2431
|
+
}
|
|
2135
2432
|
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
var _tableSettings$quickV3;
|
|
2433
|
+
function _getMultiSelectMode(tableSettings, tableType, converterContext) {
|
|
2434
|
+
var multiSelectMode;
|
|
2139
2435
|
|
|
2140
|
-
|
|
2436
|
+
if (tableType !== "ResponsiveTable") {
|
|
2437
|
+
return undefined;
|
|
2438
|
+
}
|
|
2141
2439
|
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2440
|
+
switch (converterContext.getTemplateType()) {
|
|
2441
|
+
case TemplateType.ListReport:
|
|
2442
|
+
case TemplateType.AnalyticalListPage:
|
|
2443
|
+
multiSelectMode = !tableSettings.selectAll ? "ClearAll" : "Default";
|
|
2444
|
+
break;
|
|
2147
2445
|
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
enabled: converterContext.getTemplateType() === TemplateType.ListReport ? "{= ${pageInternal>hasPendingFilters} !== true}" : true,
|
|
2151
|
-
showCounts: tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV3 = tableSettings.quickVariantSelection) === null || _tableSettings$quickV3 === void 0 ? void 0 : _tableSettings$quickV3.showCounts,
|
|
2152
|
-
paths: quickFilterPaths
|
|
2153
|
-
}
|
|
2154
|
-
};
|
|
2155
|
-
});
|
|
2156
|
-
creationMode = ((_tableSettings$creati = tableSettings.creationMode) === null || _tableSettings$creati === void 0 ? void 0 : _tableSettings$creati.name) || creationMode;
|
|
2157
|
-
createAtEnd = ((_tableSettings$creati2 = tableSettings.creationMode) === null || _tableSettings$creati2 === void 0 ? void 0 : _tableSettings$creati2.createAtEnd) !== undefined ? (_tableSettings$creati3 = tableSettings.creationMode) === null || _tableSettings$creati3 === void 0 ? void 0 : _tableSettings$creati3.createAtEnd : true;
|
|
2158
|
-
customValidationFunction = (_tableSettings$creati4 = tableSettings.creationMode) === null || _tableSettings$creati4 === void 0 ? void 0 : _tableSettings$creati4.customValidationFunction; // if a custom validation function is provided, disableAddRowButtonForEmptyData should not be considered, i.e. set to false
|
|
2159
|
-
|
|
2160
|
-
disableAddRowButtonForEmptyData = !customValidationFunction ? !!((_tableSettings$creati5 = tableSettings.creationMode) !== null && _tableSettings$creati5 !== void 0 && _tableSettings$creati5.disableAddRowButtonForEmptyData) : false;
|
|
2161
|
-
condensedTableLayout = tableSettings.condensedTableLayout !== undefined ? tableSettings.condensedTableLayout : false;
|
|
2162
|
-
hideTableTitle = !!((_tableSettings$quickV4 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV4 !== void 0 && _tableSettings$quickV4.hideTableTitle);
|
|
2163
|
-
tableType = (tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) || "ResponsiveTable";
|
|
2164
|
-
|
|
2165
|
-
if (converterContext.getTemplateType() !== "ObjectPage") {
|
|
2166
|
-
if ((tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) === "AnalyticalTable" && !aggregationHelper.isAnalyticsSupported()) {
|
|
2167
|
-
tableType = "GridTable";
|
|
2168
|
-
}
|
|
2446
|
+
case TemplateType.ObjectPage:
|
|
2447
|
+
multiSelectMode = tableSettings.selectAll === false ? "ClearAll" : "Default";
|
|
2169
2448
|
|
|
2170
|
-
if (
|
|
2171
|
-
|
|
2172
|
-
tableType = "AnalyticalTable";
|
|
2173
|
-
} else {
|
|
2174
|
-
tableType = "ResponsiveTable";
|
|
2175
|
-
}
|
|
2449
|
+
if (converterContext.getManifestWrapper().useIconTabBar()) {
|
|
2450
|
+
multiSelectMode = !tableSettings.selectAll ? "ClearAll" : "Default";
|
|
2176
2451
|
}
|
|
2177
|
-
} // If enableFullScreen is not set, use as default true on phone and false otherwise
|
|
2178
2452
|
|
|
2453
|
+
break;
|
|
2179
2454
|
|
|
2180
|
-
|
|
2455
|
+
default:
|
|
2456
|
+
}
|
|
2181
2457
|
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
converterContext.getDiagnostics().addIssue(IssueCategory.Manifest, IssueSeverity.Low, IssueType.FULLSCREENMODE_NOT_ON_LISTREPORT);
|
|
2185
|
-
}
|
|
2458
|
+
return multiSelectMode;
|
|
2459
|
+
}
|
|
2186
2460
|
|
|
2187
|
-
|
|
2461
|
+
function _getTableType(tableSettings, aggregationHelper, converterContext) {
|
|
2462
|
+
var tableType = (tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) || "ResponsiveTable";
|
|
2188
2463
|
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2464
|
+
if (converterContext.getTemplateType() !== "ObjectPage") {
|
|
2465
|
+
if ((tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.type) === "AnalyticalTable" && !aggregationHelper.isAnalyticsSupported()) {
|
|
2466
|
+
tableType = "GridTable";
|
|
2467
|
+
}
|
|
2193
2468
|
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
}
|
|
2469
|
+
if (!(tableSettings !== null && tableSettings !== void 0 && tableSettings.type)) {
|
|
2470
|
+
if (converterContext.getManifestWrapper().isDesktop() && aggregationHelper.isAnalyticsSupported()) {
|
|
2471
|
+
tableType = "AnalyticalTable";
|
|
2472
|
+
} else {
|
|
2473
|
+
tableType = "ResponsiveTable";
|
|
2200
2474
|
}
|
|
2201
2475
|
}
|
|
2476
|
+
}
|
|
2202
2477
|
|
|
2203
|
-
|
|
2478
|
+
return tableType;
|
|
2479
|
+
}
|
|
2480
|
+
|
|
2481
|
+
function _getFilters(tableSettings, quickFilterPaths, quickSelectionVariant, path, converterContext) {
|
|
2482
|
+
var _tableSettings$quickV;
|
|
2483
|
+
|
|
2484
|
+
if (quickSelectionVariant) {
|
|
2485
|
+
quickFilterPaths.push({
|
|
2486
|
+
annotationPath: path.annotationPath
|
|
2487
|
+
});
|
|
2204
2488
|
}
|
|
2205
2489
|
|
|
2490
|
+
return {
|
|
2491
|
+
quickFilters: {
|
|
2492
|
+
enabled: converterContext.getTemplateType() === TemplateType.ListReport ? "{= ${pageInternal>hasPendingFilters} !== true}" : true,
|
|
2493
|
+
showCounts: tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV = tableSettings.quickVariantSelection) === null || _tableSettings$quickV === void 0 ? void 0 : _tableSettings$quickV.showCounts,
|
|
2494
|
+
paths: quickFilterPaths
|
|
2495
|
+
}
|
|
2496
|
+
};
|
|
2497
|
+
}
|
|
2498
|
+
|
|
2499
|
+
function _getEnableExport(tableSettings, converterContext, enablePaste) {
|
|
2500
|
+
return tableSettings.enableExport !== undefined ? tableSettings.enableExport : converterContext.getTemplateType() !== "ObjectPage" || enablePaste;
|
|
2501
|
+
}
|
|
2502
|
+
|
|
2503
|
+
function _getFilterConfiguration(tableSettings, lineItemAnnotation, converterContext) {
|
|
2504
|
+
var _tableSettings$quickV2, _tableSettings$quickV3, _tableSettings$quickV4;
|
|
2505
|
+
|
|
2506
|
+
if (!lineItemAnnotation) {
|
|
2507
|
+
return {};
|
|
2508
|
+
}
|
|
2509
|
+
|
|
2510
|
+
var quickFilterPaths = [];
|
|
2511
|
+
var targetEntityType = converterContext.getAnnotationEntityType(lineItemAnnotation);
|
|
2512
|
+
var quickSelectionVariant;
|
|
2513
|
+
var filters;
|
|
2514
|
+
tableSettings === null || tableSettings === void 0 ? void 0 : (_tableSettings$quickV2 = tableSettings.quickVariantSelection) === null || _tableSettings$quickV2 === void 0 ? void 0 : (_tableSettings$quickV3 = _tableSettings$quickV2.paths) === null || _tableSettings$quickV3 === void 0 ? void 0 : _tableSettings$quickV3.forEach(function (path) {
|
|
2515
|
+
quickSelectionVariant = targetEntityType.resolvePath("@" + path.annotationPath);
|
|
2516
|
+
filters = _getFilters(tableSettings, quickFilterPaths, quickSelectionVariant, path, converterContext);
|
|
2517
|
+
});
|
|
2518
|
+
var hideTableTitle = false;
|
|
2519
|
+
hideTableTitle = !!((_tableSettings$quickV4 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV4 !== void 0 && _tableSettings$quickV4.hideTableTitle);
|
|
2206
2520
|
return {
|
|
2207
2521
|
filters: filters,
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2522
|
+
headerVisible: !(quickSelectionVariant && hideTableTitle)
|
|
2523
|
+
};
|
|
2524
|
+
}
|
|
2525
|
+
|
|
2526
|
+
function getTableManifestConfiguration(lineItemAnnotation, visualizationPath, converterContext) {
|
|
2527
|
+
var _tableSettings$creati, _tableSettings$creati2, _tableSettings$creati3, _tableSettings$creati4, _tableSettings$creati5, _tableSettings$quickV5, _converterContext$get11;
|
|
2528
|
+
|
|
2529
|
+
var checkCondensedLayout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
2530
|
+
var tableManifestSettings = converterContext.getManifestControlConfiguration(visualizationPath);
|
|
2531
|
+
var tableSettings = tableManifestSettings && tableManifestSettings.tableSettings || {};
|
|
2532
|
+
var creationMode = CreationMode.NewPage;
|
|
2533
|
+
var enableAutoColumnWidth = !converterContext.getManifestWrapper().isPhone();
|
|
2534
|
+
var enablePaste = tableSettings.enablePaste !== undefined ? tableSettings.enablePaste : converterContext.getTemplateType() === "ObjectPage"; // Paste is disabled by default excepted for OP
|
|
2535
|
+
|
|
2536
|
+
var dataStateIndicatorFilter = converterContext.getTemplateType() === TemplateType.ListReport ? "API.dataStateIndicatorFilter" : undefined;
|
|
2537
|
+
var isCondensedTableLayoutCompliant = checkCondensedLayout && converterContext.getManifestWrapper().isCondensedLayoutCompliant();
|
|
2538
|
+
|
|
2539
|
+
var oFilterConfiguration = _getFilterConfiguration(tableSettings, lineItemAnnotation, converterContext);
|
|
2540
|
+
|
|
2541
|
+
var customValidationFunction = (_tableSettings$creati = tableSettings.creationMode) === null || _tableSettings$creati === void 0 ? void 0 : _tableSettings$creati.customValidationFunction;
|
|
2542
|
+
var entityType = converterContext.getEntityType();
|
|
2543
|
+
var aggregationHelper = new AggregationHelper(entityType, converterContext);
|
|
2544
|
+
|
|
2545
|
+
var tableType = _getTableType(tableSettings, aggregationHelper, converterContext);
|
|
2546
|
+
|
|
2547
|
+
var condensedTableLayout = tableSettings.condensedTableLayout !== undefined && tableType !== "ResponsiveTable" ? tableSettings.condensedTableLayout : false;
|
|
2548
|
+
var oConfiguration = {
|
|
2549
|
+
createAtEnd: ((_tableSettings$creati2 = tableSettings.creationMode) === null || _tableSettings$creati2 === void 0 ? void 0 : _tableSettings$creati2.createAtEnd) !== undefined ? (_tableSettings$creati3 = tableSettings.creationMode) === null || _tableSettings$creati3 === void 0 ? void 0 : _tableSettings$creati3.createAtEnd : true,
|
|
2550
|
+
creationMode: ((_tableSettings$creati4 = tableSettings.creationMode) === null || _tableSettings$creati4 === void 0 ? void 0 : _tableSettings$creati4.name) || creationMode,
|
|
2215
2551
|
customValidationFunction: customValidationFunction,
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2552
|
+
dataStateIndicatorFilter: dataStateIndicatorFilter,
|
|
2553
|
+
// if a custom validation function is provided, disableAddRowButtonForEmptyData should not be considered, i.e. set to false
|
|
2554
|
+
disableAddRowButtonForEmptyData: !customValidationFunction ? !!((_tableSettings$creati5 = tableSettings.creationMode) !== null && _tableSettings$creati5 !== void 0 && _tableSettings$creati5.disableAddRowButtonForEmptyData) : false,
|
|
2555
|
+
enableAutoColumnWidth: enableAutoColumnWidth,
|
|
2556
|
+
enableExport: _getEnableExport(tableSettings, converterContext, enablePaste),
|
|
2557
|
+
enableFullScreen: _getFullScreenBasedOnDevice(tableSettings, converterContext, converterContext.getManifestWrapper().isPhone()),
|
|
2558
|
+
enableMassEdit: tableSettings === null || tableSettings === void 0 ? void 0 : tableSettings.enableMassEdit,
|
|
2219
2559
|
enablePaste: enablePaste,
|
|
2560
|
+
headerVisible: true,
|
|
2561
|
+
multiSelectMode: _getMultiSelectMode(tableSettings, tableType, converterContext),
|
|
2562
|
+
selectionLimit: tableSettings.selectAll === true || tableSettings.selectionLimit === 0 ? 0 : tableSettings.selectionLimit || 200,
|
|
2220
2563
|
showRowCount: !(tableSettings !== null && tableSettings !== void 0 && (_tableSettings$quickV5 = tableSettings.quickVariantSelection) !== null && _tableSettings$quickV5 !== void 0 && _tableSettings$quickV5.showCounts) && !((_converterContext$get11 = converterContext.getManifestWrapper().getViewConfiguration()) !== null && _converterContext$get11 !== void 0 && _converterContext$get11.showCounts),
|
|
2221
|
-
|
|
2222
|
-
|
|
2564
|
+
type: tableType,
|
|
2565
|
+
useCondensedTableLayout: condensedTableLayout && isCondensedTableLayoutCompliant
|
|
2223
2566
|
};
|
|
2567
|
+
return _objectSpread(_objectSpread({}, oConfiguration), oFilterConfiguration);
|
|
2224
2568
|
}
|
|
2225
2569
|
|
|
2226
2570
|
_exports.getTableManifestConfiguration = getTableManifestConfiguration;
|
|
2227
2571
|
|
|
2228
2572
|
function getTypeConfig(oProperty, dataType) {
|
|
2229
|
-
var _targetType, _propertyTypeConfig$t, _propertyTypeConfig$t2, _propertyTypeConfig$t3, _propertyTypeConfig$t4;
|
|
2573
|
+
var _targetType, _oTargetMapping, _propertyTypeConfig$t, _propertyTypeConfig$t2, _propertyTypeConfig$t3, _propertyTypeConfig$t4;
|
|
2230
2574
|
|
|
2231
2575
|
var oTargetMapping = EDM_TYPE_MAPPING[oProperty === null || oProperty === void 0 ? void 0 : oProperty.type] || (dataType ? EDM_TYPE_MAPPING[dataType] : undefined);
|
|
2232
2576
|
|
|
2233
|
-
if (!oTargetMapping && oProperty.targetType && ((_targetType = oProperty.targetType) === null || _targetType === void 0 ? void 0 : _targetType._type) === "TypeDefinition") {
|
|
2577
|
+
if (!oTargetMapping && oProperty !== null && oProperty !== void 0 && oProperty.targetType && ((_targetType = oProperty.targetType) === null || _targetType === void 0 ? void 0 : _targetType._type) === "TypeDefinition") {
|
|
2234
2578
|
oTargetMapping = EDM_TYPE_MAPPING[oProperty.targetType.underlyingType];
|
|
2235
2579
|
}
|
|
2236
2580
|
|
|
2237
2581
|
var propertyTypeConfig = {
|
|
2238
|
-
type: oTargetMapping.type,
|
|
2582
|
+
type: (_oTargetMapping = oTargetMapping) === null || _oTargetMapping === void 0 ? void 0 : _oTargetMapping.type,
|
|
2239
2583
|
constraints: {},
|
|
2240
2584
|
formatOptions: {}
|
|
2241
2585
|
};
|
|
2242
2586
|
|
|
2243
2587
|
if (isProperty(oProperty)) {
|
|
2244
|
-
var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$
|
|
2588
|
+
var _oTargetMapping$const, _oTargetMapping$const2, _oTargetMapping$const3, _oTargetMapping$const4, _oTargetMapping$const5, _oProperty$annotation6, _oProperty$annotation7, _oProperty$annotation8, _oProperty$annotation9, _oTargetMapping$const6, _oProperty$annotation10, _oProperty$annotation11, _oProperty$annotation12, _oProperty$annotation13, _oTargetMapping$const7, _annotations4, _annotations4$Common;
|
|
2245
2589
|
|
|
2246
2590
|
propertyTypeConfig.constraints = {
|
|
2247
2591
|
scale: (_oTargetMapping$const = oTargetMapping.constraints) !== null && _oTargetMapping$const !== void 0 && _oTargetMapping$const.$Scale ? oProperty.scale : undefined,
|
|
2248
2592
|
precision: (_oTargetMapping$const2 = oTargetMapping.constraints) !== null && _oTargetMapping$const2 !== void 0 && _oTargetMapping$const2.$Precision ? oProperty.precision : undefined,
|
|
2249
2593
|
maxLength: (_oTargetMapping$const3 = oTargetMapping.constraints) !== null && _oTargetMapping$const3 !== void 0 && _oTargetMapping$const3.$MaxLength ? oProperty.maxLength : undefined,
|
|
2250
2594
|
nullable: (_oTargetMapping$const4 = oTargetMapping.constraints) !== null && _oTargetMapping$const4 !== void 0 && _oTargetMapping$const4.$Nullable ? oProperty.nullable : undefined,
|
|
2251
|
-
minimum: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$
|
|
2252
|
-
maximum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$
|
|
2253
|
-
isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (
|
|
2595
|
+
minimum: (_oTargetMapping$const5 = oTargetMapping.constraints) !== null && _oTargetMapping$const5 !== void 0 && _oTargetMapping$const5["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN((_oProperty$annotation6 = oProperty.annotations) === null || _oProperty$annotation6 === void 0 ? void 0 : (_oProperty$annotation7 = _oProperty$annotation6.Validation) === null || _oProperty$annotation7 === void 0 ? void 0 : _oProperty$annotation7.Minimum) ? "".concat((_oProperty$annotation8 = oProperty.annotations) === null || _oProperty$annotation8 === void 0 ? void 0 : (_oProperty$annotation9 = _oProperty$annotation8.Validation) === null || _oProperty$annotation9 === void 0 ? void 0 : _oProperty$annotation9.Minimum) : undefined,
|
|
2596
|
+
maximum: (_oTargetMapping$const6 = oTargetMapping.constraints) !== null && _oTargetMapping$const6 !== void 0 && _oTargetMapping$const6["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN((_oProperty$annotation10 = oProperty.annotations) === null || _oProperty$annotation10 === void 0 ? void 0 : (_oProperty$annotation11 = _oProperty$annotation10.Validation) === null || _oProperty$annotation11 === void 0 ? void 0 : _oProperty$annotation11.Maximum) ? "".concat((_oProperty$annotation12 = oProperty.annotations) === null || _oProperty$annotation12 === void 0 ? void 0 : (_oProperty$annotation13 = _oProperty$annotation12.Validation) === null || _oProperty$annotation13 === void 0 ? void 0 : _oProperty$annotation13.Maximum) : undefined,
|
|
2597
|
+
isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && (_oTargetMapping$const7 = oTargetMapping.constraints) !== null && _oTargetMapping$const7 !== void 0 && _oTargetMapping$const7["@com.sap.vocabularies.Common.v1.IsDigitSequence"] && (_annotations4 = oProperty.annotations) !== null && _annotations4 !== void 0 && (_annotations4$Common = _annotations4.Common) !== null && _annotations4$Common !== void 0 && _annotations4$Common.IsDigitSequence ? true : undefined
|
|
2254
2598
|
};
|
|
2255
2599
|
}
|
|
2256
2600
|
|
|
@@ -2265,4 +2609,4 @@ sap.ui.define(["../../ManifestSettings", "../../helpers/ID", "sap/fe/core/conver
|
|
|
2265
2609
|
_exports.getTypeConfig = getTypeConfig;
|
|
2266
2610
|
return _exports;
|
|
2267
2611
|
}, false);
|
|
2268
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sIm5hbWVzIjpbIkNvbHVtblR5cGUiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJhVGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsImFBbm5vdGF0aW9uQWN0aW9ucyIsInRhYmxlQWN0aW9ucyIsImFIaWRkZW5BY3Rpb25zIiwiaGlkZGVuVGFibGVBY3Rpb25zIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJnZXRBY3Rpb25zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImFjdGlvbnMiLCJpc05hdmlnYWJsZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJnZXRUYWJsZUNvbHVtbnMiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiY29sdW1ucyIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwid2lkdGgiLCJhdmFpbGFiaWxpdHkiLCJzZXR0aW5ncyIsImhvcml6b250YWxBbGlnbiIsImZvcm1hdE9wdGlvbnMiLCJnZXRBZ2dyZWdhdGVEZWZpbml0aW9uc0Zyb21FbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJmaW5kQ29sdW1uRnJvbVBhdGgiLCJwYXRoIiwiZmluZCIsImNvbHVtbiIsImFubm90YXRpb25Db2x1bW4iLCJwcm9wZXJ0eUluZm9zIiwidW5kZWZpbmVkIiwicmVsYXRpdmVQYXRoIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzIiwiU2V0IiwiZm9yRWFjaCIsIm9Db2x1bW4iLCJvVGFibGVDb2x1bW4iLCJ1bml0IiwiYWRkIiwiYUN1c3RvbUFnZ3JlZ2F0ZUFubm90YXRpb25zIiwiZ2V0Q3VzdG9tQWdncmVnYXRlRGVmaW5pdGlvbnMiLCJtUmF3RGVmaW5pdGlvbnMiLCJhbm5vdGF0aW9uIiwib0FnZ3JlZ2F0ZWRQcm9wZXJ0eSIsIl9lbnRpdHlUeXBlIiwiZW50aXR5UHJvcGVydGllcyIsIm9Qcm9wZXJ0eSIsIm5hbWUiLCJxdWFsaWZpZXIiLCJhQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsImFubm90YXRpb25zIiwiQWdncmVnYXRpb24iLCJDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwibWFwIiwib0N0eERlZlByb3BlcnR5IiwidmFsdWUiLCJtUmVzdWx0IiwiYVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJoYXMiLCJpc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eSIsImRlZmF1bHRBZ2dyZWdhdGUiLCJjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUiLCJwdXNoIiwibGVuZ3RoIiwiY29udGV4dERlZmluaW5nUHJvcGVydGllcyIsInVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyIsInRhYmxlVmlzdWFsaXphdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY29udHJvbCIsInR5cGUiLCJhZ2dyZWdhdGVzRGVmaW5pdGlvbnMiLCJlbmFibGVBbmFseXRpY3MiLCJhZ2dyZWdhdGVzIiwiYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyIsImdldEFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJlbmFibGVBbmFseXRpY3NTZWFyY2giLCJpbmRleE9mIiwiZ3JvdXBDb25kaXRpb25zIiwiZ2V0R3JvdXBDb25kaXRpb25zIiwiYWdncmVnYXRlQ29uZGl0aW9ucyIsImdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbiIsIm5hdkNvbmZpZyIsIk9iamVjdCIsImtleXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImNvbnRleHRQYXRoIiwiZ2V0Q29udGV4dFBhdGgiLCJuYXZDb25maWdGb3JDb250ZXh0UGF0aCIsInRhcmdldEVudGl0eVNldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwidXBkYXRlTGlua2VkUHJvcGVydGllcyIsImZpbmRDb2x1bW5CeVBhdGgiLCJvUHJvcCIsInNVbml0IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5Iiwib1VuaXRDb2x1bW4iLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dEFubm90YXRpb24iLCJDb21tb24iLCJUZXh0IiwiaXNQYXRoRXhwcmVzc2lvbiIsIm9UZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsImNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbiIsImlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQiLCJ2aWV3Q29uZmlndXJhdGlvbiIsInRhYmxlTWFuaWZlc3RDb25maWciLCJnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsInNwbGl0UGF0aCIsIm5hdmlnYXRpb25UYXJnZXRQYXRoIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwib1Zpc3VhbGl6YXRpb24iLCJWaXN1YWxpemF0aW9uVHlwZSIsIlRhYmxlIiwiZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbiIsInJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMiLCJlbmFibGVEYXRhU3RhdGVGaWx0ZXIiLCJnZXRUZW1wbGF0ZVR5cGUiLCJKU09OIiwic3RyaW5naWZ5Iiwib3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyIsImdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJjcmVhdGVEZWZhdWx0VGFibGVWaXN1YWxpemF0aW9uIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZSIsImFkZFRvTWFwIiwia2V5IiwiZGF0YUZpZWxkIiwiJFR5cGUiLCJhY3Rpb25OYW1lIiwiQWN0aW9uIiwiRGV0ZXJtaW5pbmciLCJhY3Rpb25UYXJnZXQiLCJBY3Rpb25UYXJnZXQiLCJDb3JlIiwiT3BlcmF0aW9uQXZhaWxhYmxlIiwicGFyYW1ldGVycyIsImJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRhcmdldEV4cHJlc3Npb24iLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsImJpbmRpbmdDb250ZXh0UGF0aFZpc2l0b3IiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lIiwic2l6ZSIsInRpdGxlUHJvcGVydHkiLCJVSSIsIkhlYWRlckluZm8iLCJUaXRsZSIsIlZhbHVlIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbnRpdHlTZXQiLCJhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMiLCJpc0JvdW5kIiwic291cmNlRW50aXR5VHlwZSIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsInZhbHVlT2YiLCJIaWRkZW4iLCJlcXVhbCIsImdldEJpbmRpbmdFeHBGcm9tQ29udGV4dCIsInNvdXJjZSIsInNFeHByZXNzaW9uIiwidmlzaWJsZSIsInNQYXRoIiwic3Vic3RyaW5nIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic05hdmlnYXRpb25QYXRoIiwidGFyZ2V0T2JqZWN0IiwiX3R5cGUiLCJwYXJ0bmVyIiwiYmluZGluZ0V4cHJlc3Npb24iLCJzbGljZSIsImNvbnN0YW50IiwiaGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsInNvbWUiLCJoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhciIsIm1hbmlmZXN0QWN0aW9ucyIsImFjdGlvbktleSIsImFjdGlvbiIsInJlcXVpcmVzU2VsZWN0aW9uIiwidG9TdHJpbmciLCJnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJhVmlzaWJsZVBhdGhFeHByZXNzaW9ucyIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwiZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uIiwiaXNEZWxldGFibGUiLCJpc1BhdGhEZWxldGFibGUiLCJpc1VwZGF0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzQ29uc3RhbnQiLCJnZXRTZWxlY3Rpb25Nb2RlIiwidGFyZ2V0Q2FwYWJpbGl0aWVzIiwiaXNEZWxldGVCdXR0b25WaXNpYmxlIiwiU2VsZWN0aW9uTW9kZSIsIk5vbmUiLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJzZWxlY3Rpb25Nb2RlIiwidGFibGVTZXR0aW5ncyIsImFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMiLCJhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyIsImlzUGFyZW50RGVsZXRhYmxlIiwicGFyZW50RW50aXR5U2V0RGVsZXRhYmxlIiwiVGVtcGxhdGVUeXBlIiwiT2JqZWN0UGFnZSIsImNvbXBpbGVCaW5kaW5nIiwiaWZFbHNlIiwiQXV0byIsIk11bHRpIiwiYW5kIiwib3IiLCJjb25jYXQiLCJ0YWJsZUFjdGlvbiIsImlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJBY3Rpb25UeXBlIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwibm90IiwiZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbiIsIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiIsIkRlZmF1bHQiLCJnZXRIaWdobGlnaHRSb3dCaW5kaW5nIiwiY3JpdGljYWxpdHlBbm5vdGF0aW9uIiwiaXNEcmFmdFJvb3QiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24iLCJNZXNzYWdlVHlwZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJJbmZvcm1hdGlvbiIsImZvcm1hdFJlc3VsdCIsInRhYmxlRm9ybWF0dGVycyIsInJvd0hpZ2hsaWdodGluZyIsIl9nZXRDcmVhdGlvbkJlaGF2aW91ciIsInRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwibmF2aWdhdGlvbiIsImNyZWF0ZSIsImRldGFpbCIsImlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsIm5ld0FjdGlvbiIsInRhcmdldEFubm90YXRpb25zIiwiZ2V0RW50aXR5U2V0IiwiRHJhZnRSb290IiwiTmV3QWN0aW9uIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIkVycm9yIiwicm91dGUiLCJhcHBlbmQiLCJjcmVhdGVBdEVuZCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJOZXdQYWdlIiwiX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJwcmVzc1Byb3BlcnR5IiwibmF2aWdhdGlvblRhcmdldCIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJkaXNwbGF5IiwidGFyZ2V0IiwiQ3JpdGljYWxpdHkiLCJEcmFmdE5vZGUiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwicHJlc3MiLCJyb3dOYXZpZ2F0ZWQiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJ0YWJsZVR5cGUiLCJwcm9wZXJ0eSIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsInNlbWFudGljS2V5cyIsImdldEFubm90YXRpb25zQnlUZXJtIiwib0NvbHVtbkRyYWZ0SW5kaWNhdG9yIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzVGVtcGxhdGUiLCJ3cmFwIiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSIsImV4cG9ydFR5cGUiLCJfZ2V0RXhwb3J0RGF0YVR5cGUiLCJzRGF0ZUlucHV0Rm9ybWF0IiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJvVHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsIm9Gb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaW5wdXRGb3JtYXQiLCJzY2FsZSIsImRlbGltaXRlciIsInRydWVWYWx1ZSIsImZhbHNlVmFsdWUiLCJpc0dyb3VwYWJsZSIsImlzUHJvcGVydHlHcm91cGFibGUiLCJBbm5vdGF0aW9uIiwibGFiZWwiLCJfZ2V0TGFiZWwiLCJncm91cExhYmVsIiwiZ3JvdXAiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJBdmFpbGFiaWxpdHlUeXBlIiwiQWRhcHRhdGlvbiIsIkRhdGFGaWVsZERlZmF1bHQiLCJUYXJnZXQiLCIkdGFyZ2V0Iiwic29ydGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJ0eXBlQ29uZmlnIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwic1Rvb2x0aXAiLCJfZ2V0VG9vbHRpcCIsInRvb2x0aXAiLCJfaXNWYWxpZENvbHVtbiIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInJldHVybkV4cHJlc3Npb24iLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImlzQW5hbHl0aWNzIiwiSXNFeHBhbmRlZCIsImlzQW5hbHl0aWNhbExlYWYiLCJOb2RlTGV2ZWwiLCJleHByZXNzaW9uIiwiX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImRhdGFGaWVsZEdyb3VwIiwiZmllbGRGb3JtYXRPcHRpb25zIiwiYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsIkRhdGEiLCJpbm5lckRhdGFGaWVsZCIsImlzUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZENvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsIm9Db2x1bW5zIiwiYUNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsImlzTGFzdFNsYXNoIiwiaXNMYXN0UGFydCIsImlTbGFzaEluZGV4IiwibGFzdEluZGV4T2YiLCJfaXNDb2x1bW5Tb3J0YWJsZSIsInByb3BlcnR5UGF0aCIsImlzU29ydGFibGUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJGaWx0ZXJGdW5jdGlvbnMiLCJnZXRFbnRpdHlDb250YWluZXIiLCJpc0FycmF5IiwiZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSIsInRleHRMaW5lc0VkaXQiLCJiU2VtYW50aWNLZXlGb3VuZCIsImFTZW1hbnRpY0tleVZhbHVlcyIsImkiLCJoYXNEcmFmdEluZGljYXRvciIsInNlbWFudGlja2V5cyIsImdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImxpbmVJdGVtIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJzTGFiZWwiLCJpc0ZpZWxkR3JvdXBDb2x1bW4iLCJmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJ2aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCIsImV4Y2x1ZGVQcm9wZXJ0aWVzIiwid2lkdGhPdmVycmlkZSIsIkZFIiwiU2l0dWF0aW9ucyIsIkZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImV4cG9ydENvbnRhY3RQcm9wZXJ0eSIsImV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5IiwiX2dldFByb3BlcnR5TmFtZXMiLCJtYXRjaGVkUHJvcGVydGllcyIsInJlc29sdmVQYXRoIiwiX2FwcGVuZEN1c3RvbVRlbXBsYXRlIiwiX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUiLCJkZWZhdWx0VmFsdWUiLCJpc0Fubm90YXRpb25Db2x1bW4iLCJpbnRlcm5hbENvbHVtbnMiLCJtYW5pZmVzdENvbHVtbiIsInZhbGlkYXRlS2V5IiwiTWVzc2FnZSIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVDYXRlZ29yeVR5cGUiLCJBbm5vdGF0aW9uQ29sdW1ucyIsIkludmFsaWRLZXkiLCJpZCIsImhlYWRlciIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiU2xvdCIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJpc0FjdGlvbk5hdmlnYWJsZSIsImZpZWxkTGFiZWwiLCJnZXRQMTNuTW9kZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiZ2V0VmFyaWFudE1hbmFnZW1lbnQiLCJhUGVyc29uYWxpemF0aW9uIiwiYkFuYWx5dGljYWxUYWJsZSIsInBlcnNvbmFsaXphdGlvbiIsInNvcnQiLCJmaWx0ZXIiLCJhZ2dyZWdhdGUiLCJWYXJpYW50TWFuYWdlbWVudFR5cGUiLCJDb250cm9sIiwiZ2V0U29ydENvbmRpdGlvbnMiLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJzb3J0Q29uZGl0aW9ucyIsIlNvcnRPcmRlciIsInNvcnRlcnMiLCJjb25kaXRpb25zIiwiY29uZGl0aW9uIiwiY29uZGl0aW9uUHJvcGVydHkiLCJQcm9wZXJ0eSIsImluZm9OYW1lIiwiY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwicGF0aHMiLCJpbmZvTmFtZXMiLCJjdXJyZW50UGF0aCIsIkdyb3VwQnkiLCJhR3JvdXBCeSIsImFHcm91cExldmVscyIsImdyb3VwTGV2ZWxzIiwiVG90YWwiLCJhVG90YWxzIiwidGl0bGUiLCJUeXBlTmFtZVBsdXJhbCIsImVudGl0eVNldCIsInBhZ2VNYW5pZmVzdFNldHRpbmdzIiwiaGFzQWJzb2x1dGVQYXRoIiwicDEzbk1vZGUiLCJUYWJsZUlEIiwic3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCIsImdldERlbGV0ZVZpc2liaWxpdHkiLCJ0aHJlc2hvbGQiLCJNYXhJdGVtcyIsImNyZWF0aW9uQmVoYXZpb3VyIiwiaXNTZWFyY2hhYmxlIiwiaXNQYXRoU2VhcmNoYWJsZSIsImdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlIiwiZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUiLCJwYXN0ZSIsImdldFN0YW5kYXJkQWN0aW9uUGFzdGUiLCJtYXNzRWRpdCIsImdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQiLCJpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCIsImdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nIiwiaXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkIiwiZW50aXR5TmFtZSIsImNvbGxlY3Rpb24iLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwibmF2aWdhdGlvblBhdGgiLCJyb3ciLCJzdGFuZGFyZEFjdGlvbnMiLCJpc0luRGlzcGxheU1vZGUiLCJhdXRvQmluZE9uSW5pdCIsIkxpc3RSZXBvcnQiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJoYXNNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwic2VhcmNoYWJsZSIsImlzQ29tcGxleFByb3BlcnR5IiwiZXhwb3J0RGF0YVR5cGUiLCJ0ZW1wbGF0ZVR5cGUiLCJzdWJzdHIiLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInNlbGVjdGlvblZhcmlhbnRQYXRoIiwicmVzb2x2ZWRUYXJnZXQiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsInNlbGVjdGlvbiIsInByb3BlcnR5TmFtZXMiLCJTZWxlY3RPcHRpb25zIiwic2VsZWN0T3B0aW9uIiwiUHJvcGVydHlOYW1lIiwiUHJvcGVydHlQYXRoIiwidGV4dCIsImNoZWNrQ29uZGVuc2VkTGF5b3V0IiwicXVpY2tTZWxlY3Rpb25WYXJpYW50IiwicXVpY2tGaWx0ZXJQYXRocyIsImVuYWJsZUV4cG9ydCIsImZpbHRlcnMiLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY29uZGVuc2VkVGFibGVMYXlvdXQiLCJoaWRlVGFibGVUaXRsZSIsImVuYWJsZUZ1bGxTY3JlZW4iLCJzZWxlY3Rpb25MaW1pdCIsIm11bHRpU2VsZWN0TW9kZSIsImVuYWJsZUF1dG9Db2x1bW5XaWR0aCIsImlzUGhvbmUiLCJlbmFibGVQYXN0ZSIsImlzQ29uZGVuc2VkTGF5b3V0Q29tcGxpYW50IiwicXVpY2tWYXJpYW50U2VsZWN0aW9uIiwicXVpY2tGaWx0ZXJzIiwic2hvd0NvdW50cyIsImlzRGVza3RvcCIsIklzc3VlVHlwZSIsIkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsImhlYWRlclZpc2libGUiLCJ1c2VDb25kZW5zZWRUYWJsZUxheW91dCIsInNob3dSb3dDb3VudCIsImdldFZpZXdDb25maWd1cmF0aW9uIiwiZW5hYmxlTWFzc0VkaXQiLCJvVGFyZ2V0TWFwcGluZyIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwicGFyc2VBc1N0cmluZyIsImVtcHR5U3RyaW5nIiwi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a0MsZ0NBQWxDLE9BQXdFLENBRHhFLEdBRUcsS0FGSCxHQUdHL0MsU0FMOEI7QUFNbEMrakIsTUFBQUEsV0FBVyxFQUNWLENBQUFsUixrQkFBa0IsU0FBbEIsSUFBQUEsa0JBQWtCLFdBQWxCLHNDQUFBQSxrQkFBa0IsQ0FBRXJRLElBQXBCLGtGQUEwQk8sT0FBMUIsQ0FBa0MsNkJBQWxDLE9BQXFFLENBQXJFLElBQ0EsQ0FBQThQLGtCQUFrQixTQUFsQixJQUFBQSxrQkFBa0IsV0FBbEIsc0NBQUFBLGtCQUFrQixDQUFFclEsSUFBcEIsa0ZBQTBCTyxPQUExQixDQUFrQyxnQ0FBbEMsT0FBd0UsQ0FEeEUsR0FFRyxFQUZILEdBR0cvQyxTQVY4QjtBQVdsQ2drQixNQUFBQSxxQkFBcUIsRUFBRW5SLGtCQUFrQixDQUFDclEsSUFBbkIsS0FBNEIsZ0NBQTVCLEdBQStELElBQS9ELEdBQXNFeEM7QUFYM0QsS0FBbkM7QUFhQSxXQUFPNlMsa0JBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEVudW1WYWx1ZSxcblx0TGluZUl0ZW0sXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0UHJvcGVydHlQYXRoLFxuXHRTZWxlY3Rpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0VUlBbm5vdGF0aW9uVHlwZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRIb3Jpem9udGFsQWxpZ24sXG5cdE1hbmlmZXN0VGFibGVDb2x1bW4sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpZXdQYXRoQ29uZmlndXJhdGlvbixcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IEVudGl0eVR5cGUsIFByb3BlcnR5LCBUeXBlRGVmaW5pdGlvbiB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBUYWJsZUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7XG5cdEFubm90YXRpb25BY3Rpb24sXG5cdEJhc2VBY3Rpb24sXG5cdEN1c3RvbUFjdGlvbixcblx0Z2V0QWN0aW9uc0Zyb21NYW5pZmVzdCxcblx0aXNBY3Rpb25OYXZpZ2FibGUsXG5cdHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGlzRGF0YUZpZWxkQWx3YXlzSGlkZGVuLFxuXHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0LFxuXHRpc0RhdGFGaWVsZFR5cGVzXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QmluZGluZ0V4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0JpbmRpbmdIZWxwZXJcIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyVHlwZXNcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aERlbGV0YWJsZSxcblx0aXNQYXRoU2VhcmNoYWJsZSxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlLCBJc3N1ZUNhdGVnb3J5VHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5cbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcIi4uLy4uL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGlzUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRpc1BhdGhFeHByZXNzaW9uLFxuXHRnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBEaXNwbGF5TW9kZSwgRURNX1RZUEVfTUFQUElORywgZ2V0RGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7IEZpbHRlckZ1bmN0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB7IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2VuZXJhdGVTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCxcblx0U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlLFxuXHRnZXREZWxldGVWaXNpYmlsaXR5LFxuXHRnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSxcblx0Z2V0U3RhbmRhcmRBY3Rpb25EZWxldGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uUGFzdGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQsXG5cdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCxcblx0Z2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmdcbn0gZnJvbSBcIi4vdGFibGUvU3RhbmRhcmRBY3Rpb25zXCI7XG5cbmV4cG9ydCB0eXBlIFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG5cdGF1dG9CaW5kT25Jbml0OiBib29sZWFuO1xuXHRjb2xsZWN0aW9uOiBzdHJpbmc7XG5cdHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGU7XG5cdGZpbHRlcklkPzogc3RyaW5nO1xuXHRpZDogc3RyaW5nO1xuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nO1xuXHRwMTNuTW9kZT86IHN0cmluZztcblx0cm93Pzoge1xuXHRcdGFjdGlvbj86IHN0cmluZztcblx0XHRwcmVzcz86IHN0cmluZztcblx0XHRyb3dIaWdobGlnaHRpbmc6IEJpbmRpbmdFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHRyb3dOYXZpZ2F0ZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHRzZWxlY3Rpb25Nb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZT47XG5cdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGJvb2xlYW47XG5cdH07XG5cdGRpc3BsYXlNb2RlPzogYm9vbGVhbjtcblx0dGhyZXNob2xkOiBudW1iZXI7XG5cdGVudGl0eU5hbWU6IHN0cmluZztcblx0c29ydENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGdyb3VwQ29uZGl0aW9ucz86IHN0cmluZztcblx0YWdncmVnYXRlQ29uZGl0aW9ucz86IHN0cmluZztcblxuXHQvKiogQ3JlYXRlIG5ldyBlbnRyaWVzICovXG5cdGNyZWF0ZTogQ3JlYXRlQmVoYXZpb3VyIHwgQ3JlYXRlQmVoYXZpb3VyRXh0ZXJuYWw7XG5cdHRpdGxlOiBzdHJpbmc7XG5cdHNlYXJjaGFibGU6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIE5ldyBlbnRyaWVzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYXBwIChkZWZhdWx0IGNhc2UpXG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyID0ge1xuXHRtb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGFwcGVuZDogQm9vbGVhbjtcblx0bmV3QWN0aW9uPzogc3RyaW5nO1xuXHRuYXZpZ2F0ZVRvVGFyZ2V0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBOZXcgZW50cmllcyBhcmUgY3JlYXRlZCBieSBuYXZpZ2F0aW5nIHRvIHNvbWUgdGFyZ2V0XG4gKi9cbnR5cGUgQ3JlYXRlQmVoYXZpb3VyRXh0ZXJuYWwgPSB7XG5cdG1vZGU6IFwiRXh0ZXJuYWxcIjtcblx0b3V0Ym91bmQ6IHN0cmluZztcblx0b3V0Ym91bmREZXRhaWw6IE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uW1wib3V0Ym91bmREZXRhaWxcIl07XG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uID0ge1xuXHRpc0RlbGV0YWJsZTogYm9vbGVhbjtcblx0aXNVcGRhdGFibGU6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uID0ge1xuXHRlbmFibGVkPzogc3RyaW5nIHwgYm9vbGVhbjtcblx0cGF0aHM6IFtcblx0XHR7XG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdH1cblx0XTtcblx0c2hvd0NvdW50cz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRjcmVhdGVBdEVuZDogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6IGJvb2xlYW47XG5cdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogYm9vbGVhbjtcblx0ZW5hYmxlRXhwb3J0OiBib29sZWFuO1xuXHRoZWFkZXJWaXNpYmxlOiBib29sZWFuO1xuXHRmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbj47XG5cdHR5cGU6IFRhYmxlVHlwZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGVuYWJsZU1hc3NFZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiIHwgXCJSZXNwb25zaXZlVGFibGVcIiB8IFwiQW5hbHl0aWNhbFRhYmxlXCI7XG5cbmVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlXG5cdEFubm90YXRpb24gPSBcIkFubm90YXRpb25cIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmV4cG9ydCB0eXBlIEJhc2VUYWJsZUNvbHVtbiA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0aWQ6IHN0cmluZztcblx0d2lkdGg/OiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0YXZhaWxhYmlsaXR5PzogQXZhaWxhYmlsaXR5VHlwZTtcblx0dHlwZTogQ29sdW1uVHlwZTsgLy9PcmlnaW4gb2YgdGhlIHNvdXJjZSB3aGVyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgdGVtcGxhdGVkIGluZm9ybWF0aW9uIGZyb20sXG5cdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0c2V0dGluZ3M/OiBUYWJsZUNvbHVtblNldHRpbmdzO1xuXHRzZW1hbnRpY09iamVjdFBhdGg/OiBzdHJpbmc7XG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0Y2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG5cdHNvcnRhYmxlOiBib29sZWFuO1xuXHRob3Jpem9udGFsQWxpZ24/OiBIb3Jpem9udGFsQWxpZ247XG5cdGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGhlYWRlcj86IHN0cmluZztcblx0dGVtcGxhdGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHR0b29sdGlwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRzaG93RGF0YUZpZWxkc0xhYmVsPzogYm9vbGVhbjtcblx0aXNLZXk/OiBib29sZWFuO1xuXHR1bml0Pzogc3RyaW5nO1xuXHRleHBvcnRTZXR0aW5ncz86IHtcblx0XHR0ZW1wbGF0ZT86IHN0cmluZztcblx0XHRsYWJlbD86IHN0cmluZztcblx0XHRmaWVsZExhYmVsPzogc3RyaW5nO1xuXHRcdHdyYXA/OiBib29sZWFuO1xuXHRcdHR5cGU/OiBzdHJpbmc7XG5cdFx0aW5wdXRGb3JtYXQ/OiBzdHJpbmc7XG5cdFx0Zm9ybWF0Pzogc3RyaW5nO1xuXHRcdHNjYWxlPzogbnVtYmVyO1xuXHRcdGRlbGltaXRlcj86IGJvb2xlYW47XG5cdFx0dHJ1ZVZhbHVlPzogYm9vbGVhbjtcblx0XHRmYWxzZVZhbHVlPzogYm9vbGVhbjtcblx0fTtcblx0aXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHk/OiBib29sZWFuO1xuXHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0dGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cdFx0bW9kZTogRGlzcGxheU1vZGU7XG5cdH07XG5cdGV4cG9ydENvbnRhY3RQcm9wZXJ0eT86IHN0cmluZztcblx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0dmlzdWFsU2V0dGluZ3M/OiBWaXN1YWxTZXR0aW5ncztcblx0dHlwZUNvbmZpZz86IG9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIFZpc3VhbFNldHRpbmdzID0ge1xuXHR3aWR0aENhbGN1bGF0aW9uPzogV2lkdGhDYWxjdWxhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdpZHRoQ2FsY3VsYXRpb24gPSBudWxsIHwge1xuXHRtaW5XaWR0aD86IG51bWJlcjtcblx0bWF4V2lkdGg/OiBudW1iZXI7XG5cdGRlZmF1bHRXaWR0aD86IG51bWJlcjtcblx0aW5jbHVkZUxhYmVsPzogYm9vbGVhbjtcblx0Z2FwPzogbnVtYmVyO1xuXHQvLyBvbmx5IHJlbGV2YW50IGZvciBjb21wbGV4IHR5cGVzXG5cdGV4Y2x1ZGVQcm9wZXJ0aWVzPzogc3RyaW5nIHwgc3RyaW5nW107XG5cdHZlcnRpY2FsQXJyYW5nZW1lbnQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21UYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRWxlbWVudDxUYWJsZUNvbHVtbj47XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZURhdGEgPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGU6IHtcblx0XHRjb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdH07XG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZTtcblx0YW5ub3RhdGlvbjogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbjtcblx0Y29udHJvbDogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbjtcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXTtcblx0YWN0aW9uczogQmFzZUFjdGlvbltdO1xuXHRhZ2dyZWdhdGVzPzogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT47XG5cdGVuYWJsZUFuYWx5dGljcz86IGJvb2xlYW47XG5cdGVuYWJsZUFuYWx5dGljc1NlYXJjaD86IGJvb2xlYW47XG5cdGVuYWJsZURhdGFTdGF0ZUZpbHRlcjogYm9vbGVhbjtcblx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBzdHJpbmc7XG5cdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IHN0cmluZztcbn07XG5cbnR5cGUgU29ydGVyVHlwZSA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRkZXNjZW5kaW5nOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBhbm5vdGF0aW9uLWJhc2VkIGFuZCBtYW5pZmVzdC1iYXNlZCB0YWJsZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7TGluZUl0ZW19IGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7QmFzZUFjdGlvbn0gVGhlIGNvbXBsZXRlIHRhYmxlIGFjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQWN0aW9ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogQmFzZUFjdGlvbltdIHtcblx0Y29uc3QgYVRhYmxlQWN0aW9ucyA9IGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGFBbm5vdGF0aW9uQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMudGFibGVBY3Rpb25zO1xuXHRjb25zdCBhSGlkZGVuQWN0aW9ucyA9IGFUYWJsZUFjdGlvbnMuaGlkZGVuVGFibGVBY3Rpb25zO1xuXHRyZXR1cm4gaW5zZXJ0Q3VzdG9tRWxlbWVudHMoXG5cdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmFjdGlvbnMsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0YUFubm90YXRpb25BY3Rpb25zLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0dHJ1ZSxcblx0XHRcdGFIaWRkZW5BY3Rpb25zXG5cdFx0KSxcblx0XHR7XG5cdFx0XHRpc05hdmlnYWJsZTogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZU9uU2VsZWN0OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbDogXCJvdmVyd3JpdGVcIixcblx0XHRcdGVuYWJsZWQ6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246IFwib3ZlcndyaXRlXCJcblx0XHR9XG5cdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0IGJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKlxuICogQHBhcmFtIHtMaW5lSXRlbX0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHtzdHJpbmd9IHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7VGFibGVDb2x1bW5bXX0gUmV0dXJucyBhbGwgdGFibGUgY29sdW1ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUsIHJlZ2FyZGxlc3Mgb2YgdGVtcGxhdGluZyBvciBwZXJzb25hbGl6YXRpb24gb3IgdGhlaXIgb3JpZ2luXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnMoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBhbm5vdGF0aW9uQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5jb2x1bW5zLFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdG5hdmlnYXRpb25TZXR0aW5nc1xuXHQpO1xuXG5cdHJldHVybiBpbnNlcnRDdXN0b21FbGVtZW50cyhhbm5vdGF0aW9uQ29sdW1ucywgbWFuaWZlc3RDb2x1bW5zLCB7XG5cdFx0d2lkdGg6IFwib3ZlcndyaXRlXCIsXG5cdFx0aXNOYXZpZ2FibGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0YXZhaWxhYmlsaXR5OiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGhvcml6b250YWxBbGlnbjogXCJvdmVyd3JpdGVcIixcblx0XHRmb3JtYXRPcHRpb25zOiBcIm92ZXJ3cml0ZVwiXG5cdH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjdXN0b20gYWdncmVnYXRpb24gZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBmb3IgdGhlIGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGFnZ3JlZ2F0ZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLCBvciB1bmRlZmluZWQgaWYgdGhlIGVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNhbCBxdWVyaWVzLlxuICovXG5leHBvcnQgY29uc3QgZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0ZURhdGE+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0ZnVuY3Rpb24gZmluZENvbHVtbkZyb21QYXRoKHBhdGg6IHN0cmluZyk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zLmZpbmQoY29sdW1uID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEtlZXAgYSBzZXQgb2YgYWxsIGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcywgYXMgd2UgZG9uJ3Qgd2FudCB0byBjb25zaWRlciB0aGVtIGFzIGFnZ3JlZ2F0ZXNcblx0Ly8gVGhleSBhcmUgYWdncmVnYXRlcyBmb3IgdGVjaG5pY2FsIHJlYXNvbnMgKHRvIG1hbmFnZSBtdWx0aS11bml0cyBzaXR1YXRpb25zKSBidXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZyb20gYSB1c2VyIHN0YW5kcG9pbnRcblx0Y29uc3QgbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcyA9IG5ldyBTZXQoKTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2gob0NvbHVtbiA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmFkZChvVGFibGVDb2x1bW4udW5pdCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBtUmF3RGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5cdGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKGFubm90YXRpb24gPT4ge1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGVkUHJvcGVydHkgPSBhZ2dyZWdhdGlvbkhlbHBlci5fZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQob1Byb3BlcnR5ID0+IHtcblx0XHRcdHJldHVybiBvUHJvcGVydHkubmFtZSA9PT0gYW5ub3RhdGlvbi5xdWFsaWZpZXI7XG5cdFx0fSk7XG5cblx0XHRpZiAob0FnZ3JlZ2F0ZWRQcm9wZXJ0eSkge1xuXHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhbm5vdGF0aW9uLmFubm90YXRpb25zPy5BZ2dyZWdhdGlvbj8uQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdG1SYXdEZWZpbml0aW9uc1tvQWdncmVnYXRlZFByb3BlcnR5Lm5hbWVdID0gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXNcblx0XHRcdFx0PyBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5tYXAob0N0eERlZlByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ3R4RGVmUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBtUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPiA9IHt9O1xuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gbVJhd0RlZmluaXRpb25zW29UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhdO1xuXG5cdFx0XHQvLyBJZ25vcmUgYWdncmVnYXRlcyBjb3JyZXNwb25kaW5nIHRvIGN1cnJlbmNpZXMgb3IgdW5pdHMgb2YgbWVhc3VyZSBhbmQgZHVtbXkgY3JlYXRlZCBwcm9wZXJ0eSBmb3IgZGF0YXBvaW50IHRhcmdldCBWYWx1ZVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhUmF3Q29udGV4dERlZmluaW5nUHJvcGVydGllcyAmJlxuXHRcdFx0XHQhbUN1cnJlbmN5T3JVbml0UHJvcGVydGllcy5oYXMob1RhYmxlQ29sdW1uLm5hbWUpICYmXG5cdFx0XHRcdCFvVGFibGVDb2x1bW4uaXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHlcblx0XHRcdCkge1xuXHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXSA9IHtcblx0XHRcdFx0XHRkZWZhdWx0QWdncmVnYXRlOiB7fSxcblx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3QgYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLmZvckVhY2goY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvQ29sdW1uID0gZmluZENvbHVtbkZyb21QYXRoKGNvbnRleHREZWZpbmluZ1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRcdFx0aWYgKG9Db2x1bW4pIHtcblx0XHRcdFx0XHRcdGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzLnB1c2gob0NvbHVtbi5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRtUmVzdWx0W29UYWJsZUNvbHVtbi5uYW1lXS5kZWZhdWx0QWdncmVnYXRlLmNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBhQ29udGV4dERlZmluaW5nUHJvcGVydGllcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIG1SZXN1bHQ7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYSB0YWJsZSB2aXN1YWxpemF0aW9uIGZvciBhbmFseXRpY2FsIHVzZSBjYXNlcy5cbiAqXG4gKiBAcGFyYW0gdGFibGVWaXN1YWxpemF0aW9uIFRoZSB2aXN1YWxpemF0aW9uIHRvIGJlIHVwZGF0ZWRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBUaGUgcHJlc2VudGF0aW9uVmFyaWFudCBhbm5vdGF0aW9uIChpZiBhbnkpXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhcblx0dGFibGVWaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlc1xuKSB7XG5cdGlmICh0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgYWdncmVnYXRlc0RlZmluaXRpb25zID0gZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZShlbnRpdHlUeXBlLCB0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1ucywgY29udmVydGVyQ29udGV4dCk7XG5cblx0XHRpZiAoYWdncmVnYXRlc0RlZmluaXRpb25zKSB7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzID0gdHJ1ZTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hZ2dyZWdhdGVzID0gYWdncmVnYXRlc0RlZmluaXRpb25zO1xuXG5cdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGNvbnN0IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zKCk7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzU2VhcmNoID0gYWxsb3dlZFRyYW5zZm9ybWF0aW9ucyA/IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMuaW5kZXhPZihcInNlYXJjaFwiKSA+PSAwIDogdHJ1ZTtcblxuXHRcdFx0Ly8gQWRkIGdyb3VwIGFuZCBzb3J0IGNvbmRpdGlvbnMgZnJvbSB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnRcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmdyb3VwQ29uZGl0aW9ucyA9IGdldEdyb3VwQ29uZGl0aW9ucyhwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiwgdGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMpO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmFubm90YXRpb24uYWdncmVnYXRlQ29uZGl0aW9ucyA9IGdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMoXG5cdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29sdW1uc1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0YWJsZVZpc3VhbGl6YXRpb24uY29udHJvbC50eXBlID0gXCJHcmlkVGFibGVcIjsgLy8gQW5hbHl0aWNhbFRhYmxlIGlzbid0IGEgcmVhbCB0eXBlIGZvciB0aGUgTURDOlRhYmxlLCBzbyB3ZSBhbHdheXMgc3dpdGNoIGJhY2sgdG8gR3JpZFxuXHR9XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYXZpZ2F0aW9uIHRhcmdldCBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5UGF0aCBUaGUgbmF2aWdhdGlvbiBwYXRoIHRvIGNoZWNrIGluIHRoZSBtYW5pZmVzdCBzZXR0aW5nc1xuICogQHJldHVybnMgTmF2aWdhdGlvbiBwYXRoIGZyb20gbWFuaWZlc3Qgc2V0dGluZ3NcbiAqL1xuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdGNvbnN0IG1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGlmIChuYXZpZ2F0aW9uUHJvcGVydHlQYXRoICYmIG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSkge1xuXHRcdGNvbnN0IG5hdkNvbmZpZyA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobmF2Q29uZmlnKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRjb25zdCBuYXZDb25maWdGb3JDb250ZXh0UGF0aCA9IG1hbmlmZXN0V3JhcHBlci5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihjb250ZXh0UGF0aCk7XG5cdGlmIChuYXZDb25maWdGb3JDb250ZXh0UGF0aCAmJiBPYmplY3Qua2V5cyhuYXZDb25maWdGb3JDb250ZXh0UGF0aCkubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBjb250ZXh0UGF0aDtcblx0fVxuXG5cdHJldHVybiBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldCA/IGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0Lm5hbWUgOiBkYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgJ3VuaXQnIGFuZCAndGV4dEFycmFuZ2VtZW50JyBwcm9wZXJ0aWVzIGluIGNvbHVtbnMgd2hlbiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGRpc3BsYXllZCBpbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGNvbHVtbnMgdG8gYmUgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGlua2VkUHJvcGVydGllcyhlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHtcblx0ZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcpOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKG9Db2x1bW4gPT4ge1xuXHRcdGNvbnN0IG9UYWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmIChvVGFibGVDb2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5maW5kKG9Qcm9wID0+IG9Qcm9wLm5hbWUgPT09IG9UYWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBzVW5pdCA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KG9Qcm9wZXJ0eSk/Lm5hbWUgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHkpPy5uYW1lO1xuXHRcdFx0XHRpZiAoc1VuaXQpIHtcblx0XHRcdFx0XHRjb25zdCBvVW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoc1VuaXQpO1xuXG5cdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnVuaXQgPSBvVW5pdENvbHVtbj8ubmFtZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUob1Byb3BlcnR5KSxcblx0XHRcdFx0XHR0ZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LlRleHQ7XG5cdFx0XHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKHRleHRBbm5vdGF0aW9uKSAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRBbm5vdGF0aW9uLnBhdGgpO1xuXHRcdFx0XHRcdGlmIChvVGV4dENvbHVtbiAmJiBvVGV4dENvbHVtbi5uYW1lICE9PSBvVGFibGVDb2x1bW4ubmFtZSkge1xuXHRcdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5OiBvVGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVWaXN1YWxpemF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMsXG5cdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnQ/OiBib29sZWFuLFxuXHR2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvblxuKTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbixcblx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0KTtcblx0Y29uc3QgeyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIH0gPSBzcGxpdFBhdGgodmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldE5hdmlnYXRpb25Db25maWd1cmF0aW9uKG5hdmlnYXRpb25UYXJnZXRQYXRoKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldFRhYmxlQ29sdW1ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uU2V0dGluZ3MpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAobGluZUl0ZW1Bbm5vdGF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRjb25zdCBvVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uID0ge1xuXHRcdHR5cGU6IFZpc3VhbGl6YXRpb25UeXBlLlRhYmxlLFxuXHRcdGFubm90YXRpb246IGdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24oXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHR0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdFx0Y29sdW1ucyxcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLFxuXHRcdFx0dmlld0NvbmZpZ3VyYXRpb25cblx0XHQpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogcmVtb3ZlRHVwbGljYXRlQWN0aW9ucyhnZXRUYWJsZUFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKSksXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRlbmFibGVEYXRhU3RhdGVGaWx0ZXI6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dClcblx0fTtcblxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSwgY29sdW1ucyk7XG5cdHVwZGF0ZVRhYmxlVmlzdWFsaXphdGlvbkZvckFuYWx5dGljcyhcblx0XHRvVmlzdWFsaXphdGlvbixcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvblxuXHQpO1xuXG5cdHJldHVybiBvVmlzdWFsaXphdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRUYWJsZVZpc3VhbGl6YXRpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIGZhbHNlKTtcblx0Y29uc3QgY29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSh7fSwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIFtdLCBbXSwgY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdENvbmZpZy50eXBlKTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG9WaXN1YWxpemF0aW9uOiBUYWJsZVZpc3VhbGl6YXRpb24gPSB7XG5cdFx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGUsXG5cdFx0YW5ub3RhdGlvbjogZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbih1bmRlZmluZWQsIFwiXCIsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlTWFuaWZlc3RDb25maWcsIGNvbHVtbnMpLFxuXHRcdGNvbnRyb2w6IHRhYmxlTWFuaWZlc3RDb25maWcsXG5cdFx0YWN0aW9uczogW10sXG5cdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRlbmFibGVEYXRhU3RhdGVGaWx0ZXI6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dClcblx0fTtcblxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKG9WaXN1YWxpemF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG1hcCBvZiBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRocyBmb3IgYWxsIERhdGFGaWVsZEZvckFjdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGxpbmUgaXRlbVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IFRoZSByZWNvcmQgY29udGFpbmluZyBhbGwgYWN0aW9uIG5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRjb25zdCBhZGRUb01hcCA9IGZ1bmN0aW9uKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0aWYgKGtleSkge1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwW2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cdH07XG5cblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGRhdGFGaWVsZC5BY3Rpb24gYXMgc3RyaW5nO1xuXHRcdFx0XHRpZiAoYWN0aW9uTmFtZT8uaW5kZXhPZihcIi9cIikgPCAwICYmICFkYXRhRmllbGQuRGV0ZXJtaW5pbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhY3Rpb25UYXJnZXQgPSBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0O1xuXHRcdFx0XHRcdGlmIChhY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdC8vIEFubm90YXRpb24gZXhwbGljaXRseSBjb25maWd1cmVkIHdpdGggbnVsbCAoYWN0aW9uIGFkdmVydGlzZW1lbnQgcmVsYXRlZClcblx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIG51bGwpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uVGFyZ2V0Py5wYXJhbWV0ZXJzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSA9IGFjdGlvblRhcmdldC5wYXJhbWV0ZXJzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0RXhwcmVzc2lvbiA9IGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUpXG5cdFx0XHRcdFx0XHRcdCkgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPHN0cmluZz47XG5cblx0XHRcdFx0XHRcdGlmICh0YXJnZXRFeHByZXNzaW9uPy5wYXRoKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24ucGF0aCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHByb3BlcnR5IHBhdGhzIGFzc2lnbmVkIHRvIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwIFRoZSByZWNvcmQgY29uc2lzdGluZyBvZiBhY3Rpb25zIGFuZCB0aGVpciBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRoc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Ygc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NvY2lhdGVkIHdpdGggdGhlIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIGFubm90YXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllcyhvcGVyYXRpb25BdmFpbGFibGVNYXA6IFJlY29yZDxzdHJpbmcsIGFueT4sIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gbmV3IFNldCgpO1xuXG5cdGZvciAoY29uc3QgYWN0aW9uTmFtZSBpbiBvcGVyYXRpb25BdmFpbGFibGVNYXApIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcGVyYXRpb25BdmFpbGFibGVNYXBbYWN0aW9uTmFtZV07XG5cdFx0aWYgKHByb3BlcnR5TmFtZSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQW5ub3RhdGlvbiBjb25maWd1cmVkIHdpdGggZXhwbGljaXQgJ251bGwnIChhY3Rpb24gYWR2ZXJ0aXNlbWVudCByZWxldmFudClcblx0XHRcdHByb3BlcnRpZXMuYWRkKGFjdGlvbk5hbWUpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHByb3BlcnR5TmFtZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gQWRkIHByb3BlcnR5IHBhdGhzIGFuZCBub3QgQ29uc3RhbnQgdmFsdWVzLlxuXHRcdFx0cHJvcGVydGllcy5hZGQocHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH1cblxuXHRpZiAocHJvcGVydGllcy5zaXplKSB7XG5cdFx0Ly8gU29tZSBhY3Rpb25zIGhhdmUgYW4gb3BlcmF0aW9uIGF2YWlsYWJsZSBiYXNlZCBvbiBwcm9wZXJ0eSAtLT4gd2UgbmVlZCB0byBsb2FkIHRoZSBIZWFkZXJJbmZvLlRpdGxlIHByb3BlcnR5XG5cdFx0Ly8gc28gdGhhdCB0aGUgZGlhbG9nIG9uIHBhcnRpYWwgYWN0aW9ucyBpcyBkaXNwbGF5ZWQgcHJvcGVybHkgKEJDUCAyMTgwMjcxNDI1KVxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCB0aXRsZVByb3BlcnR5ID0gKGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlPy5wYXRoO1xuXHRcdGlmICh0aXRsZVByb3BlcnR5KSB7XG5cdFx0XHRwcm9wZXJ0aWVzLmFkZCh0aXRsZVByb3BlcnR5KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gQXJyYXkuZnJvbShwcm9wZXJ0aWVzKS5qb2luKFwiLFwiKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiBvZiBhIGxpbmUgaXRlbSBhbmRcbiAqIHJldHVybnMgYWxsIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0gY3VycmVudEVudGl0eVR5cGUgQ3VycmVudCBlbnRpdHkgdHlwZVxuICogQHBhcmFtIGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIE9iamVjdCBwYXRoIG9mIHRoZSBkYXRhIG1vZGVsXG4gKiBAcGFyYW0gaXNFbnRpdHlTZXRcbiAqIEByZXR1cm5zIEFsbCB0aGUgYFVJLkhpZGRlbmAgcGF0aCBleHByZXNzaW9ucyBmb3VuZCBpbiB0aGUgcmVsZXZhbnQgYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRVSUhpZGRlbkV4cEZvckFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHRjdXJyZW50RW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGlzRW50aXR5U2V0OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaChkYXRhRmllbGQgPT4ge1xuXHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiZcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGUpIHx8XG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRcdGlzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQ3VzdG9tQWN0aW9uXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIGlzRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0c291cmNlOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb24sXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRpc0VudGl0eVNldDogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxhbnk+IHtcblx0bGV0IHNFeHByZXNzaW9uOiBhbnkgfCB1bmRlZmluZWQ7XG5cdGlmIChcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cblx0KSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LmFubm90YXRpb25zPy5VST8uSGlkZGVuO1xuXHR9IGVsc2Uge1xuXHRcdHNFeHByZXNzaW9uID0gKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlO1xuXHR9XG5cdGxldCBzUGF0aDogc3RyaW5nO1xuXHRpZiAoc0V4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0c1BhdGggPSBzRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoc1BhdGgpIHtcblx0XHRpZiAoKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlKSB7XG5cdFx0XHRzUGF0aCA9IHNQYXRoLnN1YnN0cmluZygxLCBzUGF0aC5sZW5ndGggLSAxKTtcblx0XHR9XG5cdFx0aWYgKHNQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Ly9jaGVjayBpZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBjb3JyZWN0OlxuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IGFTcGxpdFBhdGhbMF07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5wYXJ0bmVyID09PSBzTmF2aWdhdGlvblBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oYVNwbGl0UGF0aC5zbGljZSgxKS5qb2luKFwiL1wiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIG5hdmlnYXRpb24gcHJvcGVydHksIGlmIGl0J3MgYW4gZW50aXR5U2V0LCB0aGUgZXhwcmVzc2lvbiBiaW5kaW5nIGhhcyB0byBiZSByZXR1cm5lZDpcblx0XHR9IGVsc2UgaWYgKGlzRW50aXR5U2V0KSB7XG5cdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oc1BhdGgpO1xuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgY2Fubm90IGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlIGV2YWx1YXRpb246XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuXG4vKipcbiAqIExvb3AgdGhyb3VnaCB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kIGNoZWNrXG4gKiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdGFibGUgdG9vbGJhciAoYW5kIHJlcXVpcmVzIGEgY29udGV4dCkuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IEVudGl0eSBUeXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYWN0aW9uIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcblx0cmV0dXJuIGxpbmVJdGVtQW5ub3RhdGlvbi5zb21lKGRhdGFGaWVsZCA9PiB7XG5cdFx0aWYgKFxuXHRcdFx0KGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uIHx8XG5cdFx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSAmJlxuXHRcdFx0ZGF0YUZpZWxkPy5JbmxpbmU/LnZhbHVlT2YoKSAhPT0gdHJ1ZSAmJlxuXHRcdFx0KGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSBmYWxzZSB8fCBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdW5kZWZpbmVkKVxuXHRcdCkge1xuXHRcdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRcdFx0cmV0dXJuIGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0Py5pc0JvdW5kICYmIGN1cnJlbnRFbnRpdHlUeXBlID09PSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldC5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogYm9vbGVhbiB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLnNvbWUoYWN0aW9uS2V5ID0+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBtYW5pZmVzdEFjdGlvbnNbYWN0aW9uS2V5XTtcblx0XHRpZiAoYWN0aW9uLnJlcXVpcmVzU2VsZWN0aW9uICYmIGFjdGlvbi52aXNpYmxlPy50b1N0cmluZygpID09PSBcInRydWVcIikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgY3VzdG9tIGFjdGlvbnMgKHdpdGgga2V5IHJlcXVpcmVzU2VsZWN0aW9uKSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZm9yIHRoZSBjdXJyZW50IGxpbmUgaXRlbSBhbmQgcmV0dXJucyBhbGwgdGhlXG4gKiB2aXNpYmxlIGtleSB2YWx1ZXMgYXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbWFuaWZlc3RBY3Rpb25zIFRoZSBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKiBAcmV0dXJucyBBcnJheTxFeHByZXNzaW9uPGJvb2xlYW4+PiBBbGwgdGhlIHZpc2libGUgcGF0aCBleHByZXNzaW9ucyBvZiB0aGUgYWN0aW9ucyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFeHBGb3JDdXN0b21BY3Rpb25zUmVxdWlyaW5nQ29udGV4dChtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBFeHByZXNzaW9uPGJvb2xlYW4+W10ge1xuXHRjb25zdCBhVmlzaWJsZVBhdGhFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMpIHtcblx0XHRPYmplY3Qua2V5cyhtYW5pZmVzdEFjdGlvbnMpLmZvckVhY2goYWN0aW9uS2V5ID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSAmJiBhY3Rpb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvKlRoZSBmaW5hbCBhaW0gd291bGQgYmUgdG8gY2hlY2sgaWYgdGhlIHBhdGggZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgY29udGV4dFxuXHRcdFx0XHRcdGFuZCBjb25zaWRlcnMgb25seSB0aG9zZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbixcblx0XHRcdFx0XHRidXQgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmcm9tIHRoZSBtYW5pZmVzdCBhcyB0aGUgdmlzaWJsZSBrZXkgaXMgYm91bmQgb24gdGhlIHBhcmVudCBlbnRpdHkuXG5cdFx0XHRcdFx0VHJpY2t5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHBhdGggYXMgaXQncyBkb25lIGZvciB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRcdFx0Rm9yIHRoZSB0aW1lIGJlaW5nIHdlIGNvbnNpZGVyIGFsbCB0aGUgcGF0aHMgb2YgdGhlIG1hbmlmZXN0Ki9cblxuXHRcdFx0XHRcdGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zLnB1c2gocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uPy52aXNpYmxlPy52YWx1ZU9mKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhVmlzaWJsZVBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSBpZiB0aGUgcGF0aCBpcyBzdGF0aWNhbGx5IGRlbGV0YWJsZSBvciB1cGRhdGFibGUuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbn0gVGhlIHRhYmxlIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTW9kZShcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGlzRGVsZXRlQnV0dG9uVmlzaWJsZT86IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghbGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIFNlbGVjdGlvbk1vZGUuTm9uZTtcblx0fVxuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRsZXQgc2VsZWN0aW9uTW9kZSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzPy5zZWxlY3Rpb25Nb2RlO1xuXHRsZXQgYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW10sXG5cdFx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRjb25zdCBtYW5pZmVzdEFjdGlvbnMgPSBnZXRBY3Rpb25zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCkuYWN0aW9ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFtdLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRmYWxzZVxuXHQpO1xuXHRsZXQgaXNQYXJlbnREZWxldGFibGUsIHBhcmVudEVudGl0eVNldERlbGV0YWJsZTtcblx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0aXNQYXJlbnREZWxldGFibGUgPSBpc1BhdGhEZWxldGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksIHVuZGVmaW5lZCk7XG5cdFx0cGFyZW50RW50aXR5U2V0RGVsZXRhYmxlID0gaXNQYXJlbnREZWxldGFibGUgPyBjb21waWxlQmluZGluZyhpc1BhcmVudERlbGV0YWJsZSwgdHJ1ZSkgOiBpc1BhcmVudERlbGV0YWJsZTtcblx0fVxuXHRpZiAoc2VsZWN0aW9uTW9kZSAmJiBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLk5vbmUgJiYgaXNEZWxldGVCdXR0b25WaXNpYmxlKSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShpc0RlbGV0ZUJ1dHRvblZpc2libGUsIGNvbnN0YW50KFwiTXVsdGlcIiksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHR9XG5cdGlmICghc2VsZWN0aW9uTW9kZSB8fCBzZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkF1dG8pIHtcblx0XHRzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0fVxuXG5cdGlmIChcblx0XHRoYXNCb3VuZEFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpIHx8XG5cdFx0aGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobWFuaWZlc3RBY3Rpb25zKVxuXHQpIHtcblx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0fVxuXHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0aXNFbnRpdHlTZXRcblx0KTtcblx0YVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMgPSBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zKTtcblxuXHQvLyBObyBhY3Rpb24gcmVxdWlyaW5nIGEgY29udGV4dDpcblx0aWYgKGFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMubGVuZ3RoID09PSAwICYmIGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCAmJiBpc0RlbGV0ZUJ1dHRvblZpc2libGUpIHtcblx0XHRpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiKSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0XHRhbmQoZXF1YWwoYmluZGluZ0V4cHJlc3Npb24oXCIvZWRpdE1vZGVcIiwgXCJ1aVwiKSwgXCJFZGl0YWJsZVwiKSwgaXNEZWxldGVCdXR0b25WaXNpYmxlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0XHR9XG5cdFx0XHQvLyBFbnRpdHlTZXQgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlICYmIGlzRGVsZXRlQnV0dG9uVmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShpc0RlbGV0ZUJ1dHRvblZpc2libGUsIGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLCBjb25zdGFudChcIk5vbmVcIikpKTtcblx0XHRcdC8vIEVudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBhcmUgYWN0aW9ucyByZXF1aXJpbmcgYSBjb250ZXh0OlxuXHR9IGVsc2UgaWYgKCFpc0VudGl0eVNldCkge1xuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIpIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwiL2VkaXRNb2RlXCIsIFwidWlcIiksIFwiRWRpdGFibGVcIiksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRjb25zdGFudChTZWxlY3Rpb25Nb2RlLk5vbmUpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdC8vRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0fSBlbHNlIGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUpIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0XHQvL0VudGl0eVNldCBub3QgZGVsZXRhYmxlOlxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0b3IoLi4uYUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucy5jb25jYXQoYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMpKSxcblx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdClcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCB0YWJsZSBhY3Rpb25zIGZyb20gYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvblxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxCYXNlQWN0aW9uLCBCYXNlQWN0aW9uPn0gVGhlIHRhYmxlIGFubm90YXRpb24gYWN0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRUYWJsZUFubm90YXRpb25BY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpIHtcblx0Y29uc3QgdGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0Y29uc3QgaGlkZGVuVGFibGVBY3Rpb25zOiBCYXNlQWN0aW9uW10gPSBbXTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGxldCB0YWJsZUFjdGlvbjogQW5ub3RhdGlvbkFjdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQpICYmXG5cdFx0XHRcdCEoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuSW5saW5lICYmXG5cdFx0XHRcdCFkYXRhRmllbGQuRGV0ZXJtaW5pbmdcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBrZXkgPSBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiOlxuXHRcdFx0XHRcdFx0dGFibGVBY3Rpb24gPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGtleSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0bm90KFxuXHRcdFx0XHRcdFx0XHRcdFx0ZXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjpcblx0XHRcdFx0XHRcdHRhYmxlQWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBBY3Rpb25UeXBlLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdFx0XHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdFx0XHRcdG5vdChcblx0XHRcdFx0XHRcdFx0XHRcdGVxdWFsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0W10sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUpIHtcblx0XHRcdFx0aGlkZGVuVGFibGVBY3Rpb25zLnB1c2goe1xuXHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmICh0YWJsZUFjdGlvbikge1xuXHRcdFx0XHR0YWJsZUFjdGlvbnMucHVzaCh0YWJsZUFjdGlvbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR0YWJsZUFjdGlvbnM6IHRhYmxlQWN0aW9ucyxcblx0XHRoaWRkZW5UYWJsZUFjdGlvbnM6IGhpZGRlblRhYmxlQWN0aW9uc1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKFxuXHRjcml0aWNhbGl0eUFubm90YXRpb246IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+IHwgRW51bVZhbHVlPENyaXRpY2FsaXR5VHlwZT4gfCB1bmRlZmluZWQsXG5cdGlzRHJhZnRSb290OiBib29sZWFuLFxuXHR0YXJnZXRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4ge1xuXHRsZXQgZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb246IE1lc3NhZ2VUeXBlIHwgRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT4gPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRpZiAoY3JpdGljYWxpdHlBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKHR5cGVvZiBjcml0aWNhbGl0eUFubm90YXRpb24gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oY3JpdGljYWxpdHlBbm5vdGF0aW9uKSBhcyBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRW51bSBWYWx1ZSBzbyB3ZSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHBhcnRcblx0XHRcdGRlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGNyaXRpY2FsaXR5QW5ub3RhdGlvbik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpZkVsc2UoXG5cdFx0aXNEcmFmdFJvb3QgJiYgRHJhZnQuSXNOZXdPYmplY3QsXG5cdFx0TWVzc2FnZVR5cGUuSW5mb3JtYXRpb24gYXMgTWVzc2FnZVR5cGUsXG5cdFx0Zm9ybWF0UmVzdWx0KFxuXHRcdFx0W2RlZmF1bHRIaWdobGlnaHRSb3dEZWZpbml0aW9uLCBiaW5kaW5nRXhwcmVzc2lvbihgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIildLFxuXHRcdFx0dGFibGVGb3JtYXR0ZXJzLnJvd0hpZ2hsaWdodGluZyxcblx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHQpXG5cdCk7XG59XG5cbmZ1bmN0aW9uIF9nZXRDcmVhdGlvbkJlaGF2aW91cihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogVGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbltcImNyZWF0ZVwiXSB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSB8fCBuYXZpZ2F0aW9uU2V0dGluZ3M/LmRldGFpbDtcblxuXHQvLyBjcm9zcy1hcHBcblx0aWYgKGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5ncykgJiYgbmF2aWdhdGlvbikge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogbmF2aWdhdGlvbi5vdXRib3VuZCBhcyBzdHJpbmcsXG5cdFx0XHRvdXRib3VuZERldGFpbDogbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCxcblx0XHRcdG5hdmlnYXRpb25TZXR0aW5nczogbmF2aWdhdGlvblNldHRpbmdzXG5cdFx0fTtcblx0fVxuXG5cdGxldCBuZXdBY3Rpb247XG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHQvLyBpbi1hcHBcblx0XHRjb25zdCB0YXJnZXRBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zO1xuXHRcdG5ld0FjdGlvbiA9IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdD8uTmV3QWN0aW9uIHx8IHRhcmdldEFubm90YXRpb25zPy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247IC8vIFRPRE86IElzIHRoZXJlIHJlYWxseSBubyAnTmV3QWN0aW9uJyBvbiBEcmFmdE5vZGU/IHRhcmdldEFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZT8uTmV3QWN0aW9uXG5cblx0XHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbmV3QWN0aW9uKSB7XG5cdFx0XHQvLyBBIGNvbWJpbmF0aW9uIG9mICdDcmVhdGlvblJvdycgYW5kICdOZXdBY3Rpb24nIGRvZXMgbm90IG1ha2Ugc2Vuc2Vcblx0XHRcdC8vIFRPRE86IE9yIGRvZXMgaXQ/XG5cdFx0XHR0aHJvdyBFcnJvcihgQ3JlYXRpb24gbW9kZSAnJHtDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3d9JyBjYW4gbm90IGJlIHVzZWQgd2l0aCBhIGN1c3RvbSAnbmV3JyBhY3Rpb24gKCR7bmV3QWN0aW9ufSlgKTtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb24/LnJvdXRlKSB7XG5cdFx0XHQvLyByb3V0ZSBzcGVjaWZpZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRcdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRcdFx0bmV3QWN0aW9uOiBuZXdBY3Rpb24/LnRvU3RyaW5nKCksXG5cdFx0XHRcdG5hdmlnYXRlVG9UYXJnZXQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UgPyBuYXZpZ2F0aW9uLnJvdXRlIDogdW5kZWZpbmVkIC8vIG5hdmlnYXRlIG9ubHkgaW4gTmV3UGFnZSBtb2RlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdC8vIG5vIG5hdmlnYXRpb24gb3Igbm8gcm91dGUgc3BlY2lmaWVkIC0gZmFsbGJhY2sgdG8gaW5saW5lIGNyZWF0ZSBpZiBvcmlnaW5hbCBjcmVhdGlvbiBtb2RlIHdhcyAnTmV3UGFnZSdcblx0aWYgKHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtb2RlOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUsXG5cdFx0YXBwZW5kOiB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGVBdEVuZCxcblx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKVxuXHR9O1xufVxuXG5jb25zdCBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5ID0gZnVuY3Rpb24oXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFyZ2V0UGF0aDogc3RyaW5nXG4pIHtcblx0bGV0IHByZXNzUHJvcGVydHksIG5hdmlnYXRpb25UYXJnZXQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8TWVzc2FnZVR5cGU+ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRpZiAobmF2aWdhdGlvblNldHRpbmdzICYmIGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheT8udGFyZ2V0IHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/Lm91dGJvdW5kO1xuXHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRwcmVzc1Byb3BlcnR5ID1cblx0XHRcdFx0XCIuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKCAkY29udHJvbGxlciAsJ1wiICsgbmF2aWdhdGlvblRhcmdldCArIFwiJywgJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0pXCI7XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0bmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/LnJvdXRlO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdFx0XHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmFubm90YXRpb25zPy5VST8uQ3JpdGljYWxpdHksXG5cdFx0XHRcdFx0ISF0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fCAhIXRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlLFxuXHRcdFx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0cHJlc3NQcm9wZXJ0eSA9XG5cdFx0XHRcdFx0XCJBUEkub25UYWJsZVJvd1ByZXNzKCRldmVudCwgJGNvbnRyb2xsZXIsICR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9LCB7IGNhbGxFeHRlbnNpb246IHRydWUsIHRhcmdldFBhdGg6ICdcIiArXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCArXG5cdFx0XHRcdFx0XCInLCBlZGl0YWJsZSA6IFwiICtcblx0XHRcdFx0XHQodGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHwgdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGVcblx0XHRcdFx0XHRcdD8gXCIhJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0uZ2V0UHJvcGVydHkoJ0lzQWN0aXZlRW50aXR5JylcIlxuXHRcdFx0XHRcdFx0OiBcInVuZGVmaW5lZFwiKSArXG5cdFx0XHRcdFx0XCJ9KVwiOyAvL05lZWQgdG8gYWNjZXNzIHRvIERyYWZ0Um9vdCBhbmQgRHJhZnROb2RlICEhISEhISFcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKGxpbmVJdGVtQW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5LCBmYWxzZSwgdGFyZ2V0RW50aXR5VHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHJvd05hdmlnYXRlZEV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W2JpbmRpbmdFeHByZXNzaW9uKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdHByZXNzOiBwcmVzc1Byb3BlcnR5LFxuXHRcdGFjdGlvbjogcHJlc3NQcm9wZXJ0eSA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUJpbmRpbmcoY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlQmluZGluZyhyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKVxuXHR9O1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGFsbCBub24gc29ydGFibGUgY29sdW1uIG5hbWVzLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbihcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZVxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCB0YWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdC8vIENhdGNoIGFscmVhZHkgZXhpc3RpbmcgY29sdW1ucyAtIHdoaWNoIHdlcmUgYWRkZWQgYmVmb3JlIGJ5IExpbmVJdGVtIEFubm90YXRpb25zXG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblxuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRcdFx0XSlbMF07XG5cdFx0XHRjb25zdCBvQ29sdW1uRHJhZnRJbmRpY2F0b3IgPSBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oY29sdW1uSW5mby5uYW1lLCBzZW1hbnRpY0tleXMpO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db2x1bW5EcmFmdEluZGljYXRvcikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0Li4ub0NvbHVtbkRyYWZ0SW5kaWNhdG9yXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHQuLi5jb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZ1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGFibGVDb2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucztcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgRW50aXR5IHR5cGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBjb2x1bW4gaXMgY3JlYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bGxQcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgYWxsIG5vbiBzb3J0YWJsZSBjb2x1bW4gbmFtZXNcbiAqIEBwYXJhbSB7QWdncmVnYXRpb25IZWxwZXJ9IGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbkhlbHBlciBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbn0gVGhlIGFubm90YXRpb24gY29sdW1uIGRlZmluaXRpb25cbiAqL1xuY29uc3QgZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBuYW1lID0gdXNlRGF0YUZpZWxkUHJlZml4ID8gcmVsYXRpdmVQYXRoIDogXCJQcm9wZXJ0eTo6XCIgKyByZWxhdGl2ZVBhdGg7XG5cdGNvbnN0IGtleSA9ICh1c2VEYXRhRmllbGRQcmVmaXggPyBcIkRhdGFGaWVsZDo6XCIgOiBcIlByb3BlcnR5OjpcIikgKyByZXBsYWNlU3BlY2lhbENoYXJzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWU7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5OiBib29sZWFuID0gbmFtZS5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFQb2ludFwiKSA+IC0xO1xuXHRjb25zdCBleHBvcnRUeXBlOiBzdHJpbmcgPSBfZ2V0RXhwb3J0RGF0YVR5cGUocHJvcGVydHkudHlwZSk7XG5cdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHkgPyBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IG9UeXBlQ29uZmlnID0gIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRcdFx0b0Zvcm1hdE9wdGlvbnM6IHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRvQ29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHRcdCAgfVxuXHRcdDogdW5kZWZpbmVkO1xuXHRjb25zdCBleHBvcnRTZXR0aW5ncyA9IGlzRGF0YVBvaW50RmFrZVByb3BlcnR5XG5cdFx0PyB7XG5cdFx0XHRcdHRlbXBsYXRlOiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHByb3BlcnR5KVxuXHRcdCAgfVxuXHRcdDoge1xuXHRcdFx0XHR0eXBlOiBleHBvcnRUeXBlLFxuXHRcdFx0XHRpbnB1dEZvcm1hdDogc0RhdGVJbnB1dEZvcm1hdCxcblx0XHRcdFx0c2NhbGU6IHByb3BlcnR5LnNjYWxlLFxuXHRcdFx0XHRkZWxpbWl0ZXI6IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogZmFsc2UsXG5cdFx0XHRcdHRydWVWYWx1ZTogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJZZXNcIiA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZmFsc2VWYWx1ZTogcHJvcGVydHkudHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJOb1wiIDogdW5kZWZpbmVkXG5cdFx0ICB9O1xuXG5cdGNvbnN0IG9Db2x1bW46IGFueSA9IHtcblx0XHRrZXk6IGtleSxcblx0XHRpc0dyb3VwYWJsZTogIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5ICYmICFpc0hpZGRlbiA/IGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpIDogZmFsc2UsXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGxhYmVsOiBfZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwocHJvcGVydHkpIDogbnVsbCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBmb3IgdGhlIFRhcmdldFZhbHVlIHVzZWQgb24gRGF0YVBvaW50cywgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuIGFuZCBub24gc29ydGFibGVcblx0XHRhdmFpbGFiaWxpdHk6XG5cdFx0XHQhYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBpc0hpZGRlbiB8fCBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eVxuXHRcdFx0PyAocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uVmFsdWU/LnBhdGggfHwgKHByb3BlcnR5IGFzIGFueSkuVmFsdWUucGF0aFxuXHRcdFx0OiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6ICFpc0hpZGRlbiAmJiBub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihyZWxhdGl2ZVBhdGgpID09PSAtMSAmJiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHksXG5cdFx0aXNLZXk6IHByb3BlcnR5LmlzS2V5LFxuXHRcdGlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5OiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSxcblx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdHZpc3VhbFNldHRpbmdzOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9IDogdW5kZWZpbmVkXG5cdH07XG5cdGNvbnN0IHNUb29sdGlwID0gX2dldFRvb2x0aXAocHJvcGVydHkpO1xuXHRpZiAoc1Rvb2x0aXApIHtcblx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0fVxuXG5cdHJldHVybiBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0Ly8gVG9kbzogUmVwbGFjZSB3aXRoIHByb3BlciBMb2cgc3RhdGVtZW50IG9uY2UgYXZhaWxhYmxlXG5cdFx0Ly8gIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBEYXRhRmllbGQgQWJzdHJhY3QgdHlwZTogXCIgKyBkYXRhRmllbGQuJFR5cGUpO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0byBldmFsdWF0ZSB0aGUgdmlzaWJpbGl0eSBvZiBhIERhdGFGaWVsZCBvciBEYXRhUG9pbnQgYW5ub3RhdGlvbi5cbiAqXG4gKiBTQVAgRmlvcmkgZWxlbWVudHMgd2lsbCBldmFsdWF0ZSBlaXRoZXIgdGhlIFVJLkhpZGRlbiBhbm5vdGF0aW9uIGRlZmluZWQgb24gdGhlIGFubm90YXRpb24gaXRzZWxmIG9yIG9uIHRoZSB0YXJnZXQgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcGFyYW0ge0ZpZWxkRm9ybWF0T3B0aW9uc30gW2Zvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgaXMgb3B0aW9uYWwsIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldHVybkV4cHJlc3Npb25dIFJldHVybkV4cHJlc3Npb24gb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gQW4gZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gYmluZCB0byB0aGUgVUkuXG4gKi9cbmV4cG9ydCBjb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbihcblx0ZGF0YUZpZWxkTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JtYXRPcHRpb25zPzogYW55LFxuXHRyZXR1cm5FeHByZXNzaW9uPzogQm9vbGVhblxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDogY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRjb25zdCBleHByZXNzaW9uID0gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKCEhcHJvcGVydHlWYWx1ZSwgcHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSwgdHJ1ZSksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xuXHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbiA/IChleHByZXNzaW9uIGFzIEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4pIDogY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbik7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXN9IGRhdGFGaWVsZEdyb3VwIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHtGaWVsZEZvcm1hdE9wdGlvbnN9IFtmaWVsZEZvcm1hdE9wdGlvbnNdIEZvcm1hdE9wdGlvbnMgaXMgb3B0aW9uYWwsIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGFuYWx5dGljIHRhYmxlIGhhcyBHcm91cEhlYWRlciBleHBhbmRlZC5cbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+fSBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gZnVuY3Rpb24oXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRmaWVsZEZvcm1hdE9wdGlvbnM6IGFueVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0YUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucy5wdXNoKFxuXHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aCwgZmllbGRGb3JtYXRPcHRpb25zLCB0cnVlKVxuXHRcdFx0KTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRpZkVsc2Uob3IoLi4uKGFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgYXMgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pKSwgY29uc3RhbnQodHJ1ZSksIGNvbnN0YW50KGZhbHNlKSlcblx0XHQpO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgcHJvcGVydHkgYW5kIGRhdGFGaWVsZC5cbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5fSBbcHJvcGVydHldIFByb3BlcnR5IG9yIERhdGFGaWVsZCBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHBhcmFtIGlzR3JvdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9IExhYmVsIG9mIHRoZSBwcm9wZXJ0eSBvciBEYXRhRmllbGRcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9nZXRMYWJlbCA9IGZ1bmN0aW9uKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksIGlzR3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZERlZmF1bHQgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5uYW1lXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKClcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24oc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXNvdXJjZSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5hbm5vdGF0aW9ucy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNvdXJjZS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHNvdXJjZS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdHJldHVybiBkYXRhcG9pbnRUYXJnZXQ/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mby52YWx1ZU9mKCkpKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFByb3BlcnR5Pn0gY29sdW1uc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbiBuYW1lcyB3aGljaCBjYW5ub3QgYmUgc29ydGVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZC5cbiAqL1xuY29uc3QgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zID0gZnVuY3Rpb24oXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaChuYW1lID0+IHtcblx0XHRjb25zdCBwcm9wZXJ0eSA9IGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSxcblx0XHRcdGFubm90YXRpb25QYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKG5hbWUpLFxuXHRcdFx0Ly8gQ2hlY2sgd2hldGhlciB0aGUgcmVsYXRlZCBjb2x1bW4gYWxyZWFkeSBleGlzdHMuXG5cdFx0XHRyZWxhdGVkQ29sdW1uID0gZXhpc3RpbmdDb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAocmVsYXRlZENvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDYXNlIDE6IEtleSBjb250YWlucyBEYXRhRmllbGQgcHJlZml4IHRvIGVuc3VyZSBhbGwgcHJvcGVydHkgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGtleSBmb3JtYXQuXG5cdFx0XHQvLyBOZXcgY3JlYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaXMgc2V0IHRvIGhpZGRlbi5cblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goXG5cdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG5vblNvcnRhYmxlQ29sdW1ucyxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdHJlbGF0ZWRDb2x1bW4uYW5ub3RhdGlvblBhdGggIT09IGFubm90YXRpb25QYXRoIHx8XG5cdFx0XHQocmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zICYmIHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcy5pbmRleE9mKG5hbWUpICE9PSAtMSlcblx0XHQpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtbiBhbmRcblx0XHRcdC8vIGJvdGggY2FzZXMgcmVxdWlyZSBhIGR1bW15IFByb3BlcnR5SW5mbyBmb3Igc2V0dGluZyBjb3JyZWN0IGV4cG9ydCBzZXR0aW5ncy5cblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IFwiUHJvcGVydHk6OlwiICsgbmFtZTtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLlxuXHRcdFx0aWYgKCFleGlzdGluZ0NvbHVtbnMuc29tZShjb2x1bW4gPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjb2x1bW4gd2l0aCAnUHJvcGVydHk6OicgcHJlZml4LFxuXHRcdFx0XHQvLyBTZXQgaXQgdG8gaGlkZGVuIGFzIGl0IGlzIG9ubHkgY29uc3VtZWQgYnkgQ29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuXHRcdGNvbHVtbi5wcm9wZXJ0eUluZm9zID0gY29sdW1uLnByb3BlcnR5SW5mb3M/Lm1hcChwcm9wZXJ0eUluZm8gPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mbyk7XG5cdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPy5tYXAoXG5cdFx0XHRwcm9wZXJ0eUluZm8gPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGFubm90YXRpb24gY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldEFubm90YXRpb25Db2x1bW5OYW1lID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkpIHtcblx0XHRyZXR1cm4gZGF0YUZpZWxkLlZhbHVlPy5wYXRoO1xuXHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8ucGF0aCkge1xuXHRcdC8vIFRoaXMgaXMgZm9yIHJlbW92aW5nIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgJ1Byb2dyZXNzJyBQcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIERhdGFQb2ludFxuXHRcdHJldHVybiAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZS5wYXRoO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCk7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YSBmaWVsZCBsYWJlbHMgaGF2ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkR3JvdXBOYW1lIFRoZSBgRGF0YUZpZWxkYCBuYW1lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCA9IGZ1bmN0aW9uKGZpZWxkR3JvdXBOYW1lOiBzdHJpbmcsIHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3Qgb0NvbHVtbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpPy5jb2x1bW5zO1xuXHRjb25zdCBhQ29sdW1uS2V5cyA9IG9Db2x1bW5zICYmIE9iamVjdC5rZXlzKG9Db2x1bW5zKTtcblx0cmV0dXJuIChcblx0XHRhQ29sdW1uS2V5cyAmJlxuXHRcdCEhYUNvbHVtbktleXMuZmluZChmdW5jdGlvbihrZXk6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGtleSA9PT0gZmllbGRHcm91cE5hbWUgJiYgb0NvbHVtbnNba2V5XS5zaG93RGF0YUZpZWxkc0xhYmVsO1xuXHRcdH0pXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHByb3BlcnR5IHdpdGggcmVzcGVjdCB0byB0aGUgcm9vdCBlbnRpdHkuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBgRGF0YUZpZWxkYCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcmVsYXRpdmUgcGF0aFxuICovXG5jb25zdCBfZ2V0UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aDogc3RyaW5nID0gXCJcIjtcblxuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRpdmVQYXRoO1xufTtcblxuY29uc3QgX3NsaWNlQXRTbGFzaCA9IGZ1bmN0aW9uKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pIHtcblx0Y29uc3QgaVNsYXNoSW5kZXggPSBpc0xhc3RTbGFzaCA/IHBhdGgubGFzdEluZGV4T2YoXCIvXCIpIDogcGF0aC5pbmRleE9mKFwiL1wiKTtcblxuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBwcm9wZXJ0eVBhdGg6IHN0cmluZywgbm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRsZXQgaXNTb3J0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRpZiAobm9uU29ydGFibGVDb2x1bW5zLmluZGV4T2YocHJvcGVydHlQYXRoKSA9PT0gLTEpIHtcblx0XHQvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRcdGlzU29ydGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdFx0Ly8gQWN0aW9uIGNvbHVtbnMgYXJlIG5vdCBzb3J0YWJsZVxuXHRcdFx0XHRpc1NvcnRhYmxlID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaXNTb3J0YWJsZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuICovXG5leHBvcnQgY29uc3QgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnM7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KGZpbHRlckZ1bmN0aW9ucykgPyAoZmlsdGVyRnVuY3Rpb25zIGFzIFN0cmluZ1tdKS5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKlxuICogQHJldHVybnMge0Zvcm1hdE9wdGlvbnNUeXBlfSBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpOiBGb3JtYXRPcHRpb25zVHlwZSB7XG5cdHJldHVybiB7XG5cdFx0dGV4dExpbmVzRWRpdDogNFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcmV0dXJucyB7Rm9ybWF0T3B0aW9uc1R5cGV9IENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZTogc3RyaW5nLCBzZW1hbnRpY0tleXM6IGFueVtdKSB7XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGlmICghc2VtYW50aWNLZXlzKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdGlmIChiU2VtYW50aWNLZXlGb3VuZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdHNlbWFudGlja2V5czogYVNlbWFudGljS2V5VmFsdWVzXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge307XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGxpbmUgaXRlbXMgZnJvbSBtZXRhZGF0YSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyB3aXRoIHRoZWlyIGFubm90YXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGggVGhlIHZpc3VhbGl6YXRpb24gcGF0aFxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1RhYmxlQ29sdW1uW119IFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdHRhYmxlVHlwZTogVGFibGVUeXBlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2VtYW50aWNLZXlcIiwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2gobGluZUl0ZW0gPT4ge1xuXHRcdFx0aWYgKCFfaXNWYWxpZENvbHVtbihsaW5lSXRlbSkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9XG5cdFx0XHRcdGlzRGF0YUZpZWxkVHlwZXMobGluZUl0ZW0pICYmIGxpbmVJdGVtLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBsaW5lSXRlbSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IF9nZXRSZWxhdGl2ZVBhdGgobGluZUl0ZW0pO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShsaW5lSXRlbSwgY29udmVydGVyQ29udGV4dCwgdGFibGVUeXBlKTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBncm91cFBhdGg6IHN0cmluZyA9IF9zbGljZUF0U2xhc2gocmVsYXRpdmVQYXRoLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IHNMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gX2dldExhYmVsKGxpbmVJdGVtLCBpc0dyb3VwKTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUobGluZUl0ZW0pO1xuXHRcdFx0Y29uc3QgaXNGaWVsZEdyb3VwQ29sdW1uOiBib29sZWFuID0gZ3JvdXBQYXRoLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmllbGRHcm91cFwiKSA+IC0xO1xuXHRcdFx0Y29uc3Qgc2hvd0RhdGFGaWVsZHNMYWJlbDogYm9vbGVhbiA9IGlzRmllbGRHcm91cENvbHVtblxuXHRcdFx0XHQ/IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsKG5hbWUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKGxpbmVJdGVtKTtcblx0XHRcdGNvbnN0IHNEYXRlSW5wdXRGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGRhdGFUeXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0Li4uZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cylcblx0XHRcdH07XG5cdFx0XHRsZXQgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRsaW5lSXRlbS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdFx0XHRsaW5lSXRlbS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMobGluZUl0ZW0sIGZvcm1hdE9wdGlvbnMpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzV3JhcHBpbmcsXG5cdFx0XHRcdHR5cGU6IGRhdGFUeXBlID8gX2dldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAxKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0aW5wdXRGb3JtYXQ6IHNEYXRlSW5wdXRGb3JtYXQsXG5cdFx0XHRcdGRlbGltaXRlcjogZGF0YVR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogZmFsc2UsXG5cdFx0XHRcdHRydWVWYWx1ZTogZGF0YVR5cGUgPT09IFwiRWRtLkJvb2xlYW5cIiA/IFwiWWVzXCIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGZhbHNlVmFsdWU6IGRhdGFUeXBlID09PSBcIkVkbS5Cb29sZWFuXCIgPyBcIk5vXCIgOiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBkYXRhVHlwZSAmJiBnZXRUeXBlQ29uZmlnKGxpbmVJdGVtLCBkYXRhVHlwZSk7XG5cdFx0XHRjb25zdCBvVHlwZUNvbmZpZyA9IHByb3BlcnR5VHlwZUNvbmZpZ1xuXHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZTogZGF0YVR5cGUsXG5cdFx0XHRcdFx0XHRvRm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdFx0XHQuLi5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9uc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9Db25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdFx0XHRcdCAgfVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGxldCB2aXN1YWxTZXR0aW5nczogVmlzdWFsU2V0dGluZ3MgPSB7fTtcblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8udmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24gd2l0aCBkaXNwbGF5IG1vZGUgYXMgdGV4dCBvbmx5LCBleGNsdWRlIHRleHQgcHJvcGVydHkgZnJvbSB0aGUgd2lkdGggY2FsY3VsYXRpb25cblx0XHRcdFx0dmlzdWFsU2V0dGluZ3MgPSB7XG5cdFx0XHRcdFx0d2lkdGhDYWxjdWxhdGlvbjoge1xuXHRcdFx0XHRcdFx0ZXhjbHVkZVByb3BlcnRpZXM6IFwiUHJvcGVydHk6OlwiICsgcmVsYXRlZFByb3BlcnRpZXNJbmZvLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmICghZGF0YVR5cGUgfHwgIW9UeXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRPRE86IEZvciBzaXR1YXRpb24gUE9DIC0gaW5jcmVhc2Ugd2lkdGggb2YgdGhlIGNvbHVtbiB3aXRoIHRoZSBzaXR1YXRpb25zIGluZGljYXRvciAtIHdvcmtzIGZvciB0aGUgc2l0dWF0aW9ucyBkZW1vIGFwcCBvbmx5IVxuXHRcdFx0Ly8gTWlnaHQgYmUgYSBnb29kIGlkZWEgdG8gbW92ZSB0aGUgY29tcGxldGUgY29sdW1uIHdpZHRoIGRldGVybWluYXRpb24gdG8gdGhlIGNvbnZlcnRlciwgdGhhdCB3b3VsZCBhbGxvdyB1cyB0byB3aWRlbiB0aGUgY29sdW1ucyBhcyBuZWVkZWQuIFRoaXMgd29ya2Fyb3VuZCBvbmx5IGRlYWxzIHdpdGggRGF0ZSBjb2x1bW5zLlxuXHRcdFx0Y29uc3QgeyBoYXNEcmFmdEluZGljYXRvciB9ID0gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cyk7XG5cdFx0XHRjb25zdCB3aWR0aE92ZXJyaWRlID1cblx0XHRcdFx0KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLmFubm90YXRpb25zIGFzIGFueSkuRkU/LlNpdHVhdGlvbnMgJiZcblx0XHRcdFx0aGFzRHJhZnRJbmRpY2F0b3IgJiZcblx0XHRcdFx0bGluZUl0ZW0uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCAmJlxuXHRcdFx0XHRsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0LnR5cGUgPT09IFwiRWRtLkRhdGVcIlxuXHRcdFx0XHRcdD8gXCIxMWVtXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3Qgb0NvbHVtbjogYW55ID0ge1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQobGluZUl0ZW0pLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBzTGFiZWwsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwobGluZUl0ZW0pIDogbnVsbCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiBudWxsLFxuXHRcdFx0XHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChsaW5lSXRlbS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogaXNEYXRhRmllbGRBbHdheXNIaWRkZW4obGluZUl0ZW0pID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsXG5cdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdHNob3dEYXRhRmllbGRzTGFiZWw6IHNob3dEYXRhRmllbGRzTGFiZWwsXG5cdFx0XHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRzb3J0YWJsZTogX2lzQ29sdW1uU29ydGFibGUobGluZUl0ZW0sIHJlbGF0aXZlUGF0aCwgbm9uU29ydGFibGVDb2x1bW5zKSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvczogYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdHdpZHRoOiBsaW5lSXRlbS5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aCB8fCB3aWR0aE92ZXJyaWRlIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGV4cG9ydENvbnRhY3RQcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3Ncblx0XHRcdH07XG5cdFx0XHRjb25zdCBzVG9vbHRpcCA9IF9nZXRUb29sdGlwKGxpbmVJdGVtKTtcblx0XHRcdGlmIChzVG9vbHRpcCkge1xuXHRcdFx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0XHRcdH1cblxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbik7XG5cblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0bGV0IHRhYmxlQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGVcblx0KTtcblx0dGFibGVDb2x1bW5zID0gdGFibGVDb2x1bW5zLmNvbmNhdChhbm5vdGF0aW9uQ29sdW1ucyk7XG5cblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKGNvbHVtbnNUb0JlQ3JlYXRlZCwgdGFibGVDb2x1bW5zLCBub25Tb3J0YWJsZUNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHR0YWJsZUNvbHVtbnMgPSB0YWJsZUNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24ocHJvcGVydGllczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdC5tYXAocHJvcGVydHkgPT4ge1xuXHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdH0pXG5cdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB0YWJsZSBjb2x1bW4gcHJvcGVydHkgdmFsdWUgYmFzZWQgb24gY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIE1hbmlmZXN0IGRlZmluZWQgcHJvcGVydHkgdmFsdWUgZm9yIGN1c3RvbSAvIGFubm90YXRpb24gY29sdW1uc1xuICogRGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgY3VzdG9tIGNvbHVtbiBpZiBub3Qgb3ZlcndyaXR0ZW4gaW4gbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHByb3BlcnR5IFRoZSBjb2x1bW4gcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSB7YW55fSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQW5ub3RhdGlvbkNvbHVtbiBXaGV0aGVyIHRoZSBjb2x1bW4sIGRlZmluZWQgaW4gbWFuaWZlc3QsIGNvcnJlc3BvbmRzIHRvIGFuIGV4aXN0aW5nIGFubm90YXRpb24gY29sdW1uLlxuICogQHJldHVybnMge2FueX0gRGV0ZXJtaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGNvbHVtblxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uKHByb3BlcnR5OiBhbnksIGRlZmF1bHRWYWx1ZTogYW55LCBpc0Fubm90YXRpb25Db2x1bW46IGJvb2xlYW4pOiBhbnkge1xuXHRpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIElmIGFubm90YXRpb24gY29sdW1uIGhhcyBubyBwcm9wZXJ0eSBkZWZpbmVkIGluIG1hbmlmZXN0LFxuXHRcdC8vIGRvIG5vdCBvdmVyd3JpdGUgaXQgd2l0aCBtYW5pZmVzdCBjb2x1bW4ncyBkZWZhdWx0IHZhbHVlLlxuXHRcdHJldHVybiBpc0Fubm90YXRpb25Db2x1bW4gPyB1bmRlZmluZWQgOiBkZWZhdWx0VmFsdWU7XG5cdH1cblx0Ly8gUmV0dXJuIHdoYXQgaXMgZGVmaW5lZCBpbiBtYW5pZmVzdC5cblx0cmV0dXJuIHByb3BlcnR5O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRhYmxlIGNvbHVtbiBkZWZpbml0aW9ucyBmcm9tIG1hbmlmZXN0LlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tQ29sdW1uPn0gVGhlIGNvbHVtbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCA9IGZ1bmN0aW9uKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdFRhYmxlQ29sdW1uPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21Db2x1bW4+ID0ge307XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdC8vIFRvIGlkZW50aWZ5IHRoZSBhbm5vdGF0aW9uIGNvbHVtbiBwcm9wZXJ0eSBvdmVyd3JpdGUgdmlhIG1hbmlmZXN0IHVzZS1jYXNlLlxuXHRcdGNvbnN0IGlzQW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoY29sdW1uID0+IGNvbHVtbi5rZXkgPT09IGtleSk7XG5cdFx0S2V5SGVscGVyLnZhbGlkYXRlS2V5KGtleSk7XG5cdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRlbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRpZiAoIW1hbmlmZXN0Q29sdW1uPy50ZW1wbGF0ZSAmJiAhaXNBbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRjb25zdCBNZXNzYWdlID0gXCJUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJ1wiICsga2V5ICsgXCInIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZFwiO1xuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRNZXNzYWdlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHtcblx0XHRcdFx0a2V5OiBrZXksXG5cdFx0XHRcdGlkOiBcIkN1c3RvbUNvbHVtbjo6XCIgKyBrZXksXG5cdFx0XHRcdG5hbWU6IFwiQ3VzdG9tQ29sdW1uOjpcIiArIGtleSxcblx0XHRcdFx0aGVhZGVyOiBtYW5pZmVzdENvbHVtbi5oZWFkZXIsXG5cdFx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUobWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLCBpc0Fubm90YXRpb25Db2x1bW4pLFxuXHRcdFx0XHR0eXBlOiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBcIlNsb3RcIiA/IENvbHVtblR5cGUuU2xvdCA6IENvbHVtblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHlUeXBlLkRlZmF1bHQsIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSB8fCBcInVuZGVmaW5lZFwiLFxuXHRcdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdFx0fSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGlzQW5ub3RhdGlvbkNvbHVtbiA/IHVuZGVmaW5lZCA6IGlzQWN0aW9uTmF2aWdhYmxlKG1hbmlmZXN0Q29sdW1uLCBuYXZpZ2F0aW9uU2V0dGluZ3MsIHRydWUpLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0XHQuLi5tYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiB7XG5cdFx0XHRcdFx0dGVtcGxhdGU6IHByb3BlcnR5SW5mb3MgPyBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcykgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZmllbGRMYWJlbDogcHJvcGVydHlJbmZvcyA/IG1hbmlmZXN0Q29sdW1uLmhlYWRlciA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHR3cmFwOiBwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UDEzbk1vZGUoXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCk7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpO1xuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gbWFuaWZlc3RXcmFwcGVyLmdldFZhcmlhbnRNYW5hZ2VtZW50KCk7XG5cdGNvbnN0IGFQZXJzb25hbGl6YXRpb246IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGJBbmFseXRpY2FsVGFibGUgPSB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRpZiAodGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5wZXJzb25hbGl6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGNvbnN0IHBlcnNvbmFsaXphdGlvbjogYW55ID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3MucGVyc29uYWxpemF0aW9uO1xuXHRcdGlmIChwZXJzb25hbGl6YXRpb24gPT09IHRydWUpIHtcblx0XHRcdC8vIFRhYmxlIHBlcnNvbmFsaXphdGlvbiBmdWxseSBlbmFibGVkLlxuXHRcdFx0cmV0dXJuIGJBbmFseXRpY2FsVGFibGUgPyBcIlNvcnQsQ29sdW1uLEZpbHRlcixHcm91cCxBZ2dyZWdhdGVcIiA6IFwiU29ydCxDb2x1bW4sRmlsdGVyXCI7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgcGVyc29uYWxpemF0aW9uID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHQvLyBTcGVjaWZpYyBwZXJzb25hbGl6YXRpb24gb3B0aW9ucyBlbmFibGVkIGluIG1hbmlmZXN0LiBVc2UgdGhlbSBhcyBpcy5cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uc29ydCkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJTb3J0XCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5jb2x1bW4pIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5maWx0ZXIpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiRmlsdGVyXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5ncm91cCAmJiBiQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkdyb3VwXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBlcnNvbmFsaXphdGlvbi5hZ2dyZWdhdGUgJiYgYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYVBlcnNvbmFsaXphdGlvbi5sZW5ndGggPiAwID8gYVBlcnNvbmFsaXphdGlvbi5qb2luKFwiLFwiKSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gTm8gcGVyc29uYWxpemF0aW9uIGNvbmZpZ3VyZWQgaW4gbWFuaWZlc3QuXG5cdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJDb2x1bW5cIik7XG5cdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50ID09PSBWYXJpYW50TWFuYWdlbWVudFR5cGUuQ29udHJvbCkge1xuXHRcdFx0Ly8gRmVhdHVyZSBwYXJpdHkgd2l0aCBWMi5cblx0XHRcdC8vIEVuYWJsZSB0YWJsZSBmaWx0ZXJpbmcgYnkgZGVmYXVsdCBvbmx5IGluIGNhc2Ugb2YgQ29udHJvbCBsZXZlbCB2YXJpYW50IG1hbmFnZW1lbnQuXG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0fVxuXHRcdGlmIChiQW5hbHl0aWNhbFRhYmxlKSB7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkFnZ3JlZ2F0ZVwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFQZXJzb25hbGl6YXRpb24uam9pbihcIixcIik7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgc29ydCBjb25kaXRpb25zIGZvciB0aGUgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBUYWJsZSBjb2x1bW5zIHByb2Nlc3NlZCBieSB0aGUgY29udmVydGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTb3J0IGNvbmRpdGlvbnMgZm9yIGEgcHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRDb25kaXRpb25zKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gQ3VycmVudGx5IG5hdmlnYXRpb24gcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBhcyBzb3J0ZXJcblx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpO1xuXHRsZXQgc29ydENvbmRpdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Tb3J0T3JkZXIpIHtcblx0XHRjb25zdCBzb3J0ZXJzOiBTb3J0ZXJUeXBlW10gPSBbXTtcblx0XHRjb25zdCBjb25kaXRpb25zID0ge1xuXHRcdFx0c29ydGVyczogc29ydGVyc1xuXHRcdH07XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uU29ydE9yZGVyLmZvckVhY2goY29uZGl0aW9uID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblByb3BlcnR5ID0gY29uZGl0aW9uLlByb3BlcnR5O1xuXHRcdFx0aWYgKGNvbmRpdGlvblByb3BlcnR5ICYmIG5vblNvcnRhYmxlUHJvcGVydGllcy5pbmRleE9mKGNvbmRpdGlvblByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpID09PSAtMSkge1xuXHRcdFx0XHRjb25zdCBpbmZvTmFtZSA9IGNvbnZlcnRQcm9wZXJ0eVBhdGhzVG9JbmZvTmFtZXMoW2NvbmRpdGlvblByb3BlcnR5XSwgY29sdW1ucylbMF07XG5cdFx0XHRcdGlmIChpbmZvTmFtZSkge1xuXHRcdFx0XHRcdGNvbmRpdGlvbnMuc29ydGVycy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IGluZm9OYW1lLFxuXHRcdFx0XHRcdFx0ZGVzY2VuZGluZzogISFjb25kaXRpb24uRGVzY2VuZGluZ1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0c29ydENvbmRpdGlvbnMgPSBjb25kaXRpb25zLnNvcnRlcnMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkoY29uZGl0aW9ucykgOiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHNvcnRDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHByb3BlcnR5UGF0aCB0byBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXMuXG4gKlxuICogQHBhcmFtIHBhdGhzIHRoZSBhcnJheSB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSBjb2x1bW5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eUluZm9zXG4gKiBAcmV0dXJucyBhbiBhcnJheSBvZiBwcm9wZXJ0eUluZm8gbmFtZXNcbiAqL1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKHBhdGhzOiBQcm9wZXJ0eVBhdGhbXSwgY29sdW1uczogVGFibGVDb2x1bW5bXSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgaW5mb05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRwYXRocy5mb3JFYWNoKGN1cnJlbnRQYXRoID0+IHtcblx0XHRpZiAoY3VycmVudFBhdGg/LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mbyA9IGNvbHVtbnMuZmluZChjb2x1bW4gPT4ge1xuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdFx0cmV0dXJuICFhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IGN1cnJlbnRQYXRoPy4kdGFyZ2V0Py5uYW1lO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvKSB7XG5cdFx0XHRcdGluZm9OYW1lcy5wdXNoKHByb3BlcnR5SW5mby5uYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBpbmZvTmFtZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgZ3JvdXAgY29uZGl0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1ByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIENvbnZlcnRlciBwcm9jZXNzZWQgdGFibGUgY29sdW1uc1xuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gR3JvdXAgY29uZGl0aW9ucyBmb3IgYSBQcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGdyb3VwQ29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lkdyb3VwQnkpIHtcblx0XHRjb25zdCBhR3JvdXBCeSA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLkdyb3VwQnkgYXMgUHJvcGVydHlQYXRoW107XG5cdFx0Y29uc3QgYUdyb3VwTGV2ZWxzID0gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhR3JvdXBCeSwgY29sdW1ucykubWFwKGluZm9OYW1lID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IGluZm9OYW1lIH07XG5cdFx0fSk7XG5cblx0XHRncm91cENvbmRpdGlvbnMgPSBhR3JvdXBMZXZlbHMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkoeyBncm91cExldmVsczogYUdyb3VwTGV2ZWxzIH0pIDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBncm91cENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgUHJlc2VudGF0aW9uIFZhcmlhbnQgYWdncmVnYXRlIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHtQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkfSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiBQcmVzZW50YXRpb24gdmFyaWFudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gY29sdW1ucyBDb252ZXJ0ZXIgcHJvY2Vzc2VkIHRhYmxlIGNvbHVtbnNcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEdyb3VwIGNvbmRpdGlvbnMgZm9yIGEgUHJlc2VudGF0aW9uIHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZUNvbmRpdGlvbnMoXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgYWdncmVnYXRlQ29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlRvdGFsKSB7XG5cdFx0Y29uc3QgYVRvdGFscyA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLlRvdGFsIGFzIFByb3BlcnR5UGF0aFtdO1xuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4gPSB7fTtcblx0XHRjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKGFUb3RhbHMsIGNvbHVtbnMpLmZvckVhY2goaW5mb05hbWUgPT4ge1xuXHRcdFx0YWdncmVnYXRlc1tpbmZvTmFtZV0gPSB7fTtcblx0XHR9KTtcblxuXHRcdGFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBKU09OLnN0cmluZ2lmeShhZ2dyZWdhdGVzKTtcblx0fVxuXG5cdHJldHVybiBhZ2dyZWdhdGVDb25kaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24ge1xuXHQvLyBOZWVkIHRvIGdldCB0aGUgdGFyZ2V0XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGl0bGU6IGFueSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZVBsdXJhbDtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5U2V0O1xuXHRjb25zdCBwYWdlTWFuaWZlc3RTZXR0aW5nczogTWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgaGFzQWJzb2x1dGVQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggPT09IDAsXG5cdFx0cDEzbk1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldFAxM25Nb2RlKHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiksXG5cdFx0aWQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gVGFibGVJRCh2aXN1YWxpemF0aW9uUGF0aCkgOiBUYWJsZUlEKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSwgXCJMaW5lSXRlbVwiKTtcblx0Y29uc3QgdGFyZ2V0Q2FwYWJpbGl0aWVzID0gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdFx0dmlld0NvbmZpZ3VyYXRpb25cblx0KTtcblx0Y29uc3QgaXNEZWxldGVCdXR0b25WaXNpYmxlID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRpc0RlbGV0ZUJ1dHRvblZpc2libGVcblx0KTtcblx0bGV0IHRocmVzaG9sZCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyAxMCA6IDMwO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/Lk1heEl0ZW1zKSB7XG5cdFx0dGhyZXNob2xkID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uTWF4SXRlbXMudmFsdWVPZigpIGFzIG51bWJlcjtcblx0fVxuXG5cdGNvbnN0IGNyZWF0aW9uQmVoYXZpb3VyID0gX2dldENyZWF0aW9uQmVoYXZpb3VyKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncyk7XG5cdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50OiBWYXJpYW50TWFuYWdlbWVudFR5cGUgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBpc1NlYXJjaGFibGUgPSBpc1BhdGhTZWFyY2hhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgdGFibGVBY3Rpb25zID0ge1xuXHRcdGNyZWF0ZTogZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0XCJkZWxldGVcIjogZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0cGFzdGU6IGdldFN0YW5kYXJkQWN0aW9uUGFzdGUoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCksXG5cdFx0bWFzc0VkaXQ6IGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgc2VsZWN0aW9uTW9kZSlcblx0fTtcblx0Y29uc3QgaXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQgPSBnZXRJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGluZyhcblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRcdGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZUFjdGlvbnMuY3JlYXRlLnZpc2libGUgPT09IFwiZmFsc2VcIlxuXHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aWQ6IGlkLFxuXHRcdGVudGl0eU5hbWU6IGVudGl0eVNldCA/IGVudGl0eVNldC5uYW1lIDogXCJcIixcblx0XHRjb2xsZWN0aW9uOiBnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSxcblx0XHRuYXZpZ2F0aW9uUGF0aDogbmF2aWdhdGlvblByb3BlcnR5UGF0aCxcblx0XHRyb3c6IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkoXG5cdFx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0XHR2aXN1YWxpemF0aW9uUGF0aCxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHRuYXZpZ2F0aW9uVGFyZ2V0UGF0aFxuXHRcdCksXG5cdFx0cDEzbk1vZGU6IHAxM25Nb2RlLFxuXHRcdHN0YW5kYXJkQWN0aW9uczoge1xuXHRcdFx0YWN0aW9uczogdGFibGVBY3Rpb25zLFxuXHRcdFx0aXNJbnNlcnRVcGRhdGVUZW1wbGF0ZWQ6IGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkXG5cdFx0fSxcblx0XHRkaXNwbGF5TW9kZTogaXNJbkRpc3BsYXlNb2RlKGNvbnZlcnRlckNvbnRleHQsIHZpZXdDb25maWd1cmF0aW9uKSxcblx0XHRjcmVhdGU6IGNyZWF0aW9uQmVoYXZpb3VyLFxuXHRcdHNlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbk1vZGUsXG5cdFx0YXV0b0JpbmRPbkluaXQ6XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSAmJlxuXHRcdFx0ISh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKSxcblx0XHR2YXJpYW50TWFuYWdlbWVudDogdmFyaWFudE1hbmFnZW1lbnQgPT09IFwiQ29udHJvbFwiICYmICFwMTNuTW9kZSA/IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Ob25lIDogdmFyaWFudE1hbmFnZW1lbnQsXG5cdFx0dGhyZXNob2xkOiB0aHJlc2hvbGQsXG5cdFx0c29ydENvbmRpdGlvbnM6IGdldFNvcnRDb25kaXRpb25zKGNvbnZlcnRlckNvbnRleHQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCBjb2x1bW5zKSxcblx0XHR0aXRsZTogdGl0bGUsXG5cdFx0c2VhcmNoYWJsZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhKGlzQ29uc3RhbnQoaXNTZWFyY2hhYmxlKSAmJiBpc1NlYXJjaGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGU6IHN0cmluZywgaXNDb21wbGV4UHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZTogc3RyaW5nID0gXCJTdHJpbmdcIjtcblx0aWYgKGlzQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAoZGF0YVR5cGUpIHtcblx0XHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiTnVtYmVyXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFZG0uVGltZU9mRGF5XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG59XG5cbmZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyB1cGRhdGFibGUgd2lsbCBiZSBoYW5kbGVkIGF0IHRoZSBwcm9wZXJ0eSBsZXZlbFxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgdGhlIHZpc3VhbGl6YXRpb24gcGF0aCBpbnRvIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGggYW5kIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0bGV0IFtuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSB2aXN1YWxpemF0aW9uUGF0aC5zcGxpdChcIkBcIik7XG5cblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID09PSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHQvLyBEcm9wIHRyYWlsaW5nIHNsYXNoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguc3Vic3RyKDAsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSk7XG5cdH1cblx0cmV0dXJuIHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGggfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihzZWxlY3Rpb25WYXJpYW50UGF0aCk7XG5cdGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGUgPSByZXNvbHZlZFRhcmdldC5hbm5vdGF0aW9uIGFzIFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXG5cdGlmIChzZWxlY3Rpb24pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHNlbGVjdGlvbi5TZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZXMuaW5kZXhPZihQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2goUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGVja0NvbmRlbnNlZExheW91dDogYm9vbGVhbiA9IGZhbHNlXG4pOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlU2V0dGluZ3MgPSAodGFibGVNYW5pZmVzdFNldHRpbmdzICYmIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzKSB8fCB7fTtcblx0bGV0IHF1aWNrU2VsZWN0aW9uVmFyaWFudDogYW55O1xuXHRjb25zdCBxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdID0gW107XG5cdGxldCBlbmFibGVFeHBvcnQgPSB0cnVlO1xuXHRsZXQgY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGxldCBmaWx0ZXJzO1xuXHRsZXQgY3JlYXRlQXRFbmQgPSB0cnVlO1xuXHRsZXQgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA9IGZhbHNlO1xuXHRsZXQgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRsZXQgY29uZGVuc2VkVGFibGVMYXlvdXQgPSBmYWxzZTtcblx0bGV0IGhpZGVUYWJsZVRpdGxlID0gZmFsc2U7XG5cdGxldCB0YWJsZVR5cGU6IFRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gZmFsc2U7XG5cdGxldCBzZWxlY3Rpb25MaW1pdCA9IDIwMDtcblx0bGV0IG11bHRpU2VsZWN0TW9kZTtcblx0Y29uc3QgZW5hYmxlQXV0b0NvbHVtbldpZHRoID0gIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpO1xuXHRjb25zdCBlbmFibGVQYXN0ZSA9XG5cdFx0dGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSAhPT0gdW5kZWZpbmVkID8gdGFibGVTZXR0aW5ncy5lbmFibGVQYXN0ZSA6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFwiT2JqZWN0UGFnZVwiOyAvLyBQYXN0ZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGV4Y2VwdGVkIGZvciBPUFxuXHRjb25zdCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50ID0gY2hlY2tDb25kZW5zZWRMYXlvdXQgJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc0NvbmRlbnNlZExheW91dENvbXBsaWFudCgpO1xuXHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKTtcblx0XHR0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzPy5mb3JFYWNoKChwYXRoOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSkgPT4ge1xuXHRcdFx0cXVpY2tTZWxlY3Rpb25WYXJpYW50ID0gdGFyZ2V0RW50aXR5VHlwZS5yZXNvbHZlUGF0aChcIkBcIiArIHBhdGguYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Ly8gcXVpY2tTZWxlY3Rpb25WYXJpYW50ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihwYXRoLmFubm90YXRpb25QYXRoKTtcblx0XHRcdGlmIChxdWlja1NlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0cXVpY2tGaWx0ZXJQYXRocy5wdXNoKHsgYW5ub3RhdGlvblBhdGg6IHBhdGguYW5ub3RhdGlvblBhdGggfSk7XG5cdFx0XHR9XG5cdFx0XHRmaWx0ZXJzID0ge1xuXHRcdFx0XHRxdWlja0ZpbHRlcnM6IHtcblx0XHRcdFx0XHRlbmFibGVkOlxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHRcdFx0XHRcdFx0PyBcIns9ICR7cGFnZUludGVybmFsPmhhc1BlbmRpbmdGaWx0ZXJzfSAhPT0gdHJ1ZX1cIlxuXHRcdFx0XHRcdFx0XHQ6IHRydWUsXG5cdFx0XHRcdFx0c2hvd0NvdW50czogdGFibGVTZXR0aW5ncz8ucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5zaG93Q291bnRzLFxuXHRcdFx0XHRcdHBhdGhzOiBxdWlja0ZpbHRlclBhdGhzXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0Y3JlYXRpb25Nb2RlID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/Lm5hbWUgfHwgY3JlYXRpb25Nb2RlO1xuXHRcdGNyZWF0ZUF0RW5kID0gdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgOiB0cnVlO1xuXHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdFx0Ly8gaWYgYSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQsIGkuZS4gc2V0IHRvIGZhbHNlXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSA9ICFjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPyAhIXRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIDogZmFsc2U7XG5cdFx0Y29uZGVuc2VkVGFibGVMYXlvdXQgPSB0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0ICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0IDogZmFsc2U7XG5cdFx0aGlkZVRhYmxlVGl0bGUgPSAhIXRhYmxlU2V0dGluZ3MucXVpY2tWYXJpYW50U2VsZWN0aW9uPy5oaWRlVGFibGVUaXRsZTtcblx0XHR0YWJsZVR5cGUgPSB0YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiKSB7XG5cdFx0XHRpZiAodGFibGVTZXR0aW5ncz8udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdFx0XHR0YWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0YWJsZVNldHRpbmdzPy50eXBlKSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzRGVza3RvcCgpICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRcdFx0XHR0YWJsZVR5cGUgPSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gSWYgZW5hYmxlRnVsbFNjcmVlbiBpcyBub3Qgc2V0LCB1c2UgYXMgZGVmYXVsdCB0cnVlIG9uIHBob25lIGFuZCBmYWxzZSBvdGhlcndpc2Vcblx0XHRlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuID8/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaXNQaG9uZSgpO1xuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCBvbiBMaXN0UmVwb3J0IGZvciBkZXNrdG9wIG9yIHRhYmxldFxuXHRcdGlmIChcblx0XHRcdCFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzUGhvbmUoKSAmJlxuXHRcdFx0ZW5hYmxlRnVsbFNjcmVlbiAmJlxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnRcblx0XHQpIHtcblx0XHRcdGVuYWJsZUZ1bGxTY3JlZW4gPSBmYWxzZTtcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsIElzc3VlU2V2ZXJpdHkuTG93LCBJc3N1ZVR5cGUuRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQpO1xuXHRcdH1cblx0XHRzZWxlY3Rpb25MaW1pdCA9IHRhYmxlU2V0dGluZ3Muc2VsZWN0QWxsID09PSB0cnVlIHx8IHRhYmxlU2V0dGluZ3Muc2VsZWN0aW9uTGltaXQgPT09IDAgPyAwIDogdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCB8fCAyMDA7XG5cdFx0aWYgKHRhYmxlVHlwZSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHQpIHtcblx0XHRcdFx0bXVsdGlTZWxlY3RNb2RlID0gISF0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA/IFwiRGVmYXVsdFwiIDogXCJDbGVhckFsbFwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlKSB7XG5cdFx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLnVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0XHRcdG11bHRpU2VsZWN0TW9kZSA9ICEhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkRlZmF1bHRcIiA6IFwiQ2xlYXJBbGxcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gZmFsc2UgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRlbmFibGVFeHBvcnQgPVxuXHRcdFx0dGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHRhYmxlU2V0dGluZ3MuZW5hYmxlRXhwb3J0XG5cdFx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gXCJPYmplY3RQYWdlXCIgfHwgZW5hYmxlUGFzdGU7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRmaWx0ZXJzOiBmaWx0ZXJzLFxuXHRcdHR5cGU6IHRhYmxlVHlwZSxcblx0XHRlbmFibGVGdWxsU2NyZWVuOiBlbmFibGVGdWxsU2NyZWVuLFxuXHRcdGhlYWRlclZpc2libGU6ICEocXVpY2tTZWxlY3Rpb25WYXJpYW50ICYmIGhpZGVUYWJsZVRpdGxlKSxcblx0XHRlbmFibGVFeHBvcnQ6IGVuYWJsZUV4cG9ydCxcblx0XHRjcmVhdGlvbk1vZGU6IGNyZWF0aW9uTW9kZSxcblx0XHRjcmVhdGVBdEVuZDogY3JlYXRlQXRFbmQsXG5cdFx0ZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YTogZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSxcblx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogY29uZGVuc2VkVGFibGVMYXlvdXQgJiYgaXNDb25kZW5zZWRUYWJsZUxheW91dENvbXBsaWFudCxcblx0XHRzZWxlY3Rpb25MaW1pdDogc2VsZWN0aW9uTGltaXQsXG5cdFx0bXVsdGlTZWxlY3RNb2RlOiBtdWx0aVNlbGVjdE1vZGUsXG5cdFx0ZW5hYmxlUGFzdGU6IGVuYWJsZVBhc3RlLFxuXHRcdHNob3dSb3dDb3VudDpcblx0XHRcdCF0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHRlbmFibGVNYXNzRWRpdDogdGFibGVTZXR0aW5ncz8uZW5hYmxlTWFzc0VkaXQsXG5cdFx0ZW5hYmxlQXV0b0NvbHVtbldpZHRoOiBlbmFibGVBdXRvQ29sdW1uV2lkdGhcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zID0ge1xuXHRwYXJzZUFzU3RyaW5nPzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc/OiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzOiBjb25maWdUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRsZXQgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGlmICghb1RhcmdldE1hcHBpbmcgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSAmJiAob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlPy5fdHlwZSA9PT0gXCJUeXBlRGVmaW5pdGlvblwiKSB7XG5cdFx0b1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWygob1Byb3BlcnR5IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlIGFzIFR5cGVEZWZpbml0aW9uKS51bmRlcmx5aW5nVHlwZV07XG5cdH1cblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnOiBjb25maWdUeXBlID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nLnR5cGUsXG5cdFx0Y29uc3RyYWludHM6IHt9LFxuXHRcdGZvcm1hdE9wdGlvbnM6IHt9XG5cdH07XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCJdICYmXG5cdFx0XHRcdChvUHJvcGVydHkgYXMgUHJvcGVydHkpLmFubm90YXRpb25zPy5Db21tb24/LklzRGlnaXRTZXF1ZW5jZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0fTtcblx0fVxuXHRwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRwYXJzZUFzU3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBmYWxzZVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRlbXB0eVN0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gcHJvcGVydHlUeXBlQ29uZmlnO1xufVxuIl19
|
|
2612
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRhYmxlLnRzIl0sIm5hbWVzIjpbIkNvbHVtblR5cGUiLCJnZXRUYWJsZUFjdGlvbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJuYXZpZ2F0aW9uU2V0dGluZ3MiLCJhVGFibGVBY3Rpb25zIiwiZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyIsImFBbm5vdGF0aW9uQWN0aW9ucyIsInRhYmxlQWN0aW9ucyIsImFIaWRkZW5BY3Rpb25zIiwiaGlkZGVuVGFibGVBY3Rpb25zIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJnZXRBY3Rpb25zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImFjdGlvbnMiLCJpc05hdmlnYWJsZSIsImVuYWJsZU9uU2VsZWN0IiwiZW5hYmxlQXV0b1Njcm9sbCIsImVuYWJsZWQiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJnZXRUYWJsZUNvbHVtbnMiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiY29sdW1ucyIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwid2lkdGgiLCJpbXBvcnRhbmNlIiwiYXZhaWxhYmlsaXR5Iiwic2V0dGluZ3MiLCJob3Jpem9udGFsQWxpZ24iLCJmb3JtYXRPcHRpb25zIiwiZ2V0QWdncmVnYXRlRGVmaW5pdGlvbnNGcm9tRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJ0YWJsZUNvbHVtbnMiLCJhZ2dyZWdhdGlvbkhlbHBlciIsIkFnZ3JlZ2F0aW9uSGVscGVyIiwiZmluZENvbHVtbkZyb21QYXRoIiwicGF0aCIsImZpbmQiLCJjb2x1bW4iLCJhbm5vdGF0aW9uQ29sdW1uIiwicHJvcGVydHlJbmZvcyIsInVuZGVmaW5lZCIsInJlbGF0aXZlUGF0aCIsImlzQW5hbHl0aWNzU3VwcG9ydGVkIiwibUN1cnJlbmN5T3JVbml0UHJvcGVydGllcyIsIlNldCIsImZvckVhY2giLCJvQ29sdW1uIiwib1RhYmxlQ29sdW1uIiwidW5pdCIsImFkZCIsImFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucyIsImdldEN1c3RvbUFnZ3JlZ2F0ZURlZmluaXRpb25zIiwibVJhd0RlZmluaXRpb25zIiwiYW5ub3RhdGlvbiIsIm9BZ2dyZWdhdGVkUHJvcGVydHkiLCJfZW50aXR5VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJvUHJvcGVydHkiLCJuYW1lIiwicXVhbGlmaWVyIiwiYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJhbm5vdGF0aW9ucyIsIkFnZ3JlZ2F0aW9uIiwiQ29udGV4dERlZmluaW5nUHJvcGVydGllcyIsIm1hcCIsIm9DdHhEZWZQcm9wZXJ0eSIsInZhbHVlIiwibVJlc3VsdCIsImFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzIiwiaGFzIiwiaXNEYXRhUG9pbnRGYWtlVGFyZ2V0UHJvcGVydHkiLCJkZWZhdWx0QWdncmVnYXRlIiwiY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lIiwicHVzaCIsImxlbmd0aCIsImNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMiLCJ1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3MiLCJ0YWJsZVZpc3VhbGl6YXRpb24iLCJwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiIsImNvbnRyb2wiLCJ0eXBlIiwiYWdncmVnYXRlc0RlZmluaXRpb25zIiwiZW5hYmxlQW5hbHl0aWNzIiwiYWdncmVnYXRlcyIsImFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMiLCJnZXRBbGxvd2VkVHJhbnNmb3JtYXRpb25zIiwiZW5hYmxlQW5hbHl0aWNzU2VhcmNoIiwiaW5kZXhPZiIsImdyb3VwQ29uZGl0aW9ucyIsImdldEdyb3VwQ29uZGl0aW9ucyIsImFnZ3JlZ2F0ZUNvbmRpdGlvbnMiLCJnZXRBZ2dyZWdhdGVDb25kaXRpb25zIiwiZ2V0TmF2aWdhdGlvblRhcmdldFBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwibWFuaWZlc3RXcmFwcGVyIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24iLCJuYXZDb25maWciLCJPYmplY3QiLCJrZXlzIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJjb250ZXh0UGF0aCIsImdldENvbnRleHRQYXRoIiwibmF2Q29uZmlnRm9yQ29udGV4dFBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJzdGFydGluZ0VudGl0eVNldCIsInVwZGF0ZUxpbmtlZFByb3BlcnRpZXMiLCJmaW5kQ29sdW1uQnlQYXRoIiwib1Byb3AiLCJvVW5pdCIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsIm9Vbml0Q29sdW1uIiwic1VuaXQiLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwiVW5pdCIsInVuaXRUZXh0IiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsInRleHRBbm5vdGF0aW9uIiwiQ29tbW9uIiwiVGV4dCIsImlzUGF0aEV4cHJlc3Npb24iLCJvVGV4dENvbHVtbiIsInRleHRBcnJhbmdlbWVudCIsInRleHRQcm9wZXJ0eSIsIm1vZGUiLCJjcmVhdGVUYWJsZVZpc3VhbGl6YXRpb24iLCJpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50Iiwidmlld0NvbmZpZ3VyYXRpb24iLCJ0YWJsZU1hbmlmZXN0Q29uZmlnIiwiZ2V0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJzcGxpdFBhdGgiLCJuYXZpZ2F0aW9uVGFyZ2V0UGF0aCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIm9WaXN1YWxpemF0aW9uIiwiVmlzdWFsaXphdGlvblR5cGUiLCJUYWJsZSIsImdldFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24iLCJyZW1vdmVEdXBsaWNhdGVBY3Rpb25zIiwiSlNPTiIsInN0cmluZ2lmeSIsIm9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMiLCJnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzIiwiY3JlYXRlRGVmYXVsdFRhYmxlVmlzdWFsaXphdGlvbiIsImdldENvbHVtbnNGcm9tRW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJhZGRUb01hcCIsImtleSIsImRhdGFGaWVsZCIsIiRUeXBlIiwiYWN0aW9uTmFtZSIsIkFjdGlvbiIsIkRldGVybWluaW5nIiwiYWN0aW9uVGFyZ2V0IiwiQWN0aW9uVGFyZ2V0IiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsInBhcmFtZXRlcnMiLCJiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJ0YXJnZXRFeHByZXNzaW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJiaW5kaW5nQ29udGV4dFBhdGhWaXNpdG9yIiwiZ2V0Q3VycmVudEVudGl0eVNldFVwZGF0YWJsZVBhdGgiLCJyZXN0cmljdGlvbnMiLCJnZXRSZXN0cmljdGlvbnMiLCJlbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJ1cGRhdGFibGUiLCJpc1VwZGF0YWJsZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJpc0NvbnN0YW50IiwiZXhwcmVzc2lvbiIsIm5hdmlnYXRpb25FeHByZXNzaW9uIiwiX3R5cGUiLCJ1cGRhdGFibGVQcm9wZXJ0eVBhdGgiLCJDYXBhYmlsaXRpZXMiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJVcGRhdGFibGUiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lIiwic2l6ZSIsInRpdGxlUHJvcGVydHkiLCJVSSIsIkhlYWRlckluZm8iLCJUaXRsZSIsIlZhbHVlIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQiLCJjdXJyZW50RW50aXR5VHlwZSIsImNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNFbnRpdHlTZXQiLCJhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMiLCJpc0JvdW5kIiwic291cmNlRW50aXR5VHlwZSIsIlJlcXVpcmVzQ29udGV4dCIsIklubGluZSIsInZhbHVlT2YiLCJIaWRkZW4iLCJlcXVhbCIsImdldEJpbmRpbmdFeHBGcm9tQ29udGV4dCIsInNvdXJjZSIsInNFeHByZXNzaW9uIiwidmlzaWJsZSIsInNQYXRoIiwic3Vic3RyaW5nIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic05hdmlnYXRpb25QYXRoIiwidGFyZ2V0T2JqZWN0IiwicGFydG5lciIsImJpbmRpbmdFeHByZXNzaW9uIiwic2xpY2UiLCJjb25zdGFudCIsImhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJzb21lIiwiaGFzQ3VzdG9tQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIiLCJtYW5pZmVzdEFjdGlvbnMiLCJhY3Rpb25LZXkiLCJhY3Rpb24iLCJyZXF1aXJlc1NlbGVjdGlvbiIsInRvU3RyaW5nIiwiZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0IiwiYVZpc2libGVQYXRoRXhwcmVzc2lvbnMiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsImdldENhcGFiaWxpdHlSZXN0cmljdGlvbiIsImlzRGVsZXRhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwiaXNQYXRoVXBkYXRhYmxlIiwiZ2V0U2VsZWN0aW9uTW9kZSIsInRhcmdldENhcGFiaWxpdGllcyIsImRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uIiwibWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbiIsIlNlbGVjdGlvbk1vZGUiLCJOb25lIiwidGFibGVNYW5pZmVzdFNldHRpbmdzIiwic2VsZWN0aW9uTW9kZSIsInRhYmxlU2V0dGluZ3MiLCJhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zIiwiYVZpc2libGVCaW5kaW5nRXhwcmVzc2lvbnMiLCJpc1BhcmVudERlbGV0YWJsZSIsInBhcmVudEVudGl0eVNldERlbGV0YWJsZSIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIk9iamVjdFBhZ2UiLCJjb21waWxlQmluZGluZyIsImJNYXNzRWRpdEVuYWJsZWQiLCJpZkVsc2UiLCJhbmQiLCJJc0VkaXRhYmxlIiwiTXVsdGkiLCJBdXRvIiwiU2luZ2xlIiwiYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJvciIsImVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJjb25jYXQiLCJ0YWJsZUFjdGlvbiIsImlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJBY3Rpb25UeXBlIiwiRGF0YUZpZWxkRm9yQWN0aW9uIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwibm90IiwiZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbiIsIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiIsIkRlZmF1bHQiLCJnZXRIaWdobGlnaHRSb3dCaW5kaW5nIiwiY3JpdGljYWxpdHlBbm5vdGF0aW9uIiwiaXNEcmFmdFJvb3QiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24iLCJNZXNzYWdlVHlwZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsImFNaXNzaW5nS2V5cyIsImZvcm1hdFJlc3VsdCIsIkVudGl0eSIsIkhhc0FjdGl2ZSIsIklzQWN0aXZlIiwidGFibGVGb3JtYXR0ZXJzIiwicm93SGlnaGxpZ2h0aW5nIiwiX2dldENyZWF0aW9uQmVoYXZpb3VyIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJuYXZpZ2F0aW9uIiwiY3JlYXRlIiwiZGV0YWlsIiwib3V0Ym91bmQiLCJvdXRib3VuZERldGFpbCIsIm5ld0FjdGlvbiIsInRhcmdldEFubm90YXRpb25zIiwiRHJhZnRSb290IiwiTmV3QWN0aW9uIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIkVycm9yIiwicm91dGUiLCJhcHBlbmQiLCJjcmVhdGVBdEVuZCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJOZXdQYWdlIiwiX2dldFJvd0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJwcmVzc1Byb3BlcnR5IiwibmF2aWdhdGlvblRhcmdldCIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJkaXNwbGF5IiwidGFyZ2V0IiwiQ3JpdGljYWxpdHkiLCJEcmFmdE5vZGUiLCJyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uIiwibmF2aWdhdGVkUm93IiwicHJlc3MiLCJyb3dOYXZpZ2F0ZWQiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJ0YWJsZVR5cGUiLCJwcm9wZXJ0eSIsImV4aXN0cyIsInRhcmdldFR5cGUiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsInNlbWFudGljS2V5cyIsImdldEFubm90YXRpb25zQnlUZXJtIiwib0NvbHVtbkRyYWZ0SW5kaWNhdG9yIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzVGVtcGxhdGUiLCJ3cmFwIiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImV4cG9ydFVuaXROYW1lIiwidW5pdFByb3BlcnR5IiwiZXhwb3J0VW5pdFN0cmluZyIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSIsImV4cG9ydFR5cGUiLCJfZ2V0RXhwb3J0RGF0YVR5cGUiLCJzRGF0ZUlucHV0Rm9ybWF0IiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJvVHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsIm9Gb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaW5wdXRGb3JtYXQiLCJzY2FsZSIsImRlbGltaXRlciIsInRydWVWYWx1ZSIsImZhbHNlVmFsdWUiLCJvVW5pdFByb3BlcnR5Iiwic1VuaXRUZXh0IiwiaXNHcm91cGFibGUiLCJpc1Byb3BlcnR5R3JvdXBhYmxlIiwiQW5ub3RhdGlvbiIsImxhYmVsIiwiX2dldExhYmVsIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwic2VtYW50aWNPYmplY3RQYXRoIiwiQXZhaWxhYmlsaXR5VHlwZSIsIkFkYXB0YXRpb24iLCJEYXRhRmllbGREZWZhdWx0IiwiVGFyZ2V0IiwiJHRhcmdldCIsInNvcnRhYmxlIiwiaXNLZXkiLCJjYXNlU2Vuc2l0aXZlIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwidHlwZUNvbmZpZyIsInZpc3VhbFNldHRpbmdzIiwid2lkdGhDYWxjdWxhdGlvbiIsImdldEltcG9ydGFuY2UiLCJzVG9vbHRpcCIsIl9nZXRUb29sdGlwIiwidG9vbHRpcCIsIl9pc1ZhbGlkQ29sdW1uIiwiX2dldFZpc2libGVFeHByZXNzaW9uIiwiZGF0YUZpZWxkTW9kZWxQYXRoIiwicmV0dXJuRXhwcmVzc2lvbiIsInByb3BlcnR5VmFsdWUiLCJpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkIiwiaXNBbmFseXRpY3MiLCJJc0V4cGFuZGVkIiwiaXNBbmFseXRpY2FsTGVhZiIsIk5vZGVMZXZlbCIsIl9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJkYXRhRmllbGRHcm91cCIsImZpZWxkRm9ybWF0T3B0aW9ucyIsImFGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJEYXRhIiwiaW5uZXJEYXRhRmllbGQiLCJpc1Byb3BlcnR5IiwiZGF0YUZpZWxkRGVmYXVsdCIsIkxhYmVsIiwiaXNEYXRhRmllbGRUeXBlcyIsIlF1aWNrSW5mbyIsImRhdGFwb2ludFRhcmdldCIsImdldFJvd1N0YXR1c1Zpc2liaWxpdHkiLCJnZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyIiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZENvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsIm9Db2x1bW5zIiwiYUNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsImlzTGFzdFNsYXNoIiwiaXNMYXN0UGFydCIsImlTbGFzaEluZGV4IiwibGFzdEluZGV4T2YiLCJfaXNDb2x1bW5Tb3J0YWJsZSIsInByb3BlcnR5UGF0aCIsImlzU29ydGFibGUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJGaWx0ZXJGdW5jdGlvbnMiLCJnZXRFbnRpdHlDb250YWluZXIiLCJpc0FycmF5IiwiZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSIsInRleHRMaW5lc0VkaXQiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzIiwiYVNlbWFudGljS2V5VmFsdWVzIiwiYlNlbWFudGljS2V5Rm91bmQiLCJpIiwidmFsdWVzIiwic2VtYW50aWNLZXlGb3VuZCIsIl9maW5kUHJvcGVydGllcyIsInNlbWFudGljS2V5VmFsdWVzIiwiZmllbGRHcm91cFByb3BlcnRpZXMiLCJzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwIiwic1Byb3BlcnR5UGF0aCIsInRtcCIsImZpZWxkR3JvdXBQcm9wZXJ0eVBhdGgiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwIiwiYVByb3BlcnRpZXMiLCJfcHJvcGVydGllc0ZvdW5kIiwiaXNGaWVsZEdyb3VwQ29sdW1uIiwic2VtYW50aWNLZXkiLCJzZW1hbnRpY0tleUluRmllbGRHcm91cCIsImhhc0RyYWZ0SW5kaWNhdG9yIiwic2VtYW50aWNrZXlzIiwib2JqZWN0U3RhdHVzVGV4dFZpc2liaWxpdHkiLCJGaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGgiLCJGaWVsZEdyb3VwTmFtZSIsIl9nZXRJbXBOdW1iZXIiLCJJbXBvcnRhbmNlIiwiaW5jbHVkZXMiLCJfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZSIsIl9nZXRNYXhJbXBvcnRhbmNlIiwiZmllbGRzIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJmaWVsZCIsImZpZWxkc1dpdGhJbXBvcnRhbmNlIiwibWFwU2VtYW50aWNLZXlzIiwiZmllbGRHcm91cERhdGEiLCJmaWVsZEdyb3VwSGFzU2VtYW50aWNLZXkiLCJmaWVsZEdyb3VwRGF0YUZpZWxkIiwiSGlnaCIsImZpbHRlciIsIml0ZW0iLCJnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMiLCJsaW5lSXRlbSIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5Iiwic0xhYmVsIiwiZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwidmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQiLCJleGNsdWRlUHJvcGVydGllcyIsIndpZHRoT3ZlcnJpZGUiLCJGRSIsIlNpdHVhdGlvbnMiLCJGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbiIsIkhUTUw1IiwiQ3NzRGVmYXVsdHMiLCJleHBvcnRDb250YWN0UHJvcGVydHkiLCJleHBvcnRTZXR0aW5nc0NvbnRhY3RQcm9wZXJ0eSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJyZXNvbHZlUGF0aCIsIl9hcHBlbmRDdXN0b21UZW1wbGF0ZSIsIl9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiaXNBbm5vdGF0aW9uQ29sdW1uIiwiaW50ZXJuYWxDb2x1bW5zIiwibWFuaWZlc3RDb2x1bW4iLCJ2YWxpZGF0ZUtleSIsIk1lc3NhZ2UiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIk1hbmlmZXN0IiwiSXNzdWVTZXZlcml0eSIsIkxvdyIsIklzc3VlQ2F0ZWdvcnlUeXBlIiwiQW5ub3RhdGlvbkNvbHVtbnMiLCJJbnZhbGlkS2V5IiwiaWQiLCJoZWFkZXIiLCJIb3Jpem9udGFsQWxpZ24iLCJCZWdpbiIsIlNsb3QiLCJwb3NpdGlvbiIsImFuY2hvciIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwiaXNBY3Rpb25OYXZpZ2FibGUiLCJmaWVsZExhYmVsIiwiZ2V0UDEzbk1vZGUiLCJ2YXJpYW50TWFuYWdlbWVudCIsImdldFZhcmlhbnRNYW5hZ2VtZW50IiwiYVBlcnNvbmFsaXphdGlvbiIsImJBbmFseXRpY2FsVGFibGUiLCJwZXJzb25hbGl6YXRpb24iLCJzb3J0IiwiYWdncmVnYXRlIiwiTGlzdFJlcG9ydCIsIlZhcmlhbnRNYW5hZ2VtZW50VHlwZSIsIkNvbnRyb2wiLCJfaXNGaWx0ZXJCYXJIaWRkZW4iLCJpc0ZpbHRlckJhckhpZGRlbiIsImhhc011bHRpcGxlVmlzdWFsaXphdGlvbnMiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJnZXRTb3J0Q29uZGl0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsInNvcnRDb25kaXRpb25zIiwiU29ydE9yZGVyIiwic29ydGVycyIsImNvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJjb25kaXRpb25Qcm9wZXJ0eSIsIlByb3BlcnR5IiwiaW5mb05hbWUiLCJjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzIiwiZGVzY2VuZGluZyIsIkRlc2NlbmRpbmciLCJwYXRocyIsImluZm9OYW1lcyIsImN1cnJlbnRQYXRoIiwiR3JvdXBCeSIsImFHcm91cEJ5IiwiYUdyb3VwTGV2ZWxzIiwiZ3JvdXBMZXZlbHMiLCJUb3RhbCIsImFUb3RhbHMiLCJ0aXRsZSIsIlR5cGVOYW1lUGx1cmFsIiwicGFnZU1hbmlmZXN0U2V0dGluZ3MiLCJoYXNBYnNvbHV0ZVBhdGgiLCJwMTNuTW9kZSIsIlRhYmxlSUQiLCJjcmVhdGlvbkJlaGF2aW91ciIsInN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwiY3JlYXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24iLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwibWFzc0VkaXRCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiIsImdldE1hc3NFZGl0VmlzaWJpbGl0eSIsImlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQiLCJ0aHJlc2hvbGQiLCJNYXhJdGVtcyIsImlzU2VhcmNoYWJsZSIsImlzUGF0aFNlYXJjaGFibGUiLCJzdGFuZGFyZEFjdGlvbnMiLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImdldFN0YW5kYXJkQWN0aW9uRGVsZXRlIiwicGFzdGUiLCJnZXRTdGFuZGFyZEFjdGlvblBhc3RlIiwibWFzc0VkaXQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwiY3JlYXRpb25Sb3ciLCJnZXRDcmVhdGlvblJvdyIsImVudGl0eU5hbWUiLCJjb2xsZWN0aW9uIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsIm5hdmlnYXRpb25QYXRoIiwicm93IiwiaXNJbkRpc3BsYXlNb2RlIiwiYXV0b0JpbmRPbkluaXQiLCJzZWFyY2hhYmxlIiwiaXNDb21wbGV4UHJvcGVydHkiLCJleHBvcnREYXRhVHlwZSIsInN1YnN0ciIsImdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uIiwic2VsZWN0aW9uVmFyaWFudFBhdGgiLCJyZXNvbHZlZFRhcmdldCIsImdldEVudGl0eVR5cGVBbm5vdGF0aW9uIiwic2VsZWN0aW9uIiwicHJvcGVydHlOYW1lcyIsIlNlbGVjdE9wdGlvbnMiLCJzZWxlY3RPcHRpb24iLCJQcm9wZXJ0eU5hbWUiLCJQcm9wZXJ0eVBhdGgiLCJ0ZXh0IiwiX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlIiwiaXNJcGhvbmUiLCJlbmFibGVGdWxsU2NyZWVuIiwiSXNzdWVUeXBlIiwiRlVMTFNDUkVFTk1PREVfTk9UX09OX0xJU1RSRVBPUlQiLCJfZ2V0TXVsdGlTZWxlY3RNb2RlIiwibXVsdGlTZWxlY3RNb2RlIiwic2VsZWN0QWxsIiwidXNlSWNvblRhYkJhciIsIl9nZXRUYWJsZVR5cGUiLCJpc0Rlc2t0b3AiLCJfZ2V0RmlsdGVycyIsInF1aWNrRmlsdGVyUGF0aHMiLCJxdWlja1NlbGVjdGlvblZhcmlhbnQiLCJxdWlja0ZpbHRlcnMiLCJzaG93Q291bnRzIiwicXVpY2tWYXJpYW50U2VsZWN0aW9uIiwiX2dldEVuYWJsZUV4cG9ydCIsImVuYWJsZVBhc3RlIiwiZW5hYmxlRXhwb3J0IiwiX2dldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJmaWx0ZXJzIiwiaGlkZVRhYmxlVGl0bGUiLCJoZWFkZXJWaXNpYmxlIiwiY2hlY2tDb25kZW5zZWRMYXlvdXQiLCJlbmFibGVBdXRvQ29sdW1uV2lkdGgiLCJpc1Bob25lIiwiZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyIiwiaXNDb25kZW5zZWRMYXlvdXRDb21wbGlhbnQiLCJvRmlsdGVyQ29uZmlndXJhdGlvbiIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImNvbmRlbnNlZFRhYmxlTGF5b3V0Iiwib0NvbmZpZ3VyYXRpb24iLCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIiwiZW5hYmxlTWFzc0VkaXQiLCJzZWxlY3Rpb25MaW1pdCIsInNob3dSb3dDb3VudCIsImdldFZpZXdDb25maWd1cmF0aW9uIiwidXNlQ29uZGVuc2VkVGFibGVMYXlvdXQiLCJvVGFyZ2V0TWFwcGluZyIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsIiRTY2FsZSIsInByZWNpc2lvbiIsIiRQcmVjaXNpb24iLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJtaW5pbXVtIiwiaXNOYU4iLCJWYWxpZGF0aW9uIiwiTWluaW11bSIsIm1heGltdW0iLCJNYXhpbXVtIiwiaXNEaWdpdFNlcXVlbmNlIiwiSXNEaWdpdFNlcXVlbmNlIiwicGFyc2VBc1N0cmluZyIsImVtcHR5U3RyaW5nIiwicGFyc2VLZWVwc0VtcHR5U3RyaW5nIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUEwTktBLFU7O2FBQUFBLFU7QUFBQUEsSUFBQUEsVTtBQUFBQSxJQUFBQSxVO0FBQUFBLElBQUFBLFU7S0FBQUEsVSxL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QUFBQSxrQkFBa0IsQ0FBRTlSLElBQXBCLGtGQUEwQk8sT0FBMUIsQ0FBa0MsZ0NBQWxDLE9BQXdFLENBRHhFLEdBRUcsRUFGSCxHQUdHL0MsU0FWOEI7QUFXbEMrb0IsTUFBQUEscUJBQXFCLEVBQUV6VSxrQkFBa0IsQ0FBQzlSLElBQW5CLEtBQTRCLGdDQUE1QixHQUErRCxJQUEvRCxHQUFzRXhDO0FBWDNELEtBQW5DO0FBYUEsV0FBT3NVLGtCQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eVR5cGUsIFByb3BlcnR5LCBUeXBlRGVmaW5pdGlvbiB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRDcml0aWNhbGl0eVR5cGUsXG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHREYXRhUG9pbnQsXG5cdERhdGFQb2ludFR5cGVUeXBlcyxcblx0RW51bVZhbHVlLFxuXHRGaWVsZEdyb3VwVHlwZSxcblx0TGluZUl0ZW0sXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0UHJvcGVydHlQYXRoLFxuXHRTZWxlY3Rpb25WYXJpYW50VHlwZSxcblx0U2VsZWN0T3B0aW9uVHlwZSxcblx0VUlBbm5vdGF0aW9uVHlwZXNcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBGaWx0ZXJGdW5jdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ29tbW9uXCI7XG5pbXBvcnQgeyBTZW1hbnRpY0tleSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy90eXBlcy9nZW5lcmF0ZWQvQ29tbW9uXCI7XG5pbXBvcnQge1xuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMsXG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5LFxuXHRDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRnZXREYXRhRmllbGREYXRhVHlwZSxcblx0Z2V0U2VtYW50aWNPYmplY3RQYXRoLFxuXHRpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbixcblx0aXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCxcblx0aXNEYXRhRmllbGRUeXBlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7XG5cdEFubm90YXRpb25BY3Rpb24sXG5cdEJhc2VBY3Rpb24sXG5cdEN1c3RvbUFjdGlvbixcblx0Z2V0QWN0aW9uc0Zyb21NYW5pZmVzdCxcblx0aXNBY3Rpb25OYXZpZ2FibGUsXG5cdHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL0FjdGlvblwiO1xuaW1wb3J0IHsgYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvciwgRW50aXR5LCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IElzc3VlQ2F0ZWdvcnksIElzc3VlQ2F0ZWdvcnlUeXBlLCBJc3N1ZVNldmVyaXR5LCBJc3N1ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB0YWJsZUZvcm1hdHRlcnMgZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJUeXBlc1wiO1xuaW1wb3J0IHtcblx0YW5kLFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QmluZGluZ0V4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb24sXG5cdGNvbXBpbGVCaW5kaW5nLFxuXHRjb25zdGFudCxcblx0ZXF1YWwsXG5cdEV4cHJlc3Npb24sXG5cdEV4cHJlc3Npb25PclByaW1pdGl2ZSxcblx0Zm9ybWF0UmVzdWx0LFxuXHRpZkVsc2UsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0b3IsXG5cdHJlc29sdmVCaW5kaW5nU3RyaW5nXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdGlzUGF0aERlbGV0YWJsZSxcblx0aXNQYXRoU2VhcmNoYWJsZSxcblx0aXNQYXRoVXBkYXRhYmxlXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IERpc3BsYXlNb2RlLCBFRE1fVFlQRV9NQVBQSU5HLCBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9FbnRpdHlTZXRIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50LFxuXHRpc1BhdGhFeHByZXNzaW9uLFxuXHRpc1Byb3BlcnR5XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vLi4vQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9BZ2dyZWdhdGlvblwiO1xuaW1wb3J0IHsgVGFibGVJRCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0lEXCI7XG5pbXBvcnQge1xuXHRBY3Rpb25UeXBlLFxuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDcmVhdGlvbk1vZGUsXG5cdEZvcm1hdE9wdGlvbnNUeXBlLFxuXHRIb3Jpem9udGFsQWxpZ24sXG5cdEltcG9ydGFuY2UsXG5cdE1hbmlmZXN0VGFibGVDb2x1bW4sXG5cdE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb24sXG5cdE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25Nb2RlLFxuXHRUYWJsZUNvbHVtblNldHRpbmdzLFxuXHRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0VGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0VGVtcGxhdGVUeXBlLFxuXHRWYXJpYW50TWFuYWdlbWVudFR5cGUsXG5cdFZpZXdQYXRoQ29uZmlndXJhdGlvbixcblx0VmlzdWFsaXphdGlvblR5cGVcbn0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCBNYW5pZmVzdFdyYXBwZXIgZnJvbSBcIi4uLy4uL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7XG5cdGdlbmVyYXRlU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Z2V0Q3JlYXRlVmlzaWJpbGl0eSxcblx0Z2V0Q3JlYXRpb25Sb3csXG5cdGdldERlbGV0ZVZpc2liaWxpdHksXG5cdGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nLFxuXHRnZXRNYXNzRWRpdFZpc2liaWxpdHksXG5cdGdldFJlc3RyaWN0aW9ucyxcblx0Z2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUsXG5cdGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlLFxuXHRnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0LFxuXHRnZXRTdGFuZGFyZEFjdGlvblBhc3RlLFxuXHRpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQsXG5cdGlzSW5EaXNwbGF5TW9kZSxcblx0U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlXG59IGZyb20gXCIuL3RhYmxlL1N0YW5kYXJkQWN0aW9uc1wiO1xuXG5leHBvcnQgdHlwZSBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uID0ge1xuXHRhdXRvQmluZE9uSW5pdDogYm9vbGVhbjtcblx0Y29sbGVjdGlvbjogc3RyaW5nO1xuXHR2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlO1xuXHRmaWx0ZXJJZD86IHN0cmluZztcblx0aWQ6IHN0cmluZztcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZztcblx0cDEzbk1vZGU/OiBzdHJpbmc7XG5cdHJvdz86IHtcblx0XHRhY3Rpb24/OiBzdHJpbmc7XG5cdFx0cHJlc3M/OiBzdHJpbmc7XG5cdFx0cm93SGlnaGxpZ2h0aW5nOiBCaW5kaW5nRXhwcmVzc2lvbjxNZXNzYWdlVHlwZT47XG5cdFx0cm93TmF2aWdhdGVkOiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0c2VsZWN0aW9uTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGU+O1xuXHRcdGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkOiBib29sZWFuO1xuXHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHR9O1xuXHRkaXNwbGF5TW9kZT86IGJvb2xlYW47XG5cdHRocmVzaG9sZDogbnVtYmVyO1xuXHRlbnRpdHlOYW1lOiBzdHJpbmc7XG5cdHNvcnRDb25kaXRpb25zPzogc3RyaW5nO1xuXHRncm91cENvbmRpdGlvbnM/OiBzdHJpbmc7XG5cdGFnZ3JlZ2F0ZUNvbmRpdGlvbnM/OiBzdHJpbmc7XG5cblx0LyoqIENyZWF0ZSBuZXcgZW50cmllcyAqL1xuXHRjcmVhdGU6IENyZWF0ZUJlaGF2aW9yIHwgQ3JlYXRlQmVoYXZpb3JFeHRlcm5hbDtcblx0dGl0bGU6IHN0cmluZztcblx0c2VhcmNoYWJsZTogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogTmV3IGVudHJpZXMgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBhcHAgKGRlZmF1bHQgY2FzZSlcbiAqL1xudHlwZSBDcmVhdGVCZWhhdmlvciA9IHtcblx0bW9kZTogQ3JlYXRpb25Nb2RlO1xuXHRhcHBlbmQ6IGJvb2xlYW47XG5cdG5ld0FjdGlvbj86IHN0cmluZztcblx0bmF2aWdhdGVUb1RhcmdldD86IHN0cmluZztcbn07XG5cbi8qKlxuICogTmV3IGVudHJpZXMgYXJlIGNyZWF0ZWQgYnkgbmF2aWdhdGluZyB0byBzb21lIHRhcmdldFxuICovXG50eXBlIENyZWF0ZUJlaGF2aW9yRXh0ZXJuYWwgPSB7XG5cdG1vZGU6IFwiRXh0ZXJuYWxcIjtcblx0b3V0Ym91bmQ6IHN0cmluZztcblx0b3V0Ym91bmREZXRhaWw6IE5hdmlnYXRpb25UYXJnZXRDb25maWd1cmF0aW9uW1wib3V0Ym91bmREZXRhaWxcIl07XG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ2FwYWJpbGl0eVJlc3RyaWN0aW9uID0ge1xuXHRpc0RlbGV0YWJsZTogYm9vbGVhbjtcblx0aXNVcGRhdGFibGU6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUZpbHRlcnNDb25maWd1cmF0aW9uID0ge1xuXHRlbmFibGVkPzogc3RyaW5nIHwgYm9vbGVhbjtcblx0cGF0aHM6IFtcblx0XHR7XG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdH1cblx0XTtcblx0c2hvd0NvdW50cz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiA9IHtcblx0cHJvcGVydHlOYW1lczogc3RyaW5nW107XG5cdHRleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uID0ge1xuXHRjcmVhdGVBdEVuZDogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGU7XG5cdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6IGJvb2xlYW47XG5cdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHR1c2VDb25kZW5zZWRUYWJsZUxheW91dDogYm9vbGVhbjtcblx0ZW5hYmxlRXhwb3J0OiBib29sZWFuO1xuXHRoZWFkZXJWaXNpYmxlOiBib29sZWFuO1xuXHRmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgVGFibGVGaWx0ZXJzQ29uZmlndXJhdGlvbj47XG5cdHR5cGU6IFRhYmxlVHlwZTtcblx0c2VsZWN0QWxsPzogYm9vbGVhbjtcblx0c2VsZWN0aW9uTGltaXQ6IG51bWJlcjtcblx0bXVsdGlTZWxlY3RNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGVuYWJsZVBhc3RlOiBib29sZWFuO1xuXHRlbmFibGVGdWxsU2NyZWVuOiBib29sZWFuO1xuXHRzaG93Um93Q291bnQ6IGJvb2xlYW47XG5cdGVuYWJsZU1hc3NFZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRlbmFibGVBdXRvQ29sdW1uV2lkdGg6IGJvb2xlYW47XG5cdGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVUeXBlID0gXCJHcmlkVGFibGVcIiB8IFwiUmVzcG9uc2l2ZVRhYmxlXCIgfCBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXG5lbnVtIENvbHVtblR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsIC8vIERlZmF1bHQgVHlwZVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIlxufVxuXG5leHBvcnQgdHlwZSBCYXNlVGFibGVDb2x1bW4gPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdGlkOiBzdHJpbmc7XG5cdHdpZHRoPzogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eT86IEF2YWlsYWJpbGl0eVR5cGU7XG5cdHR5cGU6IENvbHVtblR5cGU7IC8vT3JpZ2luIG9mIHRoZSBzb3VyY2Ugd2hlcmUgd2UgYXJlIGdldHRpbmcgdGhlIHRlbXBsYXRlZCBpbmZvcm1hdGlvbiBmcm9tLFxuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdHNldHRpbmdzPzogVGFibGVDb2x1bW5TZXR0aW5ncztcblx0c2VtYW50aWNPYmplY3RQYXRoPzogc3RyaW5nO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0aG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuXHRmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZTtcblx0aW1wb3J0YW5jZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGhlYWRlcj86IHN0cmluZztcblx0dGVtcGxhdGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG5cdGxhYmVsPzogc3RyaW5nO1xuXHR0b29sdGlwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM/OiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+O1xuXHRzaG93RGF0YUZpZWxkc0xhYmVsPzogYm9vbGVhbjtcblx0aXNLZXk/OiBib29sZWFuO1xuXHR1bml0Pzogc3RyaW5nO1xuXHR1bml0VGV4dD86IHN0cmluZztcblx0ZXhwb3J0U2V0dGluZ3M/OiB7XG5cdFx0dGVtcGxhdGU/OiBzdHJpbmc7XG5cdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0ZmllbGRMYWJlbD86IHN0cmluZztcblx0XHR3cmFwPzogYm9vbGVhbjtcblx0XHR0eXBlPzogc3RyaW5nO1xuXHRcdGlucHV0Rm9ybWF0Pzogc3RyaW5nO1xuXHRcdGZvcm1hdD86IHN0cmluZztcblx0XHRzY2FsZT86IG51bWJlcjtcblx0XHRkZWxpbWl0ZXI/OiBib29sZWFuO1xuXHRcdHRydWVWYWx1ZT86IGJvb2xlYW47XG5cdFx0ZmFsc2VWYWx1ZT86IGJvb2xlYW47XG5cdFx0dW5pdD86IHN0cmluZztcblx0XHR1bml0UHJvcGVydHk/OiBzdHJpbmc7XG5cdH07XG5cdGlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5PzogYm9vbGVhbjtcblx0dGV4dEFycmFuZ2VtZW50Pzoge1xuXHRcdHRleHRQcm9wZXJ0eTogc3RyaW5nO1xuXHRcdG1vZGU6IERpc3BsYXlNb2RlO1xuXHR9O1xuXHRleHBvcnRDb250YWN0UHJvcGVydHk/OiBzdHJpbmc7XG5cdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdHZpc3VhbFNldHRpbmdzPzogVmlzdWFsU2V0dGluZ3M7XG5cdHR5cGVDb25maWc/OiBvYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBWaXN1YWxTZXR0aW5ncyA9IHtcblx0d2lkdGhDYWxjdWxhdGlvbj86IFdpZHRoQ2FsY3VsYXRpb247XG59O1xuXG5leHBvcnQgdHlwZSBXaWR0aENhbGN1bGF0aW9uID0gbnVsbCB8IHtcblx0bWluV2lkdGg/OiBudW1iZXI7XG5cdG1heFdpZHRoPzogbnVtYmVyO1xuXHRkZWZhdWx0V2lkdGg/OiBudW1iZXI7XG5cdGluY2x1ZGVMYWJlbD86IGJvb2xlYW47XG5cdGdhcD86IG51bWJlcjtcblx0Ly8gb25seSByZWxldmFudCBmb3IgY29tcGxleCB0eXBlc1xuXHRleGNsdWRlUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR2ZXJ0aWNhbEFycmFuZ2VtZW50PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ29sdW1uID0gQ3VzdG9tVGFibGVDb2x1bW4gfCBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUNvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8VGFibGVDb2x1bW4+O1xuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVEYXRhID0ge1xuXHRkZWZhdWx0QWdncmVnYXRlOiB7XG5cdFx0Y29udGV4dERlZmluaW5nUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHR9O1xuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0dHlwZTogVmlzdWFsaXphdGlvblR5cGUuVGFibGU7XG5cdGFubm90YXRpb246IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb247XG5cdGNvbnRyb2w6IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW107XG5cdGFjdGlvbnM6IEJhc2VBY3Rpb25bXTtcblx0YWdncmVnYXRlcz86IFJlY29yZDxzdHJpbmcsIEFnZ3JlZ2F0ZURhdGE+O1xuXHRlbmFibGVBbmFseXRpY3M/OiBib29sZWFuO1xuXHRlbmFibGVBbmFseXRpY3NTZWFyY2g/OiBib29sZWFuO1xuXHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IHN0cmluZztcblx0b3BlcmF0aW9uQXZhaWxhYmxlUHJvcGVydGllczogc3RyaW5nO1xufTtcblxudHlwZSBTb3J0ZXJUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGRlc2NlbmRpbmc6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGFubm90YXRpb24tYmFzZWQgYW5kIG1hbmlmZXN0LWJhc2VkIHRhYmxlIGFjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtMaW5lSXRlbX0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtCYXNlQWN0aW9ufSBUaGUgY29tcGxldGUgdGFibGUgYWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBY3Rpb25zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRuYXZpZ2F0aW9uU2V0dGluZ3M/OiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBCYXNlQWN0aW9uW10ge1xuXHRjb25zdCBhVGFibGVBY3Rpb25zID0gZ2V0VGFibGVBbm5vdGF0aW9uQWN0aW9ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYUFubm90YXRpb25BY3Rpb25zID0gYVRhYmxlQWN0aW9ucy50YWJsZUFjdGlvbnM7XG5cdGNvbnN0IGFIaWRkZW5BY3Rpb25zID0gYVRhYmxlQWN0aW9ucy5oaWRkZW5UYWJsZUFjdGlvbnM7XG5cdHJldHVybiBpbnNlcnRDdXN0b21FbGVtZW50cyhcblx0XHRhQW5ub3RhdGlvbkFjdGlvbnMsXG5cdFx0Z2V0QWN0aW9uc0Zyb21NYW5pZmVzdChcblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCkuYWN0aW9ucyxcblx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRhQW5ub3RhdGlvbkFjdGlvbnMsXG5cdFx0XHRuYXZpZ2F0aW9uU2V0dGluZ3MsXG5cdFx0XHR0cnVlLFxuXHRcdFx0YUhpZGRlbkFjdGlvbnNcblx0XHQpLFxuXHRcdHtcblx0XHRcdGlzTmF2aWdhYmxlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZW5hYmxlT25TZWxlY3Q6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0ZW5hYmxlZDogXCJvdmVyd3JpdGVcIixcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogXCJvdmVyd3JpdGVcIlxuXHRcdH1cblx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBjb2x1bW5zLCBhbm5vdGF0aW9uLWJhc2VkIGFzIHdlbGwgYXMgbWFuaWZlc3QgYmFzZWQuXG4gKiBUaGV5IGFyZSBzb3J0ZWQgYW5kIHNvbWUgcHJvcGVydGllcyBjYW4gYmUgb3ZlcndyaXR0ZW4gdmlhIHRoZSBtYW5pZmVzdCAoY2hlY2sgb3V0IHRoZSBrZXlzIHRoYXQgY2FuIGJlIG92ZXJ3cml0dGVuKS5cbiAqXG4gKiBAcGFyYW0ge0xpbmVJdGVtfSBsaW5lSXRlbUFubm90YXRpb24gQ29sbGVjdGlvbiBvZiBkYXRhIGZpZWxkcyBmb3IgcmVwcmVzZW50YXRpb24gaW4gYSB0YWJsZSBvciBsaXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtUYWJsZUNvbHVtbltdfSBSZXR1cm5zIGFsbCB0YWJsZSBjb2x1bW5zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSwgcmVnYXJkbGVzcyBvZiB0ZW1wbGF0aW5nIG9yIHBlcnNvbmFsaXphdGlvbiBvciB0aGVpciBvcmlnaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29sdW1ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzPzogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvblxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGFubm90YXRpb25Db2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyhsaW5lSXRlbUFubm90YXRpb24sIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgbWFuaWZlc3RDb2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLmNvbHVtbnMsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMgYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0bmF2aWdhdGlvblNldHRpbmdzXG5cdCk7XG5cblx0cmV0dXJuIGluc2VydEN1c3RvbUVsZW1lbnRzKGFubm90YXRpb25Db2x1bW5zLCBtYW5pZmVzdENvbHVtbnMsIHtcblx0XHR3aWR0aDogXCJvdmVyd3JpdGVcIixcblx0XHRpbXBvcnRhbmNlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGlzTmF2aWdhYmxlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdGF2YWlsYWJpbGl0eTogXCJvdmVyd3JpdGVcIixcblx0XHRzZXR0aW5nczogXCJvdmVyd3JpdGVcIixcblx0XHRob3Jpem9udGFsQWxpZ246IFwib3ZlcndyaXRlXCIsXG5cdFx0Zm9ybWF0T3B0aW9uczogXCJvdmVyd3JpdGVcIlxuXHR9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY3VzdG9tIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25zIGZyb20gdGhlIGVudGl0eVR5cGUuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgZm9yIHRoZSBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgZW50aXR5VHlwZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSBlbnRpdHkgZG9lc24ndCBzdXBwb3J0IGFuYWx5dGljYWwgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgQWdncmVnYXRlRGF0YT4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRmdW5jdGlvbiBmaW5kQ29sdW1uRnJvbVBhdGgocGF0aDogc3RyaW5nKTogVGFibGVDb2x1bW4gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdGlmICghYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBLZWVwIGEgc2V0IG9mIGFsbCBjdXJyZW5jeS91bml0IHByb3BlcnRpZXMsIGFzIHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIgdGhlbSBhcyBhZ2dyZWdhdGVzXG5cdC8vIFRoZXkgYXJlIGFnZ3JlZ2F0ZXMgZm9yIHRlY2huaWNhbCByZWFzb25zICh0byBtYW5hZ2UgbXVsdGktdW5pdHMgc2l0dWF0aW9ucykgYnV0IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBmcm9tIGEgdXNlciBzdGFuZHBvaW50XG5cdGNvbnN0IG1DdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMgPSBuZXcgU2V0KCk7XG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sdW1uKSA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi51bml0KSB7XG5cdFx0XHRtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmFkZChvVGFibGVDb2x1bW4udW5pdCk7XG5cdFx0fVxuXHR9KTtcblxuXHRjb25zdCBhQ3VzdG9tQWdncmVnYXRlQW5ub3RhdGlvbnMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRDdXN0b21BZ2dyZWdhdGVEZWZpbml0aW9ucygpO1xuXHRjb25zdCBtUmF3RGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG5cdGFDdXN0b21BZ2dyZWdhdGVBbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0ZWRQcm9wZXJ0eSA9IGFnZ3JlZ2F0aW9uSGVscGVyLl9lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmluZCgob1Byb3BlcnR5KSA9PiB7XG5cdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IGFubm90YXRpb24ucXVhbGlmaWVyO1xuXHRcdH0pO1xuXG5cdFx0aWYgKG9BZ2dyZWdhdGVkUHJvcGVydHkpIHtcblx0XHRcdGNvbnN0IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gYW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uQWdncmVnYXRpb24/LkNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRtUmF3RGVmaW5pdGlvbnNbb0FnZ3JlZ2F0ZWRQcm9wZXJ0eS5uYW1lXSA9IGFDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzXG5cdFx0XHRcdD8gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMubWFwKChvQ3R4RGVmUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBvQ3R4RGVmUHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBbXTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBtUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBBZ2dyZWdhdGVEYXRhPiA9IHt9O1xuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sdW1uKSA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgYVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMgPSBtUmF3RGVmaW5pdGlvbnNbb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aF07XG5cblx0XHRcdC8vIElnbm9yZSBhZ2dyZWdhdGVzIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVuY2llcyBvciB1bml0cyBvZiBtZWFzdXJlIGFuZCBkdW1teSBjcmVhdGVkIHByb3BlcnR5IGZvciBkYXRhcG9pbnQgdGFyZ2V0IFZhbHVlXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFSYXdDb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzICYmXG5cdFx0XHRcdCFtQ3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzLmhhcyhvVGFibGVDb2x1bW4ubmFtZSkgJiZcblx0XHRcdFx0IW9UYWJsZUNvbHVtbi5pc0RhdGFQb2ludEZha2VUYXJnZXRQcm9wZXJ0eVxuXHRcdFx0KSB7XG5cdFx0XHRcdG1SZXN1bHRbb1RhYmxlQ29sdW1uLm5hbWVdID0ge1xuXHRcdFx0XHRcdGRlZmF1bHRBZ2dyZWdhdGU6IHt9LFxuXHRcdFx0XHRcdHJlbGF0aXZlUGF0aDogb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb25zdCBhQ29udGV4dERlZmluaW5nUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0YVJhd0NvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMuZm9yRWFjaCgoY29udGV4dERlZmluaW5nUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbHVtbiA9IGZpbmRDb2x1bW5Gcm9tUGF0aChjb250ZXh0RGVmaW5pbmdQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHRcdGlmIChvQ29sdW1uKSB7XG5cdFx0XHRcdFx0XHRhQ29udGV4dERlZmluaW5nUHJvcGVydGllcy5wdXNoKG9Db2x1bW4ubmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0bVJlc3VsdFtvVGFibGVDb2x1bW4ubmFtZV0uZGVmYXVsdEFnZ3JlZ2F0ZS5jb250ZXh0RGVmaW5pbmdQcm9wZXJ0aWVzID0gYUNvbnRleHREZWZpbmluZ1Byb3BlcnRpZXM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBtUmVzdWx0O1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIGEgdGFibGUgdmlzdWFsaXphdGlvbiBmb3IgYW5hbHl0aWNhbCB1c2UgY2FzZXMuXG4gKlxuICogQHBhcmFtIHRhYmxlVmlzdWFsaXphdGlvbiBUaGUgdmlzdWFsaXphdGlvbiB0byBiZSB1cGRhdGVkXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZGlzcGxheWVkIGluIHRoZSB0YWJsZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gVGhlIHByZXNlbnRhdGlvblZhcmlhbnQgYW5ub3RhdGlvbiAoaWYgYW55KVxuICovXG5mdW5jdGlvbiB1cGRhdGVUYWJsZVZpc3VhbGl6YXRpb25Gb3JBbmFseXRpY3MoXG5cdHRhYmxlVmlzdWFsaXphdGlvbjogVGFibGVWaXN1YWxpemF0aW9uLFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXNcbikge1xuXHRpZiAodGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGFnZ3JlZ2F0ZXNEZWZpbml0aW9ucyA9IGdldEFnZ3JlZ2F0ZURlZmluaXRpb25zRnJvbUVudGl0eVR5cGUoZW50aXR5VHlwZSwgdGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdFx0aWYgKGFnZ3JlZ2F0ZXNEZWZpbml0aW9ucykge1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyA9IHRydWU7XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYWdncmVnYXRlcyA9IGFnZ3JlZ2F0ZXNEZWZpbml0aW9ucztcblxuXHRcdFx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRjb25zdCBhbGxvd2VkVHJhbnNmb3JtYXRpb25zID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0QWxsb3dlZFRyYW5zZm9ybWF0aW9ucygpO1xuXHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljc1NlYXJjaCA9IGFsbG93ZWRUcmFuc2Zvcm1hdGlvbnMgPyBhbGxvd2VkVHJhbnNmb3JtYXRpb25zLmluZGV4T2YoXCJzZWFyY2hcIikgPj0gMCA6IHRydWU7XG5cblx0XHRcdC8vIEFkZCBncm91cCBhbmQgc29ydCBjb25kaXRpb25zIGZyb20gdGhlIHByZXNlbnRhdGlvbiB2YXJpYW50XG5cdFx0XHR0YWJsZVZpc3VhbGl6YXRpb24uYW5ub3RhdGlvbi5ncm91cENvbmRpdGlvbnMgPSBnZXRHcm91cENvbmRpdGlvbnMocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24sIHRhYmxlVmlzdWFsaXphdGlvbi5jb2x1bW5zKTtcblx0XHRcdHRhYmxlVmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbHVtbnNcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGFibGVWaXN1YWxpemF0aW9uLmNvbnRyb2wudHlwZSA9IFwiR3JpZFRhYmxlXCI7IC8vIEFuYWx5dGljYWxUYWJsZSBpc24ndCBhIHJlYWwgdHlwZSBmb3IgdGhlIE1EQzpUYWJsZSwgc28gd2UgYWx3YXlzIHN3aXRjaCBiYWNrIHRvIEdyaWRcblx0fVxufVxuXG4vKipcbiAqIEdldCB0aGUgbmF2aWdhdGlvbiB0YXJnZXQgcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggVGhlIG5hdmlnYXRpb24gcGF0aCB0byBjaGVjayBpbiB0aGUgbWFuaWZlc3Qgc2V0dGluZ3NcbiAqIEByZXR1cm5zIE5hdmlnYXRpb24gcGF0aCBmcm9tIG1hbmlmZXN0IHNldHRpbmdzXG4gKi9cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRjb25zdCBtYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnR5UGF0aCAmJiBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblByb3BlcnR5UGF0aCkpIHtcblx0XHRjb25zdCBuYXZDb25maWcgPSBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24obmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKG5hdkNvbmZpZykubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0Y29uc3QgbmF2Q29uZmlnRm9yQ29udGV4dFBhdGggPSBtYW5pZmVzdFdyYXBwZXIuZ2V0TmF2aWdhdGlvbkNvbmZpZ3VyYXRpb24oY29udGV4dFBhdGgpO1xuXHRpZiAobmF2Q29uZmlnRm9yQ29udGV4dFBhdGggJiYgT2JqZWN0LmtleXMobmF2Q29uZmlnRm9yQ29udGV4dFBhdGgpLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gY29udGV4dFBhdGg7XG5cdH1cblxuXHRyZXR1cm4gZGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQgPyBkYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldC5uYW1lIDogZGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lO1xufVxuXG4vKipcbiAqIFNldHMgdGhlICd1bml0JyBhbmQgJ3RleHRBcnJhbmdlbWVudCcgcHJvcGVydGllcyBpbiBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBjb2x1bW5zIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoZW50aXR5VHlwZTogRW50aXR5VHlwZSwgdGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdKSB7XG5cdGZ1bmN0aW9uIGZpbmRDb2x1bW5CeVBhdGgocGF0aDogc3RyaW5nKTogVGFibGVDb2x1bW4gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcGF0aDtcblx0XHR9KTtcblx0fVxuXG5cdHRhYmxlQ29sdW1ucy5mb3JFYWNoKChvQ29sdW1uKSA9PiB7XG5cdFx0Y29uc3Qgb1RhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKG9UYWJsZUNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKG9Qcm9wOiBQcm9wZXJ0eSkgPT4gb1Byb3AubmFtZSA9PT0gb1RhYmxlQ29sdW1uLnJlbGF0aXZlUGF0aCk7XG5cdFx0XHRpZiAob1Byb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IG9Vbml0ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkob1Byb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KG9Qcm9wZXJ0eSk7XG5cdFx0XHRcdGlmIChvVW5pdCkge1xuXHRcdFx0XHRcdGNvbnN0IG9Vbml0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aChvVW5pdC5uYW1lKTtcblx0XHRcdFx0XHRvVGFibGVDb2x1bW4udW5pdCA9IG9Vbml0Q29sdW1uPy5uYW1lO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHNVbml0ID0gb1Byb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IG9Qcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdFx0XHRcdGlmIChzVW5pdCkge1xuXHRcdFx0XHRcdFx0b1RhYmxlQ29sdW1uLnVuaXRUZXh0ID0gYCR7c1VuaXR9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKG9Qcm9wZXJ0eSksXG5cdFx0XHRcdFx0dGV4dEFubm90YXRpb24gPSBvUHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5UZXh0O1xuXHRcdFx0XHRpZiAoaXNQYXRoRXhwcmVzc2lvbih0ZXh0QW5ub3RhdGlvbikgJiYgZGlzcGxheU1vZGUgIT09IFwiVmFsdWVcIikge1xuXHRcdFx0XHRcdGNvbnN0IG9UZXh0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0ZXh0QW5ub3RhdGlvbi5wYXRoKTtcblx0XHRcdFx0XHRpZiAob1RleHRDb2x1bW4gJiYgb1RleHRDb2x1bW4ubmFtZSAhPT0gb1RhYmxlQ29sdW1uLm5hbWUpIHtcblx0XHRcdFx0XHRcdG9UYWJsZUNvbHVtbi50ZXh0QXJyYW5nZW1lbnQgPSB7XG5cdFx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eTogb1RleHRDb2x1bW4ubmFtZSxcblx0XHRcdFx0XHRcdFx0bW9kZTogZGlzcGxheU1vZGVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhYmxlVmlzdWFsaXphdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/OiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzLFxuXHRpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50PzogYm9vbGVhbixcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFRhYmxlVmlzdWFsaXphdGlvbiB7XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RDb25maWcgPSBnZXRUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihcblx0XHRsaW5lSXRlbUFubm90YXRpb24sXG5cdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50XG5cdCk7XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblRhcmdldFBhdGggPSBnZXROYXZpZ2F0aW9uVGFyZ2V0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgbmF2aWdhdGlvblNldHRpbmdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IGNvbHVtbnMgPSBnZXRUYWJsZUNvbHVtbnMobGluZUl0ZW1Bbm5vdGF0aW9uLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCwgbmF2aWdhdGlvblNldHRpbmdzKTtcblx0Y29uc3Qgb3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gZ2V0T3BlcmF0aW9uQXZhaWxhYmxlTWFwKGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCk7XG5cblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0dGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRcdGNvbHVtbnMsXG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbixcblx0XHRcdHZpZXdDb25maWd1cmF0aW9uXG5cdFx0KSxcblx0XHRjb250cm9sOiB0YWJsZU1hbmlmZXN0Q29uZmlnLFxuXHRcdGFjdGlvbnM6IHJlbW92ZUR1cGxpY2F0ZUFjdGlvbnMoZ2V0VGFibGVBY3Rpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncykpLFxuXHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBKU09OLnN0cmluZ2lmeShvcGVyYXRpb25BdmFpbGFibGVNYXApLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXM6IGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHR9O1xuXG5cdHVwZGF0ZUxpbmtlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKFxuXHRcdG9WaXN1YWxpemF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uXG5cdCk7XG5cblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRhYmxlVmlzdWFsaXphdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogVGFibGVWaXN1YWxpemF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdENvbmZpZyA9IGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKHVuZGVmaW5lZCwgXCJcIiwgY29udmVydGVyQ29udGV4dCwgZmFsc2UpO1xuXHRjb25zdCBjb2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKHt9LCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgW10sIFtdLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlnLnR5cGUpO1xuXHRjb25zdCBvcGVyYXRpb25BdmFpbGFibGVNYXAgPSBnZXRPcGVyYXRpb25BdmFpbGFibGVNYXAodW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3Qgb1Zpc3VhbGl6YXRpb246IFRhYmxlVmlzdWFsaXphdGlvbiA9IHtcblx0XHR0eXBlOiBWaXN1YWxpemF0aW9uVHlwZS5UYWJsZSxcblx0XHRhbm5vdGF0aW9uOiBnZXRUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uKHVuZGVmaW5lZCwgXCJcIiwgY29udmVydGVyQ29udGV4dCwgdGFibGVNYW5pZmVzdENvbmZpZywgY29sdW1ucyksXG5cdFx0Y29udHJvbDogdGFibGVNYW5pZmVzdENvbmZpZyxcblx0XHRhY3Rpb25zOiBbXSxcblx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogSlNPTi5zdHJpbmdpZnkob3BlcmF0aW9uQXZhaWxhYmxlTWFwKSxcblx0XHRvcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzOiBnZXRPcGVyYXRpb25BdmFpbGFibGVQcm9wZXJ0aWVzKG9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgY29udmVydGVyQ29udGV4dClcblx0fTtcblxuXHR1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBjb2x1bW5zKTtcblx0dXBkYXRlVGFibGVWaXN1YWxpemF0aW9uRm9yQW5hbHl0aWNzKG9WaXN1YWxpemF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKSwgY29udmVydGVyQ29udGV4dCk7XG5cblx0cmV0dXJuIG9WaXN1YWxpemF0aW9uO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG1hcCBvZiBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBwcm9wZXJ0eSBwYXRocyBmb3IgYWxsIERhdGFGaWVsZEZvckFjdGlvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGxpbmUgaXRlbVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IFRoZSByZWNvcmQgY29udGFpbmluZyBhbGwgYWN0aW9uIG5hbWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIENvcmUuT3BlcmF0aW9uQXZhaWxhYmxlIHByb3BlcnR5IHBhdGhzXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZU1hcChsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG5cdGNvbnN0IG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRjb25zdCBhZGRUb01hcCA9IGZ1bmN0aW9uIChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuXHRcdGlmIChrZXkpIHtcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcFtrZXldID0gdmFsdWU7XG5cdFx0fVxuXHR9O1xuXG5cdGlmIChsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRsaW5lSXRlbUFubm90YXRpb24uZm9yRWFjaCgoZGF0YUZpZWxkKSA9PiB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGRhdGFGaWVsZC5BY3Rpb24gYXMgc3RyaW5nO1xuXHRcdFx0XHRpZiAoYWN0aW9uTmFtZT8uaW5kZXhPZihcIi9cIikgPCAwICYmICFkYXRhRmllbGQuRGV0ZXJtaW5pbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhY3Rpb25UYXJnZXQgPSBkYXRhRmllbGQuQWN0aW9uVGFyZ2V0O1xuXHRcdFx0XHRcdGlmIChhY3Rpb25UYXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5PcGVyYXRpb25BdmFpbGFibGUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdC8vIEFubm90YXRpb24gZXhwbGljaXRseSBjb25maWd1cmVkIHdpdGggbnVsbCAoYWN0aW9uIGFkdmVydGlzZW1lbnQgcmVsYXRlZClcblx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIG51bGwpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uVGFyZ2V0Py5wYXJhbWV0ZXJzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJGdWxsTmFtZSA9IGFjdGlvblRhcmdldC5wYXJhbWV0ZXJzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0RXhwcmVzc2lvbiA9IGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSxcblx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gYmluZGluZ0NvbnRleHRQYXRoVmlzaXRvcihwYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBiaW5kaW5nUGFyYW1ldGVyRnVsbE5hbWUpXG5cdFx0XHRcdFx0XHRcdCkgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPHN0cmluZz47XG5cblx0XHRcdFx0XHRcdGlmICh0YXJnZXRFeHByZXNzaW9uPy5wYXRoKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24ucGF0aCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvblRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGFkZFRvTWFwKGFjdGlvbk5hbWUsIHRhcmdldEV4cHJlc3Npb24pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG9wZXJhdGlvbkF2YWlsYWJsZU1hcDtcbn1cblxuLyoqXG4gKiBHZXRzIHVwZGF0YWJsZSBwcm9wZXJ0eVBhdGggZm9yIHRoZSBjdXJyZW50IGVudGl0eXNldCBpZiB2YWxpZC5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdXBkYXRhYmxlIHByb3BlcnR5IGZvciB0aGUgcm93c1xuICovXG5mdW5jdGlvbiBnZXRDdXJyZW50RW50aXR5U2V0VXBkYXRhYmxlUGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zID0gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBlbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRjb25zdCB1cGRhdGFibGUgPSByZXN0cmljdGlvbnMuaXNVcGRhdGFibGU7XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHk6IGFueSA9ICFpc0NvbnN0YW50KHVwZGF0YWJsZS5leHByZXNzaW9uKSAmJiB1cGRhdGFibGUubmF2aWdhdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCI7XG5cdGNvbnN0IHVwZGF0YWJsZVByb3BlcnR5UGF0aCA9IChlbnRpdHlTZXQ/LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uVXBkYXRlUmVzdHJpY3Rpb25zPy5VcGRhdGFibGUgYXMgYW55KT8ucGF0aDtcblxuXHRyZXR1cm4gaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSA/ICh1cGRhdGFibGVQcm9wZXJ0eVBhdGggYXMgc3RyaW5nKSA6IFwiXCI7XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJldHJpZXZlIGFsbCBwcm9wZXJ0eSBwYXRocyBhc3NpZ25lZCB0byB0aGUgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9wZXJhdGlvbkF2YWlsYWJsZU1hcCBUaGUgcmVjb3JkIGNvbnNpc3Rpbmcgb2YgYWN0aW9ucyBhbmQgdGhlaXIgQ29yZS5PcGVyYXRpb25BdmFpbGFibGUgcHJvcGVydHkgcGF0aHNcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgQ1NWIHN0cmluZyBvZiBhbGwgcHJvcGVydHkgcGF0aHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDb3JlLk9wZXJhdGlvbkF2YWlsYWJsZSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkF2YWlsYWJsZVByb3BlcnRpZXMob3BlcmF0aW9uQXZhaWxhYmxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogc3RyaW5nIHtcblx0Y29uc3QgcHJvcGVydGllcyA9IG5ldyBTZXQoKTtcblxuXHRmb3IgKGNvbnN0IGFjdGlvbk5hbWUgaW4gb3BlcmF0aW9uQXZhaWxhYmxlTWFwKSB7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gb3BlcmF0aW9uQXZhaWxhYmxlTWFwW2FjdGlvbk5hbWVdO1xuXHRcdGlmIChwcm9wZXJ0eU5hbWUgPT09IG51bGwpIHtcblx0XHRcdC8vIEFubm90YXRpb24gY29uZmlndXJlZCB3aXRoIGV4cGxpY2l0ICdudWxsJyAoYWN0aW9uIGFkdmVydGlzZW1lbnQgcmVsZXZhbnQpXG5cdFx0XHRwcm9wZXJ0aWVzLmFkZChhY3Rpb25OYW1lKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdC8vIEFkZCBwcm9wZXJ0eSBwYXRocyBhbmQgbm90IENvbnN0YW50IHZhbHVlcy5cblx0XHRcdHByb3BlcnRpZXMuYWRkKHByb3BlcnR5TmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHByb3BlcnRpZXMuc2l6ZSkge1xuXHRcdC8vIFNvbWUgYWN0aW9ucyBoYXZlIGFuIG9wZXJhdGlvbiBhdmFpbGFibGUgYmFzZWQgb24gcHJvcGVydHkgLS0+IHdlIG5lZWQgdG8gbG9hZCB0aGUgSGVhZGVySW5mby5UaXRsZSBwcm9wZXJ0eVxuXHRcdC8vIHNvIHRoYXQgdGhlIGRpYWxvZyBvbiBwYXJ0aWFsIGFjdGlvbnMgaXMgZGlzcGxheWVkIHByb3Blcmx5IChCQ1AgMjE4MDI3MTQyNSlcblx0XHRjb25zdCBlbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCk7XG5cdFx0Y29uc3QgdGl0bGVQcm9wZXJ0eSA9IChlbnRpdHlUeXBlLmFubm90YXRpb25zPy5VST8uSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8ucGF0aDtcblx0XHRpZiAodGl0bGVQcm9wZXJ0eSkge1xuXHRcdFx0cHJvcGVydGllcy5hZGQodGl0bGVQcm9wZXJ0eSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIEFycmF5LmZyb20ocHJvcGVydGllcykuam9pbihcIixcIik7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kXG4gKiByZXR1cm5zIGFsbCB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZXhwcmVzc2lvbnMuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHVzZWQgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIGN1cnJlbnRFbnRpdHlUeXBlIEN1cnJlbnQgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSBjb250ZXh0RGF0YU1vZGVsT2JqZWN0UGF0aCBPYmplY3QgcGF0aCBvZiB0aGUgZGF0YSBtb2RlbFxuICogQHBhcmFtIGlzRW50aXR5U2V0XG4gKiBAcmV0dXJucyBBbGwgdGhlIGBVSS5IaWRkZW5gIHBhdGggZXhwcmVzc2lvbnMgZm91bmQgaW4gdGhlIHJlbGV2YW50IGFjdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VUlIaWRkZW5FeHBGb3JBY3Rpb25zUmVxdWlyaW5nQ29udGV4dChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0Y3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRpc0VudGl0eVNldDogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxib29sZWFuPltdIHtcblx0Y29uc3QgYVVpSGlkZGVuUGF0aEV4cHJlc3Npb25zOiBFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGRhdGFGaWVsZCkgPT4ge1xuXHRcdC8vIENoZWNrIGlmIHRoZSBsaW5lSXRlbSBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGFjdGlvbjpcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiZcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGUpIHx8XG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlJlcXVpcmVzQ29udGV4dCAmJlxuXHRcdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlKVxuXHRcdCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRhVWlIaWRkZW5QYXRoRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRcdGlzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGFVaUhpZGRlblBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgY29udGV4dCBjdXJyZW50bHkgcmVmZXJlbmNlZCBieSB0aGlzIGJpbmRpbmcgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqXG4gKiBJdCBpcyB1c2VkIChzcGVjaWZpY2FsbHkgaW4gdGhpcyBjYXNlKSwgdG8gdHJhbnNmb3JtIGEgYmluZGluZyBtYWRlIGZvciBhIE5hdlByb3AgY29udGV4dCAvTWFpbk9iamVjdC9OYXZQcm9wMS9OYXZQcm9wMixcbiAqIGludG8gYSBiaW5kaW5nIG9uIHRoZSBwcmV2aW91cyBjb250ZXh0IC9NYWluT2JqZWN0L05hdlByb3AxLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgRGF0YUZpZWxkRm9yQWN0aW9uIHwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHwgQ3VzdG9tQWN0aW9uXG4gKiBAcGFyYW0gY29udGV4dERhdGFNb2RlbE9iamVjdFBhdGggRGF0YU1vZGVsT2JqZWN0UGF0aFxuICogQHBhcmFtIGlzRW50aXR5U2V0XG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldEJpbmRpbmdFeHBGcm9tQ29udGV4dChcblx0c291cmNlOiBEYXRhRmllbGRGb3JBY3Rpb24gfCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gfCBDdXN0b21BY3Rpb24sXG5cdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRpc0VudGl0eVNldDogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxhbnk+IHtcblx0bGV0IHNFeHByZXNzaW9uOiBhbnkgfCB1bmRlZmluZWQ7XG5cdGlmIChcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHQoc291cmNlIGFzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cblx0KSB7XG5cdFx0c0V4cHJlc3Npb24gPSAoc291cmNlIGFzIERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbik/LmFubm90YXRpb25zPy5VST8uSGlkZGVuO1xuXHR9IGVsc2Uge1xuXHRcdHNFeHByZXNzaW9uID0gKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlO1xuXHR9XG5cdGxldCBzUGF0aDogc3RyaW5nO1xuXHRpZiAoc0V4cHJlc3Npb24/LnBhdGgpIHtcblx0XHRzUGF0aCA9IHNFeHByZXNzaW9uLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0c1BhdGggPSBzRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoc1BhdGgpIHtcblx0XHRpZiAoKHNvdXJjZSBhcyBDdXN0b21BY3Rpb24pPy52aXNpYmxlKSB7XG5cdFx0XHRzUGF0aCA9IHNQYXRoLnN1YnN0cmluZygxLCBzUGF0aC5sZW5ndGggLSAxKTtcblx0XHR9XG5cdFx0aWYgKHNQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Ly9jaGVjayBpZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBjb3JyZWN0OlxuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IGFTcGxpdFBhdGhbMF07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoPy50YXJnZXRPYmplY3Q/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdGNvbnRleHREYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5wYXJ0bmVyID09PSBzTmF2aWdhdGlvblBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oYVNwbGl0UGF0aC5zbGljZSgxKS5qb2luKFwiL1wiKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIG5hdmlnYXRpb24gcHJvcGVydHksIGlmIGl0J3MgYW4gZW50aXR5U2V0LCB0aGUgZXhwcmVzc2lvbiBiaW5kaW5nIGhhcyB0byBiZSByZXR1cm5lZDpcblx0XHR9IGVsc2UgaWYgKGlzRW50aXR5U2V0KSB7XG5cdFx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oc1BhdGgpO1xuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgY2Fubm90IGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgdGhlIHNlbGVjdGlvbiBtb2RlIGV2YWx1YXRpb246XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xufVxuXG4vKipcbiAqIExvb3AgdGhyb3VnaCB0aGUgRGF0YUZpZWxkRm9yQWN0aW9uIGFuZCBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gb2YgYSBsaW5lIGl0ZW0gYW5kIGNoZWNrXG4gKiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBhbHdheXMgdmlzaWJsZSBpbiB0aGUgdGFibGUgdG9vbGJhciAoYW5kIHJlcXVpcmVzIGEgY29udGV4dCkuXG4gKlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSBjdXJyZW50RW50aXR5VHlwZSBDdXJyZW50IEVudGl0eSBUeXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgYWN0aW9uIHRoYXQgbWVldHMgdGhlIGNyaXRlcmlhXG4gKi9cbmZ1bmN0aW9uIGhhc0JvdW5kQWN0aW9uc0Fsd2F5c1Zpc2libGVJblRvb2xCYXIobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcblx0cmV0dXJuIGxpbmVJdGVtQW5ub3RhdGlvbi5zb21lKChkYXRhRmllbGQpID0+IHtcblx0XHRpZiAoXG5cdFx0XHQoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24gfHxcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24pICYmXG5cdFx0XHRkYXRhRmllbGQ/LklubGluZT8udmFsdWVPZigpICE9PSB0cnVlICYmXG5cdFx0XHQoZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IGZhbHNlIHx8IGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB1bmRlZmluZWQpXG5cdFx0KSB7XG5cdFx0XHRpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb24pIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGxpbmVJdGVtIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgYWN0aW9uOlxuXHRcdFx0XHRyZXR1cm4gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ/LmlzQm91bmQgJiYgY3VycmVudEVudGl0eVR5cGUgPT09IGRhdGFGaWVsZD8uQWN0aW9uVGFyZ2V0LnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBkYXRhRmllbGQuUmVxdWlyZXNDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBoYXNDdXN0b21BY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihtYW5pZmVzdEFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFjdGlvbj4pOiBib29sZWFuIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hbmlmZXN0QWN0aW9ucykuc29tZSgoYWN0aW9uS2V5KSA9PiB7XG5cdFx0Y29uc3QgYWN0aW9uID0gbWFuaWZlc3RBY3Rpb25zW2FjdGlvbktleV07XG5cdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiAmJiBhY3Rpb24udmlzaWJsZT8udG9TdHJpbmcoKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIGN1c3RvbSBhY3Rpb25zICh3aXRoIGtleSByZXF1aXJlc1NlbGVjdGlvbikgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0IGZvciB0aGUgY3VycmVudCBsaW5lIGl0ZW0gYW5kIHJldHVybnMgYWxsIHRoZVxuICogdmlzaWJsZSBrZXkgdmFsdWVzIGFzIGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG1hbmlmZXN0QWN0aW9ucyBUaGUgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdFxuICogQHJldHVybnMgQXJyYXk8RXhwcmVzc2lvbjxib29sZWFuPj4gQWxsIHRoZSB2aXNpYmxlIHBhdGggZXhwcmVzc2lvbnMgb2YgdGhlIGFjdGlvbnMgdGhhdCBtZWV0IHRoZSBjcml0ZXJpYVxuICovXG5mdW5jdGlvbiBnZXRWaXNpYmxlRXhwRm9yQ3VzdG9tQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQobWFuaWZlc3RBY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BY3Rpb24+KTogRXhwcmVzc2lvbjxib29sZWFuPltdIHtcblx0Y29uc3QgYVZpc2libGVQYXRoRXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAobWFuaWZlc3RBY3Rpb25zKSB7XG5cdFx0T2JqZWN0LmtleXMobWFuaWZlc3RBY3Rpb25zKS5mb3JFYWNoKChhY3Rpb25LZXkpID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1hbmlmZXN0QWN0aW9uc1thY3Rpb25LZXldO1xuXHRcdFx0aWYgKGFjdGlvbi5yZXF1aXJlc1NlbGVjdGlvbiA9PT0gdHJ1ZSAmJiBhY3Rpb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgYWN0aW9uLnZpc2libGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHQvKlRoZSBmaW5hbCBhaW0gd291bGQgYmUgdG8gY2hlY2sgaWYgdGhlIHBhdGggZXhwcmVzc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgY29udGV4dFxuXHRcdFx0XHRcdGFuZCBjb25zaWRlcnMgb25seSB0aG9zZSBleHByZXNzaW9ucyBmb3IgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbixcblx0XHRcdFx0XHRidXQgY3VycmVudGx5IG5vdCBwb3NzaWJsZSBmcm9tIHRoZSBtYW5pZmVzdCBhcyB0aGUgdmlzaWJsZSBrZXkgaXMgYm91bmQgb24gdGhlIHBhcmVudCBlbnRpdHkuXG5cdFx0XHRcdFx0VHJpY2t5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHBhdGggYXMgaXQncyBkb25lIGZvciB0aGUgSGlkZGVuIGFubm90YXRpb24uXG5cdFx0XHRcdFx0Rm9yIHRoZSB0aW1lIGJlaW5nIHdlIGNvbnNpZGVyIGFsbCB0aGUgcGF0aHMgb2YgdGhlIG1hbmlmZXN0Ki9cblxuXHRcdFx0XHRcdGFWaXNpYmxlUGF0aEV4cHJlc3Npb25zLnB1c2gocmVzb2x2ZUJpbmRpbmdTdHJpbmcoYWN0aW9uPy52aXNpYmxlPy52YWx1ZU9mKCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBhVmlzaWJsZVBhdGhFeHByZXNzaW9ucztcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSBpZiB0aGUgcGF0aCBpcyBzdGF0aWNhbGx5IGRlbGV0YWJsZSBvciB1cGRhdGFibGUuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbn0gVGhlIHRhYmxlIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBUYWJsZUNhcGFiaWxpdHlSZXN0cmljdGlvbiB7XG5cdGNvbnN0IGlzRGVsZXRhYmxlID0gaXNQYXRoRGVsZXRhYmxlKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKTtcblx0Y29uc3QgaXNVcGRhdGFibGUgPSBpc1BhdGhVcGRhdGFibGUoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzRGVsZXRhYmxlOiAhKGlzQ29uc3RhbnQoaXNEZWxldGFibGUpICYmIGlzRGVsZXRhYmxlLnZhbHVlID09PSBmYWxzZSksXG5cdFx0aXNVcGRhdGFibGU6ICEoaXNDb25zdGFudChpc1VwZGF0YWJsZSkgJiYgaXNVcGRhdGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uTW9kZShcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0aXNFbnRpdHlTZXQ6IGJvb2xlYW4sXG5cdHRhcmdldENhcGFiaWxpdGllczogVGFibGVDYXBhYmlsaXR5UmVzdHJpY3Rpb24sXG5cdGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uPzogRXhwcmVzc2lvbjxib29sZWFuPixcblx0bWFzc0VkaXRWaXNpYmlsaXR5RXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPiA9IGNvbnN0YW50KGZhbHNlKVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHR9XG5cdGNvbnN0IHRhYmxlTWFuaWZlc3RTZXR0aW5ncyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGxldCBzZWxlY3Rpb25Nb2RlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzLnRhYmxlU2V0dGluZ3M/LnNlbGVjdGlvbk1vZGU7XG5cdGxldCBhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zOiBFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXSxcblx0XHRhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdID0gW107XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGdldEFjdGlvbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKS5hY3Rpb25zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0W10sXG5cdFx0dW5kZWZpbmVkLFxuXHRcdGZhbHNlXG5cdCk7XG5cdGxldCBpc1BhcmVudERlbGV0YWJsZSwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlO1xuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2UpIHtcblx0XHRpc1BhcmVudERlbGV0YWJsZSA9IGlzUGF0aERlbGV0YWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdFx0cGFyZW50RW50aXR5U2V0RGVsZXRhYmxlID0gaXNQYXJlbnREZWxldGFibGUgPyBjb21waWxlQmluZGluZyhpc1BhcmVudERlbGV0YWJsZSwgdHJ1ZSkgOiBpc1BhcmVudERlbGV0YWJsZTtcblx0fVxuXG5cdGNvbnN0IGJNYXNzRWRpdEVuYWJsZWQ6IGJvb2xlYW4gPSAhaXNDb25zdGFudChtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uKSB8fCBtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uLnZhbHVlICE9PSBmYWxzZTtcblx0aWYgKHNlbGVjdGlvbk1vZGUgJiYgc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5Ob25lICYmIGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSB7XG5cdFx0aWYgKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5PYmplY3RQYWdlICYmIGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIE1hc3MgRWRpdCBpbiBPUCBpcyBlbmFibGVkIG9ubHkgaW4gZWRpdCBtb2RlLlxuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0YW5kKFVJLklzRWRpdGFibGUsIG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdGNvbnN0YW50KFwiTXVsdGlcIiksXG5cdFx0XHRcdFx0aWZFbHNlKGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChcIk11bHRpXCIpLCBjb25zdGFudChcIk5vbmVcIikpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChiTWFzc0VkaXRFbmFibGVkKSB7XG5cdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5NdWx0aTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoaWZFbHNlKGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uLCBjb25zdGFudChcIk11bHRpXCIpLCBjb25zdGFudChcIk5vbmVcIikpKTtcblx0fVxuXHRpZiAoIXNlbGVjdGlvbk1vZGUgfHwgc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5BdXRvKSB7XG5cdFx0c2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuTXVsdGk7XG5cdH1cblx0aWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBPdmVycmlkZSBkZWZhdWx0IHNlbGVjdGlvbiBtb2RlIHdoZW4gbWFzcyBlZGl0IGlzIHZpc2libGVcblx0XHRzZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5TaW5nbGUgPyBTZWxlY3Rpb25Nb2RlLlNpbmdsZSA6IFNlbGVjdGlvbk1vZGUuTXVsdGk7XG5cdH1cblxuXHRpZiAoXG5cdFx0aGFzQm91bmRBY3Rpb25zQWx3YXlzVmlzaWJsZUluVG9vbEJhcihsaW5lSXRlbUFubm90YXRpb24sIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpKSB8fFxuXHRcdGhhc0N1c3RvbUFjdGlvbnNBbHdheXNWaXNpYmxlSW5Ub29sQmFyKG1hbmlmZXN0QWN0aW9ucylcblx0KSB7XG5cdFx0cmV0dXJuIHNlbGVjdGlvbk1vZGU7XG5cdH1cblx0YUhpZGRlbkJpbmRpbmdFeHByZXNzaW9ucyA9IGdldFVJSGlkZGVuRXhwRm9yQWN0aW9uc1JlcXVpcmluZ0NvbnRleHQoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdGlzRW50aXR5U2V0XG5cdCk7XG5cdGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zID0gZ2V0VmlzaWJsZUV4cEZvckN1c3RvbUFjdGlvbnNSZXF1aXJpbmdDb250ZXh0KG1hbmlmZXN0QWN0aW9ucyk7XG5cblx0Ly8gTm8gYWN0aW9uIHJlcXVpcmluZyBhIGNvbnRleHQ6XG5cdGlmIChcblx0XHRhSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCAmJlxuXHRcdGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zLmxlbmd0aCA9PT0gMCAmJlxuXHRcdChkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiB8fCBiTWFzc0VkaXRFbmFibGVkKVxuXHQpIHtcblx0XHRpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0XHQvLyBFeGFtcGxlOiBPUCBjYXNlXG5cdFx0XHRpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IHBhcmVudEVudGl0eVNldERlbGV0YWJsZSAhPT0gXCJmYWxzZVwiIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdFx0Ly8gQnVpbGRpbmcgZXhwcmVzc2lvbiBmb3IgZGVsZXRlIGFuZCBtYXNzIGVkaXRcblx0XHRcdFx0Y29uc3QgYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBvcihcblx0XHRcdFx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiB8fCB0cnVlLCAvLyBkZWZhdWx0IGRlbGV0ZSB2aXNpYmlsaXR5IGFzIHRydWVcblx0XHRcdFx0XHRtYXNzRWRpdFZpc2liaWxpdHlFeHByZXNzaW9uXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRpZkVsc2UoYW5kKFVJLklzRWRpdGFibGUsIGJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gU2VsZWN0aW9uTW9kZS5Ob25lO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRW50aXR5U2V0IGRlbGV0YWJsZTpcblx0XHR9IGVsc2UgaWYgKGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHRcdC8vIGV4YW1wbGU6IExSIHNjZW5hcmlvXG5cdFx0XHRyZXR1cm4gc2VsZWN0aW9uTW9kZTtcblx0XHR9IGVsc2UgaWYgKHRhcmdldENhcGFiaWxpdGllcy5pc0RlbGV0YWJsZSAmJiBkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGlmRWxzZShkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbiwgY29uc3RhbnQoc2VsZWN0aW9uTW9kZSksIGNvbnN0YW50KFwiTm9uZVwiKSkpO1xuXHRcdFx0Ly8gRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBTZWxlY3Rpb25Nb2RlLk5vbmU7XG5cdFx0fVxuXHRcdC8vIFRoZXJlIGFyZSBhY3Rpb25zIHJlcXVpcmluZyBhIGNvbnRleHQ6XG5cdH0gZWxzZSBpZiAoIWlzRW50aXR5U2V0KSB7XG5cdFx0Ly8gRXhhbXBsZTogT1AgY2FzZVxuXHRcdGlmICh0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUgfHwgcGFyZW50RW50aXR5U2V0RGVsZXRhYmxlICE9PSBcImZhbHNlXCIgfHwgYk1hc3NFZGl0RW5hYmxlZCkge1xuXHRcdFx0Ly8gVXNlIHNlbGVjdGlvbk1vZGUgaW4gZWRpdCBtb2RlIGlmIGRlbGV0ZSBpcyBlbmFibGVkIG9yIG1hc3MgZWRpdCBpcyB2aXNpYmxlXG5cdFx0XHRjb25zdCBlZGl0TW9kZWJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gaWZFbHNlKFxuXHRcdFx0XHRiTWFzc0VkaXRFbmFibGVkICYmICF0YXJnZXRDYXBhYmlsaXRpZXMuaXNEZWxldGFibGUsXG5cdFx0XHRcdG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24sXG5cdFx0XHRcdGNvbnN0YW50KHRydWUpXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRpZkVsc2UoXG5cdFx0XHRcdFx0YW5kKFVJLklzRWRpdGFibGUsIGVkaXRNb2RlYnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdGNvbnN0YW50KHNlbGVjdGlvbk1vZGUpLFxuXHRcdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0XHRcdGNvbnN0YW50KFNlbGVjdGlvbk1vZGUuTm9uZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdG9yKC4uLmFIaWRkZW5CaW5kaW5nRXhwcmVzc2lvbnMuY29uY2F0KGFWaXNpYmxlQmluZGluZ0V4cHJlc3Npb25zKSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoc2VsZWN0aW9uTW9kZSksXG5cdFx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHQvL0VudGl0eVNldCBkZWxldGFibGU6XG5cdH0gZWxzZSBpZiAodGFyZ2V0Q2FwYWJpbGl0aWVzLmlzRGVsZXRhYmxlIHx8IGJNYXNzRWRpdEVuYWJsZWQpIHtcblx0XHQvLyBFeGFtcGxlOiBMUiBzY2VuYXJpb1xuXHRcdHJldHVybiBzZWxlY3Rpb25Nb2RlO1xuXHRcdC8vRW50aXR5U2V0IG5vdCBkZWxldGFibGU6XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRvciguLi5hSGlkZGVuQmluZGluZ0V4cHJlc3Npb25zLmNvbmNhdChhVmlzaWJsZUJpbmRpbmdFeHByZXNzaW9ucyksIG1hc3NFZGl0VmlzaWJpbGl0eUV4cHJlc3Npb24pLFxuXHRcdFx0XHRjb25zdGFudChzZWxlY3Rpb25Nb2RlKSxcblx0XHRcdFx0Y29uc3RhbnQoU2VsZWN0aW9uTW9kZS5Ob25lKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHRhYmxlIGFjdGlvbnMgZnJvbSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPEJhc2VBY3Rpb24sIEJhc2VBY3Rpb24+fSBUaGUgdGFibGUgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQW5ub3RhdGlvbkFjdGlvbnMobGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSwgdmlzdWFsaXphdGlvblBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCkge1xuXHRjb25zdCB0YWJsZUFjdGlvbnM6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXHRjb25zdCBoaWRkZW5UYWJsZUFjdGlvbnM6IEJhc2VBY3Rpb25bXSA9IFtdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0bGV0IHRhYmxlQWN0aW9uOiBBbm5vdGF0aW9uQWN0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZCkgJiZcblx0XHRcdFx0IShkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZSkgJiZcblx0XHRcdFx0IWRhdGFGaWVsZC5JbmxpbmUgJiZcblx0XHRcdFx0IWRhdGFGaWVsZC5EZXRlcm1pbmluZ1xuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IGtleSA9IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0XHRcdFx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQWN0aW9uXCI6XG5cdFx0XHRcdFx0XHR0YWJsZUFjdGlvbiA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EYXRhRmllbGRGb3JBY3Rpb24sXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdFx0XHRcdGtleToga2V5LFxuXHRcdFx0XHRcdFx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRcdFx0XHRub3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRlcXVhbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFtdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24oKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiOlxuXHRcdFx0XHRcdFx0dGFibGVBY3Rpb24gPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IEFjdGlvblR5cGUuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGtleSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogY29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0bm90KFxuXHRcdFx0XHRcdFx0XHRcdFx0ZXF1YWwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRoaWRkZW5UYWJsZUFjdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogQWN0aW9uVHlwZS5EZWZhdWx0LFxuXHRcdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRhYmxlQWN0aW9uKSB7XG5cdFx0XHRcdHRhYmxlQWN0aW9ucy5wdXNoKHRhYmxlQWN0aW9uKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHRhYmxlQWN0aW9uczogdGFibGVBY3Rpb25zLFxuXHRcdGhpZGRlblRhYmxlQWN0aW9uczogaGlkZGVuVGFibGVBY3Rpb25zXG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdGNyaXRpY2FsaXR5QW5ub3RhdGlvbjogUGF0aEFubm90YXRpb25FeHByZXNzaW9uPENyaXRpY2FsaXR5VHlwZT4gfCBFbnVtVmFsdWU8Q3JpdGljYWxpdHlUeXBlPiB8IHVuZGVmaW5lZCxcblx0aXNEcmFmdFJvb3Q6IGJvb2xlYW4sXG5cdHRhcmdldEVudGl0eVR5cGU/OiBFbnRpdHlUeXBlXG4pOiBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiB7XG5cdGxldCBkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbjogTWVzc2FnZVR5cGUgfCBFeHByZXNzaW9uPE1lc3NhZ2VUeXBlPiA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdGlmIChjcml0aWNhbGl0eUFubm90YXRpb24pIHtcblx0XHRpZiAodHlwZW9mIGNyaXRpY2FsaXR5QW5ub3RhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBhbm5vdGF0aW9uRXhwcmVzc2lvbihjcml0aWNhbGl0eUFubm90YXRpb24pIGFzIEV4cHJlc3Npb248TWVzc2FnZVR5cGU+O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBFbnVtIFZhbHVlIHNvIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgcGFydFxuXHRcdFx0ZGVmYXVsdEhpZ2hsaWdodFJvd0RlZmluaXRpb24gPSBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUoY3JpdGljYWxpdHlBbm5vdGF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBhTWlzc2luZ0tleXM6IGFueVtdID0gW107XG5cdHRhcmdldEVudGl0eVR5cGU/LmtleXMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcblx0XHRpZiAoa2V5Lm5hbWUgIT09IFwiSXNBY3RpdmVFbnRpdHlcIikge1xuXHRcdFx0YU1pc3NpbmdLZXlzLnB1c2goYmluZGluZ0V4cHJlc3Npb24oa2V5Lm5hbWUsIHVuZGVmaW5lZCkpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRkZWZhdWx0SGlnaGxpZ2h0Um93RGVmaW5pdGlvbixcblx0XHRcdGJpbmRpbmdFeHByZXNzaW9uKGBmaWx0ZXJlZE1lc3NhZ2VzYCwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdGlzRHJhZnRSb290ICYmIEVudGl0eS5IYXNBY3RpdmUsXG5cdFx0XHRpc0RyYWZ0Um9vdCAmJiBFbnRpdHkuSXNBY3RpdmUsXG5cdFx0XHRgJHtpc0RyYWZ0Um9vdH1gLFxuXHRcdFx0Li4uYU1pc3NpbmdLZXlzXG5cdFx0XSxcblx0XHR0YWJsZUZvcm1hdHRlcnMucm93SGlnaGxpZ2h0aW5nLFxuXHRcdHRhcmdldEVudGl0eVR5cGVcblx0KTtcbn1cblxuZnVuY3Rpb24gX2dldENyZWF0aW9uQmVoYXZpb3VyKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uXG4pOiBUYWJsZUFubm90YXRpb25Db25maWd1cmF0aW9uW1wiY3JlYXRlXCJdIHtcblx0Y29uc3QgbmF2aWdhdGlvbiA9IG5hdmlnYXRpb25TZXR0aW5ncz8uY3JlYXRlIHx8IG5hdmlnYXRpb25TZXR0aW5ncz8uZGV0YWlsO1xuXG5cdC8vIGNyb3NzLWFwcFxuXHRpZiAobmF2aWdhdGlvbj8ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCAmJiBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtb2RlOiBcIkV4dGVybmFsXCIsXG5cdFx0XHRvdXRib3VuZDogbmF2aWdhdGlvbi5vdXRib3VuZCxcblx0XHRcdG91dGJvdW5kRGV0YWlsOiBuYXZpZ2F0aW9uLm91dGJvdW5kRGV0YWlsLFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzOiBuYXZpZ2F0aW9uU2V0dGluZ3Ncblx0XHR9O1xuXHR9XG5cblx0bGV0IG5ld0FjdGlvbjtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdC8vIGluLWFwcFxuXHRcdGNvbnN0IHRhcmdldEFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM7XG5cdFx0bmV3QWN0aW9uID0gdGFyZ2V0QW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHwgdGFyZ2V0QW5ub3RhdGlvbnM/LlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjsgLy8gVE9ETzogSXMgdGhlcmUgcmVhbGx5IG5vICdOZXdBY3Rpb24nIG9uIERyYWZ0Tm9kZT8gdGFyZ2V0QW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlPy5OZXdBY3Rpb25cblxuXHRcdGlmICh0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBuZXdBY3Rpb24pIHtcblx0XHRcdC8vIEEgY29tYmluYXRpb24gb2YgJ0NyZWF0aW9uUm93JyBhbmQgJ05ld0FjdGlvbicgZG9lcyBub3QgbWFrZSBzZW5zZVxuXHRcdFx0Ly8gVE9ETzogT3IgZG9lcyBpdD9cblx0XHRcdHRocm93IEVycm9yKGBDcmVhdGlvbiBtb2RlICcke0NyZWF0aW9uTW9kZS5DcmVhdGlvblJvd30nIGNhbiBub3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tICduZXcnIGFjdGlvbiAoJHtuZXdBY3Rpb259KWApO1xuXHRcdH1cblx0XHRpZiAobmF2aWdhdGlvbj8ucm91dGUpIHtcblx0XHRcdC8vIHJvdXRlIHNwZWNpZmllZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bW9kZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRhcHBlbmQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRuZXdBY3Rpb246IG5ld0FjdGlvbj8udG9TdHJpbmcoKSxcblx0XHRcdFx0bmF2aWdhdGVUb1RhcmdldDogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSA/IG5hdmlnYXRpb24ucm91dGUgOiB1bmRlZmluZWQgLy8gbmF2aWdhdGUgb25seSBpbiBOZXdQYWdlIG1vZGVcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0Ly8gbm8gbmF2aWdhdGlvbiBvciBubyByb3V0ZSBzcGVjaWZpZWQgLSBmYWxsYmFjayB0byBpbmxpbmUgY3JlYXRlIGlmIG9yaWdpbmFsIGNyZWF0aW9uIG1vZGUgd2FzICdOZXdQYWdlJ1xuXHRpZiAodGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1vZGU6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0aW9uTW9kZSxcblx0XHRhcHBlbmQ6IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmNyZWF0ZUF0RW5kLFxuXHRcdG5ld0FjdGlvbjogbmV3QWN0aW9uPy50b1N0cmluZygpXG5cdH07XG59XG5cbmNvbnN0IF9nZXRSb3dDb25maWd1cmF0aW9uUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0gfCB1bmRlZmluZWQsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFyZ2V0UGF0aDogc3RyaW5nXG4pIHtcblx0bGV0IHByZXNzUHJvcGVydHksIG5hdmlnYXRpb25UYXJnZXQ7XG5cdGxldCBjcml0aWNhbGl0eVByb3BlcnR5OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8TWVzc2FnZVR5cGU+ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHRpZiAobmF2aWdhdGlvblNldHRpbmdzICYmIGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdG5hdmlnYXRpb25UYXJnZXQgPSBuYXZpZ2F0aW9uU2V0dGluZ3MuZGlzcGxheT8udGFyZ2V0IHx8IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/Lm91dGJvdW5kO1xuXHRcdGlmIChuYXZpZ2F0aW9uVGFyZ2V0KSB7XG5cdFx0XHRwcmVzc1Byb3BlcnR5ID1cblx0XHRcdFx0XCIuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKCAkY29udHJvbGxlciAsJ1wiICsgbmF2aWdhdGlvblRhcmdldCArIFwiJywgJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0pXCI7XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlTZXQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRcdFx0bmF2aWdhdGlvblRhcmdldCA9IG5hdmlnYXRpb25TZXR0aW5ncy5kZXRhaWw/LnJvdXRlO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25UYXJnZXQpIHtcblx0XHRcdFx0Y3JpdGljYWxpdHlQcm9wZXJ0eSA9IGdldEhpZ2hsaWdodFJvd0JpbmRpbmcoXG5cdFx0XHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmFubm90YXRpb25zPy5VST8uQ3JpdGljYWxpdHksXG5cdFx0XHRcdFx0ISF0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fCAhIXRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnROb2RlLFxuXHRcdFx0XHRcdHRhcmdldEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0cHJlc3NQcm9wZXJ0eSA9XG5cdFx0XHRcdFx0XCJBUEkub25UYWJsZVJvd1ByZXNzKCRldmVudCwgJGNvbnRyb2xsZXIsICR7JHBhcmFtZXRlcnM+YmluZGluZ0NvbnRleHR9LCB7IGNhbGxFeHRlbnNpb246IHRydWUsIHRhcmdldFBhdGg6ICdcIiArXG5cdFx0XHRcdFx0dGFyZ2V0UGF0aCArXG5cdFx0XHRcdFx0XCInLCBlZGl0YWJsZSA6IFwiICtcblx0XHRcdFx0XHQodGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgfHwgdGFyZ2V0RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGVcblx0XHRcdFx0XHRcdD8gXCIhJHskcGFyYW1ldGVycz5iaW5kaW5nQ29udGV4dH0uZ2V0UHJvcGVydHkoJ0lzQWN0aXZlRW50aXR5JylcIlxuXHRcdFx0XHRcdFx0OiBcInVuZGVmaW5lZFwiKSArXG5cdFx0XHRcdFx0XCJ9KVwiOyAvL05lZWQgdG8gYWNjZXNzIHRvIERyYWZ0Um9vdCBhbmQgRHJhZnROb2RlICEhISEhISFcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyaXRpY2FsaXR5UHJvcGVydHkgPSBnZXRIaWdobGlnaHRSb3dCaW5kaW5nKGxpbmVJdGVtQW5ub3RhdGlvbi5hbm5vdGF0aW9ucz8uVUk/LkNyaXRpY2FsaXR5LCBmYWxzZSwgdGFyZ2V0RW50aXR5VHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHJvd05hdmlnYXRlZEV4cHJlc3Npb246IEV4cHJlc3Npb248Ym9vbGVhbj4gPSBmb3JtYXRSZXN1bHQoXG5cdFx0W2JpbmRpbmdFeHByZXNzaW9uKFwiL2RlZXBlc3RQYXRoXCIsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5uYXZpZ2F0ZWRSb3csXG5cdFx0dGFyZ2V0RW50aXR5VHlwZVxuXHQpO1xuXHRyZXR1cm4ge1xuXHRcdHByZXNzOiBwcmVzc1Byb3BlcnR5LFxuXHRcdGFjdGlvbjogcHJlc3NQcm9wZXJ0eSA/IFwiTmF2aWdhdGlvblwiIDogdW5kZWZpbmVkLFxuXHRcdHJvd0hpZ2hsaWdodGluZzogY29tcGlsZUJpbmRpbmcoY3JpdGljYWxpdHlQcm9wZXJ0eSksXG5cdFx0cm93TmF2aWdhdGVkOiBjb21waWxlQmluZGluZyhyb3dOYXZpZ2F0ZWRFeHByZXNzaW9uKVxuXHR9O1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgVGhlIGFycmF5IG9mIGFsbCBub24gc29ydGFibGUgY29sdW1uIG5hbWVzLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEByZXR1cm5zIHtBbm5vdGF0aW9uVGFibGVDb2x1bW5bXX0gVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGVcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgdGFibGVDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdO1xuXHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0XHRjb25zdCBleGlzdHMgPSBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblxuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJDb21tb25cIiwgQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljS2V5LCBbXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdFx0XHRdKVswXTtcblx0XHRcdGNvbnN0IG9Db2x1bW5EcmFmdEluZGljYXRvciA9IGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihjb2x1bW5JbmZvLm5hbWUsIHNlbWFudGljS2V5cywgZmFsc2UsIG51bGwpO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db2x1bW5EcmFmdEluZGljYXRvcikubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmZvcm1hdE9wdGlvbnMgPSB7XG5cdFx0XHRcdFx0Li4ub0NvbHVtbkRyYWZ0SW5kaWNhdG9yXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLnByb3BlcnR5SW5mb3MgPSByZWxhdGVkUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHQuLi5jb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZSxcblx0XHRcdFx0XHR3cmFwOiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NXcmFwcGluZ1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdE5hbWUpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0TmFtZTtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydFNldHRpbmdzLnR5cGUgPSBcIkN1cnJlbmN5XCI7IC8vIEZvcmNlIHRvIGEgY3VycmVuY3kgYmVjYXVzZSB0aGVyZSdzIGEgdW5pdFByb3BlcnR5IChvdGhlcndpc2UgdGhlIHZhbHVlIGlzbid0IHByb3Blcmx5IGZvcm1hdHRlZCB3aGVuIGV4cG9ydGVkKVxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0U3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnRTZXR0aW5ncy51bml0ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXRTdHJpbmc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtuYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1tuYW1lXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZUNvbHVtbnMucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIGEgcHJvcGVydHkuXG4gKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSBFbnRpdHkgdHlwZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGNvbHVtbiBpcyBjcmVhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZnVsbFByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSB1c2VEYXRhRmllbGRQcmVmaXggU2hvdWxkIGJlIHByZWZpeGVkIHdpdGggXCJEYXRhRmllbGQ6OlwiLCBlbHNlIGl0IHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBcIlByb3BlcnR5OjpcIlxuICogQHBhcmFtIHtib29sZWFufSBhdmFpbGFibGVGb3JBZGFwdGF0aW9uIERlY2lkZXMgd2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgYWxsIG5vbi1zb3J0YWJsZSBjb2x1bW4gbmFtZXNcbiAqIEBwYXJhbSB7QWdncmVnYXRpb25IZWxwZXJ9IGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbkhlbHBlciBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbn0gVGhlIGFubm90YXRpb24gY29sdW1uIGRlZmluaXRpb25cbiAqL1xuY29uc3QgZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHR1c2VEYXRhRmllbGRQcmVmaXg6IGJvb2xlYW4sXG5cdGF2YWlsYWJsZUZvckFkYXB0YXRpb246IGJvb2xlYW4sXG5cdG5vblNvcnRhYmxlQ29sdW1uczogc3RyaW5nW10sXG5cdGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlcixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uIHtcblx0Y29uc3QgbmFtZSA9IHVzZURhdGFGaWVsZFByZWZpeCA/IHJlbGF0aXZlUGF0aCA6IFwiUHJvcGVydHk6OlwiICsgcmVsYXRpdmVQYXRoO1xuXHRjb25zdCBrZXkgPSAodXNlRGF0YUZpZWxkUHJlZml4ID8gXCJEYXRhRmllbGQ6OlwiIDogXCJQcm9wZXJ0eTo6XCIpICsgcmVwbGFjZVNwZWNpYWxDaGFycyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID0gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5KTtcblx0Y29uc3QgaXNIaWRkZW4gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpID09PSB0cnVlO1xuXHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5Lm5hbWUgPyBfc2xpY2VBdFNsYXNoKHByb3BlcnR5Lm5hbWUsIHRydWUsIGZhbHNlKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSBwcm9wZXJ0eS5uYW1lO1xuXHRjb25zdCBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eTogYm9vbGVhbiA9IG5hbWUuaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhUG9pbnRcIikgPiAtMTtcblx0Y29uc3QgZXhwb3J0VHlwZTogc3RyaW5nID0gX2dldEV4cG9ydERhdGFUeXBlKHByb3BlcnR5LnR5cGUpO1xuXHRjb25zdCBzRGF0ZUlucHV0Rm9ybWF0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9wZXJ0eS50eXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcblx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKHByb3BlcnR5KTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnID0gIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5ID8gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eSwgZGF0YVR5cGUpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5ID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNLZXksIFtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRdKVswXTtcblx0Y29uc3Qgb1R5cGVDb25maWcgPSAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHlcblx0XHQ/IHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBwcm9wZXJ0eS50eXBlIHx8IGRhdGFUeXBlLFxuXHRcdFx0XHRvRm9ybWF0T3B0aW9uczogcHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdG9Db25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdFx0ICB9XG5cdFx0OiB1bmRlZmluZWQ7XG5cdGNvbnN0IGV4cG9ydFNldHRpbmdzOiBhbnkgPSBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eVxuXHRcdD8ge1xuXHRcdFx0XHR0ZW1wbGF0ZTogZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChwcm9wZXJ0eSlcblx0XHQgIH1cblx0XHQ6IHtcblx0XHRcdFx0dHlwZTogZXhwb3J0VHlwZSxcblx0XHRcdFx0aW5wdXRGb3JtYXQ6IHNEYXRlSW5wdXRGb3JtYXQsXG5cdFx0XHRcdHNjYWxlOiBwcm9wZXJ0eS5zY2FsZSxcblx0XHRcdFx0ZGVsaW1pdGVyOiBwcm9wZXJ0eS50eXBlID09PSBcIkVkbS5JbnQ2NFwiID8gdHJ1ZSA6IGZhbHNlLFxuXHRcdFx0XHR0cnVlVmFsdWU6IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkJvb2xlYW5cIiA/IFwiWWVzXCIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGZhbHNlVmFsdWU6IHByb3BlcnR5LnR5cGUgPT09IFwiRWRtLkJvb2xlYW5cIiA/IFwiTm9cIiA6IHVuZGVmaW5lZFxuXHRcdCAgfTtcblxuXHRpZiAoIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgb1VuaXRQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRjb25zdCBzVW5pdFRleHQgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdGlmIChvVW5pdFByb3BlcnR5KSB7XG5cdFx0XHRleHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgPSBvVW5pdFByb3BlcnR5Lm5hbWU7XG5cdFx0XHRleHBvcnRTZXR0aW5ncy50eXBlID0gXCJDdXJyZW5jeVwiOyAvLyBGb3JjZSB0byBhIGN1cnJlbmN5IGJlY2F1c2UgdGhlcmUncyBhIHVuaXRQcm9wZXJ0eSAob3RoZXJ3aXNlIHRoZSB2YWx1ZSBpc24ndCBwcm9wZXJseSBmb3JtYXR0ZWQgd2hlbiBleHBvcnRlZClcblx0XHR9IGVsc2UgaWYgKHNVbml0VGV4dCkge1xuXHRcdFx0ZXhwb3J0U2V0dGluZ3MudW5pdCA9IGAke3NVbml0VGV4dH1gO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG9Db2x1bW46IGFueSA9IHtcblx0XHRrZXk6IGtleSxcblx0XHRpc0dyb3VwYWJsZTogIWlzRGF0YVBvaW50RmFrZVByb3BlcnR5ICYmICFpc0hpZGRlbiA/IGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpIDogZmFsc2UsXG5cdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdGxhYmVsOiBfZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApLFxuXHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBfZ2V0TGFiZWwocHJvcGVydHkpIDogbnVsbCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0YW5ub3RhdGlvblBhdGg6IGZ1bGxQcm9wZXJ0eVBhdGgsXG5cdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdC8vIEEgZmFrZSBwcm9wZXJ0eSB3YXMgY3JlYXRlZCBmb3IgdGhlIFRhcmdldFZhbHVlIHVzZWQgb24gRGF0YVBvaW50cywgdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuIGFuZCBub24gc29ydGFibGVcblx0XHRhdmFpbGFiaWxpdHk6XG5cdFx0XHQhYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBpc0hpZGRlbiB8fCBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IEF2YWlsYWJpbGl0eVR5cGUuSGlkZGVuIDogQXZhaWxhYmlsaXR5VHlwZS5BZGFwdGF0aW9uLFxuXHRcdG5hbWU6IG5hbWUsXG5cdFx0cmVsYXRpdmVQYXRoOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eVxuXHRcdFx0PyAocHJvcGVydHkgYXMgYW55KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uVmFsdWU/LnBhdGggfHwgKHByb3BlcnR5IGFzIGFueSkuVmFsdWUucGF0aFxuXHRcdFx0OiByZWxhdGl2ZVBhdGgsXG5cdFx0c29ydGFibGU6ICFpc0hpZGRlbiAmJiBub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihyZWxhdGl2ZVBhdGgpID09PSAtMSAmJiAhaXNEYXRhUG9pbnRGYWtlUHJvcGVydHksXG5cdFx0aXNLZXk6IHByb3BlcnR5LmlzS2V5LFxuXHRcdGlzRGF0YVBvaW50RmFrZVRhcmdldFByb3BlcnR5OiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSxcblx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHR5cGVDb25maWc6IG9UeXBlQ29uZmlnLFxuXHRcdHZpc3VhbFNldHRpbmdzOiBpc0RhdGFQb2ludEZha2VQcm9wZXJ0eSA/IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9IDogdW5kZWZpbmVkLFxuXHRcdGltcG9ydGFuY2U6IGdldEltcG9ydGFuY2UoKHByb3BlcnR5IGFzIGFueSkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0LCBzZW1hbnRpY0tleXMpXG5cdH07XG5cdGNvbnN0IHNUb29sdGlwID0gX2dldFRvb2x0aXAocHJvcGVydHkpO1xuXHRpZiAoc1Rvb2x0aXApIHtcblx0XHRvQ29sdW1uLnRvb2x0aXAgPSBzVG9vbHRpcDtcblx0fVxuXG5cdHJldHVybiBvQ29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykge1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmV0dXJuICEhZGF0YUZpZWxkLklubGluZTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdC8vIFRvZG86IFJlcGxhY2Ugd2l0aCBwcm9wZXIgTG9nIHN0YXRlbWVudCBvbmNlIGF2YWlsYWJsZVxuXHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgdGhlIHZpc2liaWxpdHkgb2YgYSBEYXRhRmllbGQgb3IgRGF0YVBvaW50IGFubm90YXRpb24uXG4gKlxuICogU0FQIEZpb3JpIGVsZW1lbnRzIHdpbGwgZXZhbHVhdGUgZWl0aGVyIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBkZWZpbmVkIG9uIHRoZSBhbm5vdGF0aW9uIGl0c2VsZiBvciBvbiB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7RGF0YU1vZGVsT2JqZWN0UGF0aH0gZGF0YUZpZWxkTW9kZWxQYXRoIFRoZSBtZXRhcGF0aCByZWZlcnJpbmcgdG8gdGhlIGFubm90YXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgYnkgU0FQIEZpb3JpIGVsZW1lbnRzLlxuICogQHBhcmFtIHtvYmplY3R9IFtmb3JtYXRPcHRpb25zXSBGb3JtYXRPcHRpb25zIG9wdGlvbmFsLlxuICogQHBhcmFtIHtib29sZWFufSBmb3JtYXRPcHRpb25zLmlzQW5hbHl0aWNzIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGNoZWNrIGlmIHRoZSBhbmFseXRpYyB0YWJsZSBoYXMgR3JvdXBIZWFkZXIgZXhwYW5kZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXR1cm5FeHByZXNzaW9uXSBSZXR1cm5FeHByZXNzaW9uIG9wdGlvbmFsLlxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPHN0cmluZz59IEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5leHBvcnQgY29uc3QgX2dldFZpc2libGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZvcm1hdE9wdGlvbnM/OiBhbnksXG5cdHJldHVybkV4cHJlc3Npb246IGJvb2xlYW4gPSBmYWxzZVxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcyA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBVSS5Jc0V4cGFuZGVkIDogY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDogY29uc3RhbnQoZmFsc2UpO1xuXG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRjb25zdCBleHByZXNzaW9uID0gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChhbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKCEhcHJvcGVydHlWYWx1ZSwgcHJvcGVydHlWYWx1ZSAmJiBub3QoZXF1YWwoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSwgdHJ1ZSksXG5cdFx0XHRvcihub3QoaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCksIGlzQW5hbHl0aWNhbExlYWYpXG5cdFx0XVxuXHQpO1xuXHRyZXR1cm4gcmV0dXJuRXhwcmVzc2lvbiA/IChleHByZXNzaW9uIGFzIGFueSBhcyBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+KSA6IGNvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGhpZGRlbiBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciBhIGZpZWxkIGdyb3VwLlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzfSBkYXRhRmllbGRHcm91cCBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZEZvcm1hdE9wdGlvbnMgRm9ybWF0T3B0aW9ucyBvcHRpb25hbC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZmllbGRGb3JtYXRPcHRpb25zLmlzQW5hbHl0aWNzIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGNoZWNrIGlmIHRoZSBhbmFseXRpYyB0YWJsZSBoYXMgR3JvdXBIZWFkZXIgZXhwYW5kZWQuXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gQ29tcGlsZSBiaW5kaW5nIG9mIGZpZWxkIGdyb3VwIGV4cHJlc3Npb25zLlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGZpZWxkRm9ybWF0T3B0aW9uczogYW55XG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPltdID0gW107XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdCkge1xuXHRcdGRhdGFGaWVsZEdyb3VwLlRhcmdldC4kdGFyZ2V0LkRhdGE/LmZvckVhY2goKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzKSA9PiB7XG5cdFx0XHRhRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLnB1c2goXG5cdFx0XHRcdF9nZXRWaXNpYmxlRXhwcmVzc2lvbih7IHRhcmdldE9iamVjdDogaW5uZXJEYXRhRmllbGQgfSBhcyBEYXRhTW9kZWxPYmplY3RQYXRoLCBmaWVsZEZvcm1hdE9wdGlvbnMsIHRydWUpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGlmRWxzZShvciguLi4oYUZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyBhcyBhbnkgYXMgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pKSwgY29uc3RhbnQodHJ1ZSksIGNvbnN0YW50KGZhbHNlKSlcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZGF0YUZpZWxkLlxuICogQHBhcmFtIHtEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHl9IFtwcm9wZXJ0eV0gUHJvcGVydHkgb3IgRGF0YUZpZWxkIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMge3N0cmluZ30gTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldExhYmVsID0gZnVuY3Rpb24gKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksIGlzR3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZERlZmF1bHQgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZERlZmF1bHQuTGFiZWw/LnZhbHVlT2YoKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdFx0fVxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5LlZhbHVlPy4kdGFyZ2V0Py5uYW1lXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpIHx8IChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKClcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5MYWJlbD8udmFsdWVPZigpKSk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24gKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFzb3VyY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdHJldHVybiBzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24oc291cmNlLmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMoc291cmNlKSkge1xuXHRcdHJldHVybiBzb3VyY2UuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihzb3VyY2UuVmFsdWUuJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvLnZhbHVlT2YoKSkpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChzb3VyY2UuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pIHtcblx0XHRjb25zdCBkYXRhcG9pbnRUYXJnZXQgPSBzb3VyY2UuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludDtcblx0XHRyZXR1cm4gZGF0YXBvaW50VGFyZ2V0Py5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVCaW5kaW5nKGFubm90YXRpb25FeHByZXNzaW9uKGRhdGFwb2ludFRhcmdldC5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8udmFsdWVPZigpKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSgpOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbYmluZGluZ0V4cHJlc3Npb24oYHNlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3JgLCBcImludGVybmFsXCIpLCBiaW5kaW5nRXhwcmVzc2lvbihgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIildLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5nZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyXG5cdCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9wZXJ0eUluZm8gZm9yIGVhY2ggaWRlbnRpZmllZCBwcm9wZXJ0eSBjb25zdW1lZCBieSBhIExpbmVJdGVtLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUHJvcGVydHk+fSBjb2x1bW5zVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlLlxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1uIG5hbWVzIHdoaWNoIGNhbm5vdCBiZSBzb3J0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGUgZm9yIHRoZSBMaW5lSXRlbVxuICogQHJldHVybnMge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkLlxuICovXG5jb25zdCBfY3JlYXRlUmVsYXRlZENvbHVtbnMgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKHJlbGF0ZWRDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2FzZSAxOiBLZXkgY29udGFpbnMgRGF0YUZpZWxkIHByZWZpeCB0byBlbnN1cmUgYWxsIHByb3BlcnR5IGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBrZXkgZm9ybWF0LlxuXHRcdFx0Ly8gTmV3IGNyZWF0ZWQgcHJvcGVydHkgY29sdW1uIGlzIHNldCB0byBoaWRkZW4uXG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRyZWxhdGVkQ29sdW1uLmFubm90YXRpb25QYXRoICE9PSBhbm5vdGF0aW9uUGF0aCB8fFxuXHRcdFx0KHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcyAmJiByZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MuaW5kZXhPZihuYW1lKSAhPT0gLTEpXG5cdFx0KSB7XG5cdFx0XHQvLyBDYXNlIDI6IFRoZSBleGlzdGluZyBjb2x1bW4gcG9pbnRzIHRvIGEgTGluZUl0ZW0gKG9yKVxuXHRcdFx0Ly8gQ2FzZSAzOiBUaGlzIGlzIGEgc2VsZiByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBjb2x1bW4gYW5kXG5cdFx0XHQvLyBib3RoIGNhc2VzIHJlcXVpcmUgYSBkdW1teSBQcm9wZXJ0eUluZm8gZm9yIHNldHRpbmcgY29ycmVjdCBleHBvcnQgc2V0dGluZ3MuXG5cblx0XHRcdGNvbnN0IG5ld05hbWUgPSBcIlByb3BlcnR5OjpcIiArIG5hbWU7XG5cblx0XHRcdC8vIENoZWNraW5nIHdoZXRoZXIgdGhlIHJlbGF0ZWQgcHJvcGVydHkgY29sdW1uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi5cblx0XHRcdGlmICghZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjb2x1bW4gd2l0aCAnUHJvcGVydHk6OicgcHJlZml4LFxuXHRcdFx0XHQvLyBTZXQgaXQgdG8gaGlkZGVuIGFzIGl0IGlzIG9ubHkgY29uc3VtZWQgYnkgQ29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0bm9uU29ydGFibGVDb2x1bW5zLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc30gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIGFubm90YXRpb24gY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldEFubm90YXRpb25Db2x1bW5OYW1lID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykge1xuXHQvLyBUaGlzIGlzIG5lZWRlZCBhcyB3ZSBoYXZlIGZsZXhpYmlsaXR5IGNoYW5nZXMgYWxyZWFkeSB0aGF0IHdlIGhhdmUgdG8gY2hlY2sgYWdhaW5zdFxuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpKSB7XG5cdFx0cmV0dXJuIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aDtcblx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LnBhdGgpIHtcblx0XHQvLyBUaGlzIGlzIGZvciByZW1vdmluZyBkdXBsaWNhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsICdQcm9ncmVzcycgUHJvcGVydHkgaXMgcmVtb3ZlZCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBEYXRhUG9pbnRcblx0XHRyZXR1cm4gKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWUucGF0aDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGEgZmllbGQgbGFiZWxzIGhhdmUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZEdyb3VwTmFtZSBUaGUgYERhdGFGaWVsZGAgbmFtZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IGBzaG93RGF0YUZpZWxkc0xhYmVsYCB2YWx1ZSBmcm9tIHRoZSBtYW5pZmVzdFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgX2dldFNob3dEYXRhRmllbGRzTGFiZWwgPSBmdW5jdGlvbiAoZmllbGRHcm91cE5hbWU6IHN0cmluZywgdmlzdWFsaXphdGlvblBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBvQ29sdW1ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk/LmNvbHVtbnM7XG5cdGNvbnN0IGFDb2x1bW5LZXlzID0gb0NvbHVtbnMgJiYgT2JqZWN0LmtleXMob0NvbHVtbnMpO1xuXHRyZXR1cm4gKFxuXHRcdGFDb2x1bW5LZXlzICYmXG5cdFx0ISFhQ29sdW1uS2V5cy5maW5kKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGtleSA9PT0gZmllbGRHcm91cE5hbWUgJiYgb0NvbHVtbnNba2V5XS5zaG93RGF0YUZpZWxkc0xhYmVsO1xuXHRcdH0pXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHByb3BlcnR5IHdpdGggcmVzcGVjdCB0byB0aGUgcm9vdCBlbnRpdHkuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBgRGF0YUZpZWxkYCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcmVsYXRpdmUgcGF0aFxuICovXG5jb25zdCBfZ2V0UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IHN0cmluZyB7XG5cdGxldCByZWxhdGl2ZVBhdGg6IHN0cmluZyA9IFwiXCI7XG5cblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRpdmVQYXRoO1xufTtcblxuY29uc3QgX3NsaWNlQXRTbGFzaCA9IGZ1bmN0aW9uIChwYXRoOiBzdHJpbmcsIGlzTGFzdFNsYXNoOiBib29sZWFuLCBpc0xhc3RQYXJ0OiBib29sZWFuKSB7XG5cdGNvbnN0IGlTbGFzaEluZGV4ID0gaXNMYXN0U2xhc2ggPyBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA6IHBhdGguaW5kZXhPZihcIi9cIik7XG5cblx0aWYgKGlTbGFzaEluZGV4ID09PSAtMSkge1xuXHRcdHJldHVybiBwYXRoO1xuXHR9XG5cdHJldHVybiBpc0xhc3RQYXJ0ID8gcGF0aC5zdWJzdHJpbmcoaVNsYXNoSW5kZXggKyAxLCBwYXRoLmxlbmd0aCkgOiBwYXRoLnN1YnN0cmluZygwLCBpU2xhc2hJbmRleCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgY29sdW1uIGlzIHNvcnRhYmxlLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGRhdGEgZmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gbm9uU29ydGFibGVDb2x1bW5zIENvbGxlY3Rpb24gb2Ygbm9uLXNvcnRhYmxlIGNvbHVtbiBuYW1lcyBhcyBwZXIgYW5ub3RhdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZVxuICovXG5jb25zdCBfaXNDb2x1bW5Tb3J0YWJsZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIHByb3BlcnR5UGF0aDogc3RyaW5nLCBub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG5cdGxldCBpc1NvcnRhYmxlOiBib29sZWFuID0gZmFsc2U7XG5cdGlmIChub25Tb3J0YWJsZUNvbHVtbnMuaW5kZXhPZihwcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdC8vIENvbHVtbiBpcyBub3QgbWFya2VkIGFzIG5vbi1zb3J0YWJsZSB2aWEgYW5ub3RhdGlvblxuXHRcdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRcdFx0aXNTb3J0YWJsZSA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdFx0XHQvLyBBY3Rpb24gY29sdW1ucyBhcmUgbm90IHNvcnRhYmxlXG5cdFx0XHRcdGlzU29ydGFibGUgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpc1NvcnRhYmxlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgJ2ZhbHNlJyBpZiBGaWx0ZXJGdW5jdGlvbnMgYW5ub3RhdGlvbiBzdXBwb3J0cyAndG9sb3dlcicsIGVsc2UgJ3RydWUnXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKT8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uRmlsdGVyRnVuY3Rpb25zIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnM7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KGZpbHRlckZ1bmN0aW9ucykgPyAoZmlsdGVyRnVuY3Rpb25zIGFzIFN0cmluZ1tdKS5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKlxuICogQHJldHVybnMge0Zvcm1hdE9wdGlvbnNUeXBlfSBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpOiBGb3JtYXRPcHRpb25zVHlwZSB7XG5cdHJldHVybiB7XG5cdFx0dGV4dExpbmVzRWRpdDogNFxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5czogYW55W10sIG5hbWU6IHN0cmluZyk6IGFueSB7XG5cdGNvbnN0IGFTZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0bGV0IGJTZW1hbnRpY0tleUZvdW5kID0gZmFsc2U7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0dmFsdWVzOiBhU2VtYW50aWNLZXlWYWx1ZXMsXG5cdFx0c2VtYW50aWNLZXlGb3VuZDogYlNlbWFudGljS2V5Rm91bmRcblx0fTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRQcm9wZXJ0aWVzKHNlbWFudGljS2V5VmFsdWVzOiBhbnlbXSwgZmllbGRHcm91cFByb3BlcnRpZXM6IGFueVtdKSB7XG5cdGxldCBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gZmFsc2U7XG5cdGxldCBzUHJvcGVydHlQYXRoO1xuXHRpZiAoc2VtYW50aWNLZXlWYWx1ZXMgJiYgc2VtYW50aWNLZXlWYWx1ZXMubGVuZ3RoID49IDEgJiYgZmllbGRHcm91cFByb3BlcnRpZXMgJiYgZmllbGRHcm91cFByb3BlcnRpZXMubGVuZ3RoID49IDEpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoW3NlbWFudGljS2V5VmFsdWVzW2ldXS5zb21lKCh0bXApID0+IGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmluZGV4T2YodG1wKSA+PSAwKSkge1xuXHRcdFx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gdHJ1ZTtcblx0XHRcdFx0c1Byb3BlcnR5UGF0aCA9IHNlbWFudGljS2V5VmFsdWVzW2ldO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHNQcm9wZXJ0eVBhdGhcblx0fTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cChkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGwsIHNlbWFudGljS2V5VmFsdWVzOiBbXSk6IGFueSB7XG5cdGNvbnN0IGFQcm9wZXJ0aWVzOiBhbnlbXSA9IFtdO1xuXHRsZXQgX3Byb3BlcnRpZXNGb3VuZDogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiBhbnkgfSA9IHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBmYWxzZSxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiB1bmRlZmluZWRcblx0fTtcblx0aWYgKFxuXHRcdGRhdGFGaWVsZEdyb3VwICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBpbm5lckRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCkgJiZcblx0XHRcdFx0aW5uZXJEYXRhRmllbGQuVmFsdWVcblx0XHRcdCkge1xuXHRcdFx0XHRhUHJvcGVydGllcy5wdXNoKGlubmVyRGF0YUZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0X3Byb3BlcnRpZXNGb3VuZCA9IF9maW5kUHJvcGVydGllcyhzZW1hbnRpY0tleVZhbHVlcywgYVByb3BlcnRpZXMpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogX3Byb3BlcnRpZXNGb3VuZC5zZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdHByb3BlcnR5UGF0aDogX3Byb3BlcnRpZXNGb3VuZC5maWVsZEdyb3VwUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIHdpdGggZHJhZnRJbmRpY2F0b3IgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBzZW1hbnRpY0tleXNcbiAqIEBwYXJhbSBpc0ZpZWxkR3JvdXBDb2x1bW5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cFxuICogQHJldHVybnMge0Zvcm1hdE9wdGlvbnNUeXBlfSBDb2xsZWN0aW9uIG9mIGZvcm1hdCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNlbWFudGljS2V5czogYW55W10sXG5cdGlzRmllbGRHcm91cENvbHVtbjogYm9vbGVhbixcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsXG4pIHtcblx0aWYgKCFzZW1hbnRpY0tleXMpIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXkgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzKHNlbWFudGljS2V5cywgbmFtZSk7XG5cdGNvbnN0IHNlbWFudGljS2V5SW5GaWVsZEdyb3VwID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cChkYXRhRmllbGRHcm91cCwgc2VtYW50aWNLZXkudmFsdWVzKTtcblx0aWYgKHNlbWFudGljS2V5LnNlbWFudGljS2V5Rm91bmQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aGFzRHJhZnRJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRzZW1hbnRpY2tleXM6IHNlbWFudGljS2V5LnZhbHVlcyxcblx0XHRcdG9iamVjdFN0YXR1c1RleHRWaXNpYmlsaXR5OiBjb21waWxlQmluZGluZyhnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KCkpXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRpZiAoIXNlbWFudGljS2V5SW5GaWVsZEdyb3VwLnNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXApIHtcblx0XHRcdHJldHVybiB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU2VtYW50aWMgS2V5IGhhcyBhIHByb3BlcnR5IGluIGEgRmllbGRHcm91cFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0RmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzZW1hbnRpY0tleUluRmllbGRHcm91cC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdEZpZWxkR3JvdXBOYW1lOiBuYW1lXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0SW1wTnVtYmVyKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBudW1iZXIge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9IaWdoXCIpKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL01lZGl1bVwiKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9Mb3dcIikpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXHRyZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkOiBEYXRhRmllbGRUeXBlcyk6IEltcG9ydGFuY2Uge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXHRyZXR1cm4gaW1wb3J0YW5jZSA/IChpbXBvcnRhbmNlLnNwbGl0KFwiL1wiKVsxXSBhcyBJbXBvcnRhbmNlKSA6IEltcG9ydGFuY2UuTm9uZTtcbn1cblxuZnVuY3Rpb24gX2dldE1heEltcG9ydGFuY2UoZmllbGRzOiBEYXRhRmllbGRUeXBlc1tdKTogSW1wb3J0YW5jZSB7XG5cdGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRsZXQgbWF4SW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IGltcE51bWJlciA9IC0xO1xuXHRcdGxldCBEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZTtcblx0XHRmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuXHRcdFx0aW1wTnVtYmVyID0gX2dldEltcE51bWJlcihmaWVsZCk7XG5cdFx0XHRpZiAoaW1wTnVtYmVyID4gbWF4SW1wTnVtYmVyKSB7XG5cdFx0XHRcdG1heEltcE51bWJlciA9IGltcE51bWJlcjtcblx0XHRcdFx0RGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgPSBmaWVsZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlIGFzIERhdGFGaWVsZFR5cGVzKTtcblx0fVxuXHRyZXR1cm4gSW1wb3J0YW5jZS5Ob25lO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGltcG9ydGFuY2UgdmFsdWUgZm9yIGEgY29sdW1uLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGRcbiAqIEBwYXJhbSBzZW1hbnRpY0tleXNcbiAqIEByZXR1cm5zIHtJbXBvcnRhbmNlfSBUaGUgaW1wb3J0YW5jZSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIHNlbWFudGljS2V5czogU2VtYW50aWNLZXkpOiBJbXBvcnRhbmNlIHwgdW5kZWZpbmVkIHtcblx0Ly9FdmFsdWF0ZSBkZWZhdWx0IEltcG9ydGFuY2UgaXMgbm90IHNldCBleHBsaWNpdGx5XG5cdGxldCBmaWVsZHNXaXRoSW1wb3J0YW5jZSwgbWFwU2VtYW50aWNLZXlzOiBhbnk7XG5cdC8vQ2hlY2sgaWYgc2VtYW50aWNLZXlzIGFyZSBkZWZpbmVkIGF0IHRoZSBFbnRpdHlTZXQgbGV2ZWxcblx0aWYgKHNlbWFudGljS2V5cyAmJiBzZW1hbnRpY0tleXMubGVuZ3RoID4gMCkge1xuXHRcdG1hcFNlbWFudGljS2V5cyA9IHNlbWFudGljS2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGtleS52YWx1ZTtcblx0XHR9KTtcblx0fVxuXHRpZiAoIWRhdGFGaWVsZCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gKGRhdGFGaWVsZCBhcyBhbnkpLlRhcmdldFtcIiR0YXJnZXRcIl1bXCJEYXRhXCJdIGFzIEZpZWxkR3JvdXBUeXBlLFxuXHRcdFx0ZmllbGRHcm91cEhhc1NlbWFudGljS2V5ID1cblx0XHRcdFx0ZmllbGRHcm91cERhdGEgJiZcblx0XHRcdFx0KGZpZWxkR3JvdXBEYXRhIGFzIGFueSkuc29tZShmdW5jdGlvbiAoZmllbGRHcm91cERhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHQoZmllbGRHcm91cERhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LnBhdGggJiZcblx0XHRcdFx0XHRcdGZpZWxkR3JvdXBEYXRhRmllbGQuJFR5cGUgIT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRcdFx0XHRcdG1hcFNlbWFudGljS2V5cyAmJlxuXHRcdFx0XHRcdFx0bWFwU2VtYW50aWNLZXlzLmluY2x1ZGVzKChmaWVsZEdyb3VwRGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8ucGF0aClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblx0XHQvL0lmIGEgRmllbGRHcm91cCBjb250YWlucyBhIHNlbWFudGljS2V5LCBpbXBvcnRhbmNlIHNldCB0byBIaWdoXG5cdFx0aWYgKGZpZWxkR3JvdXBIYXNTZW1hbnRpY0tleSkge1xuXHRcdFx0cmV0dXJuIEltcG9ydGFuY2UuSGlnaDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9JZiB0aGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgYW4gSW1wb3J0YW5jZSB3ZSB0YWtlIGl0XG5cdFx0XHRpZiAoZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UpIHtcblx0XHRcdFx0cmV0dXJuIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcblx0XHRcdH1cblx0XHRcdC8vIGVsc2UgdGhlIGhpZ2hlc3QgaW1wb3J0YW5jZSAoaWYgYW55KSBpcyByZXR1cm5lZFxuXHRcdFx0ZmllbGRzV2l0aEltcG9ydGFuY2UgPVxuXHRcdFx0XHRmaWVsZEdyb3VwRGF0YSAmJlxuXHRcdFx0XHQoZmllbGRHcm91cERhdGEgYXMgYW55KS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW06IERhdGFGaWVsZFR5cGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW0/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZTtcblx0XHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gX2dldE1heEltcG9ydGFuY2UoZmllbGRzV2l0aEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXNbXSk7XG5cdFx0fVxuXHRcdC8vSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBzZW1hbnRpY0tleSwgaW1wb3J0YW5jZSBzZXQgdG8gSGlnaFxuXHR9XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZSAmJlxuXHRcdChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8ucGF0aCAmJlxuXHRcdG1hcFNlbWFudGljS2V5cyAmJlxuXHRcdG1hcFNlbWFudGljS2V5cy5pbmNsdWRlcygoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZS5wYXRoKVxuXHRcdD8gSW1wb3J0YW5jZS5IaWdoXG5cdFx0OiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG59XG4vKipcbiAqIFJldHVybnMgbGluZSBpdGVtcyBmcm9tIG1ldGFkYXRhIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7TGluZUl0ZW19IGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHdpdGggdGhlaXIgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7VGFibGVDb2x1bW5bXX0gVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbiksXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW10sXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4gPSB7fSxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdID0gZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdHRhYmxlVHlwZTogVGFibGVUeXBlID0gdGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGNvbnN0IHNlbWFudGljS2V5czogU2VtYW50aWNLZXkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQ29tbW9uXCIsIENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY0tleSwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdO1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGxpbmVJdGVtKSA9PiB7XG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGxpbmVJdGVtKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID1cblx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhsaW5lSXRlbSkgJiYgbGluZUl0ZW0uVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHRcdD8gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIGxpbmVJdGVtKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gX2dldFJlbGF0aXZlUGF0aChsaW5lSXRlbSk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgcHJvcGVydGllcyB3aGljaCBhcmUgY29uc3VtZWQgYnkgdGhpcyBMaW5lSXRlbS5cblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KGxpbmVJdGVtLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZVR5cGUpO1xuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nID0gX3NsaWNlQXRTbGFzaChyZWxhdGl2ZVBhdGgsIHRydWUsIGZhbHNlKTtcblx0XHRcdGNvbnN0IGlzR3JvdXA6IGJvb2xlYW4gPSBncm91cFBhdGggIT0gcmVsYXRpdmVQYXRoO1xuXHRcdFx0Y29uc3Qgc0xhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBfZ2V0TGFiZWwobGluZUl0ZW0sIGlzR3JvdXApO1xuXHRcdFx0Y29uc3QgbmFtZSA9IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZShsaW5lSXRlbSk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGguaW5kZXhPZihcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwXCIpID4gLTE7XG5cdFx0XHRjb25zdCBzaG93RGF0YUZpZWxkc0xhYmVsOiBib29sZWFuID0gaXNGaWVsZEdyb3VwQ29sdW1uXG5cdFx0XHRcdD8gX2dldFNob3dEYXRhRmllbGRzTGFiZWwobmFtZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHRcdDogZmFsc2U7XG5cdFx0XHRjb25zdCBkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUobGluZUl0ZW0pO1xuXHRcdFx0Y29uc3Qgc0RhdGVJbnB1dEZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IHtcblx0XHRcdFx0Li4uZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSgpLFxuXHRcdFx0XHQuLi5nZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZSwgc2VtYW50aWNLZXlzLCBpc0ZpZWxkR3JvdXBDb2x1bW4sIGxpbmVJdGVtKVxuXHRcdFx0fTtcblx0XHRcdGxldCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz47XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGxpbmVJdGVtLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdGxpbmVJdGVtLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyhsaW5lSXRlbSwgZm9ybWF0T3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBleHBvcnRTZXR0aW5nczogYW55ID0ge1xuXHRcdFx0XHR0ZW1wbGF0ZTogcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzVGVtcGxhdGUsXG5cdFx0XHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5nc1dyYXBwaW5nLFxuXHRcdFx0XHR0eXBlOiBkYXRhVHlwZSA/IF9nZXRFeHBvcnREYXRhVHlwZShkYXRhVHlwZSwgcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMSkgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGlucHV0Rm9ybWF0OiBzRGF0ZUlucHV0Rm9ybWF0LFxuXHRcdFx0XHRkZWxpbWl0ZXI6IGRhdGFUeXBlID09PSBcIkVkbS5JbnQ2NFwiID8gdHJ1ZSA6IGZhbHNlLFxuXHRcdFx0XHR0cnVlVmFsdWU6IGRhdGFUeXBlID09PSBcIkVkbS5Cb29sZWFuXCIgPyBcIlllc1wiIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRmYWxzZVZhbHVlOiBkYXRhVHlwZSA9PT0gXCJFZG0uQm9vbGVhblwiID8gXCJOb1wiIDogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFVuaXROYW1lKSB7XG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0TmFtZTtcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MudHlwZSA9IFwiQ3VycmVuY3lcIjsgLy8gRm9yY2UgdG8gYSBjdXJyZW5jeSBiZWNhdXNlIHRoZXJlJ3MgYSB1bml0UHJvcGVydHkgKG90aGVyd2lzZSB0aGUgdmFsdWUgaXNuJ3QgcHJvcGVybHkgZm9ybWF0dGVkIHdoZW4gZXhwb3J0ZWQpXG5cdFx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRVbml0U3RyaW5nKSB7XG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzLnVuaXQgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0VW5pdFN0cmluZztcblx0XHRcdH1cblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9IGRhdGFUeXBlICYmIGdldFR5cGVDb25maWcobGluZUl0ZW0sIGRhdGFUeXBlKTtcblx0XHRcdGNvbnN0IG9UeXBlQ29uZmlnID0gcHJvcGVydHlUeXBlQ29uZmlnXG5cdFx0XHRcdD8ge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSxcblx0XHRcdFx0XHRcdG9Gb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdC4uLnByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b0NvbnN0cmFpbnRzOiBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHNcblx0XHRcdFx0ICB9XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0bGV0IHZpc3VhbFNldHRpbmdzOiBWaXN1YWxTZXR0aW5ncyA9IHt9O1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby52aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZCkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbiB3aXRoIGRpc3BsYXkgbW9kZSBhcyB0ZXh0IG9ubHksIGV4Y2x1ZGUgdGV4dCBwcm9wZXJ0eSBmcm9tIHRoZSB3aWR0aCBjYWxjdWxhdGlvblxuXHRcdFx0XHR2aXN1YWxTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHR3aWR0aENhbGN1bGF0aW9uOiB7XG5cdFx0XHRcdFx0XHRleGNsdWRlUHJvcGVydGllczogW1wiUHJvcGVydHk6OlwiICsgcmVsYXRlZFByb3BlcnRpZXNJbmZvLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkXVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZiAoIWRhdGFUeXBlIHx8ICFvVHlwZUNvbmZpZykge1xuXHRcdFx0XHQvLyBmb3IgY2hhcnRzXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzLndpZHRoQ2FsY3VsYXRpb24gPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUT0RPOiBGb3Igc2l0dWF0aW9uIFBPQyAtIGluY3JlYXNlIHdpZHRoIG9mIHRoZSBjb2x1bW4gd2l0aCB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgLSB3b3JrcyBmb3IgdGhlIHNpdHVhdGlvbnMgZGVtbyBhcHAgb25seSFcblx0XHRcdC8vIE1pZ2h0IGJlIGEgZ29vZCBpZGVhIHRvIG1vdmUgdGhlIGNvbXBsZXRlIGNvbHVtbiB3aWR0aCBkZXRlcm1pbmF0aW9uIHRvIHRoZSBjb252ZXJ0ZXIsIHRoYXQgd291bGQgYWxsb3cgdXMgdG8gd2lkZW5cblx0XHRcdC8vIHRoZSBjb2x1bW5zIGFzIG5lZWRlZC4gVGhpcyB3b3JrYXJvdW5kIG9ubHkgZGVhbHMgd2l0aCBEYXRlIGNvbHVtbnMuXG5cdFx0XHRjb25zdCB7IGhhc0RyYWZ0SW5kaWNhdG9yIH0gPSBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4obmFtZSwgc2VtYW50aWNLZXlzLCBpc0ZpZWxkR3JvdXBDb2x1bW4sIGxpbmVJdGVtKTtcblx0XHRcdGNvbnN0IHdpZHRoT3ZlcnJpZGUgPVxuXHRcdFx0XHQoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkuYW5ub3RhdGlvbnMgYXMgYW55KS5GRT8uU2l0dWF0aW9ucyAmJlxuXHRcdFx0XHRoYXNEcmFmdEluZGljYXRvciAmJlxuXHRcdFx0XHRsaW5lSXRlbS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkICYmXG5cdFx0XHRcdGxpbmVJdGVtLlZhbHVlLiR0YXJnZXQudHlwZSA9PT0gXCJFZG0uRGF0ZVwiXG5cdFx0XHRcdFx0PyBcIjExZW1cIlxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0XHRjb25zdCBvQ29sdW1uOiBhbnkgPSB7XG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChsaW5lSXRlbSksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0bGFiZWw6IHNMYWJlbCxcblx0XHRcdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IF9nZXRMYWJlbChsaW5lSXRlbSkgOiBudWxsLFxuXHRcdFx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IG51bGwsXG5cdFx0XHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGxpbmVJdGVtLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbihsaW5lSXRlbSkgPyBBdmFpbGFiaWxpdHlUeXBlLkhpZGRlbiA6IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCxcblx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0c2hvd0RhdGFGaWVsZHNMYWJlbDogc2hvd0RhdGFGaWVsZHNMYWJlbCxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBfaXNDb2x1bW5Tb3J0YWJsZShsaW5lSXRlbSwgcmVsYXRpdmVQYXRoLCBub25Tb3J0YWJsZUNvbHVtbnMpLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gcmVsYXRlZFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zOiBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0d2lkdGg6IGxpbmVJdGVtLmFubm90YXRpb25zPy5IVE1MNT8uQ3NzRGVmYXVsdHM/LndpZHRoIHx8IHdpZHRoT3ZlcnJpZGUgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGxpbmVJdGVtIGFzIERhdGFGaWVsZFR5cGVzLCBzZW1hbnRpY0tleXMpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0ZXhwb3J0Q29udGFjdFByb3BlcnR5OiByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3NDb250YWN0UHJvcGVydHksXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdFx0dHlwZUNvbmZpZzogb1R5cGVDb25maWcsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB2aXN1YWxTZXR0aW5nc1xuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHNUb29sdGlwID0gX2dldFRvb2x0aXAobGluZUl0ZW0pO1xuXHRcdFx0aWYgKHNUb29sdGlwKSB7XG5cdFx0XHRcdG9Db2x1bW4udG9vbHRpcCA9IHNUb29sdGlwO1xuXHRcdFx0fVxuXG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uKTtcblxuXHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV07XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW25hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0bGV0IHRhYmxlQ29sdW1ucyA9IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRub25Tb3J0YWJsZUNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGVcblx0KTtcblx0dGFibGVDb2x1bW5zID0gdGFibGVDb2x1bW5zLmNvbmNhdChhbm5vdGF0aW9uQ29sdW1ucyk7XG5cblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKGNvbHVtbnNUb0JlQ3JlYXRlZCwgdGFibGVDb2x1bW5zLCBub25Tb3J0YWJsZUNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHR0YWJsZUNvbHVtbnMgPSB0YWJsZUNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UYWJsZUNvbHVtbltdfSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIChcblx0cHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRsZXQgbWF0Y2hlZFByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJvcGVydGllcykge1xuXHRcdG1hdGNoZWRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRbXSxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24gKHByb3BlcnRpZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0cmV0dXJuIHByb3BlcnRpZXNcblx0XHQubWFwKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdH0pXG5cdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSB0YWJsZSBjb2x1bW4gcHJvcGVydHkgdmFsdWUgYmFzZWQgb24gY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIE1hbmlmZXN0IGRlZmluZWQgcHJvcGVydHkgdmFsdWUgZm9yIGN1c3RvbSAvIGFubm90YXRpb24gY29sdW1uc1xuICogRGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgY3VzdG9tIGNvbHVtbiBpZiBub3Qgb3ZlcndyaXR0ZW4gaW4gbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHByb3BlcnR5IFRoZSBjb2x1bW4gcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqIEBwYXJhbSB7YW55fSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQW5ub3RhdGlvbkNvbHVtbiBXaGV0aGVyIHRoZSBjb2x1bW4sIGRlZmluZWQgaW4gbWFuaWZlc3QsIGNvcnJlc3BvbmRzIHRvIGFuIGV4aXN0aW5nIGFubm90YXRpb24gY29sdW1uLlxuICogQHJldHVybnMge2FueX0gRGV0ZXJtaW5lZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGNvbHVtblxuICovXG5jb25zdCBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogYW55LCBkZWZhdWx0VmFsdWU6IGFueSwgaXNBbm5vdGF0aW9uQ29sdW1uOiBib29sZWFuKTogYW55IHtcblx0aWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBJZiBhbm5vdGF0aW9uIGNvbHVtbiBoYXMgbm8gcHJvcGVydHkgZGVmaW5lZCBpbiBtYW5pZmVzdCxcblx0XHQvLyBkbyBub3Qgb3ZlcndyaXRlIGl0IHdpdGggbWFuaWZlc3QgY29sdW1uJ3MgZGVmYXVsdCB2YWx1ZS5cblx0XHRyZXR1cm4gaXNBbm5vdGF0aW9uQ29sdW1uID8gdW5kZWZpbmVkIDogZGVmYXVsdFZhbHVlO1xuXHR9XG5cdC8vIFJldHVybiB3aGF0IGlzIGRlZmluZWQgaW4gbWFuaWZlc3QuXG5cdHJldHVybiBwcm9wZXJ0eTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0YWJsZSBjb2x1bW4gZGVmaW5pdGlvbnMgZnJvbSBtYW5pZmVzdC5cbiAqIEBwYXJhbSBjb2x1bW5zXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHBhcmFtIG5hdmlnYXRpb25TZXR0aW5nc1xuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEN1c3RvbUNvbHVtbj59IFRoZSBjb2x1bW5zIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tTWFuaWZlc3QgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0VGFibGVDb2x1bW4+LFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdG5hdmlnYXRpb25TZXR0aW5ncz86IE5hdmlnYXRpb25TZXR0aW5nc0NvbmZpZ3VyYXRpb25cbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUNvbHVtbj4ge1xuXHRjb25zdCBpbnRlcm5hbENvbHVtbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUNvbHVtbj4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IGtleSBpbiBjb2x1bW5zKSB7XG5cdFx0Y29uc3QgbWFuaWZlc3RDb2x1bW4gPSBjb2x1bW5zW2tleV07XG5cdFx0Ly8gVG8gaWRlbnRpZnkgdGhlIGFubm90YXRpb24gY29sdW1uIHByb3BlcnR5IG92ZXJ3cml0ZSB2aWEgbWFuaWZlc3QgdXNlLWNhc2UuXG5cdFx0Y29uc3QgaXNBbm5vdGF0aW9uQ29sdW1uID0gYW5ub3RhdGlvbkNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ua2V5ID09PSBrZXkpO1xuXHRcdEtleUhlbHBlci52YWxpZGF0ZUtleShrZXkpO1xuXHRcdGNvbnN0IHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldFByb3BlcnR5TmFtZXMoXG5cdFx0XHRtYW5pZmVzdENvbHVtbi5wcm9wZXJ0aWVzLFxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0ZW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0aWYgKCFtYW5pZmVzdENvbHVtbj8udGVtcGxhdGUgJiYgbWFuaWZlc3RDb2x1bW4/LnR5cGUgIT09IFwiU2xvdFwiICYmICFpc0Fubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdGNvbnN0IE1lc3NhZ2UgPSBcIlRoZSBhbm5vdGF0aW9uIGNvbHVtbiAnXCIgKyBrZXkgKyBcIicgcmVmZXJlbmNlZCBpbiB0aGUgbWFuaWZlc3QgaXMgbm90IGZvdW5kXCI7XG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdC5hZGRJc3N1ZShcblx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LFxuXHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTG93LFxuXHRcdFx0XHRcdE1lc3NhZ2UsXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGUsXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGU/LkFubm90YXRpb25Db2x1bW5zPy5JbnZhbGlkS2V5XG5cdFx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0ge1xuXHRcdFx0XHRrZXk6IGtleSxcblx0XHRcdFx0aWQ6IFwiQ3VzdG9tQ29sdW1uOjpcIiArIGtleSxcblx0XHRcdFx0bmFtZTogXCJDdXN0b21Db2x1bW46OlwiICsga2V5LFxuXHRcdFx0XHRoZWFkZXI6IG1hbmlmZXN0Q29sdW1uLmhlYWRlcixcblx0XHRcdFx0d2lkdGg6IG1hbmlmZXN0Q29sdW1uLndpZHRoIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aW1wb3J0YW5jZTogX2dldE1hbmlmZXN0T3JEZWZhdWx0VmFsdWUobWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UsIEltcG9ydGFuY2UuTm9uZSwgaXNBbm5vdGF0aW9uQ29sdW1uKSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduLCBIb3Jpem9udGFsQWxpZ24uQmVnaW4sIGlzQW5ub3RhdGlvbkNvbHVtbiksXG5cdFx0XHRcdHR5cGU6IG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IFwiU2xvdFwiID8gQ29sdW1uVHlwZS5TbG90IDogQ29sdW1uVHlwZS5EZWZhdWx0LFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IF9nZXRNYW5pZmVzdE9yRGVmYXVsdFZhbHVlKG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCwgaXNBbm5vdGF0aW9uQ29sdW1uKSxcblx0XHRcdFx0dGVtcGxhdGU6IG1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlIHx8IFwidW5kZWZpbmVkXCIsXG5cdFx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdFx0YW5jaG9yOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbj8uYW5jaG9yLFxuXHRcdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRpc05hdmlnYWJsZTogaXNBbm5vdGF0aW9uQ29sdW1uID8gdW5kZWZpbmVkIDogaXNBY3Rpb25OYXZpZ2FibGUobWFuaWZlc3RDb2x1bW4sIG5hdmlnYXRpb25TZXR0aW5ncywgdHJ1ZSksXG5cdFx0XHRcdHNldHRpbmdzOiBtYW5pZmVzdENvbHVtbi5zZXR0aW5ncyxcblx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiBwcm9wZXJ0eUluZm9zLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBfZ2V0TWFuaWZlc3RPckRlZmF1bHRWYWx1ZShcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC4uLmdldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoKSxcblx0XHRcdFx0XHRcdC4uLm1hbmlmZXN0Q29sdW1uLmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGlzQW5ub3RhdGlvbkNvbHVtblxuXHRcdFx0XHQpLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczoge1xuXHRcdFx0XHRcdHRlbXBsYXRlOiBwcm9wZXJ0eUluZm9zID8gX2FwcGVuZEN1c3RvbVRlbXBsYXRlKHByb3BlcnR5SW5mb3MpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdGZpZWxkTGFiZWw6IHByb3BlcnR5SW5mb3MgPyBtYW5pZmVzdENvbHVtbi5oZWFkZXIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0d3JhcDogcHJvcGVydHlJbmZvcyAmJiBwcm9wZXJ0eUluZm9zLmxlbmd0aCA+IDEgPyB0cnVlIDogZmFsc2Vcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaW50ZXJuYWxDb2x1bW5zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFAxM25Nb2RlKFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbjogVGFibGVDb250cm9sQ29uZmlndXJhdGlvblxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbWFuaWZlc3RXcmFwcGVyOiBNYW5pZmVzdFdyYXBwZXIgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpO1xuXHRjb25zdCB0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnQ6IFZhcmlhbnRNYW5hZ2VtZW50VHlwZSA9IG1hbmlmZXN0V3JhcHBlci5nZXRWYXJpYW50TWFuYWdlbWVudCgpO1xuXHRjb25zdCBhUGVyc29uYWxpemF0aW9uOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBiQW5hbHl0aWNhbFRhYmxlID0gdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIjtcblx0aWYgKHRhYmxlTWFuaWZlc3RTZXR0aW5ncz8udGFibGVTZXR0aW5ncz8ucGVyc29uYWxpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyBQZXJzb25hbGl6YXRpb24gY29uZmlndXJlZCBpbiBtYW5pZmVzdC5cblx0XHRjb25zdCBwZXJzb25hbGl6YXRpb246IGFueSA9IHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzLnBlcnNvbmFsaXphdGlvbjtcblx0XHRpZiAocGVyc29uYWxpemF0aW9uID09PSB0cnVlKSB7XG5cdFx0XHQvLyBUYWJsZSBwZXJzb25hbGl6YXRpb24gZnVsbHkgZW5hYmxlZC5cblx0XHRcdHJldHVybiBiQW5hbHl0aWNhbFRhYmxlID8gXCJTb3J0LENvbHVtbixGaWx0ZXIsR3JvdXAsQWdncmVnYXRlXCIgOiBcIlNvcnQsQ29sdW1uLEZpbHRlclwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHBlcnNvbmFsaXphdGlvbiA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Ly8gU3BlY2lmaWMgcGVyc29uYWxpemF0aW9uIG9wdGlvbnMgZW5hYmxlZCBpbiBtYW5pZmVzdC4gVXNlIHRoZW0gYXMgaXMuXG5cdFx0XHRpZiAocGVyc29uYWxpemF0aW9uLnNvcnQpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiU29ydFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uY29sdW1uKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkNvbHVtblwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZmlsdGVyKSB7XG5cdFx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkZpbHRlclwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uZ3JvdXAgJiYgYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJHcm91cFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChwZXJzb25hbGl6YXRpb24uYWdncmVnYXRlICYmIGJBbmFseXRpY2FsVGFibGUpIHtcblx0XHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQWdncmVnYXRlXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFQZXJzb25hbGl6YXRpb24ubGVuZ3RoID4gMCA/IGFQZXJzb25hbGl6YXRpb24uam9pbihcIixcIikgOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIE5vIHBlcnNvbmFsaXphdGlvbiBjb25maWd1cmVkIGluIG1hbmlmZXN0LlxuXHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIlNvcnRcIik7XG5cdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiQ29sdW1uXCIpO1xuXHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCkge1xuXHRcdFx0aWYgKHZhcmlhbnRNYW5hZ2VtZW50ID09PSBWYXJpYW50TWFuYWdlbWVudFR5cGUuQ29udHJvbCB8fCBfaXNGaWx0ZXJCYXJIaWRkZW4obWFuaWZlc3RXcmFwcGVyLCBjb252ZXJ0ZXJDb250ZXh0KSkge1xuXHRcdFx0XHQvLyBGZWF0dXJlIHBhcml0eSB3aXRoIFYyLlxuXHRcdFx0XHQvLyBFbmFibGUgdGFibGUgZmlsdGVyaW5nIGJ5IGRlZmF1bHQgb25seSBpbiBjYXNlIG9mIENvbnRyb2wgbGV2ZWwgdmFyaWFudCBtYW5hZ2VtZW50LlxuXHRcdFx0XHQvLyBPciB3aGVuIHRoZSBMUiBmaWx0ZXIgYmFyIGlzIGhpZGRlbiB2aWEgbWFuaWZlc3Qgc2V0dGluZ1xuXHRcdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJGaWx0ZXJcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFQZXJzb25hbGl6YXRpb24ucHVzaChcIkZpbHRlclwiKTtcblx0XHR9XG5cblx0XHRpZiAoYkFuYWx5dGljYWxUYWJsZSkge1xuXHRcdFx0YVBlcnNvbmFsaXphdGlvbi5wdXNoKFwiR3JvdXBcIik7XG5cdFx0XHRhUGVyc29uYWxpemF0aW9uLnB1c2goXCJBZ2dyZWdhdGVcIik7XG5cdFx0fVxuXHRcdHJldHVybiBhUGVyc29uYWxpemF0aW9uLmpvaW4oXCIsXCIpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGJvb2xlYW4gc3VnZ2VzdGluZyBpZiBhIGZpbHRlciBiYXIgaXMgYmVpbmcgdXNlZCBvbiB0aGUgcGFnZS5cbiAqXG4gKiBDaGFydCBoYXMgYSBkZXBlbmRlbmN5IHRvIGZpbHRlciBiYXIgKGlzc3VlIHdpdGggbG9hZGluZyBkYXRhKS4gT25jZSByZXNvbHZlZCwgdGhlIGNoZWNrIGZvciBjaGFydCBzaG91bGQgYmUgcmVtb3ZlZCBoZXJlLlxuICogVW50aWwgdGhlbiwgaGlkaW5nIGZpbHRlciBiYXIgaXMgbm93IGFsbG93ZWQgaWYgYSBjaGFydCBpcyBiZWluZyB1c2VkIG9uIExSLlxuICpcbiAqIEBwYXJhbSB7TWFuaWZlc3RXcmFwcGVyfSBtYW5pZmVzdFdyYXBwZXIgTWFuaWZlc3Qgc2V0dGluZ3MgZ2V0dGVyIGZvciB0aGUgcGFnZVxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBCb29sZWFuIHN1Z2dlc3RpbmcgaWYgYSBmaWx0ZXIgYmFyIGlzIGJlaW5nIHVzZWQgb24gdGhlIHBhZ2UuXG4gKi9cbmZ1bmN0aW9uIF9pc0ZpbHRlckJhckhpZGRlbihtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlciwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdG1hbmlmZXN0V3JhcHBlci5pc0ZpbHRlckJhckhpZGRlbigpICYmXG5cdFx0IWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucygpICYmXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIHRoZSBzb3J0IGNvbmRpdGlvbnMgZm9yIHRoZSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0ge1ByZXNlbnRhdGlvblZhcmlhbnRUeXBlVHlwZXMgfCB1bmRlZmluZWR9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIFByZXNlbnRhdGlvbiB2YXJpYW50IGFubm90YXRpb25cbiAqIEBwYXJhbSBjb2x1bW5zIFRhYmxlIGNvbHVtbnMgcHJvY2Vzc2VkIGJ5IHRoZSBjb252ZXJ0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFNvcnQgY29uZGl0aW9ucyBmb3IgYSBwcmVzZW50YXRpb24gdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ydENvbmRpdGlvbnMoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHQvLyBDdXJyZW50bHkgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGFzIHNvcnRlclxuXHRjb25zdCBub25Tb3J0YWJsZVByb3BlcnRpZXMgPSBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSk7XG5cdGxldCBzb3J0Q29uZGl0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAocHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlNvcnRPcmRlcikge1xuXHRcdGNvbnN0IHNvcnRlcnM6IFNvcnRlclR5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGNvbmRpdGlvbnMgPSB7XG5cdFx0XHRzb3J0ZXJzOiBzb3J0ZXJzXG5cdFx0fTtcblx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Tb3J0T3JkZXIuZm9yRWFjaCgoY29uZGl0aW9uKSA9PiB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25Qcm9wZXJ0eSA9IGNvbmRpdGlvbi5Qcm9wZXJ0eTtcblx0XHRcdGlmIChjb25kaXRpb25Qcm9wZXJ0eSAmJiBub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5kZXhPZihjb25kaXRpb25Qcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lKSA9PT0gLTEpIHtcblx0XHRcdFx0Y29uc3QgaW5mb05hbWUgPSBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKFtjb25kaXRpb25Qcm9wZXJ0eV0sIGNvbHVtbnMpWzBdO1xuXHRcdFx0XHRpZiAoaW5mb05hbWUpIHtcblx0XHRcdFx0XHRjb25kaXRpb25zLnNvcnRlcnMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBpbmZvTmFtZSxcblx0XHRcdFx0XHRcdGRlc2NlbmRpbmc6ICEhY29uZGl0aW9uLkRlc2NlbmRpbmdcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHNvcnRDb25kaXRpb25zID0gY29uZGl0aW9ucy5zb3J0ZXJzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbnMpIDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBzb3J0Q29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBvZiBwcm9wZXJ0eVBhdGggdG8gYW4gYXJyYXkgb2YgcHJvcGVydHlJbmZvIG5hbWVzLlxuICpcbiAqIEBwYXJhbSBwYXRocyB0aGUgYXJyYXkgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0gY29sdW1ucyB0aGUgYXJyYXkgb2YgcHJvcGVydHlJbmZvc1xuICogQHJldHVybnMgYW4gYXJyYXkgb2YgcHJvcGVydHlJbmZvIG5hbWVzXG4gKi9cblxuZnVuY3Rpb24gY29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhwYXRoczogUHJvcGVydHlQYXRoW10sIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGluZm9OYW1lczogc3RyaW5nW10gPSBbXTtcblx0cGF0aHMuZm9yRWFjaCgoY3VycmVudFBhdGgpID0+IHtcblx0XHRpZiAoY3VycmVudFBhdGg/LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mbyA9IGNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBjb2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdFx0XHRyZXR1cm4gIWFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyAmJiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gY3VycmVudFBhdGg/LiR0YXJnZXQ/Lm5hbWU7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChwcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0aW5mb05hbWVzLnB1c2gocHJvcGVydHlJbmZvLm5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGluZm9OYW1lcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBQcmVzZW50YXRpb24gVmFyaWFudCBncm91cCBjb25kaXRpb25zLlxuICpcbiAqIEBwYXJhbSB7UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZH0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRHcm91cENvbmRpdGlvbnMoXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkLFxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtbltdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRsZXQgZ3JvdXBDb25kaXRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdGlmIChwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uR3JvdXBCeSkge1xuXHRcdGNvbnN0IGFHcm91cEJ5ID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24uR3JvdXBCeSBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0XHRjb25zdCBhR3JvdXBMZXZlbHMgPSBjb252ZXJ0UHJvcGVydHlQYXRoc1RvSW5mb05hbWVzKGFHcm91cEJ5LCBjb2x1bW5zKS5tYXAoKGluZm9OYW1lKSA9PiB7XG5cdFx0XHRyZXR1cm4geyBuYW1lOiBpbmZvTmFtZSB9O1xuXHRcdH0pO1xuXG5cdFx0Z3JvdXBDb25kaXRpb25zID0gYUdyb3VwTGV2ZWxzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KHsgZ3JvdXBMZXZlbHM6IGFHcm91cExldmVscyB9KSA6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gZ3JvdXBDb25kaXRpb25zO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIHN0cmluZyBjb250YWluaW5nIFByZXNlbnRhdGlvbiBWYXJpYW50IGFnZ3JlZ2F0ZSBjb25kaXRpb25zLlxuICpcbiAqIEBwYXJhbSB7UHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZH0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gUHJlc2VudGF0aW9uIHZhcmlhbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIGNvbHVtbnMgQ29udmVydGVyIHByb2Nlc3NlZCB0YWJsZSBjb2x1bW5zXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBHcm91cCBjb25kaXRpb25zIGZvciBhIFByZXNlbnRhdGlvbiB2YXJpYW50LlxuICovXG5mdW5jdGlvbiBnZXRBZ2dyZWdhdGVDb25kaXRpb25zKFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbjogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyB8IHVuZGVmaW5lZCxcblx0Y29sdW1uczogVGFibGVDb2x1bW5bXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IGFnZ3JlZ2F0ZUNvbmRpdGlvbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5Ub3RhbCkge1xuXHRcdGNvbnN0IGFUb3RhbHMgPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbi5Ub3RhbCBhcyBQcm9wZXJ0eVBhdGhbXTtcblx0XHRjb25zdCBhZ2dyZWdhdGVzOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+ID0ge307XG5cdFx0Y29udmVydFByb3BlcnR5UGF0aHNUb0luZm9OYW1lcyhhVG90YWxzLCBjb2x1bW5zKS5mb3JFYWNoKChpbmZvTmFtZSkgPT4ge1xuXHRcdFx0YWdncmVnYXRlc1tpbmZvTmFtZV0gPSB7fTtcblx0XHR9KTtcblxuXHRcdGFnZ3JlZ2F0ZUNvbmRpdGlvbnMgPSBKU09OLnN0cmluZ2lmeShhZ2dyZWdhdGVzKTtcblx0fVxuXG5cdHJldHVybiBhZ2dyZWdhdGVDb25kaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVBbm5vdGF0aW9uQ29uZmlndXJhdGlvbihcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPzogUHJlc2VudGF0aW9uVmFyaWFudFR5cGVUeXBlcyxcblx0dmlld0NvbmZpZ3VyYXRpb24/OiBWaWV3UGF0aENvbmZpZ3VyYXRpb25cbik6IFRhYmxlQW5ub3RhdGlvbkNvbmZpZ3VyYXRpb24ge1xuXHQvLyBOZWVkIHRvIGdldCB0aGUgdGFyZ2V0XG5cdGNvbnN0IHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCB9ID0gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoKTtcblx0Y29uc3QgdGl0bGU6IGFueSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5IZWFkZXJJbmZvPy5UeXBlTmFtZVBsdXJhbDtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5U2V0O1xuXHRjb25zdCBwYWdlTWFuaWZlc3RTZXR0aW5nczogTWFuaWZlc3RXcmFwcGVyID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKTtcblx0Y29uc3QgaGFzQWJzb2x1dGVQYXRoID0gbmF2aWdhdGlvblByb3BlcnR5UGF0aC5sZW5ndGggPT09IDAsXG5cdFx0cDEzbk1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldFAxM25Nb2RlKHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCB0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiksXG5cdFx0aWQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gVGFibGVJRCh2aXN1YWxpemF0aW9uUGF0aCkgOiBUYWJsZUlEKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSwgXCJMaW5lSXRlbVwiKTtcblx0Y29uc3QgdGFyZ2V0Q2FwYWJpbGl0aWVzID0gZ2V0Q2FwYWJpbGl0eVJlc3RyaWN0aW9uKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBuYXZpZ2F0aW9uVGFyZ2V0UGF0aCA9IGdldE5hdmlnYXRpb25UYXJnZXRQYXRoKGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRjb25zdCBuYXZpZ2F0aW9uU2V0dGluZ3MgPSBwYWdlTWFuaWZlc3RTZXR0aW5ncy5nZXROYXZpZ2F0aW9uQ29uZmlndXJhdGlvbihuYXZpZ2F0aW9uVGFyZ2V0UGF0aCk7XG5cdGNvbnN0IGNyZWF0aW9uQmVoYXZpb3VyID0gX2dldENyZWF0aW9uQmVoYXZpb3VyKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24sIGNvbnZlcnRlckNvbnRleHQsIG5hdmlnYXRpb25TZXR0aW5ncyk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQgPSBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRjcmVhdGlvbkJlaGF2aW91ci5tb2RlIGFzIENyZWF0aW9uTW9kZSxcblx0XHR0YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0XHR2aWV3Q29uZmlndXJhdGlvblxuXHQpO1xuXG5cdGNvbnN0IGRlbGV0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0RGVsZXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlQnV0dG9uVmlzaWJpbGl0eUV4cHJlc3Npb24gPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uID0gZ2V0TWFzc0VkaXRWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRjb25zdCBpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCA9IGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdFx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdGNvbXBpbGVCaW5kaW5nKGNyZWF0ZUJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uKSA9PT0gXCJmYWxzZVwiXG5cdCk7XG5cblx0Y29uc3Qgc2VsZWN0aW9uTW9kZSA9IGdldFNlbGVjdGlvbk1vZGUoXG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdHZpc3VhbGl6YXRpb25QYXRoLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0aGFzQWJzb2x1dGVQYXRoLFxuXHRcdHRhcmdldENhcGFiaWxpdGllcyxcblx0XHRkZWxldGVCdXR0b25WaXNpYmlsaXR5RXhwcmVzc2lvbixcblx0XHRtYXNzRWRpdEJ1dHRvblZpc2liaWxpdHlFeHByZXNzaW9uXG5cdCk7XG5cdGxldCB0aHJlc2hvbGQgPSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gMTAgOiAzMDtcblx0aWYgKHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5NYXhJdGVtcykge1xuXHRcdHRocmVzaG9sZCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLk1heEl0ZW1zLnZhbHVlT2YoKSBhcyBudW1iZXI7XG5cdH1cblxuXHRjb25zdCB2YXJpYW50TWFuYWdlbWVudDogVmFyaWFudE1hbmFnZW1lbnRUeXBlID0gcGFnZU1hbmlmZXN0U2V0dGluZ3MuZ2V0VmFyaWFudE1hbmFnZW1lbnQoKTtcblx0Y29uc3QgaXNTZWFyY2hhYmxlID0gaXNQYXRoU2VhcmNoYWJsZShjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSk7XG5cdGNvbnN0IHN0YW5kYXJkQWN0aW9ucyA9IHtcblx0XHRjcmVhdGU6IGdldFN0YW5kYXJkQWN0aW9uQ3JlYXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdFwiZGVsZXRlXCI6IGdldFN0YW5kYXJkQWN0aW9uRGVsZXRlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpLFxuXHRcdHBhc3RlOiBnZXRTdGFuZGFyZEFjdGlvblBhc3RlKGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkKSxcblx0XHRtYXNzRWRpdDogZ2V0U3RhbmRhcmRBY3Rpb25NYXNzRWRpdChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KSxcblx0XHRjcmVhdGlvblJvdzogZ2V0Q3JlYXRpb25Sb3coY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dClcblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGlkOiBpZCxcblx0XHRlbnRpdHlOYW1lOiBlbnRpdHlTZXQgPyBlbnRpdHlTZXQubmFtZSA6IFwiXCIsXG5cdFx0Y29sbGVjdGlvbjogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0bmF2aWdhdGlvblBhdGg6IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFx0cm93OiBfZ2V0Um93Q29uZmlndXJhdGlvblByb3BlcnR5KFxuXHRcdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLFxuXHRcdFx0dmlzdWFsaXphdGlvblBhdGgsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0bmF2aWdhdGlvblNldHRpbmdzLFxuXHRcdFx0bmF2aWdhdGlvblRhcmdldFBhdGhcblx0XHQpLFxuXHRcdHAxM25Nb2RlOiBwMTNuTW9kZSxcblx0XHRzdGFuZGFyZEFjdGlvbnM6IHtcblx0XHRcdGFjdGlvbnM6IHN0YW5kYXJkQWN0aW9ucyxcblx0XHRcdGlzSW5zZXJ0VXBkYXRlVGVtcGxhdGVkOiBpc0luc2VydFVwZGF0ZVRlbXBsYXRlZCxcblx0XHRcdHVwZGF0YWJsZVByb3BlcnR5UGF0aDogZ2V0Q3VycmVudEVudGl0eVNldFVwZGF0YWJsZVBhdGgoY29udmVydGVyQ29udGV4dClcblx0XHR9LFxuXHRcdGRpc3BsYXlNb2RlOiBpc0luRGlzcGxheU1vZGUoY29udmVydGVyQ29udGV4dCwgdmlld0NvbmZpZ3VyYXRpb24pLFxuXHRcdGNyZWF0ZTogY3JlYXRpb25CZWhhdmlvdXIsXG5cdFx0c2VsZWN0aW9uTW9kZTogc2VsZWN0aW9uTW9kZSxcblx0XHRhdXRvQmluZE9uSW5pdDpcblx0XHRcdF9pc0ZpbHRlckJhckhpZGRlbihwYWdlTWFuaWZlc3RTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCkgfHxcblx0XHRcdChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlICYmXG5cdFx0XHRcdCEodmlld0NvbmZpZ3VyYXRpb24gJiYgcGFnZU1hbmlmZXN0U2V0dGluZ3MuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyh2aWV3Q29uZmlndXJhdGlvbikpKSxcblx0XHR2YXJpYW50TWFuYWdlbWVudDogdmFyaWFudE1hbmFnZW1lbnQgPT09IFwiQ29udHJvbFwiICYmICFwMTNuTW9kZSA/IFZhcmlhbnRNYW5hZ2VtZW50VHlwZS5Ob25lIDogdmFyaWFudE1hbmFnZW1lbnQsXG5cdFx0dGhyZXNob2xkOiB0aHJlc2hvbGQsXG5cdFx0c29ydENvbmRpdGlvbnM6IGdldFNvcnRDb25kaXRpb25zKGNvbnZlcnRlckNvbnRleHQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uLCBjb2x1bW5zKSxcblx0XHR0aXRsZTogdGl0bGUsXG5cdFx0c2VhcmNoYWJsZTogdGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udHlwZSAhPT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhKGlzQ29uc3RhbnQoaXNTZWFyY2hhYmxlKSAmJiBpc1NlYXJjaGFibGUudmFsdWUgPT09IGZhbHNlKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBfZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGU6IHN0cmluZywgaXNDb21wbGV4UHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZTogc3RyaW5nID0gXCJTdHJpbmdcIjtcblx0aWYgKGlzQ29tcGxleFByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAoZGF0YVR5cGUpIHtcblx0XHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5JbnQ2NFwiOlxuXHRcdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiTnVtYmVyXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVcIjpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJFZG0uVGltZU9mRGF5XCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkVkbS5Cb29sZWFuXCI6XG5cdFx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG59XG5cbi8qKlxuICogU3BsaXQgdGhlIHZpc3VhbGl6YXRpb24gcGF0aCBpbnRvIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHBhdGggYW5kIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0bGV0IFtuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBhbm5vdGF0aW9uUGF0aF0gPSB2aXN1YWxpemF0aW9uUGF0aC5zcGxpdChcIkBcIik7XG5cblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpID09PSBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoLmxlbmd0aCAtIDEpIHtcblx0XHQvLyBEcm9wIHRyYWlsaW5nIHNsYXNoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguc3Vic3RyKDAsIG5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgubGVuZ3RoIC0gMSk7XG5cdH1cblx0cmV0dXJuIHsgbmF2aWdhdGlvblByb3BlcnR5UGF0aCwgYW5ub3RhdGlvblBhdGggfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKFxuXHRzZWxlY3Rpb25WYXJpYW50UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlQW5ub3RhdGlvbihzZWxlY3Rpb25WYXJpYW50UGF0aCk7XG5cdGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uVmFyaWFudFR5cGUgPSByZXNvbHZlZFRhcmdldC5hbm5vdGF0aW9uIGFzIFNlbGVjdGlvblZhcmlhbnRUeXBlO1xuXG5cdGlmIChzZWxlY3Rpb24pIHtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHNlbGVjdGlvbi5TZWxlY3RPcHRpb25zPy5mb3JFYWNoKChzZWxlY3RPcHRpb246IFNlbGVjdE9wdGlvblR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZTogYW55ID0gc2VsZWN0T3B0aW9uLlByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZXMuaW5kZXhPZihQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRwcm9wZXJ0eU5hbWVzLnB1c2goUHJvcGVydHlQYXRoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dDogc2VsZWN0aW9uPy5UZXh0Py50b1N0cmluZygpLFxuXHRcdFx0cHJvcGVydHlOYW1lczogcHJvcGVydHlOYW1lc1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gX2dldEZ1bGxTY3JlZW5CYXNlZE9uRGV2aWNlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpc0lwaG9uZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG5cdC8vIElmIGVuYWJsZUZ1bGxTY3JlZW4gaXMgbm90IHNldCwgdXNlIGFzIGRlZmF1bHQgdHJ1ZSBvbiBwaG9uZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG5cdGxldCBlbmFibGVGdWxsU2NyZWVuID0gdGFibGVTZXR0aW5ncy5lbmFibGVGdWxsU2NyZWVuID8/IGlzSXBob25lO1xuXHQvLyBNYWtlIHN1cmUgdGhhdCBlbmFibGVGdWxsU2NyZWVuIGlzIG5vdCBzZXQgb24gTGlzdFJlcG9ydCBmb3IgZGVza3RvcCBvciB0YWJsZXRcblx0aWYgKCFpc0lwaG9uZSAmJiBlbmFibGVGdWxsU2NyZWVuICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0KSB7XG5cdFx0ZW5hYmxlRnVsbFNjcmVlbiA9IGZhbHNlO1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGlhZ25vc3RpY3MoKS5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LCBJc3N1ZVNldmVyaXR5LkxvdywgSXNzdWVUeXBlLkZVTExTQ1JFRU5NT0RFX05PVF9PTl9MSVNUUkVQT1JUKTtcblx0fVxuXHRyZXR1cm4gZW5hYmxlRnVsbFNjcmVlbjtcbn1cblxuZnVuY3Rpb24gX2dldE11bHRpU2VsZWN0TW9kZShcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBtdWx0aVNlbGVjdE1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHRhYmxlVHlwZSAhPT0gXCJSZXNwb25zaXZlVGFibGVcIikge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0c3dpdGNoIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpKSB7XG5cdFx0Y2FzZSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydDpcblx0XHRjYXNlIFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2U6XG5cdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2U6XG5cdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSB0YWJsZVNldHRpbmdzLnNlbGVjdEFsbCA9PT0gZmFsc2UgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLnVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0XHRtdWx0aVNlbGVjdE1vZGUgPSAhdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPyBcIkNsZWFyQWxsXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdH1cblxuXHRyZXR1cm4gbXVsdGlTZWxlY3RNb2RlO1xufVxuXG5mdW5jdGlvbiBfZ2V0VGFibGVUeXBlKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFRhYmxlVHlwZSB7XG5cdGxldCB0YWJsZVR5cGUgPSB0YWJsZVNldHRpbmdzPy50eXBlIHx8IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBcIk9iamVjdFBhZ2VcIikge1xuXHRcdGlmICh0YWJsZVNldHRpbmdzPy50eXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmICFhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpKSB7XG5cdFx0XHR0YWJsZVR5cGUgPSBcIkdyaWRUYWJsZVwiO1xuXHRcdH1cblx0XHRpZiAoIXRhYmxlU2V0dGluZ3M/LnR5cGUpIHtcblx0XHRcdGlmIChjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzRGVza3RvcCgpICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRcdFx0dGFibGVUeXBlID0gXCJBbmFseXRpY2FsVGFibGVcIjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhYmxlVHlwZSA9IFwiUmVzcG9uc2l2ZVRhYmxlXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB0YWJsZVR5cGU7XG59XG5cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJzKFxuXHR0YWJsZVNldHRpbmdzOiBUYWJsZU1hbmlmZXN0U2V0dGluZ3NDb25maWd1cmF0aW9uLFxuXHRxdWlja0ZpbHRlclBhdGhzOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfVtdLFxuXHRxdWlja1NlbGVjdGlvblZhcmlhbnQ6IGFueSxcblx0cGF0aDogeyBhbm5vdGF0aW9uUGF0aDogc3RyaW5nIH0sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IGFueSB7XG5cdGlmIChxdWlja1NlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRxdWlja0ZpbHRlclBhdGhzLnB1c2goeyBhbm5vdGF0aW9uUGF0aDogcGF0aC5hbm5vdGF0aW9uUGF0aCB9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHF1aWNrRmlsdGVyczoge1xuXHRcdFx0ZW5hYmxlZDpcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgPyBcIns9ICR7cGFnZUludGVybmFsPmhhc1BlbmRpbmdGaWx0ZXJzfSAhPT0gdHJ1ZX1cIiA6IHRydWUsXG5cdFx0XHRzaG93Q291bnRzOiB0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMsXG5cdFx0XHRwYXRoczogcXVpY2tGaWx0ZXJQYXRoc1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gX2dldEVuYWJsZUV4cG9ydChcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW5hYmxlUGFzdGU6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnQgIT09IHVuZGVmaW5lZFxuXHRcdD8gdGFibGVTZXR0aW5ncy5lbmFibGVFeHBvcnRcblx0XHQ6IGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFwiT2JqZWN0UGFnZVwiIHx8IGVuYWJsZVBhc3RlO1xufVxuXG5mdW5jdGlvbiBfZ2V0RmlsdGVyQ29uZmlndXJhdGlvbihcblx0dGFibGVTZXR0aW5nczogVGFibGVNYW5pZmVzdFNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSB8IHVuZGVmaW5lZCxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogYW55IHtcblx0aWYgKCFsaW5lSXRlbUFubm90YXRpb24pIHtcblx0XHRyZXR1cm4ge307XG5cdH1cblx0Y29uc3QgcXVpY2tGaWx0ZXJQYXRoczogeyBhbm5vdGF0aW9uUGF0aDogc3RyaW5nIH1bXSA9IFtdO1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pO1xuXHRsZXQgcXVpY2tTZWxlY3Rpb25WYXJpYW50OiBhbnk7XG5cdGxldCBmaWx0ZXJzO1xuXHR0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnBhdGhzPy5mb3JFYWNoKChwYXRoOiB7IGFubm90YXRpb25QYXRoOiBzdHJpbmcgfSkgPT4ge1xuXHRcdHF1aWNrU2VsZWN0aW9uVmFyaWFudCA9IHRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoXCJAXCIgKyBwYXRoLmFubm90YXRpb25QYXRoKTtcblx0XHRmaWx0ZXJzID0gX2dldEZpbHRlcnModGFibGVTZXR0aW5ncywgcXVpY2tGaWx0ZXJQYXRocywgcXVpY2tTZWxlY3Rpb25WYXJpYW50LCBwYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fSk7XG5cblx0bGV0IGhpZGVUYWJsZVRpdGxlID0gZmFsc2U7XG5cdGhpZGVUYWJsZVRpdGxlID0gISF0YWJsZVNldHRpbmdzLnF1aWNrVmFyaWFudFNlbGVjdGlvbj8uaGlkZVRhYmxlVGl0bGU7XG5cdHJldHVybiB7XG5cdFx0ZmlsdGVyczogZmlsdGVycyxcblx0XHRoZWFkZXJWaXNpYmxlOiAhKHF1aWNrU2VsZWN0aW9uVmFyaWFudCAmJiBoaWRlVGFibGVUaXRsZSlcblx0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtIHwgdW5kZWZpbmVkLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRjaGVja0NvbmRlbnNlZExheW91dCA9IGZhbHNlXG4pOiBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIHtcblx0Y29uc3QgdGFibGVNYW5pZmVzdFNldHRpbmdzOiBUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2aXN1YWxpemF0aW9uUGF0aCk7XG5cdGNvbnN0IHRhYmxlU2V0dGluZ3MgPSAodGFibGVNYW5pZmVzdFNldHRpbmdzICYmIHRhYmxlTWFuaWZlc3RTZXR0aW5ncy50YWJsZVNldHRpbmdzKSB8fCB7fTtcblx0Y29uc3QgY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2U7XG5cdGNvbnN0IGVuYWJsZUF1dG9Db2x1bW5XaWR0aCA9ICFjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmlzUGhvbmUoKTtcblx0Y29uc3QgZW5hYmxlUGFzdGUgPVxuXHRcdHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGUgIT09IHVuZGVmaW5lZCA/IHRhYmxlU2V0dGluZ3MuZW5hYmxlUGFzdGUgOiBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBcIk9iamVjdFBhZ2VcIjsgLy8gUGFzdGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBleGNlcHRlZCBmb3IgT1Bcblx0Y29uc3QgZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyID1cblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCA/IFwiQVBJLmRhdGFTdGF0ZUluZGljYXRvckZpbHRlclwiIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0NvbmRlbnNlZFRhYmxlTGF5b3V0Q29tcGxpYW50ID0gY2hlY2tDb25kZW5zZWRMYXlvdXQgJiYgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc0NvbmRlbnNlZExheW91dENvbXBsaWFudCgpO1xuXHRjb25zdCBvRmlsdGVyQ29uZmlndXJhdGlvbiA9IF9nZXRGaWx0ZXJDb25maWd1cmF0aW9uKHRhYmxlU2V0dGluZ3MsIGxpbmVJdGVtQW5ub3RhdGlvbiwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IHRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5jdXN0b21WYWxpZGF0aW9uRnVuY3Rpb247XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IHRhYmxlVHlwZTogVGFibGVUeXBlID0gX2dldFRhYmxlVHlwZSh0YWJsZVNldHRpbmdzLCBhZ2dyZWdhdGlvbkhlbHBlciwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGNvbmRlbnNlZFRhYmxlTGF5b3V0ID1cblx0XHR0YWJsZVNldHRpbmdzLmNvbmRlbnNlZFRhYmxlTGF5b3V0ICE9PSB1bmRlZmluZWQgJiYgdGFibGVUeXBlICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiID8gdGFibGVTZXR0aW5ncy5jb25kZW5zZWRUYWJsZUxheW91dCA6IGZhbHNlO1xuXHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IHtcblx0XHRjcmVhdGVBdEVuZDogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/LmNyZWF0ZUF0RW5kICE9PSB1bmRlZmluZWQgPyB0YWJsZVNldHRpbmdzLmNyZWF0aW9uTW9kZT8uY3JlYXRlQXRFbmQgOiB0cnVlLFxuXHRcdGNyZWF0aW9uTW9kZTogdGFibGVTZXR0aW5ncy5jcmVhdGlvbk1vZGU/Lm5hbWUgfHwgY3JlYXRpb25Nb2RlLFxuXHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdGRhdGFTdGF0ZUluZGljYXRvckZpbHRlcjogZGF0YVN0YXRlSW5kaWNhdG9yRmlsdGVyLFxuXHRcdC8vIGlmIGEgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkLCBpLmUuIHNldCB0byBmYWxzZVxuXHRcdGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGE6ICFjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPyAhIXRhYmxlU2V0dGluZ3MuY3JlYXRpb25Nb2RlPy5kaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIDogZmFsc2UsXG5cdFx0ZW5hYmxlQXV0b0NvbHVtbldpZHRoOiBlbmFibGVBdXRvQ29sdW1uV2lkdGgsXG5cdFx0ZW5hYmxlRXhwb3J0OiBfZ2V0RW5hYmxlRXhwb3J0KHRhYmxlU2V0dGluZ3MsIGNvbnZlcnRlckNvbnRleHQsIGVuYWJsZVBhc3RlKSxcblx0XHRlbmFibGVGdWxsU2NyZWVuOiBfZ2V0RnVsbFNjcmVlbkJhc2VkT25EZXZpY2UodGFibGVTZXR0aW5ncywgY29udmVydGVyQ29udGV4dCwgY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5pc1Bob25lKCkpLFxuXHRcdGVuYWJsZU1hc3NFZGl0OiB0YWJsZVNldHRpbmdzPy5lbmFibGVNYXNzRWRpdCxcblx0XHRlbmFibGVQYXN0ZTogZW5hYmxlUGFzdGUsXG5cdFx0aGVhZGVyVmlzaWJsZTogdHJ1ZSxcblx0XHRtdWx0aVNlbGVjdE1vZGU6IF9nZXRNdWx0aVNlbGVjdE1vZGUodGFibGVTZXR0aW5ncywgdGFibGVUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRzZWxlY3Rpb25MaW1pdDogdGFibGVTZXR0aW5ncy5zZWxlY3RBbGwgPT09IHRydWUgfHwgdGFibGVTZXR0aW5ncy5zZWxlY3Rpb25MaW1pdCA9PT0gMCA/IDAgOiB0YWJsZVNldHRpbmdzLnNlbGVjdGlvbkxpbWl0IHx8IDIwMCxcblxuXHRcdHNob3dSb3dDb3VudDpcblx0XHRcdCF0YWJsZVNldHRpbmdzPy5xdWlja1ZhcmlhbnRTZWxlY3Rpb24/LnNob3dDb3VudHMgJiYgIWNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0Vmlld0NvbmZpZ3VyYXRpb24oKT8uc2hvd0NvdW50cyxcblx0XHR0eXBlOiB0YWJsZVR5cGUsXG5cdFx0dXNlQ29uZGVuc2VkVGFibGVMYXlvdXQ6IGNvbmRlbnNlZFRhYmxlTGF5b3V0ICYmIGlzQ29uZGVuc2VkVGFibGVMYXlvdXRDb21wbGlhbnRcblx0fTtcblxuXHRyZXR1cm4geyAuLi5vQ29uZmlndXJhdGlvbiwgLi4ub0ZpbHRlckNvbmZpZ3VyYXRpb24gfTtcbn1cblxuZXhwb3J0IHR5cGUgY29uZmlnVHlwZUNvbnN0cmFpbnRzID0ge1xuXHRzY2FsZT86IG51bWJlcjtcblx0cHJlY2lzaW9uPzogbnVtYmVyO1xuXHRtYXhMZW5ndGg/OiBudW1iZXI7XG5cdG51bGxhYmxlPzogYm9vbGVhbjtcblx0bWluaW11bT86IHN0cmluZztcblx0bWF4aW11bT86IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zID0ge1xuXHRwYXJzZUFzU3RyaW5nPzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc/OiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBjb25maWdUeXBlID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzOiBjb25maWdUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IGNvbmZpZ1R5cGVmb3JtYXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xuXHRsZXQgb1RhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HWyhvUHJvcGVydHkgYXMgUHJvcGVydHkpPy50eXBlXSB8fCAoZGF0YVR5cGUgPyBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXSA6IHVuZGVmaW5lZCk7XG5cdGlmICghb1RhcmdldE1hcHBpbmcgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSk/LnRhcmdldFR5cGUgJiYgKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZT8uX3R5cGUgPT09IFwiVHlwZURlZmluaXRpb25cIikge1xuXHRcdG9UYXJnZXRNYXBwaW5nID0gRURNX1RZUEVfTUFQUElOR1soKG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBUeXBlRGVmaW5pdGlvbikudW5kZXJseWluZ1R5cGVdO1xuXHR9XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogY29uZmlnVHlwZSA9IHtcblx0XHR0eXBlOiBvVGFyZ2V0TWFwcGluZz8udHlwZSxcblx0XHRjb25zdHJhaW50czoge30sXG5cdFx0Zm9ybWF0T3B0aW9uczoge31cblx0fTtcblx0aWYgKGlzUHJvcGVydHkob1Byb3BlcnR5KSkge1xuXHRcdHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cyA9IHtcblx0XHRcdHNjYWxlOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFNjYWxlID8gb1Byb3BlcnR5LnNjYWxlIDogdW5kZWZpbmVkLFxuXHRcdFx0cHJlY2lzaW9uOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJFByZWNpc2lvbiA/IG9Qcm9wZXJ0eS5wcmVjaXNpb24gOiB1bmRlZmluZWQsXG5cdFx0XHRtYXhMZW5ndGg6IG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy4kTWF4TGVuZ3RoID8gb1Byb3BlcnR5Lm1heExlbmd0aCA6IHVuZGVmaW5lZCxcblx0XHRcdG51bGxhYmxlOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE51bGxhYmxlID8gb1Byb3BlcnR5Lm51bGxhYmxlIDogdW5kZWZpbmVkLFxuXHRcdFx0bWluaW11bTpcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NaW5pbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW0pXG5cdFx0XHRcdFx0PyBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1pbmltdW19YFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4aW11bTpcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltcIkBPcmcuT0RhdGEuVmFsaWRhdGlvbi5WMS5NYXhpbXVtLyREZWNpbWFsXCJdICYmXG5cdFx0XHRcdCFpc05hTihvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW0pXG5cdFx0XHRcdFx0PyBgJHtvUHJvcGVydHkuYW5ub3RhdGlvbnM/LlZhbGlkYXRpb24/Lk1heGltdW19YFxuXHRcdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdFx0aXNEaWdpdFNlcXVlbmNlOlxuXHRcdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcudHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJpbmdcIiAmJlxuXHRcdFx0XHRvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIl0gJiZcblx0XHRcdFx0KG9Qcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogcHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgPyB0cnVlIDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG4iXX0=
|