@sapui5/sap.fe.core 1.102.0 → 1.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +62 -26
- package/src/sap/fe/core/AppComponent.ts +56 -40
- package/src/sap/fe/core/AppStateHandler.js +10 -10
- package/src/sap/fe/core/AppStateHandler.ts +9 -9
- package/src/sap/fe/core/BaseController.js +11 -9
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +236 -109
- package/src/sap/fe/core/CommonUtils.ts +252 -136
- package/src/sap/fe/core/ExtensionAPI.js +24 -27
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +4 -4
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -6
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +8 -8
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +11 -10
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +129 -118
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +154 -141
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +31 -26
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +34 -35
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +70 -70
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +77 -77
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +84 -78
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +105 -101
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +8 -8
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +19 -26
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +29 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +21 -22
- package/src/sap/fe/core/controllerextensions/Paginator.ts +24 -25
- package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +22 -22
- package/src/sap/fe/core/controllerextensions/Share.ts +30 -29
- package/src/sap/fe/core/controllerextensions/SideEffects.js +46 -50
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +65 -62
- package/src/sap/fe/core/controllerextensions/ViewState.ts +68 -63
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +6 -6
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +12 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +4 -4
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +7 -9
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +18 -19
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +184 -137
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +253 -206
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +113 -121
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +148 -158
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +198 -148
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +223 -159
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +24 -26
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +35 -33
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -44
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +90 -60
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +52 -55
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +55 -58
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +11 -25
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +22 -22
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +2 -2
- package/src/sap/fe/core/controls/FileWrapper.ts +11 -11
- package/src/sap/fe/core/controls/FilterBar.js +6 -2
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +47 -47
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +52 -52
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +14 -14
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +50 -32
- package/src/sap/fe/core/converters/MetaModelConverter.ts +145 -127
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +54 -34
- package/src/sap/fe/core/converters/annotations/DataField.ts +97 -75
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +50 -41
- package/src/sap/fe/core/converters/controls/Common/Action.ts +56 -46
- package/src/sap/fe/core/converters/controls/Common/Chart.js +14 -14
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -26
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +28 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
- package/src/sap/fe/core/converters/controls/Common/Form.js +25 -27
- package/src/sap/fe/core/converters/controls/Common/Form.ts +37 -45
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
- package/src/sap/fe/core/converters/controls/Common/Table.js +174 -183
- package/src/sap/fe/core/converters/controls/Common/Table.ts +237 -250
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +144 -141
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +45 -41
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +64 -57
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +67 -64
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +73 -72
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +98 -96
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +10 -13
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
- package/src/sap/fe/core/converters/helpers/ID.js +46 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -4
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +46 -62
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +39 -38
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +52 -61
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +89 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +365 -264
- package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
- package/src/sap/fe/core/helpers/ClassSupport.ts +14 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/MassEditHelper.js +281 -254
- package/src/sap/fe/core/helpers/MassEditHelper.ts +337 -289
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +49 -35
- package/src/sap/fe/core/messagebundle_ar.properties +13 -5
- package/src/sap/fe/core/messagebundle_bg.properties +13 -5
- package/src/sap/fe/core/messagebundle_ca.properties +13 -5
- package/src/sap/fe/core/messagebundle_cs.properties +13 -5
- package/src/sap/fe/core/messagebundle_cy.properties +14 -6
- package/src/sap/fe/core/messagebundle_da.properties +13 -5
- package/src/sap/fe/core/messagebundle_de.properties +15 -7
- package/src/sap/fe/core/messagebundle_el.properties +14 -6
- package/src/sap/fe/core/messagebundle_en.properties +9 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +11 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -1
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -85
- package/src/sap/fe/core/messagebundle_es.properties +13 -5
- package/src/sap/fe/core/messagebundle_es_MX.properties +13 -5
- package/src/sap/fe/core/messagebundle_et.properties +13 -5
- package/src/sap/fe/core/messagebundle_fi.properties +14 -6
- package/src/sap/fe/core/messagebundle_fr.properties +14 -6
- package/src/sap/fe/core/messagebundle_fr_CA.properties +14 -6
- package/src/sap/fe/core/messagebundle_hi.properties +14 -6
- package/src/sap/fe/core/messagebundle_hr.properties +14 -6
- package/src/sap/fe/core/messagebundle_hu.properties +13 -5
- package/src/sap/fe/core/messagebundle_id.properties +13 -5
- package/src/sap/fe/core/messagebundle_it.properties +33 -25
- package/src/sap/fe/core/messagebundle_iw.properties +13 -5
- package/src/sap/fe/core/messagebundle_ja.properties +14 -6
- package/src/sap/fe/core/messagebundle_kk.properties +13 -5
- package/src/sap/fe/core/messagebundle_ko.properties +13 -5
- package/src/sap/fe/core/messagebundle_lt.properties +13 -5
- package/src/sap/fe/core/messagebundle_lv.properties +14 -6
- package/src/sap/fe/core/messagebundle_ms.properties +13 -5
- package/src/sap/fe/core/messagebundle_nl.properties +13 -5
- package/src/sap/fe/core/messagebundle_no.properties +13 -5
- package/src/sap/fe/core/messagebundle_pl.properties +13 -5
- package/src/sap/fe/core/messagebundle_pt.properties +13 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +14 -6
- package/src/sap/fe/core/messagebundle_ro.properties +13 -5
- package/src/sap/fe/core/messagebundle_ru.properties +13 -5
- package/src/sap/fe/core/messagebundle_sh.properties +13 -5
- package/src/sap/fe/core/messagebundle_sk.properties +13 -5
- package/src/sap/fe/core/messagebundle_sl.properties +17 -9
- package/src/sap/fe/core/messagebundle_sv.properties +14 -6
- package/src/sap/fe/core/messagebundle_th.properties +13 -5
- package/src/sap/fe/core/messagebundle_tr.properties +13 -5
- package/src/sap/fe/core/messagebundle_uk.properties +13 -5
- package/src/sap/fe/core/messagebundle_vi.properties +13 -5
- package/src/sap/fe/core/messagebundle_zh_CN.properties +14 -6
- package/src/sap/fe/core/messagebundle_zh_TW.properties +13 -5
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +53 -44
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +54 -46
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +55 -55
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +72 -76
- package/src/sap/fe/core/services/ShellServicesFactory.ts +76 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +20 -15
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +26 -21
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/templating/CommonFormatters.js +84 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +86 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +16 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +10 -9
- package/src/sap/fe/core/templating/FilterHelper.ts +13 -13
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +148 -93
- package/src/sap/fe/core/templating/UIFormatters.ts +196 -124
- package/src/sap/fe/core/type/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -7,9 +7,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
7
7
|
|
|
8
8
|
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _dec33, _dec34, _class, _class2;
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var TriggerType = Feedback.TriggerType;
|
|
11
11
|
var triggerConfiguredSurvey = Feedback.triggerConfiguredSurvey;
|
|
12
|
-
var
|
|
12
|
+
var StandardActions = Feedback.StandardActions;
|
|
13
13
|
var publicExtension = ClassSupport.publicExtension;
|
|
14
14
|
var finalExtension = ClassSupport.finalExtension;
|
|
15
15
|
var extensible = ClassSupport.extensible;
|
|
@@ -56,6 +56,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
56
56
|
Constants = FELibrary.Constants,
|
|
57
57
|
DraftStatus = FELibrary.DraftStatus,
|
|
58
58
|
EditMode = FELibrary.EditMode,
|
|
59
|
+
StartupMode = FELibrary.StartupMode,
|
|
59
60
|
MessageType = coreLibrary.MessageType;
|
|
60
61
|
/**
|
|
61
62
|
* A controller extension offering hooks into the edit flow of the application
|
|
@@ -82,8 +83,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
82
83
|
* Creates a draft document for an existing active document.
|
|
83
84
|
*
|
|
84
85
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
85
|
-
* @param
|
|
86
|
-
* @returns
|
|
86
|
+
* @param oContext Context of the active document
|
|
87
|
+
* @returns Promise resolves once the editable document is available
|
|
87
88
|
* @alias sap.fe.core.controllerextensions.EditFlow#editDocument
|
|
88
89
|
* @public
|
|
89
90
|
* @since 1.90.0
|
|
@@ -182,9 +183,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
182
183
|
* Updates the draft status and displays the error messages if there are errors during an update.
|
|
183
184
|
*
|
|
184
185
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
185
|
-
* @param
|
|
186
|
-
* @param
|
|
187
|
-
* @returns
|
|
186
|
+
* @param oContext Context of the updated field
|
|
187
|
+
* @param oPromise Promise to determine when the update operation is completed. The promise should be resolved when the update operation is completed, so the draft status can be updated.
|
|
188
|
+
* @returns Promise resolves once draft status has been updated
|
|
188
189
|
* @alias sap.fe.core.controllerextensions.EditFlow#updateDocument
|
|
189
190
|
* @public
|
|
190
191
|
* @since 1.90.0
|
|
@@ -266,15 +267,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
266
267
|
* Creates a new document.
|
|
267
268
|
*
|
|
268
269
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
269
|
-
* @param
|
|
270
|
-
* @param
|
|
271
|
-
* @param
|
|
270
|
+
* @param vListBinding ODataListBinding object or the binding path for a temporary list binding
|
|
271
|
+
* @param mInParameters Contains the following attributes:
|
|
272
|
+
* @param mInParameters.creationMode The creation mode using one of the following:
|
|
272
273
|
* NewPage - the created document is shown in a new page, depending on whether metadata 'Sync', 'Async' or 'Deferred' is used
|
|
273
274
|
* Inline - The creation is done inline (in a table)
|
|
274
275
|
* External - The creation is done in a different application specified via the parameter 'outbound'
|
|
275
|
-
* @param
|
|
276
|
-
* @param
|
|
277
|
-
* @returns
|
|
276
|
+
* @param mInParameters.outbound The navigation target where the document is created in case of creationMode 'External'
|
|
277
|
+
* @param mInParameters.createAtEnd Specifies if the new entry should be created at the top or bottom of a table in case of creationMode 'Inline'
|
|
278
|
+
* @returns Promise resolves once the object has been created
|
|
278
279
|
* @alias sap.fe.core.controllerextensions.EditFlow#createDocument
|
|
279
280
|
* @public
|
|
280
281
|
* @since 1.90.0
|
|
@@ -327,11 +328,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
327
328
|
if (mParameters.creationMode === CreationMode.Inline && mParameters.tableId) {
|
|
328
329
|
oTable = this.getView().byId(mParameters.tableId);
|
|
329
330
|
}
|
|
330
|
-
/**
|
|
331
|
-
* @param {sap.ui.model.odata.v4.ODataListBinding} oListBinding
|
|
332
|
-
* @param {object} oCreationPromise
|
|
333
|
-
*/
|
|
334
331
|
|
|
332
|
+
if (oTable && oTable.isA("sap.ui.mdc.Table")) {
|
|
333
|
+
var fnFocusOrScroll = mParameters.creationMode === CreationMode.Inline ? oTable.focusRow.bind(oTable) : oTable.scrollToIndex.bind(oTable);
|
|
334
|
+
oTable.getRowBinding().attachEventOnce("change", function () {
|
|
335
|
+
fnFocusOrScroll(mParameters.createAtEnd ? oTable.getRowBinding().getLength() : 0, true);
|
|
336
|
+
});
|
|
337
|
+
}
|
|
335
338
|
|
|
336
339
|
var handleSideEffects = function (oListBinding, oCreationPromise) {
|
|
337
340
|
oCreationPromise.then(function (oNewContext) {
|
|
@@ -344,16 +347,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
344
347
|
|
|
345
348
|
|
|
346
349
|
if (!CommonUtils.hasTransientContext(oListBinding)) {
|
|
347
|
-
var
|
|
348
|
-
|
|
349
|
-
_oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
|
|
350
|
+
var appComponent = CommonUtils.getAppComponent(_this4.getView());
|
|
351
|
+
appComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
|
|
350
352
|
}
|
|
351
353
|
}).catch(function (oError) {
|
|
352
354
|
Log.error("Error while creating the document", oError);
|
|
353
355
|
});
|
|
354
356
|
};
|
|
355
357
|
/**
|
|
356
|
-
* @param
|
|
358
|
+
* @param aValidationMessages Error messages from custom validation function
|
|
357
359
|
*/
|
|
358
360
|
|
|
359
361
|
|
|
@@ -378,7 +380,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
378
380
|
var _oFieldControl$getBin;
|
|
379
381
|
|
|
380
382
|
oFieldControl = Core.getControl(mCustomValidity[oValidationMessage.messageTarget].fieldId);
|
|
381
|
-
sTarget = ((_oFieldControl$getBin = oFieldControl.getBindingContext()) === null || _oFieldControl$getBin === void 0 ? void 0 : _oFieldControl$getBin.getPath()
|
|
383
|
+
sTarget = "".concat((_oFieldControl$getBin = oFieldControl.getBindingContext()) === null || _oFieldControl$getBin === void 0 ? void 0 : _oFieldControl$getBin.getPath(), "/").concat(oFieldControl.getBindingPath("value")); // Add validation message if still not exists
|
|
382
384
|
|
|
383
385
|
if (oMessageManager.getMessageModel().getData().filter(function (oMessage) {
|
|
384
386
|
return oMessage.target === sTarget;
|
|
@@ -416,7 +418,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
416
418
|
}
|
|
417
419
|
};
|
|
418
420
|
|
|
419
|
-
|
|
421
|
+
if (bShouldBusyLock) {
|
|
422
|
+
BusyLocker.lock(oLockObject);
|
|
423
|
+
}
|
|
424
|
+
|
|
420
425
|
return this._syncTask(oExecCustomValidation).then(function (aValidationMessages) {
|
|
421
426
|
if (aValidationMessages.length > 0) {
|
|
422
427
|
createCustomValidationMessages(aValidationMessages);
|
|
@@ -455,10 +460,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
455
460
|
var sPath = oListBinding.getPath(),
|
|
456
461
|
// if NewAction with parameters is present, then creation is 'Deferred'
|
|
457
462
|
// in the absence of NewAction or NewAction with parameters, creation is async
|
|
458
|
-
sNewAction = sProgrammingModel === ProgrammingModel.Draft ? oMetaModel.getObject(sPath
|
|
463
|
+
sNewAction = sProgrammingModel === ProgrammingModel.Draft ? oMetaModel.getObject("".concat(sPath, "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction")) : oMetaModel.getObject("".concat(sPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction"));
|
|
459
464
|
|
|
460
465
|
if (sNewAction) {
|
|
461
|
-
var aParameters = oMetaModel.getObject("/"
|
|
466
|
+
var aParameters = oMetaModel.getObject("/".concat(sNewAction, "/@$ui5.overload/0/$Parameter")) || []; // binding parameter (eg: _it) is not considered
|
|
462
467
|
|
|
463
468
|
if (aParameters.length > 1) {
|
|
464
469
|
return CreationMode.Deferred;
|
|
@@ -475,7 +480,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
475
480
|
|
|
476
481
|
return CreationMode.Async;
|
|
477
482
|
}
|
|
478
|
-
}).then(function (
|
|
483
|
+
}).then(function (resolvedCreationMode) {
|
|
479
484
|
var oCreation;
|
|
480
485
|
var mArgs;
|
|
481
486
|
var oCreationRow = mParameters.creationRow;
|
|
@@ -487,15 +492,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
487
492
|
|
|
488
493
|
var oRoutingListener = _this4._getRoutingListener();
|
|
489
494
|
|
|
490
|
-
if (
|
|
491
|
-
if (
|
|
495
|
+
if (resolvedCreationMode !== CreationMode.Deferred) {
|
|
496
|
+
if (resolvedCreationMode === CreationMode.CreationRow) {
|
|
492
497
|
oCreationRowContext = oCreationRow.getBindingContext();
|
|
493
498
|
sMetaPath = oMetaModel.getMetaPath(oCreationRowContext.getPath()); // prefill data from creation row
|
|
494
499
|
|
|
495
500
|
oPayload = oCreationRowContext.getObject();
|
|
496
501
|
mParameters.data = {};
|
|
497
502
|
Object.keys(oPayload).forEach(function (sPropertyPath) {
|
|
498
|
-
var oProperty = oMetaModel.getObject(sMetaPath
|
|
503
|
+
var oProperty = oMetaModel.getObject("".concat(sMetaPath, "/").concat(sPropertyPath)); // ensure navigation properties are not part of the payload, deep create not supported
|
|
499
504
|
|
|
500
505
|
if (oProperty && oProperty.$kind === "NavigationProperty") {
|
|
501
506
|
return;
|
|
@@ -506,7 +511,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
506
511
|
oValidationCheck = _this4._checkForValidationErrors();
|
|
507
512
|
}
|
|
508
513
|
|
|
509
|
-
if (
|
|
514
|
+
if (resolvedCreationMode === CreationMode.CreationRow || resolvedCreationMode === CreationMode.Inline) {
|
|
510
515
|
mParameters.keepTransientContextOnFailed = false; // currently not fully supported
|
|
511
516
|
// busy handling shall be done locally only
|
|
512
517
|
|
|
@@ -528,7 +533,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
528
533
|
|
|
529
534
|
var oNavigation;
|
|
530
535
|
|
|
531
|
-
switch (
|
|
536
|
+
switch (resolvedCreationMode) {
|
|
532
537
|
case CreationMode.Deferred:
|
|
533
538
|
oNavigation = oRoutingListener.navigateForwardToContext(oListBinding, {
|
|
534
539
|
bDeferredContext: true,
|
|
@@ -557,11 +562,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
557
562
|
|
|
558
563
|
oNavigation = oCreation.then(function (oNewDocumentContext) {
|
|
559
564
|
if (!oNewDocumentContext) {
|
|
560
|
-
var
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
description: _oResourceBundle.getText("C_EDITFLOW_SAPFE_CREATION_FAILED_DESCRIPTION")
|
|
565
|
+
var coreResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
566
|
+
return oRoutingListener.navigateToMessagePage(coreResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
|
|
567
|
+
title: coreResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
|
|
568
|
+
description: coreResourceBundle.getText("C_EDITFLOW_SAPFE_CREATION_FAILED_DESCRIPTION")
|
|
565
569
|
});
|
|
566
570
|
} else {
|
|
567
571
|
return oRoutingListener.navigateForwardToContext(oNewDocumentContext, mArgs);
|
|
@@ -604,7 +608,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
604
608
|
break;
|
|
605
609
|
|
|
606
610
|
default:
|
|
607
|
-
oNavigation = Promise.reject("Unhandled creationMode "
|
|
611
|
+
oNavigation = Promise.reject("Unhandled creationMode ".concat(resolvedCreationMode));
|
|
608
612
|
break;
|
|
609
613
|
}
|
|
610
614
|
|
|
@@ -643,14 +647,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
643
647
|
}
|
|
644
648
|
});
|
|
645
649
|
}).finally(function () {
|
|
646
|
-
if (
|
|
647
|
-
|
|
648
|
-
oTable.getRowBinding().attachEventOnce("change", function () {
|
|
649
|
-
fnFocusOrScroll(mParameters.createAtEnd ? oTable.getRowBinding().getLength() : 0, true);
|
|
650
|
-
});
|
|
650
|
+
if (bShouldBusyLock) {
|
|
651
|
+
BusyLocker.unlock(oLockObject);
|
|
651
652
|
}
|
|
652
|
-
|
|
653
|
-
bShouldBusyLock && BusyLocker.unlock(oLockObject);
|
|
654
653
|
});
|
|
655
654
|
}
|
|
656
655
|
/**
|
|
@@ -660,9 +659,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
660
659
|
*
|
|
661
660
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
662
661
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
663
|
-
*
|
|
664
|
-
* @param
|
|
665
|
-
* @
|
|
662
|
+
*
|
|
663
|
+
* @param mParameters Object containing the parameters passed to onBeforeSave
|
|
664
|
+
* @param mParameters.context Page context that is going to be saved.
|
|
665
|
+
* @returns A promise to be returned by the overridden method. If resolved, the 'Save' action is triggered. If rejected, the 'Save' action is not triggered and the user stays in edit mode.
|
|
666
666
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
667
667
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeSave
|
|
668
668
|
* @public
|
|
@@ -682,10 +682,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
682
682
|
*
|
|
683
683
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
684
684
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
685
|
-
*
|
|
686
|
-
* @param
|
|
687
|
-
* @param
|
|
688
|
-
* @
|
|
685
|
+
*
|
|
686
|
+
* @param mParameters Object containing the parameters passed to onBeforeCreate
|
|
687
|
+
* @param mParameters.contextPath Path pointing to the context on which Create action is triggered
|
|
688
|
+
* @param mParameters.createParameters Array of values that are filled in the Action Parameter Dialog
|
|
689
|
+
* @returns A promise to be returned by the overridden method. If resolved, the 'Create' action is triggered. If rejected, the 'Create' action is not triggered.
|
|
689
690
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
690
691
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeCreate
|
|
691
692
|
* @public
|
|
@@ -705,9 +706,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
705
706
|
*
|
|
706
707
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
707
708
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
708
|
-
*
|
|
709
|
-
* @param
|
|
710
|
-
* @
|
|
709
|
+
*
|
|
710
|
+
* @param mParameters Object containing the parameters passed to onBeforeEdit
|
|
711
|
+
* @param mParameters.context Page context that is going to be edited.
|
|
712
|
+
* @returns A promise to be returned by the overridden method. If resolved, the 'Edit' action is triggered. If rejected, the 'Edit' action is not triggered and the user stays in display mode.
|
|
711
713
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
712
714
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeEdit
|
|
713
715
|
* @public
|
|
@@ -727,9 +729,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
727
729
|
*
|
|
728
730
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
729
731
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
730
|
-
*
|
|
731
|
-
* @param
|
|
732
|
-
* @
|
|
732
|
+
*
|
|
733
|
+
* @param mParameters Object containing the parameters passed to onBeforeDiscard
|
|
734
|
+
* @param mParameters.context Page context that is going to be discarded.
|
|
735
|
+
* @returns A promise to be returned by the overridden method. If resolved, the 'Discard' action is triggered. If rejected, the 'Discard' action is not triggered and the user stays in edit mode.
|
|
733
736
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
734
737
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeDiscard
|
|
735
738
|
* @public
|
|
@@ -749,9 +752,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
749
752
|
*
|
|
750
753
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
751
754
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
752
|
-
*
|
|
753
|
-
* @param
|
|
754
|
-
* @
|
|
755
|
+
*
|
|
756
|
+
* @param mParameters Object containing the parameters passed to onBeforeDelete
|
|
757
|
+
* @param mParameters.contexts An array of contexts that are going to be deleted
|
|
758
|
+
* @returns A promise to be returned by the overridden method. If resolved, the 'Delete' action is triggered. If rejected, the 'Delete' action is not triggered.
|
|
755
759
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
756
760
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeDelete
|
|
757
761
|
* @public
|
|
@@ -774,8 +778,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
774
778
|
* Saves a new document after checking it.
|
|
775
779
|
*
|
|
776
780
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
777
|
-
* @param
|
|
778
|
-
* @returns
|
|
781
|
+
* @param oContext Context of the editable document
|
|
782
|
+
* @returns Promise resolves once save is complete
|
|
779
783
|
* @alias sap.fe.core.controllerextensions.EditFlow#saveDocument
|
|
780
784
|
* @public
|
|
781
785
|
* @since 1.90.0
|
|
@@ -810,7 +814,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
810
814
|
|
|
811
815
|
_this6._sendActivity(Activity.Activate, activeDocumentContext);
|
|
812
816
|
|
|
813
|
-
_this6._triggerConfiguredSurvey(
|
|
817
|
+
_this6._triggerConfiguredSurvey(StandardActions.save, TriggerType.standardAction);
|
|
814
818
|
|
|
815
819
|
_this6._setEditMode(EditMode.Display, false);
|
|
816
820
|
|
|
@@ -923,7 +927,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
923
927
|
}();
|
|
924
928
|
});
|
|
925
929
|
}, function (oError) {
|
|
926
|
-
return Promise.reject("Error in EditFlow.toggleDraftActive:"
|
|
930
|
+
return Promise.reject("Error in EditFlow.toggleDraftActive:".concat(oError));
|
|
927
931
|
}));
|
|
928
932
|
} catch (e) {
|
|
929
933
|
return Promise.reject(e);
|
|
@@ -937,10 +941,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
937
941
|
*
|
|
938
942
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
939
943
|
* @param oContext Context of the editable document
|
|
940
|
-
* @param
|
|
941
|
-
* @param
|
|
942
|
-
* @param
|
|
943
|
-
* @returns
|
|
944
|
+
* @param mParameters Can contain the following attributes:
|
|
945
|
+
* @param mParameters.control This is the control used to open the discard popover
|
|
946
|
+
* @param mParameters.skipDiscardPopover Optional, supresses the discard popover and allows custom handling
|
|
947
|
+
* @returns Promise resolves once editable document has been discarded
|
|
944
948
|
* @alias sap.fe.core.controllerextensions.EditFlow#cancelDocument
|
|
945
949
|
* @public
|
|
946
950
|
* @since 1.90.0
|
|
@@ -1061,11 +1065,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1061
1065
|
* Deletes the document.
|
|
1062
1066
|
*
|
|
1063
1067
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1064
|
-
* @param
|
|
1065
|
-
* @param
|
|
1066
|
-
* @param
|
|
1067
|
-
* @param
|
|
1068
|
-
* @returns
|
|
1068
|
+
* @param oContext Context of the document
|
|
1069
|
+
* @param mInParameters Can contain the following attributes:
|
|
1070
|
+
* @param mInParameters.title Title of the object being deleted
|
|
1071
|
+
* @param mInParameters.description Description of the object being deleted
|
|
1072
|
+
* @returns Promise resolves once document has been deleted
|
|
1069
1073
|
* @alias sap.fe.core.controllerextensions.EditFlow#deleteDocument
|
|
1070
1074
|
* @public
|
|
1071
1075
|
* @since 1.90.0
|
|
@@ -1094,14 +1098,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1094
1098
|
EditState.setEditStateDirty();
|
|
1095
1099
|
}
|
|
1096
1100
|
|
|
1097
|
-
_this11._sendActivity(Activity.Delete, oContext);
|
|
1098
|
-
|
|
1099
|
-
_this11._getRoutingListener().navigateBackFromContext(oContext); // After delete is successfull, we need to dettch the setBackNavigation Methods
|
|
1101
|
+
_this11._sendActivity(Activity.Delete, oContext); // After delete is successfull, we need to detach the setBackNavigation Methods
|
|
1100
1102
|
|
|
1101
1103
|
|
|
1102
1104
|
if (oAppComponent) {
|
|
1103
1105
|
oAppComponent.getShellServices().setBackNavigation();
|
|
1104
1106
|
}
|
|
1107
|
+
|
|
1108
|
+
if ((oAppComponent === null || oAppComponent === void 0 ? void 0 : oAppComponent.getStartupMode()) === StartupMode.Deeplink && !_this11._isFclEnabled()) {
|
|
1109
|
+
// In case the app has been launched with semantic keys, deleting the object we've landed on shall navigate back
|
|
1110
|
+
// to the app we came from (except for FCL, where we navigate to LR as usual)
|
|
1111
|
+
oAppComponent.getRouterProxy().exitFromApp();
|
|
1112
|
+
} else {
|
|
1113
|
+
_this11._getRoutingListener().navigateBackFromContext(oContext);
|
|
1114
|
+
}
|
|
1105
1115
|
}).catch(function (oError) {
|
|
1106
1116
|
Log.error("Error while deleting the document", oError);
|
|
1107
1117
|
});
|
|
@@ -1110,8 +1120,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1110
1120
|
* Submit the current set of changes and navigate back.
|
|
1111
1121
|
*
|
|
1112
1122
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1113
|
-
* @param
|
|
1114
|
-
* @returns
|
|
1123
|
+
* @param oContext Context of the document
|
|
1124
|
+
* @returns Promise resolves once the changes have been saved
|
|
1115
1125
|
* @alias sap.fe.core.controllerextensions.EditFlow#applyDocument
|
|
1116
1126
|
* @public
|
|
1117
1127
|
* @since 1.90.0
|
|
@@ -1158,20 +1168,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1158
1168
|
* Invokes an action (bound or unbound) and tracks the changes so that other pages can be refreshed and show the updated data upon navigation.
|
|
1159
1169
|
*
|
|
1160
1170
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1161
|
-
* @param
|
|
1162
|
-
* @param
|
|
1163
|
-
* @param
|
|
1164
|
-
* @param
|
|
1165
|
-
* @param
|
|
1166
|
-
* @param
|
|
1167
|
-
* @param
|
|
1168
|
-
* @param
|
|
1169
|
-
* @returns
|
|
1171
|
+
* @param sActionName The name of the action to be called
|
|
1172
|
+
* @param mInParameters Contains the following attributes:
|
|
1173
|
+
* @param mInParameters.contexts For a bound action, a context or an array with contexts for which the action is to be called must be provided
|
|
1174
|
+
* @param mInParameters.model For an unbound action, an instance of an OData V4 model must be provided
|
|
1175
|
+
* @param mInParameters.requiresNavigation Boolean value indicating whether navigation is required after the action has been executed. Navigation takes place to the context returned by the action
|
|
1176
|
+
* @param mInParameters.label A human-readable label for the action. This is needed in case the action has a parameter and a parameter dialog is shown to the user. The label will be used for the title of the dialog and for the confirmation button
|
|
1177
|
+
* @param mInParameters.invocationGrouping Mode how actions are to be called: 'ChangeSet' to put all action calls into one changeset, 'Isolated' to put them into separate changesets
|
|
1178
|
+
* @param mExtraParams PRIVATE
|
|
1179
|
+
* @returns A promise once the action has been invoked
|
|
1170
1180
|
* @alias sap.fe.core.controllerextensions.EditFlow#invokeAction
|
|
1171
1181
|
* @public
|
|
1172
1182
|
* @since 1.90.0
|
|
1173
1183
|
* @final
|
|
1174
|
-
|
|
1184
|
+
*/
|
|
1175
1185
|
;
|
|
1176
1186
|
|
|
1177
1187
|
_proto.invokeAction = function invokeAction(sActionName, mInParameters, mExtraParams) {
|
|
@@ -1267,7 +1277,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1267
1277
|
}
|
|
1268
1278
|
|
|
1269
1279
|
if (!mParameters.contexts) {
|
|
1270
|
-
return Promise.reject("Context not found for entity type "
|
|
1280
|
+
return Promise.reject("Context not found for entity type ".concat(sOverloadEntityType));
|
|
1271
1281
|
}
|
|
1272
1282
|
}
|
|
1273
1283
|
}
|
|
@@ -1291,7 +1301,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1291
1301
|
}).then(function (oResponse) {
|
|
1292
1302
|
_this14._sendActivity(Activity.Action, mParameters.contexts);
|
|
1293
1303
|
|
|
1294
|
-
_this14._triggerConfiguredSurvey(sActionName,
|
|
1304
|
+
_this14._triggerConfiguredSurvey(sActionName, TriggerType.action);
|
|
1295
1305
|
|
|
1296
1306
|
if (oCurrentActionCallBacks) {
|
|
1297
1307
|
oCurrentActionCallBacks.fResolver(oResponse);
|
|
@@ -1349,10 +1359,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1349
1359
|
|
|
1350
1360
|
if (err == Constants.CancelActionDialog) {
|
|
1351
1361
|
return Promise.reject("Dialog cancelled.");
|
|
1352
|
-
} else {
|
|
1353
|
-
|
|
1354
|
-
return Promise.reject("Error in EditFlow.invokeAction:" + err);
|
|
1355
|
-
}
|
|
1362
|
+
} else if (!(err && (err.canceled || err.rejectedItems && err.rejectedItems[0].canceled))) {
|
|
1363
|
+
return Promise.reject("Error in EditFlow.invokeAction:".concat(err));
|
|
1356
1364
|
}
|
|
1357
1365
|
});
|
|
1358
1366
|
}
|
|
@@ -1360,13 +1368,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1360
1368
|
* Secured execution of the given function. Ensures that the function is only executed when certain conditions are fulfilled.
|
|
1361
1369
|
*
|
|
1362
1370
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1363
|
-
* @param
|
|
1364
|
-
* @param
|
|
1365
|
-
* @param
|
|
1366
|
-
* @param
|
|
1367
|
-
* @param
|
|
1368
|
-
* @param
|
|
1369
|
-
* @returns
|
|
1371
|
+
* @param fnFunction The function to be executed. Should return a promise that is settled after completion of the execution. If nothing is returned, immediate completion is assumed.
|
|
1372
|
+
* @param mParameters Definitions of the preconditions to be checked before execution
|
|
1373
|
+
* @param mParameters.busy Defines the busy indicator
|
|
1374
|
+
* @param mParameters.busy.set Triggers a busy indicator when the function is executed.
|
|
1375
|
+
* @param mParameters.busy.check Executes function only if application isn't busy.
|
|
1376
|
+
* @param mParameters.updatesDocument This operation updates the current document without using the bound model and context. As a result, the draft status is updated if a draft document exists, and the user has to confirm the cancellation of the editing process.
|
|
1377
|
+
* @returns A promise that is rejected if the execution is prohibited and resolved by the promise returned by the fnFunction.
|
|
1370
1378
|
* @alias sap.fe.core.controllerextensions.EditFlow#securedExecution
|
|
1371
1379
|
* @public
|
|
1372
1380
|
* @experimental As of version 1.90.0
|
|
@@ -1422,7 +1430,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1422
1430
|
BusyLocker.unlock(oLockObject);
|
|
1423
1431
|
}
|
|
1424
1432
|
|
|
1425
|
-
|
|
1433
|
+
_this15._getMessageHandler().showMessageDialog();
|
|
1426
1434
|
});
|
|
1427
1435
|
}
|
|
1428
1436
|
/**
|
|
@@ -1438,8 +1446,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1438
1446
|
if (!((_this$base$getView = this.base.getView()) !== null && _this$base$getView !== void 0 && (_this$base$getView$ge = _this$base$getView.getBindingContext("internal")) !== null && _this$base$getView$ge !== void 0 && _this$base$getView$ge.getProperty("skipPatchHandlers"))) {
|
|
1439
1447
|
// Create a promise that will be resolved or rejected when the path is completed
|
|
1440
1448
|
var oPatchPromise = new Promise(function (resolve, reject) {
|
|
1441
|
-
oEvent.getSource().attachEventOnce("patchCompleted", function (
|
|
1442
|
-
var bSuccess =
|
|
1449
|
+
oEvent.getSource().attachEventOnce("patchCompleted", function (patchCompletedEvent) {
|
|
1450
|
+
var bSuccess = patchCompletedEvent.getParameter("success");
|
|
1443
1451
|
|
|
1444
1452
|
if (bSuccess) {
|
|
1445
1453
|
resolve();
|
|
@@ -1545,7 +1553,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1545
1553
|
* @function
|
|
1546
1554
|
* @name _createActionPromise
|
|
1547
1555
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1548
|
-
*
|
|
1549
1556
|
* @returns {Function} The resolver function which can be used to externally resolve the promise
|
|
1550
1557
|
*/
|
|
1551
1558
|
;
|
|
@@ -1580,9 +1587,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1580
1587
|
* @function
|
|
1581
1588
|
* @name _getActionResponseDataAndKeys
|
|
1582
1589
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1583
|
-
* @param
|
|
1584
|
-
* @param
|
|
1585
|
-
* @returns
|
|
1590
|
+
* @param sActionName The name of the action that is executed
|
|
1591
|
+
* @param oResponse The bound action's response data or response context
|
|
1592
|
+
* @returns Object with data and names of the key fields of the response
|
|
1586
1593
|
*/
|
|
1587
1594
|
;
|
|
1588
1595
|
|
|
@@ -1733,9 +1740,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1733
1740
|
* @function
|
|
1734
1741
|
* @name _refreshListIfRequired
|
|
1735
1742
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1736
|
-
* @param
|
|
1737
|
-
* @param
|
|
1738
|
-
* @returns
|
|
1743
|
+
* @param oResponse The response of the bound action and the names of the key fields
|
|
1744
|
+
* @param oContext The bound context on which the action was executed
|
|
1745
|
+
* @returns Always resolves to param oResponse
|
|
1739
1746
|
*/
|
|
1740
1747
|
;
|
|
1741
1748
|
|
|
@@ -1917,19 +1924,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1917
1924
|
}
|
|
1918
1925
|
}
|
|
1919
1926
|
/**
|
|
1920
|
-
* This methods creates a sibling context for a
|
|
1927
|
+
* This methods creates a sibling context for a subobject page, and calculates a sibling path for
|
|
1921
1928
|
* all intermediates paths between the OP and the sub-OP.
|
|
1922
1929
|
*
|
|
1923
|
-
* @param
|
|
1924
|
-
* @param
|
|
1925
|
-
* @param
|
|
1926
|
-
* @param
|
|
1927
|
-
* @returns
|
|
1930
|
+
* @param rootCurrentContext The context for the root of the draft
|
|
1931
|
+
* @param rightmostCurrentContext The context of the subobject
|
|
1932
|
+
* @param sProgrammingModel The programming model
|
|
1933
|
+
* @param doNotComputeIfRoot If true, we don't compute siblingInfo if the root and the rightmost contexts are the same
|
|
1934
|
+
* @returns Returns the siblingInformation object
|
|
1928
1935
|
*/
|
|
1929
1936
|
;
|
|
1930
1937
|
|
|
1931
1938
|
_proto._computeSiblingInformation = function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot) {
|
|
1932
1939
|
try {
|
|
1940
|
+
var _rightmostCurrentCont;
|
|
1941
|
+
|
|
1942
|
+
rightmostCurrentContext = (_rightmostCurrentCont = rightmostCurrentContext) !== null && _rightmostCurrentCont !== void 0 ? _rightmostCurrentCont : rootCurrentContext;
|
|
1943
|
+
|
|
1933
1944
|
if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
|
|
1934
1945
|
// Wrong usage !!
|
|
1935
1946
|
Log.error("Cannot compute rightmost sibling context");
|
|
@@ -1965,4 +1976,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1965
1976
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteMultipleDocuments", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteMultipleDocuments"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "toggleDraftActive", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "toggleDraftActive"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec32, _dec33], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handlePatchSent", [_dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "handlePatchSent"), _class2.prototype)), _class2)) || _class);
|
|
1966
1977
|
return EditFlow;
|
|
1967
1978
|
}, false);
|
|
1968
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJmaW5hbGl6ZXIiLCJiaW5kIiwiQ3JlYXRpb25Nb2RlIiwiRkVMaWJyYXJ5IiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkNvbnN0YW50cyIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJNZXNzYWdlVHlwZSIsImNvcmVMaWJyYXJ5IiwiRWRpdEZsb3ciLCJkZWZpbmVVSTVDbGFzcyIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJlZGl0RG9jdW1lbnQiLCJvQ29udGV4dCIsImJEcmFmdE5hdmlnYXRpb24iLCJ0cmFuc2FjdGlvbkhlbHBlciIsIl9nZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwicmlnaHRtb3N0Q29udGV4dCIsImJhc2UiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJnZXRWaWV3IiwiX2dldE1lc3NhZ2VIYW5kbGVyIiwib05ld0RvY3VtZW50Q29udGV4dCIsInNQcm9ncmFtbWluZ01vZGVsIiwiX2dldFByb2dyYW1taW5nTW9kZWwiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsImdldE1vZGVsIiwiX3NldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzaG93TWVzc2FnZURpYWxvZyIsIl9oYW5kbGVOZXdDb250ZXh0IiwiY29udGV4dFRvTmF2aWdhdGUiLCJTdGlja3kiLCJfaGFuZGxlU3RpY2t5T24iLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic2libGluZ0luZm8iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJkZWxldGVNdWx0aXBsZURvY3VtZW50cyIsImFDb250ZXh0cyIsIm1QYXJhbWV0ZXJzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImdldENvbnRyb2xsZXIiLCJfZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIm9Qcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiYklzRHJhZnQiLCJEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIl9zeW5jVGFzayIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiX3NldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXROYW1lIiwiZ2V0TWV0YUNvbnRleHQiLCJnZXRPYmplY3QiLCJhU2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJsZW5ndGgiLCJvQ3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJzQ3VycmVudFNlbWFudGljUGF0aCIsInNlbWFudGljUGF0aCIsInNDaGFuZ2VkUGF0aCIsImdldFNlbWFudGljUGF0aCIsIlNhdmVkIiwiQ2xlYXIiLCJjYXRjaCIsImZpbmFsbHkiLCJzaG93TWVzc2FnZXMiLCJjcmVhdGVEb2N1bWVudCIsInZMaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJvTG9ja09iamVjdCIsIl9nZXRHbG9iYWxVSU1vZGVsIiwib1RhYmxlIiwib1Jlc291cmNlQnVuZGxlIiwiX2dldFJlc291cmNlQnVuZGxlIiwiYlNob3VsZEJ1c3lMb2NrIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lIiwiQ3JlYXRpb25Sb3ciLCJFeHRlcm5hbCIsIm9FeGVjQ3VzdG9tVmFsaWRhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwib0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJvQ29udHJvbGxlciIsInNDcmVhdGVQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNldFByb3BlcnR5IiwidGFibGVJZCIsImJ5SWQiLCJoYW5kbGVTaWRlRWZmZWN0cyIsIm9MaXN0QmluZGluZyIsIm9DcmVhdGlvblByb21pc2UiLCJvTmV3Q29udGV4dCIsImNyZWF0ZWQiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJtQ3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsIkVycm9yIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyIsImFkZENvbnRyb2xJZCIsInB1c2giLCJ0ZXh0IiwiY3VzdG9tTWVzc2FnZXMiLCJCdXN5TG9ja2VyIiwibG9jayIsIk9EYXRhTGlzdEJpbmRpbmciLCJTeW5jIiwiY3JlYXRlQXRFbmQiLCJvTW9kZWwiLCJzQ3JlYXRpb25Nb2RlIiwicHJvZ3JhbW1pbmdNb2RlbCIsIk5ld1BhZ2UiLCJpc1JlbGF0aXZlIiwic1BhdGgiLCJzTmV3QWN0aW9uIiwiYVBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJBc3luYyIsIm9DcmVhdGlvbiIsIm1BcmdzIiwib0NyZWF0aW9uUm93Iiwib0NyZWF0aW9uUm93Q29udGV4dCIsIm9WYWxpZGF0aW9uQ2hlY2siLCJvUGF5bG9hZCIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJfZ2V0Um91dGluZ0xpc3RlbmVyIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJfaGFuZGxlQ3JlYXRlRXZlbnRzIiwicGFyZW50Q29udHJvbCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJvTmF2aWdhdGlvbiIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJlZGl0YWJsZSIsImJGb3JjZUZvY3VzIiwiYXN5bmNDb250ZXh0IiwiY3JlYXRlQWN0aW9uIiwidHJhbnNpZW50IiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJiU2tpcFNpZGVFZmZlY3RzIiwib05ld1RyYW5zaWVudENvbnRleHQiLCJjcmVhdGUiLCJzZXRCaW5kaW5nQ29udGV4dCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJ1bmxvY2siLCJyZWplY3QiLCJiSXNOZXdQYWdlQ3JlYXRpb24iLCJhbGwiLCJhUGFyYW1zIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiQ3JlYXRlIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiQ2FuY2VsQWN0aW9uRGlhbG9nIiwiY2FuY2VsZWQiLCJyZWplY3RlZEl0ZW1zIiwiaXNBIiwiZm5Gb2N1c09yU2Nyb2xsIiwiZm9jdXNSb3ciLCJzY3JvbGxUb0luZGV4IiwiZ2V0Um93QmluZGluZyIsImF0dGFjaEV2ZW50T25jZSIsImdldExlbmd0aCIsIm9uQmVmb3JlU2F2ZSIsIm9uQmVmb3JlRGlzY2FyZCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwic3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsInRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5IiwiaXNGY2xFbmFibGVkIiwidG9nZ2xlRHJhZnRBY3RpdmUiLCJvQ29udGV4dERhdGEiLCJiRWRpdGFibGUiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJuZXdQYXRoIiwib2xkUGF0aCIsImNhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY29udHJvbCIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJkZWxldGVEb2N1bWVudCIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJfZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsIkRlbGV0ZSIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsImFwcGx5RG9jdW1lbnQiLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsIm9Db250cm9sIiwib0N1cnJlbnRDb250cm9sIiwiYVBhcnRzIiwic092ZXJsb2FkRW50aXR5VHlwZSIsIm9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzIiwib1ZpZXciLCJBcnJheSIsImlzQXJyYXkiLCJhcmd1bWVudHMiLCJjb250ZXh0cyIsIm1vZGVsIiwiaXNOYXZpZ2FibGUiLCJyZXF1aXJlc05hdmlnYXRpb24iLCJjb250cm9sSWQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImluZGV4T2YiLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwicGF0aCIsInNUYWJsZUNvbnRleHRFbnRpdHlUeXBlIiwib0FjdGlvbk92ZXJsb2FkQ29udGV4dCIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMiLCJlbmFibGVBdXRvU2Nyb2xsIiwiX2NyZWF0ZUFjdGlvblByb21pc2UiLCJzSWQiLCJiR2V0Qm91bmRDb250ZXh0IiwiX2dldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZ2V0Vmlld0RhdGEiLCJjb252ZXJ0ZXJUeXBlIiwiY2FsbEFjdGlvbiIsIm9SZXNwb25zZSIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsIkFjdGlvbiIsImFjdGlvbiIsImZSZXNvbHZlciIsIl9nZXRJbnRlcm5hbE1vZGVsIiwidkNvbnRleHQiLCJzQ29udGV4dE1ldGFQYXRoIiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwibm9IaXN0b3J5RW50cnkiLCJpbmZvIiwiZXJyIiwiZlJlamVjdG9yIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50Iiwib1BhdGNoUHJvbWlzZSIsImdldFNvdXJjZSIsImJTdWNjZXNzIiwiZ2V0UGFyYW1ldGVyIiwiaGFuZGxlQ3JlYXRlQWN0aXZhdGUiLCJvQmluZGluZyIsImJBdEVuZCIsImJJbmFjdGl2ZSIsIm9QYXJhbXMiLCJpbmFjdGl2ZSIsInNFZGl0TW9kZSIsImJDcmVhdGlvbk1vZGUiLCJzZXRFZGl0TW9kZSIsInNEcmFmdFN0YXRlIiwic2V0RHJhZnRTdGF0dXMiLCJnZXRSb3V0aW5nTGlzdGVuZXIiLCJnZXRHbG9iYWxVSU1vZGVsIiwidlRhc2siLCJzeW5jVGFzayIsImdldFByb2dyYW1taW5nTW9kZWwiLCJkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiZ2V0VHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRJbnRlcm5hbE1vZGVsIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwic0NvbnRyb2xJZCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJfZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsIl9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJyZWxhdGVkQ29udGV4dHMiLCJjb250ZW50IiwibWFwIiwic2VuZCIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsInN1Ym1pdEJhdGNoIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImhhbmRsZVN0aWNreU9uIiwiX2hhbmRsZVN0aWNreU9mZiIsImhhbmRsZVN0aWNreU9mZiIsIl9vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIl9kaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiaW50ZXJuYWxNb2RlbCIsImdldEh0dHBIZWFkZXJzIiwiYlJlY3JlYXRlQ29udGV4dCIsImJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eSIsIm5hdmlnYXRlVG9Db250ZXh0IiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJ2aWV3IiwicGFyYW1zIiwidmlld0xldmVsIiwiYlJlZnJlc2hBZnRlckFjdGlvbiIsInNWaWV3SWQiLCJnZXRJZCIsImFNZXNzYWdlcyIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImkiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib0RhdGEiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJpc1Jvb3QiLCJyZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJnZXRDb250ZXh0IiwiYVJlcXVlc3RQcm9taXNlcyIsIm9LZXkiLCJyZXF1ZXN0T2JqZWN0IiwiJFByb3BlcnR5UGF0aCIsImFQYWdlcyIsIm9GQ0wiLCJnZXRSb290Q29udGFpbmVyIiwiY29uY2F0IiwiZ2V0TWlkQ29sdW1uUGFnZXMiLCJnZXRFbmRDb2x1bW5QYWdlcyIsIm9OYXZDb250YWluZXIiLCJnZXRQYWdlcyIsIm9QYWdlIiwiZ2V0Q29tcG9uZW50SW5zdGFuY2UiLCJfY2hlY2tBY3Rpb25zIiwiYUFjdGlvbnMiLCJvQWN0aW9uQmluZGluZ0NvbnRleHQiLCJvQWN0aW9uIiwiX2NoZWNrU3ViU2VjdGlvbnMiLCJhU3ViU2VjdGlvbnMiLCJvU3ViU2VjdGlvbiIsImdldEFnZ3JlZ2F0aW9uIiwiY3VycmVudENvbnRleHQiLCJuZXdDb250ZXh0IiwibWFwcGluZ3MiLCJzZXRQYXRoTWFwcGluZyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IiwiZG9Ob3RDb21wdXRlSWZSb290Iiwic3RhcnRzV2l0aCIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFDckMsUUFBSTtBQUNILFVBQUlDLE1BQU0sR0FBR0YsSUFBSSxF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emIsWUFBQUEsV0FBVyxFQUFFO0FBRlAsV0FBUDtBQUlBO0FBQ0QsTzs7Ozs7V0FDRE4sYSxHQUFBLHlCQUF5QjtBQUN4QixhQUFPc0UsV0FBVyxDQUFDQyxlQUFaLENBQTRCLEtBQUtyRixPQUFMLEVBQTVCLEVBQTRDYyxhQUE1QyxFQUFQO0FBQ0EsSzs7O0lBOXdEcUJnYyxtQjtTQWl4RFJqZSxRIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBGbGV4aWJsZUNvbHVtbkxheW91dCBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCBkcmFmdCwgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1vZGVsSGVscGVyLCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgc3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgdHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9GZWVkYmFja1wiO1xuaW1wb3J0IE5hdkNvbnRhaW5lciBmcm9tIFwic2FwL20vTmF2Q29udGFpbmVyXCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHsgQ29yZUV4IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlLFxuXHRQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2VkaXREb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dDtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChvQ29udGV4dCwgdGhpcy5nZXRWaWV3KCksIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsLCBvQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpO1xuXG5cdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIHJpZ2h0bW9zdENvbnRleHQsIHNQcm9ncmFtbWluZ01vZGVsLCB0cnVlKTtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9IG9OZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB0cnVlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9uKG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRkZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHM6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmIChtUGFyYW1ldGVycykge1xuXHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoYUNvbnRleHRzLCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Qcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3VwZGF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVwZGF0ZURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QsIG9Qcm9taXNlOiBQcm9taXNlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYklzRHJhZnQgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRyZXR1cm4gb1Byb21pc2Vcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0XHQvLyBJbiB0aGF0IGNhc2UsIHdlIHNob3VsZG4ndCBkbyBhbnl0aGluZ1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0ID09PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0TmFtZSA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YUNvbnRleHQob0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRcdFx0XHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdHNDdXJyZW50U2VtYW50aWNQYXRoID0gb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgJiYgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKG9CaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gc0N1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRcdFx0XHRpZiAoc0N1cnJlbnRTZW1hbnRpY1BhdGggJiYgc0N1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2hhbmRsZU5ld0NvbnRleHQob0JpbmRpbmdDb250ZXh0LCB0cnVlLCBmYWxzZSwgdHJ1ZSkudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGJJc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ3xzdHJpbmd9IHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSB7bWFwfSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWRcblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSlcblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIHtib29sZWFufSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NyZWF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0bGV0IG9UYWJsZTogYW55OyAvL3Nob3VsZCBiZSBUYWJsZSBidXQgdGhlcmUgYXJlIG1pc3NpbmcgbWV0aG9kcyBpbnRvIHRoZSBkZWZcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBiU2hvdWxkQnVzeUxvY2sgPVxuXHRcdFx0IW1QYXJhbWV0ZXJzIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKTtcblx0XHRsZXQgb0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdC8vIENyZWF0ZSBieSBuYXZpZ2F0aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldFxuXHRcdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCksXG5cdFx0XHRcdFx0c0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5nZXRWaWV3KCksIHZMaXN0QmluZGluZyk7XG5cblx0XHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0cmFuc2FjdGlvbkhlbHBlci52YWxpZGF0ZURvY3VtZW50KFxuXHRcdFx0XHRvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiAob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KClcblx0XHRcdCk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmICgob1RhYmxlLmdldENyZWF0aW9uUm93KCkgYXMgYW55KS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmd9IG9MaXN0QmluZGluZ1xuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ3JlYXRpb25Qcm9taXNlXG5cdFx0ICovXG5cdFx0Y29uc3QgaGFuZGxlU2lkZUVmZmVjdHMgPSAob0xpc3RCaW5kaW5nOiBhbnksIG9DcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4pID0+IHtcblx0XHRcdG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9OZXdDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBhVmFsaWRhdGlvbk1lc3NhZ2VzIEVycm9yIG1lc3NhZ2VzIGZyb20gY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0XHQgKi9cblx0XHRjb25zdCBjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAoYVZhbGlkYXRpb25NZXNzYWdlczogYW55W10pID0+IHtcblx0XHRcdGNvbnN0IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSBvVGFibGUgJiYgKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpIGFzIGFueSkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKTtcblx0XHRcdGNvbnN0IG1DdXN0b21WYWxpZGl0eSA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uZ2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIpO1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpO1xuXHRcdFx0Y29uc3QgYUN1c3RvbU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0bGV0IG9GaWVsZENvbnRyb2w7XG5cdFx0XHRsZXQgc1RhcmdldDogc3RyaW5nO1xuXG5cdFx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob01lc3NhZ2UuY29kZSA9PT0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbikge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRhVmFsaWRhdGlvbk1lc3NhZ2VzLmZvckVhY2goKG9WYWxpZGF0aW9uTWVzc2FnZTogYW55KSA9PiB7XG5cdFx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0aWYgKG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdFx0b0ZpZWxkQ29udHJvbCA9IENvcmUuZ2V0Q29udHJvbChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpIGFzIENvbnRyb2w7XG5cdFx0XHRcdFx0c1RhcmdldCA9IG9GaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpICsgXCIvXCIgKyBvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIik7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR9KS5sZW5ndGggPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldDogc1RhcmdldFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyIHJ1bmFibGVcblx0XHRcdFx0XHRjb25zdCBhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdHRleHQ6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFDdXN0b21NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBhQ3VzdG9tTWVzc2FnZXNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGJTaG91bGRCdXN5TG9jayAmJiBCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhvRXhlY0N1c3RvbVZhbGlkYXRpb24pXG5cdFx0XHQudGhlbigoYVZhbGlkYXRpb25NZXNzYWdlczogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMoYVZhbGlkYXRpb25NZXNzYWdlcyk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmc7XG5cdFx0XHRcdGxldCBvTGlzdEJpbmRpbmc6IGFueTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0XHRcdGlmICh2TGlzdEJpbmRpbmcgJiYgdHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuU3luYztcblx0XHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzQ3JlYXRpb25Nb2RlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlO1xuXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpKVxuXHRcdFx0XHRcdC50aGVuKChwcm9ncmFtbWluZ01vZGVsOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID0gcHJvZ3JhbW1pbmdNb2RlbDtcblx0XHRcdFx0XHRcdGlmIChzQ3JlYXRpb25Nb2RlICYmIHNDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNDcmVhdGlvbk1vZGU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvblwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgc05ld0FjdGlvbiArIFwiL0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlclwiKSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRzTWV0YVBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKChzQ3JlYXRpb25Nb2RlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGxldCBvQ3JlYXRpb246IGFueTtcblx0XHRcdFx0XHRcdGxldCBtQXJnczogYW55O1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0XHRcdFx0XHRsZXQgb0NyZWF0aW9uUm93Q29udGV4dDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IG9WYWxpZGF0aW9uQ2hlY2sgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdGxldCBvUGF5bG9hZDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblxuXHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5EZWZlcnJlZCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoc0NyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KSB7XG5cdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93Q29udGV4dCA9IG9DcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIHByZWZpbGwgZGF0YSBmcm9tIGNyZWF0aW9uIHJvd1xuXHRcdFx0XHRcdFx0XHRcdG9QYXlsb2FkID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0ge307XG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMob1BheWxvYWQpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoICsgXCIvXCIgKyBzUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhW3NQcm9wZXJ0eVBhdGhdID0gb1BheWxvYWRbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0b1ZhbGlkYXRpb25DaGVjayA9IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygvKm9DcmVhdGlvblJvd0NvbnRleHQqLyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHNDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyB8fCBzQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lKSB7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTG9jYWxcIjtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uID0gb1ZhbGlkYXRpb25DaGVjay50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGU7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHNDcmVhdGlvbk1vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhc3luY0NvbnRleHQ6IG9DcmVhdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdFx0XHRcdFx0XHRtQXJncyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1BcmdzLnRyYW5zaWVudCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uLnRoZW4oZnVuY3Rpb24gKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LCBtQXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3luY1Rhc2sob0NyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGNyZWF0aW9uIHJvdyBzaGFsbCBiZSBjbGVhcmVkIG9uY2UgdGhlIHZhbGlkYXRpb24gY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgYW5kXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlcmVmb3JlIHRoZSBQT1NUIGNhbiBiZSBzZW50IGFzeW5jIHRvIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvVmFsaWRhdGlvbkNoZWNrXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9OZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoXCJVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiICsgc0NyZWF0aW9uTW9kZSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0XHRcdGlmIChvQ3JlYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtvQ3JlYXRpb24sIG9OYXZpZ2F0aW9uXSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbigoYVBhcmFtczogW2FueSwgYW55XSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb01vZGVsKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJJc05ld1BhZ2VDcmVhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgYklzTmV3UGFnZUNyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhUGFyYW1zWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXJyb3IuY2FuY2VsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob0Vycm9yLnJlamVjdGVkSXRlbXMgJiYgb0Vycm9yLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKVxuXHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGZuRm9jdXNPclNjcm9sbCA9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgPyBvVGFibGUuZm9jdXNSb3cuYmluZChvVGFibGUpIDogb1RhYmxlLnNjcm9sbFRvSW5kZXguYmluZChvVGFibGUpO1xuXHRcdFx0XHRcdG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRiU2hvdWxkQnVzeUxvY2sgJiYgQnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVNhdmUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7bWFwfSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlQ3JlYXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZUVkaXQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNjYXJkZWQuXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZURpc2NhcmQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIHtBcnJheX0gbVBhcmFtZXRlcnMuY29udGV4dHMgQW4gYXJyYXkgb2YgY29udGV4dHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGVsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGVsZXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzYXZlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0XHRjb25zdCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIHx8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBhQmluZGluZ3MgPSBtUGFyYW1ldGVycy5iaW5kaW5ncztcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3RpdmF0ZSwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHN0YW5kYXJkQWN0aW9ucy5zYXZlLCB0cmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShiRWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nIS5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgYkVkaXRhYmxlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6XCIgKyBvRXJyb3IpIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIHttYXB9IG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NhbmNlbERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogeyBjb250cm9sOiBvYmplY3Q7IHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW4gfSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgbUluUGFyYW1ldGVyczogYW55ID0gbVBhcmFtZXRlcnM7XG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cblx0XHRtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b247XG5cdFx0bUluUGFyYW1ldGVycy5iZWZvcmVDYW5jZWxDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURpc2NhcmQ7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRpZiAoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cblx0XHRcdHRoaXMuX3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzKCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdGlmICghb0FjdGl2ZURvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgdW5kZWZpbmVkKTtcblx0XHRcdFx0Ly9pbiBjYXNlIG9mIGEgbmV3IGRvY3VtZW50LCBubyBhY3RpdmVDb250ZXh0IGlzIHJldHVybmVkIC0tPiBuYXZpZ2F0ZSBiYWNrLlxuXHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCB0cnVlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vYWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnRcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIHtvYmplY3R9IG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZGVsZXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRyZXR1cm4gdGhpcy5fZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdFx0dGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0dGNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWx9IG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjaW52b2tlQWN0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICoqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0aW52b2tlQWN0aW9uKFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVycz86IHtcblx0XHRcdGNvbnRleHRzPzogQ29udGV4dCB8IENvbnRleHRbXTtcblx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IGFueVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0NvbnRyb2w6IGFueTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDtcblx0XHRsZXQgb0JpbmRpbmdDb250ZXh0O1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOiBhbnk7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoKG1QYXJhbWV0ZXJzLmlzQSAmJiBtUGFyYW1ldGVycy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHwgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0Y29uc3QgY29udGV4dHMgPSBtUGFyYW1ldGVycztcblx0XHRcdG1QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSAoYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXSBhcyBhbnkpLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHNCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3Qgc1RhYmxlQ29udGV4dEVudGl0eVR5cGUgPSBtUGFyYW1ldGVycy5jb250ZXh0c1xuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFDb250ZXh0KG1QYXJhbWV0ZXJzLmNvbnRleHRzLmdldFBhdGgoKSlcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIik7XG5cdFx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICE9PSBzVGFibGVDb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBpbiBjb250cm9sIHRyZWUgaGllcmFyY2h5XG5cdFx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHRcdFx0d2hpbGUgKG9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0ID0gb0N1cnJlbnRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCAmJlxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQmluZGluZ0NvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgcGFyZW50XG5cdFx0XHRcdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9DdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gY29udGV4dCB3YXMgbm90IGZvdW5kIGluIFVJIGhpZXJhcmNoeSBnb2luZyBzdHJhaWdodCB1cHdhcmRzIC0gdHJ5IHRvIGZpbmQgaXQgaW4gU3ViU2VjdGlvbnNcblx0XHRcdFx0XHRpZiAoIW9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbk92ZXJsb2FkQ29udGV4dCA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyhvQ29udHJvbCwgc092ZXJsb2FkRW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbk92ZXJsb2FkQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0FjdGlvbk92ZXJsb2FkQ29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJDb250ZXh0IG5vdCBmb3VuZCBmb3IgZW50aXR5IHR5cGUgXCIgKyBzT3ZlcmxvYWRFbnRpdHlUeXBlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLl9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5zSWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4odHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbi5iaW5kKHRyYW5zYWN0aW9uSGVscGVyLCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMsIHRoaXMuZ2V0VmlldygpLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpKSlcblx0XHRcdC50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBpZiB0aGUgcmV0dXJuZWQgY29udGV4dCBmb3IgdGhlIGJvdW5kIGFjdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udGV4dCBvbiB3aGljaCBhY3Rpb24gd2FzIGNhbGxlZCxcblx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgY29ycmVzcG9uZGluZyBsaXN0IGJpbmRpbmdcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHRcdHRoaXMuX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHRcdCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Lypcblx0XHRcdFx0XHQgV2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHQgVE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHQgVGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHQgT25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHQgaXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHQgd2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHQgYXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdCB3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHQgd2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHQgZmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJEaWFsb2fCoGNhbmNlbGxlZC5cIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCEoZXJyICYmIChlcnIuY2FuY2VsZWQgfHwgKGVyci5yZWplY3RlZEl0ZW1zICYmIGVyci5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246XCIgKyBlcnIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0ICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LnNldCA6IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LmNoZWNrICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LmNoZWNrIDogdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIGFueSkudXBkYXRlc0RvY3VtZW50KSB8fCBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhmbkZ1bmN0aW9uKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCkuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogYW55KSB7XG5cdFx0aWYgKCEodGhpcy5iYXNlLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdC8vIENyZWF0ZSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhlIHBhdGggaXMgY29tcGxldGVkXG5cdFx0XHRjb25zdCBvUGF0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChvRXZlbnQuZ2V0U291cmNlKCksIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBDcmVhdGVBY3RpdmF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudFxuXHQgKi9cblx0aGFuZGxlQ3JlYXRlQWN0aXZhdGUob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYkF0RW5kID0gdHJ1ZTtcblx0XHRjb25zdCBiSW5hY3RpdmUgPSB0cnVlO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3Qgb1BhcmFtczogYW55ID0ge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuSW5saW5lLFxuXHRcdFx0Y3JlYXRlQXRFbmQ6IGJBdEVuZCxcblx0XHRcdGluYWN0aXZlOiBiSW5hY3RpdmUsXG5cdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdGJ1c3lNb2RlOiBcIk5vbmVcIlxuXHRcdH07XG5cdFx0dHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQob0JpbmRpbmcsIG9QYXJhbXMsIG9SZXNvdXJjZUJ1bmRsZSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSwgZmFsc2UsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qXG5cdFx0XHQgVE8gQkUgQ0hFQ0tFRCAvIERJU0NVU1NFRFxuXHRcdFx0IF9jcmVhdGVNdWx0aXBsZURvY3VtZW50cyBhbmQgZGVsZXRlTXVsdGlEb2N1bWVudCAtIGNvdWxkbid0IHdlIGNvbWJpbmUgdGhlbSB3aXRoIGNyZWF0ZSBhbmQgZGVsZXRlIGRvY3VtZW50P1xuXHRcdFx0IF9jcmVhdGVBY3Rpb25Qcm9taXNlIGFuZCBkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSAtPiBuZXh0IHN0ZXBcblxuXHRcdFx0ICovXG5cblx0X3NldEVkaXRNb2RlKHNFZGl0TW9kZTogYW55LCBiQ3JlYXRpb25Nb2RlPzogYm9vbGVhbikge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldEVkaXRNb2RlKHNFZGl0TW9kZSwgYkNyZWF0aW9uTW9kZSk7XG5cdH1cblxuXHRfc2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGU6IGFueSkge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnNldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlKTtcblx0fVxuXG5cdF9nZXRSb3V0aW5nTGlzdGVuZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFJvdXRpbmdMaXN0ZW5lcigpO1xuXHR9XG5cblx0X2dldEdsb2JhbFVJTW9kZWwoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEdsb2JhbFVJTW9kZWwoKTtcblx0fVxuXHRfc3luY1Rhc2sodlRhc2s/OiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc3luY1Rhc2sodlRhc2spO1xuXHR9XG5cblx0X2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0fVxuXG5cdF9kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0X2hhbmRsZUNyZWF0ZUV2ZW50cyhvQmluZGluZzogYW55KSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuaGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nKTtcblx0fVxuXG5cdF9nZXRUcmFuc2FjdGlvbkhlbHBlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0fVxuXG5cdF9nZXRJbnRlcm5hbE1vZGVsKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VCdW5kbGUoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgYW55KS5vUmVzb3VyY2VCdW5kbGU7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY3JlYXRlQWN0aW9uUHJvbWlzZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICpcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXG5cdF9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lOiBhbnksIHNDb250cm9sSWQ6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBzQ29udHJvbElkKTtcblx0fVxuXG5cdF9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTtcblx0fVxuXG5cdF9nZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKTtcblx0fVxuXG5cdF9zZW5kQWN0aXZpdHkoYWN0aW9uOiBBY3Rpdml0eSwgcmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdHNlbmQodGhpcy5nZXRWaWV3KCksIGFjdGlvbiwgY29udGVudCk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IHRyaWdnZXJUeXBlKSB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdF9nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9SZXNwb25zZTogb2JqZWN0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IGFueSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZVN0aWNreU9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9uKG9Db250ZXh0KTtcblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPZmYoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JblNlc3Npb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93Lm9uQmFja05hdmlnYXRpb25JblNlc3Npb24oKTtcblx0fVxuXG5cdF9kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihvQ29udGV4dCk7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBhbnksIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX2dldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPZmYoLypvQ29udGV4dCovKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogYW55LFxuXHRcdGJFZGl0YWJsZTogYm9vbGVhbixcblx0XHRiUmVjcmVhdGVDb250ZXh0OiBib29sZWFuLFxuXHRcdGJEcmFmdE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXM/OiBib29sZWFuLFxuXHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eT86IGJvb2xlYW5cblx0KSB7XG5cdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZSxcblx0XHRcdGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eTogYk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IGFueSwgcGFyYW1zOiBhbnkpIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSAodmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBpZiB0aGVyZSBhcmUgbm8gdmFsaWRhdGlvbiBlcnJvcnMsIGFuZCByZWplY3RzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIGVycm9yc1xuXHQgKi9cblxuXHRfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCkge1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cdFx0XHRsZXQgb01lc3NhZ2U7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiTm8gdmFsaWRhdGlvbiBlcnJvcnMgZm91bmRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9NZXNzYWdlID0gYU1lc3NhZ2VzW2ldO1xuXHRcdFx0XHRpZiAob01lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gQ29yZS5ieUlkKG9NZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udHJvbC5nZXRJZCgpID09PSBzVmlld0lkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX3JlZnJlc2hMaXN0SWZSZXF1aXJlZFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHtvYmplY3R9IG9SZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2YgdGhlIGJvdW5kIGFjdGlvbiBhbmQgdGhlIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBbHdheXMgcmVzb2x2ZXMgdG8gcGFyYW0gb1Jlc3BvbnNlXG5cdCAqL1xuXHRfcmVmcmVzaExpc3RJZlJlcXVpcmVkKG9SZXNwb25zZTogYW55LCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdC8vIHJlZnJlc2ggb25seSBsaXN0c1xuXHRcdGlmIChvQmluZGluZyAmJiBvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb1Jlc3BvbnNlLm9EYXRhO1xuXHRcdFx0Y29uc3QgYUtleXMgPSBvUmVzcG9uc2Uua2V5cztcblx0XHRcdGNvbnN0IG9DdXJyZW50RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0bGV0IGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSB0cnVlO1xuXHRcdFx0Ly8gZW5zdXJlIGNvbnRleHQgaXMgaW4gdGhlIHJlc3BvbnNlXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0NvbnRleHREYXRhKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gY2hlY2sgaWYgY29udGV4dCBpbiByZXNwb25zZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgYm91bmQgY29udGV4dFxuXHRcdFx0XHRiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvQ3VycmVudERhdGFbc0tleV0gPT09IG9Db250ZXh0RGF0YVtzS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmICghYlJldHVybmVkQ29udGV4dElzU2FtZSkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKChvQmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIiwgZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcmVzb2x2ZSB3aXRoIG9SZXNwb25zZSB0byBub3QgZGlzdHVyYiB0aGUgcHJvbWlzZSBjaGFpbiBhZnRlcndhcmRzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0X2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIGFueSxcblx0XHRcdHNFbnRpdHlTZXROYW1lID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cblx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgYVJlcXVlc3RQcm9taXNlcyA9IGFTZW1hbnRpY0tleXMubWFwKGZ1bmN0aW9uIChvS2V5OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RPYmplY3Qob0tleS4kUHJvcGVydHlQYXRoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoYVJlcXVlc3RQcm9taXNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdH1cblxuXHQvLyBVZ2x5IFdvcmthcm91bmQgdG8gb3ZlcmNvbWUgbWRjIGZpZWxkIGlzc3VlLCB3ZSByZW1vdmUgdGhlIGJpbmRpbmcgY29udGV4dCBiZWZvcmVcblx0Ly8gc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZSB0byBhdm9pZCB0aGUgZmllbGQgcmVhZHMgYWRkaXRpb25hbCB2YWx1ZXMgZm9yIG5vbiBleGlzdGluZ1xuXHQvLyBkcmFmdHMgb3Igc3RpY2t5IHNlc3Npb25zIGluIHRoZSBiYWNrZW5kXG5cdF9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpIHtcblx0XHRsZXQgYVBhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRjb25zdCBvRkNMID0gb0FwcENvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgYXMgRmxleGlibGVDb2x1bW5MYXlvdXQ7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0TWlkQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0XHRhUGFnZXMgPSBhUGFnZXMuY29uY2F0KG9GQ0wuZ2V0RW5kQ29sdW1uUGFnZXMoKSB8fCBbXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9OYXZDb250YWluZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXI7XG5cdFx0XHRhUGFnZXMgPSBvTmF2Q29udGFpbmVyLmdldFBhZ2VzKCkgfHwgW107XG5cdFx0fVxuXG5cdFx0YVBhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9QYWdlOiBhbnkpIHtcblx0XHRcdGlmIChvUGFnZS5pc0EoXCJzYXAudWkuY29yZS5Db21wb25lbnRDb250YWluZXJcIikpIHtcblx0XHRcdFx0b1BhZ2UgPSBvUGFnZS5nZXRDb21wb25lbnRJbnN0YW5jZSgpOyAvLyBUaGUgYmluZGluZyBjb250ZXh0IGlzIHNldCBhdCB0aGUgY29tcG9uZW50IGxldmVsLCBub3QgdGhlIGNvbXBvbmVudCBjb250YWluZXJcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9QYWdlLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0b1BhZ2Uuc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zKG9Db250cm9sOiBhbnksIHNPdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZykge1xuXHRcdGxldCBvQ3VycmVudENvbnRyb2w6IGFueTtcblxuXHRcdGZ1bmN0aW9uIF9jaGVja0FjdGlvbnMoYUFjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dCA9IG9BY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXRhQ29udGV4dChvQWN0aW9uQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIikgPT09IHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHRocm93IFwiY29udGV4dCBmb3VuZCAtIHN0b3AgYWN0aW9ucyBsb29wXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3Rpb25CaW5kaW5nQ29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfY2hlY2tTdWJTZWN0aW9ucyhhU3ViU2VjdGlvbnM6IEFycmF5PG9iamVjdD4pIHtcblx0XHRcdGxldCBvQWN0aW9uQmluZGluZ0NvbnRleHQ6IGFueTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGFTdWJTZWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9BY3Rpb25CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgXCJjb250ZXh0IGZvdW5kIC0gc3RvcCBTdWJTZWN0aW9ucyBsb29wXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5nZXRCaW5kaW5nQ29udGV4dCgpID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhQWN0aW9ucyA9IG9TdWJTZWN0aW9uLmdldEFnZ3JlZ2F0aW9uKFwiYWN0aW9uc1wiKTtcblx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHQgPSBfY2hlY2tBY3Rpb25zKGFBY3Rpb25zKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQgPyBvQWN0aW9uQmluZGluZ0NvbnRleHQgOiB1bmRlZmluZWQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQ29udHJvbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImlucHV0IHBhcmFtZXRlciBvQ29udHJvbCB1bmRlZmluZWQgd2hlbiB0cnlpbmcgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb3ZlcmxvYWQgY29udGV4dFwiKTtcblx0XHRcdH1cblxuXHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHR3aGlsZSAoIW9DdXJyZW50Q29udHJvbC5pc0EoXCJzYXAudXhhcC5PYmplY3RQYWdlU2VjdGlvblwiKSkge1xuXHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ3VycmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghb0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9iamVjdFBhZ2VTZWN0aW9uIG5vdCBmb3VuZCBpbiBVSSBoaWVyYXJjaHlcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvQ3VycmVudENvbnRyb2wuZ2V0QWdncmVnYXRpb24oXCJzdWJTZWN0aW9uc1wiKTtcblx0XHRcdFx0cmV0dXJuIF9jaGVja1N1YlNlY3Rpb25zKGFTdWJTZWN0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSkge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZHMgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWItb2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoIGZvclxuXHQgKiBhbGwgaW50ZXJtZWRpYXRlcyBwYXRocyBiZXR3ZWVuIHRoZSBPUCBhbmQgdGhlIHN1Yi1PUC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3ViLW9iamVjdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dCxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdfQ==
|
|
1979
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJmaW5hbGl6ZXIiLCJiaW5kIiwiQ3JlYXRpb25Nb2RlIiwiRkVMaWJyYXJ5IiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkNvbnN0YW50cyIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJTdGFydHVwTW9kZSIsIk1lc3NhZ2VUeXBlIiwiY29yZUxpYnJhcnkiLCJFZGl0RmxvdyIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImVkaXREb2N1bWVudCIsIm9Db250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsInRyYW5zYWN0aW9uSGVscGVyIiwiX2dldFRyYW5zYWN0aW9uSGVscGVyIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJyaWdodG1vc3RDb250ZXh0IiwiYmFzZSIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsImdldFZpZXciLCJfZ2V0TWVzc2FnZUhhbmRsZXIiLCJvTmV3RG9jdW1lbnRDb250ZXh0Iiwic1Byb2dyYW1taW5nTW9kZWwiLCJfZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiZ2V0TW9kZWwiLCJfc2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNob3dNZXNzYWdlRGlhbG9nIiwiX2hhbmRsZU5ld0NvbnRleHQiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIlN0aWNreSIsIl9oYW5kbGVTdGlja3lPbiIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzaWJsaW5nSW5mbyIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsIl91cGRhdGVQYXRoc0luSGlzdG9yeSIsInBhdGhNYXBwaW5nIiwidGFyZ2V0Q29udGV4dCIsImdldFBhdGgiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwiYUNvbnRleHRzIiwibVBhcmFtZXRlcnMiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwiZ2V0Q29udHJvbGxlciIsIl9lZGl0RmxvdyIsInVwZGF0ZURvY3VtZW50Iiwib1Byb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJiSXNEcmFmdCIsIkRyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiX3N5bmNUYXNrIiwiaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJfc2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJvQmluZGluZ0NvbnRleHQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldE5hbWUiLCJnZXRNZXRhQ29udGV4dCIsImdldE9iamVjdCIsImFTZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImxlbmd0aCIsIm9DdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsImNhdGNoIiwiZmluYWxseSIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0IiwiX2dldEdsb2JhbFVJTW9kZWwiLCJvVGFibGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJfZ2V0UmVzb3VyY2VCdW5kbGUiLCJiU2hvdWxkQnVzeUxvY2siLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmUiLCJDcmVhdGlvblJvdyIsIkV4dGVybmFsIiwib0V4ZWNDdXN0b21WYWxpZGF0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsIm9Db250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJNb2RlbEhlbHBlciIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsImhhbmRsZXJzIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwib3V0Ym91bmQiLCJ1bmRlZmluZWQiLCJjcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd09iamVjdHMiLCJnZXRQYXJlbnQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiZGF0YSIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImdldENyZWF0aW9uUm93Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJ0YWJsZUlkIiwiYnlJZCIsImlzQSIsImZuRm9jdXNPclNjcm9sbCIsImZvY3VzUm93Iiwic2Nyb2xsVG9JbmRleCIsImdldFJvd0JpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJjcmVhdGVBdEVuZCIsImdldExlbmd0aCIsImhhbmRsZVNpZGVFZmZlY3RzIiwib0xpc3RCaW5kaW5nIiwib0NyZWF0aW9uUHJvbWlzZSIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsImhhc1RyYW5zaWVudENvbnRleHQiLCJhcHBDb21wb25lbnQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMiLCJhVmFsaWRhdGlvbk1lc3NhZ2VzIiwic0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsIm1DdXN0b21WYWxpZGl0eSIsImdldFByb3BlcnR5Iiwib01lc3NhZ2VNYW5hZ2VyIiwiQ29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiYUN1c3RvbU1lc3NhZ2VzIiwib0ZpZWxkQ29udHJvbCIsInNUYXJnZXQiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwiZm9yRWFjaCIsIm9NZXNzYWdlIiwiY29kZSIsInJlbW92ZU1lc3NhZ2VzIiwib1ZhbGlkYXRpb25NZXNzYWdlIiwibWVzc2FnZVRhcmdldCIsImdldENvbnRyb2wiLCJmaWVsZElkIiwiZ2V0QmluZGluZ1BhdGgiLCJmaWx0ZXIiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsIk1lc3NhZ2UiLCJtZXNzYWdlIiwibWVzc2FnZVRleHQiLCJwcm9jZXNzb3IiLCJ0eXBlIiwiRXJyb3IiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiYUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJjdXN0b21NZXNzYWdlcyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiT0RhdGFMaXN0QmluZGluZyIsIlN5bmMiLCJvTW9kZWwiLCJzQ3JlYXRpb25Nb2RlIiwicHJvZ3JhbW1pbmdNb2RlbCIsIk5ld1BhZ2UiLCJpc1JlbGF0aXZlIiwic1BhdGgiLCJzTmV3QWN0aW9uIiwiYVBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJBc3luYyIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwib0NyZWF0aW9uIiwibUFyZ3MiLCJvQ3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dDb250ZXh0Iiwib1ZhbGlkYXRpb25DaGVjayIsIm9QYXlsb2FkIiwib1JvdXRpbmdMaXN0ZW5lciIsIl9nZXRSb3V0aW5nTGlzdGVuZXIiLCJPYmplY3QiLCJrZXlzIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsIl9oYW5kbGVDcmVhdGVFdmVudHMiLCJwYXJlbnRDb250cm9sIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJvbkJlZm9yZUNyZWF0ZSIsIm9OYXZpZ2F0aW9uIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiYkRlZmVycmVkQ29udGV4dCIsImVkaXRhYmxlIiwiYkZvcmNlRm9jdXMiLCJhc3luY0NvbnRleHQiLCJjcmVhdGVBY3Rpb24iLCJ0cmFuc2llbnQiLCJjb3JlUmVzb3VyY2VCdW5kbGUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJuYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UiLCJnZXRUZXh0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm9DcmVhdGlvblJvd0xpc3RCaW5kaW5nIiwiZ2V0QmluZGluZyIsImJTa2lwU2lkZUVmZmVjdHMiLCJvTmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwidHJhY2UiLCJkZWxldGUiLCJpc0xvY2tlZCIsInVubG9jayIsInJlamVjdCIsImJJc05ld1BhZ2VDcmVhdGlvbiIsImFsbCIsImFQYXJhbXMiLCJfc2VuZEFjdGl2aXR5IiwiQWN0aXZpdHkiLCJDcmVhdGUiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJjYW5jZWxlZCIsInJlamVjdGVkSXRlbXMiLCJvbkJlZm9yZVNhdmUiLCJvbkJlZm9yZURpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzIiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsImlzRmNsRW5hYmxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYkVkaXRhYmxlIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImNhbmNlbEJ1dHRvbiIsImNvbnRyb2wiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJEaXNjYXJkIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3IiwiZGVsZXRlRG9jdW1lbnQiLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiX2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJEZWxldGUiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJnZXRTdGFydHVwTW9kZSIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50IiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJvQ29udHJvbCIsIm9DdXJyZW50Q29udHJvbCIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiQXJyYXkiLCJpc0FycmF5IiwiYXJndW1lbnRzIiwiY29udGV4dHMiLCJtb2RlbCIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udHJvbElkIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpbmRleE9mIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsInBhdGgiLCJzVGFibGVDb250ZXh0RW50aXR5VHlwZSIsIm9BY3Rpb25PdmVybG9hZENvbnRleHQiLCJfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zIiwiZW5hYmxlQXV0b1Njcm9sbCIsIl9jcmVhdGVBY3Rpb25Qcm9taXNlIiwic0lkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsImNhbGxBY3Rpb24iLCJvUmVzcG9uc2UiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJBY3Rpb24iLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJfZ2V0SW50ZXJuYWxNb2RlbCIsInZDb250ZXh0Iiwic0NvbnRleHRNZXRhUGF0aCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsIm5vSGlzdG9yeUVudHJ5IiwiaW5mbyIsImVyciIsImZSZWplY3RvciIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsIm9QYXRjaFByb21pc2UiLCJnZXRTb3VyY2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVBY3RpdmF0ZSIsIm9CaW5kaW5nIiwiYkF0RW5kIiwiYkluYWN0aXZlIiwib1BhcmFtcyIsImluYWN0aXZlIiwic0VkaXRNb2RlIiwiYkNyZWF0aW9uTW9kZSIsInNldEVkaXRNb2RlIiwic0RyYWZ0U3RhdGUiLCJzZXREcmFmdFN0YXR1cyIsImdldFJvdXRpbmdMaXN0ZW5lciIsImdldEdsb2JhbFVJTW9kZWwiLCJ2VGFzayIsInN5bmNUYXNrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsImdldEludGVybmFsTW9kZWwiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJzQ29udHJvbElkIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsIl9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiX2RlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJnZXRNZXNzYWdlSGFuZGxlciIsInJlbGF0ZWRDb250ZXh0cyIsImNvbnRlbnQiLCJtYXAiLCJzZW5kIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJzdWJtaXRCYXRjaCIsIm9SZXF1ZXN0b3IiLCJ3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJoYW5kbGVTdGlja3lPbiIsIl9oYW5kbGVTdGlja3lPZmYiLCJoYW5kbGVTdGlja3lPZmYiLCJfb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJfZGlzY2FyZFN0aWNreVNlc3Npb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImludGVybmFsTW9kZWwiLCJnZXRIdHRwSGVhZGVycyIsImJSZWNyZWF0ZUNvbnRleHQiLCJiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwidmlldyIsInBhcmFtcyIsInZpZXdMZXZlbCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJzVmlld0lkIiwiZ2V0SWQiLCJhTWVzc2FnZXMiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJpIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9EYXRhIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5IiwiaXNSb290IiwicmVmcmVzaCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0Q29udGV4dCIsImFSZXF1ZXN0UHJvbWlzZXMiLCJvS2V5IiwicmVxdWVzdE9iamVjdCIsIiRQcm9wZXJ0eVBhdGgiLCJhUGFnZXMiLCJvRkNMIiwiZ2V0Um9vdENvbnRhaW5lciIsImNvbmNhdCIsImdldE1pZENvbHVtblBhZ2VzIiwiZ2V0RW5kQ29sdW1uUGFnZXMiLCJvTmF2Q29udGFpbmVyIiwiZ2V0UGFnZXMiLCJvUGFnZSIsImdldENvbXBvbmVudEluc3RhbmNlIiwiX2NoZWNrQWN0aW9ucyIsImFBY3Rpb25zIiwib0FjdGlvbkJpbmRpbmdDb250ZXh0Iiwib0FjdGlvbiIsIl9jaGVja1N1YlNlY3Rpb25zIiwiYVN1YlNlY3Rpb25zIiwib1N1YlNlY3Rpb24iLCJnZXRBZ2dyZWdhdGlvbiIsImN1cnJlbnRDb250ZXh0IiwibmV3Q29udGV4dCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29u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d2Isa0JBQWtCLENBQUN4YixPQUFuQixFQUFoRSxFQUE4RjtBQUM3RixpQkFBTzJELE9BQU8sQ0FBQ0MsT0FBUixDQUFnQmEsU0FBaEIsQ0FBUDtBQUNBOztBQUVELFlBQU02TSxLQUFLLEdBQUdrSyxrQkFBa0IsQ0FBQ3hjLFFBQW5CLEVBQWQ7O0FBQ0EsWUFBSUgsaUJBQWlCLEtBQUs3QixnQkFBZ0IsQ0FBQ2dFLEtBQTNDLEVBQWtEO0FBQ2pELGlDQUFPNGEsS0FBSyxDQUFDQyx5QkFBTixDQUFnQ0wsa0JBQWhDLEVBQW9EQyx1QkFBcEQsQ0FBUDtBQUNBLFNBRkQsTUFFTztBQUNOO0FBQ0E7QUFDQSxpQ0FBTztBQUNOMWIsWUFBQUEsYUFBYSxFQUFFdVIsS0FBSyxDQUFDd0ssV0FBTixDQUFrQkwsdUJBQXVCLENBQUN6YixPQUF4QixFQUFsQixFQUFxRCtiLGVBQXJELEVBRFQ7QUFFTmpjLFlBQUFBLFdBQVcsRUFBRTtBQUZQLFdBQVA7QUFJQTtBQUNELE87Ozs7O1dBQ0ROLGEsR0FBQSx5QkFBeUI7QUFDeEIsYUFBT3NFLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLckYsT0FBTCxFQUE1QixFQUE0Q2MsYUFBNUMsRUFBUDtBQUNBLEs7OztJQXh4RHFCd2MsbUI7U0EyeERSemUsUSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBGbGV4aWJsZUNvbHVtbkxheW91dCBmcm9tIFwic2FwL2YvRmxleGlibGVDb2x1bW5MYXlvdXRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBzZW5kIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB0eXBlIHsgU2libGluZ0luZm9ybWF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIHRyaWdnZXJDb25maWd1cmVkU3VydmV5LCBUcmlnZ2VyVHlwZSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0ZlZWRiYWNrXCI7XG5pbXBvcnQgdHlwZSBOYXZDb250YWluZXIgZnJvbSBcInNhcC9tL05hdkNvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IENvcmVFeCwgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlLFxuXHRQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0U3RhcnR1cE1vZGUgPSBGRUxpYnJhcnkuU3RhcnR1cE1vZGUsXG5cdE1lc3NhZ2VUeXBlID0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGU7XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiBvZmZlcmluZyBob29rcyBpbnRvIHRoZSBlZGl0IGZsb3cgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKlxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuOTAuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1wiKVxuY2xhc3MgRWRpdEZsb3cgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQdWJsaWMgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdHByaXZhdGUgZm5EaXJ0eVN0YXRlUHJvdmlkZXI/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBmbkhhbmRsZVNlc3Npb25UaW1lb3V0PzogRnVuY3Rpb247XG5cdHByaXZhdGUgbVBhdGNoUHJvbWlzZXM/OiBhbnk7XG5cdHByaXZhdGUgX2ZuU3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbj86IEZ1bmN0aW9uO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIGFuIGV4aXN0aW5nIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2VkaXREb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IFY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGxldCByaWdodG1vc3RDb250ZXh0O1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZWRpdERvY3VtZW50KG9Db250ZXh0LCB0aGlzLmdldFZpZXcoKSwgdGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG9Db250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCk7XG5cblx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpO1xuXHRcdFx0XHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgcmlnaHRtb3N0Q29udGV4dCwgc1Byb2dyYW1taW5nTW9kZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gb05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHRydWUsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgc3RpY2t5T24gaGFuZGxlciBtdXN0IGJlIHNldCBhZnRlciB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiBkb25lLFxuXHRcdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0czogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGVcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVNdWx0aXBsZURvY3VtZW50cyhhQ29udGV4dHMsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgZXJyb3JzIGR1cmluZyBhbiB1cGRhdGUuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gb1Byb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyN1cGRhdGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHR1cGRhdGVEb2N1bWVudChvQ29udGV4dDogb2JqZWN0LCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9yaWdpbmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzaygoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0cmFuc2FjdGlvbkhlbHBlci5oYW5kbGVEb2N1bWVudE1vZGlmaWNhdGlvbnMoKTtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0cmV0dXJuIG9Qcm9taXNlXG5cdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdC8vIElmIGEgbmF2aWdhdGlvbiBoYXBwZW5lZCB3aGlsZSBvUHJvbWlzZSB3YXMgYmVpbmcgcmVzb2x2ZWQsIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgY2hhbmdlZFxuXHRcdFx0XHRcdFx0Ly8gSW4gdGhhdCBjYXNlLCB3ZSBzaG91bGRuJ3QgZG8gYW55dGhpbmdcblx0XHRcdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRpZiAoYklzRHJhZnQgJiYgb0JpbmRpbmdDb250ZXh0ICYmIG9CaW5kaW5nQ29udGV4dCA9PT0gb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldE5hbWUgPSAob01ldGFNb2RlbCBhcyBhbnkpLmdldE1ldGFDb250ZXh0KG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0XHRcdFx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoYVNlbWFudGljS2V5cyAmJiBhU2VtYW50aWNLZXlzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRzQ3VycmVudFNlbWFudGljUGF0aCA9IG9DdXJyZW50U2VtYW50aWNNYXBwaW5nICYmIG9DdXJyZW50U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIHNDdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNDdXJyZW50U2VtYW50aWNQYXRoICYmIHNDdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KG9CaW5kaW5nQ29udGV4dCwgdHJ1ZSwgZmFsc2UsIHRydWUpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1wYXJhbVxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycgb3IgJ0RlZmVycmVkJyBpcyB1c2VkXG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgKGluIGEgdGFibGUpXG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCB2aWEgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY3JlYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Y3JlYXRlRG9jdW1lbnQoXG5cdFx0dkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRsZXQgb1RhYmxlOiBhbnk7IC8vc2hvdWxkIGJlIFRhYmxlIGJ1dCB0aGVyZSBhcmUgbWlzc2luZyBtZXRob2RzIGludG8gdGhlIGRlZlxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycztcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSB0aGlzLl9nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHRcdGNvbnN0IGJTaG91bGRCdXN5TG9jayA9XG5cdFx0XHQhbVBhcmFtZXRlcnMgfHxcblx0XHRcdChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpO1xuXHRcdGxldCBvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0Ly8gQ3JlYXRlIGJ5IG5hdmlnYXRpbmcgdG8gYW4gZXh0ZXJuYWwgdGFyZ2V0XG5cdFx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRcdHJldHVybiB0aGlzLl9zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0XHRzQ3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmdldFZpZXcoKSwgdkxpc3RCaW5kaW5nKTtcblxuXHRcdFx0XHQob0NvbnRyb2xsZXIgYXMgYW55KS5oYW5kbGVycy5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIG1QYXJhbWV0ZXJzLm91dGJvdW5kLCB1bmRlZmluZWQsIHNDcmVhdGVQYXRoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBtUGFyYW1ldGVycy5jcmVhdGlvblJvdykge1xuXHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93T2JqZWN0cyA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0T2JqZWN0KCk7XG5cdFx0XHRkZWxldGUgb0NyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRvVGFibGUgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKTtcblx0XHRcdG9FeGVjQ3VzdG9tVmFsaWRhdGlvbiA9IHRyYW5zYWN0aW9uSGVscGVyLnZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0XHRcdG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGF0YTogb0NyZWF0aW9uUm93T2JqZWN0cyxcblx0XHRcdFx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIilcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBpcyBzZXQgdG8gZmFsc2UgaW4gbWFuaWZlc3QgY29udmVydGVyIChUYWJsZS50cykgaWYgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIGV4aXN0c1xuXHRcdFx0aWYgKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmIG1QYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdG9UYWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGU7XG5cdFx0fVxuXG5cdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0Y29uc3QgZm5Gb2N1c09yU2Nyb2xsID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lID8gb1RhYmxlLmZvY3VzUm93LmJpbmQob1RhYmxlKSA6IG9UYWJsZS5zY3JvbGxUb0luZGV4LmJpbmQob1RhYmxlKTtcblx0XHRcdG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Zm5Gb2N1c09yU2Nyb2xsKG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID8gb1RhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRMZW5ndGgoKSA6IDAsIHRydWUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaGFuZGxlU2lkZUVmZmVjdHMgPSAob0xpc3RCaW5kaW5nOiBhbnksIG9DcmVhdGlvblByb21pc2U6IFByb21pc2U8Q29udGV4dD4pID0+IHtcblx0XHRcdG9DcmVhdGlvblByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9OZXdDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0XHRyZXR1cm4gb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIGFWYWxpZGF0aW9uTWVzc2FnZXMgRXJyb3IgbWVzc2FnZXMgZnJvbSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdGNvbnN0IGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyA9IChhVmFsaWRhdGlvbk1lc3NhZ2VzOiBhbnlbXSkgPT4ge1xuXHRcdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpO1xuXHRcdFx0Y29uc3QgbUN1c3RvbVZhbGlkaXR5ID0gb1RhYmxlICYmIG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRjb25zdCBhQ3VzdG9tTWVzc2FnZXM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgb0ZpZWxkQ29udHJvbDtcblx0XHRcdGxldCBzVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHRcdC8vIFJlbW92ZSBleGlzdGluZyBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS5jb2RlID09PSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdGFWYWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgob1ZhbGlkYXRpb25NZXNzYWdlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gSGFuZGxlIEJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0XHRpZiAob1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXQpIHtcblx0XHRcdFx0XHRvRmllbGRDb250cm9sID0gQ29yZS5nZXRDb250cm9sKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0XHRzVGFyZ2V0ID0gYCR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR9KS5sZW5ndGggPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldDogc1RhcmdldFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyIHJ1bmFibGVcblx0XHRcdFx0XHRjb25zdCBhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdHRleHQ6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFDdXN0b21NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coe1xuXHRcdFx0XHRcdGN1c3RvbU1lc3NhZ2VzOiBhQ3VzdG9tTWVzc2FnZXNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2sob0V4ZWNDdXN0b21WYWxpZGF0aW9uKVxuXHRcdFx0LnRoZW4oKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoYVZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKGFWYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkN1c3RvbSBWYWxpZGF0aW9uIGZhaWxlZFwiKTtcblx0XHRcdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nO1xuXHRcdFx0XHRsZXQgb0xpc3RCaW5kaW5nOiBhbnk7XG5cblx0XHRcdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0XHRpZiAodkxpc3RCaW5kaW5nICYmIHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHQvLyB3ZSBhbHJlYWR5IGdldCBhIGxpc3QgYmluZGluZyB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHZMaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdFx0ZGVsZXRlIG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdFx0Y29uc3Qgc0NyZWF0aW9uTW9kZSA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZTtcblxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0xpc3RCaW5kaW5nKSlcblx0XHRcdFx0XHQudGhlbigocHJvZ3JhbW1pbmdNb2RlbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9IHByb2dyYW1taW5nTW9kZWw7XG5cdFx0XHRcdFx0XHRpZiAoc0NyZWF0aW9uTW9kZSAmJiBzQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0XHRcdFx0XHQvLyB1c2UgdGhlIHBhc3NlZCBjcmVhdGlvbiBtb2RlXG5cdFx0XHRcdFx0XHRcdHJldHVybiBzQ3JlYXRpb25Nb2RlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0XHRcdFx0XHRpZiAoIW9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzUGF0aCA9IG9MaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBpZiBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGlzIHByZXNlbnQsIHRoZW4gY3JlYXRpb24gaXMgJ0RlZmVycmVkJ1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaW4gdGhlIGFic2VuY2Ugb2YgTmV3QWN0aW9uIG9yIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMsIGNyZWF0aW9uIGlzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0XHRzTmV3QWN0aW9uID1cblx0XHRcdFx0XHRcdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBvTWV0YU1vZGVsLmdldE9iamVjdChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICApO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzTmV3QWN0aW9ufS9AJHVpNS5vdmVybG9hZC8wLyRQYXJhbWV0ZXJgKSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMoXG5cdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRzTWV0YVBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KClcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKChyZXNvbHZlZENyZWF0aW9uTW9kZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRsZXQgb0NyZWF0aW9uOiBhbnk7XG5cdFx0XHRcdFx0XHRsZXQgbUFyZ3M6IGFueTtcblx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGlvblJvdyA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdFx0XHRcdFx0bGV0IG9DcmVhdGlvblJvd0NvbnRleHQ6IGFueTtcblx0XHRcdFx0XHRcdGxldCBvVmFsaWRhdGlvbkNoZWNrID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRsZXQgb1BheWxvYWQ6IGFueTtcblx0XHRcdFx0XHRcdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0XHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvUm91dGluZ0xpc3RlbmVyID0gdGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCk7XG5cblx0XHRcdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KSB7XG5cdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93Q29udGV4dCA9IG9DcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0XHRcdC8vIHByZWZpbGwgZGF0YSBmcm9tIGNyZWF0aW9uIHJvd1xuXHRcdFx0XHRcdFx0XHRcdG9QYXlsb2FkID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0ge307XG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMob1BheWxvYWQpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVtzUHJvcGVydHlQYXRoXSA9IG9QYXlsb2FkW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdG9WYWxpZGF0aW9uQ2hlY2sgPSB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoLypvQ3JlYXRpb25Sb3dDb250ZXh0Ki8pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93IHx8IHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lKSB7XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHRcdC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTG9jYWxcIjtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2hhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uID0gb1ZhbGlkYXRpb25DaGVjay50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGU7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRcdFx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0XHRcdFx0YXN5bmNDb250ZXh0OiBvQ3JlYXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRcdFx0XHRcdFx0bUFyZ3MgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgbVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtQXJncy50cmFuc2llbnQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9DcmVhdGlvbi50aGVuKGZ1bmN0aW9uIChvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSAoQ29yZSBhcyBDb3JlRXgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3N5bmNUYXNrKG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRcdFx0XHRcdC8vIHRoZSBjcmVhdGlvbiByb3cgc2hhbGwgYmUgY2xlYXJlZCBvbmNlIHRoZSB2YWxpZGF0aW9uIGNoZWNrIHdhcyBzdWNjZXNzZnVsIGFuZFxuXHRcdFx0XHRcdFx0XHRcdC8vIHRoZXJlZm9yZSB0aGUgUE9TVCBjYW4gYmUgc2VudCBhc3luYyB0byB0aGUgYmFja2VuZFxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1ZhbGlkYXRpb25DaGVja1xuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuYlNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGhhbmRsZVNpZGVFZmZlY3RzKG9MaXN0QmluZGluZywgb0NyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdUcmFuc2llbnRDb250ZXh0ID0gb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9DcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChvTmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0b05ld1RyYW5zaWVudENvbnRleHQuY3JlYXRlZCgpLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmVzZXQgYnVzeSBpbmRpY2F0b3IgYWZ0ZXIgYSB2YWxpZGF0aW9uIGVycm9yXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IFByb21pc2UucmVqZWN0KGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlICR7cmVzb2x2ZWRDcmVhdGlvbk1vZGV9YCk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0XHRcdGlmIChvQ3JlYXRpb24pIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtvQ3JlYXRpb24sIG9OYXZpZ2F0aW9uXSlcblx0XHRcdFx0XHRcdFx0XHQudGhlbigoYVBhcmFtczogW2FueSwgYW55XSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb01vZGVsKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJJc05ld1BhZ2VDcmVhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgYklzTmV3UGFnZUNyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhUGFyYW1zWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T24ob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChvRXJyb3IubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXJyb3IuY2FuY2VsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob0Vycm9yLnJlamVjdGVkSXRlbXMgJiYgb0Vycm9yLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKVxuXHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKGJTaG91bGRCdXN5TG9jaykge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVTYXZlXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZVNhdmUobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSAgbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250ZXh0UGF0aCBQYXRoIHBvaW50aW5nIHRvIHRoZSBjb250ZXh0IG9uIHdoaWNoIENyZWF0ZSBhY3Rpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZUNyZWF0ZShtUGFyYW1ldGVycz86IHsgY29udGV4dFBhdGg/OiBzdHJpbmc7IGNyZWF0ZVBhcmFtZXRlcnM/OiBhbnlbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVFZGl0XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUVkaXRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVFZGl0KG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEaXNjYXJkJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEaXNjYXJkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURpc2NhcmRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0b25CZWZvcmVEaXNjYXJkKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEZWxldGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGVsZXRlXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZURlbGV0ZShtUGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBJbmRpY2F0ZXMgd2hldGhlciBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGlnbm9yZWQgd2hlbiB1c2VyIGNsaWNrcyBvbiBTYXZlIGR1cmluZyBhbiBJbmxpbmUgY3JlYXRpb25cblx0Ly8gQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIExpc3QgYmluZGluZ3Mgb2YgdGhlIHRhYmxlcyBpbiB0aGUgdmlldy5cblx0Ly8gQm90aCBvZiB0aGUgYWJvdmUgcGFyYW1ldGVycyBhcmUgZm9yIHRoZSBzYW1lIHB1cnBvc2UuIFVzZXIgY2FuIGVudGVyIHNvbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNyZWF0aW9uIHJvdyhzKSBidXQgZG9lcyBub3QgJ0FkZCByb3cnLCBpbnN0ZWFkIGNsaWNrcyBTYXZlLlxuXHQvLyBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBpbiB0aGUgdmlldy5cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1wYXJhbVxuXHQvKipcblx0ICogU2F2ZXMgYSBuZXcgZG9jdW1lbnQgYWZ0ZXIgY2hlY2tpbmcgaXQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzYXZlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2F2ZURvY3VtZW50KG9Db250ZXh0OiBWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSB0aGlzLl9nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZVNhdmUoeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMuX3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzKCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoU3RhbmRhcmRBY3Rpb25zLnNhdmUsIFRyaWdnZXJUeXBlLnN0YW5kYXJkQWN0aW9uKTtcblxuXHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBhY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIG9FcnJvci5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0fVxuXHR9XG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyB0b2dnbGVEcmFmdEFjdGl2ZShvQ29udGV4dDogVjRDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGJFZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0Ly90b2dnbGUgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlZGl0IGRyYWZ0cyBhbmQgYWN0aXZlIGRvY3VtZW50cyB3aXRoIGRyYWZ0KVxuXHRcdGlmIChcblx0XHRcdCFiSXNEcmFmdCB8fFxuXHRcdFx0IShcblx0XHRcdFx0KCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkgfHxcblx0XHRcdFx0KG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0Ly9zdGFydCBQb2ludDogZWRpdCBkcmFmdFxuXHRcdFx0YkVkaXRhYmxlID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHN0YXJ0IHBvaW50IGFjdGl2ZSBkb2N1bWVudFxuXHRcdFx0YkVkaXRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRcdGNvbnN0IG9SaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb0NvbnRleHQ7XG5cdFx0XHRjb25zdCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoYkVkaXRhYmxlID8gRWRpdE1vZGUuRWRpdGFibGUgOiBFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7IC8vc3dpdGNoIHRvIGVkaXQgbW9kZSBvbmx5IGlmIGEgZHJhZnQgaXMgYXZhaWxhYmxlXG5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgYkVkaXRhYmxlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoYEVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlOiR7b0Vycm9yfWAgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NhbmNlbERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KG9Db250ZXh0OiBWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiB7IGNvbnRyb2w6IG9iamVjdDsgc2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbiB9KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBtSW5QYXJhbWV0ZXJzOiBhbnkgPSBtUGFyYW1ldGVycztcblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuXHRcdG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY29udHJvbCB8fCBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbjtcblx0XHRtSW5QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZDtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FuY2VsRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblxuXHRcdFx0dGhpcy5fcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMoKTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblxuXHRcdFx0aWYgKCFvQWN0aXZlRG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCB1bmRlZmluZWQpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIHRydWUsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9hY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2RlbGV0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycztcblx0XHRpZiAoIW1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSBmYWxzZTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0cmV0dXJuIHRoaXMuX2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQpIHtcblx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rICYmICF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcCBoYXMgYmVlbiBsYXVuY2hlZCB3aXRoIHNlbWFudGljIGtleXMsIGRlbGV0aW5nIHRoZSBvYmplY3Qgd2UndmUgbGFuZGVkIG9uIHNoYWxsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2FwcGx5RG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBvbmNlIHRoZSBhY3Rpb24gaGFzIGJlZW4gaW52b2tlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjaW52b2tlQWN0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0bUV4dHJhUGFyYW1zPzogYW55XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvQ29udHJvbDogYW55O1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRsZXQgb0N1cnJlbnRDb250cm9sO1xuXHRcdGxldCBvQmluZGluZ0NvbnRleHQ7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6IGFueTtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0Ly8gRHVlIHRvIGEgbWlzdGFrZSB0aGUgaW52b2tlQWN0aW9uIGluIHRoZSBleHRlbnNpb25BUEkgaGFkIGEgZGlmZmVyZW50IEFQSSB0aGFuIHRoaXMgb25lLlxuXHRcdC8vIFRoZSBvbmUgZnJvbSB0aGUgZXh0ZW5zaW9uQVBJIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBhcyB3ZSBleHBvc2UgdGhlIGZ1bGwgZWRpdCBmbG93IG5vdyBidXRcblx0XHQvLyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIHNpZ25hdHVyZVxuXHRcdGlmICgobVBhcmFtZXRlcnMuaXNBICYmIG1QYXJhbWV0ZXJzLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fCBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzKSB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IG1QYXJhbWV0ZXJzO1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdGlmICghbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdH1cblxuXHRcdGlmIChzQWN0aW9uTmFtZSAmJiBzQWN0aW9uTmFtZS5pbmRleE9mKFwiKFwiKSA+IC0xKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IChhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdIGFzIGFueSkucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24pIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc1RhYmxlQm91bmQoKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9Db250cm9sLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhdGggPSBvQ29udHJvbC5kYXRhKFwicm93c0JpbmRpbmdJbmZvXCIpLnBhdGgsXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgc0JpbmRpbmdQYXRoKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBzVGFibGVDb250ZXh0RW50aXR5VHlwZSA9IG1QYXJhbWV0ZXJzLmNvbnRleHRzXG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQobVBhcmFtZXRlcnMuY29udGV4dHMuZ2V0UGF0aCgpKVxuXHRcdFx0XHRcdC5nZXRPYmplY3QoXCIkVHlwZVwiKTtcblx0XHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUgIT09IHNUYWJsZUNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGluIGNvbnRyb2wgdHJlZSBoaWVyYXJjaHlcblx0XHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ29udHJvbDtcblx0XHRcdFx0XHR3aGlsZSAob0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQgPSBvQ3VycmVudENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0ICYmXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpID09PVxuXHRcdFx0XHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9CaW5kaW5nQ29udGV4dDtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBjaGVjayBwYXJlbnRcblx0XHRcdFx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0N1cnJlbnRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBjb250ZXh0IHdhcyBub3QgZm91bmQgaW4gVUkgaGllcmFyY2h5IGdvaW5nIHN0cmFpZ2h0IHVwd2FyZHMgLSB0cnkgdG8gZmluZCBpdCBpbiBTdWJTZWN0aW9uc1xuXHRcdFx0XHRcdGlmICghb0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uT3ZlcmxvYWRDb250ZXh0ID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zKG9Db250cm9sLCBzT3ZlcmxvYWRFbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uT3ZlcmxvYWRDb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQWN0aW9uT3ZlcmxvYWRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChgQ29udGV4dCBub3QgZm91bmQgZm9yIGVudGl0eSB0eXBlICR7c092ZXJsb2FkRW50aXR5VHlwZX1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLl9jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5zSWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKVxuXHRcdFx0LnRoZW4odHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbi5iaW5kKHRyYW5zYWN0aW9uSGVscGVyLCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMsIHRoaXMuZ2V0VmlldygpLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpKSlcblx0XHRcdC50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBpZiB0aGUgcmV0dXJuZWQgY29udGV4dCBmb3IgdGhlIGJvdW5kIGFjdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udGV4dCBvbiB3aGljaCBhY3Rpb24gd2FzIGNhbGxlZCxcblx0XHRcdFx0Ly8gcmVmcmVzaCB0aGUgY29ycmVzcG9uZGluZyBsaXN0IGJpbmRpbmdcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHRcdHRoaXMuX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHRcdCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKG9SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzKTtcblx0XHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Lypcblx0XHRcdFx0XHQgV2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHQgVE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHQgVGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHQgT25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHQgaXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHQgd2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHQgYXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdCB3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHQgd2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHQgZmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL3NDdXN0b21BY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyID09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJEaWFsb2fCoGNhbmNlbGxlZC5cIik7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIShlcnIgJiYgKGVyci5jYW5jZWxlZCB8fCAoZXJyLnJlamVjdGVkSXRlbXMgJiYgZXJyLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoYEVycm9yIGluIEVkaXRGbG93Lmludm9rZUFjdGlvbjoke2Vycn1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5idXN5ICYmIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0ICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LnNldCA6IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LmNoZWNrICE9PSB1bmRlZmluZWQgPyBtUGFyYW1ldGVycy5idXN5LmNoZWNrIDogdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSAobVBhcmFtZXRlcnMgJiYgKG1QYXJhbWV0ZXJzIGFzIGFueSkudXBkYXRlc0RvY3VtZW50KSB8fCBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhmbkZ1bmN0aW9uKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCkuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBhbnkpIHtcblx0XHRpZiAoISh0aGlzLmJhc2UuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBwYXRjaENvbXBsZXRlZEV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudXBkYXRlRG9jdW1lbnQob0V2ZW50LmdldFNvdXJjZSgpLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgQ3JlYXRlQWN0aXZhdGUgZXZlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnRcblx0ICovXG5cdGhhbmRsZUNyZWF0ZUFjdGl2YXRlKG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGJBdEVuZCA9IHRydWU7XG5cdFx0Y29uc3QgYkluYWN0aXZlID0gdHJ1ZTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSB0aGlzLl9nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHRcdGNvbnN0IG9QYXJhbXM6IGFueSA9IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdGNyZWF0ZUF0RW5kOiBiQXRFbmQsXG5cdFx0XHRpbmFjdGl2ZTogYkluYWN0aXZlLFxuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRidXN5TW9kZTogXCJOb25lXCJcblx0XHR9O1xuXHRcdHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KG9CaW5kaW5nLCBvUGFyYW1zLCBvUmVzb3VyY2VCdW5kbGUsIHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCksIGZhbHNlLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKlxuXHRcdFx0IFRPIEJFIENIRUNLRUQgLyBESVNDVVNTRURcblx0XHRcdCBfY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMgYW5kIGRlbGV0ZU11bHRpRG9jdW1lbnQgLSBjb3VsZG4ndCB3ZSBjb21iaW5lIHRoZW0gd2l0aCBjcmVhdGUgYW5kIGRlbGV0ZSBkb2N1bWVudD9cblx0XHRcdCBfY3JlYXRlQWN0aW9uUHJvbWlzZSBhbmQgZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UgLT4gbmV4dCBzdGVwXG5cblx0XHRcdCAqL1xuXG5cdF9zZXRFZGl0TW9kZShzRWRpdE1vZGU6IGFueSwgYkNyZWF0aW9uTW9kZT86IGJvb2xlYW4pIHtcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5zZXRFZGl0TW9kZShzRWRpdE1vZGUsIGJDcmVhdGlvbk1vZGUpO1xuXHR9XG5cblx0X3NldERyYWZ0U3RhdHVzKHNEcmFmdFN0YXRlOiBhbnkpIHtcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZSk7XG5cdH1cblxuXHRfZ2V0Um91dGluZ0xpc3RlbmVyKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblx0fVxuXG5cdF9nZXRHbG9iYWxVSU1vZGVsKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdH1cblx0X3N5bmNUYXNrKHZUYXNrPzogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LnN5bmNUYXNrKHZUYXNrKTtcblx0fVxuXG5cdF9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdH1cblxuXHRfZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdF9oYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmc6IGFueSkge1xuXHRcdCh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmhhbmRsZUNyZWF0ZUV2ZW50cyhvQmluZGluZyk7XG5cdH1cblxuXHRfZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdH1cblxuXHRfZ2V0SW50ZXJuYWxNb2RlbCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFJlc291cmNlQnVuZGxlKCkge1xuXHRcdHJldHVybiAodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkub1Jlc291cmNlQnVuZGxlO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NyZWF0ZUFjdGlvblByb21pc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblxuXHRfY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZTogYW55LCBzQ29udHJvbElkOiBhbnkpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgc0NvbnRyb2xJZCk7XG5cdH1cblxuXHRfZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdH1cblxuXHRfZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdH1cblxuXHRfZ2V0TWVzc2FnZUhhbmRsZXIoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldE1lc3NhZ2VIYW5kbGVyKCk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KGFjdGlvbjogQWN0aXZpdHksIHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHRzZW5kKHRoaXMuZ2V0VmlldygpLCBhY3Rpb24sIGNvbnRlbnQpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5c1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvUmVzcG9uc2U6IG9iamVjdCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBTdWJtaXQgYW55IGxlZnRvdmVyIGNoYW5nZXMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWRcblx0XHRcdC8vIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgb25seSAxIHVwZGF0ZUdyb3VwSWQsIGhlbmNlIHN1Ym1pdHRpbmcgdGhlIGJhdGNoIGRpcmVjdGx5IGhlcmVcblx0XHRcdGF3YWl0IG9Nb2RlbC5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgY2hhbmdlc1xuXHRcdFx0Ly8gRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGFncmVlZCB3aXRoIHRoZSB2NCBtb2RlbCB0ZWFtIHRvIHVzZSBhbiBpbnRlcm5hbCBtZXRob2QuIFdlJ2xsIHJlcGxhY2UgaXQgb25jZVxuXHRcdFx0Ly8gYSBwdWJsaWMgb3IgcmVzdHJpY3RlZCBtZXRob2Qgd2FzIHByb3ZpZGVkXG5cdFx0XHRhd2FpdCBvTW9kZWwub1JlcXVlc3Rvci53YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIENoZWNrIGlmIGFsbCBjaGFuZ2VzIHdlcmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseVxuXHRcdFx0aWYgKG9Nb2RlbC5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN1Ym1pdCBvZiBvcGVuIGNoYW5nZXMgZmFpbGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdGlja3lPbihvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5oYW5kbGVTdGlja3lPbihvQ29udGV4dCk7XG5cdH1cblxuXHRfaGFuZGxlU3RpY2t5T2ZmKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdF9vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCk7XG5cdH1cblxuXHRfZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZGlzY2FyZFN0aWNreVNlc3Npb24ob0NvbnRleHQpO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogYW55LCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuX2dldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIHRydWUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgKG1vZGVsLmdldEh0dHBIZWFkZXJzKHRydWUpIGFzIGFueSlbXCJTQVAtQ29udGV4dElkXCJdKTtcblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBhbnkpIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5faGFuZGxlU3RpY2t5T2ZmKC8qb0NvbnRleHQqLyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IGFueSxcblx0XHRiRWRpdGFibGU6IGJvb2xlYW4sXG5cdFx0YlJlY3JlYXRlQ29udGV4dDogYm9vbGVhbixcblx0XHRiRHJhZnROYXZpZ2F0aW9uOiBib29sZWFuLFxuXHRcdGJGb3JjZUZvY3VzPzogYm9vbGVhbixcblx0XHRiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk/OiBib29sZWFuXG5cdCkge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdGVkaXRhYmxlOiBiRWRpdGFibGUsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0YlJlY3JlYXRlQ29udGV4dDogYlJlY3JlYXRlQ29udGV4dCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IGJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0YkZvcmNlRm9jdXM6IGJGb3JjZUZvY3VzLFxuXHRcdFx0a2VlcEN1cnJlbnRMYXlvdXQ6IHRydWUsXG5cdFx0XHRiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHk6IGJOYXZpZ2F0ZVRvU2libGluZ0VudGl0eVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBhbnksIHBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9yc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0X2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpIHtcblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXHRcdFx0bGV0IG9NZXNzYWdlO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTWVzc2FnZSA9IGFNZXNzYWdlc1tpXTtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChvTWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9yZWZyZXNoTGlzdElmUmVxdWlyZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0X3JlZnJlc2hMaXN0SWZSZXF1aXJlZChvUmVzcG9uc2U6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGlmICgob0JpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogb0JpbmRpbmcuZ2V0UGF0aCgpIH1dLCBvQmluZGluZy5nZXRDb250ZXh0KCkgYXMgQ29udGV4dClcblx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdGFibGVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob0tleTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVWdseSBXb3JrYXJvdW5kIHRvIG92ZXJjb21lIG1kYyBmaWVsZCBpc3N1ZSwgd2UgcmVtb3ZlIHRoZSBiaW5kaW5nIGNvbnRleHQgYmVmb3JlXG5cdC8vIHN3aXRjaGluZyB0byBkaXNwbGF5IG1vZGUgdG8gYXZvaWQgdGhlIGZpZWxkIHJlYWRzIGFkZGl0aW9uYWwgdmFsdWVzIGZvciBub24gZXhpc3Rpbmdcblx0Ly8gZHJhZnRzIG9yIHN0aWNreSBzZXNzaW9ucyBpbiB0aGUgYmFja2VuZFxuXHRfcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMoKSB7XG5cdFx0bGV0IGFQYWdlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0Y29uc3Qgb0ZDTCA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpIGFzIEZsZXhpYmxlQ29sdW1uTGF5b3V0O1xuXHRcdFx0YVBhZ2VzID0gYVBhZ2VzLmNvbmNhdChvRkNMLmdldE1pZENvbHVtblBhZ2VzKCkgfHwgW10pO1xuXHRcdFx0YVBhZ2VzID0gYVBhZ2VzLmNvbmNhdChvRkNMLmdldEVuZENvbHVtblBhZ2VzKCkgfHwgW10pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvTmF2Q29udGFpbmVyID0gb0FwcENvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkgYXMgTmF2Q29udGFpbmVyO1xuXHRcdFx0YVBhZ2VzID0gb05hdkNvbnRhaW5lci5nZXRQYWdlcygpIHx8IFtdO1xuXHRcdH1cblxuXHRcdGFQYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChvUGFnZTogYW55KSB7XG5cdFx0XHRpZiAob1BhZ2UuaXNBKFwic2FwLnVpLmNvcmUuQ29tcG9uZW50Q29udGFpbmVyXCIpKSB7XG5cdFx0XHRcdG9QYWdlID0gb1BhZ2UuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTsgLy8gVGhlIGJpbmRpbmcgY29udGV4dCBpcyBzZXQgYXQgdGhlIGNvbXBvbmVudCBsZXZlbCwgbm90IHRoZSBjb21wb25lbnQgY29udGFpbmVyXG5cdFx0XHR9XG5cblx0XHRcdGlmIChvUGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdG9QYWdlLnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyhvQ29udHJvbDogYW55LCBzT3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgb0N1cnJlbnRDb250cm9sOiBhbnk7XG5cblx0XHRmdW5jdGlvbiBfY2hlY2tBY3Rpb25zKGFBY3Rpb25zOiBBcnJheTxvYmplY3Q+KSB7XG5cdFx0XHRsZXQgb0FjdGlvbkJpbmRpbmdDb250ZXh0OiBhbnk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhQWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHQgPSBvQWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQob0FjdGlvbkJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdFx0XHRcdFx0LmdldE9iamVjdChcIiRUeXBlXCIpID09PSBzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBcImNvbnRleHQgZm91bmQgLSBzdG9wIGFjdGlvbnMgbG9vcFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX2NoZWNrU3ViU2VjdGlvbnMoYVN1YlNlY3Rpb25zOiBBcnJheTxvYmplY3Q+KSB7XG5cdFx0XHRsZXQgb0FjdGlvbkJpbmRpbmdDb250ZXh0OiBhbnk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhU3ViU2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdGlmIChvQWN0aW9uQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdHRocm93IFwiY29udGV4dCBmb3VuZCAtIHN0b3AgU3ViU2VjdGlvbnMgbG9vcFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob1N1YlNlY3Rpb24uZ2V0QmluZGluZ0NvbnRleHQoKSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYUFjdGlvbnMgPSBvU3ViU2VjdGlvbi5nZXRBZ2dyZWdhdGlvbihcImFjdGlvbnNcIik7XG5cdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0ID0gX2NoZWNrQWN0aW9ucyhhQWN0aW9ucyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0ID8gb0FjdGlvbkJpbmRpbmdDb250ZXh0IDogdW5kZWZpbmVkO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGlvbkJpbmRpbmdDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAob0NvbnRyb2wgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJpbnB1dCBwYXJhbWV0ZXIgb0NvbnRyb2wgdW5kZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgYWN0aW9uIG92ZXJsb2FkIGNvbnRleHRcIik7XG5cdFx0XHR9XG5cblx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9Db250cm9sO1xuXHRcdFx0d2hpbGUgKCFvQ3VycmVudENvbnRyb2wuaXNBKFwic2FwLnV4YXAuT2JqZWN0UGFnZVNlY3Rpb25cIikpIHtcblx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0N1cnJlbnRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIW9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RQYWdlU2VjdGlvbiBub3QgZm91bmQgaW4gVUkgaGllcmFyY2h5XCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb0N1cnJlbnRDb250cm9sLmdldEFnZ3JlZ2F0aW9uKFwic3ViU2VjdGlvbnNcIik7XG5cdFx0XHRcdHJldHVybiBfY2hlY2tTdWJTZWN0aW9ucyhhU3ViU2VjdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IFY0Q29udGV4dCwgbmV3Q29udGV4dDogVjRDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kcyBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3Jcblx0ICogYWxsIGludGVybWVkaWF0ZXMgcGF0aHMgYmV0d2VlbiB0aGUgT1AgYW5kIHRoZSBzdWItT1AuXG5cdCAqXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBWNENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXX0=
|