@sapui5/sap.fe.core 1.101.0 → 1.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +66 -30
- package/src/sap/fe/core/AppComponent.ts +68 -51
- package/src/sap/fe/core/AppStateHandler.js +13 -13
- package/src/sap/fe/core/AppStateHandler.ts +18 -18
- package/src/sap/fe/core/BaseController.js +11 -9
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +279 -188
- package/src/sap/fe/core/CommonUtils.ts +306 -215
- package/src/sap/fe/core/ExtensionAPI.js +25 -30
- package/src/sap/fe/core/ExtensionAPI.ts +37 -41
- package/src/sap/fe/core/PageController.js +12 -7
- package/src/sap/fe/core/PageController.ts +10 -5
- package/src/sap/fe/core/TemplateComponent.js +6 -6
- package/src/sap/fe/core/TemplateComponent.ts +11 -11
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +306 -78
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +280 -70
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
- package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
- package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
- package/src/sap/fe/core/controllerextensions/EditFlow.js +351 -229
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +321 -246
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +59 -34
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -45
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +72 -72
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +82 -80
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +152 -131
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +171 -152
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +11 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +31 -37
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +30 -15
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +19 -11
- package/src/sap/fe/core/controllerextensions/Paginator.ts +22 -14
- package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +39 -21
- package/src/sap/fe/core/controllerextensions/Share.ts +45 -26
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -62
- package/src/sap/fe/core/controllerextensions/ViewState.js +75 -62
- package/src/sap/fe/core/controllerextensions/ViewState.ts +78 -63
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +99 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +58 -112
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +7 -7
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +20 -21
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1631 -0
- package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +270 -211
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +772 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +240 -100
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1199 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +364 -229
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +188 -0
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +185 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +626 -0
- package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +112 -69
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +937 -0
- package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +72 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +21 -24
- package/src/sap/fe/core/controls/CommandExecution.ts +19 -24
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +48 -43
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +51 -46
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +19 -9
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +14 -8
- package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +50 -3
- package/src/sap/fe/core/controls/FileWrapper.ts +45 -12
- package/src/sap/fe/core/controls/FilterBar.js +6 -2
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +14 -3
- package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.ts +41 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +48 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +71 -76
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +36 -65
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +551 -36
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +605 -36
- package/src/sap/fe/core/converters/ConverterContext.js +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -14
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +56 -67
- package/src/sap/fe/core/converters/MetaModelConverter.ts +183 -193
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +73 -37
- package/src/sap/fe/core/converters/annotations/DataField.ts +121 -77
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +51 -49
- package/src/sap/fe/core/converters/controls/Common/Action.ts +58 -54
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -15
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +29 -27
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
- package/src/sap/fe/core/converters/controls/Common/Form.js +30 -34
- package/src/sap/fe/core/converters/controls/Common/Form.ts +48 -58
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
- package/src/sap/fe/core/converters/controls/Common/Table.js +318 -244
- package/src/sap/fe/core/converters/controls/Common/Table.ts +368 -297
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +135 -125
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +162 -148
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +51 -45
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +79 -67
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +92 -89
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +124 -120
- package/src/sap/fe/core/converters/helpers/Aggregation.js +11 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +25 -23
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -30
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +31 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
- package/src/sap/fe/core/converters/helpers/ID.js +46 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +56 -55
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +65 -77
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +6 -6
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +10 -8
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +83 -22
- package/src/sap/fe/core/formatters/TableFormatter.ts +80 -25
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/fpm/Component.js +2 -2
- package/src/sap/fe/core/fpm/Component.ts +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +388 -285
- package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
- package/src/sap/fe/core/helpers/ClassSupport.ts +15 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +10 -9
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/MassEditHelper.js +532 -264
- package/src/sap/fe/core/helpers/MassEditHelper.ts +560 -289
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +50 -58
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +16 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +20 -16
- package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
- package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
- package/src/sap/fe/core/library.js +51 -3
- package/src/sap/fe/core/library.ts +47 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +151 -197
- package/src/sap/fe/core/messagebundle_ar.properties +36 -63
- package/src/sap/fe/core/messagebundle_bg.properties +36 -63
- package/src/sap/fe/core/messagebundle_ca.properties +36 -63
- package/src/sap/fe/core/messagebundle_cs.properties +36 -63
- package/src/sap/fe/core/messagebundle_cy.properties +36 -63
- package/src/sap/fe/core/messagebundle_da.properties +37 -64
- package/src/sap/fe/core/messagebundle_de.properties +36 -63
- package/src/sap/fe/core/messagebundle_el.properties +38 -65
- package/src/sap/fe/core/messagebundle_en.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_GB.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +44 -73
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +52 -81
- package/src/sap/fe/core/messagebundle_es.properties +36 -63
- package/src/sap/fe/core/messagebundle_es_MX.properties +36 -63
- package/src/sap/fe/core/messagebundle_et.properties +36 -63
- package/src/sap/fe/core/messagebundle_fi.properties +36 -63
- package/src/sap/fe/core/messagebundle_fr.properties +39 -66
- package/src/sap/fe/core/messagebundle_fr_CA.properties +36 -63
- package/src/sap/fe/core/messagebundle_hi.properties +36 -63
- package/src/sap/fe/core/messagebundle_hr.properties +36 -63
- package/src/sap/fe/core/messagebundle_hu.properties +35 -62
- package/src/sap/fe/core/messagebundle_id.properties +37 -64
- package/src/sap/fe/core/messagebundle_it.properties +54 -81
- package/src/sap/fe/core/messagebundle_iw.properties +36 -63
- package/src/sap/fe/core/messagebundle_ja.properties +36 -63
- package/src/sap/fe/core/messagebundle_kk.properties +36 -63
- package/src/sap/fe/core/messagebundle_ko.properties +36 -63
- package/src/sap/fe/core/messagebundle_lt.properties +36 -63
- package/src/sap/fe/core/messagebundle_lv.properties +36 -63
- package/src/sap/fe/core/messagebundle_ms.properties +37 -64
- package/src/sap/fe/core/messagebundle_nl.properties +37 -64
- package/src/sap/fe/core/messagebundle_no.properties +36 -63
- package/src/sap/fe/core/messagebundle_pl.properties +37 -64
- package/src/sap/fe/core/messagebundle_pt.properties +37 -64
- package/src/sap/fe/core/messagebundle_pt_PT.properties +36 -63
- package/src/sap/fe/core/messagebundle_ro.properties +36 -63
- package/src/sap/fe/core/messagebundle_ru.properties +36 -63
- package/src/sap/fe/core/messagebundle_sh.properties +36 -63
- package/src/sap/fe/core/messagebundle_sk.properties +36 -63
- package/src/sap/fe/core/messagebundle_sl.properties +38 -65
- package/src/sap/fe/core/messagebundle_sv.properties +36 -63
- package/src/sap/fe/core/messagebundle_th.properties +36 -63
- package/src/sap/fe/core/messagebundle_tr.properties +36 -63
- package/src/sap/fe/core/messagebundle_uk.properties +37 -64
- package/src/sap/fe/core/messagebundle_vi.properties +37 -64
- package/src/sap/fe/core/messagebundle_zh_CN.properties +36 -63
- package/src/sap/fe/core/messagebundle_zh_TW.properties +37 -64
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +12 -10
- package/src/sap/fe/core/services/NavigationServiceFactory.js +54 -45
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +61 -49
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +63 -60
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +76 -73
- package/src/sap/fe/core/services/ShellServicesFactory.js +102 -71
- package/src/sap/fe/core/services/ShellServicesFactory.ts +109 -78
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +24 -18
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +53 -50
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +3 -4
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -15
- package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -18
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +12 -11
- package/src/sap/fe/core/templating/FilterHelper.ts +17 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +79 -56
- package/src/sap/fe/core/templating/PropertyHelper.ts +41 -27
- package/src/sap/fe/core/templating/UIFormatters.js +163 -97
- package/src/sap/fe/core/templating/UIFormatters.ts +210 -129
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
- package/src/sap/fe/core/type/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/AnnotationHelper.js +0 -331
- package/src/sap/fe/core/AnnotationHelper.ts +0 -321
- package/src/sap/fe/core/RouterProxy.js +0 -938
- package/src/sap/fe/core/TransactionHelper.js +0 -1577
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
- package/src/sap/fe/core/actions/collaboration/Manage.js +0 -264
- package/src/sap/fe/core/actions/draft.js +0 -665
- package/src/sap/fe/core/actions/messageHandling.js +0 -579
- package/src/sap/fe/core/actions/nonDraft.js +0 -20
- package/src/sap/fe/core/actions/nonDraft.ts +0 -12
- package/src/sap/fe/core/actions/operations.js +0 -1096
- package/src/sap/fe/core/actions/sticky.js +0 -130
- package/src/sap/fe/core/actions/sticky.ts +0 -119
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1729
|
@@ -2,7 +2,7 @@
|
|
|
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(["sap/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory"], function (Log, MetaModelConverter, Service, ServiceFactory) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
@@ -51,15 +51,15 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
51
51
|
*
|
|
52
52
|
* @private
|
|
53
53
|
* @ui5-restricted
|
|
54
|
-
* @param
|
|
55
|
-
* @param
|
|
54
|
+
* @param sEntityType Name of the entity type
|
|
55
|
+
* @param oSideEffect SideEffects definition
|
|
56
56
|
*/
|
|
57
57
|
;
|
|
58
58
|
|
|
59
59
|
_proto.addControlSideEffects = function addControlSideEffects(sEntityType, oSideEffect) {
|
|
60
60
|
if (oSideEffect.sourceControlId) {
|
|
61
61
|
var oControlSideEffect = _objectSpread(_objectSpread({}, oSideEffect), {}, {
|
|
62
|
-
fullyQualifiedName: sEntityType
|
|
62
|
+
fullyQualifiedName: "".concat(sEntityType, "/SideEffectsForControl/").concat(oSideEffect.sourceControlId)
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
var mEntityControlSideEffects = this._oSideEffectsType.control[sEntityType] || {};
|
|
@@ -72,15 +72,15 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
72
72
|
*
|
|
73
73
|
* @private
|
|
74
74
|
* @ui5-restricted
|
|
75
|
-
* @param
|
|
76
|
-
* @param
|
|
77
|
-
* @param
|
|
78
|
-
* @returns
|
|
75
|
+
* @param sTriggerAction Name of the action
|
|
76
|
+
* @param oContext Context
|
|
77
|
+
* @param sGroupId The group ID to be used for the request
|
|
78
|
+
* @returns A promise that is resolved without data or with a return value context when the action call succeeded
|
|
79
79
|
*/
|
|
80
80
|
;
|
|
81
81
|
|
|
82
82
|
_proto.executeAction = function executeAction(sTriggerAction, oContext, sGroupId) {
|
|
83
|
-
var oTriggerAction = oContext.getModel().bindContext(sTriggerAction
|
|
83
|
+
var oTriggerAction = oContext.getModel().bindContext("".concat(sTriggerAction, "(...)"), oContext);
|
|
84
84
|
return oTriggerAction.execute(sGroupId || oContext.getBinding().getUpdateGroupId());
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
@@ -88,7 +88,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
88
88
|
*
|
|
89
89
|
* @private
|
|
90
90
|
* @ui5-restricted
|
|
91
|
-
* @returns
|
|
91
|
+
* @returns Converted OData metaModel
|
|
92
92
|
*/
|
|
93
93
|
;
|
|
94
94
|
|
|
@@ -103,8 +103,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
103
103
|
*
|
|
104
104
|
* @function
|
|
105
105
|
* @name getEntityTypeFromContext
|
|
106
|
-
* @param
|
|
107
|
-
* @returns
|
|
106
|
+
* @param oContext Context
|
|
107
|
+
* @returns Entity Type
|
|
108
108
|
*/
|
|
109
109
|
;
|
|
110
110
|
|
|
@@ -119,8 +119,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
119
119
|
*
|
|
120
120
|
* @private
|
|
121
121
|
* @ui5-restricted
|
|
122
|
-
* @param
|
|
123
|
-
* @returns
|
|
122
|
+
* @param sEntityTypeName Name of the entity type
|
|
123
|
+
* @returns SideEffects dictionary
|
|
124
124
|
*/
|
|
125
125
|
;
|
|
126
126
|
|
|
@@ -132,9 +132,9 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
132
132
|
*
|
|
133
133
|
* @private
|
|
134
134
|
* @ui5-restricted
|
|
135
|
-
* @param
|
|
136
|
-
* @param
|
|
137
|
-
* @returns
|
|
135
|
+
* @param sActionName Name of the action
|
|
136
|
+
* @param oContext Context
|
|
137
|
+
* @returns SideEffects definition
|
|
138
138
|
*/
|
|
139
139
|
;
|
|
140
140
|
|
|
@@ -179,7 +179,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
179
179
|
*
|
|
180
180
|
* @private
|
|
181
181
|
* @ui5-restricted
|
|
182
|
-
* @param
|
|
182
|
+
* @param sControlId Control Id
|
|
183
183
|
*/
|
|
184
184
|
;
|
|
185
185
|
|
|
@@ -197,10 +197,10 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
197
197
|
*
|
|
198
198
|
* @function
|
|
199
199
|
* @name requestSideEffects
|
|
200
|
-
* @param
|
|
201
|
-
* @param
|
|
202
|
-
* @param
|
|
203
|
-
* @returns
|
|
200
|
+
* @param aPathExpressions Targets of SideEffects to be executed
|
|
201
|
+
* @param oContext Context where SideEffects need to be executed
|
|
202
|
+
* @param sGroupId The group ID to be used for the request
|
|
203
|
+
* @returns Promise on SideEffects request
|
|
204
204
|
*/
|
|
205
205
|
;
|
|
206
206
|
|
|
@@ -248,9 +248,9 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
248
248
|
*
|
|
249
249
|
* @function
|
|
250
250
|
* @name requestSideEffectsForNavigationProperty
|
|
251
|
-
* @param
|
|
252
|
-
* @param
|
|
253
|
-
* @returns
|
|
251
|
+
* @param sNavigationProperty Navigation property
|
|
252
|
+
* @param oContext Context where SideEffects need to be executed
|
|
253
|
+
* @returns SideEffects request on SAPUI5 context
|
|
254
254
|
*/
|
|
255
255
|
;
|
|
256
256
|
|
|
@@ -260,7 +260,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
260
260
|
var sBaseEntityType = this.getEntityTypeFromContext(oContext);
|
|
261
261
|
|
|
262
262
|
if (sBaseEntityType) {
|
|
263
|
-
var sNavigationPath = sNavigationProperty
|
|
263
|
+
var sNavigationPath = "".concat(sNavigationProperty, "/");
|
|
264
264
|
var aSideEffects = this.getODataEntitySideEffects(sBaseEntityType);
|
|
265
265
|
var aTargets = [];
|
|
266
266
|
Object.keys(aSideEffects).filter( // Keep relevant SideEffects
|
|
@@ -288,7 +288,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
288
288
|
|
|
289
289
|
if (aTargets.length > 0) {
|
|
290
290
|
return this.requestSideEffects(aTargets, oContext).catch(function (oError) {
|
|
291
|
-
return Log.error("SideEffects - Error while processing SideEffects for Navigation Property "
|
|
291
|
+
return Log.error("SideEffects - Error while processing SideEffects for Navigation Property ".concat(sNavigationProperty), oError);
|
|
292
292
|
});
|
|
293
293
|
}
|
|
294
294
|
}
|
|
@@ -300,8 +300,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
300
300
|
*
|
|
301
301
|
* @private
|
|
302
302
|
* @ui5-restricted
|
|
303
|
-
* @param
|
|
304
|
-
* @returns
|
|
303
|
+
* @param sEntityTypeName Entity type Name
|
|
304
|
+
* @returns SideEffects dictionary
|
|
305
305
|
*/
|
|
306
306
|
;
|
|
307
307
|
|
|
@@ -314,9 +314,9 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
314
314
|
*
|
|
315
315
|
* @private
|
|
316
316
|
* @ui5-restricted
|
|
317
|
-
* @param
|
|
318
|
-
* @param
|
|
319
|
-
* @returns
|
|
317
|
+
* @param oSideEffect SideEffects definition
|
|
318
|
+
* @param mEntityType Entity type
|
|
319
|
+
* @returns SideEffects definition with added text properties
|
|
320
320
|
*/
|
|
321
321
|
;
|
|
322
322
|
|
|
@@ -330,7 +330,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
330
330
|
var bIsStarProperty = sPropertyPath.endsWith("*"),
|
|
331
331
|
// Can be '*' or '.../navProp/*'
|
|
332
332
|
sNavigationPropertyPath = sPropertyPath.substring(0, sPropertyPath.lastIndexOf("/")),
|
|
333
|
-
sRelativePath = sNavigationPropertyPath ? sNavigationPropertyPath
|
|
333
|
+
sRelativePath = sNavigationPropertyPath ? "".concat(sNavigationPropertyPath, "/") : "",
|
|
334
334
|
mTarget = mEntityType.resolvePath(sNavigationPropertyPath) || mEntityType;
|
|
335
335
|
|
|
336
336
|
if (mTarget) {
|
|
@@ -358,10 +358,10 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
358
358
|
});
|
|
359
359
|
}
|
|
360
360
|
} else {
|
|
361
|
-
Log.info("SideEffects - The entity type associated to property path "
|
|
361
|
+
Log.info("SideEffects - The entity type associated to property path ".concat(sPropertyPath, " cannot be resolved"));
|
|
362
362
|
}
|
|
363
363
|
} else {
|
|
364
|
-
Log.info("SideEffects - The property path "
|
|
364
|
+
Log.info("SideEffects - The property path ".concat(sPropertyPath, " cannot be resolved"));
|
|
365
365
|
}
|
|
366
366
|
});
|
|
367
367
|
aDerivedProperties.forEach(function (mPropertyInfo) {
|
|
@@ -405,10 +405,10 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
405
405
|
*
|
|
406
406
|
* @private
|
|
407
407
|
* @ui5-restricted
|
|
408
|
-
* @param
|
|
409
|
-
* @param
|
|
410
|
-
* @param
|
|
411
|
-
* @returns
|
|
408
|
+
* @param oSideEffects SideEffects definition
|
|
409
|
+
* @param mEntityType Entity type
|
|
410
|
+
* @param sBindingParameter Name of the binding parameter
|
|
411
|
+
* @returns SideEffects definition
|
|
412
412
|
*/
|
|
413
413
|
;
|
|
414
414
|
|
|
@@ -424,8 +424,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
424
424
|
*
|
|
425
425
|
* @private
|
|
426
426
|
* @ui5-restricted
|
|
427
|
-
* @param
|
|
428
|
-
* @returns
|
|
427
|
+
* @param oSideEffects SideEffects definition
|
|
428
|
+
* @returns Converted SideEffects
|
|
429
429
|
*/
|
|
430
430
|
;
|
|
431
431
|
|
|
@@ -436,7 +436,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
436
436
|
if (sTarget) {
|
|
437
437
|
aTargetProperties.push(sTarget);
|
|
438
438
|
} else {
|
|
439
|
-
Log.error("SideEffects - Error while processing TargetProperties for SideEffects"
|
|
439
|
+
Log.error("SideEffects - Error while processing TargetProperties for SideEffects".concat(oSideEffects.fullyQualifiedName));
|
|
440
440
|
}
|
|
441
441
|
|
|
442
442
|
return aTargetProperties;
|
|
@@ -463,8 +463,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
463
463
|
*
|
|
464
464
|
* @private
|
|
465
465
|
* @ui5-restricted
|
|
466
|
-
* @param
|
|
467
|
-
* @returns
|
|
466
|
+
* @param oSource Entity type or action
|
|
467
|
+
* @returns Array of SideEffects
|
|
468
468
|
*/
|
|
469
469
|
;
|
|
470
470
|
|
|
@@ -500,25 +500,25 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
500
500
|
*
|
|
501
501
|
* @private
|
|
502
502
|
* @ui5-restricted
|
|
503
|
-
* @param
|
|
504
|
-
* @param
|
|
503
|
+
* @param aPathExpressions SideEffects targets
|
|
504
|
+
* @param oContext Context
|
|
505
505
|
*/
|
|
506
506
|
;
|
|
507
507
|
|
|
508
508
|
_proto._logRequest = function _logRequest(aPathExpressions, oContext) {
|
|
509
509
|
var sTargetPaths = aPathExpressions.reduce(function (sPaths, mTarget) {
|
|
510
|
-
return sPaths
|
|
510
|
+
return "".concat(sPaths, "\n\t\t").concat(mTarget.$NavigationPropertyPath || mTarget || "");
|
|
511
511
|
}, "");
|
|
512
|
-
Log.debug("SideEffects - Request:\n\tContext path : "
|
|
512
|
+
Log.debug("SideEffects - Request:\n\tContext path : ".concat(oContext.getPath(), "\n\tProperty paths :").concat(sTargetPaths));
|
|
513
513
|
}
|
|
514
514
|
/**
|
|
515
515
|
* Removes name of binding parameter on SideEffects targets.
|
|
516
516
|
*
|
|
517
517
|
* @private
|
|
518
518
|
* @ui5-restricted
|
|
519
|
-
* @param
|
|
520
|
-
* @param
|
|
521
|
-
* @returns
|
|
519
|
+
* @param oSideEffects SideEffects definition
|
|
520
|
+
* @param sBindingParameterName Name of binding parameter
|
|
521
|
+
* @returns SideEffects definition
|
|
522
522
|
*/
|
|
523
523
|
;
|
|
524
524
|
|
|
@@ -532,7 +532,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
532
532
|
mTarget = mTarget.map(function (mProperty) {
|
|
533
533
|
var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
|
|
534
534
|
|
|
535
|
-
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^"
|
|
535
|
+
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^".concat(sBindingParameterName, "/?")), "");
|
|
536
536
|
return bNavigationPropertyPath ? {
|
|
537
537
|
$NavigationPropertyPath: sValue
|
|
538
538
|
} : sValue;
|
|
@@ -550,14 +550,14 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
550
550
|
*
|
|
551
551
|
* @private
|
|
552
552
|
* @ui5-restricted
|
|
553
|
-
* @param
|
|
554
|
-
* @returns
|
|
553
|
+
* @param aTargets SideEffects targets
|
|
554
|
+
* @returns SideEffects targets without duplicates
|
|
555
555
|
*/
|
|
556
556
|
;
|
|
557
557
|
|
|
558
558
|
_proto._removeDuplicateTargets = function _removeDuplicateTargets(aTargets) {
|
|
559
|
-
return aTargets.filter(function (mTarget, iIndex,
|
|
560
|
-
return
|
|
559
|
+
return aTargets.filter(function (mTarget, iIndex, aInTargets) {
|
|
560
|
+
return aInTargets.findIndex(function (mSearchTarget) {
|
|
561
561
|
return mSearchTarget === mTarget || // PropertyPath
|
|
562
562
|
mTarget.$NavigationPropertyPath && mSearchTarget.$NavigationPropertyPath === mTarget.$NavigationPropertyPath // NavigationPropertyPath
|
|
563
563
|
;
|
|
@@ -572,8 +572,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
572
572
|
*
|
|
573
573
|
* @private
|
|
574
574
|
* @ui5-restricted
|
|
575
|
-
* @param
|
|
576
|
-
* @returns
|
|
575
|
+
* @param mEntityType Entity type
|
|
576
|
+
* @returns Entity type SideEffects dictionary
|
|
577
577
|
*/
|
|
578
578
|
;
|
|
579
579
|
|
|
@@ -617,8 +617,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
617
617
|
*
|
|
618
618
|
* @private
|
|
619
619
|
* @ui5-restricted
|
|
620
|
-
* @param
|
|
621
|
-
* @returns
|
|
620
|
+
* @param mEntityType Entity type
|
|
621
|
+
* @returns Entity type SideEffects dictionary
|
|
622
622
|
*/
|
|
623
623
|
;
|
|
624
624
|
|
|
@@ -660,4 +660,4 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
660
660
|
|
|
661
661
|
return SideEffectsServiceFactory;
|
|
662
662
|
}, false);
|
|
663
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiaW5pdCIsIl9vU2lkZUVmZmVjdHNUeXBlIiwib0RhdGEiLCJlbnRpdGllcyIsImFjdGlvbnMiLCJjb250cm9sIiwiX2JJbml0aWFsaXplZCIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJzRW50aXR5VHlwZSIsIm9TaWRlRWZmZWN0Iiwic291cmNlQ29udHJvbElkIiwib0NvbnRyb2xTaWRlRWZmZWN0IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyIsImV4ZWN1dGVBY3Rpb24iLCJzVHJpZ2dlckFjdGlvbiIsIm9Db250ZXh0Iiwic0dyb3VwSWQiLCJvVHJpZ2dlckFjdGlvbiIsImdldE1vZGVsIiwiYmluZENvbnRleHQiLCJleGVjdXRlIiwiZ2V0QmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImNvbnZlcnRUeXBlcyIsIl9vQ2FwYWJpbGl0aWVzIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsInNFbnRpdHlUeXBlTmFtZSIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJzQWN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemVTaWRlRWZmZWN0cyIsIm9DYXBhYmlsaXRpZXMiLCJvQ29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwiZW50aXR5VHlwZSIsIl9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJfcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyIsInJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyIsInNDb250cm9sSWQiLCJPYmplY3QiLCJrZXlzIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiYVBhdGhFeHByZXNzaW9ucyIsIl9sb2dSZXF1ZXN0Iiwib1Byb21pc2UiLCJlIiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJzaWRlRWZmZWN0cyIsImFQcm9taXNlcyIsInRyaWdnZXJBY3Rpb25zIiwibGVuZ3RoIiwibWFwIiwic1RyaWdnZXJBY3Rpb25OYW1lIiwicGF0aEV4cHJlc3Npb25zIiwicHVzaCIsImFsbCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQmFzZUVudGl0eVR5cGUiLCJzTmF2aWdhdGlvblBhdGgiLCJhU2lkZUVmZmVjdHMiLCJhVGFyZ2V0cyIsImZpbHRlciIsInNBbm5vdGF0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsIlNvdXJjZVByb3BlcnRpZXMiLCJzb21lIiwib1Byb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJ2YWx1ZSIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwiaW5kZXhPZiIsIlNvdXJjZUVudGl0aWVzIiwib05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJUcmlnZ2VyQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsIl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwibUVudGl0eVR5cGUiLCJhSW5pdGlhbFByb3BlcnRpZXMiLCJhRW50aXRpZXNSZXF1ZXN0ZWQiLCJuYXZpZ2F0aW9uIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhRGVyaXZlZFByb3BlcnRpZXMiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzVGFyZ2V0Q29sbGVjdGlvblBhdGgiLCJfdHlwZSIsIl9jb252ZXJ0U2lkZUVmZmVjdHMiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9UZW1wU2lkZUVmZmVjdHMiLCJfcmVtb3ZlQmluZGluZ1BhcmFtZXRlciIsIl9jb252ZXJ0VGFyZ2V0c0Zvcm1hdCIsInJlZHVjZSIsImFUYXJnZXRQcm9wZXJ0aWVzIiwidlRhcmdldCIsInNUYXJnZXQiLCJ0eXBlIiwibVRhcmdldEVudGl0eSIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvU291cmNlIiwiYXV0aG9yaXplZFR5cGVzIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImZpbmRJbmRleCIsIm1TZWFyY2hUYXJnZXQiLCJhQWN0aW9ucyIsIm9BY3Rpb24iLCJvRW50aXR5U2lkZUVmZmVjdHMiLCJnZXRJbnRlcmZhY2UiLCJTZXJ2aWNlIiwiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0b3J5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztNQTBFYUEsa0I7Ozs7Ozs7Ozs7QUFLWjtXQUNBQyxJLEdBQUEsZ0JBQU87QUFDTixXQUFLQyxpQkFBTCxHQUF5QjtBQUN4QkMsUUFBQUEsS0FBSyxFQUFFO0FBQ05DLFVBQUFBLFFBQVEsRUFBRSxFQURKO0FBRU5DLFVBQUFBLE9BQU8sRUFBRTtBQUZILFNBRGlCO0FBS3hCQyxRQUFBQSxPQUFPLEVBQUU7QUFMZSxPQUF6QjtBQU9BLFdBQUtDLGFBQUwsR0FBcUIsS0FBckI7QUFDQSxXQUFLQyxXQUFMLEdBQW1CQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsSUFBaEIsQ0FBbkI7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNRQyxxQixHQUFQLCtCQUE2QkMsV0FBN0IsRUFBa0RDLFdBQWxELEVBQXlIO0FBQ3hILFVBQUlBLFdBQVcsQ0FBQ0MsZUFBaEIsRUFBaUM7QUFDaEMsWUFBTUMsa0JBQTBDLG1DQUM1Q0YsV0FENEM7QUFFL0NHLFVBQUFBLGtCQUFrQixFQUFFSixXQUFXLEdBQUcseUJBQWQsR0FBMENDLFdBQVcsQ0FBQ0M7QUFGM0IsVUFBaEQ7O0FBSUEsWUFBTUcseUJBQXlCLEdBQUcsS0FBS2YsaUJBQUwsQ0FBdUJJLE9BQXZCLENBQStCTSxXQUEvQixLQUErQyxFQUFqRjtBQUNBSyxRQUFBQSx5QkFBeUIsQ0FBQ0Ysa0JBQWtCLENBQUNELGVBQXBCLENBQXpCLEdBQWdFQyxrQkFBaEU7QUFDQSxhQUFLYixp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SUFBUDtBQUNBLEs7OztJQTdpQnNDQyxPOzs7O01BZ2pCbENDLHlCOzs7Ozs7Ozs7WUFDTEMsYyxHQUFBLHdCQUFlQyxlQUFmLEVBQW1GO0FBQ2xGLFVBQU1DLHlCQUF5QixHQUFHLElBQUlqTCxrQkFBSixDQUF1QmdMLGVBQXZCLENBQWxDO0FBQ0EsYUFBT0MseUJBQXlCLENBQUN6SyxXQUFqQztBQUNBLEs7OztJQUpzQzBLLGM7O1NBT3pCSix5QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb21wbGV4VHlwZSwgQ29udmVydGVyT3V0cHV0LCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcywgUXVhbGlmaWVkTmFtZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9Db21tb25cIjtcbmltcG9ydCB7IEFjdGlvbiwgTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG50eXBlIFNpZGVFZmZlY3RzU2V0dGluZ3MgPSB7fTtcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdCRQcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG59O1xudHlwZSBTaWRlRWZmZWN0c1RhcmdldCA9IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSB8IHN0cmluZztcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRUYXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlW107XG59O1xuXG50eXBlIEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufSAmIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZTtcblxuZXhwb3J0IHR5cGUgQWN0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W107XG5cdHRyaWdnZXJBY3Rpb25zPzogUXVhbGlmaWVkTmFtZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IFBhcnRpYWw8QmFzZVNpZGVFZmZlY3RzVHlwZT4gJiB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xuXHRTb3VyY2VQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0c291cmNlQ29udHJvbElkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IEJhc2VTaWRlRWZmZWN0c1R5cGUgJiB7XG5cdFNvdXJjZVByb3BlcnRpZXM/OiBQcm9wZXJ0eVBhdGhbXTtcblx0U291cmNlRW50aXRpZXM/OiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdFRyaWdnZXJBY3Rpb24/OiBRdWFsaWZpZWROYW1lO1xufTtcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUeXBlID0gQ29udHJvbFNpZGVFZmZlY3RzVHlwZSB8IE9EYXRhU2lkZUVmZmVjdHNUeXBlO1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNBY3Rpb25EaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblxudHlwZSBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5ID0ge1xuXHRvRGF0YToge1xuXHRcdGVudGl0aWVzOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0XHRhY3Rpb25zOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdH07XG5cdGNvbnRyb2w6IHtcblx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblx0fTtcbn07XG5cbnR5cGUgRXh0cmFjdG9yUHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0eTogUHJvcGVydHk7XG5cdG5hdmlnYXRpb25QYXRoPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIFNpZGVFZmZlY3RzU2VydmljZSBleHRlbmRzIFNlcnZpY2U8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0X29TaWRlRWZmZWN0c1R5cGUhOiBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5O1xuXHRfb0NhcGFiaWxpdGllcyE6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIHwgdW5kZWZpbmVkO1xuXHRfYkluaXRpYWxpemVkITogYm9vbGVhbjtcblx0Ly8gITogbWVhbnMgdGhhdCB3ZSBrbm93IGl0IHdpbGwgYmUgYXNzaWduZWQgYmVmb3JlIHVzYWdlXG5cdGluaXQoKSB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdG9EYXRhOiB7XG5cdFx0XHRcdGVudGl0aWVzOiB7fSxcblx0XHRcdFx0YWN0aW9uczoge31cblx0XHRcdH0sXG5cdFx0XHRjb250cm9sOiB7fVxuXHRcdH07XG5cdFx0dGhpcy5fYkluaXRpYWxpemVkID0gZmFsc2U7XG5cdFx0dGhpcy5pbml0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbFxuXHQgKiBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGlzIGFkZGVkIGJ5IGEgY29udHJvbCB0byBrZWVwIGRhdGEgdXAgdG8gZGF0ZVxuXHQgKiBUaGVzZSBTaWRlRWZmZWN0cyBnZXQgbGltaXRlZCBzY29wZSBjb21wYXJlZCB3aXRoIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGFuIE9EYXRhIHNlcnZpY2U6XG5cdCAqIC0gT25seSBvbmUgU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBjYW4gYmUgZGVmaW5lZCBmb3IgdGhlIGNvbWJpbmF0aW9uIGVudGl0eSB0eXBlIC0gY29udHJvbCBJZFxuXHQgKiAtIE9ubHkgU2lkZUVmZmVjdHMgc291cmNlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHVzZWQgdG8gdHJpZ2dlciBTaWRlRWZmZWN0c1xuXHQgKlxuXHQgKiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ29udHJvbFNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlOiBzdHJpbmcsIG9TaWRlRWZmZWN0OiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0aWYgKG9TaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xTaWRlRWZmZWN0OiBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0XHQuLi5vU2lkZUVmZmVjdCxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzRW50aXR5VHlwZSArIFwiL1NpZGVFZmZlY3RzRm9yQ29udHJvbC9cIiArIG9TaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHMgPSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdIHx8IHt9O1xuXHRcdFx0bUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0c1tvQ29udHJvbFNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXSA9IG9Db250cm9sU2lkZUVmZmVjdDtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gPSBtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBTaWRlRWZmZWN0cyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1RyaWdnZXJBY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGhvdXQgZGF0YSBvciB3aXRoIGEgcmV0dXJuIHZhbHVlIGNvbnRleHQgd2hlbiB0aGUgYWN0aW9uIGNhbGwgc3VjY2VlZGVkXG5cdCAqL1xuXHRwdWJsaWMgZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbjogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9UcmlnZ2VyQWN0aW9uOiBhbnkgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KHNUcmlnZ2VyQWN0aW9uICsgXCIoLi4uKVwiLCBvQ29udGV4dCk7XG5cdFx0cmV0dXJuIG9UcmlnZ2VyQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQgfHwgKG9Db250ZXh0IGFzIGFueSkuZ2V0QmluZGluZygpLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBjb252ZXJ0ZWQgT0RhdGEgbWV0YU1vZGVsLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gQ29udmVydGVkIE9EYXRhIG1ldGFNb2RlbFxuXHQgKi9cblx0cHVibGljIGdldENvbnZlcnRlZE1ldGFNb2RlbCgpOiBDb252ZXJ0ZXJPdXRwdXQge1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0IGFzIGFueTtcblx0XHRjb25zdCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG9Db21wb25lbnQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRyZXR1cm4gY29udmVydFR5cGVzKG9NZXRhTW9kZWwsIHRoaXMuX29DYXBhYmlsaXRpZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGVudGl0eSB0eXBlIG9mIGEgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldEVudGl0eVR5cGVGcm9tQ29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkIH0gRW50aXR5IFR5cGVcblx0ICovXG5cdHB1YmxpYyBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c01ldGFQYXRoID0gKG9NZXRhTW9kZWwgYXMgYW55KS5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0c0VudGl0eVR5cGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGgpW1wiJFR5cGVcIl07XG5cdFx0cmV0dXJuIHNFbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVOYW1lIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5lbnRpdGllc1tzRW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCk6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoaXMuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGlmIChzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW3NFbnRpdHlUeXBlXT8uW3NBY3Rpb25OYW1lXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBvQ2FwYWJpbGl0aWVzIFRoZSBjdXJyZW50IGNhcGFiaWxpdGllc1xuXHQgKi9cblx0cHVibGljIGluaXRpYWxpemVTaWRlRWZmZWN0cyhvQ2FwYWJpbGl0aWVzPzogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMpOiB2b2lkIHtcblx0XHR0aGlzLl9vQ2FwYWJpbGl0aWVzID0gb0NhcGFiaWxpdGllcztcblx0XHRpZiAoIXRoaXMuX2JJbml0aWFsaXplZCkge1xuXHRcdFx0Y29uc3Qgb0NvbnZlcnRlZE1ldGFNb2RlbCA9IHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk7XG5cdFx0XHRvQ29udmVydGVkTWV0YU1vZGVsLmVudGl0eVR5cGVzLmZvckVhY2goZW50aXR5VHlwZSA9PiB7XG5cdFx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gdGhpcy5fcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmFjdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gdGhpcy5fcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTsgLy8gb25seSBib3VuZCBhY3Rpb25zIGFyZSBhbmFseXplZCBzaW5jZSB1bmJvdW5kIG9uZXMgZG9uJ3QgZ2V0IFNpZGVFZmZlY3RzXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX2JJbml0aWFsaXplZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNDb250cm9sSWQgQ29udHJvbCBJZFxuXHQgKi9cblx0cHVibGljIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhzQ29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2wpLmZvckVhY2goc0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV1bc0NvbnRyb2xJZF0pIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV1bc0NvbnRyb2xJZF07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtBcnJheX0gYVBhdGhFeHByZXNzaW9ucyBUYXJnZXRzIG9mIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKGFQYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIG9Db250ZXh0OiBDb250ZXh0LCBzR3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG5cdFx0dGhpcy5fbG9nUmVxdWVzdChhUGF0aEV4cHJlc3Npb25zLCBvQ29udGV4dCk7XG5cdFx0bGV0IG9Qcm9taXNlOiBQcm9taXNlPGFueT47XG5cdFx0LyoqXG5cdFx0ICogQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMgZWl0aGVyIHJldHVybnMgYSBwcm9taXNlIG9yIHRocm93cyBhIG5ldyBlcnJvci4gVGhpcyByZXR1cm4gaXMgY2F1Z2h0IGlmIGFuIGVycm9yIGlzIHRocm93blxuXHRcdCAqIHRvIGF2b2lkIGJyZWFraW5nIHRoZSBwcm9taXNlIGNoYWluLlxuXHRcdCAqL1xuXHRcdHRyeSB7XG5cdFx0XHRvUHJvbWlzZSA9IChvQ29udGV4dCBhcyBhbnkpLnJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zLCBzR3JvdXBJZCkgYXMgUHJvbWlzZTxhbnk+O1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZWplY3QoZSk7XG5cdFx0fVxuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXG5cdHB1YmxpYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbihzaWRlRWZmZWN0czogQWN0aW9uU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGFQcm9taXNlczogUHJvbWlzZTxhbnk+W107XG5cblx0XHRpZiAoc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0YVByb21pc2VzID0gc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbnMubWFwKChzVHJpZ2dlckFjdGlvbk5hbWU6IFN0cmluZykgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uTmFtZSBhcyBzdHJpbmcsIG9Db250ZXh0KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhUHJvbWlzZXMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoc2lkZUVmZmVjdHMucGF0aEV4cHJlc3Npb25zPy5sZW5ndGgpIHtcblx0XHRcdGFQcm9taXNlcy5wdXNoKHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYVByb21pc2VzLmxlbmd0aCA/IFByb21pc2UuYWxsKGFQcm9taXNlcykgOiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIGZvciBhIG5hdmlnYXRpb24gcHJvcGVydHkgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTmF2aWdhdGlvblByb3BlcnR5IE5hdmlnYXRpb24gcHJvcGVydHlcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KHNOYXZpZ2F0aW9uUHJvcGVydHk6IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHNCYXNlRW50aXR5VHlwZSA9IHRoaXMuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRpZiAoc0Jhc2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5ICsgXCIvXCI7XG5cdFx0XHRjb25zdCBhU2lkZUVmZmVjdHMgPSB0aGlzLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc0Jhc2VFbnRpdHlUeXBlKTtcblx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMoYVNpZGVFZmZlY3RzKVxuXHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdC8vIEtlZXAgcmVsZXZhbnQgU2lkZUVmZmVjdHNcblx0XHRcdFx0XHRzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IGFTaWRlRWZmZWN0c1tzQW5ub3RhdGlvbk5hbWVdO1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzIHx8IFtdKS5zb21lKG9Qcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBvUHJvcGVydHlQYXRoLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRzUHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoc05hdmlnYXRpb25QYXRoKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5yZXBsYWNlKHNOYXZpZ2F0aW9uUGF0aCwgXCJcIikuaW5kZXhPZihcIi9cIikgPT09IC0xXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSkgfHxcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PiBvTmF2aWdhdGlvblByb3BlcnR5UGF0aC52YWx1ZSA9PT0gc05hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihvU2lkZUVmZmVjdHMuVHJpZ2dlckFjdGlvbiBhcyBzdHJpbmcsIG9Db250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKVxuXHRcdFx0XHRcdFx0LmNvbmNhdCgob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKVxuXHRcdFx0XHRcdFx0LmZvckVhY2gobVRhcmdldCA9PiBhVGFyZ2V0cy5wdXNoKG1UYXJnZXQpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlIHByb3BlcnRpZXNcblx0XHRcdGFUYXJnZXRzID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRpZiAoYVRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldHMsIG9Db250ZXh0KS5jYXRjaChvRXJyb3IgPT5cblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgU2lkZUVmZmVjdHMgZm9yIE5hdmlnYXRpb24gUHJvcGVydHkgXCIgKyBzTmF2aWdhdGlvblByb3BlcnR5LCBvRXJyb3IpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBjb250cm9scy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgTmFtZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRoZSB0ZXh0IHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIFNpZGVFZmZlY3RzXG5cdCAqIElmIGEgcHJvcGVydHkgaGFzIGFuIGFzc29jaWF0ZWQgdGV4dCB0aGVuIHRoaXMgdGV4dCBuZWVkcyB0byBiZSBhZGRlZCBhcyB0YXJnZXRQcm9wZXJ0aWVzIG9yIHRhcmdldEVudGl0aWVzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb24gd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX2FkZFJlcXVpcmVkVGV4dFByb3BlcnRpZXMob1NpZGVFZmZlY3Q6IEJhc2VTaWRlRWZmZWN0c1R5cGUsIG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgYUluaXRpYWxQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgfHwgW10sXG5cdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQ6IHN0cmluZ1tdID0gKG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzIHx8IFtdKS5tYXAobmF2aWdhdGlvbiA9PiBuYXZpZ2F0aW9uLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRsZXQgYURlcml2ZWRQcm9wZXJ0aWVzOiBFeHRyYWN0b3JQcm9wZXJ0eUluZm9bXSA9IFtdO1xuXG5cdFx0YUluaXRpYWxQcm9wZXJ0aWVzLmZvckVhY2goc1Byb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRjb25zdCBiSXNTdGFyUHJvcGVydHkgPSBzUHJvcGVydHlQYXRoLmVuZHNXaXRoKFwiKlwiKSwgLy8gQ2FuIGJlICcqJyBvciAnLi4uL25hdlByb3AvKidcblx0XHRcdFx0c05hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyA9IHNQcm9wZXJ0eVBhdGguc3Vic3RyaW5nKDAsIHNQcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSxcblx0XHRcdFx0c1JlbGF0aXZlUGF0aCA9IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggKyBcIi9cIiA6IFwiXCIsXG5cdFx0XHRcdG1UYXJnZXQ6IGFueSA9IG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSB8fCBtRW50aXR5VHlwZTtcblxuXHRcdFx0aWYgKG1UYXJnZXQpIHtcblx0XHRcdFx0Ly8gbVRhcmdldCBjYW4gYmUgYW4gZW50aXR5IHR5cGUsIG5hdmlnYXRpb25Qcm9wZXJ0eSBvciBvciBhIGNvbXBsZXhUeXBlXG5cdFx0XHRcdGNvbnN0IGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzOiBQcm9wZXJ0eVtdID1cblx0XHRcdFx0XHQobVRhcmdldCBhcyBFbnRpdHlUeXBlKS5lbnRpdHlQcm9wZXJ0aWVzIHx8XG5cdFx0XHRcdFx0KChtVGFyZ2V0IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlIGFzIENvbXBsZXhUeXBlKT8ucHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdChtVGFyZ2V0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHRcdFx0XHRpZiAoYVRhcmdldEVudGl0eVByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRpZiAoYklzU3RhclByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHQvLyBBZGQgYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMgYmVoaW5kIHRoZSAqXG5cdFx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQucHVzaChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMgPSBhRGVyaXZlZFByb3BlcnRpZXMuY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5tYXAobVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogbVByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFEZXJpdmVkUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzLmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0bVByb3BlcnR5ID0+IG1Qcm9wZXJ0eS5uYW1lID09PSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKVxuXHRcdFx0XHRcdFx0XHQpIGFzIFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aDogc1JlbGF0aXZlUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgZW50aXR5IHR5cGUgYXNzb2NpYXRlZCB0byBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJTaWRlRWZmZWN0cyAtIFRoZSBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFEZXJpdmVkUHJvcGVydGllcy5mb3JFYWNoKG1Qcm9wZXJ0eUluZm8gPT4ge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldFRleHRQYXRoID0gKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCBhcyBhbnkpPy5wYXRoLFxuXHRcdFx0XHRcdHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5ID0gbVByb3BlcnR5SW5mby5uYXZpZ2F0aW9uUGF0aCArIHNUYXJnZXRUZXh0UGF0aCxcblx0XHRcdFx0XHRzVGFyZ2V0Q29sbGVjdGlvblBhdGggPSBzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eS5zdWJzdHJpbmcoMCwgc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBwcm9wZXJ0eSBUZXh0IG11c3QgYmUgYWRkZWQgb25seSBpZiB0aGUgcHJvcGVydHkgaXNcblx0XHRcdFx0ICogLSBub3QgcGFydCBvZiBhIHN0YXIgcHJvcGVydHkgKC5pLmUgJyonIG9yICduYXZpZ2F0aW9uLyonKSBvciBhIHRhcmdldGVkIEVudGl0eVxuXHRcdFx0XHQgKiAtIG5vdCBpbmNsdWRlIGludG8gdGhlIGluaXRpYWwgdGFyZ2V0ZWQgcHJvcGVydGllcyBvZiBTaWRlRWZmZWN0c1xuXHRcdFx0XHQgKiAgSW5kZWVkIGluIHRoZSB0d28gbGlzdGVkIGNhc2VzLCB0aGUgcHJvcGVydHkgY29udGFpbmluZyB0ZXh0IHdpbGwgYmUvaXMgcmVxdWVzdGVkIGJ5IGluaXRpYWwgU2lkZUVmZmVjdHMgY29uZmlndXJhdGlvbi5cblx0XHRcdFx0ICovXG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNUYXJnZXRUZXh0UGF0aCAmJlxuXHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5pbmRleE9mKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCkgPT09IC0xICYmXG5cdFx0XHRcdFx0YUluaXRpYWxQcm9wZXJ0aWVzLmluZGV4T2Yoc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpID09PSAtMVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBUaGUgVGV4dCBhc3NvY2lhdGlvbiBpcyBhZGRlZCBhcyBUYXJnZXRFbnRpdGllcyBpZiBpdCdzIGNvbnRhaW5lZCBvbiBhIGRpZmZlcmVudCBlbnRpdHlTZXQgYW5kIG5vdCBhIGNvbXBsZXhUeXBlXG5cdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGl0J3MgYWRkZWQgYXMgdGFyZ2V0UHJvcGVydGllc1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHNUYXJnZXRUZXh0UGF0aC5sYXN0SW5kZXhPZihcIi9cIikgPiAtMSAmJlxuXHRcdFx0XHRcdFx0bUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1RhcmdldENvbGxlY3Rpb25QYXRoKT8uX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCJcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzLnB1c2goeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc1RhcmdldENvbGxlY3Rpb25QYXRoIH0pO1xuXHRcdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLnB1c2goc1RhcmdldENvbGxlY3Rpb25QYXRoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBvU2lkZUVmZmVjdDtcblx0fVxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRhcmdldHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFJlbW92ZXMgYmluZGluZyBwYXJhbWV0ZXIgZnJvbSBTaWRlRWZmZWN0cyB0YXJnZXRzIHByb3BlcnRpZXNcblx0ICogIC0gQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqICAtIFJlcGxhY2VzIFRhcmdldFByb3BlcnRpZXMgaGF2aW5nIHJlZmVyZW5jZSB0byBTb3VyY2UgUHJvcGVydGllcyBmb3IgYSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyIE5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRTaWRlRWZmZWN0cyhcblx0XHRvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUgfCBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSxcblx0XHRtRW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRzQmluZGluZ1BhcmFtZXRlcj86IHN0cmluZ1xuXHQpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3Qgb1RlbXBTaWRlRWZmZWN0cyA9IHRoaXMuX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIodGhpcy5fY29udmVydFRhcmdldHNGb3JtYXQob1NpZGVFZmZlY3RzKSwgc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdHJldHVybiB0aGlzLl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzKG9UZW1wU2lkZUVmZmVjdHMsIG1FbnRpdHlUeXBlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIChUYXJnZXRFbnRpdGllcyBhbmQgVGFyZ2V0UHJvcGVydGllcykgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFRhcmdldFByb3BlcnRpZXMgYXMgYXJyYXkgb2Ygc3RyaW5nXG5cdCAqICAtIFRhcmdldEVudGl0aWVzIGFzIGFycmF5IG9mIG9iamVjdCB3aXRoIHByb3BlcnR5ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfY29udmVydFRhcmdldHNGb3JtYXQob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9ICgob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKS5yZWR1Y2UoZnVuY3Rpb24oYVRhcmdldFByb3BlcnRpZXMsIHZUYXJnZXQpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9ICh0eXBlb2YgdlRhcmdldCA9PT0gXCJzdHJpbmdcIiAmJiB2VGFyZ2V0KSB8fCAodlRhcmdldC50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiICYmIHZUYXJnZXQudmFsdWUpO1xuXHRcdFx0XHRpZiAoc1RhcmdldCkge1xuXHRcdFx0XHRcdGFUYXJnZXRQcm9wZXJ0aWVzLnB1c2goc1RhcmdldCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFRhcmdldFByb3BlcnRpZXMgZm9yIFNpZGVFZmZlY3RzXCIgKyBvU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYVRhcmdldFByb3BlcnRpZXM7XG5cdFx0XHR9LCBbXSksXG5cdFx0XHRUYXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pLm1hcChtVGFyZ2V0RW50aXR5ID0+IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqICBTaWRlRWZmZWN0cyB0aGF0IGNvbWVzIGZyb20gU0FQIEZFIGdldCBUYXJnZXRFbnRpdGllcyB3aXRoICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHdoZXJlYXNcblx0XHRcdFx0ICogIG9uZXMgY29taW5nIGZyb20gdGhlIGNvbnZlcnRlZCBPRGF0YSBtb2RlbCBnZXRzIGEgTmF2aWdhdGlvblByb3BlcnR5UGF0aCBmb3JtYXRcblx0XHRcdFx0ICpcblx0XHRcdFx0ICovXG5cdFx0XHRcdHJldHVybiB7IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjogbVRhcmdldEVudGl0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCBtVGFyZ2V0RW50aXR5LnZhbHVlIHx8IFwiXCIgfTtcblx0XHRcdH0pO1xuXHRcdHJldHVybiB7IC4uLm9TaWRlRWZmZWN0cywgLi4ueyBUYXJnZXRQcm9wZXJ0aWVzLCBUYXJnZXRFbnRpdGllcyB9IH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGFuIGVudGl0eSB0eXBlIG9yIGFjdGlvbiB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aCBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NvdXJjZSBFbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogQHJldHVybnMge29iamVjdH0gQXJyYXkgb2YgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvU291cmNlOiBhbnkpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRjb25zdCBhU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRjb25zdCBhdXRob3JpemVkVHlwZXMgPSBbXCJFbnRpdHlUeXBlXCIsIFwiQWN0aW9uXCJdO1xuXHRcdGlmIChvU291cmNlLl90eXBlICYmIGF1dGhvcml6ZWRUeXBlcy5pbmRleE9mKG9Tb3VyY2UuX3R5cGUpID4gLTEpIHtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkID0gb1NvdXJjZS5fdHlwZSA9PT0gXCJFbnRpdHlUeXBlXCIgPyBvU291cmNlIDogb1NvdXJjZS5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0aWYgKG1FbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IG1Db21tb25Bbm5vdGF0aW9uOiBhbnkgPSBvU291cmNlLmFubm90YXRpb25zPy5Db21tb24gfHwge307XG5cdFx0XHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyID0gKChvU291cmNlIGFzIEFjdGlvbikucGFyYW1ldGVycyB8fCBbXSkuZmluZChcblx0XHRcdFx0XHRtUGFyYW1ldGVyID0+IG1QYXJhbWV0ZXIudHlwZSA9PT0gbUVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGFyYW1ldGVyID0gbUJpbmRpbmdQYXJhbWV0ZXIgPyBtQmluZGluZ1BhcmFtZXRlci5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCIvXCIpWzFdIDogXCJcIjtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbW1vbkFubm90YXRpb24pXG5cdFx0XHRcdFx0LmZpbHRlcihzQW5ub3RhdGlvbk5hbWUgPT4gbUNvbW1vbkFubm90YXRpb25bc0Fubm90YXRpb25OYW1lXS4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlNpZGVFZmZlY3RzVHlwZSlcblx0XHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0YVNpZGVFZmZlY3RzLnB1c2godGhpcy5fY29udmVydFNpZGVFZmZlY3RzKG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0sIG1FbnRpdHlUeXBlLCBzQmluZGluZ1BhcmFtZXRlcikpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYVNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgU2lkZUVmZmVjdHMgcmVxdWVzdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgU2lkZUVmZmVjdHMgdGFyZ2V0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBfbG9nUmVxdWVzdChhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IHNUYXJnZXRQYXRocyA9IGFQYXRoRXhwcmVzc2lvbnMucmVkdWNlKGZ1bmN0aW9uKHNQYXRocywgbVRhcmdldCkge1xuXHRcdFx0cmV0dXJuIHNQYXRocyArIFwiXFxuXFx0XFx0XCIgKyAoKG1UYXJnZXQgYXMgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlKS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCBtVGFyZ2V0IHx8IFwiXCIpO1xuXHRcdH0sIFwiXCIpO1xuXHRcdExvZy5kZWJ1ZyhcIlNpZGVFZmZlY3RzIC0gUmVxdWVzdDpcXG5cXHRDb250ZXh0IHBhdGggOiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSArIFwiXFxuXFx0UHJvcGVydHkgcGF0aHMgOlwiICsgc1RhcmdldFBhdGhzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIG5hbWUgb2YgYmluZGluZyBwYXJhbWV0ZXIgb24gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0JpbmRpbmdQYXJhbWV0ZXJOYW1lIE5hbWUgb2YgYmluZGluZyBwYXJhbWV0ZXJcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlQmluZGluZ1BhcmFtZXRlcihvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUsIHNCaW5kaW5nUGFyYW1ldGVyTmFtZT86IHN0cmluZyk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGlmIChzQmluZGluZ1BhcmFtZXRlck5hbWUpIHtcblx0XHRcdGNvbnN0IGFUYXJnZXRzID0gW1wiVGFyZ2V0UHJvcGVydGllc1wiLCBcIlRhcmdldEVudGl0aWVzXCJdO1xuXHRcdFx0YVRhcmdldHMuZm9yRWFjaChzVGFyZ2V0ID0+IHtcblx0XHRcdFx0bGV0IG1UYXJnZXQgPSAob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF07XG5cdFx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdFx0bVRhcmdldCA9IG1UYXJnZXQubWFwKChtUHJvcGVydHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPSBtUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggIT09IHVuZGVmaW5lZDsgLy8gTmVlZCB0byB0ZXN0IHdpdGggdW5kZWZpbmVkIHNpbmNlICBtUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggY291bGQgYmUgXCJcIiAoZW1wdHkgc3RyaW5nKVxuXHRcdFx0XHRcdFx0Y29uc3Qgc1ZhbHVlID0gKGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIDogbVByb3BlcnR5KS5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRuZXcgUmVnRXhwKFwiXlwiICsgc0JpbmRpbmdQYXJhbWV0ZXJOYW1lICsgXCIvP1wiKSxcblx0XHRcdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybiBiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNWYWx1ZSB9IDogc1ZhbHVlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChvU2lkZUVmZmVjdHMgYXMgYW55KVtzVGFyZ2V0XSA9IG1UYXJnZXQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgZHVwbGljYXRlcyBpbiBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtBcnJheX0gYVRhcmdldHMgU2lkZUVmZmVjdHMgdGFyZ2V0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFNpZGVFZmZlY3RzIHRhcmdldHMgd2l0aG91dCBkdXBsaWNhdGVzXG5cdCAqL1xuXHRwcml2YXRlIF9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdKTogU2lkZUVmZmVjdHNUYXJnZXRbXSB7XG5cdFx0cmV0dXJuIGFUYXJnZXRzLmZpbHRlcihcblx0XHRcdChtVGFyZ2V0OiBhbnksIGlJbmRleCwgYVRhcmdldHMpID0+XG5cdFx0XHRcdGFUYXJnZXRzLmZpbmRJbmRleCgobVNlYXJjaFRhcmdldDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdG1TZWFyY2hUYXJnZXQgPT09IG1UYXJnZXQgfHwgLy8gUHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHQobVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAmJiBtU2VhcmNoVGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBtVGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSAvLyBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSkgPT09IGlJbmRleFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBhY3Rpb24gdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIG9uIGFjdGlvbnNcblx0ICogcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGhcblx0ICogZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMobUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4gPSB7fTtcblx0XHRjb25zdCBhQWN0aW9ucyA9IG1FbnRpdHlUeXBlLmFjdGlvbnM7XG5cdFx0aWYgKGFBY3Rpb25zKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhhQWN0aW9ucykuZm9yRWFjaChzQWN0aW9uTmFtZSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9BY3Rpb24gPSBtRW50aXR5VHlwZS5hY3Rpb25zW3NBY3Rpb25OYW1lXTtcblx0XHRcdFx0Y29uc3QgdHJpZ2dlckFjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRcdGxldCBwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdFx0bGV0IGFUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cblx0XHRcdFx0dGhpcy5fZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG9BY3Rpb24pLmZvckVhY2gob1NpZGVFZmZlY3QgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNUcmlnZ2VyQWN0aW9uID0gb1NpZGVFZmZlY3QuVHJpZ2dlckFjdGlvbjtcblx0XHRcdFx0XHRhVGFyZ2V0cyA9IGFUYXJnZXRzLmNvbmNhdChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkuY29uY2F0KChvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSk7XG5cdFx0XHRcdFx0aWYgKHNUcmlnZ2VyQWN0aW9uICYmIHRyaWdnZXJBY3Rpb25zLmluZGV4T2Yoc1RyaWdnZXJBY3Rpb24gYXMgc3RyaW5nKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zLnB1c2goc1RyaWdnZXJBY3Rpb24gYXMgc3RyaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRwYXRoRXhwcmVzc2lvbnMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdFx0b1NpZGVFZmZlY3RzW3NBY3Rpb25OYW1lXSA9IHsgcGF0aEV4cHJlc3Npb25zLCB0cmlnZ2VyQWN0aW9ucyB9O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBlbnRpdHkgdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMobUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IG9FbnRpdHlTaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0dGhpcy5fZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG1FbnRpdHlUeXBlKS5mb3JFYWNoKG9TaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRvRW50aXR5U2lkZUVmZmVjdHNbb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBvU2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9FbnRpdHlTaWRlRWZmZWN0cztcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UgPSBuZXcgU2lkZUVmZmVjdHNTZXJ2aWNlKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UuaW5pdFByb21pc2U7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
|
|
663
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiaW5pdCIsIl9vU2lkZUVmZmVjdHNUeXBlIiwib0RhdGEiLCJlbnRpdGllcyIsImFjdGlvbnMiLCJjb250cm9sIiwiX2JJbml0aWFsaXplZCIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJzRW50aXR5VHlwZSIsIm9TaWRlRWZmZWN0Iiwic291cmNlQ29udHJvbElkIiwib0NvbnRyb2xTaWRlRWZmZWN0IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyIsImV4ZWN1dGVBY3Rpb24iLCJzVHJpZ2dlckFjdGlvbiIsIm9Db250ZXh0Iiwic0dyb3VwSWQiLCJvVHJpZ2dlckFjdGlvbiIsImdldE1vZGVsIiwiYmluZENvbnRleHQiLCJleGVjdXRlIiwiZ2V0QmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImNvbnZlcnRUeXBlcyIsIl9vQ2FwYWJpbGl0aWVzIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsInNFbnRpdHlUeXBlTmFtZSIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJzQWN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemVTaWRlRWZmZWN0cyIsIm9DYXBhYmlsaXRpZXMiLCJvQ29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwiZW50aXR5VHlwZSIsIl9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJfcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyIsInJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyIsInNDb250cm9sSWQiLCJPYmplY3QiLCJrZXlzIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiYVBhdGhFeHByZXNzaW9ucyIsIl9sb2dSZXF1ZXN0Iiwib1Byb21pc2UiLCJlIiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJzaWRlRWZmZWN0cyIsImFQcm9taXNlcyIsInRyaWdnZXJBY3Rpb25zIiwibGVuZ3RoIiwibWFwIiwic1RyaWdnZXJBY3Rpb25OYW1lIiwicGF0aEV4cHJlc3Npb25zIiwicHVzaCIsImFsbCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQmFzZUVudGl0eVR5cGUiLCJzTmF2aWdhdGlvblBhdGgiLCJhU2lkZUVmZmVjdHMiLCJhVGFyZ2V0cyIsImZpbHRlciIsInNBbm5vdGF0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsIlNvdXJjZVByb3BlcnRpZXMiLCJzb21lIiwib1Byb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJ2YWx1ZSIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwiaW5kZXhPZiIsIlNvdXJjZUVudGl0aWVzIiwib05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJUcmlnZ2VyQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsIl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwibUVudGl0eVR5cGUiLCJhSW5pdGlhbFByb3BlcnRpZXMiLCJhRW50aXRpZXNSZXF1ZXN0ZWQiLCJuYXZpZ2F0aW9uIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhRGVyaXZlZFByb3BlcnRpZXMiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzVGFyZ2V0Q29sbGVjdGlvblBhdGgiLCJfdHlwZSIsIl9jb252ZXJ0U2lkZUVmZmVjdHMiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9UZW1wU2lkZUVmZmVjdHMiLCJfcmVtb3ZlQmluZGluZ1BhcmFtZXRlciIsIl9jb252ZXJ0VGFyZ2V0c0Zvcm1hdCIsInJlZHVjZSIsImFUYXJnZXRQcm9wZXJ0aWVzIiwidlRhcmdldCIsInNUYXJnZXQiLCJ0eXBlIiwibVRhcmdldEVudGl0eSIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvU291cmNlIiwiYXV0aG9yaXplZFR5cGVzIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImFJblRhcmdldHMiLCJmaW5kSW5kZXgiLCJtU2VhcmNoVGFyZ2V0IiwiYUFjdGlvbnMiLCJvQWN0aW9uIiwib0VudGl0eVNpZGVFZmZlY3RzIiwiZ2V0SW50ZXJmYWNlIiwiU2VydmljZSIsIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsIm9TZXJ2aWNlQ29udGV4dCIsIlNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFvRmFBLGtCOzs7Ozs7Ozs7O0FBS1o7V0FDQUMsSSxHQUFBLGdCQUFPO0FBQ04sV0FBS0MsaUJBQUwsR0FBeUI7QUFDeEJDLFFBQUFBLEtBQUssRUFBRTtBQUNOQyxVQUFBQSxRQUFRLEVBQUUsRUFESjtBQUVOQyxVQUFBQSxPQUFPLEVBQUU7QUFGSCxTQURpQjtBQUt4QkMsUUFBQUEsT0FBTyxFQUFFO0FBTGUsT0FBekI7QUFPQSxXQUFLQyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0EsV0FBS0MsV0FBTCxHQUFtQkMsT0FBTyxDQUFDQyxPQUFSLENBQWdCLElBQWhCLENBQW5CO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDUUMscUIsR0FBUCwrQkFBNkJDLFdBQTdCLEVBQWtEQyxXQUFsRCxFQUF5SDtBQUN4SCxVQUFJQSxXQUFXLENBQUNDLGVBQWhCLEVBQWlDO0FBQ2hDLFlBQU1DLGtCQUEwQyxtQ0FDNUNGLFdBRDRDO0FBRS9DRyxVQUFBQSxrQkFBa0IsWUFBS0osV0FBTCxvQ0FBMENDLFdBQVcsQ0FBQ0MsZUFBdEQ7QUFGNkIsVUFBaEQ7O0FBSUEsWUFBTUcseUJBQXlCLEdBQUcsS0FBS2YsaUJBQUwsQ0FBdUJJLE9BQXZCLENBQStCTSxXQUEvQixLQUErQyxFQUFqRjtBQUNBSyxRQUFBQSx5QkFBeUIsQ0FBQ0Ysa0JBQWtCLENBQUNELGVBQXBCLENBQXpCLEdBQWdFQyxrQkFBaEU7QUFD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QUFHLElBQUlsTCxrQkFBSixDQUF1QmlMLGVBQXZCLENBQWxDO0FBQ0EsYUFBT0MseUJBQXlCLENBQUMxSyxXQUFqQztBQUNBLEs7OztJQUpzQzJLLGM7O1NBT3pCSix5QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuXHRBY3Rpb24sXG5cdENvbXBsZXhUeXBlLFxuXHRDb252ZXJ0ZWRNZXRhZGF0YSxcblx0RW50aXR5VHlwZSxcblx0TmF2aWdhdGlvblByb3BlcnR5LFxuXHROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuXHRQcm9wZXJ0eSxcblx0UHJvcGVydHlQYXRoXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBRdWFsaWZpZWROYW1lIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxudHlwZSBTaWRlRWZmZWN0c1NldHRpbmdzID0ge307XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlID0ge1xuXHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHQkUHJvcGVydHlQYXRoPzogc3RyaW5nO1xufTtcbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgfCBzdHJpbmc7XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdO1xufTtcblxudHlwZSBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0VGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdFRhcmdldEVudGl0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBCYXNlU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn0gJiBTaWRlRWZmZWN0c1RhcmdldFR5cGU7XG5cbmV4cG9ydCB0eXBlIEFjdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0cGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdO1xuXHR0cmlnZ2VyQWN0aW9ucz86IFF1YWxpZmllZE5hbWVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSBQYXJ0aWFsPEJhc2VTaWRlRWZmZWN0c1R5cGU+ICYge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcblx0U291cmNlUHJvcGVydGllczogc3RyaW5nW107XG5cdHNvdXJjZUNvbnRyb2xJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBCYXNlU2lkZUVmZmVjdHNUeXBlICYge1xuXHRTb3VyY2VQcm9wZXJ0aWVzPzogUHJvcGVydHlQYXRoW107XG5cdFNvdXJjZUVudGl0aWVzPzogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdO1xuXHRUcmlnZ2VyQWN0aW9uPzogUXVhbGlmaWVkTmFtZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzQWN0aW9uRGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cbnR5cGUgU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeSA9IHtcblx0b0RhdGE6IHtcblx0XHRlbnRpdGllczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdFx0YWN0aW9uczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHR9O1xuXHRjb250cm9sOiB7XG5cdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cdH07XG59O1xuXG50eXBlIEV4dHJhY3RvclByb3BlcnR5SW5mbyA9IHtcblx0cHJvcGVydHk6IFByb3BlcnR5O1xuXHRuYXZpZ2F0aW9uUGF0aD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFNpZGVFZmZlY3RzU2V0dGluZ3M+IHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdF9vU2lkZUVmZmVjdHNUeXBlITogU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeTtcblx0X29DYXBhYmlsaXRpZXMhOiBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB8IHVuZGVmaW5lZDtcblx0X2JJbml0aWFsaXplZCE6IGJvb2xlYW47XG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRpbml0KCkge1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRvRGF0YToge1xuXHRcdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRcdGFjdGlvbnM6IHt9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbDoge31cblx0XHR9O1xuXHRcdHRoaXMuX2JJbml0aWFsaXplZCA9IGZhbHNlO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2xcblx0ICogU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBpcyBhZGRlZCBieSBhIGNvbnRyb2wgdG8ga2VlcCBkYXRhIHVwIHRvIGRhdGVcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgZ2V0IGxpbWl0ZWQgc2NvcGUgY29tcGFyZWQgd2l0aCBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlOlxuXHQgKiAtIE9ubHkgb25lIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gY2FuIGJlIGRlZmluZWQgZm9yIHRoZSBjb21iaW5hdGlvbiBlbnRpdHkgdHlwZSAtIGNvbnRyb2wgSWRcblx0ICogLSBPbmx5IFNpZGVFZmZlY3RzIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSByZWNvZ25pemVkIGFuZCB1c2VkIHRvIHRyaWdnZXIgU2lkZUVmZmVjdHNcblx0ICpcblx0ICogRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdDogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdGlmIChvU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWQpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdDogQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0Li4ub1NpZGVFZmZlY3QsXG5cdFx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7c0VudGl0eVR5cGV9L1NpZGVFZmZlY3RzRm9yQ29udHJvbC8ke29TaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZH1gXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW29Db250cm9sU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRdID0gb0NvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSA9IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBzVHJpZ2dlckFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRob3V0IGRhdGEgb3Igd2l0aCBhIHJldHVybiB2YWx1ZSBjb250ZXh0IHdoZW4gdGhlIGFjdGlvbiBjYWxsIHN1Y2NlZWRlZFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvVHJpZ2dlckFjdGlvbjogYW55ID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHtzVHJpZ2dlckFjdGlvbn0oLi4uKWAsIG9Db250ZXh0KTtcblx0XHRyZXR1cm4gb1RyaWdnZXJBY3Rpb24uZXhlY3V0ZShzR3JvdXBJZCB8fCAob0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0VXBkYXRlR3JvdXBJZCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGNvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWwuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcmV0dXJucyBDb252ZXJ0ZWQgT0RhdGEgbWV0YU1vZGVsXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk6IENvbnZlcnRlZE1ldGFkYXRhIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMgRW50aXR5IFR5cGVcblx0ICovXG5cdHB1YmxpYyBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c01ldGFQYXRoID0gKG9NZXRhTW9kZWwgYXMgYW55KS5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0c0VudGl0eVR5cGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGgpW1wiJFR5cGVcIl07XG5cdFx0cmV0dXJuIHNFbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGVOYW1lIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5lbnRpdGllc1tzRW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCk6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoaXMuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGlmIChzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW3NFbnRpdHlUeXBlXT8uW3NBY3Rpb25OYW1lXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBvQ2FwYWJpbGl0aWVzIFRoZSBjdXJyZW50IGNhcGFiaWxpdGllc1xuXHQgKi9cblx0cHVibGljIGluaXRpYWxpemVTaWRlRWZmZWN0cyhvQ2FwYWJpbGl0aWVzPzogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMpOiB2b2lkIHtcblx0XHR0aGlzLl9vQ2FwYWJpbGl0aWVzID0gb0NhcGFiaWxpdGllcztcblx0XHRpZiAoIXRoaXMuX2JJbml0aWFsaXplZCkge1xuXHRcdFx0Y29uc3Qgb0NvbnZlcnRlZE1ldGFNb2RlbCA9IHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk7XG5cdFx0XHRvQ29udmVydGVkTWV0YU1vZGVsLmVudGl0eVR5cGVzLmZvckVhY2goKGVudGl0eVR5cGUpID0+IHtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5lbnRpdGllc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0aGlzLl9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7XG5cdFx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0aGlzLl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKGVudGl0eVR5cGUpOyAvLyBvbmx5IGJvdW5kIGFjdGlvbnMgYXJlIGFuYWx5emVkIHNpbmNlIHVuYm91bmQgb25lcyBkb24ndCBnZXQgU2lkZUVmZmVjdHNcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5fYkluaXRpYWxpemVkID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbGwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gc0NvbnRyb2xJZCBDb250cm9sIElkXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdE9iamVjdC5rZXlzKHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbCkuZm9yRWFjaCgoc0VudGl0eVR5cGUpID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBhUGF0aEV4cHJlc3Npb25zIFRhcmdldHMgb2YgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gc0dyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24oc2lkZUVmZmVjdHM6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGxldCBhUHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGFQcm9taXNlcyA9IHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zLm1hcCgoc1RyaWdnZXJBY3Rpb25OYW1lOiBTdHJpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbk5hbWUgYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YVByb21pc2VzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRhUHJvbWlzZXMucHVzaCh0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMsIG9Db250ZXh0KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFQcm9taXNlcy5sZW5ndGggPyBQcm9taXNlLmFsbChhUHJvbWlzZXMpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gYCR7c05hdmlnYXRpb25Qcm9wZXJ0eX0vYDtcblx0XHRcdGNvbnN0IGFTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzQmFzZUVudGl0eVR5cGUpO1xuXHRcdFx0bGV0IGFUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRPYmplY3Qua2V5cyhhU2lkZUVmZmVjdHMpXG5cdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWxldmFudCBTaWRlRWZmZWN0c1xuXHRcdFx0XHRcdChzQW5ub3RhdGlvbk5hbWUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZSgob1Byb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBvUHJvcGVydHlQYXRoLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRzUHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoc05hdmlnYXRpb25QYXRoKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5yZXBsYWNlKHNOYXZpZ2F0aW9uUGF0aCwgXCJcIikuaW5kZXhPZihcIi9cIikgPT09IC0xXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSkgfHxcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHQob05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpID0+IG9OYXZpZ2F0aW9uUHJvcGVydHlQYXRoLnZhbHVlID09PSBzTmF2aWdhdGlvblByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHRcdC5mb3JFYWNoKChzQW5ub3RhdGlvbk5hbWUpID0+IHtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24ob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKChtVGFyZ2V0KSA9PiBhVGFyZ2V0cy5wdXNoKG1UYXJnZXQpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlIHByb3BlcnRpZXNcblx0XHRcdGFUYXJnZXRzID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRpZiAoYVRhcmdldHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldHMsIG9Db250ZXh0KS5jYXRjaCgob0Vycm9yKSA9PlxuXHRcdFx0XHRcdExvZy5lcnJvcihgU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBOYXZpZ2F0aW9uIFByb3BlcnR5ICR7c05hdmlnYXRpb25Qcm9wZXJ0eX1gLCBvRXJyb3IpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBjb250cm9scy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgTmFtZVxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRoZSB0ZXh0IHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIFNpZGVFZmZlY3RzXG5cdCAqIElmIGEgcHJvcGVydHkgaGFzIGFuIGFzc29jaWF0ZWQgdGV4dCB0aGVuIHRoaXMgdGV4dCBuZWVkcyB0byBiZSBhZGRlZCBhcyB0YXJnZXRQcm9wZXJ0aWVzIG9yIHRhcmdldEVudGl0aWVzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX2FkZFJlcXVpcmVkVGV4dFByb3BlcnRpZXMob1NpZGVFZmZlY3Q6IEJhc2VTaWRlRWZmZWN0c1R5cGUsIG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgYUluaXRpYWxQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgfHwgW10sXG5cdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQ6IHN0cmluZ1tdID0gKG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzIHx8IFtdKS5tYXAoKG5hdmlnYXRpb24pID0+IG5hdmlnYXRpb24uJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdGxldCBhRGVyaXZlZFByb3BlcnRpZXM6IEV4dHJhY3RvclByb3BlcnR5SW5mb1tdID0gW107XG5cblx0XHRhSW5pdGlhbFByb3BlcnRpZXMuZm9yRWFjaCgoc1Byb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IGAke3NOYXZpZ2F0aW9uUHJvcGVydHlQYXRofS9gIDogXCJcIixcblx0XHRcdFx0bVRhcmdldDogYW55ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpIHx8IG1FbnRpdHlUeXBlO1xuXG5cdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHQvLyBtVGFyZ2V0IGNhbiBiZSBhbiBlbnRpdHkgdHlwZSwgbmF2aWdhdGlvblByb3BlcnR5IG9yIG9yIGEgY29tcGxleFR5cGVcblx0XHRcdFx0Y29uc3QgYVRhcmdldEVudGl0eVByb3BlcnRpZXM6IFByb3BlcnR5W10gPVxuXHRcdFx0XHRcdChtVGFyZ2V0IGFzIEVudGl0eVR5cGUpLmVudGl0eVByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQoKG1UYXJnZXQgYXMgUHJvcGVydHkpLnRhcmdldFR5cGUgYXMgQ29tcGxleFR5cGUpPy5wcm9wZXJ0aWVzIHx8XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXM7XG5cdFx0XHRcdGlmIChhVGFyZ2V0RW50aXR5UHJvcGVydGllcykge1xuXHRcdFx0XHRcdGlmIChiSXNTdGFyUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdC8vIEFkZCBhbGwgcmVxdWlyZWQgcHJvcGVydGllcyBiZWhpbmQgdGhlICpcblx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdGFEZXJpdmVkUHJvcGVydGllcyA9IGFEZXJpdmVkUHJvcGVydGllcy5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzLm1hcCgobVByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IG1Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdChtUHJvcGVydHkpID0+IG1Qcm9wZXJ0eS5uYW1lID09PSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKVxuXHRcdFx0XHRcdFx0XHQpIGFzIFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aDogc1JlbGF0aXZlUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5pbmZvKGBTaWRlRWZmZWN0cyAtIFRoZSBlbnRpdHkgdHlwZSBhc3NvY2lhdGVkIHRvIHByb3BlcnR5IHBhdGggJHtzUHJvcGVydHlQYXRofSBjYW5ub3QgYmUgcmVzb2x2ZWRgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oYFNpZGVFZmZlY3RzIC0gVGhlIHByb3BlcnR5IHBhdGggJHtzUHJvcGVydHlQYXRofSBjYW5ub3QgYmUgcmVzb2x2ZWRgKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFEZXJpdmVkUHJvcGVydGllcy5mb3JFYWNoKChtUHJvcGVydHlJbmZvKSA9PiB7XG5cdFx0XHRpZiAobVByb3BlcnR5SW5mby5wcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBzVGFyZ2V0VGV4dFBhdGggPSAobVByb3BlcnR5SW5mby5wcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0IGFzIGFueSk/LnBhdGgsXG5cdFx0XHRcdFx0c1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkgPSBtUHJvcGVydHlJbmZvLm5hdmlnYXRpb25QYXRoICsgc1RhcmdldFRleHRQYXRoLFxuXHRcdFx0XHRcdHNUYXJnZXRDb2xsZWN0aW9uUGF0aCA9IHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5LnN1YnN0cmluZygwLCBzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eS5sYXN0SW5kZXhPZihcIi9cIikpO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHByb3BlcnR5IFRleHQgbXVzdCBiZSBhZGRlZCBvbmx5IGlmIHRoZSBwcm9wZXJ0eSBpc1xuXHRcdFx0XHQgKiAtIG5vdCBwYXJ0IG9mIGEgc3RhciBwcm9wZXJ0eSAoLmkuZSAnKicgb3IgJ25hdmlnYXRpb24vKicpIG9yIGEgdGFyZ2V0ZWQgRW50aXR5XG5cdFx0XHRcdCAqIC0gbm90IGluY2x1ZGUgaW50byB0aGUgaW5pdGlhbCB0YXJnZXRlZCBwcm9wZXJ0aWVzIG9mIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqICBJbmRlZWQgaW4gdGhlIHR3byBsaXN0ZWQgY2FzZXMsIHRoZSBwcm9wZXJ0eSBjb250YWluaW5nIHRleHQgd2lsbCBiZS9pcyByZXF1ZXN0ZWQgYnkgaW5pdGlhbCBTaWRlRWZmZWN0cyBjb25maWd1cmF0aW9uLlxuXHRcdFx0XHQgKi9cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0c1RhcmdldFRleHRQYXRoICYmXG5cdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLmluZGV4T2Yoc1RhcmdldENvbGxlY3Rpb25QYXRoKSA9PT0gLTEgJiZcblx0XHRcdFx0XHRhSW5pdGlhbFByb3BlcnRpZXMuaW5kZXhPZihzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSkgPT09IC0xXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIFRoZSBUZXh0IGFzc29jaWF0aW9uIGlzIGFkZGVkIGFzIFRhcmdldEVudGl0aWVzIGlmIGl0J3MgY29udGFpbmVkIG9uIGEgZGlmZmVyZW50IGVudGl0eVNldCBhbmQgbm90IGEgY29tcGxleFR5cGVcblx0XHRcdFx0XHQvLyBPdGhlcndpc2UgaXQncyBhZGRlZCBhcyB0YXJnZXRQcm9wZXJ0aWVzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0c1RhcmdldFRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA+IC0xICYmXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzVGFyZ2V0Q29sbGVjdGlvblBhdGgpPy5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMucHVzaCh7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVGFyZ2V0Q29sbGVjdGlvblBhdGggfSk7XG5cdFx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQucHVzaChzVGFyZ2V0Q29sbGVjdGlvblBhdGgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzLnB1c2goc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0O1xuXHR9XG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gUmVtb3ZlcyBiaW5kaW5nIHBhcmFtZXRlciBmcm9tIFNpZGVFZmZlY3RzIHRhcmdldHMgcHJvcGVydGllc1xuXHQgKiAgLSBBZGRzIHRoZSB0ZXh0IHByb3BlcnRpZXNcblx0ICogIC0gUmVwbGFjZXMgVGFyZ2V0UHJvcGVydGllcyBoYXZpbmcgcmVmZXJlbmNlIHRvIFNvdXJjZSBQcm9wZXJ0aWVzIGZvciBhIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0gc0JpbmRpbmdQYXJhbWV0ZXIgTmFtZSBvZiB0aGUgYmluZGluZyBwYXJhbWV0ZXJcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBfY29udmVydFNpZGVFZmZlY3RzKFxuXHRcdG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlLFxuXHRcdG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNCaW5kaW5nUGFyYW1ldGVyPzogc3RyaW5nXG5cdCk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBvVGVtcFNpZGVFZmZlY3RzID0gdGhpcy5fcmVtb3ZlQmluZGluZ1BhcmFtZXRlcih0aGlzLl9jb252ZXJ0VGFyZ2V0c0Zvcm1hdChvU2lkZUVmZmVjdHMpLCBzQmluZGluZ1BhcmFtZXRlcik7XG5cdFx0cmV0dXJuIHRoaXMuX2FkZFJlcXVpcmVkVGV4dFByb3BlcnRpZXMob1RlbXBTaWRlRWZmZWN0cywgbUVudGl0eVR5cGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRhcmdldHMgKFRhcmdldEVudGl0aWVzIGFuZCBUYXJnZXRQcm9wZXJ0aWVzKSB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gVGFyZ2V0UHJvcGVydGllcyBhcyBhcnJheSBvZiBzdHJpbmdcblx0ICogIC0gVGFyZ2V0RW50aXRpZXMgYXMgYXJyYXkgb2Ygb2JqZWN0IHdpdGggcHJvcGVydHkgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHJldHVybnMgQ29udmVydGVkIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0VGFyZ2V0c0Zvcm1hdChvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUgfCBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pLnJlZHVjZShmdW5jdGlvbiAoYVRhcmdldFByb3BlcnRpZXMsIHZUYXJnZXQpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldCA9ICh0eXBlb2YgdlRhcmdldCA9PT0gXCJzdHJpbmdcIiAmJiB2VGFyZ2V0KSB8fCAodlRhcmdldC50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiICYmIHZUYXJnZXQudmFsdWUpO1xuXHRcdFx0XHRpZiAoc1RhcmdldCkge1xuXHRcdFx0XHRcdGFUYXJnZXRQcm9wZXJ0aWVzLnB1c2goc1RhcmdldCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgVGFyZ2V0UHJvcGVydGllcyBmb3IgU2lkZUVmZmVjdHMke29TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFUYXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5tYXAoKG1UYXJnZXRFbnRpdHkpID0+IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqICBTaWRlRWZmZWN0cyB0aGF0IGNvbWVzIGZyb20gU0FQIEZFIGdldCBUYXJnZXRFbnRpdGllcyB3aXRoICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHdoZXJlYXNcblx0XHRcdFx0ICogIG9uZXMgY29taW5nIGZyb20gdGhlIGNvbnZlcnRlZCBPRGF0YSBtb2RlbCBnZXRzIGEgTmF2aWdhdGlvblByb3BlcnR5UGF0aCBmb3JtYXRcblx0XHRcdFx0ICpcblx0XHRcdFx0ICovXG5cdFx0XHRcdHJldHVybiB7IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjogbVRhcmdldEVudGl0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCBtVGFyZ2V0RW50aXR5LnZhbHVlIHx8IFwiXCIgfTtcblx0XHRcdH0pO1xuXHRcdHJldHVybiB7IC4uLm9TaWRlRWZmZWN0cywgLi4ueyBUYXJnZXRQcm9wZXJ0aWVzLCBUYXJnZXRFbnRpdGllcyB9IH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGFuIGVudGl0eSB0eXBlIG9yIGFjdGlvbiB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aCBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb1NvdXJjZSBFbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogQHJldHVybnMgQXJyYXkgb2YgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvU291cmNlOiBhbnkpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRjb25zdCBhU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRjb25zdCBhdXRob3JpemVkVHlwZXMgPSBbXCJFbnRpdHlUeXBlXCIsIFwiQWN0aW9uXCJdO1xuXHRcdGlmIChvU291cmNlLl90eXBlICYmIGF1dGhvcml6ZWRUeXBlcy5pbmRleE9mKG9Tb3VyY2UuX3R5cGUpID4gLTEpIHtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkID0gb1NvdXJjZS5fdHlwZSA9PT0gXCJFbnRpdHlUeXBlXCIgPyBvU291cmNlIDogb1NvdXJjZS5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdFx0aWYgKG1FbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IG1Db21tb25Bbm5vdGF0aW9uOiBhbnkgPSBvU291cmNlLmFubm90YXRpb25zPy5Db21tb24gfHwge307XG5cdFx0XHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyID0gKChvU291cmNlIGFzIEFjdGlvbikucGFyYW1ldGVycyB8fCBbXSkuZmluZChcblx0XHRcdFx0XHQobVBhcmFtZXRlcikgPT4gbVBhcmFtZXRlci50eXBlID09PSBtRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXJhbWV0ZXIgPSBtQmluZGluZ1BhcmFtZXRlciA/IG1CaW5kaW5nUGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIi9cIilbMV0gOiBcIlwiO1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29tbW9uQW5ub3RhdGlvbilcblx0XHRcdFx0XHQuZmlsdGVyKChzQW5ub3RhdGlvbk5hbWUpID0+IG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGUpXG5cdFx0XHRcdFx0LmZvckVhY2goKHNBbm5vdGF0aW9uTmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0YVNpZGVFZmZlY3RzLnB1c2godGhpcy5fY29udmVydFNpZGVFZmZlY3RzKG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0sIG1FbnRpdHlUeXBlLCBzQmluZGluZ1BhcmFtZXRlcikpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYVNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgU2lkZUVmZmVjdHMgcmVxdWVzdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbiAoc1BhdGhzLCBtVGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gYCR7c1BhdGhzfVxcblxcdFxcdCR7KG1UYXJnZXQgYXMgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlKS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCBtVGFyZ2V0IHx8IFwiXCJ9YDtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoYFNpZGVFZmZlY3RzIC0gUmVxdWVzdDpcXG5cXHRDb250ZXh0IHBhdGggOiAke29Db250ZXh0LmdldFBhdGgoKX1cXG5cXHRQcm9wZXJ0eSBwYXRocyA6JHtzVGFyZ2V0UGF0aHN9YCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goKHNUYXJnZXQpID0+IHtcblx0XHRcdFx0bGV0IG1UYXJnZXQgPSAob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF07XG5cdFx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdFx0bVRhcmdldCA9IG1UYXJnZXQubWFwKChtUHJvcGVydHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPSBtUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggIT09IHVuZGVmaW5lZDsgLy8gTmVlZCB0byB0ZXN0IHdpdGggdW5kZWZpbmVkIHNpbmNlICBtUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggY291bGQgYmUgXCJcIiAoZW1wdHkgc3RyaW5nKVxuXHRcdFx0XHRcdFx0Y29uc3Qgc1ZhbHVlID0gKGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIDogbVByb3BlcnR5KS5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRuZXcgUmVnRXhwKGBeJHtzQmluZGluZ1BhcmFtZXRlck5hbWV9Lz9gKSxcblx0XHRcdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybiBiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNWYWx1ZSB9IDogc1ZhbHVlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChvU2lkZUVmZmVjdHMgYXMgYW55KVtzVGFyZ2V0XSA9IG1UYXJnZXQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgZHVwbGljYXRlcyBpbiBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgdGFyZ2V0cyB3aXRob3V0IGR1cGxpY2F0ZXNcblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10pOiBTaWRlRWZmZWN0c1RhcmdldFtdIHtcblx0XHRyZXR1cm4gYVRhcmdldHMuZmlsdGVyKFxuXHRcdFx0KG1UYXJnZXQ6IGFueSwgaUluZGV4LCBhSW5UYXJnZXRzKSA9PlxuXHRcdFx0XHRhSW5UYXJnZXRzLmZpbmRJbmRleCgobVNlYXJjaFRhcmdldDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdG1TZWFyY2hUYXJnZXQgPT09IG1UYXJnZXQgfHwgLy8gUHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHQobVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAmJiBtU2VhcmNoVGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBtVGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSAvLyBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSkgPT09IGlJbmRleFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBhY3Rpb24gdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIG9uIGFjdGlvbnNcblx0ICogcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGhcblx0ICogZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMobUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4gPSB7fTtcblx0XHRjb25zdCBhQWN0aW9ucyA9IG1FbnRpdHlUeXBlLmFjdGlvbnM7XG5cdFx0aWYgKGFBY3Rpb25zKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhhQWN0aW9ucykuZm9yRWFjaCgoc0FjdGlvbk5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0FjdGlvbiA9IG1FbnRpdHlUeXBlLmFjdGlvbnNbc0FjdGlvbk5hbWVdO1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyQWN0aW9uczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblxuXHRcdFx0XHR0aGlzLl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob0FjdGlvbikuZm9yRWFjaCgob1NpZGVFZmZlY3QpID0+IHtcblx0XHRcdFx0XHRjb25zdCBzVHJpZ2dlckFjdGlvbiA9IG9TaWRlRWZmZWN0LlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0YVRhcmdldHMgPSBhVGFyZ2V0cy5jb25jYXQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbiAmJiB0cmlnZ2VyQWN0aW9ucy5pbmRleE9mKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRcdG9TaWRlRWZmZWN0c1tzQWN0aW9uTmFtZV0gPSB7IHBhdGhFeHByZXNzaW9ucywgdHJpZ2dlckFjdGlvbnMgfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvRW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShtRW50aXR5VHlwZSkuZm9yRWFjaCgob1NpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRvRW50aXR5U2lkZUVmZmVjdHNbb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBvU2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9FbnRpdHlTaWRlRWZmZWN0cztcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UgPSBuZXcgU2lkZUVmZmVjdHNTZXJ2aWNlKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UuaW5pdFByb21pc2U7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
|