@sapui5/sap.fe.core 1.102.2 → 1.104.1
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 +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +73 -30
- package/src/sap/fe/core/AppComponent.ts +65 -43
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- 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 +227 -126
- package/src/sap/fe/core/CommonUtils.ts +240 -163
- 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/BuildingBlock.js +181 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +150 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +585 -210
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +246 -96
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/EditFlow.js +379 -330
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +253 -245
- 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 +101 -74
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +69 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +67 -67
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +85 -77
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +103 -99
- 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 +9 -9
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +20 -12
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -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 +170 -139
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- 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 +200 -131
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- 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 +11 -10
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- 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 +190 -141
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +258 -210
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +183 -125
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +213 -156
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +164 -140
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +180 -150
- 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 +71 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +102 -82
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +61 -71
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +56 -64
- 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 +7 -2
- package/src/sap/fe/core/controls/FileWrapper.ts +15 -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 +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- 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 +52 -61
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -15
- 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 +64 -35
- package/src/sap/fe/core/converters/MetaModelConverter.ts +154 -129
- 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 +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- 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 +26 -33
- 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 +30 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -61
- package/src/sap/fe/core/converters/controls/Common/Form.js +27 -28
- package/src/sap/fe/core/converters/controls/Common/Form.ts +44 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +181 -197
- package/src/sap/fe/core/converters/controls/Common/Table.ts +251 -280
- 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 +65 -59
- 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 +77 -73
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +101 -97
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- 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 +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -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 -5
- 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 +55 -42
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +81 -66
- 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 +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -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 +1832 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +396 -269
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -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 +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- 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/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +99 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +82 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- 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 +39 -63
- package/src/sap/fe/core/messagebundle_ar.properties +25 -39
- package/src/sap/fe/core/messagebundle_bg.properties +25 -39
- package/src/sap/fe/core/messagebundle_ca.properties +25 -39
- package/src/sap/fe/core/messagebundle_cs.properties +25 -39
- package/src/sap/fe/core/messagebundle_cy.properties +25 -39
- package/src/sap/fe/core/messagebundle_da.properties +25 -39
- package/src/sap/fe/core/messagebundle_de.properties +25 -39
- package/src/sap/fe/core/messagebundle_el.properties +26 -40
- package/src/sap/fe/core/messagebundle_en.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_GB.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +25 -39
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +26 -18
- package/src/sap/fe/core/messagebundle_es.properties +27 -41
- package/src/sap/fe/core/messagebundle_es_MX.properties +25 -39
- package/src/sap/fe/core/messagebundle_et.properties +25 -39
- package/src/sap/fe/core/messagebundle_fi.properties +25 -39
- package/src/sap/fe/core/messagebundle_fr.properties +26 -40
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -39
- package/src/sap/fe/core/messagebundle_hi.properties +25 -39
- package/src/sap/fe/core/messagebundle_hr.properties +25 -39
- package/src/sap/fe/core/messagebundle_hu.properties +25 -39
- package/src/sap/fe/core/messagebundle_id.properties +25 -39
- package/src/sap/fe/core/messagebundle_it.properties +41 -55
- package/src/sap/fe/core/messagebundle_iw.properties +25 -39
- package/src/sap/fe/core/messagebundle_ja.properties +25 -39
- package/src/sap/fe/core/messagebundle_kk.properties +25 -39
- package/src/sap/fe/core/messagebundle_ko.properties +30 -44
- package/src/sap/fe/core/messagebundle_lt.properties +25 -39
- package/src/sap/fe/core/messagebundle_lv.properties +25 -39
- package/src/sap/fe/core/messagebundle_ms.properties +25 -39
- package/src/sap/fe/core/messagebundle_nl.properties +27 -41
- package/src/sap/fe/core/messagebundle_no.properties +25 -39
- package/src/sap/fe/core/messagebundle_pl.properties +26 -40
- package/src/sap/fe/core/messagebundle_pt.properties +26 -40
- package/src/sap/fe/core/messagebundle_pt_PT.properties +25 -39
- package/src/sap/fe/core/messagebundle_ro.properties +25 -39
- package/src/sap/fe/core/messagebundle_ru.properties +25 -39
- package/src/sap/fe/core/messagebundle_sh.properties +25 -39
- package/src/sap/fe/core/messagebundle_sk.properties +25 -39
- package/src/sap/fe/core/messagebundle_sl.properties +25 -39
- package/src/sap/fe/core/messagebundle_sv.properties +25 -39
- package/src/sap/fe/core/messagebundle_th.properties +25 -39
- package/src/sap/fe/core/messagebundle_tr.properties +25 -39
- package/src/sap/fe/core/messagebundle_uk.properties +25 -39
- package/src/sap/fe/core/messagebundle_vi.properties +25 -39
- package/src/sap/fe/core/messagebundle_zh_CN.properties +25 -39
- package/src/sap/fe/core/messagebundle_zh_TW.properties +25 -39
- 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 +97 -69
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +68 -69
- 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 +61 -49
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- 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 +92 -76
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -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 +224 -198
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +138 -139
- 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 +16 -15
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- 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 +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- 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
|
|
@@ -202,56 +203,81 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
202
203
|
this._getMessageHandler().removeTransitionMessages();
|
|
203
204
|
|
|
204
205
|
return this._syncTask(function () {
|
|
205
|
-
|
|
206
|
-
|
|
206
|
+
try {
|
|
207
|
+
if (originalBindingContext) {
|
|
208
|
+
transactionHelper.handleDocumentModifications();
|
|
207
209
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
210
|
+
if (!_this3._isFclEnabled()) {
|
|
211
|
+
EditState.setEditStateDirty();
|
|
212
|
+
}
|
|
211
213
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
+
if (bIsDraft) {
|
|
215
|
+
_this3._setDraftStatus(DraftStatus.Saving);
|
|
216
|
+
}
|
|
214
217
|
}
|
|
215
|
-
}
|
|
216
218
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
219
|
+
_this3._getMessageHandler().removeTransitionMessages();
|
|
220
|
+
|
|
221
|
+
var _temp14 = _finallyRethrows(function () {
|
|
222
|
+
return _catch(function () {
|
|
223
|
+
return Promise.resolve(oPromise).then(function () {
|
|
224
|
+
// If a navigation happened while oPromise was being resolved, the binding context of the page changed
|
|
225
|
+
// In that case, we shouldn't do anything
|
|
226
|
+
var oBindingContext = _this3.getView().getBindingContext();
|
|
227
|
+
|
|
228
|
+
var _temp12 = function () {
|
|
229
|
+
if (bIsDraft && oBindingContext && oBindingContext === originalBindingContext) {
|
|
230
|
+
var oMetaModel = oBindingContext.getModel().getMetaModel(),
|
|
231
|
+
sEntitySetName = oMetaModel.getMetaContext(oBindingContext.getPath()).getObject("@sapui.name"),
|
|
232
|
+
aSemanticKeys = SemanticKeyHelper.getSemanticKeys(oMetaModel, sEntitySetName);
|
|
233
|
+
|
|
234
|
+
var _temp15 = function () {
|
|
235
|
+
if (aSemanticKeys && aSemanticKeys.length) {
|
|
236
|
+
var oCurrentSemanticMapping = _this3._getSemanticMapping(),
|
|
237
|
+
sCurrentSemanticPath = oCurrentSemanticMapping && oCurrentSemanticMapping.semanticPath,
|
|
238
|
+
sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext, true); // sCurrentSemanticPath could be null if we have navigated via deep link then there are no semanticMappings to calculate it from
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
var _temp16 = function () {
|
|
242
|
+
if (sCurrentSemanticPath && sCurrentSemanticPath !== sChangedPath) {
|
|
243
|
+
return Promise.resolve(_this3._handleNewContext(oBindingContext, true, false, true)).then(function () {
|
|
244
|
+
_this3._setDraftStatus(DraftStatus.Saved);
|
|
245
|
+
});
|
|
246
|
+
} else {
|
|
247
|
+
_this3._setDraftStatus(DraftStatus.Saved);
|
|
248
|
+
}
|
|
249
|
+
}();
|
|
223
250
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
251
|
+
if (_temp16 && _temp16.then) return _temp16.then(function () {});
|
|
252
|
+
} else {
|
|
253
|
+
_this3._setDraftStatus(DraftStatus.Saved);
|
|
254
|
+
}
|
|
255
|
+
}();
|
|
228
256
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
sChangedPath = SemanticKeyHelper.getSemanticPath(oBindingContext, true); // sCurrentSemanticPath could be null if we have navigated via deep link then there are no semanticMappings to calculate it from
|
|
257
|
+
if (_temp15 && _temp15.then) return _temp15.then(function () {});
|
|
258
|
+
}
|
|
259
|
+
}();
|
|
233
260
|
|
|
261
|
+
if (_temp12 && _temp12.then) return _temp12.then(function () {});
|
|
262
|
+
});
|
|
263
|
+
}, function (oError) {
|
|
264
|
+
Log.error("Error while updating the document", oError);
|
|
234
265
|
|
|
235
|
-
if (
|
|
236
|
-
|
|
237
|
-
_this3._setDraftStatus(DraftStatus.Saved);
|
|
238
|
-
});
|
|
239
|
-
} else {
|
|
240
|
-
_this3._setDraftStatus(DraftStatus.Saved);
|
|
266
|
+
if (bIsDraft && originalBindingContext) {
|
|
267
|
+
_this3._setDraftStatus(DraftStatus.Clear);
|
|
241
268
|
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
});
|
|
269
|
+
});
|
|
270
|
+
}, function (_wasThrown, _result) {
|
|
271
|
+
_this3._getMessageHandler().showMessages();
|
|
272
|
+
|
|
273
|
+
if (_wasThrown) throw _result;
|
|
274
|
+
return _result;
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
return Promise.resolve(_temp14 && _temp14.then ? _temp14.then(function () {}) : void 0);
|
|
278
|
+
} catch (e) {
|
|
279
|
+
return Promise.reject(e);
|
|
280
|
+
}
|
|
255
281
|
});
|
|
256
282
|
} // Internal only params ---
|
|
257
283
|
// * @param {string} mParameters.creationMode The creation mode using one of the following:
|
|
@@ -266,15 +292,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
266
292
|
* Creates a new document.
|
|
267
293
|
*
|
|
268
294
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
269
|
-
* @param
|
|
270
|
-
* @param
|
|
271
|
-
* @param
|
|
295
|
+
* @param vListBinding ODataListBinding object or the binding path for a temporary list binding
|
|
296
|
+
* @param mInParameters Contains the following attributes:
|
|
297
|
+
* @param mInParameters.creationMode The creation mode using one of the following:
|
|
272
298
|
* NewPage - the created document is shown in a new page, depending on whether metadata 'Sync', 'Async' or 'Deferred' is used
|
|
273
299
|
* Inline - The creation is done inline (in a table)
|
|
274
300
|
* External - The creation is done in a different application specified via the parameter 'outbound'
|
|
275
|
-
* @param
|
|
276
|
-
* @param
|
|
277
|
-
* @returns
|
|
301
|
+
* @param mInParameters.outbound The navigation target where the document is created in case of creationMode 'External'
|
|
302
|
+
* @param mInParameters.createAtEnd Specifies if the new entry should be created at the top or bottom of a table in case of creationMode 'Inline'
|
|
303
|
+
* @returns Promise resolves once the object has been created
|
|
278
304
|
* @alias sap.fe.core.controllerextensions.EditFlow#createDocument
|
|
279
305
|
* @public
|
|
280
306
|
* @since 1.90.0
|
|
@@ -327,11 +353,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
327
353
|
if (mParameters.creationMode === CreationMode.Inline && mParameters.tableId) {
|
|
328
354
|
oTable = this.getView().byId(mParameters.tableId);
|
|
329
355
|
}
|
|
330
|
-
/**
|
|
331
|
-
* @param {sap.ui.model.odata.v4.ODataListBinding} oListBinding
|
|
332
|
-
* @param {object} oCreationPromise
|
|
333
|
-
*/
|
|
334
356
|
|
|
357
|
+
if (oTable && oTable.isA("sap.ui.mdc.Table")) {
|
|
358
|
+
var fnFocusOrScroll = mParameters.creationMode === CreationMode.Inline ? oTable.focusRow.bind(oTable) : oTable.scrollToIndex.bind(oTable);
|
|
359
|
+
oTable.getRowBinding().attachEventOnce("change", function () {
|
|
360
|
+
fnFocusOrScroll(mParameters.createAtEnd ? oTable.getRowBinding().getLength() : 0, true);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
335
363
|
|
|
336
364
|
var handleSideEffects = function (oListBinding, oCreationPromise) {
|
|
337
365
|
oCreationPromise.then(function (oNewContext) {
|
|
@@ -344,16 +372,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
344
372
|
|
|
345
373
|
|
|
346
374
|
if (!CommonUtils.hasTransientContext(oListBinding)) {
|
|
347
|
-
var
|
|
348
|
-
|
|
349
|
-
_oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
|
|
375
|
+
var appComponent = CommonUtils.getAppComponent(_this4.getView());
|
|
376
|
+
appComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oBindingContext);
|
|
350
377
|
}
|
|
351
378
|
}).catch(function (oError) {
|
|
352
379
|
Log.error("Error while creating the document", oError);
|
|
353
380
|
});
|
|
354
381
|
};
|
|
355
382
|
/**
|
|
356
|
-
* @param
|
|
383
|
+
* @param aValidationMessages Error messages from custom validation function
|
|
357
384
|
*/
|
|
358
385
|
|
|
359
386
|
|
|
@@ -378,7 +405,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
378
405
|
var _oFieldControl$getBin;
|
|
379
406
|
|
|
380
407
|
oFieldControl = Core.getControl(mCustomValidity[oValidationMessage.messageTarget].fieldId);
|
|
381
|
-
sTarget = ((_oFieldControl$getBin = oFieldControl.getBindingContext()) === null || _oFieldControl$getBin === void 0 ? void 0 : _oFieldControl$getBin.getPath()
|
|
408
|
+
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
409
|
|
|
383
410
|
if (oMessageManager.getMessageModel().getData().filter(function (oMessage) {
|
|
384
411
|
return oMessage.target === sTarget;
|
|
@@ -416,7 +443,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
416
443
|
}
|
|
417
444
|
};
|
|
418
445
|
|
|
419
|
-
|
|
446
|
+
if (bShouldBusyLock) {
|
|
447
|
+
BusyLocker.lock(oLockObject);
|
|
448
|
+
}
|
|
449
|
+
|
|
420
450
|
return this._syncTask(oExecCustomValidation).then(function (aValidationMessages) {
|
|
421
451
|
if (aValidationMessages.length > 0) {
|
|
422
452
|
createCustomValidationMessages(aValidationMessages);
|
|
@@ -455,10 +485,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
455
485
|
var sPath = oListBinding.getPath(),
|
|
456
486
|
// if NewAction with parameters is present, then creation is 'Deferred'
|
|
457
487
|
// in the absence of NewAction or NewAction with parameters, creation is async
|
|
458
|
-
sNewAction = sProgrammingModel === ProgrammingModel.Draft ? oMetaModel.getObject(sPath
|
|
488
|
+
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
489
|
|
|
460
490
|
if (sNewAction) {
|
|
461
|
-
var aParameters = oMetaModel.getObject("/"
|
|
491
|
+
var aParameters = oMetaModel.getObject("/".concat(sNewAction, "/@$ui5.overload/0/$Parameter")) || []; // binding parameter (eg: _it) is not considered
|
|
462
492
|
|
|
463
493
|
if (aParameters.length > 1) {
|
|
464
494
|
return CreationMode.Deferred;
|
|
@@ -475,7 +505,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
475
505
|
|
|
476
506
|
return CreationMode.Async;
|
|
477
507
|
}
|
|
478
|
-
}).then(function (
|
|
508
|
+
}).then(function (resolvedCreationMode) {
|
|
479
509
|
var oCreation;
|
|
480
510
|
var mArgs;
|
|
481
511
|
var oCreationRow = mParameters.creationRow;
|
|
@@ -487,15 +517,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
487
517
|
|
|
488
518
|
var oRoutingListener = _this4._getRoutingListener();
|
|
489
519
|
|
|
490
|
-
if (
|
|
491
|
-
if (
|
|
520
|
+
if (resolvedCreationMode !== CreationMode.Deferred) {
|
|
521
|
+
if (resolvedCreationMode === CreationMode.CreationRow) {
|
|
492
522
|
oCreationRowContext = oCreationRow.getBindingContext();
|
|
493
523
|
sMetaPath = oMetaModel.getMetaPath(oCreationRowContext.getPath()); // prefill data from creation row
|
|
494
524
|
|
|
495
525
|
oPayload = oCreationRowContext.getObject();
|
|
496
526
|
mParameters.data = {};
|
|
497
527
|
Object.keys(oPayload).forEach(function (sPropertyPath) {
|
|
498
|
-
var oProperty = oMetaModel.getObject(sMetaPath
|
|
528
|
+
var oProperty = oMetaModel.getObject("".concat(sMetaPath, "/").concat(sPropertyPath)); // ensure navigation properties are not part of the payload, deep create not supported
|
|
499
529
|
|
|
500
530
|
if (oProperty && oProperty.$kind === "NavigationProperty") {
|
|
501
531
|
return;
|
|
@@ -506,7 +536,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
506
536
|
oValidationCheck = _this4._checkForValidationErrors();
|
|
507
537
|
}
|
|
508
538
|
|
|
509
|
-
if (
|
|
539
|
+
if (resolvedCreationMode === CreationMode.CreationRow || resolvedCreationMode === CreationMode.Inline) {
|
|
510
540
|
mParameters.keepTransientContextOnFailed = false; // currently not fully supported
|
|
511
541
|
// busy handling shall be done locally only
|
|
512
542
|
|
|
@@ -528,7 +558,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
528
558
|
|
|
529
559
|
var oNavigation;
|
|
530
560
|
|
|
531
|
-
switch (
|
|
561
|
+
switch (resolvedCreationMode) {
|
|
532
562
|
case CreationMode.Deferred:
|
|
533
563
|
oNavigation = oRoutingListener.navigateForwardToContext(oListBinding, {
|
|
534
564
|
bDeferredContext: true,
|
|
@@ -557,11 +587,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
557
587
|
|
|
558
588
|
oNavigation = oCreation.then(function (oNewDocumentContext) {
|
|
559
589
|
if (!oNewDocumentContext) {
|
|
560
|
-
var
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
description: _oResourceBundle.getText("C_EDITFLOW_SAPFE_CREATION_FAILED_DESCRIPTION")
|
|
590
|
+
var coreResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
591
|
+
return oRoutingListener.navigateToMessagePage(coreResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
|
|
592
|
+
title: coreResourceBundle.getText("C_COMMON_SAPFE_ERROR"),
|
|
593
|
+
description: coreResourceBundle.getText("C_EDITFLOW_SAPFE_CREATION_FAILED_DESCRIPTION")
|
|
565
594
|
});
|
|
566
595
|
} else {
|
|
567
596
|
return oRoutingListener.navigateForwardToContext(oNewDocumentContext, mArgs);
|
|
@@ -604,7 +633,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
604
633
|
break;
|
|
605
634
|
|
|
606
635
|
default:
|
|
607
|
-
oNavigation = Promise.reject("Unhandled creationMode "
|
|
636
|
+
oNavigation = Promise.reject("Unhandled creationMode ".concat(resolvedCreationMode));
|
|
608
637
|
break;
|
|
609
638
|
}
|
|
610
639
|
|
|
@@ -643,14 +672,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
643
672
|
}
|
|
644
673
|
});
|
|
645
674
|
}).finally(function () {
|
|
646
|
-
if (
|
|
647
|
-
|
|
648
|
-
oTable.getRowBinding().attachEventOnce("change", function () {
|
|
649
|
-
fnFocusOrScroll(mParameters.createAtEnd ? oTable.getRowBinding().getLength() : 0, true);
|
|
650
|
-
});
|
|
675
|
+
if (bShouldBusyLock) {
|
|
676
|
+
BusyLocker.unlock(oLockObject);
|
|
651
677
|
}
|
|
652
|
-
|
|
653
|
-
bShouldBusyLock && BusyLocker.unlock(oLockObject);
|
|
654
678
|
});
|
|
655
679
|
}
|
|
656
680
|
/**
|
|
@@ -660,9 +684,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
660
684
|
*
|
|
661
685
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
662
686
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
663
|
-
*
|
|
664
|
-
* @param
|
|
665
|
-
* @
|
|
687
|
+
*
|
|
688
|
+
* @param mParameters Object containing the parameters passed to onBeforeSave
|
|
689
|
+
* @param mParameters.context Page context that is going to be saved.
|
|
690
|
+
* @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
691
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
667
692
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeSave
|
|
668
693
|
* @public
|
|
@@ -682,10 +707,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
682
707
|
*
|
|
683
708
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
684
709
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
685
|
-
*
|
|
686
|
-
* @param
|
|
687
|
-
* @param
|
|
688
|
-
* @
|
|
710
|
+
*
|
|
711
|
+
* @param mParameters Object containing the parameters passed to onBeforeCreate
|
|
712
|
+
* @param mParameters.contextPath Path pointing to the context on which Create action is triggered
|
|
713
|
+
* @param mParameters.createParameters Array of values that are filled in the Action Parameter Dialog
|
|
714
|
+
* @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
715
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
690
716
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeCreate
|
|
691
717
|
* @public
|
|
@@ -705,9 +731,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
705
731
|
*
|
|
706
732
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
707
733
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
708
|
-
*
|
|
709
|
-
* @param
|
|
710
|
-
* @
|
|
734
|
+
*
|
|
735
|
+
* @param mParameters Object containing the parameters passed to onBeforeEdit
|
|
736
|
+
* @param mParameters.context Page context that is going to be edited.
|
|
737
|
+
* @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
738
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
712
739
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeEdit
|
|
713
740
|
* @public
|
|
@@ -727,9 +754,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
727
754
|
*
|
|
728
755
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
729
756
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
730
|
-
*
|
|
731
|
-
* @param
|
|
732
|
-
* @
|
|
757
|
+
*
|
|
758
|
+
* @param mParameters Object containing the parameters passed to onBeforeDiscard
|
|
759
|
+
* @param mParameters.context Page context that is going to be discarded.
|
|
760
|
+
* @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
761
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
734
762
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeDiscard
|
|
735
763
|
* @public
|
|
@@ -749,9 +777,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
749
777
|
*
|
|
750
778
|
* This function is meant to be individually overridden by consuming controllers, but not to be called directly.
|
|
751
779
|
* The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
|
|
752
|
-
*
|
|
753
|
-
* @param
|
|
754
|
-
* @
|
|
780
|
+
*
|
|
781
|
+
* @param mParameters Object containing the parameters passed to onBeforeDelete
|
|
782
|
+
* @param mParameters.contexts An array of contexts that are going to be deleted
|
|
783
|
+
* @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
784
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
756
785
|
* @alias sap.fe.core.controllerextensions.EditFlow#onBeforeDelete
|
|
757
786
|
* @public
|
|
@@ -774,8 +803,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
774
803
|
* Saves a new document after checking it.
|
|
775
804
|
*
|
|
776
805
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
777
|
-
* @param
|
|
778
|
-
* @returns
|
|
806
|
+
* @param oContext Context of the editable document
|
|
807
|
+
* @returns Promise resolves once save is complete
|
|
779
808
|
* @alias sap.fe.core.controllerextensions.EditFlow#saveDocument
|
|
780
809
|
* @public
|
|
781
810
|
* @since 1.90.0
|
|
@@ -802,7 +831,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
802
831
|
return Promise.resolve(_this6.base.editFlow.onBeforeSave({
|
|
803
832
|
context: oContext
|
|
804
833
|
})).then(function () {
|
|
805
|
-
function
|
|
834
|
+
function _temp19() {
|
|
806
835
|
return Promise.resolve(transactionHelper.saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, _this6._getMessageHandler())).then(function (activeDocumentContext) {
|
|
807
836
|
_this6._removeContextsFromPages();
|
|
808
837
|
|
|
@@ -810,13 +839,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
810
839
|
|
|
811
840
|
_this6._sendActivity(Activity.Activate, activeDocumentContext);
|
|
812
841
|
|
|
813
|
-
_this6._triggerConfiguredSurvey(
|
|
842
|
+
_this6._triggerConfiguredSurvey(StandardActions.save, TriggerType.standardAction);
|
|
814
843
|
|
|
815
844
|
_this6._setEditMode(EditMode.Display, false);
|
|
816
845
|
|
|
817
846
|
_this6._getMessageHandler().showMessageDialog();
|
|
818
847
|
|
|
819
|
-
var
|
|
848
|
+
var _temp17 = function () {
|
|
820
849
|
if (activeDocumentContext !== oContext) {
|
|
821
850
|
var _contextToNavigate2 = activeDocumentContext;
|
|
822
851
|
|
|
@@ -836,7 +865,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
836
865
|
}
|
|
837
866
|
}();
|
|
838
867
|
|
|
839
|
-
if (
|
|
868
|
+
if (_temp17 && _temp17.then) return _temp17.then(function () {});
|
|
840
869
|
});
|
|
841
870
|
}
|
|
842
871
|
|
|
@@ -846,7 +875,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
846
875
|
|
|
847
876
|
var siblingInfo;
|
|
848
877
|
|
|
849
|
-
var
|
|
878
|
+
var _temp18 = function () {
|
|
850
879
|
if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && oRootViewController.isFclEnabled()) {
|
|
851
880
|
// No need to try to get rightmost context in case of a new object
|
|
852
881
|
return Promise.resolve(_this6._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel, true)).then(function (_this5$_computeSiblin) {
|
|
@@ -855,7 +884,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
855
884
|
}
|
|
856
885
|
}();
|
|
857
886
|
|
|
858
|
-
return
|
|
887
|
+
return _temp18 && _temp18.then ? _temp18.then(_temp19) : _temp19(_temp18);
|
|
859
888
|
});
|
|
860
889
|
});
|
|
861
890
|
});
|
|
@@ -923,7 +952,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
923
952
|
}();
|
|
924
953
|
});
|
|
925
954
|
}, function (oError) {
|
|
926
|
-
return Promise.reject("Error in EditFlow.toggleDraftActive:"
|
|
955
|
+
return Promise.reject("Error in EditFlow.toggleDraftActive:".concat(oError));
|
|
927
956
|
}));
|
|
928
957
|
} catch (e) {
|
|
929
958
|
return Promise.reject(e);
|
|
@@ -937,10 +966,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
937
966
|
*
|
|
938
967
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
939
968
|
* @param oContext Context of the editable document
|
|
940
|
-
* @param
|
|
941
|
-
* @param
|
|
942
|
-
* @param
|
|
943
|
-
* @returns
|
|
969
|
+
* @param mParameters Can contain the following attributes:
|
|
970
|
+
* @param mParameters.control This is the control used to open the discard popover
|
|
971
|
+
* @param mParameters.skipDiscardPopover Optional, supresses the discard popover and allows custom handling
|
|
972
|
+
* @returns Promise resolves once editable document has been discarded
|
|
944
973
|
* @alias sap.fe.core.controllerextensions.EditFlow#cancelDocument
|
|
945
974
|
* @public
|
|
946
975
|
* @since 1.90.0
|
|
@@ -963,7 +992,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
963
992
|
mInParameters.beforeCancelCallBack = _this10.base.editFlow.onBeforeDiscard;
|
|
964
993
|
return Promise.resolve(_catch(function () {
|
|
965
994
|
return Promise.resolve(_this10._syncTask()).then(function () {
|
|
966
|
-
function
|
|
995
|
+
function _temp22() {
|
|
967
996
|
return Promise.resolve(transactionHelper.cancelDocument(oContext, mInParameters, oResourceBundle, _this10._getMessageHandler())).then(function (oActiveDocumentContext) {
|
|
968
997
|
var bDraftNavigation = true;
|
|
969
998
|
|
|
@@ -983,13 +1012,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
983
1012
|
_this10._sendActivity(Activity.Discard, undefined); //in case of a new document, no activeContext is returned --> navigate back.
|
|
984
1013
|
|
|
985
1014
|
|
|
986
|
-
var
|
|
1015
|
+
var _temp23 = function () {
|
|
987
1016
|
if (!mInParameters.skipBackNavigation) {
|
|
988
1017
|
return Promise.resolve(_this10._getRoutingListener().navigateBackFromContext(oContext)).then(function () {});
|
|
989
1018
|
}
|
|
990
1019
|
}();
|
|
991
1020
|
|
|
992
|
-
if (
|
|
1021
|
+
if (_temp23 && _temp23.then) return _temp23.then(function () {});
|
|
993
1022
|
} else {
|
|
994
1023
|
_this10._sendActivity(Activity.Discard, oActiveDocumentContext);
|
|
995
1024
|
|
|
@@ -1035,7 +1064,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1035
1064
|
|
|
1036
1065
|
var sProgrammingModel = _this10._getProgrammingModel(oContext);
|
|
1037
1066
|
|
|
1038
|
-
var
|
|
1067
|
+
var _temp21 = function () {
|
|
1039
1068
|
if ((sProgrammingModel === ProgrammingModel.Sticky || oContext.getProperty("HasActiveEntity")) && _this10._isFclEnabled()) {
|
|
1040
1069
|
var _oRootViewController = _this10._getRootViewController(); // No need to try to get rightmost context in case of a new object
|
|
1041
1070
|
|
|
@@ -1046,7 +1075,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1046
1075
|
}
|
|
1047
1076
|
}();
|
|
1048
1077
|
|
|
1049
|
-
return
|
|
1078
|
+
return _temp21 && _temp21.then ? _temp21.then(_temp22) : _temp22(_temp21);
|
|
1050
1079
|
});
|
|
1051
1080
|
}, function (oError) {
|
|
1052
1081
|
Log.error("Error while discarding the document", oError);
|
|
@@ -1061,11 +1090,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1061
1090
|
* Deletes the document.
|
|
1062
1091
|
*
|
|
1063
1092
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1064
|
-
* @param
|
|
1065
|
-
* @param
|
|
1066
|
-
* @param
|
|
1067
|
-
* @param
|
|
1068
|
-
* @returns
|
|
1093
|
+
* @param oContext Context of the document
|
|
1094
|
+
* @param mInParameters Can contain the following attributes:
|
|
1095
|
+
* @param mInParameters.title Title of the object being deleted
|
|
1096
|
+
* @param mInParameters.description Description of the object being deleted
|
|
1097
|
+
* @returns Promise resolves once document has been deleted
|
|
1069
1098
|
* @alias sap.fe.core.controllerextensions.EditFlow#deleteDocument
|
|
1070
1099
|
* @public
|
|
1071
1100
|
* @since 1.90.0
|
|
@@ -1094,14 +1123,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1094
1123
|
EditState.setEditStateDirty();
|
|
1095
1124
|
}
|
|
1096
1125
|
|
|
1097
|
-
_this11._sendActivity(Activity.Delete, oContext);
|
|
1098
|
-
|
|
1099
|
-
_this11._getRoutingListener().navigateBackFromContext(oContext); // After delete is successfull, we need to dettch the setBackNavigation Methods
|
|
1126
|
+
_this11._sendActivity(Activity.Delete, oContext); // After delete is successfull, we need to detach the setBackNavigation Methods
|
|
1100
1127
|
|
|
1101
1128
|
|
|
1102
1129
|
if (oAppComponent) {
|
|
1103
1130
|
oAppComponent.getShellServices().setBackNavigation();
|
|
1104
1131
|
}
|
|
1132
|
+
|
|
1133
|
+
if ((oAppComponent === null || oAppComponent === void 0 ? void 0 : oAppComponent.getStartupMode()) === StartupMode.Deeplink && !_this11._isFclEnabled()) {
|
|
1134
|
+
// In case the app has been launched with semantic keys, deleting the object we've landed on shall navigate back
|
|
1135
|
+
// to the app we came from (except for FCL, where we navigate to LR as usual)
|
|
1136
|
+
oAppComponent.getRouterProxy().exitFromApp();
|
|
1137
|
+
} else {
|
|
1138
|
+
_this11._getRoutingListener().navigateBackFromContext(oContext);
|
|
1139
|
+
}
|
|
1105
1140
|
}).catch(function (oError) {
|
|
1106
1141
|
Log.error("Error while deleting the document", oError);
|
|
1107
1142
|
});
|
|
@@ -1110,8 +1145,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1110
1145
|
* Submit the current set of changes and navigate back.
|
|
1111
1146
|
*
|
|
1112
1147
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1113
|
-
* @param
|
|
1114
|
-
* @returns
|
|
1148
|
+
* @param oContext Context of the document
|
|
1149
|
+
* @returns Promise resolves once the changes have been saved
|
|
1115
1150
|
* @alias sap.fe.core.controllerextensions.EditFlow#applyDocument
|
|
1116
1151
|
* @public
|
|
1117
1152
|
* @since 1.90.0
|
|
@@ -1126,7 +1161,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1126
1161
|
|
|
1127
1162
|
BusyLocker.lock(oLockObject);
|
|
1128
1163
|
|
|
1129
|
-
var
|
|
1164
|
+
var _temp25 = _finallyRethrows(function () {
|
|
1130
1165
|
return Promise.resolve(_this13._syncTask()).then(function () {
|
|
1131
1166
|
return Promise.resolve(_this13._submitOpenChanges(oContext)).then(function () {
|
|
1132
1167
|
return Promise.resolve(_this13._checkForValidationErrors()).then(function () {
|
|
@@ -1136,16 +1171,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1136
1171
|
});
|
|
1137
1172
|
});
|
|
1138
1173
|
});
|
|
1139
|
-
}, function (
|
|
1174
|
+
}, function (_wasThrown2, _result9) {
|
|
1140
1175
|
if (BusyLocker.isLocked(oLockObject)) {
|
|
1141
1176
|
BusyLocker.unlock(oLockObject);
|
|
1142
1177
|
}
|
|
1143
1178
|
|
|
1144
|
-
if (
|
|
1145
|
-
return
|
|
1179
|
+
if (_wasThrown2) throw _result9;
|
|
1180
|
+
return _result9;
|
|
1146
1181
|
});
|
|
1147
1182
|
|
|
1148
|
-
return Promise.resolve(
|
|
1183
|
+
return Promise.resolve(_temp25 && _temp25.then ? _temp25.then(function () {}) : void 0);
|
|
1149
1184
|
} catch (e) {
|
|
1150
1185
|
return Promise.reject(e);
|
|
1151
1186
|
}
|
|
@@ -1158,215 +1193,226 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1158
1193
|
* 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
1194
|
*
|
|
1160
1195
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1161
|
-
* @param
|
|
1162
|
-
* @param
|
|
1163
|
-
* @param
|
|
1164
|
-
* @param
|
|
1165
|
-
* @param
|
|
1166
|
-
* @param
|
|
1167
|
-
* @param
|
|
1168
|
-
* @param
|
|
1169
|
-
* @returns
|
|
1196
|
+
* @param sActionName The name of the action to be called
|
|
1197
|
+
* @param mInParameters Contains the following attributes:
|
|
1198
|
+
* @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
|
|
1199
|
+
* @param mInParameters.model For an unbound action, an instance of an OData V4 model must be provided
|
|
1200
|
+
* @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
|
|
1201
|
+
* @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
|
|
1202
|
+
* @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
|
|
1203
|
+
* @param mExtraParams PRIVATE
|
|
1204
|
+
* @returns A promise once the action has been invoked
|
|
1170
1205
|
* @alias sap.fe.core.controllerextensions.EditFlow#invokeAction
|
|
1171
1206
|
* @public
|
|
1172
1207
|
* @since 1.90.0
|
|
1173
1208
|
* @final
|
|
1174
|
-
|
|
1209
|
+
*/
|
|
1175
1210
|
;
|
|
1176
1211
|
|
|
1177
1212
|
_proto.invokeAction = function invokeAction(sActionName, mInParameters, mExtraParams) {
|
|
1178
|
-
|
|
1213
|
+
try {
|
|
1214
|
+
var _this15 = this;
|
|
1179
1215
|
|
|
1180
|
-
|
|
1216
|
+
var oControl;
|
|
1181
1217
|
|
|
1182
|
-
|
|
1218
|
+
var transactionHelper = _this15._getTransactionHelper();
|
|
1183
1219
|
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
var oView = this.getView();
|
|
1190
|
-
var mParameters = mInParameters || {}; // Due to a mistake the invokeAction in the extensionAPI had a different API than this one.
|
|
1191
|
-
// The one from the extensionAPI doesn't exist anymore as we expose the full edit flow now but
|
|
1192
|
-
// due to compatibility reasons we still need to support the old signature
|
|
1193
|
-
|
|
1194
|
-
if (mParameters.isA && mParameters.isA("sap.ui.model.odata.v4.Context") || Array.isArray(mParameters) || arguments.length === 3) {
|
|
1195
|
-
var contexts = mParameters;
|
|
1196
|
-
mParameters = mExtraParams || {};
|
|
1197
|
-
|
|
1198
|
-
if (contexts) {
|
|
1199
|
-
mParameters.contexts = contexts;
|
|
1200
|
-
} else {
|
|
1201
|
-
mParameters.model = this.getView().getModel();
|
|
1202
|
-
}
|
|
1203
|
-
}
|
|
1220
|
+
var oCurrentControl;
|
|
1221
|
+
var oBindingContext;
|
|
1222
|
+
var aParts;
|
|
1223
|
+
var sOverloadEntityType;
|
|
1224
|
+
var oCurrentActionCallBacks;
|
|
1204
1225
|
|
|
1205
|
-
|
|
1226
|
+
var oView = _this15.getView();
|
|
1206
1227
|
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1228
|
+
var mParameters = mInParameters || {}; // Due to a mistake the invokeAction in the extensionAPI had a different API than this one.
|
|
1229
|
+
// The one from the extensionAPI doesn't exist anymore as we expose the full edit flow now but
|
|
1230
|
+
// due to compatibility reasons we still need to support the old signature
|
|
1210
1231
|
|
|
1211
|
-
|
|
1212
|
-
|
|
1232
|
+
if (mParameters.isA && mParameters.isA("sap.ui.model.odata.v4.Context") || Array.isArray(mParameters) || mExtraParams !== undefined) {
|
|
1233
|
+
var contexts = mParameters;
|
|
1234
|
+
mParameters = mExtraParams || {};
|
|
1213
1235
|
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1236
|
+
if (contexts) {
|
|
1237
|
+
mParameters.contexts = contexts;
|
|
1238
|
+
} else {
|
|
1239
|
+
mParameters.model = _this15.getView().getModel();
|
|
1240
|
+
}
|
|
1217
1241
|
}
|
|
1218
|
-
} else {
|
|
1219
|
-
mParameters.internalModelContext = oView.getBindingContext("internal");
|
|
1220
|
-
}
|
|
1221
1242
|
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
aParts = sActionName.split("(");
|
|
1228
|
-
sActionName = aParts[0];
|
|
1229
|
-
sOverloadEntityType = aParts[aParts.length - 1].replaceAll(")", "");
|
|
1230
|
-
}
|
|
1243
|
+
mParameters.isNavigable = mParameters.requiresNavigation || mParameters.isNavigable;
|
|
1244
|
+
|
|
1245
|
+
if (!mParameters.parentControl) {
|
|
1246
|
+
mParameters.parentControl = _this15.getView();
|
|
1247
|
+
}
|
|
1231
1248
|
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1249
|
+
if (mParameters.controlId) {
|
|
1250
|
+
oControl = _this15.getView().byId(mParameters.controlId);
|
|
1251
|
+
|
|
1252
|
+
if (oControl) {
|
|
1253
|
+
// TODO: currently this selected contexts update is done within the operation, should be moved out
|
|
1254
|
+
mParameters.internalModelContext = oControl.getBindingContext("internal");
|
|
1255
|
+
}
|
|
1235
1256
|
} else {
|
|
1236
|
-
|
|
1237
|
-
oListBinding = new ODataListBinding(this.getView().getModel(), sBindingPath);
|
|
1238
|
-
mParameters.contexts = oListBinding.getHeaderContext();
|
|
1257
|
+
mParameters.internalModelContext = oView.getBindingContext("internal");
|
|
1239
1258
|
}
|
|
1240
1259
|
|
|
1241
|
-
if (
|
|
1242
|
-
|
|
1260
|
+
if (sActionName && sActionName.indexOf("(") > -1) {
|
|
1261
|
+
// get entity type of action overload and remove it from the action path
|
|
1262
|
+
// Example sActionName = "<ActionName>(Collection(<OverloadEntityType>))"
|
|
1263
|
+
// sActionName = aParts[0] --> <ActionName>
|
|
1264
|
+
// sOverloadEntityType = aParts[2] --> <OverloadEntityType>
|
|
1265
|
+
aParts = sActionName.split("(");
|
|
1266
|
+
sActionName = aParts[0];
|
|
1267
|
+
sOverloadEntityType = aParts[aParts.length - 1].replaceAll(")", "");
|
|
1268
|
+
}
|
|
1243
1269
|
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1270
|
+
if (mParameters.bStaticAction) {
|
|
1271
|
+
if (oControl.isTableBound()) {
|
|
1272
|
+
mParameters.contexts = oControl.getRowBinding().getHeaderContext();
|
|
1273
|
+
} else {
|
|
1274
|
+
var sBindingPath = oControl.data("rowsBindingInfo").path,
|
|
1275
|
+
oListBinding = new ODataListBinding(_this15.getView().getModel(), sBindingPath);
|
|
1276
|
+
mParameters.contexts = oListBinding.getHeaderContext();
|
|
1277
|
+
}
|
|
1247
1278
|
|
|
1248
|
-
|
|
1249
|
-
|
|
1279
|
+
if (sOverloadEntityType) {
|
|
1280
|
+
var sTableContextEntityType = mParameters.contexts.getModel().getMetaModel().getMetaContext(mParameters.contexts.getPath()).getObject("$Type");
|
|
1250
1281
|
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1282
|
+
if (sOverloadEntityType !== sTableContextEntityType) {
|
|
1283
|
+
// search for context in control tree hierarchy
|
|
1284
|
+
oCurrentControl = oControl;
|
|
1285
|
+
|
|
1286
|
+
while (oCurrentControl) {
|
|
1287
|
+
oBindingContext = oCurrentControl.getBindingContext();
|
|
1288
|
+
|
|
1289
|
+
if (oBindingContext && oBindingContext.getModel().getMetaModel().getMetaContext(oBindingContext.getPath()).getObject("$Type") === sOverloadEntityType) {
|
|
1290
|
+
mParameters.contexts = oBindingContext;
|
|
1291
|
+
break;
|
|
1292
|
+
} else {
|
|
1293
|
+
// check parent
|
|
1294
|
+
oCurrentControl = oCurrentControl.getParent();
|
|
1295
|
+
}
|
|
1296
|
+
} // context was not found in UI hierarchy going straight upwards - try to find it in SubSections
|
|
1259
1297
|
|
|
1260
1298
|
|
|
1261
|
-
|
|
1262
|
-
|
|
1299
|
+
if (!oCurrentControl) {
|
|
1300
|
+
var oActionOverloadContext = _this15._getActionOverloadContextFromSubSections(oControl, sOverloadEntityType);
|
|
1263
1301
|
|
|
1264
|
-
|
|
1265
|
-
|
|
1302
|
+
if (oActionOverloadContext !== undefined) {
|
|
1303
|
+
mParameters.contexts = oActionOverloadContext;
|
|
1304
|
+
}
|
|
1266
1305
|
}
|
|
1267
|
-
}
|
|
1268
1306
|
|
|
1269
|
-
|
|
1270
|
-
|
|
1307
|
+
if (!mParameters.contexts) {
|
|
1308
|
+
throw new Error("Context not found for entity type ".concat(sOverloadEntityType));
|
|
1309
|
+
}
|
|
1271
1310
|
}
|
|
1272
1311
|
}
|
|
1273
|
-
}
|
|
1274
1312
|
|
|
1275
|
-
|
|
1276
|
-
|
|
1313
|
+
if (mParameters.enableAutoScroll) {
|
|
1314
|
+
oCurrentActionCallBacks = _this15._createActionPromise(sActionName, oControl.sId);
|
|
1315
|
+
}
|
|
1277
1316
|
}
|
|
1278
|
-
}
|
|
1279
1317
|
|
|
1280
|
-
|
|
1318
|
+
mParameters.bGetBoundContext = _this15._getBoundContext(oView, mParameters); // Need to know that the action is called from ObjectPage for changeSet Isolated workaround
|
|
1281
1319
|
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
return oResponse;
|
|
1289
|
-
});
|
|
1290
|
-
}
|
|
1291
|
-
}).then(function (oResponse) {
|
|
1292
|
-
_this14._sendActivity(Activity.Action, mParameters.contexts);
|
|
1320
|
+
mParameters.bObjectPage = oView.getViewData().converterType === "ObjectPage";
|
|
1321
|
+
return Promise.resolve(_catch(function () {
|
|
1322
|
+
return Promise.resolve(_this15._syncTask()).then(function () {
|
|
1323
|
+
return Promise.resolve(transactionHelper.callAction.bind(transactionHelper, sActionName, mParameters, _this15.getView(), _this15._getMessageHandler())()).then(function (oResponse) {
|
|
1324
|
+
function _temp27() {
|
|
1325
|
+
_this15._sendActivity(Activity.Action, mParameters.contexts);
|
|
1293
1326
|
|
|
1294
|
-
|
|
1327
|
+
_this15._triggerConfiguredSurvey(sActionName, TriggerType.action);
|
|
1295
1328
|
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1329
|
+
if (oCurrentActionCallBacks) {
|
|
1330
|
+
oCurrentActionCallBacks.fResolver(oResponse);
|
|
1331
|
+
}
|
|
1332
|
+
/*
|
|
1333
|
+
We set the (upper) pages to dirty after an execution of an action
|
|
1334
|
+
TODO: get rid of this workaround
|
|
1335
|
+
This workaround is only needed as long as the model does not support the synchronization.
|
|
1336
|
+
Once this is supported we don't need to set the pages to dirty anymore as the context itself
|
|
1337
|
+
is already refreshed (it's just not reflected in the object page)
|
|
1338
|
+
we explicitly don't call this method from the list report but only call it from the object page
|
|
1339
|
+
as if it is called in the list report it's not needed - as we anyway will remove this logic
|
|
1340
|
+
we can live with this
|
|
1341
|
+
we need a context to set the upper pages to dirty - if there are more than one we use the
|
|
1342
|
+
first one as they are anyway siblings
|
|
1343
|
+
*/
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
if (mParameters.contexts) {
|
|
1347
|
+
if (!_this15._isFclEnabled()) {
|
|
1348
|
+
EditState.setEditStateDirty();
|
|
1349
|
+
}
|
|
1317
1350
|
|
|
1318
|
-
|
|
1319
|
-
|
|
1351
|
+
_this15._getInternalModel().setProperty("/sCustomAction", sActionName);
|
|
1352
|
+
}
|
|
1320
1353
|
|
|
1321
|
-
|
|
1322
|
-
|
|
1354
|
+
if (mParameters.isNavigable) {
|
|
1355
|
+
var vContext = oResponse;
|
|
1323
1356
|
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1357
|
+
if (Array.isArray(vContext) && vContext.length === 1) {
|
|
1358
|
+
vContext = vContext[0];
|
|
1359
|
+
}
|
|
1327
1360
|
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1361
|
+
if (vContext && !Array.isArray(vContext)) {
|
|
1362
|
+
var oMetaModel = oView.getModel().getMetaModel();
|
|
1363
|
+
var sContextMetaPath = oMetaModel.getMetaPath(vContext.getPath());
|
|
1364
|
+
var oActionContext = Array.isArray(mParameters.contexts) ? mParameters.contexts[0] : mParameters.contexts;
|
|
1365
|
+
var sActionContextMetaPath = oActionContext && oMetaModel.getMetaPath(oActionContext.getPath());
|
|
1333
1366
|
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1367
|
+
if (sContextMetaPath != undefined && sContextMetaPath === sActionContextMetaPath) {
|
|
1368
|
+
if (oActionContext.getPath() !== vContext.getPath()) {
|
|
1369
|
+
_this15._getRoutingListener().navigateForwardToContext(vContext, {
|
|
1370
|
+
noHistoryEntry: false
|
|
1371
|
+
});
|
|
1372
|
+
} else {
|
|
1373
|
+
Log.info("Navigation to the same context is not allowed");
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1341
1378
|
}
|
|
1342
|
-
}
|
|
1343
|
-
}
|
|
1344
|
-
}
|
|
1345
|
-
}).catch(function (err) {
|
|
1346
|
-
if (oCurrentActionCallBacks) {
|
|
1347
|
-
oCurrentActionCallBacks.fRejector();
|
|
1348
|
-
}
|
|
1349
1379
|
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1380
|
+
var _temp26 = function () {
|
|
1381
|
+
if (mParameters.contexts) {
|
|
1382
|
+
return Promise.resolve(_this15._refreshListIfRequired(_this15._getActionResponseDataAndKeys(sActionName, oResponse), mParameters.contexts[0])).then(function () {});
|
|
1383
|
+
}
|
|
1384
|
+
}();
|
|
1385
|
+
|
|
1386
|
+
return _temp26 && _temp26.then ? _temp26.then(_temp27) : _temp27(_temp26);
|
|
1387
|
+
});
|
|
1388
|
+
});
|
|
1389
|
+
}, function (err) {
|
|
1390
|
+
if (oCurrentActionCallBacks) {
|
|
1391
|
+
oCurrentActionCallBacks.fRejector();
|
|
1392
|
+
} // FIXME: in most situations there is no handler for the rejected promises returned
|
|
1393
|
+
|
|
1394
|
+
|
|
1395
|
+
if (err === Constants.CancelActionDialog) {
|
|
1396
|
+
throw new Error("Dialog cancelled");
|
|
1397
|
+
} else if (!(err && (err.canceled || err.rejectedItems && err.rejectedItems[0].canceled))) {
|
|
1398
|
+
throw new Error("Error in EditFlow.invokeAction:".concat(err));
|
|
1355
1399
|
}
|
|
1356
|
-
}
|
|
1357
|
-
})
|
|
1400
|
+
}));
|
|
1401
|
+
} catch (e) {
|
|
1402
|
+
return Promise.reject(e);
|
|
1403
|
+
}
|
|
1358
1404
|
}
|
|
1359
1405
|
/**
|
|
1360
1406
|
* Secured execution of the given function. Ensures that the function is only executed when certain conditions are fulfilled.
|
|
1361
1407
|
*
|
|
1362
1408
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1363
|
-
* @param
|
|
1364
|
-
* @param
|
|
1365
|
-
* @param
|
|
1366
|
-
* @param
|
|
1367
|
-
* @param
|
|
1368
|
-
* @param
|
|
1369
|
-
* @returns
|
|
1409
|
+
* @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.
|
|
1410
|
+
* @param mParameters Definitions of the preconditions to be checked before execution
|
|
1411
|
+
* @param mParameters.busy Defines the busy indicator
|
|
1412
|
+
* @param mParameters.busy.set Triggers a busy indicator when the function is executed.
|
|
1413
|
+
* @param mParameters.busy.check Executes function only if application isn't busy.
|
|
1414
|
+
* @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.
|
|
1415
|
+
* @returns A promise that is rejected if the execution is prohibited and resolved by the promise returned by the fnFunction.
|
|
1370
1416
|
* @alias sap.fe.core.controllerextensions.EditFlow#securedExecution
|
|
1371
1417
|
* @public
|
|
1372
1418
|
* @experimental As of version 1.90.0
|
|
@@ -1375,7 +1421,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1375
1421
|
;
|
|
1376
1422
|
|
|
1377
1423
|
_proto.securedExecution = function securedExecution(fnFunction, mParameters) {
|
|
1378
|
-
var
|
|
1424
|
+
var _this16 = this;
|
|
1379
1425
|
|
|
1380
1426
|
var bBusySet = mParameters && mParameters.busy && mParameters.busy.set !== undefined ? mParameters.busy.set : true,
|
|
1381
1427
|
bBusyCheck = mParameters && mParameters.busy && mParameters.busy.check !== undefined ? mParameters.busy.check : true,
|
|
@@ -1401,19 +1447,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1401
1447
|
|
|
1402
1448
|
return this._syncTask(fnFunction).then(function () {
|
|
1403
1449
|
if (bUpdatesDocument) {
|
|
1404
|
-
|
|
1450
|
+
_this16._getTransactionHelper().handleDocumentModifications();
|
|
1405
1451
|
|
|
1406
|
-
if (!
|
|
1452
|
+
if (!_this16._isFclEnabled()) {
|
|
1407
1453
|
EditState.setEditStateDirty();
|
|
1408
1454
|
}
|
|
1409
1455
|
|
|
1410
1456
|
if (bIsDraft) {
|
|
1411
|
-
|
|
1457
|
+
_this16._setDraftStatus(DraftStatus.Saved);
|
|
1412
1458
|
}
|
|
1413
1459
|
}
|
|
1414
1460
|
}).catch(function (oError) {
|
|
1415
1461
|
if (bUpdatesDocument && bIsDraft) {
|
|
1416
|
-
|
|
1462
|
+
_this16._setDraftStatus(DraftStatus.Clear);
|
|
1417
1463
|
}
|
|
1418
1464
|
|
|
1419
1465
|
return Promise.reject(oError);
|
|
@@ -1422,7 +1468,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1422
1468
|
BusyLocker.unlock(oLockObject);
|
|
1423
1469
|
}
|
|
1424
1470
|
|
|
1425
|
-
|
|
1471
|
+
_this16._getMessageHandler().showMessageDialog();
|
|
1426
1472
|
});
|
|
1427
1473
|
}
|
|
1428
1474
|
/**
|
|
@@ -1438,8 +1484,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1438
1484
|
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
1485
|
// Create a promise that will be resolved or rejected when the path is completed
|
|
1440
1486
|
var oPatchPromise = new Promise(function (resolve, reject) {
|
|
1441
|
-
oEvent.getSource().attachEventOnce("patchCompleted", function (
|
|
1442
|
-
var bSuccess =
|
|
1487
|
+
oEvent.getSource().attachEventOnce("patchCompleted", function (patchCompletedEvent) {
|
|
1488
|
+
var bSuccess = patchCompletedEvent.getParameter("success");
|
|
1443
1489
|
|
|
1444
1490
|
if (bSuccess) {
|
|
1445
1491
|
resolve();
|
|
@@ -1545,7 +1591,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1545
1591
|
* @function
|
|
1546
1592
|
* @name _createActionPromise
|
|
1547
1593
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1548
|
-
*
|
|
1549
1594
|
* @returns {Function} The resolver function which can be used to externally resolve the promise
|
|
1550
1595
|
*/
|
|
1551
1596
|
;
|
|
@@ -1580,9 +1625,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1580
1625
|
* @function
|
|
1581
1626
|
* @name _getActionResponseDataAndKeys
|
|
1582
1627
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1583
|
-
* @param
|
|
1584
|
-
* @param
|
|
1585
|
-
* @returns
|
|
1628
|
+
* @param sActionName The name of the action that is executed
|
|
1629
|
+
* @param oResponse The bound action's response data or response context
|
|
1630
|
+
* @returns Object with data and names of the key fields of the response
|
|
1586
1631
|
*/
|
|
1587
1632
|
;
|
|
1588
1633
|
|
|
@@ -1592,10 +1637,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1592
1637
|
|
|
1593
1638
|
_proto._submitOpenChanges = function _submitOpenChanges(oContext) {
|
|
1594
1639
|
try {
|
|
1595
|
-
var
|
|
1640
|
+
var _this18 = this;
|
|
1596
1641
|
|
|
1597
1642
|
var oModel = oContext.getModel(),
|
|
1598
|
-
oLockObject =
|
|
1643
|
+
oLockObject = _this18._getGlobalUIModel();
|
|
1599
1644
|
|
|
1600
1645
|
return Promise.resolve(_finallyRethrows(function () {
|
|
1601
1646
|
// Submit any leftover changes that are not yet submitted
|
|
@@ -1610,13 +1655,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1610
1655
|
}
|
|
1611
1656
|
}); // Check if all changes were submitted successfully
|
|
1612
1657
|
});
|
|
1613
|
-
}, function (
|
|
1658
|
+
}, function (_wasThrown3, _result11) {
|
|
1614
1659
|
if (BusyLocker.isLocked(oLockObject)) {
|
|
1615
1660
|
BusyLocker.unlock(oLockObject);
|
|
1616
1661
|
}
|
|
1617
1662
|
|
|
1618
|
-
if (
|
|
1619
|
-
return
|
|
1663
|
+
if (_wasThrown3) throw _result11;
|
|
1664
|
+
return _result11;
|
|
1620
1665
|
}));
|
|
1621
1666
|
} catch (e) {
|
|
1622
1667
|
return Promise.reject(e);
|
|
@@ -1661,13 +1706,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1661
1706
|
|
|
1662
1707
|
_proto._handleNewContext = function _handleNewContext(oContext, bEditable, bRecreateContext, bDraftNavigation, bForceFocus, bNavigateToSiblingEntity) {
|
|
1663
1708
|
try {
|
|
1664
|
-
var
|
|
1709
|
+
var _this20 = this;
|
|
1665
1710
|
|
|
1666
|
-
if (!
|
|
1711
|
+
if (!_this20._isFclEnabled()) {
|
|
1667
1712
|
EditState.setEditStateDirty();
|
|
1668
1713
|
}
|
|
1669
1714
|
|
|
1670
|
-
return Promise.resolve(
|
|
1715
|
+
return Promise.resolve(_this20._getRoutingListener().navigateToContext(oContext, {
|
|
1671
1716
|
checkNoHashChange: true,
|
|
1672
1717
|
editable: bEditable,
|
|
1673
1718
|
bPersistOPScroll: true,
|
|
@@ -1699,10 +1744,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1699
1744
|
;
|
|
1700
1745
|
|
|
1701
1746
|
_proto._checkForValidationErrors = function _checkForValidationErrors() {
|
|
1702
|
-
var
|
|
1747
|
+
var _this21 = this;
|
|
1703
1748
|
|
|
1704
1749
|
return this._syncTask().then(function () {
|
|
1705
|
-
var sViewId =
|
|
1750
|
+
var sViewId = _this21.base.getView().getId();
|
|
1706
1751
|
|
|
1707
1752
|
var aMessages = sap.ui.getCore().getMessageManager().getMessageModel().getData();
|
|
1708
1753
|
var oControl;
|
|
@@ -1733,14 +1778,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1733
1778
|
* @function
|
|
1734
1779
|
* @name _refreshListIfRequired
|
|
1735
1780
|
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1736
|
-
* @param
|
|
1737
|
-
* @param
|
|
1738
|
-
* @returns
|
|
1781
|
+
* @param oResponse The response of the bound action and the names of the key fields
|
|
1782
|
+
* @param oContext The bound context on which the action was executed
|
|
1783
|
+
* @returns Always resolves to param oResponse
|
|
1739
1784
|
*/
|
|
1740
1785
|
;
|
|
1741
1786
|
|
|
1742
1787
|
_proto._refreshListIfRequired = function _refreshListIfRequired(oResponse, oContext) {
|
|
1743
|
-
var
|
|
1788
|
+
var _this22 = this;
|
|
1744
1789
|
|
|
1745
1790
|
if (!oContext || !oResponse || !oResponse.oData) {
|
|
1746
1791
|
return Promise.resolve();
|
|
@@ -1768,7 +1813,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1768
1813
|
});
|
|
1769
1814
|
oBinding.refresh();
|
|
1770
1815
|
} else {
|
|
1771
|
-
var oAppComponent = CommonUtils.getAppComponent(
|
|
1816
|
+
var oAppComponent = CommonUtils.getAppComponent(_this22.getView());
|
|
1772
1817
|
oAppComponent.getSideEffectsService().requestSideEffects([{
|
|
1773
1818
|
$NavigationPropertyPath: oBinding.getPath()
|
|
1774
1819
|
}], oBinding.getContext()).then(function () {
|
|
@@ -1842,7 +1887,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1842
1887
|
oActionBindingContext = oAction.getBindingContext();
|
|
1843
1888
|
|
|
1844
1889
|
if (oActionBindingContext.getModel().getMetaModel().getMetaContext(oActionBindingContext.getPath()).getObject("$Type") === sOverloadEntityType) {
|
|
1845
|
-
throw "context found - stop actions loop";
|
|
1890
|
+
throw new Error("context found - stop actions loop");
|
|
1846
1891
|
}
|
|
1847
1892
|
});
|
|
1848
1893
|
return undefined;
|
|
@@ -1857,7 +1902,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1857
1902
|
try {
|
|
1858
1903
|
aSubSections.forEach(function (oSubSection) {
|
|
1859
1904
|
if (oActionBindingContext) {
|
|
1860
|
-
throw "context found - stop SubSections loop";
|
|
1905
|
+
throw new Error("context found - stop SubSections loop");
|
|
1861
1906
|
}
|
|
1862
1907
|
|
|
1863
1908
|
if (oSubSection.getBindingContext() === null) {
|
|
@@ -1917,19 +1962,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1917
1962
|
}
|
|
1918
1963
|
}
|
|
1919
1964
|
/**
|
|
1920
|
-
* This methods creates a sibling context for a
|
|
1965
|
+
* This methods creates a sibling context for a subobject page, and calculates a sibling path for
|
|
1921
1966
|
* all intermediates paths between the OP and the sub-OP.
|
|
1922
1967
|
*
|
|
1923
|
-
* @param
|
|
1924
|
-
* @param
|
|
1925
|
-
* @param
|
|
1926
|
-
* @param
|
|
1927
|
-
* @returns
|
|
1968
|
+
* @param rootCurrentContext The context for the root of the draft
|
|
1969
|
+
* @param rightmostCurrentContext The context of the subobject
|
|
1970
|
+
* @param sProgrammingModel The programming model
|
|
1971
|
+
* @param doNotComputeIfRoot If true, we don't compute siblingInfo if the root and the rightmost contexts are the same
|
|
1972
|
+
* @returns Returns the siblingInformation object
|
|
1928
1973
|
*/
|
|
1929
1974
|
;
|
|
1930
1975
|
|
|
1931
1976
|
_proto._computeSiblingInformation = function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot) {
|
|
1932
1977
|
try {
|
|
1978
|
+
var _rightmostCurrentCont;
|
|
1979
|
+
|
|
1980
|
+
rightmostCurrentContext = (_rightmostCurrentCont = rightmostCurrentContext) !== null && _rightmostCurrentCont !== void 0 ? _rightmostCurrentCont : rootCurrentContext;
|
|
1981
|
+
|
|
1933
1982
|
if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
|
|
1934
1983
|
// Wrong usage !!
|
|
1935
1984
|
Log.error("Cannot compute rightmost sibling context");
|
|
@@ -1965,4 +2014,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1965
2014
|
}(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
2015
|
return EditFlow;
|
|
1967
2016
|
}, 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==
|
|
2017
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJmaW5hbGl6ZXIiLCJiaW5kIiwiQ3JlYXRpb25Nb2RlIiwiRkVMaWJyYXJ5IiwiUHJvZ3JhbW1pbmdNb2RlbCIsIkNvbnN0YW50cyIsIkRyYWZ0U3RhdHVzIiwiRWRpdE1vZGUiLCJTdGFydHVwTW9kZSIsIk1lc3NhZ2VUeXBlIiwiY29yZUxpYnJhcnkiLCJFZGl0RmxvdyIsImRlZmluZVVJNUNsYXNzIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImVkaXREb2N1bWVudCIsIm9Db250ZXh0IiwiYkRyYWZ0TmF2aWdhdGlvbiIsInRyYW5zYWN0aW9uSGVscGVyIiwiX2dldFRyYW5zYWN0aW9uSGVscGVyIiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIl9nZXRSb290Vmlld0NvbnRyb2xsZXIiLCJyaWdodG1vc3RDb250ZXh0IiwiYmFzZSIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwiY29udGV4dCIsImdldFZpZXciLCJfZ2V0TWVzc2FnZUhhbmRsZXIiLCJvTmV3RG9jdW1lbnRDb250ZXh0Iiwic1Byb2dyYW1taW5nTW9kZWwiLCJfZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiZ2V0TW9kZWwiLCJfc2V0RWRpdE1vZGUiLCJFZGl0YWJsZSIsInNob3dNZXNzYWdlRGlhbG9nIiwiX2hhbmRsZU5ld0NvbnRleHQiLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIlN0aWNreSIsIl9oYW5kbGVTdGlja3lPbiIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzaWJsaW5nSW5mbyIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsIl91cGRhdGVQYXRoc0luSGlzdG9yeSIsInBhdGhNYXBwaW5nIiwidGFyZ2V0Q29udGV4dCIsImdldFBhdGgiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwiYUNvbnRleHRzIiwibVBhcmFtZXRlcnMiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwiZ2V0Q29udHJvbGxlciIsIl9lZGl0RmxvdyIsInVwZGF0ZURvY3VtZW50Iiwib1Byb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJiSXNEcmFmdCIsIkRyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiX3N5bmNUYXNrIiwiaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJfc2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJvQmluZGluZ0NvbnRleHQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0VudGl0eVNldE5hbWUiLCJnZXRNZXRhQ29udGV4dCIsImdldE9iamVjdCIsImFTZW1hbnRpY0tleXMiLCJTZW1hbnRpY0tleUhlbHBlciIsImdldFNlbWFudGljS2V5cyIsImxlbmd0aCIsIm9DdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsInNDdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0IiwiX2dldEdsb2JhbFVJTW9kZWwiLCJvVGFibGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJfZ2V0UmVzb3VyY2VCdW5kbGUiLCJiU2hvdWxkQnVzeUxvY2siLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmUiLCJDcmVhdGlvblJvdyIsIkV4dGVybmFsIiwib0V4ZWNDdXN0b21WYWxpZGF0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsIm9Db250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJNb2RlbEhlbHBlciIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsImhhbmRsZXJzIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwib3V0Ym91bmQiLCJ1bmRlZmluZWQiLCJjcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd09iamVjdHMiLCJnZXRQYXJlbnQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiZGF0YSIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImdldENyZWF0aW9uUm93Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJ0YWJsZUlkIiwiYnlJZCIsImlzQSIsImZuRm9jdXNPclNjcm9sbCIsImZvY3VzUm93Iiwic2Nyb2xsVG9JbmRleCIsImdldFJvd0JpbmRpbmciLCJhdHRhY2hFdmVudE9uY2UiLCJjcmVhdGVBdEVuZCIsImdldExlbmd0aCIsImhhbmRsZVNpZGVFZmZlY3RzIiwib0xpc3RCaW5kaW5nIiwib0NyZWF0aW9uUHJvbWlzZSIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsImhhc1RyYW5zaWVudENvbnRleHQiLCJhcHBDb21wb25lbnQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJjYXRjaCIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvRmllbGRDb250cm9sIiwic1RhcmdldCIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib01lc3NhZ2UiLCJjb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJvVmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0Q29udHJvbCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImZpbHRlciIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsInR5cGUiLCJFcnJvciIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImN1c3RvbU1lc3NhZ2VzIiwiQnVzeUxvY2tlciIsImxvY2siLCJPRGF0YUxpc3RCaW5kaW5nIiwiU3luYyIsIm9Nb2RlbCIsInNDcmVhdGlvbk1vZGUiLCJwcm9ncmFtbWluZ01vZGVsIiwiTmV3UGFnZSIsImlzUmVsYXRpdmUiLCJzUGF0aCIsInNOZXdBY3Rpb24iLCJhUGFyYW1ldGVycyIsIkRlZmVycmVkIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRIZWFkZXJDb250ZXh0IiwiYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyIsImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsIkFzeW5jIiwicmVzb2x2ZWRDcmVhdGlvbk1vZGUiLCJvQ3JlYXRpb24iLCJtQXJncyIsIm9DcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd0NvbnRleHQiLCJvVmFsaWRhdGlvbkNoZWNrIiwib1BheWxvYWQiLCJvUm91dGluZ0xpc3RlbmVyIiwiX2dldFJvdXRpbmdMaXN0ZW5lciIsIk9iamVjdCIsImtleXMiLCJzUHJvcGVydHlQYXRoIiwib1Byb3BlcnR5IiwiJGtpbmQiLCJfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiX2hhbmRsZUNyZWF0ZUV2ZW50cyIsInBhcmVudENvbnRyb2wiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwib05hdmlnYXRpb24iLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJiRGVmZXJyZWRDb250ZXh0IiwiZWRpdGFibGUiLCJiRm9yY2VGb2N1cyIsImFzeW5jQ29udGV4dCIsImNyZWF0ZUFjdGlvbiIsInRyYW5zaWVudCIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiYlNraXBTaWRlRWZmZWN0cyIsIm9OZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJ0cmFjZSIsImRlbGV0ZSIsImlzTG9ja2VkIiwidW5sb2NrIiwicmVqZWN0IiwiYklzTmV3UGFnZUNyZWF0aW9uIiwiYWxsIiwiYVBhcmFtcyIsIl9zZW5kQWN0aXZpdHkiLCJBY3Rpdml0eSIsIkNyZWF0ZSIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImNhbmNlbGVkIiwicmVqZWN0ZWRJdGVtcyIsImZpbmFsbHkiLCJvbkJlZm9yZVNhdmUiLCJvbkJlZm9yZURpc2NhcmQiLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwiYWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiX3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzIiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsImlzRmNsRW5hYmxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYkVkaXRhYmxlIiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImNhbmNlbEJ1dHRvbiIsImNvbnRyb2wiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJEaXNjYXJkIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3IiwiZGVsZXRlRG9jdW1lbnQiLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiX2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJEZWxldGUiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJnZXRTdGFydHVwTW9kZSIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50IiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJvQ29udHJvbCIsIm9DdXJyZW50Q29udHJvbCIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIm9WaWV3IiwiQXJyYXkiLCJpc0FycmF5IiwiY29udGV4dHMiLCJtb2RlbCIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udHJvbElkIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpbmRleE9mIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsInBhdGgiLCJzVGFibGVDb250ZXh0RW50aXR5VHlwZSIsIm9BY3Rpb25PdmVybG9hZENvbnRleHQiLCJfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbVN1YlNlY3Rpb25zIiwiZW5hYmxlQXV0b1Njcm9sbCIsIl9jcmVhdGVBY3Rpb25Qcm9taXNlIiwic0lkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsImNhbGxBY3Rpb24iLCJvUmVzcG9uc2UiLCJBY3Rpb24iLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJfZ2V0SW50ZXJuYWxNb2RlbCIsInZDb250ZXh0Iiwic0NvbnRleHRNZXRhUGF0aCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsIm5vSGlzdG9yeUVudHJ5IiwiaW5mbyIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJfZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImVyciIsImZSZWplY3RvciIsInNlY3VyZWRFeGVjdXRpb24iLCJmbkZ1bmN0aW9uIiwiYkJ1c3lTZXQiLCJidXN5Iiwic2V0IiwiYkJ1c3lDaGVjayIsImNoZWNrIiwiYlVwZGF0ZXNEb2N1bWVudCIsInVwZGF0ZXNEb2N1bWVudCIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsIm9QYXRjaFByb21pc2UiLCJnZXRTb3VyY2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVBY3RpdmF0ZSIsIm9CaW5kaW5nIiwiYkF0RW5kIiwiYkluYWN0aXZlIiwib1BhcmFtcyIsImluYWN0aXZlIiwic0VkaXRNb2RlIiwiYkNyZWF0aW9uTW9kZSIsInNldEVkaXRNb2RlIiwic0RyYWZ0U3RhdGUiLCJzZXREcmFmdFN0YXR1cyIsImdldFJvdXRpbmdMaXN0ZW5lciIsImdldEdsb2JhbFVJTW9kZWwiLCJ2VGFzayIsInN5bmNUYXNrIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsImdldEludGVybmFsTW9kZWwiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSb3V0aW5nU2VydmljZSIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJzQ29udHJvbElkIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsIl9nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiX2RlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJnZXRNZXNzYWdlSGFuZGxlciIsInJlbGF0ZWRDb250ZXh0cyIsImNvbnRlbnQiLCJtYXAiLCJzZW5kIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJzdWJtaXRCYXRjaCIsIm9SZXF1ZXN0b3IiLCJ3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJoYW5kbGVTdGlja3lPbiIsIl9oYW5kbGVTdGlja3lPZmYiLCJoYW5kbGVTdGlja3lPZmYiLCJfb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsIm9uQmFja05hdmlnYXRpb25JblNlc3Npb24iLCJfZGlzY2FyZFN0aWNreVNlc3Npb24iLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImludGVybmFsTW9kZWwiLCJnZXRIdHRwSGVhZGVycyIsImJSZWNyZWF0ZUNvbnRleHQiLCJiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHkiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNob3dQbGFjZWhvbGRlciIsImtlZXBDdXJyZW50TGF5b3V0IiwidmlldyIsInBhcmFtcyIsInZpZXdMZXZlbCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJzVmlld0lkIiwiZ2V0SWQiLCJhTWVzc2FnZXMiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJpIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9EYXRhIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5IiwiaXNSb290IiwicmVmcmVzaCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiZ2V0Q29udGV4dCIsImFSZXF1ZXN0UHJvbWlzZXMiLCJvS2V5IiwicmVxdWVzdE9iamVjdCIsIiRQcm9wZXJ0eVBhdGgiLCJhUGFnZXMiLCJvRkNMIiwiZ2V0Um9vdENvbnRhaW5lciIsImNvbmNhdCIsImdldE1pZENvbHVtblBhZ2VzIiwiZ2V0RW5kQ29sdW1uUGFnZXMiLCJvTmF2Q29udGFpbmVyIiwiZ2V0UGFnZXMiLCJvUGFnZSIsImdldENvbXBvbmVudEluc3RhbmNlIiwiX2NoZWNrQWN0aW9ucyIsImFBY3Rpb25zIiwib0FjdGlvbkJpbmRpbmdDb250ZXh0Iiwib0FjdGlvbiIsIl9jaGVja1N1YlNlY3Rpb25zIiwiYVN1YlNlY3Rpb25zIiwib1N1YlNlY3Rpb24iLCJnZXRBZ2dyZWdhdGlvbiIsImN1cnJlbnRDb250ZXh0IiwibmV3Q29udGV4dCIsIm1hcHBpbmdzIiwic2V0UGF0aE1hcHBpbmciLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsImRvTm90Q29tcHV0ZUlmUm9vdCIsInN0YXJ0c1dpdGgiLCJkcmFmdCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnakJPLGtCQUFnQkEsSUFBaEIsRUFBc0JDLE9BQXRCLEVBQStCO0FBQ3JDLFFBQUk7QUFDSCxVQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBakI7QUFDQSxLQUZELENBRUUsT0FBTUcsQ0FBTixFQUFTO0FBQ1YsYUFBT0YsT0FBTyxDQUFDRSxDQUFELENBQWQ7QUFDQTs7QUFDRCxRQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7QUFDMUIsYUFBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVksS0FBSyxDQUFqQixFQUFvQkgsT0FBcEIsQ0FBUDtBQUNBOztBQUNELFdBQU9DLE1BQVA7QUFDQTs7QUFHTSw0QkFBMEJGLElBQTFCLEVBQWdDSyxTQUFoQyxFQUEyQztBQUNqRCxRQUFJO0FBQ0gsVUFBSUgsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0FBQ0EsS0FGRCxDQUVFLE9BQU9HLENBQVAsRUFBVTtBQUNYLGFBQU9FLFNBQVMsQ0FBQyxJQUFELEVBQU9GLENBQVAsQ0FBaEI7QUFDQTs7QUFDRCxRQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBckIsRUFBMkI7QUFDMUIsYUFBT0YsTUFBTSxDQUFDRSxJQUFQLENBQVlDLFNBQVMsQ0FBQ0MsSUFBVixDQUFlLElBQWYsRUFBcUIsS0FBckIsQ0FBWixFQUF5Q0QsU0FBUyxDQUFDQyxJQUFWLENBQWUsSUFBZixFQUFxQixJQUFyQixDQUF6QyxDQUFQO0FBQ0E7O0FBQ0QsV0FBT0QsU0FBUyxDQUFDLEtBQUQsRUFBUUgsTUFBUixDQUFoQjtBQUNBOzs7Ozs7OztBQTFpQkQsTUFBTUssWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQS9CO0FBQUEsTUFDQ0UsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBRDlCO0FBQUEsTUFFQ0MsU0FBUyxHQUFHRixTQUFTLENBQUNFLFNBRnZCO0FBQUEsTUFHQ0MsV0FBVyxHQUFHSCxTQUFTLENBQUNHLFdBSHpCO0FBQUEsTUFJQ0MsUUFBUSxHQUFHSixTQUFTLENBQUNJLFFBSnRCO0FBQUEsTUFLQ0MsV0FBVyxHQUFHTCxTQUFTLENBQUNLLFdBTHpCO0FBQUEsTUFNQ0MsV0FBVyxHQUFHQyxXQUFXLENBQUNELFdBTjNCO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O01BRU1FLFEsV0FETEMsY0FBYyxDQUFDLDJDQUFELEMsVUF1QmJDLGVBQWUsRSxVQUNmQyxjQUFjLEUsVUEwQ2RELGVBQWUsRSxVQUNmQyxjQUFjLEUsVUF1QmRELGVBQWUsRSxVQUNmQyxjQUFjLEUsVUFpRmRELGVBQWUsRSxVQUNmQyxjQUFjLEUsV0F3YWRELGVBQWUsRSxXQUNmRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBdUJWSixlQUFlLEUsV0FDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQXNCVkosZUFBZSxFLFdBQ2ZFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEMsV0FzQlZKLGVBQWUsRSxXQUNmRSxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBc0JWSixlQUFlLEUsV0FDZkUsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQXdCVkosZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQW1FZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQW1FZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWlHZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWlEZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQXlDZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQThNZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQStEZEQsZUFBZSxFOzs7Ozs7Ozs7QUE1eENoQjtBQUNBO0FBQ0E7O0FBT0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7V0FHT0ssWSx5QkFBYUMsUTtVQUFvQztBQUFBLHFCQUU1QixJQUY0Qjs7QUFDdEQsWUFBTUMsZ0JBQWdCLEdBQUcsSUFBekI7O0FBQ0EsWUFBTUMsaUJBQWlCLEdBQUcsT0FBS0MscUJBQUwsRUFBMUI7O0FBQ0EsWUFBTUMsbUJBQW1CLEdBQUcsT0FBS0Msc0JBQUwsRUFBNUI7O0FBQ0EsWUFBSUMsZ0JBQUo7O0FBSnNELHdDQUtsRDtBQUFBLGlDQUNHLE9BQUtDLElBQUwsQ0FBVUMsUUFBVixDQUFtQkMsWUFBbkIsQ0FBZ0M7QUFBRUMsWUFBQUEsT0FBTyxFQUFFVjtBQUFYLFdBQWhDLENBREg7QUFBQSxtQ0FFK0JFLGlCQUFpQixDQUFDSCxZQUFsQixDQUErQkMsUUFBL0IsRUFBeUMsT0FBS1csT0FBTCxFQUF6QyxFQUF5RCxPQUFLQyxrQkFBTCxFQUF6RCxDQUYvQixpQkFFR0MsbUJBRkg7QUFJSCxrQkFBTUMsaUJBQWlCLEdBQUcsT0FBS0Msb0JBQUwsQ0FBMEJmLFFBQTFCLENBQTFCOztBQUVBLHFCQUFLZ0IsbUNBQUwsQ0FBeUNGLGlCQUF6QyxFQUE0RGQsUUFBUSxDQUFDaUIsUUFBVCxFQUE1RDs7QUFORztBQUFBLG9CQVFDSixtQkFSRDtBQVNGLHlCQUFLSyxZQUFMLENBQWtCOUIsUUFBUSxDQUFDK0IsUUFBM0IsRUFBcUMsS0FBckM7O0FBQ0EseUJBQUtQLGtCQUFMLEdBQTBCUSxpQkFBMUI7O0FBVkU7QUFBQSx3QkFZRVAsbUJBQW1CLEtBQUtiLFFBWjFCO0FBQUE7QUFBQSwrQ0F3QkssT0FBS3FCLGlCQUFMLENBQXVCQyxrQkFBdkIsRUFBMEMsSUFBMUMsRUFBZ0QsS0FBaEQsRUFBdURyQixnQkFBdkQsRUFBeUUsSUFBekUsQ0F4Qkw7QUFBQSw4QkF5QkdhLGlCQUFpQixLQUFLN0IsZ0JBQWdCLENBQUNzQyxNQXpCMUM7QUEwQkE7QUFDQTtBQUNBLG1DQUFLQyxlQUFMLENBQXFCWCxtQkFBckI7QUE1QkE7QUFBQTtBQUFBOztBQWFELDBCQUFJUyxrQkFBaUIsR0FBR1QsbUJBQXhCOztBQWJDO0FBQUEsNEJBY0csT0FBS1ksYUFBTCxFQWRIO0FBZUFuQiwwQkFBQUEsZ0JBQWdCLEdBQUdGLG1CQUFtQixDQUFDc0IsbUJBQXBCLEVBQW5CO0FBZkEsaURBZ0J3QixPQUFLQywwQkFBTCxDQUFnQzNCLFFBQWhDLEVBQTBDTSxnQkFBMUMsRUFBNERRLGlCQUE1RCxFQUErRSxJQUEvRSxDQWhCeEIsaUJBZ0JJYyxXQWhCSjtBQUFBOztBQWlCQUEsNEJBQUFBLFdBQVcsbUJBQUdBLFdBQUgsdURBQWtCLE9BQUtDLGtCQUFMLENBQXdCN0IsUUFBeEIsRUFBa0NhLG1CQUFsQyxDQUE3Qjs7QUFDQSxtQ0FBS2lCLHFCQUFMLENBQTJCRixXQUFXLENBQUNHLFdBQXZDOztBQWxCQSxnQ0FtQklILFdBQVcsQ0FBQ0ksYUFBWixDQUEwQkMsT0FBMUIsTUFBdUNwQixtQkFBbUIsQ0FBQ29CLE9BQXBCLEVBbkIzQztBQW9CQ1gsOEJBQUFBLGtCQUFpQixHQUFHTSxXQUFXLENBQUNJLGFBQWhDO0FBcEJEO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBZ0NILFNBckNxRCxZQXFDN0NFLE1BckM2QyxFQXFDckM7QUFDaEJDLFVBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLGtDQUFWLEVBQThDRixNQUE5QztBQUNBLFNBdkNxRDs7QUFBQTtBQXdDdEQsTzs7Ozs7V0FHREcsdUIsR0FGQSxpQ0FFd0JDLFNBRnhCLEVBRXdDQyxXQUZ4QyxFQUUwRDtBQUN6RCxVQUFJQSxXQUFKLEVBQWlCO0FBQ2hCQSxRQUFBQSxXQUFXLENBQUNDLG9CQUFaLEdBQW1DLEtBQUtqQyxJQUFMLENBQVVDLFFBQVYsQ0FBbUJpQyxjQUF0RDtBQUNBLE9BRkQsTUFFTztBQUNORixRQUFBQSxXQUFXLEdBQUc7QUFDYkMsVUFBQUEsb0JBQW9CLEVBQUUsS0FBS2pDLElBQUwsQ0FBVUMsUUFBVixDQUFtQmlDO0FBRDVCLFNBQWQ7QUFHQTs7QUFDRCxhQUFRLEtBQUtsQyxJQUFMLENBQVVJLE9BQVYsR0FBb0IrQixhQUFwQixFQUFELENBQXdEQyxTQUF4RCxDQUFrRU4sdUJBQWxFLENBQTBGQyxTQUExRixFQUFxR0MsV0FBckcsQ0FBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBR0NLLGMsR0FGQSx3QkFFZTVDLFFBRmYsRUFFaUM2QyxRQUZqQyxFQUVvRjtBQUFBLG1CQVM1RSxJQVQ0RTs7QUFDbkYsVUFBTTNDLGlCQUFpQixHQUFHLEtBQUtDLHFCQUFMLEVBQTFCOztBQUNBLFVBQU0yQyxzQkFBc0IsR0FBRyxLQUFLbkMsT0FBTCxHQUFlb0MsaUJBQWYsRUFBL0I7QUFDQSxVQUFNQyxRQUFRLEdBQUcsS0FBS2pDLG9CQUFMLENBQTBCZixRQUExQixNQUF3Q2YsZ0JBQWdCLENBQUNnRSxLQUExRTs7QUFFQSxXQUFLckMsa0JBQUwsR0FBMEJzQyx3QkFBMUI7O0FBQ0EsYUFBTyxLQUFLQyxTQUFMO0FBQUEsWUFBMkI7QUFDakMsY0FBSUwsc0JBQUosRUFBNEI7QUFDM0I1QyxZQUFBQSxpQkFBaUIsQ0FBQ2tELDJCQUFsQjs7QUFDQSxnQkFBSSxDQUFDLE9BQUszQixhQUFMLEVBQUwsRUFBMkI7QUFDMUI0QixjQUFBQSxTQUFTLENBQUNDLGlCQUFWO0FBQ0E7O0FBRUQsZ0JBQUlOLFFBQUosRUFBYztBQUNiLHFCQUFLTyxlQUFMLENBQXFCcEUsV0FBVyxDQUFDcUUsTUFBakM7QUFDQTtBQUNEOztBQUNELGlCQUFLNUMsa0JBQUwsR0FBMEJzQyx3QkFBMUI7O0FBWGlDO0FBQUEsc0NBYTdCO0FBQUEscUNBQ0dMLFFBREg7QUFFSDtBQUNBO0FBQ0Esb0JBQU1ZLGVBQWUsR0FBRyxPQUFLOUMsT0FBTCxHQUFlb0MsaUJBQWYsRUFBeEI7O0FBSkc7QUFBQSxzQkFLQ0MsUUFBUSxJQUFJUyxlQUFaLElBQStCQSxlQUFlLEtBQUtYLHNCQUxwRDtBQU1GLHdCQUFNWSxVQUFVLEdBQUdELGVBQWUsQ0FBQ3hDLFFBQWhCLEdBQTJCMEMsWUFBM0IsRUFBbkI7QUFBQSx3QkFDQ0MsY0FBYyxHQUFJRixVQUFELENBQW9CRyxjQUFwQixDQUFtQ0osZUFBZSxDQUFDeEIsT0FBaEIsRUFBbkMsRUFBOEQ2QixTQUE5RCxDQUF3RSxhQUF4RSxDQURsQjtBQUFBLHdCQUVDQyxhQUFhLEdBQUdDLGlCQUFpQixDQUFDQyxlQUFsQixDQUFrQ1AsVUFBbEMsRUFBOENFLGNBQTlDLENBRmpCOztBQU5FO0FBQUEsMEJBU0VHLGFBQWEsSUFBSUEsYUFBYSxDQUFDRyxNQVRqQztBQVVELDRCQUFNQyx1QkFBdUIsR0FBRyxPQUFLQyxtQkFBTCxFQUFoQztBQUFBLDRCQUNDQyxvQkFBb0IsR0FBR0YsdUJBQXVCLElBQUlBLHVCQUF1QixDQUFDRyxZQUQzRTtBQUFBLDRCQUVDQyxZQUFZLEdBQUdQLGlCQUFpQixDQUFDUSxlQUFsQixDQUFrQ2YsZUFBbEMsRUFBbUQsSUFBbkQsQ0FGaEIsQ0FWQyxDQWFEOzs7QUFiQztBQUFBLDhCQWNHWSxvQkFBb0IsSUFBSUEsb0JBQW9CLEtBQUtFLFlBZHBEO0FBQUEsbURBZU0sT0FBS2xELGlCQUFMLENBQXVCb0MsZUFBdkIsRUFBd0MsSUFBeEMsRUFBOEMsS0FBOUMsRUFBcUQsSUFBckQsQ0FmTjtBQWdCQSxxQ0FBS0YsZUFBTCxDQUFxQnBFLFdBQVcsQ0FBQ3NGLEtBQWpDO0FBaEJBO0FBQUE7QUFrQkEsbUNBQUtsQixlQUFMLENBQXFCcEUsV0FBVyxDQUFDc0YsS0FBakM7QUFsQkE7QUFBQTs7QUFBQTtBQUFBO0FBcUJELCtCQUFLbEIsZUFBTCxDQUFxQnBFLFdBQVcsQ0FBQ3NGLEtBQWpDO0FBckJDO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUF3QkgsYUFyQ2dDLFlBcUN4QnZDLE1BckN3QixFQXFDWDtBQUNyQkMsY0FBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsbUNBQVYsRUFBK0NGLE1BQS9DOztBQURxQixrQkFFakJjLFFBQVEsSUFBSUYsc0JBRks7QUFHcEIsdUJBQUtTLGVBQUwsQ0FBcUJwRSxXQUFXLENBQUN1RixLQUFqQztBQUhvQjtBQUtyQixhQTFDZ0M7QUFBQTtBQTJDaEMsbUJBQUs5RCxrQkFBTCxHQUEwQitELFlBQTFCOztBQTNDZ0M7QUFBQTtBQUFBOztBQUFBO0FBNkNqQyxTQTdDTTtBQUFBO0FBQUE7QUFBQSxRQUFQO0FBOENBLEssQ0FFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUdDQyxjLEdBRkEsd0JBR0NDLFlBSEQsRUFJQ0MsYUFKRCxFQVNpQjtBQUFBOztBQUNoQixVQUFNNUUsaUJBQWlCLEdBQUcsS0FBS0MscUJBQUwsRUFBMUI7QUFBQSxVQUNDNEUsV0FBVyxHQUFHLEtBQUtDLGlCQUFMLEVBRGY7O0FBRUEsVUFBSUMsTUFBSixDQUhnQixDQUdDOztBQUNqQixVQUFJMUMsV0FBZ0IsR0FBR3VDLGFBQXZCOztBQUNBLFVBQU1JLGVBQWUsR0FBRyxLQUFLQyxrQkFBTCxFQUF4Qjs7QUFDQSxVQUFNQyxlQUFlLEdBQ3BCLENBQUM3QyxXQUFELElBQ0NBLFdBQVcsQ0FBQzhDLFlBQVosS0FBNkJ0RyxZQUFZLENBQUN1RyxNQUExQyxJQUNBL0MsV0FBVyxDQUFDOEMsWUFBWixLQUE2QnRHLFlBQVksQ0FBQ3dHLFdBRDFDLElBRUFoRCxXQUFXLENBQUM4QyxZQUFaLEtBQTZCdEcsWUFBWSxDQUFDeUcsUUFKNUM7QUFLQSxVQUFJQyxxQkFBcUIsR0FBR0MsT0FBTyxDQUFDQyxPQUFSLENBQWdCLEVBQWhCLENBQTVCO0FBQ0EsVUFBTUMsYUFBYSxHQUFHQyxXQUFXLENBQUNDLGVBQVosQ0FBNEIsS0FBS25GLE9BQUwsRUFBNUIsQ0FBdEI7QUFDQWlGLE1BQUFBLGFBQWEsQ0FBQ0csY0FBZCxHQUErQkMsa0JBQS9COztBQUVBLFVBQUl6RCxXQUFXLENBQUM4QyxZQUFaLEtBQTZCdEcsWUFBWSxDQUFDeUcsUUFBOUMsRUFBd0Q7QUFDdkQ7QUFDQTtBQUNBLGVBQU8sS0FBS3JDLFNBQUwsR0FBaUJ2RSxJQUFqQixDQUFzQixZQUFNO0FBQ2xDLGNBQU1xSCxXQUFXLEdBQUcsTUFBSSxDQUFDdEYsT0FBTCxHQUFlK0IsYUFBZixFQUFwQjtBQUFBLGNBQ0N3RCxXQUFXLEdBQUdDLFdBQVcsQ0FBQ0MsaUNBQVosQ0FBOEMsTUFBSSxDQUFDekYsT0FBTCxFQUE5QyxFQUE4RGtFLFlBQTlELENBRGY7O0FBR0NvQixVQUFBQSxXQUFELENBQXFCSSxRQUFyQixDQUE4QkMsOEJBQTlCLENBQTZETCxXQUE3RCxFQUEwRTFELFdBQVcsQ0FBQ2dFLFFBQXRGLEVBQWdHQyxTQUFoRyxFQUEyR04sV0FBM0c7QUFDQSxTQUxNLENBQVA7QUFNQTs7QUFFRCxVQUFJM0QsV0FBVyxDQUFDOEMsWUFBWixLQUE2QnRHLFlBQVksQ0FBQ3dHLFdBQTFDLElBQXlEaEQsV0FBVyxDQUFDa0UsV0FBekUsRUFBc0Y7QUFDckYsWUFBTUMsbUJBQW1CLEdBQUduRSxXQUFXLENBQUNrRSxXQUFaLENBQXdCMUQsaUJBQXhCLEdBQTRDZSxTQUE1QyxFQUE1QjtBQUNBLGVBQU80QyxtQkFBbUIsQ0FBQywyQkFBRCxDQUExQjtBQUNBekIsUUFBQUEsTUFBTSxHQUFHMUMsV0FBVyxDQUFDa0UsV0FBWixDQUF3QkUsU0FBeEIsRUFBVDtBQUNBbEIsUUFBQUEscUJBQXFCLEdBQUd2RixpQkFBaUIsQ0FBQzBHLGdCQUFsQixDQUN2QjNCLE1BQU0sQ0FBQ2xDLGlCQUFQLEVBRHVCLEVBRXZCO0FBQ0M4RCxVQUFBQSxJQUFJLEVBQUVILG1CQURQO0FBRUNJLFVBQUFBLHdCQUF3QixFQUFFN0IsTUFBTSxDQUFDOEIsY0FBUCxHQUF3QkYsSUFBeEIsQ0FBNkIsMEJBQTdCO0FBRjNCLFNBRnVCLEVBTXZCLEtBQUt0RyxJQUFMLENBQVVJLE9BQVYsRUFOdUIsQ0FBeEIsQ0FKcUYsQ0FhckY7O0FBQ0EsWUFBSXNFLE1BQU0sQ0FBQzhCLGNBQVAsR0FBd0JGLElBQXhCLENBQTZCLGlDQUE3QixNQUFvRSxNQUF4RSxFQUFnRjtBQUMvRSxjQUFNRyxxQkFBcUIsR0FBRy9CLE1BQU0sQ0FBQ2xDLGlCQUFQLENBQXlCLFVBQXpCLENBQTlCO0FBQ0FpRSxVQUFBQSxxQkFBcUIsQ0FBQ0MsV0FBdEIsQ0FBa0MsMEJBQWxDLEVBQThELEVBQTlEO0FBQ0E7QUFDRDs7QUFFRCxVQUFJMUUsV0FBVyxDQUFDOEMsWUFBWixLQUE2QnRHLFlBQVksQ0FBQ3VHLE1BQTFDLElBQW9EL0MsV0FBVyxDQUFDMkUsT0FBcEUsRUFBNkU7QUFDNUVqQyxRQUFBQSxNQUFNLEdBQUcsS0FBS3RFLE9BQUwsR0FBZXdHLElBQWYsQ0FBb0I1RSxXQUFXLENBQUMyRSxPQUFoQyxDQUFUO0FBQ0E7O0FBRUQsVUFBSWpDLE1BQU0sSUFBSUEsTUFBTSxDQUFDbUMsR0FBUCxDQUFXLGtCQUFYLENBQWQsRUFBOEM7QUFDN0MsWUFBTUMsZUFBZSxHQUNwQjlFLFdBQVcsQ0FBQzhDLFlBQVosS0FBNkJ0RyxZQUFZLENBQUN1RyxNQUExQyxHQUFtREwsTUFBTSxDQUFDcUMsUUFBUCxDQUFnQnhJLElBQWhCLENBQXFCbUcsTUFBckIsQ0FBbkQsR0FBa0ZBLE1BQU0sQ0FBQ3NDLGFBQVAsQ0FBcUJ6SSxJQUFyQixDQUEwQm1HLE1BQTFCLENBRG5GO0FBRUFBLFFBQUFBLE1BQU0sQ0FBQ3VDLGFBQVAsR0FBdUJDLGVBQXZCLENBQXVDLFFBQXZDLEVBQWlELFlBQVk7QUFDNURKLFVBQUFBLGVBQWUsQ0FBQzlFLFdBQVcsQ0FBQ21GLFdBQVosR0FBMEJ6QyxNQUFNLENBQUN1QyxhQUFQLEdBQXVCRyxTQUF2QixFQUExQixHQUErRCxDQUFoRSxFQUFtRSxJQUFuRSxDQUFmO0FBQ0EsU0FGRDtBQUdBOztBQUVELFVBQU1DLGlCQUFpQixHQUFHLFVBQUNDLFlBQUQsRUFBb0JDLGdCQUFwQixFQUEyRDtBQUNwRkEsUUFBQUEsZ0JBQWdCLENBQ2RsSixJQURGLENBQ08sVUFBVW1KLFdBQVYsRUFBNEI7QUFDakM7QUFDQSxpQkFBT0EsV0FBVyxDQUFDQyxPQUFaLEVBQVA7QUFDQSxTQUpGLEVBS0VwSixJQUxGLENBS08sWUFBTTtBQUNYLGNBQU02RSxlQUFlLEdBQUcsTUFBSSxDQUFDOUMsT0FBTCxHQUFlb0MsaUJBQWYsRUFBeEIsQ0FEVyxDQUVYO0FBQ0E7QUFDQTs7O0FBQ0EsY0FBSSxDQUFDOEMsV0FBVyxDQUFDb0MsbUJBQVosQ0FBZ0NKLFlBQWhDLENBQUwsRUFBb0Q7QUFDbkQsZ0JBQU1LLFlBQVksR0FBR3JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixNQUFJLENBQUNuRixPQUFMLEVBQTVCLENBQXJCO0FBQ0F1SCxZQUFBQSxZQUFZLENBQ1ZDLHFCQURGLEdBRUVDLHVDQUZGLENBRTBDUCxZQUFZLENBQUM1RixPQUFiLEVBRjFDLEVBRWtFd0IsZUFGbEU7QUFHQTtBQUNELFNBaEJGLEVBaUJFNEUsS0FqQkYsQ0FpQlEsVUFBVW5HLE1BQVYsRUFBdUI7QUFDN0JDLFVBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLG1DQUFWLEVBQStDRixNQUEvQztBQUNBLFNBbkJGO0FBb0JBLE9BckJEO0FBdUJBO0FBQ0Y7QUFDQTs7O0FBQ0UsVUFBTW9HLDhCQUE4QixHQUFHLFVBQUNDLG1CQUFELEVBQWdDO0FBQUE7O0FBQ3RFLFlBQU1DLHlCQUF5QixHQUFHdkQsTUFBTSxJQUFJQSxNQUFNLENBQUM4QixjQUFQLEdBQXdCRixJQUF4QixDQUE2QiwwQkFBN0IsQ0FBNUM7QUFDQSxZQUFNNEIsZUFBZSxHQUFHeEQsTUFBTSw4QkFBSUEsTUFBTSxDQUFDbEMsaUJBQVAsQ0FBeUIsVUFBekIsQ0FBSiwwREFBSSxzQkFBc0MyRixXQUF0QyxDQUFrRCwyQkFBbEQsQ0FBSixDQUE5QjtBQUNBLFlBQU1DLGVBQWUsR0FBR0MsSUFBSSxDQUFDQyxpQkFBTCxFQUF4QjtBQUNBLFlBQU1DLGVBQXNCLEdBQUcsRUFBL0I7QUFDQSxZQUFJQyxhQUFKO0FBQ0EsWUFBSUMsT0FBSixDQU5zRSxDQVF0RTs7QUFDQUwsUUFBQUEsZUFBZSxDQUNiTSxlQURGLEdBRUVDLE9BRkYsR0FHRUMsT0FIRixDQUdVLFVBQVVDLFFBQVYsRUFBeUI7QUFDakMsY0FBSUEsUUFBUSxDQUFDQyxJQUFULEtBQWtCYix5QkFBdEIsRUFBaUQ7QUFDaERHLFlBQUFBLGVBQWUsQ0FBQ1csY0FBaEIsQ0FBK0JGLFFBQS9CO0FBQ0E7QUFDRCxTQVBGO0FBU0FiLFFBQUFBLG1CQUFtQixDQUFDWSxPQUFwQixDQUE0QixVQUFDSSxrQkFBRCxFQUE2QjtBQUN4RDtBQUNBLGNBQUlBLGtCQUFrQixDQUFDQyxhQUF2QixFQUFzQztBQUFBOztBQUNyQ1QsWUFBQUEsYUFBYSxHQUFHSCxJQUFJLENBQUNhLFVBQUwsQ0FBZ0JoQixlQUFlLENBQUNjLGtCQUFrQixDQUFDQyxhQUFwQixDQUFmLENBQWtERSxPQUFsRSxDQUFoQjtBQUNBVixZQUFBQSxPQUFPLHNDQUFNRCxhQUFhLENBQUNoRyxpQkFBZCxFQUFOLDBEQUFNLHNCQUFtQ2QsT0FBbkMsRUFBTixjQUFzRDhHLGFBQWEsQ0FBQ1ksY0FBZCxDQUE2QixPQUE3QixDQUF0RCxDQUFQLENBRnFDLENBR3JDOztBQUNBLGdCQUNDaEIsZUFBZSxDQUNiTSxlQURGLEdBRUVDLE9BRkYsR0FHRVUsTUFIRixDQUdTLFVBQVVSLFFBQVYsRUFBeUI7QUFDaEMscUJBQU9BLFFBQVEsQ0FBQ1MsTUFBVCxLQUFvQmIsT0FBM0I7QUFDQSxhQUxGLEVBS0k5RSxNQUxKLEtBS2UsQ0FOaEIsRUFPRTtBQUNEeUUsY0FBQUEsZUFBZSxDQUFDbUIsV0FBaEIsQ0FDQyxJQUFJQyxPQUFKLENBQVk7QUFDWEMsZ0JBQUFBLE9BQU8sRUFBRVQsa0JBQWtCLENBQUNVLFdBRGpCO0FBRVhDLGdCQUFBQSxTQUFTLEVBQUUsTUFBSSxDQUFDdkosT0FBTCxHQUFlTSxRQUFmLEVBRkE7QUFHWGtKLGdCQUFBQSxJQUFJLEVBQUU3SyxXQUFXLENBQUM4SyxLQUhQO0FBSVhmLGdCQUFBQSxJQUFJLEVBQUViLHlCQUpLO0FBS1g2QixnQkFBQUEsU0FBUyxFQUFFLEtBTEE7QUFNWEMsZ0JBQUFBLFVBQVUsRUFBRSxLQU5EO0FBT1hULGdCQUFBQSxNQUFNLEVBQUViO0FBUEcsZUFBWixDQUREO0FBV0EsYUF2Qm9DLENBd0JyQzs7O0FBQ0EsZ0JBQU11QiwyQkFBMkIsR0FBRzVCLGVBQWUsQ0FDakRNLGVBRGtDLEdBRWxDQyxPQUZrQyxHQUdsQ1UsTUFIa0MsQ0FHM0IsVUFBVVIsUUFBVixFQUF5QjtBQUNoQyxxQkFBT0EsUUFBUSxDQUFDUyxNQUFULEtBQW9CYixPQUEzQjtBQUNBLGFBTGtDLENBQXBDO0FBTUF1QixZQUFBQSwyQkFBMkIsQ0FBQyxDQUFELENBQTNCLENBQStCQyxZQUEvQixDQUE0Qy9CLGVBQWUsQ0FBQ2Msa0JBQWtCLENBQUNDLGFBQXBCLENBQWYsQ0FBa0RFLE9BQTlGLEVBL0JxQyxDQWlDckM7QUFDQSxXQWxDRCxNQWtDTztBQUNOWixZQUFBQSxlQUFlLENBQUMyQixJQUFoQixDQUFxQjtBQUNwQnBCLGNBQUFBLElBQUksRUFBRWIseUJBRGM7QUFFcEJrQyxjQUFBQSxJQUFJLEVBQUVuQixrQkFBa0IsQ0FBQ1UsV0FGTDtBQUdwQkssY0FBQUEsVUFBVSxFQUFFLElBSFE7QUFJcEJILGNBQUFBLElBQUksRUFBRTdLLFdBQVcsQ0FBQzhLO0FBSkUsYUFBckI7QUFNQTtBQUNELFNBNUNEOztBQThDQSxZQUFJdEIsZUFBZSxDQUFDNUUsTUFBaEIsR0FBeUIsQ0FBN0IsRUFBZ0M7QUFDL0IsVUFBQSxNQUFJLENBQUN0RCxrQkFBTCxHQUEwQlEsaUJBQTFCLENBQTRDO0FBQzNDdUosWUFBQUEsY0FBYyxFQUFFN0I7QUFEMkIsV0FBNUM7QUFHQTtBQUNELE9BckVEOztBQXNFQSxVQUFJMUQsZUFBSixFQUFxQjtBQUNwQndGLFFBQUFBLFVBQVUsQ0FBQ0MsSUFBWCxDQUFnQjlGLFdBQWhCO0FBQ0E7O0FBQ0QsYUFBTyxLQUFLNUIsU0FBTCxDQUFlc0MscUJBQWYsRUFDTDdHLElBREssQ0FDQSxVQUFDMkosbUJBQUQsRUFBOEI7QUFDbkMsWUFBSUEsbUJBQW1CLENBQUNyRSxNQUFwQixHQUE2QixDQUFqQyxFQUFvQztBQUNuQ29FLFVBQUFBLDhCQUE4QixDQUFDQyxtQkFBRCxDQUE5QjtBQUNBcEcsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsMEJBQVYsRUFGbUMsQ0FHbkM7O0FBQ0E7QUFDQTs7QUFFRCxZQUFJdEIsaUJBQUo7QUFDQSxZQUFJK0csWUFBSjtBQUVBdEYsUUFBQUEsV0FBVyxHQUFHQSxXQUFXLElBQUksRUFBN0I7O0FBRUEsWUFBSXNDLFlBQVksSUFBSSxPQUFPQSxZQUFQLEtBQXdCLFFBQTVDLEVBQXNEO0FBQ3JEO0FBQ0FnRCxVQUFBQSxZQUFZLEdBQUdoRCxZQUFmO0FBQ0EsU0FIRCxNQUdPLElBQUksT0FBT0EsWUFBUCxLQUF3QixRQUE1QixFQUFzQztBQUM1Q2dELFVBQUFBLFlBQVksR0FBRyxJQUFLaUQsZ0JBQUwsQ0FBOEIsTUFBSSxDQUFDbkssT0FBTCxHQUFlTSxRQUFmLEVBQTlCLEVBQXlENEQsWUFBekQsQ0FBZjtBQUNBdEMsVUFBQUEsV0FBVyxDQUFDOEMsWUFBWixHQUEyQnRHLFlBQVksQ0FBQ2dNLElBQXhDO0FBQ0EsaUJBQU94SSxXQUFXLENBQUNtRixXQUFuQjtBQUNBLFNBSk0sTUFJQTtBQUNOLGdCQUFNLElBQUkwQyxLQUFKLENBQVUsaUNBQVYsQ0FBTjtBQUNBOztBQUVELFlBQU1ZLE1BQU0sR0FBR25ELFlBQVksQ0FBQzVHLFFBQWIsRUFBZjtBQUNBLFlBQU1nSyxhQUFhLEdBQUcxSSxXQUFXLENBQUM4QyxZQUFsQztBQUVBLGVBQU9LLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixNQUFJLENBQUM1RSxvQkFBTCxDQUEwQjhHLFlBQTFCLENBQWhCLEVBQ0xqSixJQURLLENBQ0EsVUFBQ3NNLGdCQUFELEVBQTJCO0FBQ2hDcEssVUFBQUEsaUJBQWlCLEdBQUdvSyxnQkFBcEI7O0FBQ0EsY0FBSUQsYUFBYSxJQUFJQSxhQUFhLEtBQUtsTSxZQUFZLENBQUNvTSxPQUFwRCxFQUE2RDtBQUM1RDtBQUNBLG1CQUFPRixhQUFQO0FBQ0EsV0FIRCxNQUdPO0FBQ04sZ0JBQU12SCxVQUFVLEdBQUdzSCxNQUFNLENBQUNySCxZQUFQLEVBQW5CLENBRE0sQ0FFTjs7QUFDQSxnQkFBSSxDQUFDa0UsWUFBWSxDQUFDdUQsVUFBYixFQUFMLEVBQWdDO0FBQy9CLGtCQUFNQyxLQUFLLEdBQUd4RCxZQUFZLENBQUM1RixPQUFiLEVBQWQ7QUFBQSxrQkFDQztBQUNBO0FBQ0FxSixjQUFBQSxVQUFVLEdBQ1R4SyxpQkFBaUIsS0FBSzdCLGdCQUFnQixDQUFDZ0UsS0FBdkMsR0FDR1MsVUFBVSxDQUFDSSxTQUFYLFdBQXdCdUgsS0FBeEIseURBREgsR0FFRzNILFVBQVUsQ0FBQ0ksU0FBWCxXQUNHdUgsS0FESCx1RUFOTDs7QUFTQSxrQkFBSUMsVUFBSixFQUFnQjtBQUNmLG9CQUFNQyxXQUFXLEdBQUc3SCxVQUFVLENBQUNJLFNBQVgsWUFBeUJ3SCxVQUF6QixzQ0FBc0UsRUFBMUYsQ0FEZSxDQUVmOztBQUNBLG9CQUFJQyxXQUFXLENBQUNySCxNQUFaLEdBQXFCLENBQXpCLEVBQTRCO0FBQzNCLHlCQUFPbkYsWUFBWSxDQUFDeU0sUUFBcEI7QUFDQTtBQUNEO0FBQ0Q7O0FBQ0QsZ0JBQU1DLFNBQVMsR0FBRy9ILFVBQVUsQ0FBQ2dJLFdBQVgsQ0FBdUI3RCxZQUFZLENBQUM4RCxnQkFBYixHQUFnQzFKLE9BQWhDLEVBQXZCLENBQWxCO0FBQ0EsZ0JBQU0ySiw0QkFBNEIsR0FBRy9GLFdBQVcsQ0FBQ2dHLDJCQUFaLENBQ3BDbkksVUFEb0MsRUFFcEMrSCxTQUZvQyxFQUdwQyxNQUFJLENBQUM5SyxPQUFMLEVBSG9DLENBQXJDOztBQUtBLGdCQUFJaUwsNEJBQTRCLENBQUMxSCxNQUE3QixHQUFzQyxDQUExQyxFQUE2QztBQUM1QyxxQkFBT25GLFlBQVksQ0FBQ3lNLFFBQXBCO0FBQ0E7O0FBQ0QsbUJBQU96TSxZQUFZLENBQUMrTSxLQUFwQjtBQUNBO0FBQ0QsU0F0Q0ssRUF1Q0xsTixJQXZDSyxDQXVDQSxVQUFDbU4sb0JBQUQsRUFBK0I7QUFDcEMsY0FBSUMsU0FBSjtBQUNBLGNBQUlDLEtBQUo7QUFDQSxjQUFNQyxZQUFZLEdBQUczSixXQUFXLENBQUNrRSxXQUFqQztBQUNBLGNBQUkwRixtQkFBSjtBQUNBLGNBQUlDLGdCQUFnQixHQUFHMUcsT0FBTyxDQUFDQyxPQUFSLEVBQXZCO0FBQ0EsY0FBSTBHLFFBQUo7QUFDQSxjQUFJWixTQUFKO0FBQ0EsY0FBTS9ILFVBQVUsR0FBR3NILE1BQU0sQ0FBQ3JILFlBQVAsRUFBbkI7O0FBQ0EsY0FBTTJJLGdCQUFnQixHQUFHLE1BQUksQ0FBQ0MsbUJBQUwsRUFBekI7O0FBRUEsY0FBSVIsb0JBQW9CLEtBQUtoTixZQUFZLENBQUN5TSxRQUExQyxFQUFvRDtBQUNuRCxnQkFBSU8sb0JBQW9CLEtBQUtoTixZQUFZLENBQUN3RyxXQUExQyxFQUF1RDtBQUN0RDRHLGNBQUFBLG1CQUFtQixHQUFHRCxZQUFZLENBQUNuSixpQkFBYixFQUF0QjtBQUNBMEksY0FBQUEsU0FBUyxHQUFHL0gsVUFBVSxDQUFDZ0ksV0FBWCxDQUF1QlMsbUJBQW1CLENBQUNsSyxPQUFwQixFQUF2QixDQUFaLENBRnNELENBR3REOztBQUNBb0ssY0FBQUEsUUFBUSxHQUFHRixtQkFBbUIsQ0FBQ3JJLFNBQXBCLEVBQVg7QUFDQXZCLGNBQUFBLFdBQVcsQ0FBQ3NFLElBQVosR0FBbUIsRUFBbkI7QUFDQTJGLGNBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSixRQUFaLEVBQXNCbEQsT0FBdEIsQ0FBOEIsVUFBVXVELGFBQVYsRUFBaUM7QUFDOUQsb0JBQU1DLFNBQVMsR0FBR2pKLFVBQVUsQ0FBQ0ksU0FBWCxXQUF3QjJILFNBQXhCLGNBQXFDaUIsYUFBckMsRUFBbEIsQ0FEOEQsQ0FFOUQ7O0FBQ0Esb0JBQUlDLFNBQVMsSUFBSUEsU0FBUyxDQUFDQyxLQUFWLEtBQW9CLG9CQUFyQyxFQUEyRDtBQUMxRDtBQUNBOztBQUNEckssZ0JBQUFBLFdBQVcsQ0FBQ3NFLElBQVosQ0FBaUI2RixhQUFqQixJQUFrQ0wsUUFBUSxDQUFDSyxhQUFELENBQTFDO0FBQ0EsZUFQRDtBQVFBTixjQUFBQSxnQkFBZ0IsR0FBRyxNQUFJLENBQUNTLHlCQUFMLEVBQW5CO0FBQ0E7O0FBQ0QsZ0JBQUlkLG9CQUFvQixLQUFLaE4sWUFBWSxDQUFDd0csV0FBdEMsSUFBcUR3RyxvQkFBb0IsS0FBS2hOLFlBQVksQ0FBQ3VHLE1BQS9GLEVBQXVHO0FBQ3RHL0MsY0FBQUEsV0FBVyxDQUFDdUssNEJBQVosR0FBMkMsS0FBM0MsQ0FEc0csQ0FDcEQ7QUFDbEQ7O0FBQ0F2SyxjQUFBQSxXQUFXLENBQUN3SyxRQUFaLEdBQXVCLE9BQXZCLENBSHNHLENBS3RHO0FBQ0E7O0FBQ0EsY0FBQSxNQUFJLENBQUNDLG1CQUFMLENBQXlCbkYsWUFBekI7QUFDQTs7QUFFRG1FLFlBQUFBLFNBQVMsR0FBR0ksZ0JBQWdCLENBQUN4TixJQUFqQixDQUFzQixZQUFNO0FBQ3ZDLGtCQUFJLENBQUMyRCxXQUFXLENBQUMwSyxhQUFqQixFQUFnQztBQUMvQjFLLGdCQUFBQSxXQUFXLENBQUMwSyxhQUFaLEdBQTRCLE1BQUksQ0FBQ3RNLE9BQUwsRUFBNUI7QUFDQTs7QUFDRDRCLGNBQUFBLFdBQVcsQ0FBQzJLLG9CQUFaLEdBQW1DLE1BQUksQ0FBQzNNLElBQUwsQ0FBVUMsUUFBVixDQUFtQjJNLGNBQXREO0FBQ0EscUJBQU9qTixpQkFBaUIsQ0FBQzBFLGNBQWxCLENBQ05pRCxZQURNLEVBRU50RixXQUZNLEVBR04yQyxlQUhNLEVBSU4sTUFBSSxDQUFDdEUsa0JBQUwsRUFKTSxFQUtOLEtBTE0sRUFNTixNQUFJLENBQUNELE9BQUwsRUFOTSxDQUFQO0FBUUEsYUFiVyxDQUFaO0FBY0E7O0FBRUQsY0FBSXlNLFdBQUo7O0FBQ0Esa0JBQVFyQixvQkFBUjtBQUNDLGlCQUFLaE4sWUFBWSxDQUFDeU0sUUFBbEI7QUFDQzRCLGNBQUFBLFdBQVcsR0FBR2QsZ0JBQWdCLENBQUNlLHdCQUFqQixDQUEwQ3hGLFlBQTFDLEVBQXdEO0FBQ3JFeUYsZ0JBQUFBLGdCQUFnQixFQUFFLElBRG1EO0FBRXJFQyxnQkFBQUEsUUFBUSxFQUFFLElBRjJEO0FBR3JFQyxnQkFBQUEsV0FBVyxFQUFFO0FBSHdELGVBQXhELENBQWQ7QUFLQTs7QUFDRCxpQkFBS3pPLFlBQVksQ0FBQytNLEtBQWxCO0FBQ0NzQixjQUFBQSxXQUFXLEdBQUdkLGdCQUFnQixDQUFDZSx3QkFBakIsQ0FBMEN4RixZQUExQyxFQUF3RDtBQUNyRTRGLGdCQUFBQSxZQUFZLEVBQUV6QixTQUR1RDtBQUVyRXVCLGdCQUFBQSxRQUFRLEVBQUUsSUFGMkQ7QUFHckVDLGdCQUFBQSxXQUFXLEVBQUU7QUFId0QsZUFBeEQsQ0FBZDtBQUtBOztBQUNELGlCQUFLek8sWUFBWSxDQUFDZ00sSUFBbEI7QUFDQ2tCLGNBQUFBLEtBQUssR0FBRztBQUNQc0IsZ0JBQUFBLFFBQVEsRUFBRSxJQURIO0FBRVBDLGdCQUFBQSxXQUFXLEVBQUU7QUFGTixlQUFSOztBQUlBLGtCQUFJMU0saUJBQWlCLElBQUk3QixnQkFBZ0IsQ0FBQ3NDLE1BQXRDLElBQWdEZ0IsV0FBVyxDQUFDbUwsWUFBaEUsRUFBOEU7QUFDN0V6QixnQkFBQUEsS0FBSyxDQUFDMEIsU0FBTixHQUFrQixJQUFsQjtBQUNBOztBQUNEUCxjQUFBQSxXQUFXLEdBQUdwQixTQUFTLENBQUNwTixJQUFWLENBQWUsVUFBVWlDLG1CQUFWLEVBQW9DO0FBQ2hFLG9CQUFJLENBQUNBLG1CQUFMLEVBQTBCO0FBQ3pCLHNCQUFNK00sa0JBQWtCLEdBQUloRixJQUFELENBQWlCaUYsd0JBQWpCLENBQTBDLGFBQTFDLENBQTNCO0FBQ0EseUJBQU92QixnQkFBZ0IsQ0FBQ3dCLHFCQUFqQixDQUNORixrQkFBa0IsQ0FBQ0csT0FBbkIsQ0FBMkIsb0NBQTNCLENBRE0sRUFFTjtBQUNDQyxvQkFBQUEsS0FBSyxFQUFFSixrQkFBa0IsQ0FBQ0csT0FBbkIsQ0FBMkIsc0JBQTNCLENBRFI7QUFFQ0Usb0JBQUFBLFdBQVcsRUFBRUwsa0JBQWtCLENBQUNHLE9BQW5CLENBQTJCLDhDQUEzQjtBQUZkLG1CQUZNLENBQVA7QUFPQSxpQkFURCxNQVNPO0FBQ04seUJBQU96QixnQkFBZ0IsQ0FBQ2Usd0JBQWpCLENBQTBDeE0sbUJBQTFDLEVBQStEb0wsS0FBL0QsQ0FBUDtBQUNBO0FBQ0QsZUFiYSxDQUFkO0FBY0E7O0FBQ0QsaUJBQUtsTixZQUFZLENBQUN1RyxNQUFsQjtBQUNDc0MsY0FBQUEsaUJBQWlCLENBQUNDLFlBQUQsRUFBZW1FLFNBQWYsQ0FBakI7O0FBQ0EsY0FBQSxNQUFJLENBQUM3SSxTQUFMLENBQWU2SSxTQUFmOztBQUNBOztBQUNELGlCQUFLak4sWUFBWSxDQUFDd0csV0FBbEI7QUFDQztBQUNBO0FBQ0E2SCxjQUFBQSxXQUFXLEdBQUdoQixnQkFBZ0IsQ0FDNUJ4TixJQURZLENBQ1AsWUFBWTtBQUNqQixvQkFBTXNQLHVCQUF1QixHQUFHL0IsbUJBQW1CLENBQUNnQyxVQUFwQixFQUFoQzs7QUFFQSxvQkFBSSxDQUFDNUwsV0FBVyxDQUFDNkwsZ0JBQWpCLEVBQW1DO0FBQ2xDeEcsa0JBQUFBLGlCQUFpQixDQUFDQyxZQUFELEVBQWVtRSxTQUFmLENBQWpCO0FBQ0E7O0FBRUQsb0JBQU1xQyxvQkFBb0IsR0FBR0gsdUJBQXVCLENBQUNJLE1BQXhCLEVBQTdCO0FBQ0FwQyxnQkFBQUEsWUFBWSxDQUFDcUMsaUJBQWIsQ0FBK0JGLG9CQUEvQixFQVJpQixDQVVqQjs7QUFDQUEsZ0JBQUFBLG9CQUFvQixDQUFDckcsT0FBckIsR0FBK0JLLEtBQS9CLENBQXFDLFlBQVk7QUFDaERsRyxrQkFBQUEsR0FBRyxDQUFDcU0sS0FBSixDQUFVLHlDQUFWO0FBQ0EsaUJBRkQ7QUFHQSx1QkFBT3JDLG1CQUFtQixDQUFDc0MsTUFBcEIsQ0FBMkIsU0FBM0IsQ0FBUDtBQUNBLGVBaEJZLEVBaUJacEcsS0FqQlksQ0FpQk4sVUFBQ25HLE1BQUQsRUFBaUI7QUFDdkI7QUFDQSxvQkFBSTBJLFVBQVUsQ0FBQzhELFFBQVgsQ0FBb0IsTUFBSSxDQUFDL04sT0FBTCxHQUFlTSxRQUFmLENBQXdCLElBQXhCLENBQXBCLENBQUosRUFBd0Q7QUFDdkQySixrQkFBQUEsVUFBVSxDQUFDK0QsTUFBWCxDQUFrQixNQUFJLENBQUNoTyxPQUFMLEdBQWVNLFFBQWYsQ0FBd0IsSUFBeEIsQ0FBbEI7QUFDQTs7QUFDRGtCLGdCQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVSxnQ0FBVixFQUE0Q0YsTUFBNUM7QUFDQSxlQXZCWSxDQUFkO0FBd0JBOztBQUNEO0FBQ0NrTCxjQUFBQSxXQUFXLEdBQUcxSCxPQUFPLENBQUNrSixNQUFSLGtDQUF5QzdDLG9CQUF6QyxFQUFkO0FBQ0E7QUF4RUY7O0FBMkVBLGNBQU04QyxrQkFBa0IsR0FDdkJ0TSxXQUFXLENBQUM4QyxZQUFaLEtBQTZCdEcsWUFBWSxDQUFDd0csV0FBMUMsSUFBeURoRCxXQUFXLENBQUM4QyxZQUFaLEtBQTZCdEcsWUFBWSxDQUFDdUcsTUFEcEc7O0FBRUEsY0FBSTBHLFNBQUosRUFBZTtBQUNkLG1CQUFPdEcsT0FBTyxDQUFDb0osR0FBUixDQUFZLENBQUM5QyxTQUFELEVBQVlvQixXQUFaLENBQVosRUFDTHhPLElBREssQ0FDQSxVQUFDbVEsT0FBRCxFQUF5QjtBQUM5QixjQUFBLE1BQUksQ0FBQy9OLG1DQUFMLENBQXlDRixpQkFBekMsRUFBNERrSyxNQUE1RDs7QUFFQSxrQkFBSTZELGtCQUFKLEVBQXdCO0FBQ3ZCLGdCQUFBLE1BQUksQ0FBQzNOLFlBQUwsQ0FBa0I5QixRQUFRLENBQUMrQixRQUEzQixFQUFxQzBOLGtCQUFyQztBQUNBLGVBRkQsTUFFTztBQUNOLGdCQUFBLE1BQUksQ0FBQzNOLFlBQUwsQ0FBa0I5QixRQUFRLENBQUMrQixRQUEzQjtBQUNBOztBQUNELGtCQUFNTixtQkFBbUIsR0FBR2tPLE9BQU8sQ0FBQyxDQUFELENBQW5DOztBQUNBLGtCQUFJbE8sbUJBQUosRUFBeUI7QUFDeEIsb0JBQUksQ0FBQyxNQUFJLENBQUNZLGFBQUwsRUFBTCxFQUEyQjtBQUMxQjRCLGtCQUFBQSxTQUFTLENBQUNDLGlCQUFWO0FBQ0E7O0FBQ0QsZ0JBQUEsTUFBSSxDQUFDMEwsYUFBTCxDQUFtQkMsUUFBUSxDQUFDQyxNQUE1QixFQUFvQ3JPLG1CQUFwQzs7QUFDQSxvQkFBSUMsaUJBQWlCLEtBQUs3QixnQkFBZ0IsQ0FBQ3NDLE1BQTNDLEVBQW1EO0FBQ2xELGtCQUFBLE1BQUksQ0FBQ0MsZUFBTCxDQUFxQlgsbUJBQXJCO0FBQ0E7QUFDRDtBQUNELGFBbkJLLEVBb0JMd0gsS0FwQkssQ0FvQkMsVUFBVW5HLE1BQVYsRUFBdUI7QUFDN0Isa0JBQ0NBLE1BQU0sS0FDTEEsTUFBTSxDQUFDaU4sOEJBQVAsSUFDQWpOLE1BQU0sSUFBSWhELFNBQVMsQ0FBQ2tRLGtCQURwQixJQUVBbE4sTUFBTSxDQUFDbU4sUUFGUCxJQUdDbk4sTUFBTSxDQUFDb04sYUFBUCxJQUF3QnBOLE1BQU0sQ0FBQ29OLGFBQVAsQ0FBcUIsQ0FBckIsRUFBd0JELFFBSjVDLENBRFAsRUFNRTtBQUNEL0MsZ0JBQUFBLGdCQUFnQixDQUFDNkMsOEJBQWpCO0FBQ0E7O0FBRUQscUJBQU96SixPQUFPLENBQUNrSixNQUFSLENBQWUxTSxNQUFmLENBQVA7QUFDQSxhQWhDSyxDQUFQO0FBaUNBO0FBQ0QsU0E5TUssQ0FBUDtBQStNQSxPQTNPSyxFQTRPTHFOLE9BNU9LLENBNE9HLFlBQVk7QUFDcEIsWUFBSW5LLGVBQUosRUFBcUI7QUFDcEJ3RixVQUFBQSxVQUFVLENBQUMrRCxNQUFYLENBQWtCNUosV0FBbEI7QUFDQTtBQUNELE9BaFBLLENBQVA7QUFpUEE7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1lBR0M7QUFDQXlLLElBQUFBLFksR0FIQSxzQkFHYWpOLFdBSGIsRUFHaUU7QUFDaEU7QUFDQSxhQUFPbUQsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztZQUdDO0FBQ0F3SCxJQUFBQSxjLEdBSEEsd0JBR2U1SyxXQUhmLEVBR2dHO0FBQy9GO0FBQ0EsYUFBT21ELE9BQU8sQ0FBQ0MsT0FBUixFQUFQO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1lBR0M7QUFDQWxGLElBQUFBLFksR0FIQSxzQkFHYThCLFdBSGIsRUFHaUU7QUFDaEU7QUFDQSxhQUFPbUQsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7WUFHQztBQUNBOEosSUFBQUEsZSxHQUhBLHlCQUdnQmxOLFdBSGhCLEVBR29FO0FBQ25FO0FBQ0EsYUFBT21ELE9BQU8sQ0FBQ0MsT0FBUixFQUFQO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1lBR0M7QUFDQWxELElBQUFBLGMsR0FIQSx3QkFHZUYsV0FIZixFQUdzRTtBQUNyRTtBQUNBLGFBQU9tRCxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBLEssQ0FFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUdPK0osWSx5QkFBYTFQLFEsRUFBcUJ1QyxXO1VBQWlDO0FBQUEscUJBSTlDLElBSjhDOztBQUN4RUEsUUFBQUEsV0FBVyxHQUFHQSxXQUFXLElBQUksRUFBN0I7QUFDQSxZQUFNb04sMEJBQTBCLEdBQUdwTixXQUFXLENBQUNvTiwwQkFBWixJQUEwQ25KLFNBQTdFO0FBQ0EsWUFBTXZHLGdCQUFnQixHQUFHLElBQXpCOztBQUNBLFlBQU1DLGlCQUFpQixHQUFHLE9BQUtDLHFCQUFMLEVBQTFCOztBQUNBLFlBQU0rRSxlQUFlLEdBQUcsT0FBS0Msa0JBQUwsRUFBeEI7O0FBQ0EsWUFBTXlLLFNBQVMsR0FBR3JOLFdBQVcsQ0FBQ3NOLFFBQTlCO0FBTndFLGtEQVFwRTtBQUFBLGlDQUNHLE9BQUsxTSxTQUFMLEVBREg7QUFBQSxtQ0FFRyxPQUFLMk0sa0JBQUwsQ0FBd0I5UCxRQUF4QixDQUZIO0FBQUEscUNBR0csT0FBSzZNLHlCQUFMLEVBSEg7QUFBQSx1Q0FJRyxPQUFLdE0sSUFBTCxDQUFVQyxRQUFWLENBQW1CZ1AsWUFBbkIsQ0FBZ0M7QUFBRTlPLGtCQUFBQSxPQUFPLEVBQUVWO0FBQVgsaUJBQWhDLENBSkg7QUFBQTtBQUFBLDJDQXNCaUNFLGlCQUFpQixDQUFDd1AsWUFBbEIsQ0FDbkMxUCxRQURtQyxFQUVuQ2tGLGVBRm1DLEVBR25DeUssMEJBSG1DLEVBSW5DQyxTQUptQyxFQUtuQyxPQUFLaFAsa0JBQUwsRUFMbUMsQ0F0QmpDLGlCQXNCR21QLHFCQXRCSDtBQThCSCw2QkFBS0Msd0JBQUw7O0FBQ0EsNkJBQUtDLHNDQUFMLENBQTRDblAsaUJBQTVDOztBQUVBLDZCQUFLa08sYUFBTCxDQUFtQkMsUUFBUSxDQUFDaUIsUUFBNUIsRUFBc0NILHFCQUF0Qzs7QUFDQSw2QkFBS0ksd0JBQUwsQ0FBOEJDLGVBQWUsQ0FBQ0MsSUFBOUMsRUFBb0RDLFdBQVcsQ0FBQ0MsY0FBaEU7O0FBRUEsNkJBQUtyUCxZQUFMLENBQWtCOUIsUUFBUSxDQUFDb1IsT0FBM0IsRUFBb0MsS0FBcEM7O0FBQ0EsNkJBQUs1UCxrQkFBTCxHQUEwQlEsaUJBQTFCOztBQXJDRztBQUFBLDRCQXVDQzJPLHFCQUFxQixLQUFLL1AsUUF2QzNCO0FBd0NGLDhCQUFJc0IsbUJBQWlCLEdBQUd5TyxxQkFBeEI7O0FBQ0EsOEJBQUkzUCxtQkFBbUIsQ0FBQ3FRLFlBQXBCLEVBQUosRUFBd0M7QUFBQTs7QUFDdkM3Tyw0QkFBQUEsV0FBVyxvQkFBR0EsV0FBSCx5REFBa0IsT0FBS0Msa0JBQUwsQ0FBd0I3QixRQUF4QixFQUFrQytQLHFCQUFsQyxDQUE3Qjs7QUFDQSxtQ0FBS2pPLHFCQUFMLENBQTJCRixXQUFXLENBQUNHLFdBQXZDOztBQUNBLGdDQUFJSCxXQUFXLENBQUNJLGFBQVosQ0FBMEJDLE9BQTFCLE9BQXdDOE4scUJBQXFCLENBQUM5TixPQUF0QixFQUE1QyxFQUE2RTtBQUM1RVgsOEJBQUFBLG1CQUFpQixHQUFHTSxXQUFXLENBQUNJLGFBQWhDO0FBQ0E7QUFDRDs7QUEvQ0MsaURBaURJLE9BQUtYLGlCQUFMLENBQXVCQyxtQkFBdkIsRUFBMEMsS0FBMUMsRUFBaUQsS0FBakQsRUFBd0RyQixnQkFBeEQsRUFBMEUsSUFBMUUsQ0FqREo7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFNSCxzQkFBTWEsaUJBQWlCLEdBQUcsT0FBS0Msb0JBQUwsQ0FBMEJmLFFBQTFCLENBQTFCOztBQUNBLHNCQUFNSSxtQkFBbUIsR0FBRyxPQUFLQyxzQkFBTCxFQUE1Qjs7QUFDQSxzQkFBSXVCLFdBQUo7O0FBUkc7QUFBQSx3QkFVRixDQUFDZCxpQkFBaUIsS0FBSzdCLGdCQUFnQixDQUFDc0MsTUFBdkMsSUFBaUR2QixRQUFRLENBQUMwSSxXQUFULENBQXFCLGlCQUFyQixDQUFsRCxLQUNBdEksbUJBQW1CLENBQUNxUSxZQUFwQixFQVhFO0FBYUY7QUFiRSw2Q0Fja0IsT0FBSzlPLDBCQUFMLENBQ25CM0IsUUFEbUIsRUFFbkJJLG1CQUFtQixDQUFDc0IsbUJBQXBCLEVBRm1CLEVBR25CWixpQkFIbUIsRUFJbkIsSUFKbUIsQ0FkbEI7QUFjRmMsd0JBQUFBLFdBQVcsd0JBQVg7QUFkRTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1ESCxTQTNEdUUsWUEyRC9ETSxNQTNEK0QsRUEyRGxEO0FBQ3JCLGNBQUksRUFBRUEsTUFBTSxJQUFJQSxNQUFNLENBQUNtTixRQUFuQixDQUFKLEVBQWtDO0FBQ2pDbE4sWUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsaUNBQVYsRUFBNkNGLE1BQTdDO0FBQ0E7O0FBQ0QsaUJBQU93RCxPQUFPLENBQUNrSixNQUFSLENBQWUxTSxNQUFmLENBQVA7QUFDQSxTQWhFdUU7QUFpRXhFLE87Ozs7O1dBR0t3TyxpQiw4QkFBa0IxUSxRO1VBQW9DO0FBQUEscUJBRzlCLElBSDhCOztBQUMzRCxZQUFNMlEsWUFBWSxHQUFHM1EsUUFBUSxDQUFDOEQsU0FBVCxFQUFyQjtBQUNBLFlBQUk4TSxTQUFKO0FBQ0EsWUFBTTVOLFFBQVEsR0FBR2hELFFBQVEsSUFBSSxPQUFLZSxvQkFBTCxDQUEwQmYsUUFBMUIsTUFBd0NmLGdCQUFnQixDQUFDZ0UsS0FBdEYsQ0FIMkQsQ0FLM0Q7O0FBQ0EsWUFDQyxDQUFDRCxRQUFELElBQ0EsRUFDRSxDQUFDMk4sWUFBWSxDQUFDRSxjQUFkLElBQWdDRixZQUFZLENBQUNHLGVBQTlDLElBQ0NILFlBQVksQ0FBQ0UsY0FBYixJQUErQkYsWUFBWSxDQUFDSSxjQUY5QyxDQUZELEVBTUU7QUFDRDtBQUNBOztBQUVELFlBQUksQ0FBQ0osWUFBWSxDQUFDRSxjQUFkLElBQWdDRixZQUFZLENBQUNHLGVBQWpELEVBQWtFO0FBQ2pFO0FBQ0FGLFVBQUFBLFNBQVMsR0FBRyxLQUFaO0FBQ0EsU0FIRCxNQUdPO0FBQ047QUFDQUEsVUFBQUEsU0FBUyxHQUFHLElBQVo7QUFDQTs7QUF0QjBELGtEQXdCdkQ7QUFDSCxjQUFNeFEsbUJBQW1CLEdBQUcsT0FBS0Msc0JBQUwsRUFBNUI7O0FBQ0EsY0FBTTJRLGlCQUFpQixHQUFHNVEsbUJBQW1CLENBQUNxUSxZQUFwQixLQUFxQ3JRLG1CQUFtQixDQUFDc0IsbUJBQXBCLEVBQXJDLEdBQWlGMUIsUUFBM0c7QUFGRyxpQ0FHdUIsT0FBSzJCLDBCQUFMLENBQWdDM0IsUUFBaEMsRUFBMENnUixpQkFBMUMsRUFBNkQvUixnQkFBZ0IsQ0FBQ2dFLEtBQTlFLEVBQXFGLEtBQXJGLENBSHZCLGlCQUdHckIsV0FISDtBQUFBO0FBQUEsa0JBSUNBLFdBSkQ7QUFLRix1QkFBS1YsWUFBTCxDQUFrQjBQLFNBQVMsR0FBR3hSLFFBQVEsQ0FBQytCLFFBQVosR0FBdUIvQixRQUFRLENBQUNvUixPQUEzRCxFQUFvRSxLQUFwRSxFQUxFLENBSzBFOzs7QUFFNUUsb0JBQUlwUSxtQkFBbUIsQ0FBQ3FRLFlBQXBCLEVBQUosRUFBd0M7QUFDdkMsc0JBQU1RLG1CQUFtQixHQUFHLE9BQUs3TSxtQkFBTCxFQUE1Qjs7QUFDQSxzQkFBSSxDQUFBNk0sbUJBQW1CLFNBQW5CLElBQUFBLG1CQUFtQixXQUFuQixZQUFBQSxtQkFBbUIsQ0FBRUMsYUFBckIsTUFBdUNsUixRQUFRLENBQUNpQyxPQUFULEVBQTNDLEVBQStEO0FBQzlELHdCQUFNa1AsVUFBVSxHQUFHdlAsV0FBVyxDQUFDRyxXQUFaLENBQXdCSCxXQUFXLENBQUNHLFdBQVosQ0FBd0JtQyxNQUF4QixHQUFpQyxDQUF6RCxFQUE0RGtOLE9BQS9FO0FBQ0F4UCxvQkFBQUEsV0FBVyxDQUFDRyxXQUFaLENBQXdCMEksSUFBeEIsQ0FBNkI7QUFBRTRHLHNCQUFBQSxPQUFPLEVBQUVKLG1CQUFtQixDQUFDM00sWUFBL0I7QUFBNkM4TSxzQkFBQUEsT0FBTyxFQUFFRDtBQUF0RCxxQkFBN0I7QUFDQTs7QUFDRCx5QkFBS3JQLHFCQUFMLENBQTJCRixXQUFXLENBQUNHLFdBQXZDO0FBQ0E7O0FBZEMsdUNBZ0JJLE9BQUtWLGlCQUFMLENBQXVCTyxXQUFXLENBQUNJLGFBQW5DLEVBQWtENE8sU0FBbEQsRUFBNkQsSUFBN0QsRUFBbUUsSUFBbkUsRUFBeUUsSUFBekUsRUFBK0UsS0FBL0UsQ0FoQko7QUFBQTtBQWtCRix1QkFBT2xMLE9BQU8sQ0FBQ2tKLE1BQVIsQ0FBZSwyREFBZixDQUFQO0FBbEJFO0FBQUE7QUFBQTtBQW9CSCxTQTVDMEQsWUE0Q2xEMU0sTUE1Q2tELEVBNEMxQztBQUNoQixpQkFBT3dELE9BQU8sQ0FBQ2tKLE1BQVIsK0NBQXNEMU0sTUFBdEQsRUFBUDtBQUNBLFNBOUMwRDtBQStDM0QsTzs7O01BRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHT29QLGMsMkJBQWV0UixRLEVBQXFCdUMsVztVQUE4RTtBQUFBLHNCQUM3RixJQUQ2Rjs7QUFDdkgsWUFBTXJDLGlCQUFpQixHQUFHLFFBQUtDLHFCQUFMLEVBQTFCOztBQUNBLFlBQU0rRSxlQUFlLEdBQUcsUUFBS0Msa0JBQUwsRUFBeEI7O0FBQ0EsWUFBTUwsYUFBa0IsR0FBR3ZDLFdBQTNCOztBQUNBLFlBQUlYLGFBQUo7O0FBRUFrRCxRQUFBQSxhQUFhLENBQUN5TSxZQUFkLEdBQTZCaFAsV0FBVyxDQUFDaVAsT0FBWixJQUF1QjFNLGFBQWEsQ0FBQ3lNLFlBQWxFO0FBQ0F6TSxRQUFBQSxhQUFhLENBQUMyTSxvQkFBZCxHQUFxQyxRQUFLbFIsSUFBTCxDQUFVQyxRQUFWLENBQW1CaVAsZUFBeEQ7QUFQdUgsa0RBU25IO0FBQUEsaUNBQ0csUUFBS3RNLFNBQUwsRUFESDtBQUFBO0FBQUEscUNBZWtDakQsaUJBQWlCLENBQUNvUixjQUFsQixDQUNwQ3RSLFFBRG9DLEVBRXBDOEUsYUFGb0MsRUFHcENJLGVBSG9DLEVBSXBDLFFBQUt0RSxrQkFBTCxFQUpvQyxDQWZsQyxpQkFlRzhRLHNCQWZIO0FBcUJILG9CQUFNelIsZ0JBQWdCLEdBQUcsSUFBekI7O0FBRUEsd0JBQUsrUCx3QkFBTDs7QUFDQSx3QkFBS0Msc0NBQUwsQ0FBNENuUCxpQkFBNUM7O0FBRUEsd0JBQUtJLFlBQUwsQ0FBa0I5QixRQUFRLENBQUNvUixPQUEzQixFQUFvQyxLQUFwQzs7QUFDQSx3QkFBS2pOLGVBQUwsQ0FBcUJwRSxXQUFXLENBQUN1RixLQUFqQyxFQTNCRyxDQTRCSDtBQUNBOzs7QUFDQXJCLGdCQUFBQSxTQUFTLENBQUNDLGlCQUFWO0FBOUJHO0FBQUEsc0JBZ0NDLENBQUNvTyxzQkFoQ0Y7QUFpQ0YsNEJBQUsxQyxhQUFMLENBQW1CQyxRQUFRLENBQUMwQyxPQUE1QixFQUFxQ25MLFNBQXJDLEVBakNFLENBa0NGOzs7QUFsQ0U7QUFBQSwwQkFtQ0UsQ0FBQzFCLGFBQWEsQ0FBQzhNLGtCQW5DakI7QUFBQSwrQ0FvQ0ssUUFBS3JGLG1CQUFMLEdBQTJCc0YsdUJBQTNCLENBQW1EN1IsUUFBbkQsQ0FwQ0w7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUF1Q0YsNEJBQUtnUCxhQUFMLENBQW1CQyxRQUFRLENBQUMwQyxPQUE1QixFQUFxQ0Qsc0JBQXJDOztBQUNBLHdCQUFJcFEsbUJBQWlCLEdBQUdvUSxzQkFBeEI7O0FBQ0Esd0JBQUksUUFBS2pRLGFBQUwsRUFBSixFQUEwQjtBQUFBOztBQUN6Qkcsc0JBQUFBLGFBQVcsb0JBQUdBLGFBQUgseURBQWtCLFFBQUtDLGtCQUFMLENBQXdCN0IsUUFBeEIsRUFBa0MwUixzQkFBbEMsQ0FBN0I7O0FBQ0EsOEJBQUs1UCxxQkFBTCxDQUEyQkYsYUFBVyxDQUFDRyxXQUF2Qzs7QUFDQSwwQkFBSUgsYUFBVyxDQUFDSSxhQUFaLENBQTBCQyxPQUExQixPQUF3Q3lQLHNCQUFzQixDQUFDelAsT0FBdkIsRUFBNUMsRUFBOEU7QUFDN0VYLHdCQUFBQSxtQkFBaUIsR0FBR00sYUFBVyxDQUFDSSxhQUFoQztBQUNBO0FBQ0Q7O0FBL0NDO0FBQUEsMEJBaURFbEIsaUJBQWlCLEtBQUs3QixnQkFBZ0IsQ0FBQ2dFLEtBakR6QztBQWtERDtBQUNBO0FBbkRDLCtDQW9ESyxRQUFLNk8sdUJBQUwsQ0FBNkJKLHNCQUE3QixDQXBETDtBQXFERDtBQUNBO0FBQ0E7QUF2REM7QUFBQSxnQ0F3REcsQ0FBQzVNLGFBQWEsQ0FBQ2lOLGlCQXhEbEI7QUFBQSxxREF5RE0sUUFBSzFRLGlCQUFMLENBQXVCQyxtQkFBdkIsRUFBMEMsS0FBMUMsRUFBaUQsSUFBakQsRUFBdURyQixnQkFBdkQsRUFBeUUsSUFBekUsQ0F6RE47QUFBQTtBQTJEQSxxQ0FBT3lSLHNCQUFQO0FBM0RBO0FBQUE7QUFBQTtBQUFBO0FBOEREO0FBOURDLCtDQStESyxRQUFLclEsaUJBQUwsQ0FBdUJDLG1CQUF2QixFQUEwQyxLQUExQyxFQUFpRCxLQUFqRCxFQUF3RHJCLGdCQUF4RCxFQUEwRSxJQUExRSxDQS9ETDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFSCxnQkFBTWEsaUJBQWlCLEdBQUcsUUFBS0Msb0JBQUwsQ0FBMEJmLFFBQTFCLENBQTFCOztBQUZHO0FBQUEsa0JBR0MsQ0FBQ2MsaUJBQWlCLEtBQUs3QixnQkFBZ0IsQ0FBQ3NDLE1BQXZDLElBQWlEdkIsUUFBUSxDQUFDMEksV0FBVCxDQUFxQixpQkFBckIsQ0FBbEQsS0FBOEYsUUFBS2pILGFBQUwsRUFIL0Y7QUFJRixvQkFBTXJCLG9CQUFtQixHQUFHLFFBQUtDLHNCQUFMLEVBQTVCLENBSkUsQ0FNRjs7O0FBTkUsdUNBT2tCLFFBQUtzQiwwQkFBTCxDQUNuQjNCLFFBRG1CLEVBRW5CSSxvQkFBbUIsQ0FBQ3NCLG1CQUFwQixFQUZtQixFQUduQlosaUJBSG1CLEVBSW5CLElBSm1CLENBUGxCO0FBT0ZjLGtCQUFBQSxhQUFXLHdCQUFYO0FBUEU7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFrRUgsU0EzRXNILFlBMkU5R00sTUEzRThHLEVBMkV0RztBQUNoQkMsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUscUNBQVYsRUFBaURGLE1BQWpEO0FBQ0EsU0E3RXNIO0FBOEV2SCxPOzs7TUFFRDtBQUNBOztBQUVBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHQzhQLGMsR0FGQSx3QkFFZWhTLFFBRmYsRUFFa0M4RSxhQUZsQyxFQUV3RztBQUFBOztBQUN2RyxVQUFNYyxhQUFhLEdBQUdDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLbkYsT0FBTCxFQUE1QixDQUF0QjtBQUNBLFVBQUk0QixXQUFnQixHQUFHdUMsYUFBdkI7O0FBQ0EsVUFBSSxDQUFDdkMsV0FBTCxFQUFrQjtBQUNqQkEsUUFBQUEsV0FBVyxHQUFHO0FBQ2IwUCxVQUFBQSxtQkFBbUIsRUFBRTtBQURSLFNBQWQ7QUFHQSxPQUpELE1BSU87QUFDTjFQLFFBQUFBLFdBQVcsQ0FBQzBQLG1CQUFaLEdBQWtDLEtBQWxDO0FBQ0E7O0FBQ0QxUCxNQUFBQSxXQUFXLENBQUNDLG9CQUFaLEdBQW1DLEtBQUtqQyxJQUFMLENBQVVDLFFBQVYsQ0FBbUJpQyxjQUF0RDtBQUNBLGFBQU8sS0FBS3lQLDBCQUFMLENBQWdDbFMsUUFBaEMsRUFBMEN1QyxXQUExQyxFQUNMM0QsSUFESyxDQUNBLFlBQU07QUFDWDtBQUNBO0FBQ0EsWUFBSSxDQUFDLE9BQUksQ0FBQzZDLGFBQUwsRUFBTCxFQUEyQjtBQUMxQjRCLFVBQUFBLFNBQVMsQ0FBQ0MsaUJBQVY7QUFDQTs7QUFDRCxRQUFBLE9BQUksQ0FBQzBMLGFBQUwsQ0FBbUJDLFFBQVEsQ0FBQ2tELE1BQTVCLEVBQW9DblMsUUFBcEMsRUFOVyxDQVFYOzs7QUFDQSxZQUFJNEYsYUFBSixFQUFtQjtBQUNsQkEsVUFBQUEsYUFBYSxDQUFDd00sZ0JBQWQsR0FBaUNDLGlCQUFqQztBQUNBOztBQUVELFlBQUksQ0FBQXpNLGFBQWEsU0FBYixJQUFBQSxhQUFhLFdBQWIsWUFBQUEsYUFBYSxDQUFFME0sY0FBZixRQUFvQ2pULFdBQVcsQ0FBQ2tULFFBQWhELElBQTRELENBQUMsT0FBSSxDQUFDOVEsYUFBTCxFQUFqRSxFQUF1RjtBQUN0RjtBQUNBO0FBQ0FtRSxVQUFBQSxhQUFhLENBQUNHLGNBQWQsR0FBK0J5TSxXQUEvQjtBQUNBLFNBSkQsTUFJTztBQUNOLFVBQUEsT0FBSSxDQUFDakcsbUJBQUwsR0FBMkJzRix1QkFBM0IsQ0FBbUQ3UixRQUFuRDtBQUNBO0FBQ0QsT0FyQkssRUFzQkxxSSxLQXRCSyxDQXNCQyxVQUFVbkcsTUFBVixFQUF1QjtBQUM3QkMsUUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsbUNBQVYsRUFBK0NGLE1BQS9DO0FBQ0EsT0F4QkssQ0FBUDtBQXlCQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FHT3VRLGEsMEJBQWN6UyxRO1VBQWlDO0FBQUEsc0JBQ2hDLElBRGdDOztBQUNwRCxZQUFNK0UsV0FBVyxHQUFHLFFBQUtDLGlCQUFMLEVBQXBCOztBQUNBNEYsUUFBQUEsVUFBVSxDQUFDQyxJQUFYLENBQWdCOUYsV0FBaEI7O0FBRm9ELG1EQUloRDtBQUFBLGlDQUNHLFFBQUs1QixTQUFMLEVBREg7QUFBQSxtQ0FFRyxRQUFLMk0sa0JBQUwsQ0FBd0I5UCxRQUF4QixDQUZIO0FBQUEscUNBR0csUUFBSzZNLHlCQUFMLEVBSEg7QUFBQSx1Q0FJRyxRQUFLak0sa0JBQUwsR0FBMEJRLGlCQUExQixFQUpIO0FBQUEseUNBS0csUUFBS21MLG1CQUFMLEdBQTJCc0YsdUJBQTNCLENBQW1EN1IsUUFBbkQsQ0FMSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUgsU0FWbUQ7QUFXbkQsY0FBSTRLLFVBQVUsQ0FBQzhELFFBQVgsQ0FBb0IzSixXQUFwQixDQUFKLEVBQXNDO0FBQ3JDNkYsWUFBQUEsVUFBVSxDQUFDK0QsTUFBWCxDQUFrQjVKLFdBQWxCO0FBQ0E7O0FBYmtEO0FBQUE7QUFBQTs7QUFBQTtBQWVwRCxPOzs7TUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUdPMk4sWSx5QkFDTEMsVyxFQUNBN04sYSxFQU9BOE4sWTtVQUNnQjtBQUFBLHNCQUVVLElBRlY7O0FBQ2hCLFlBQUlDLFFBQUo7O0FBQ0EsWUFBTTNTLGlCQUFpQixHQUFHLFFBQUtDLHFCQUFMLEVBQTFCOztBQUNBLFlBQUkyUyxlQUFKO0FBQ0EsWUFBSXJQLGVBQUo7QUFDQSxZQUFJc1AsTUFBSjtBQUNBLFlBQUlDLG1CQUFKO0FBQ0EsWUFBSUMsdUJBQUo7O0FBQ0EsWUFBTUMsS0FBSyxHQUFHLFFBQUt2UyxPQUFMLEVBQWQ7O0FBRUEsWUFBSTRCLFdBQWdCLEdBQUd1QyxhQUFhLElBQUksRUFBeEMsQ0FWZ0IsQ0FZaEI7QUFDQTtBQUNBOztBQUNBLFlBQ0V2QyxXQUFXLENBQUM2RSxHQUFaLElBQW1CN0UsV0FBVyxDQUFDNkUsR0FBWixDQUFnQiwrQkFBaEIsQ0FBcEIsSUFDQStMLEtBQUssQ0FBQ0MsT0FBTixDQUFjN1EsV0FBZCxDQURBLElBRUFxUSxZQUFZLEtBQUtwTSxTQUhsQixFQUlFO0FBQ0QsY0FBTTZNLFFBQVEsR0FBRzlRLFdBQWpCO0FBQ0FBLFVBQUFBLFdBQVcsR0FBR3FRLFlBQVksSUFBSSxFQUE5Qjs7QUFDQSxjQUFJUyxRQUFKLEVBQWM7QUFDYjlRLFlBQUFBLFdBQVcsQ0FBQzhRLFFBQVosR0FBdUJBLFFBQXZCO0FBQ0EsV0FGRCxNQUVPO0FBQ045USxZQUFBQSxXQUFXLENBQUMrUSxLQUFaLEdBQW9CLFFBQUszUyxPQUFMLEdBQWVNLFFBQWYsRUFBcEI7QUFDQTtBQUNEOztBQUVEc0IsUUFBQUEsV0FBVyxDQUFDZ1IsV0FBWixHQUEwQmhSLFdBQVcsQ0FBQ2lSLGtCQUFaLElBQWtDalIsV0FBVyxDQUFDZ1IsV0FBeEU7O0FBRUEsWUFBSSxDQUFDaFIsV0FBVyxDQUFDMEssYUFBakIsRUFBZ0M7QUFDL0IxSyxVQUFBQSxXQUFXLENBQUMwSyxhQUFaLEdBQTRCLFFBQUt0TSxPQUFMLEVBQTVCO0FBQ0E7O0FBRUQsWUFBSTRCLFdBQVcsQ0FBQ2tSLFNBQWhCLEVBQTJCO0FBQzFCWixVQUFBQSxRQUFRLEdBQUcsUUFBS2xTLE9BQUwsR0FBZXdHLElBQWYsQ0FBb0I1RSxXQUFXLENBQUNrUixTQUFoQyxDQUFYOztBQUNBLGNBQUlaLFFBQUosRUFBYztBQUNiO0FBQ0F0USxZQUFBQSxXQUFXLENBQUNtUixvQkFBWixHQUFtQ2IsUUFBUSxDQUFDOVAsaUJBQVQsQ0FBMkIsVUFBM0IsQ0FBbkM7QUFDQTtBQUNELFNBTkQsTUFNTztBQUNOUixVQUFBQSxXQUFXLENBQUNtUixvQkFBWixHQUFtQ1IsS0FBSyxDQUFDblEsaUJBQU4sQ0FBd0IsVUFBeEIsQ0FBbkM7QUFDQTs7QUFFRCxZQUFJNFAsV0FBVyxJQUFJQSxXQUFXLENBQUNnQixPQUFaLENBQW9CLEdBQXBCLElBQTJCLENBQUMsQ0FBL0MsRUFBa0Q7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQVosVUFBQUEsTUFBTSxHQUFHSixXQUFXLENBQUNpQixLQUFaLENBQWtCLEdBQWxCLENBQVQ7QUFDQWpCLFVBQUFBLFdBQVcsR0FBR0ksTUFBTSxDQUFDLENBQUQsQ0FBcEI7QUFDQUMsVUFBQUEsbUJBQW1CLEdBQUlELE1BQU0sQ0FBQ0EsTUFBTSxDQUFDN08sTUFBUCxHQUFnQixDQUFqQixDQUFQLENBQW1DMlAsVUFBbkMsQ0FBOEMsR0FBOUMsRUFBbUQsRUFBbkQsQ0FBdEI7QUFDQTs7QUFFRCxZQUFJdFIsV0FBVyxDQUFDdVIsYUFBaEIsRUFBK0I7QUFDOUIsY0FBSWpCLFFBQVEsQ0FBQ2tCLFlBQVQsRUFBSixFQUE2QjtBQUM1QnhSLFlBQUFBLFdBQVcsQ0FBQzhRLFFBQVosR0FBdUJSLFFBQVEsQ0FBQ3JMLGFBQVQsR0FBeUJtRSxnQkFBekIsRUFBdkI7QUFDQSxXQUZELE1BRU87QUFDTixnQkFBTXFJLFlBQVksR0FBR25CLFFBQVEsQ0FBQ2hNLElBQVQsQ0FBYyxpQkFBZCxFQUFpQ29OLElBQXREO0FBQUEsZ0JBQ0NwTSxZQUFZLEdBQUcsSUFBS2lELGdCQUFMLENBQThCLFFBQUtuSyxPQUFMLEdBQWVNLFFBQWYsRUFBOUIsRUFBeUQrUyxZQUF6RCxDQURoQjtBQUVBelIsWUFBQUEsV0FBVyxDQUFDOFEsUUFBWixHQUF1QnhMLFlBQVksQ0FBQzhELGdCQUFiLEVBQXZCO0FBQ0E7O0FBRUQsY0FBSXFILG1CQUFKLEVBQXlCO0FBQ3hCLGdCQUFNa0IsdUJBQXVCLEdBQUczUixXQUFXLENBQUM4USxRQUFaLENBQzlCcFMsUUFEOEIsR0FFOUIwQyxZQUY4QixHQUc5QkUsY0FIOEIsQ0FHZnRCLFdBQVcsQ0FBQzhRLFFBQVosQ0FBcUJwUixPQUFyQixFQUhlLEVBSTlCNkIsU0FKOEIsQ0FJcEIsT0FKb0IsQ0FBaEM7O0FBS0EsZ0JBQUlrUCxtQkFBbUIsS0FBS2tCLHVCQUE1QixFQUFxRDtBQUNwRDtBQUNBcEIsY0FBQUEsZUFBZSxHQUFHRCxRQUFsQjs7QUFDQSxxQkFBT0MsZUFBUCxFQUF3QjtBQUN2QnJQLGdCQUFBQSxlQUFlLEdBQUdxUCxlQUFlLENBQUMvUCxpQkFBaEIsRUFBbEI7O0FBQ0Esb0JBQ0NVLGVBQWUsSUFDZkEsZUFBZSxDQUFDeEMsUUFBaEIsR0FBMkIwQyxZQUEzQixHQUEwQ0UsY0FBMUMsQ0FBeURKLGVBQWUsQ0FBQ3hCLE9BQWhCLEVBQXpELEVBQW9GNkIsU0FBcEYsQ0FBOEYsT0FBOUYsTUFDQ2tQLG1CQUhGLEVBSUU7QUFDRHpRLGtCQUFBQSxXQUFXLENBQUM4USxRQUFaLEdBQXVCNVAsZUFBdkI7QUFDQTtBQUNBLGlCQVBELE1BT087QUFDTjtBQUNBcVAsa0JBQUFBLGVBQWUsR0FBR0EsZUFBZSxDQUFDbk0sU0FBaEIsRUFBbEI7QUFDQTtBQUNELGVBaEJtRCxDQWlCcEQ7OztBQUNBLGtCQUFJLENBQUNtTSxlQUFMLEVBQXNCO0FBQ3JCLG9CQUFNcUIsc0JBQXNCLEdBQUcsUUFBS0Msd0NBQUwsQ0FBOEN2QixRQUE5QyxFQUF3REcsbUJBQXhELENBQS9COztBQUNBLG9CQUFJbUIsc0JBQXNCLEtBQUszTixTQUEvQixFQUEwQztBQUN6Q2pFLGtCQUFBQSxXQUFXLENBQUM4USxRQUFaLEdBQXVCYyxzQkFBdkI7QUFDQTtBQUNEOztBQUVELGtCQUFJLENBQUM1UixXQUFXLENBQUM4USxRQUFqQixFQUEyQjtBQUMxQixzQkFBTSxJQUFJakosS0FBSiw2Q0FBK0M0SSxtQkFBL0MsRUFBTjtBQUNBO0FBQ0Q7QUFDRDs7QUFFRCxjQUFJelEsV0FBVyxDQUFDOFIsZ0JBQWhCLEVBQWtDO0FBQ2pDcEIsWUFBQUEsdUJBQXVCLEdBQUcsUUFBS3FCLG9CQUFMLENBQTBCM0IsV0FBMUIsRUFBdUNFLFFBQVEsQ0FBQzBCLEdBQWhELENBQTFCO0FBQ0E7QUFDRDs7QUFDRGhTLFFBQUFBLFdBQVcsQ0FBQ2lTLGdCQUFaLEdBQStCLFFBQUtDLGdCQUFMLENBQXNCdkIsS0FBdEIsRUFBNkIzUSxXQUE3QixDQUEvQixDQXpHZ0IsQ0EwR2hCOztBQUNBQSxRQUFBQSxXQUFXLENBQUNtUyxXQUFaLEdBQTJCeEIsS0FBSyxDQUFDeUIsV0FBTixFQUFELENBQTZCQyxhQUE3QixLQUErQyxZQUF6RTtBQTNHZ0Isa0RBNkdaO0FBQUEsaUNBQ0csUUFBS3pSLFNBQUwsRUFESDtBQUFBLG1DQUVxQmpELGlCQUFpQixDQUFDMlUsVUFBbEIsQ0FBNkIvVixJQUE3QixDQUN2Qm9CLGlCQUR1QixFQUV2QnlTLFdBRnVCLEVBR3ZCcFEsV0FIdUIsRUFJdkIsUUFBSzVCLE9BQUwsRUFKdUIsRUFLdkIsUUFBS0Msa0JBQUwsRUFMdUIsR0FGckIsaUJBRUdrVSxTQUZIO0FBQUE7QUFZSCx3QkFBSzlGLGFBQUwsQ0FBbUJDLFFBQVEsQ0FBQzhGLE1BQTVCLEVBQW9DeFMsV0FBVyxDQUFDOFEsUUFBaEQ7O0FBQ0Esd0JBQUtsRCx3QkFBTCxDQUE4QndDLFdBQTlCLEVBQTJDckMsV0FBVyxDQUFDMEUsTUFBdkQ7O0FBRUEsb0JBQUkvQix1QkFBSixFQUE2QjtBQUM1QkEsa0JBQUFBLHVCQUF1QixDQUFDZ0MsU0FBeEIsQ0FBa0NILFNBQWxDO0FBQ0E7QUFDRDtBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNHLG9CQUFJdlMsV0FBVyxDQUFDOFEsUUFBaEIsRUFBMEI7QUFDekIsc0JBQUksQ0FBQyxRQUFLNVIsYUFBTCxFQUFMLEVBQTJCO0FBQzFCNEIsb0JBQUFBLFNBQVMsQ0FBQ0MsaUJBQVY7QUFDQTs7QUFDRCwwQkFBSzRSLGlCQUFMLEdBQXlCak8sV0FBekIsQ0FBcUMsZ0JBQXJDLEVBQXVEMEwsV0FBdkQ7QUFDQTs7QUFuQ0Usb0JBb0NDcFEsV0FBVyxDQUFDZ1IsV0FwQ2I7QUFxQ0Ysc0JBQUk0QixRQUFRLEdBQUdMLFNBQWY7O0FBQ0Esc0JBQUkzQixLQUFLLENBQUNDLE9BQU4sQ0FBYytCLFFBQWQsS0FBMkJBLFFBQVEsQ0FBQ2pSLE1BQVQsS0FBb0IsQ0FBbkQsRUFBc0Q7QUFDckRpUixvQkFBQUEsUUFBUSxHQUFHQSxRQUFRLENBQUMsQ0FBRCxDQUFuQjtBQUNBOztBQXhDQyxzQkF5Q0VBLFFBQVEsSUFBSSxDQUFDaEMsS0FBSyxDQUFDQyxPQUFOLENBQWMrQixRQUFkLENBekNmO0FBMENELHdCQUFNelIsVUFBVSxHQUFHd1AsS0FBSyxDQUFDalMsUUFBTixHQUFpQjBDLFlBQWpCLEVBQW5CO0FBQ0Esd0JBQU15UixnQkFBZ0IsR0FBRzFSLFVBQVUsQ0FBQ2dJLFdBQVgsQ0FBdUJ5SixRQUFRLENBQUNsVCxPQUFULEVBQXZCLENBQXpCO0FBQ0Esd0JBQU1vVCxjQUFjLEdBQUdsQyxLQUFLLENBQUNDLE9BQU4sQ0FBYzdRLFdBQVcsQ0FBQzhRLFFBQTFCLElBQXNDOVEsV0FBVyxDQUFDOFEsUUFBWixDQUFxQixDQUFyQixDQUF0QyxHQUFnRTlRLFdBQVcsQ0FBQzhRLFFBQW5HO0FBQ0Esd0JBQU1pQyxzQkFBc0IsR0FBR0QsY0FBYyxJQUFJM1IsVUFBVSxDQUFDZ0ksV0FBWCxDQUF1QjJKLGNBQWMsQ0FBQ3BULE9BQWYsRUFBdkIsQ0FBakQ7O0FBN0NDLHdCQThDR21ULGdCQUFnQixJQUFJNU8sU0FBcEIsSUFBaUM0TyxnQkFBZ0IsS0FBS0Usc0JBOUN6RDtBQUFBLDBCQStDSUQsY0FBYyxDQUFDcFQsT0FBZixPQUE2QmtULFFBQVEsQ0FBQ2xULE9BQVQsRUEvQ2pDO0FBZ0RDLGdDQUFLc0ssbUJBQUwsR0FBMkJjLHdCQUEzQixDQUFvRDhILFFBQXBELEVBQThEO0FBQzdESSwwQkFBQUEsY0FBYyxFQUFFO0FBRDZDLHlCQUE5RDtBQWhERDtBQW9EQ3BULHdCQUFBQSxHQUFHLENBQUNxVCxJQUFKLENBQVMsK0NBQVQ7QUFwREQ7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLG9CQVNDalQsV0FBVyxDQUFDOFEsUUFUYjtBQUFBLHlDQVVJLFFBQUtvQyxzQkFBTCxDQUE0QixRQUFLQyw2QkFBTCxDQUFtQy9DLFdBQW5DLEVBQWdEbUMsU0FBaEQsQ0FBNUIsRUFBd0Z2UyxXQUFXLENBQUM4USxRQUFaLENBQXFCLENBQXJCLENBQXhGLENBVko7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQXlESCxTQXRLZSxZQXNLUHNDLEdBdEtPLEVBc0tHO0FBQ2xCLGNBQUkxQyx1QkFBSixFQUE2QjtBQUM1QkEsWUFBQUEsdUJBQXVCLENBQUMyQyxTQUF4QjtBQUNBLFdBSGlCLENBSWxCOzs7QUFKa0IsY0FLZEQsR0FBRyxLQUFLelcsU0FBUyxDQUFDa1Esa0JBTEo7QUFNakIsa0JBQU0sSUFBSWhGLEtBQUosQ0FBVSxrQkFBVixDQUFOO0FBTmlCLGlCQU9YLElBQUksRUFBRXVMLEdBQUcsS0FBS0EsR0FBRyxDQUFDdEcsUUFBSixJQUFpQnNHLEdBQUcsQ0FBQ3JHLGFBQUosSUFBcUJxRyxHQUFHLENBQUNyRyxhQUFKLENBQWtCLENBQWxCLEVBQXFCRCxRQUFoRSxDQUFMLENBQUosRUFBc0Y7QUFDNUYsa0JBQU0sSUFBSWpGLEtBQUosMENBQTRDdUwsR0FBNUMsRUFBTjtBQUNBO0FBQ0QsU0FoTGU7QUFpTGhCLE87Ozs7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBR0NFLGdCLEdBRkEsMEJBR0NDLFVBSEQsRUFJQ3ZULFdBSkQsRUFXaUI7QUFBQTs7QUFDaEIsVUFBTXdULFFBQVEsR0FBR3hULFdBQVcsSUFBSUEsV0FBVyxDQUFDeVQsSUFBM0IsSUFBbUN6VCxXQUFXLENBQUN5VCxJQUFaLENBQWlCQyxHQUFqQixLQUF5QnpQLFNBQTVELEdBQXdFakUsV0FBVyxDQUFDeVQsSUFBWixDQUFpQkMsR0FBekYsR0FBK0YsSUFBaEg7QUFBQSxVQUNDQyxVQUFVLEdBQUczVCxXQUFXLElBQUlBLFdBQVcsQ0FBQ3lULElBQTNCLElBQW1DelQsV0FBVyxDQUFDeVQsSUFBWixDQUFpQkcsS0FBakIsS0FBMkIzUCxTQUE5RCxHQUEwRWpFLFdBQVcsQ0FBQ3lULElBQVosQ0FBaUJHLEtBQTNGLEdBQW1HLElBRGpIO0FBQUEsVUFFQ0MsZ0JBQWdCLEdBQUk3VCxXQUFXLElBQUtBLFdBQUQsQ0FBcUI4VCxlQUFyQyxJQUF5RCxLQUY3RTtBQUFBLFVBR0N0UixXQUFXLEdBQUcsS0FBS0MsaUJBQUwsRUFIZjtBQUFBLFVBSUNoRixRQUFRLEdBQUcsS0FBS08sSUFBTCxDQUFVSSxPQUFWLEdBQW9Cb0MsaUJBQXBCLEVBSlo7QUFBQSxVQUtDQyxRQUFRLEdBQUdoRCxRQUFRLElBQUksS0FBS2Usb0JBQUwsQ0FBMEJmLFFBQTFCLE1BQXdDZixnQkFBZ0IsQ0FBQ2dFLEtBTGpGOztBQU9BLFVBQUlpVCxVQUFVLElBQUl0TCxVQUFVLENBQUM4RCxRQUFYLENBQW9CM0osV0FBcEIsQ0FBbEIsRUFBb0Q7QUFDbkQsZUFBT1csT0FBTyxDQUFDa0osTUFBUixDQUFlLHVEQUFmLENBQVA7QUFDQSxPQVZlLENBWWhCOzs7QUFDQSxVQUFJbUgsUUFBSixFQUFjO0FBQ2JuTCxRQUFBQSxVQUFVLENBQUNDLElBQVgsQ0FBZ0I5RixXQUFoQjtBQUNBOztBQUNELFVBQUlxUixnQkFBZ0IsSUFBSXBULFFBQXhCLEVBQWtDO0FBQ2pDLGFBQUtPLGVBQUwsQ0FBcUJwRSxXQUFXLENBQUNxRSxNQUFqQztBQUNBOztBQUVELFdBQUs1QyxrQkFBTCxHQUEwQnNDLHdCQUExQjs7QUFFQSxhQUFPLEtBQUtDLFNBQUwsQ0FBZTJTLFVBQWYsRUFDTGxYLElBREssQ0FDQSxZQUFNO0FBQ1gsWUFBSXdYLGdCQUFKLEVBQXNCO0FBQ3JCLFVBQUEsT0FBSSxDQUFDalcscUJBQUwsR0FBNkJpRCwyQkFBN0I7O0FBQ0EsY0FBSSxDQUFDLE9BQUksQ0FBQzNCLGFBQUwsRUFBTCxFQUEyQjtBQUMxQjRCLFlBQUFBLFNBQVMsQ0FBQ0MsaUJBQVY7QUFDQTs7QUFDRCxjQUFJTixRQUFKLEVBQWM7QUFDYixZQUFBLE9BQUksQ0FBQ08sZUFBTCxDQUFxQnBFLFdBQVcsQ0FBQ3NGLEtBQWpDO0FBQ0E7QUFDRDtBQUNELE9BWEssRUFZTDRELEtBWkssQ0FZQyxVQUFDbkcsTUFBRCxFQUFpQjtBQUN2QixZQUFJa1UsZ0JBQWdCLElBQUlwVCxRQUF4QixFQUFrQztBQUNqQyxVQUFBLE9BQUksQ0FBQ08sZUFBTCxDQUFxQnBFLFdBQVcsQ0FBQ3VGLEtBQWpDO0FBQ0E7O0FBQ0QsZUFBT2dCLE9BQU8sQ0FBQ2tKLE1BQVIsQ0FBZTFNLE1BQWYsQ0FBUDtBQUNBLE9BakJLLEVBa0JMcU4sT0FsQkssQ0FrQkcsWUFBTTtBQUNkLFlBQUl3RyxRQUFKLEVBQWM7QUFDYm5MLFVBQUFBLFVBQVUsQ0FBQytELE1BQVgsQ0FBa0I1SixXQUFsQjtBQUNBOztBQUNELFFBQUEsT0FBSSxDQUFDbkUsa0JBQUwsR0FBMEJRLGlCQUExQjtBQUNBLE9BdkJLLENBQVA7QUF3QkE7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FFQ2tWLGUsR0FEQSx5QkFDZ0JDLE1BRGhCLEVBQzZCO0FBQUE7O0FBQzVCLFVBQUksd0JBQUUsS0FBS2hXLElBQUwsQ0FBVUksT0FBVixFQUFGLHdFQUFFLG1CQUFxQm9DLGlCQUFyQixDQUF1QyxVQUF2QyxDQUFGLGtEQUFDLHNCQUE4RTJGLFdBQTlFLENBQTBGLG1CQUExRixDQUFELENBQUosRUFBcUg7QUFDcEg7QUFDQSxZQUFNOE4sYUFBYSxHQUFHLElBQUk5USxPQUFKLENBQWtCLFVBQUNDLE9BQUQsRUFBVWlKLE1BQVYsRUFBcUI7QUFDNUQySCxVQUFBQSxNQUFNLENBQUNFLFNBQVAsR0FBbUJoUCxlQUFuQixDQUFtQyxnQkFBbkMsRUFBcUQsVUFBQ2lQLG1CQUFELEVBQThCO0FBQ2xGLGdCQUFNQyxRQUFRLEdBQUdELG1CQUFtQixDQUFDRSxZQUFwQixDQUFpQyxTQUFqQyxDQUFqQjs7QUFDQSxnQkFBSUQsUUFBSixFQUFjO0FBQ2JoUixjQUFBQSxPQUFPO0FBQ1AsYUFGRCxNQUVPO0FBQ05pSixjQUFBQSxNQUFNO0FBQ047QUFDRCxXQVBEO0FBUUEsU0FUcUIsQ0FBdEI7QUFVQSxhQUFLaE0sY0FBTCxDQUFvQjJULE1BQU0sQ0FBQ0UsU0FBUCxFQUFwQixFQUF3Q0QsYUFBeEM7QUFDQTtBQUNEO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NLLG9CLEdBQUEsOEJBQXFCTixNQUFyQixFQUFrQztBQUNqQyxVQUFNTyxRQUFRLEdBQUdQLE1BQU0sQ0FBQ0UsU0FBUCxFQUFqQjs7QUFDQSxVQUFNdlcsaUJBQWlCLEdBQUcsS0FBS0MscUJBQUwsRUFBMUI7O0FBQ0EsVUFBTTRXLE1BQU0sR0FBRyxJQUFmO0FBQ0EsVUFBTUMsU0FBUyxHQUFHLElBQWxCOztBQUNBLFVBQU05UixlQUFlLEdBQUcsS0FBS0Msa0JBQUwsRUFBeEI7O0FBQ0EsVUFBTThSLE9BQVksR0FBRztBQUNwQjVSLFFBQUFBLFlBQVksRUFBRXRHLFlBQVksQ0FBQ3VHLE1BRFA7QUFFcEJvQyxRQUFBQSxXQUFXLEVBQUVxUCxNQUZPO0FBR3BCRyxRQUFBQSxRQUFRLEVBQUVGLFNBSFU7QUFJcEJsSyxRQUFBQSw0QkFBNEIsRUFBRSxLQUpWO0FBSWlCO0FBQ3JDQyxRQUFBQSxRQUFRLEVBQUU7QUFMVSxPQUFyQjtBQU9BN00sTUFBQUEsaUJBQWlCLENBQUMwRSxjQUFsQixDQUFpQ2tTLFFBQWpDLEVBQTJDRyxPQUEzQyxFQUFvRC9SLGVBQXBELEVBQXFFLEtBQUt0RSxrQkFBTCxFQUFyRSxFQUFnRyxLQUFoRyxFQUF1RyxLQUFLRCxPQUFMLEVBQXZHO0FBQ0EsSyxDQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7V0FHQ08sWSxHQUFBLHNCQUFhaVcsU0FBYixFQUE2QkMsYUFBN0IsRUFBc0Q7QUFDcEQsV0FBSzdXLElBQUwsQ0FBVUksT0FBVixHQUFvQitCLGFBQXBCLEVBQUQsQ0FBd0RDLFNBQXhELENBQWtFMFUsV0FBbEUsQ0FBOEVGLFNBQTlFLEVBQXlGQyxhQUF6RjtBQUNBLEs7O1dBRUQ3VCxlLEdBQUEseUJBQWdCK1QsV0FBaEIsRUFBa0M7QUFDaEMsV0FBSy9XLElBQUwsQ0FBVUksT0FBVixHQUFvQitCLGFBQXBCLEVBQUQsQ0FBd0RDLFNBQXhELENBQWtFNFUsY0FBbEUsQ0FBaUZELFdBQWpGO0FBQ0EsSzs7V0FFRC9LLG1CLEdBQUEsK0JBQXNCO0FBQ3JCLGFBQVEsS0FBS2hNLElBQUwsQ0FBVUksT0FBVixHQUFvQitCLGFBQXBCLEVBQUQsQ0FBd0RDLFNBQXhELENBQWtFNlUsa0JBQWxFLEVBQVA7QUFDQSxLOztXQUVEeFMsaUIsR0FBQSw2QkFBb0I7QUFDbkIsYUFBUSxLQUFLekUsSUFBTCxDQUFVSSxPQUFWLEdBQW9CK0IsYUFBcEIsRUFBRCxDQUF3REMsU0FBeEQsQ0FBa0U4VSxnQkFBbEUsRUFBUDtBQUNBLEs7O1dBQ0R0VSxTLEdBQUEsbUJBQVV1VSxLQUFWLEVBQXVCO0FBQ3RCLGFBQVEsS0FBS25YLElBQUwsQ0FBVUksT0FBVixHQUFvQitCLGFBQXBCLEVBQUQsQ0FBd0RDLFNBQXhELENBQWtFZ1YsUUFBbEUsQ0FBMkVELEtBQTNFLENBQVA7QUFDQSxLOztXQUVEM1csb0IsR0FBQSw4QkFBcUJmLFFBQXJCLEVBQW9DO0FBQ25DLGFBQVEsS0FBS08sSUFBTCxDQUFVSSxPQUFWLEdBQW9CK0IsYUFBcEIsRUFBRCxDQUF3REMsU0FBeEQsQ0FBa0VpVixtQkFBbEUsQ0FBc0Y1WCxRQUF0RixDQUFQO0FBQ0EsSzs7V0FFRGtTLDBCLEdBQUEsb0NBQTJCbFMsUUFBM0IsRUFBMEN1QyxXQUExQyxFQUE0RDtBQUMzRCxhQUFRLEtBQUtoQyxJQUFMLENBQVVJLE9BQVYsR0FBb0IrQixhQUFwQixFQUFELENBQXdEQyxTQUF4RCxDQUFrRWtWLHlCQUFsRSxDQUE0RjdYLFFBQTVGLEVBQXNHdUMsV0FBdEcsQ0FBUDtBQUNBLEs7O1dBRUR5SyxtQixHQUFBLDZCQUFvQjhKLFFBQXBCLEVBQW1DO0FBQ2pDLFdBQUt2VyxJQUFMLENBQVVJLE9BQVYsR0FBb0IrQixhQUFwQixFQUFELENBQXdEQyxTQUF4RCxDQUFrRW1WLGtCQUFsRSxDQUFxRmhCLFFBQXJGO0FBQ0EsSzs7V0FFRDNXLHFCLEdBQUEsaUNBQXdCO0FBQ3ZCLGFBQVEsS0FBS0ksSUFBTCxDQUFVSSxPQUFWLEdBQW9CK0IsYUFBcEIsRUFBRCxDQUF3REMsU0FBeEQsQ0FBa0VvVixvQkFBbEUsRUFBUDtBQUNBLEs7O1dBRUQ3QyxpQixHQUFBLDZCQUFvQjtBQUNuQixhQUFRLEtBQUszVSxJQUFMLENBQVVJLE9BQVYsR0FBb0IrQixhQUFwQixFQUFELENBQXdEQyxTQUF4RCxDQUFrRXFWLGdCQUFsRSxFQUFQO0FBQ0EsSzs7V0FFRDNYLHNCLEdBQUEsa0NBQXlCO0FBQ3hCLGFBQU8sS0FBS0UsSUFBTCxDQUFVdUYsZUFBVixHQUE0Qm1TLHFCQUE1QixFQUFQO0FBQ0EsSzs7V0FFRDlTLGtCLEdBQUEsOEJBQXFCO0FBQ3BCLGFBQVEsS0FBS3hFLE9BQUwsR0FBZStCLGFBQWYsRUFBRCxDQUF3Q3dDLGVBQS9DO0FBQ0EsSzs7V0FFRGQsbUIsR0FBQSwrQkFBbUQ7QUFDbEQsYUFBTyxLQUFLN0QsSUFBTCxDQUFVdUYsZUFBVixHQUE0Qm9TLGlCQUE1QixHQUFnREMsc0JBQWhELEVBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUVDN0Qsb0IsR0FBQSw4QkFBcUIzQixXQUFyQixFQUF1Q3lGLFVBQXZDLEVBQXdEO0FBQ3ZELGFBQVEsS0FBSzdYLElBQUwsQ0FBVUksT0FBVixHQUFvQitCLGFBQXBCLEVBQUQsQ0FBd0RDLFNBQXhELENBQWtFMFYsbUJBQWxFLENBQXNGMUYsV0FBdEYsRUFBbUd5RixVQUFuRyxDQUFQO0FBQ0EsSzs7V0FFREUsd0IsR0FBQSxvQ0FBMkI7QUFDMUIsYUFBUSxLQUFLL1gsSUFBTCxDQUFVSSxPQUFWLEdBQW9CK0IsYUFBcEIsRUFBRCxDQUF3REMsU0FBeEQsQ0FBa0U0Vix1QkFBbEUsRUFBUDtBQUNBLEs7O1dBRURDLDJCLEdBQUEsdUNBQThCO0FBQzdCLGFBQVEsS0FBS2pZLElBQUwsQ0FBVUksT0FBVixHQUFvQitCLGFBQXBCLEVBQUQsQ0FBd0RDLFNBQXhELENBQWtFOFYsMEJBQWxFLEVBQVA7QUFDQSxLOztXQUVEN1gsa0IsR0FBQSw4QkFBcUI7QUFDcEIsYUFBUSxLQUFLTCxJQUFMLENBQVVJLE9BQVYsR0FBb0IrQixhQUFwQixFQUFELENBQXdEQyxTQUF4RCxDQUFrRStWLGlCQUFsRSxFQUFQO0FBQ0EsSzs7V0FFRDFKLGEsR0FBQSx1QkFBY2dHLE1BQWQsRUFBZ0MyRCxlQUFoQyxFQUFrRjtBQUNqRixVQUFNQyxPQUFPLEdBQUd6RixLQUFLLENBQUNDLE9BQU4sQ0FBY3VGLGVBQWQsSUFBaUNBLGVBQWUsQ0FBQ0UsR0FBaEIsQ0FBb0IsVUFBQ25ZLE9BQUQ7QUFBQSxlQUFhQSxPQUFPLENBQUN1QixPQUFSLEVBQWI7QUFBQSxPQUFwQixDQUFqQyxHQUF1RjBXLGVBQXZGLGFBQXVGQSxlQUF2Rix1QkFBdUZBLGVBQWUsQ0FBRTFXLE9BQWpCLEVBQXZHO0FBQ0E2VyxNQUFBQSxJQUFJLENBQUMsS0FBS25ZLE9BQUwsRUFBRCxFQUFpQnFVLE1BQWpCLEVBQXlCNEQsT0FBekIsQ0FBSjtBQUNBLEs7O1dBRUR6SSx3QixHQUFBLGtDQUF5QndDLFdBQXpCLEVBQThDb0csV0FBOUMsRUFBd0U7QUFDdkVDLE1BQUFBLHVCQUF1QixDQUFDLEtBQUtyWSxPQUFMLEVBQUQsRUFBaUJnUyxXQUFqQixFQUE4Qm9HLFdBQTlCLENBQXZCO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3JELDZCLEdBQUEsdUNBQThCL0MsV0FBOUIsRUFBbURtQyxTQUFuRCxFQUFzRTtBQUNyRSxhQUFRLEtBQUt2VSxJQUFMLENBQVVJLE9BQVYsR0FBb0IrQixhQUFwQixFQUFELENBQXdEQyxTQUF4RCxDQUFrRXNXLDRCQUFsRSxDQUErRnRHLFdBQS9GLEVBQTRHbUMsU0FBNUcsQ0FBUDtBQUNBLEs7O1dBRUtoRixrQiwrQkFBbUI5UCxRO1VBQTZCO0FBQUEsc0JBRXRDLElBRnNDOztBQUNyRCxZQUFNZ0wsTUFBTSxHQUFHaEwsUUFBUSxDQUFDaUIsUUFBVCxFQUFmO0FBQUEsWUFDQzhELFdBQVcsR0FBRyxRQUFLQyxpQkFBTCxFQURmOztBQURxRCw0REFJakQ7QUFDSDtBQUNBO0FBRkcsaUNBR0dnRyxNQUFNLENBQUNrTyxXQUFQLENBQW1CLE9BQW5CLENBSEg7QUFLSDtBQUNBO0FBQ0E7QUFQRyxtQ0FRR2xPLE1BQU0sQ0FBQ21PLFVBQVAsQ0FBa0JDLDRCQUFsQixDQUErQyxPQUEvQyxDQVJIO0FBQUEsa0JBV0NwTyxNQUFNLENBQUNxTyxpQkFBUCxDQUF5QixPQUF6QixDQVhEO0FBWUYsc0JBQU0sSUFBSWpQLEtBQUosQ0FBVSwrQkFBVixDQUFOO0FBWkU7QUFBQSxnQkFVSDtBQVZHO0FBY0gsU0FsQm9EO0FBbUJwRCxjQUFJUSxVQUFVLENBQUM4RCxRQUFYLENBQW9CM0osV0FBcEIsQ0FBSixFQUFzQztBQUNyQzZGLFlBQUFBLFVBQVUsQ0FBQytELE1BQVgsQ0FBa0I1SixXQUFsQjtBQUNBOztBQXJCbUQ7QUFBQTtBQUFBO0FBdUJyRCxPOzs7OztXQUVEdkQsZSxHQUFBLHlCQUFnQnhCLFFBQWhCLEVBQW1DO0FBQ2xDLGFBQVEsS0FBS08sSUFBTCxDQUFVSSxPQUFWLEdBQW9CK0IsYUFBcEIsRUFBRCxDQUF3REMsU0FBeEQsQ0FBa0UyVyxjQUFsRSxDQUFpRnRaLFFBQWpGLENBQVA7QUFDQSxLOztXQUVEdVosZ0IsR0FBQSw0QkFBbUI7QUFDbEIsYUFBUSxLQUFLaFosSUFBTCxDQUFVSSxPQUFWLEdBQW9CK0IsYUFBcEIsRUFBRCxDQUF3REMsU0FBeEQsQ0FBa0U2VyxlQUFsRSxFQUFQO0FBQ0EsSzs7V0FFREMsMEIsR0FBQSxzQ0FBNkI7QUFDNUIsYUFBUSxLQUFLbFosSUFBTCxDQUFVSSxPQUFWLEdBQW9CK0IsYUFBcEIsRUFBRCxDQUF3REMsU0FBeEQsQ0FBa0UrVyx5QkFBbEUsRUFBUDtBQUNBLEs7O1dBRURDLHFCLEdBQUEsK0JBQXNCM1osUUFBdEIsRUFBeUM7QUFDeEMsYUFBUSxLQUFLTyxJQUFMLENBQVVJLE9BQVYsR0FBb0IrQixhQUFwQixFQUFELENBQXdEQyxTQUF4RCxDQUFrRWlYLG9CQUFsRSxDQUF1RjVaLFFBQXZGLENBQVA7QUFDQSxLOztXQUVEZ0IsbUMsR0FBQSw2Q0FBb0NrSyxnQkFBcEMsRUFBMkRvSSxLQUEzRCxFQUE4RTtBQUM3RSxVQUFJcEksZ0JBQWdCLEtBQUtqTSxnQkFBZ0IsQ0FBQ3NDLE1BQTFDLEVBQWtEO0FBQ2pELFlBQU1zWSxhQUFhLEdBQUcsS0FBSzNFLGlCQUFMLEVBQXRCOztBQUNBMkUsUUFBQUEsYUFBYSxDQUFDNVMsV0FBZCxDQUEwQixZQUExQixFQUF3QyxJQUF4QztBQUNBNFMsUUFBQUEsYUFBYSxDQUFDNVMsV0FBZCxDQUEwQixxQkFBMUIsRUFBa0RxTSxLQUFLLENBQUN3RyxjQUFOLENBQXFCLElBQXJCLENBQUQsQ0FBb0MsZUFBcEMsQ0FBakQ7QUFDQTtBQUNELEs7O1dBRUQ3SixzQyxHQUFBLGdEQUF1Qy9FLGdCQUF2QyxFQUE4RDtBQUM3RCxVQUFJQSxnQkFBZ0IsS0FBS2pNLGdCQUFnQixDQUFDc0MsTUFBMUMsRUFBa0Q7QUFDakQsWUFBTXNZLGFBQWEsR0FBRyxLQUFLM0UsaUJBQUwsRUFBdEI7O0FBQ0EyRSxRQUFBQSxhQUFhLENBQUM1UyxXQUFkLENBQTBCLFlBQTFCLEVBQXdDLEtBQXhDO0FBQ0E0UyxRQUFBQSxhQUFhLENBQUM1UyxXQUFkLENBQTBCLHFCQUExQixFQUFpRFQsU0FBakQ7O0FBQ0EsYUFBSytTLGdCQUFMO0FBQ0E7QUFDRCxLOztXQUVLbFksaUIsOEJBQ0xyQixRLEVBQ0E0USxTLEVBQ0FtSixnQixFQUNBOVosZ0IsRUFDQXVOLFcsRUFDQXdNLHdCO1VBQ0M7QUFBQSxzQkFDSSxJQURKOztBQUNELFlBQUksQ0FBQyxRQUFLdlksYUFBTCxFQUFMLEVBQTJCO0FBQzFCNEIsVUFBQUEsU0FBUyxDQUFDQyxpQkFBVjtBQUNBOztBQUhBLCtCQUtLLFFBQUtpSixtQkFBTCxHQUEyQjBOLGlCQUEzQixDQUE2Q2phLFFBQTdDLEVBQXVEO0FBQzVEa2EsVUFBQUEsaUJBQWlCLEVBQUUsSUFEeUM7QUFFNUQzTSxVQUFBQSxRQUFRLEVBQUVxRCxTQUZrRDtBQUc1RHVKLFVBQUFBLGdCQUFnQixFQUFFLElBSDBDO0FBSTVESixVQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBSjBDO0FBSzVEOVosVUFBQUEsZ0JBQWdCLEVBQUVBLGdCQUwwQztBQU01RG1hLFVBQUFBLGVBQWUsRUFBRSxLQU4yQztBQU81RDVNLFVBQUFBLFdBQVcsRUFBRUEsV0FQK0M7QUFRNUQ2TSxVQUFBQSxpQkFBaUIsRUFBRSxJQVJ5QztBQVM1REwsVUFBQUEsd0JBQXdCLEVBQUVBO0FBVGtDLFNBQXZELENBTEw7QUFnQkQsTzs7Ozs7V0FFRHZGLGdCLEdBQUEsMEJBQWlCNkYsSUFBakIsRUFBNEJDLE1BQTVCLEVBQXlDO0FBQ3hDLFVBQU1DLFNBQVMsR0FBR0YsSUFBSSxDQUFDM0YsV0FBTCxHQUFtQjZGLFNBQXJDO0FBQ0EsVUFBTUMsbUJBQW1CLEdBQUdELFNBQVMsR0FBRyxDQUFaLElBQWtCQSxTQUFTLEtBQUssQ0FBZCxJQUFtQkQsTUFBTSxDQUFDOUcsU0FBeEU7QUFDQSxhQUFPLENBQUM4RyxNQUFNLENBQUNoSCxXQUFSLElBQXVCLENBQUMsQ0FBQ2tILG1CQUFoQztBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBRUM1Tix5QixHQUFBLHFDQUE0QjtBQUFBOztBQUMzQixhQUFPLEtBQUsxSixTQUFMLEdBQWlCdkUsSUFBakIsQ0FBc0IsWUFBTTtBQUNsQyxZQUFNOGIsT0FBTyxHQUFHLE9BQUksQ0FBQ25hLElBQUwsQ0FBVUksT0FBVixHQUFvQmdhLEtBQXBCLEVBQWhCOztBQUNBLFlBQU1DLFNBQVMsR0FBR0MsR0FBRyxDQUFDQyxFQUFKLENBQU9DLE9BQVAsR0FBaUJsUyxpQkFBakIsR0FBcUNJLGVBQXJDLEdBQXVEQyxPQUF2RCxFQUFsQjtBQUNBLFlBQUkySixRQUFKO0FBQ0EsWUFBSXpKLFFBQUo7O0FBRUEsWUFBSSxDQUFDd1IsU0FBUyxDQUFDMVcsTUFBZixFQUF1QjtBQUN0QixpQkFBT3dCLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQiw0QkFBaEIsQ0FBUDtBQUNBOztBQUVELGFBQUssSUFBSXFWLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdKLFNBQVMsQ0FBQzFXLE1BQTlCLEVBQXNDOFcsQ0FBQyxFQUF2QyxFQUEyQztBQUMxQzVSLFVBQUFBLFFBQVEsR0FBR3dSLFNBQVMsQ0FBQ0ksQ0FBRCxDQUFwQjs7QUFDQSxjQUFJNVIsUUFBUSxDQUFDNlIsVUFBYixFQUF5QjtBQUN4QnBJLFlBQUFBLFFBQVEsR0FBR2pLLElBQUksQ0FBQ3pCLElBQUwsQ0FBVWlDLFFBQVEsQ0FBQzhSLFlBQVQsRUFBVixDQUFYOztBQUNBLG1CQUFPckksUUFBUCxFQUFpQjtBQUNoQixrQkFBSUEsUUFBUSxDQUFDOEgsS0FBVCxPQUFxQkQsT0FBekIsRUFBa0M7QUFDakMsdUJBQU9oVixPQUFPLENBQUNrSixNQUFSLENBQWUseUJBQWYsQ0FBUDtBQUNBOztBQUNEaUUsY0FBQUEsUUFBUSxHQUFHQSxRQUFRLENBQUNsTSxTQUFULEVBQVg7QUFDQTtBQUNEO0FBQ0Q7QUFDRCxPQXRCTSxDQUFQO0FBdUJBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0M4TyxzQixHQUFBLGdDQUF1QlgsU0FBdkIsRUFBdUM5VSxRQUF2QyxFQUEwRDtBQUFBOztBQUN6RCxVQUFJLENBQUNBLFFBQUQsSUFBYSxDQUFDOFUsU0FBZCxJQUEyQixDQUFDQSxTQUFTLENBQUNxRyxLQUExQyxFQUFpRDtBQUNoRCxlQUFPelYsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDQTs7QUFDRCxVQUFNbVIsUUFBUSxHQUFHOVcsUUFBUSxDQUFDbU8sVUFBVCxFQUFqQixDQUp5RCxDQUt6RDs7QUFDQSxVQUFJMkksUUFBUSxJQUFJQSxRQUFRLENBQUMxUCxHQUFULENBQWEsd0NBQWIsQ0FBaEIsRUFBd0U7QUFDdkUsWUFBTXVKLFlBQVksR0FBR21FLFNBQVMsQ0FBQ3FHLEtBQS9CO0FBQ0EsWUFBTUMsS0FBSyxHQUFHdEcsU0FBUyxDQUFDckksSUFBeEI7QUFDQSxZQUFNNE8sWUFBWSxHQUFHcmIsUUFBUSxDQUFDOEQsU0FBVCxFQUFyQjtBQUNBLFlBQUl3WCxzQkFBc0IsR0FBRyxJQUE3QixDQUp1RSxDQUt2RTs7QUFDQSxZQUFJOU8sTUFBTSxDQUFDQyxJQUFQLENBQVlrRSxZQUFaLEVBQTBCek0sTUFBOUIsRUFBc0M7QUFDckM7QUFDQW9YLFVBQUFBLHNCQUFzQixHQUFHRixLQUFLLENBQUNHLEtBQU4sQ0FBWSxVQUFVQyxJQUFWLEVBQXFCO0FBQ3pELG1CQUFPSCxZQUFZLENBQUNHLElBQUQsQ0FBWixLQUF1QjdLLFlBQVksQ0FBQzZLLElBQUQsQ0FBMUM7QUFDQSxXQUZ3QixDQUF6Qjs7QUFHQSxjQUFJLENBQUNGLHNCQUFMLEVBQTZCO0FBQzVCLG1CQUFPLElBQUk1VixPQUFKLENBQWtCLFVBQUNDLE9BQUQsRUFBYTtBQUNyQyxrQkFBS21SLFFBQUQsQ0FBa0IyRSxNQUFsQixFQUFKLEVBQWdDO0FBQy9CM0UsZ0JBQUFBLFFBQVEsQ0FBQ3JQLGVBQVQsQ0FBeUIsY0FBekIsRUFBeUMsWUFBWTtBQUNwRDlCLGtCQUFBQSxPQUFPO0FBQ1AsaUJBRkQ7QUFHQW1SLGdCQUFBQSxRQUFRLENBQUM0RSxPQUFUO0FBQ0EsZUFMRCxNQUtPO0FBQ04sb0JBQU05VixhQUFhLEdBQUdDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixPQUFJLENBQUNuRixPQUFMLEVBQTVCLENBQXRCO0FBQ0FpRixnQkFBQUEsYUFBYSxDQUNYdUMscUJBREYsR0FFRXdULGtCQUZGLENBRXFCLENBQUM7QUFBRUMsa0JBQUFBLHVCQUF1QixFQUFFOUUsUUFBUSxDQUFDN1UsT0FBVDtBQUEzQixpQkFBRCxDQUZyQixFQUV3RTZVLFFBQVEsQ0FBQytFLFVBQVQsRUFGeEUsRUFHRWpkLElBSEYsQ0FJRSxZQUFZO0FBQ1grRyxrQkFBQUEsT0FBTztBQUNQLGlCQU5ILEVBT0UsWUFBWTtBQUNYeEQsa0JBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLGtDQUFWO0FBQ0F1RCxrQkFBQUEsT0FBTztBQUNQLGlCQVZILEVBWUUwQyxLQVpGLENBWVEsVUFBVTFKLENBQVYsRUFBa0I7QUFDeEJ3RCxrQkFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsa0NBQVYsRUFBOEN6RCxDQUE5QztBQUNBLGlCQWRGO0FBZUE7QUFDRCxhQXhCTSxDQUFQO0FBeUJBO0FBQ0Q7QUFDRCxPQTdDd0QsQ0E4Q3pEOzs7QUFDQSxhQUFPK0csT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDQSxLOztXQUVEbU0sdUIsR0FBQSxpQ0FBd0I5UixRQUF4QixFQUF5RDtBQUN4RCxVQUFNMEQsVUFBVSxHQUFHMUQsUUFBUSxDQUFDaUIsUUFBVCxHQUFvQjBDLFlBQXBCLEVBQW5CO0FBQUEsVUFDQ0MsY0FBYyxHQUFHRixVQUFVLENBQUNHLGNBQVgsQ0FBMEI3RCxRQUFRLENBQUNpQyxPQUFULEVBQTFCLEVBQThDNkIsU0FBOUMsQ0FBd0QsYUFBeEQsQ0FEbEI7QUFBQSxVQUVDQyxhQUFhLEdBQUdDLGlCQUFpQixDQUFDQyxlQUFsQixDQUFrQ1AsVUFBbEMsRUFBOENFLGNBQTlDLENBRmpCOztBQUlBLFVBQUlHLGFBQWEsSUFBSUEsYUFBYSxDQUFDRyxNQUFuQyxFQUEyQztBQUMxQyxZQUFNNFgsZ0JBQWdCLEdBQUcvWCxhQUFhLENBQUM4VSxHQUFkLENBQWtCLFVBQVVrRCxJQUFWLEVBQXFCO0FBQy9ELGlCQUFPL2IsUUFBUSxDQUFDZ2MsYUFBVCxDQUF1QkQsSUFBSSxDQUFDRSxhQUE1QixDQUFQO0FBQ0EsU0FGd0IsQ0FBekI7QUFJQSxlQUFPdlcsT0FBTyxDQUFDb0osR0FBUixDQUFZZ04sZ0JBQVosQ0FBUDtBQUNBLE9BTkQsTUFNTztBQUNOLGVBQU9wVyxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBO0FBQ0QsSyxDQUVEO0FBQ0E7QUFDQTs7O1dBQ0FxSyx3QixHQUFBLG9DQUEyQjtBQUMxQixVQUFJa00sTUFBYSxHQUFHLEVBQXBCO0FBQ0EsVUFBTXRXLGFBQWEsR0FBR0MsV0FBVyxDQUFDQyxlQUFaLENBQTRCLEtBQUtuRixPQUFMLEVBQTVCLENBQXRCOztBQUVBLFVBQUksS0FBS2MsYUFBTCxFQUFKLEVBQTBCO0FBQ3pCLFlBQU0wYSxJQUFJLEdBQUd2VyxhQUFhLENBQUN3VyxnQkFBZCxFQUFiO0FBQ0FGLFFBQUFBLE1BQU0sR0FBR0EsTUFBTSxDQUFDRyxNQUFQLENBQWNGLElBQUksQ0FBQ0csaUJBQUwsTUFBNEIsRUFBMUMsQ0FBVDtBQUNBSixRQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0csTUFBUCxDQUFjRixJQUFJLENBQUNJLGlCQUFMLE1BQTRCLEVBQTFDLENBQVQ7QUFDQSxPQUpELE1BSU87QUFDTixZQUFNQyxhQUFhLEdBQUc1VyxhQUFhLENBQUN3VyxnQkFBZCxFQUF0QjtBQUNBRixRQUFBQSxNQUFNLEdBQUdNLGFBQWEsQ0FBQ0MsUUFBZCxNQUE0QixFQUFyQztBQUNBOztBQUVEUCxNQUFBQSxNQUFNLENBQUMvUyxPQUFQLENBQWUsVUFBVXVULEtBQVYsRUFBc0I7QUFDcEMsWUFBSUEsS0FBSyxDQUFDdFYsR0FBTixDQUFVLGdDQUFWLENBQUosRUFBaUQ7QUFDaERzVixVQUFBQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ0Msb0JBQU4sRUFBUixDQURnRCxDQUNWO0FBQ3RDOztBQUVELFlBQUlELEtBQUssQ0FBQzNaLGlCQUFOLEVBQUosRUFBK0I7QUFDOUIyWixVQUFBQSxLQUFLLENBQUNuTyxpQkFBTixDQUF3QixJQUF4QjtBQUNBO0FBQ0QsT0FSRDtBQVNBLEs7O1dBRUQ2Rix3QyxHQUFBLGtEQUF5Q3ZCLFFBQXpDLEVBQXdERyxtQkFBeEQsRUFBcUY7QUFDcEYsVUFBSUYsZUFBSjs7QUFFQSxlQUFTOEosYUFBVCxDQUF1QkMsUUFBdkIsRUFBZ0Q7QUFDL0MsWUFBSUMscUJBQUo7O0FBQ0EsWUFBSTtBQUNIRCxVQUFBQSxRQUFRLENBQUMxVCxPQUFULENBQWlCLFVBQVU0VCxPQUFWLEVBQXdCO0FBQ3hDRCxZQUFBQSxxQkFBcUIsR0FBR0MsT0FBTyxDQUFDaGEsaUJBQVIsRUFBeEI7O0FBQ0EsZ0JBQ0MrWixxQkFBcUIsQ0FDbkI3YixRQURGLEdBRUUwQyxZQUZGLEdBR0VFLGNBSEYsQ0FHaUJpWixxQkFBcUIsQ0FBQzdhLE9BQXRCLEVBSGpCLEVBSUU2QixTQUpGLENBSVksT0FKWixNQUl5QmtQLG1CQUwxQixFQU1FO0FBQ0Qsb0JBQU0sSUFBSTVJLEtBQUosQ0FBVSxtQ0FBVixDQUFOO0FBQ0E7QUFDRCxXQVhEO0FBWUEsaUJBQU81RCxTQUFQO0FBQ0EsU0FkRCxDQWNFLE9BQU83SCxDQUFQLEVBQVU7QUFDWCxpQkFBT21lLHFCQUFQO0FBQ0E7QUFDRDs7QUFFRCxlQUFTRSxpQkFBVCxDQUEyQkMsWUFBM0IsRUFBd0Q7QUFDdkQsWUFBSUgscUJBQUo7O0FBQ0EsWUFBSTtBQUNIRyxVQUFBQSxZQUFZLENBQUM5VCxPQUFiLENBQXFCLFVBQVUrVCxXQUFWLEVBQTRCO0FBQ2hELGdCQUFJSixxQkFBSixFQUEyQjtBQUMxQixvQkFBTSxJQUFJMVMsS0FBSixDQUFVLHVDQUFWLENBQU47QUFDQTs7QUFDRCxnQkFBSThTLFdBQVcsQ0FBQ25hLGlCQUFaLE9BQW9DLElBQXhDLEVBQThDO0FBQzdDbWEsY0FBQUEsV0FBVyxDQUFDM08saUJBQVosQ0FBOEIvSCxTQUE5QjtBQUNBOztBQUNELGdCQUFNcVcsUUFBUSxHQUFHSyxXQUFXLENBQUNDLGNBQVosQ0FBMkIsU0FBM0IsQ0FBakI7QUFDQUwsWUFBQUEscUJBQXFCLEdBQUdGLGFBQWEsQ0FBQ0MsUUFBRCxDQUFyQztBQUNBLFdBVEQ7QUFVQSxpQkFBT0MscUJBQXFCLEdBQUdBLHFCQUFILEdBQTJCdFcsU0FBdkQ7QUFDQSxTQVpELENBWUUsT0FBTzdILENBQVAsRUFBVTtBQUNYLGlCQUFPbWUscUJBQVA7QUFDQTtBQUNEOztBQUVELFVBQUk7QUFDSCxZQUFJakssUUFBUSxLQUFLck0sU0FBakIsRUFBNEI7QUFDM0IsZ0JBQU0sSUFBSTRELEtBQUosQ0FBVSx5RkFBVixDQUFOO0FBQ0E7O0FBRUQwSSxRQUFBQSxlQUFlLEdBQUdELFFBQWxCOztBQUNBLGVBQU8sQ0FBQ0MsZUFBZSxDQUFDMUwsR0FBaEIsQ0FBb0IsNEJBQXBCLENBQVIsRUFBMkQ7QUFDMUQwTCxVQUFBQSxlQUFlLEdBQUdBLGVBQWUsQ0FBQ25NLFNBQWhCLEVBQWxCO0FBQ0E7O0FBRUQsWUFBSSxDQUFDbU0sZUFBTCxFQUFzQjtBQUNyQixnQkFBTSxJQUFJMUksS0FBSixDQUFVLDZDQUFWLENBQU47QUFDQSxTQUZELE1BRU87QUFDTixjQUFNNlMsWUFBWSxHQUFHbkssZUFBZSxDQUFDcUssY0FBaEIsQ0FBK0IsYUFBL0IsQ0FBckI7QUFDQSxpQkFBT0gsaUJBQWlCLENBQUNDLFlBQUQsQ0FBeEI7QUFDQTtBQUNELE9BaEJELENBZ0JFLE9BQU83YSxLQUFQLEVBQWM7QUFDZkQsUUFBQUEsR0FBRyxDQUFDcVQsSUFBSixDQUFTcFQsS0FBVDtBQUNBLGVBQU9vRSxTQUFQO0FBQ0E7QUFDRCxLOztXQUVEM0Usa0IsR0FBQSw0QkFBbUJ1YixjQUFuQixFQUE4Q0MsVUFBOUMsRUFBeUY7QUFDeEYsYUFBTztBQUNOcmIsUUFBQUEsYUFBYSxFQUFFcWIsVUFEVDtBQUVOdGIsUUFBQUEsV0FBVyxFQUFFLENBQ1o7QUFDQ3NQLFVBQUFBLE9BQU8sRUFBRStMLGNBQWMsQ0FBQ25iLE9BQWYsRUFEVjtBQUVDbVAsVUFBQUEsT0FBTyxFQUFFaU0sVUFBVSxDQUFDcGIsT0FBWDtBQUZWLFNBRFk7QUFGUCxPQUFQO0FBU0EsSzs7V0FFREgscUIsR0FBQSwrQkFBc0J3YixRQUF0QixFQUF3RTtBQUN2RSxVQUFNMVgsYUFBYSxHQUFHLEtBQUtyRixJQUFMLENBQVV1RixlQUFWLEVBQXRCO0FBQ0FGLE1BQUFBLGFBQWEsQ0FBQ0csY0FBZCxHQUErQndYLGNBQS9CLENBQThDRCxRQUE5QyxFQUZ1RSxDQUl2RTs7QUFDQSxVQUFNck0sbUJBQW1CLEdBQUcsS0FBSzdNLG1CQUFMLEVBQTVCOztBQUNBLFVBQUlrWixRQUFRLENBQUNwWixNQUFULElBQW1CLENBQUErTSxtQkFBbUIsU0FBbkIsSUFBQUEsbUJBQW1CLFdBQW5CLFlBQUFBLG1CQUFtQixDQUFFQyxhQUFyQixNQUF1Q29NLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDcFosTUFBVCxHQUFrQixDQUFuQixDQUFSLENBQThCbU4sT0FBNUYsRUFBcUc7QUFDcEdKLFFBQUFBLG1CQUFtQixDQUFDQyxhQUFwQixHQUFvQ29NLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDcFosTUFBVCxHQUFrQixDQUFuQixDQUFSLENBQThCa04sT0FBbEU7QUFDQTtBQUNEO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNPelAsMEIsdUNBQ0w2YixrQixFQUNBQyx1QixFQUNBM2MsaUIsRUFDQTRjLGtCO1VBQzBDO0FBQUE7O0FBQzFDRCxRQUFBQSx1QkFBdUIsNEJBQUdBLHVCQUFILHlFQUE4QkQsa0JBQXJEOztBQUNBLFlBQUksQ0FBQ0MsdUJBQXVCLENBQUN4YixPQUF4QixHQUFrQzBiLFVBQWxDLENBQTZDSCxrQkFBa0IsQ0FBQ3ZiLE9BQW5CLEVBQTdDLENBQUwsRUFBaUY7QUFDaEY7QUFDQUUsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsMENBQVY7QUFDQSxnQkFBTSxJQUFJZ0ksS0FBSixDQUFVLDBDQUFWLENBQU47QUFDQTs7QUFDRCxZQUFJc1Qsa0JBQWtCLElBQUlELHVCQUF1QixDQUFDeGIsT0FBeEIsT0FBc0N1YixrQkFBa0IsQ0FBQ3ZiLE9BQW5CLEVBQWhFLEVBQThGO0FBQzdGLGlCQUFPeUQsT0FBTyxDQUFDQyxPQUFSLENBQWdCYSxTQUFoQixDQUFQO0FBQ0E7O0FBRUQsWUFBTThNLEtBQUssR0FBR2tLLGtCQUFrQixDQUFDdmMsUUFBbkIsRUFBZDs7QUFDQSxZQUFJSCxpQkFBaUIsS0FBSzdCLGdCQUFnQixDQUFDZ0UsS0FBM0MsRUFBa0Q7QUFDakQsaUNBQU8yYSxLQUFLLENBQUNDLHlCQUFOLENBQWdDTCxrQkFBaEMsRUFBb0RDLHVCQUFwRCxDQUFQO0FBQ0EsU0FGRCxNQUVPO0FBQ047QUFDQTtBQUNBLGlDQUFPO0FBQ056YixZQUFBQSxhQUFhLEVBQUVzUixLQUFLLENBQUN3SyxXQUFOLENBQWtCTCx1QkFBdUIsQ0FBQ3hiLE9BQXhCLEVBQWxCLEVBQXFEOGIsZUFBckQsRUFEVDtBQUVOaGMsWUFBQUEsV0FBVyxFQUFFO0FBRlAsV0FBUDtBQUlBO0FBQ0QsTzs7Ozs7V0FDRE4sYSxHQUFBLHlCQUF5QjtBQUN4QixhQUFPb0UsV0FBVyxDQUFDQyxlQUFaLENBQTRCLEtBQUtuRixPQUFMLEVBQTVCLEVBQTRDYyxhQUE1QyxFQUFQO0FBQ0EsSzs7O0lBbnhEcUJ1YyxtQjtTQXN4RFJ4ZSxRIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEZsZXhpYmxlQ29sdW1uTGF5b3V0IGZyb20gXCJzYXAvZi9GbGV4aWJsZUNvbHVtbkxheW91dFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IHNlbmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljTWFwcGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB7IFN0YW5kYXJkQWN0aW9ucywgdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXksIFRyaWdnZXJUeXBlIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvRmVlZGJhY2tcIjtcbmltcG9ydCB0eXBlIE5hdkNvbnRhaW5lciBmcm9tIFwic2FwL20vTmF2Q29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgQ29yZUV4LCBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGUsXG5cdFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0cHJpdmF0ZSBmbkRpcnR5U3RhdGVQcm92aWRlcj86IEZ1bmN0aW9uO1xuXHRwcml2YXRlIGZuSGFuZGxlU2Vzc2lvblRpbWVvdXQ/OiBGdW5jdGlvbjtcblx0cHJpdmF0ZSBtUGF0Y2hQcm9taXNlcz86IGFueTtcblx0cHJpdmF0ZSBfZm5TdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uPzogRnVuY3Rpb247XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZWRpdERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChvQ29udGV4dDogVjRDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0bGV0IHJpZ2h0bW9zdENvbnRleHQ7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQob0NvbnRleHQsIHRoaXMuZ2V0VmlldygpLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpKTtcblxuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb0NvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKTtcblxuXHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCByaWdodG1vc3RDb250ZXh0LCBzUHJvZ3JhbW1pbmdNb2RlbCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBvTmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgdHJ1ZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPbihvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoYUNvbnRleHRzOiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzKGFDb250ZXh0cywgbVBhcmFtZXRlcnMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSBvUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3VwZGF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVwZGF0ZURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QsIG9Qcm9taXNlOiBQcm9taXNlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuX2dldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYklzRHJhZnQgPSB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBvUHJvbWlzZTtcblx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdC8vIEluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nXG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmIChiSXNEcmFmdCAmJiBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0ID09PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0c0VudGl0eVNldE5hbWUgPSAob01ldGFNb2RlbCBhcyBhbnkpLmdldE1ldGFDb250ZXh0KG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpLFxuXHRcdFx0XHRcdFx0YVNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhvTWV0YU1vZGVsLCBzRW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9DdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCksXG5cdFx0XHRcdFx0XHRcdHNDdXJyZW50U2VtYW50aWNQYXRoID0gb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcgJiYgb0N1cnJlbnRTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0JpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHRcdC8vIHNDdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0XHRpZiAoc0N1cnJlbnRTZW1hbnRpY1BhdGggJiYgc0N1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KG9CaW5kaW5nQ29udGV4dCwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRpZiAoYklzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWRcblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSlcblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNjcmVhdGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRjcmVhdGVEb2N1bWVudChcblx0XHR2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5fZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGxldCBvVGFibGU6IGFueTsgLy9zaG91bGQgYmUgVGFibGUgYnV0IHRoZXJlIGFyZSBtaXNzaW5nIG1ldGhvZHMgaW50byB0aGUgZGVmXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgYlNob3VsZEJ1c3lMb2NrID1cblx0XHRcdCFtUGFyYW1ldGVycyB8fFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCk7XG5cdFx0bGV0IG9FeGVjQ3VzdG9tVmFsaWRhdGlvbiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHQvLyBDcmVhdGUgYnkgbmF2aWdhdGluZyB0byBhbiBleHRlcm5hbCB0YXJnZXRcblx0XHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHRcdHNDcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuZ2V0VmlldygpLCB2TGlzdEJpbmRpbmcpO1xuXG5cdFx0XHRcdChvQ29udHJvbGxlciBhcyBhbnkpLmhhbmRsZXJzLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgbVBhcmFtZXRlcnMub3V0Ym91bmQsIHVuZGVmaW5lZCwgc0NyZWF0ZVBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93KSB7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dPYmplY3RzID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKTtcblx0XHRcdGRlbGV0ZSBvQ3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdG9UYWJsZSA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpO1xuXHRcdFx0b0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gdHJhbnNhY3Rpb25IZWxwZXIudmFsaWRhdGVEb2N1bWVudChcblx0XHRcdFx0b1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRkYXRhOiBvQ3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogb1RhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmJhc2UuZ2V0VmlldygpXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0XHRpZiAob1RhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiYgbVBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0b1RhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cblx0XHRpZiAob1RhYmxlICYmIG9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRjb25zdCBmbkZvY3VzT3JTY3JvbGwgPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgPyBvVGFibGUuZm9jdXNSb3cuYmluZChvVGFibGUpIDogb1RhYmxlLnNjcm9sbFRvSW5kZXguYmluZChvVGFibGUpO1xuXHRcdFx0b1RhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRmbkZvY3VzT3JTY3JvbGwobVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyBvVGFibGUuZ2V0Um93QmluZGluZygpLmdldExlbmd0aCgpIDogMCwgdHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBoYW5kbGVTaWRlRWZmZWN0cyA9IChvTGlzdEJpbmRpbmc6IGFueSwgb0NyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0PikgPT4ge1xuXHRcdFx0b0NyZWF0aW9uUHJvbWlzZVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob05ld0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0XHRcdHJldHVybiBvTmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmNvZGUgPT09IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YVZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChvVmFsaWRhdGlvbk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdGlmIChvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRcdG9GaWVsZENvbnRyb2wgPSBDb3JlLmdldENvbnRyb2wobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRcdHNUYXJnZXQgPSBgJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBzVGFyZ2V0XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXIgcnVuYWJsZVxuXHRcdFx0XHRcdGNvbnN0IGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQ3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0dGV4dDogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGFDdXN0b21NZXNzYWdlc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChiU2hvdWxkQnVzeUxvY2spIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9zeW5jVGFzayhvRXhlY0N1c3RvbVZhbGlkYXRpb24pXG5cdFx0XHQudGhlbigoYVZhbGlkYXRpb25NZXNzYWdlczogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMoYVZhbGlkYXRpb25NZXNzYWdlcyk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmc7XG5cdFx0XHRcdGxldCBvTGlzdEJpbmRpbmc6IGFueTtcblxuXHRcdFx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdFx0XHRcdGlmICh2TGlzdEJpbmRpbmcgJiYgdHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IHZMaXN0QmluZGluZztcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuU3luYztcblx0XHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBvYmplY3Qgb3IgcGF0aCBleHBlY3RlZFwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzQ3JlYXRpb25Nb2RlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlO1xuXG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpKVxuXHRcdFx0XHRcdC50aGVuKChwcm9ncmFtbWluZ01vZGVsOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID0gcHJvZ3JhbW1pbmdNb2RlbDtcblx0XHRcdFx0XHRcdGlmIChzQ3JlYXRpb25Nb2RlICYmIHNDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNDcmVhdGlvbk1vZGU7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvTmV3QWN0aW9uYClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNOZXdBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NOZXdBY3Rpb259L0AkdWk1Lm92ZXJsb2FkLzAvJFBhcmFtZXRlcmApIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gYmluZGluZyBwYXJhbWV0ZXIgKGVnOiBfaXQpIGlzIG5vdCBjb25zaWRlcmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYVBhcmFtZXRlcnMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IENvbW1vblV0aWxzLmdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdHNNZXRhUGF0aCxcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnRoZW4oKHJlc29sdmVkQ3JlYXRpb25Nb2RlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGxldCBvQ3JlYXRpb246IGFueTtcblx0XHRcdFx0XHRcdGxldCBtQXJnczogYW55O1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0XHRcdFx0XHRsZXQgb0NyZWF0aW9uUm93Q29udGV4dDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IG9WYWxpZGF0aW9uQ2hlY2sgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdGxldCBvUGF5bG9hZDogYW55O1xuXHRcdFx0XHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKTtcblxuXHRcdFx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRcdFx0XHRvQ3JlYXRpb25Sb3dDb250ZXh0ID0gb0NyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gcHJlZmlsbCBkYXRhIGZyb20gY3JlYXRpb24gcm93XG5cdFx0XHRcdFx0XHRcdFx0b1BheWxvYWQgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRPYmplY3Qua2V5cyhvUGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhW3NQcm9wZXJ0eVBhdGhdID0gb1BheWxvYWRbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0b1ZhbGlkYXRpb25DaGVjayA9IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygvKm9DcmVhdGlvblJvd0NvbnRleHQqLyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgfHwgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUpIHtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJMb2NhbFwiO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHRcdFx0XHRcdFx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5faGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRvQ3JlYXRpb24gPSBvVmFsaWRhdGlvbkNoZWNrLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUNyZWF0ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxldCBvTmF2aWdhdGlvbjtcblx0XHRcdFx0XHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhc3luY0NvbnRleHQ6IG9DcmVhdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdFx0XHRcdFx0XHRtQXJncyA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1BcmdzLnRyYW5zaWVudCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uLnRoZW4oZnVuY3Rpb24gKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LCBtQXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3luY1Rhc2sob0NyZWF0aW9uKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c6XG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlIGNyZWF0aW9uIHJvdyBzaGFsbCBiZSBjbGVhcmVkIG9uY2UgdGhlIHZhbGlkYXRpb24gY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgYW5kXG5cdFx0XHRcdFx0XHRcdFx0Ly8gdGhlcmVmb3JlIHRoZSBQT1NUIGNhbiBiZSBzZW50IGFzeW5jIHRvIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvVmFsaWRhdGlvbkNoZWNrXG5cdFx0XHRcdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9OZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvQ3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgYklzTmV3UGFnZUNyZWF0aW9uID1cblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0XHRcdFx0aWYgKG9DcmVhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW29DcmVhdGlvbiwgb05hdmlnYXRpb25dKVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKChhUGFyYW1zOiBbYW55LCBhbnldKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsLCBvTW9kZWwpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoYklzTmV3UGFnZUNyZWF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBiSXNOZXdQYWdlQ3JlYXRpb24pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGFQYXJhbXNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9oYW5kbGVTdGlja3lPbihvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRXJyb3IgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KG9FcnJvci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRXJyb3IgPT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9FcnJvci5jYW5jZWxlZCB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvRXJyb3IucmVqZWN0ZWRJdGVtcyAmJiBvRXJyb3IucmVqZWN0ZWRJdGVtc1swXS5jYW5jZWxlZCkpXG5cdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ1NhdmUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnU2F2ZScgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVTYXZlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlU2F2ZShtUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnQ3JlYXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtICBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNyZWF0ZVBhcmFtZXRlcnMgQXJyYXkgb2YgdmFsdWVzIHRoYXQgYXJlIGZpbGxlZCBpbiB0aGUgQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlQ3JlYXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0VkaXQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZUVkaXQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvbkJlZm9yZURpc2NhcmQobVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0RlbGV0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0RlbGV0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGVsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uQmVmb3JlRGVsZXRlKG1QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXBhcmFtXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NhdmVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IFY0Q29udGV4dCwgbVBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0Y29uc3QgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciB8fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHRoaXMuX2dldFJlc291cmNlQnVuZGxlKCk7XG5cdFx0Y29uc3QgYUJpbmRpbmdzID0gbVBhcmFtZXRlcnMuYmluZGluZ3M7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJlxuXHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGFjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLnNhdmVEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IsXG5cdFx0XHRcdGFCaW5kaW5ncyxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy5fcmVtb3ZlQ29udGV4dHNGcm9tUGFnZXMoKTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdGlmIChhY3RpdmVEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IGFjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IGFjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRpZiAoIShvRXJyb3IgJiYgb0Vycm9yLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzYXZpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHR9XG5cdH1cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBWNENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5fZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLl9zZXRFZGl0TW9kZShiRWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCBiRWRpdGFibGUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY2FuY2VsRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IFY0Q29udGV4dCwgbVBhcmFtZXRlcnM6IHsgY29udHJvbDogb2JqZWN0OyBza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuIH0pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSB0aGlzLl9nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHRcdGNvbnN0IG1JblBhcmFtZXRlcnM6IGFueSA9IG1QYXJhbWV0ZXJzO1xuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXG5cdFx0bUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSBtUGFyYW1ldGVycy5jb250cm9sIHx8IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uO1xuXHRcdG1JblBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuX2dldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0aWYgKChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmIHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cblx0XHRcdFx0Ly8gTm8gbmVlZCB0byB0cnkgdG8gZ2V0IHJpZ2h0bW9zdCBjb250ZXh0IGluIGNhc2Ugb2YgYSBuZXcgb2JqZWN0XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0dGhpcy5fZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXG5cdFx0XHR0aGlzLl9yZW1vdmVDb250ZXh0c0Zyb21QYWdlcygpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuX3NldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXG5cdFx0XHRpZiAoIW9BY3RpdmVEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgdHJ1ZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL2FjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIEVudGl0eVNldCB0byB3aGljaCB0aGUgb2JqZWN0IGJlbG9uZ3NcblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZGVsZXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0ZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRyZXR1cm4gdGhpcy5fZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudCkge1xuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0FwcENvbXBvbmVudD8uZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuRGVlcGxpbmsgJiYgIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdC8vIHRvIHRoZSBhcHAgd2UgY2FtZSBmcm9tIChleGNlcHQgZm9yIEZDTCwgd2hlcmUgd2UgbmF2aWdhdGUgdG8gTFIgYXMgdXN1YWwpXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmV4aXRGcm9tQXBwKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fZ2V0Um91dGluZ0xpc3RlbmVyKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjYXBwbHlEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBhcHBseURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3N5bmNUYXNrKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdGF3YWl0IHRoaXMuX2dldFJvdXRpbmdMaXN0ZW5lcigpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUV4dHJhUGFyYW1zIFBSSVZBVEVcblx0ICogQHJldHVybnMgQSBwcm9taXNlIG9uY2UgdGhlIGFjdGlvbiBoYXMgYmVlbiBpbnZva2VkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNpbnZva2VBY3Rpb25cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiBhbnlcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9Db250cm9sOiBhbnk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBvQ3VycmVudENvbnRyb2w7XG5cdFx0bGV0IG9CaW5kaW5nQ29udGV4dDtcblx0XHRsZXQgYVBhcnRzO1xuXHRcdGxldCBzT3ZlcmxvYWRFbnRpdHlUeXBlO1xuXHRcdGxldCBvQ3VycmVudEFjdGlvbkNhbGxCYWNrczogYW55O1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnMgfHwge307XG5cblx0XHQvLyBEdWUgdG8gYSBtaXN0YWtlIHRoZSBpbnZva2VBY3Rpb24gaW4gdGhlIGV4dGVuc2lvbkFQSSBoYWQgYSBkaWZmZXJlbnQgQVBJIHRoYW4gdGhpcyBvbmUuXG5cdFx0Ly8gVGhlIG9uZSBmcm9tIHRoZSBleHRlbnNpb25BUEkgZG9lc24ndCBleGlzdCBhbnltb3JlIGFzIHdlIGV4cG9zZSB0aGUgZnVsbCBlZGl0IGZsb3cgbm93IGJ1dFxuXHRcdC8vIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBvbGQgc2lnbmF0dXJlXG5cdFx0aWYgKFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmlzQSAmJiBtUGFyYW1ldGVycy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHxcblx0XHRcdEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMpIHx8XG5cdFx0XHRtRXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dHMgPSBtUGFyYW1ldGVycztcblx0XHRcdG1QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5kZXhPZihcIihcIikgPiAtMSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSAoYVBhcnRzW2FQYXJ0cy5sZW5ndGggLSAxXSBhcyBhbnkpLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNUYWJsZUJvdW5kKCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0NvbnRyb2wuZGF0YShcInJvd3NCaW5kaW5nSW5mb1wiKS5wYXRoLFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHNCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNPdmVybG9hZEVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3Qgc1RhYmxlQ29udGV4dEVudGl0eVR5cGUgPSBtUGFyYW1ldGVycy5jb250ZXh0c1xuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFDb250ZXh0KG1QYXJhbWV0ZXJzLmNvbnRleHRzLmdldFBhdGgoKSlcblx0XHRcdFx0XHQuZ2V0T2JqZWN0KFwiJFR5cGVcIik7XG5cdFx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICE9PSBzVGFibGVDb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBpbiBjb250cm9sIHRyZWUgaGllcmFyY2h5XG5cdFx0XHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHRcdFx0d2hpbGUgKG9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0ID0gb0N1cnJlbnRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCAmJlxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChvQmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSA9PT1cblx0XHRcdFx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvQmluZGluZ0NvbnRleHQ7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgcGFyZW50XG5cdFx0XHRcdFx0XHRcdG9DdXJyZW50Q29udHJvbCA9IG9DdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gY29udGV4dCB3YXMgbm90IGZvdW5kIGluIFVJIGhpZXJhcmNoeSBnb2luZyBzdHJhaWdodCB1cHdhcmRzIC0gdHJ5IHRvIGZpbmQgaXQgaW4gU3ViU2VjdGlvbnNcblx0XHRcdFx0XHRpZiAoIW9DdXJyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbk92ZXJsb2FkQ29udGV4dCA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21TdWJTZWN0aW9ucyhvQ29udHJvbCwgc092ZXJsb2FkRW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbk92ZXJsb2FkQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0FjdGlvbk92ZXJsb2FkQ29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENvbnRleHQgbm90IGZvdW5kIGZvciBlbnRpdHkgdHlwZSAke3NPdmVybG9hZEVudGl0eVR5cGV9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5fY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuc0lkKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCA9IHRoaXMuX2dldEJvdW5kQ29udGV4dChvVmlldywgbVBhcmFtZXRlcnMpO1xuXHRcdC8vIE5lZWQgdG8ga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgY2FsbGVkIGZyb20gT2JqZWN0UGFnZSBmb3IgY2hhbmdlU2V0IElzb2xhdGVkIHdvcmthcm91bmRcblx0XHRtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSA9IChvVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCI7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5fc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24uYmluZChcblx0XHRcdFx0dHJhbnNhY3Rpb25IZWxwZXIsXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCkoKTtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQodGhpcy5fZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKSwgbVBhcmFtZXRlcnMuY29udGV4dHNbMF0pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMpO1xuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVzb2x2ZXIob1Jlc3BvbnNlKTtcblx0XHRcdH1cblx0XHRcdC8qXG5cdFx0XHRcdFx0V2Ugc2V0IHRoZSAodXBwZXIpIHBhZ2VzIHRvIGRpcnR5IGFmdGVyIGFuIGV4ZWN1dGlvbiBvZiBhbiBhY3Rpb25cblx0XHRcdFx0XHRUT0RPOiBnZXQgcmlkIG9mIHRoaXMgd29ya2Fyb3VuZFxuXHRcdFx0XHRcdFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IG5lZWRlZCBhcyBsb25nIGFzIHRoZSBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzeW5jaHJvbml6YXRpb24uXG5cdFx0XHRcdFx0T25jZSB0aGlzIGlzIHN1cHBvcnRlZCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgcGFnZXMgdG8gZGlydHkgYW55bW9yZSBhcyB0aGUgY29udGV4dCBpdHNlbGZcblx0XHRcdFx0XHRpcyBhbHJlYWR5IHJlZnJlc2hlZCAoaXQncyBqdXN0IG5vdCByZWZsZWN0ZWQgaW4gdGhlIG9iamVjdCBwYWdlKVxuXHRcdFx0XHRcdHdlIGV4cGxpY2l0bHkgZG9uJ3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoZSBsaXN0IHJlcG9ydCBidXQgb25seSBjYWxsIGl0IGZyb20gdGhlIG9iamVjdCBwYWdlXG5cdFx0XHRcdFx0YXMgaWYgaXQgaXMgY2FsbGVkIGluIHRoZSBsaXN0IHJlcG9ydCBpdCdzIG5vdCBuZWVkZWQgLSBhcyB3ZSBhbnl3YXkgd2lsbCByZW1vdmUgdGhpcyBsb2dpY1xuXHRcdFx0XHRcdHdlIGNhbiBsaXZlIHdpdGggdGhpc1xuXHRcdFx0XHRcdHdlIG5lZWQgYSBjb250ZXh0IHRvIHNldCB0aGUgdXBwZXIgcGFnZXMgdG8gZGlydHkgLSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB3ZSB1c2UgdGhlXG5cdFx0XHRcdFx0Zmlyc3Qgb25lIGFzIHRoZXkgYXJlIGFueXdheSBzaWJsaW5nc1xuXHRcdFx0XHRcdCovXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2dldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9zQ3VzdG9tQWN0aW9uXCIsIHNBY3Rpb25OYW1lKTtcblx0XHRcdH1cblx0XHRcdGlmIChtUGFyYW1ldGVycy5pc05hdmlnYWJsZSkge1xuXHRcdFx0XHRsZXQgdkNvbnRleHQgPSBvUmVzcG9uc2U7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZDb250ZXh0KSAmJiB2Q29udGV4dC5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHR2Q29udGV4dCA9IHZDb250ZXh0WzBdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2Q29udGV4dCAmJiAhQXJyYXkuaXNBcnJheSh2Q29udGV4dCkpIHtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dE1ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aCh2Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgPyBtUGFyYW1ldGVycy5jb250ZXh0c1swXSA6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkgIT09IHZDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRub0hpc3RvcnlFbnRyeTogZmFsc2Vcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRklYTUU6IGluIG1vc3Qgc2l0dWF0aW9ucyB0aGVyZSBpcyBubyBoYW5kbGVyIGZvciB0aGUgcmVqZWN0ZWQgcHJvbWlzZXMgcmV0dXJuZWRcblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH0gZWxzZSBpZiAoIShlcnIgJiYgKGVyci5jYW5jZWxlZCB8fCAoZXJyLnJlamVjdGVkSXRlbXMgJiYgZXJyLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKSkpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246JHtlcnJ9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gZm5GdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIFNob3VsZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgc2V0dGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24uIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQsIGltbWVkaWF0ZSBjb21wbGV0aW9uIGlzIGFzc3VtZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWZpbml0aW9ucyBvZiB0aGUgcHJlY29uZGl0aW9ucyB0byBiZSBjaGVja2VkIGJlZm9yZSBleGVjdXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kgRGVmaW5lcyB0aGUgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0IFRyaWdnZXJzIGEgYnVzeSBpbmRpY2F0b3Igd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnVwZGF0ZXNEb2N1bWVudCBUaGlzIG9wZXJhdGlvbiB1cGRhdGVzIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgdXNpbmcgdGhlIGJvdW5kIG1vZGVsIGFuZCBjb250ZXh0LiBBcyBhIHJlc3VsdCwgdGhlIGRyYWZ0IHN0YXR1cyBpcyB1cGRhdGVkIGlmIGEgZHJhZnQgZG9jdW1lbnQgZXhpc3RzLCBhbmQgdGhlIHVzZXIgaGFzIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgZWRpdGluZyBwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCBpZiB0aGUgZXhlY3V0aW9uIGlzIHByb2hpYml0ZWQgYW5kIHJlc29sdmVkIGJ5IHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBmbkZ1bmN0aW9uLlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc2VjdXJlZEV4ZWN1dGlvblxuXHQgKiBAcHVibGljXG5cdCAqIEBleHBlcmltZW50YWwgQXMgb2YgdmVyc2lvbiAxLjkwLjBcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHNlY3VyZWRFeGVjdXRpb24oXG5cdFx0Zm5GdW5jdGlvbjogRnVuY3Rpb24sXG5cdFx0bVBhcmFtZXRlcnM/OiB7XG5cdFx0XHRidXN5Pzoge1xuXHRcdFx0XHRzZXQ/OiBib29sZWFuO1xuXHRcdFx0XHRjaGVjaz86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0dXBkYXRlc0RvY3VtZW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJCdXN5U2V0ID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuYnVzeSAmJiBtUGFyYW1ldGVycy5idXN5LnNldCAhPT0gdW5kZWZpbmVkID8gbVBhcmFtZXRlcnMuYnVzeS5zZXQgOiB0cnVlLFxuXHRcdFx0YkJ1c3lDaGVjayA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmJ1c3kgJiYgbVBhcmFtZXRlcnMuYnVzeS5jaGVjayAhPT0gdW5kZWZpbmVkID8gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayA6IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gKG1QYXJhbWV0ZXJzICYmIChtUGFyYW1ldGVycyBhcyBhbnkpLnVwZGF0ZXNEb2N1bWVudCkgfHwgZmFsc2UsXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuX2dldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0YklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLl9nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLl9zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fc3luY1Rhc2soZm5GdW5jdGlvbilcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLl9nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucygpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3NldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKG9FcnJvcjogYW55KSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5fc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2dldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogYW55KSB7XG5cdFx0aWYgKCEodGhpcy5iYXNlLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdC8vIENyZWF0ZSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhlIHBhdGggaXMgY29tcGxldGVkXG5cdFx0XHRjb25zdCBvUGF0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRvRXZlbnQuZ2V0U291cmNlKCkuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKHBhdGNoQ29tcGxldGVkRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KG9FdmVudC5nZXRTb3VyY2UoKSwgb1BhdGNoUHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIENyZWF0ZUFjdGl2YXRlIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50XG5cdCAqL1xuXHRoYW5kbGVDcmVhdGVBY3RpdmF0ZShvRXZlbnQ6IGFueSkge1xuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5fZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBiQXRFbmQgPSB0cnVlO1xuXHRcdGNvbnN0IGJJbmFjdGl2ZSA9IHRydWU7XG5cdFx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gdGhpcy5fZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRjcmVhdGVBdEVuZDogYkF0RW5kLFxuXHRcdFx0aW5hY3RpdmU6IGJJbmFjdGl2ZSxcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0YnVzeU1vZGU6IFwiTm9uZVwiXG5cdFx0fTtcblx0XHR0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChvQmluZGluZywgb1BhcmFtcywgb1Jlc291cmNlQnVuZGxlLCB0aGlzLl9nZXRNZXNzYWdlSGFuZGxlcigpLCBmYWxzZSwgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Lypcblx0XHRcdCBUTyBCRSBDSEVDS0VEIC8gRElTQ1VTU0VEXG5cdFx0XHQgX2NyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIGFuZCBkZWxldGVNdWx0aURvY3VtZW50IC0gY291bGRuJ3Qgd2UgY29tYmluZSB0aGVtIHdpdGggY3JlYXRlIGFuZCBkZWxldGUgZG9jdW1lbnQ/XG5cdFx0XHQgX2NyZWF0ZUFjdGlvblByb21pc2UgYW5kIGRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIC0+IG5leHQgc3RlcFxuXG5cdFx0XHQgKi9cblxuXHRfc2V0RWRpdE1vZGUoc0VkaXRNb2RlOiBhbnksIGJDcmVhdGlvbk1vZGU/OiBib29sZWFuKSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc2V0RWRpdE1vZGUoc0VkaXRNb2RlLCBiQ3JlYXRpb25Nb2RlKTtcblx0fVxuXG5cdF9zZXREcmFmdFN0YXR1cyhzRHJhZnRTdGF0ZTogYW55KSB7XG5cdFx0KHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoc0RyYWZ0U3RhdGUpO1xuXHR9XG5cblx0X2dldFJvdXRpbmdMaXN0ZW5lcigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0Um91dGluZ0xpc3RlbmVyKCk7XG5cdH1cblxuXHRfZ2V0R2xvYmFsVUlNb2RlbCgpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHR9XG5cdF9zeW5jVGFzayh2VGFzaz86IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5zeW5jVGFzayh2VGFzayk7XG5cdH1cblxuXHRfZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHR9XG5cblx0X2RlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHRfaGFuZGxlQ3JlYXRlRXZlbnRzKG9CaW5kaW5nOiBhbnkpIHtcblx0XHQodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5oYW5kbGVDcmVhdGVFdmVudHMob0JpbmRpbmcpO1xuXHR9XG5cblx0X2dldFRyYW5zYWN0aW9uSGVscGVyKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHR9XG5cblx0X2dldEludGVybmFsTW9kZWwoKSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmdldEludGVybmFsTW9kZWwoKTtcblx0fVxuXG5cdF9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZUJ1bmRsZSgpIHtcblx0XHRyZXR1cm4gKHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBhbnkpLm9SZXNvdXJjZUJ1bmRsZTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWRcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jcmVhdGVBY3Rpb25Qcm9taXNlXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cblx0X2NyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWU6IGFueSwgc0NvbnRyb2xJZDogYW55KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIHNDb250cm9sSWQpO1xuXHR9XG5cblx0X2dldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHR9XG5cblx0X2RlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHR9XG5cblx0X2dldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdHJldHVybiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9lZGl0Rmxvdy5nZXRNZXNzYWdlSGFuZGxlcigpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShhY3Rpb246IEFjdGl2aXR5LCByZWxhdGVkQ29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10gfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBjb250ZW50ID0gQXJyYXkuaXNBcnJheShyZWxhdGVkQ29udGV4dHMpID8gcmVsYXRlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIDogcmVsYXRlZENvbnRleHRzPy5nZXRQYXRoKCk7XG5cdFx0c2VuZCh0aGlzLmdldFZpZXcoKSwgYWN0aW9uLCBjb250ZW50KTtcblx0fVxuXG5cdF90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZTogc3RyaW5nLCB0cmlnZ2VyVHlwZTogVHJpZ2dlclR5cGUpIHtcblx0XHR0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSh0aGlzLmdldFZpZXcoKSwgc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRoYXQgaXMgZXhlY3V0ZWRcblx0ICogQHBhcmFtIG9SZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0X2dldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWU6IHN0cmluZywgb1Jlc3BvbnNlOiBvYmplY3QpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgb1Jlc3BvbnNlKTtcblx0fVxuXG5cdGFzeW5jIF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLl9nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gU3VibWl0IGFueSBsZWZ0b3ZlciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCB5ZXQgc3VibWl0dGVkXG5cdFx0XHQvLyBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG9ubHkgMSB1cGRhdGVHcm91cElkLCBoZW5jZSBzdWJtaXR0aW5nIHRoZSBiYXRjaCBkaXJlY3RseSBoZXJlXG5cdFx0XHRhd2FpdCBvTW9kZWwuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIGNoYW5nZXNcblx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZyB3ZSBhZ3JlZWQgd2l0aCB0aGUgdjQgbW9kZWwgdGVhbSB0byB1c2UgYW4gaW50ZXJuYWwgbWV0aG9kLiBXZSdsbCByZXBsYWNlIGl0IG9uY2Vcblx0XHRcdC8vIGEgcHVibGljIG9yIHJlc3RyaWN0ZWQgbWV0aG9kIHdhcyBwcm92aWRlZFxuXHRcdFx0YXdhaXQgb01vZGVsLm9SZXF1ZXN0b3Iud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfaGFuZGxlU3RpY2t5T24ob0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuaGFuZGxlU3RpY2t5T24ob0NvbnRleHQpO1xuXHR9XG5cblx0X2hhbmRsZVN0aWNreU9mZigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdH1cblxuXHRfb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRyZXR1cm4gKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5fZWRpdEZsb3cub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpO1xuXHR9XG5cblx0X2Rpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX2VkaXRGbG93LmRpc2NhcmRTdGlja3lTZXNzaW9uKG9Db250ZXh0KTtcblx0fVxuXG5cdF9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSwgbW9kZWw6IE9EYXRhTW9kZWwpIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLl9nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCB0cnVlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIChtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKSBhcyBhbnkpW1wiU0FQLUNvbnRleHRJZFwiXSk7XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogYW55KSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5fZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0XHRcdHRoaXMuX2hhbmRsZVN0aWNreU9mZigvKm9Db250ZXh0Ki8pO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVOZXdDb250ZXh0KFxuXHRcdG9Db250ZXh0OiBhbnksXG5cdFx0YkVkaXRhYmxlOiBib29sZWFuLFxuXHRcdGJSZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW4sXG5cdFx0YkRyYWZ0TmF2aWdhdGlvbjogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cz86IGJvb2xlYW4sXG5cdFx0Yk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5PzogYm9vbGVhblxuXHQpIHtcblx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLl9nZXRSb3V0aW5nTGlzdGVuZXIoKS5uYXZpZ2F0ZVRvQ29udGV4dChvQ29udGV4dCwge1xuXHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRlZGl0YWJsZTogYkVkaXRhYmxlLFxuXHRcdFx0YlBlcnNpc3RPUFNjcm9sbDogdHJ1ZSxcblx0XHRcdGJSZWNyZWF0ZUNvbnRleHQ6IGJSZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRiRHJhZnROYXZpZ2F0aW9uOiBiRHJhZnROYXZpZ2F0aW9uLFxuXHRcdFx0c2hvd1BsYWNlaG9sZGVyOiBmYWxzZSxcblx0XHRcdGJGb3JjZUZvY3VzOiBiRm9yY2VGb2N1cyxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlLFxuXHRcdFx0Yk5hdmlnYXRlVG9TaWJsaW5nRW50aXR5OiBiTmF2aWdhdGVUb1NpYmxpbmdFbnRpdHlcblx0XHR9KTtcblx0fVxuXG5cdF9nZXRCb3VuZENvbnRleHQodmlldzogYW55LCBwYXJhbXM6IGFueSkge1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXcuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0Y29uc3QgYlJlZnJlc2hBZnRlckFjdGlvbiA9IHZpZXdMZXZlbCA+IDEgfHwgKHZpZXdMZXZlbCA9PT0gMSAmJiBwYXJhbXMuY29udHJvbElkKTtcblx0XHRyZXR1cm4gIXBhcmFtcy5pc05hdmlnYWJsZSB8fCAhIWJSZWZyZXNoQWZ0ZXJBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N5bmNUYXNrKCkudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gc2FwLnVpLmdldENvcmUoKS5nZXRNZXNzYWdlTWFuYWdlcigpLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblx0XHRcdGxldCBvTWVzc2FnZTtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJObyB2YWxpZGF0aW9uIGVycm9ycyBmb3VuZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b01lc3NhZ2UgPSBhTWVzc2FnZXNbaV07XG5cdFx0XHRcdGlmIChvTWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBDb3JlLmJ5SWQob01lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKG9Db250cm9sLmdldElkKCkgPT09IHNWaWV3SWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfcmVmcmVzaExpc3RJZlJlcXVpcmVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSByZXNwb25zZSBvZiB0aGUgYm91bmQgYWN0aW9uIGFuZCB0aGUgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHNcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIEFsd2F5cyByZXNvbHZlcyB0byBwYXJhbSBvUmVzcG9uc2Vcblx0ICovXG5cdF9yZWZyZXNoTGlzdElmUmVxdWlyZWQob1Jlc3BvbnNlOiBhbnksIG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0aWYgKCFvQ29udGV4dCB8fCAhb1Jlc3BvbnNlIHx8ICFvUmVzcG9uc2Uub0RhdGEpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Ly8gcmVmcmVzaCBvbmx5IGxpc3RzXG5cdFx0aWYgKG9CaW5kaW5nICYmIG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRjb25zdCBhS2V5cyA9IG9SZXNwb25zZS5rZXlzO1xuXHRcdFx0Y29uc3Qgb0N1cnJlbnREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRsZXQgYlJldHVybmVkQ29udGV4dElzU2FtZSA9IHRydWU7XG5cdFx0XHQvLyBlbnN1cmUgY29udGV4dCBpcyBpbiB0aGUgcmVzcG9uc2Vcblx0XHRcdGlmIChPYmplY3Qua2V5cyhvQ29udGV4dERhdGEpLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBjaGVjayBpZiBjb250ZXh0IGluIHJlc3BvbnNlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBib3VuZCBjb250ZXh0XG5cdFx0XHRcdGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXJyZW50RGF0YVtzS2V5XSA9PT0gb0NvbnRleHREYXRhW3NLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoKG9CaW5kaW5nIGFzIGFueSkuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudFxuXHRcdFx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG9CaW5kaW5nLmdldFBhdGgoKSB9XSwgb0JpbmRpbmcuZ2V0Q29udGV4dCgpIGFzIENvbnRleHQpXG5cdFx0XHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiLCBlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55LFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhUmVxdWVzdFByb21pc2VzID0gYVNlbWFudGljS2V5cy5tYXAoZnVuY3Rpb24gKG9LZXk6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVxdWVzdFByb21pc2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8vIFVnbHkgV29ya2Fyb3VuZCB0byBvdmVyY29tZSBtZGMgZmllbGQgaXNzdWUsIHdlIHJlbW92ZSB0aGUgYmluZGluZyBjb250ZXh0IGJlZm9yZVxuXHQvLyBzd2l0Y2hpbmcgdG8gZGlzcGxheSBtb2RlIHRvIGF2b2lkIHRoZSBmaWVsZCByZWFkcyBhZGRpdGlvbmFsIHZhbHVlcyBmb3Igbm9uIGV4aXN0aW5nXG5cdC8vIGRyYWZ0cyBvciBzdGlja3kgc2Vzc2lvbnMgaW4gdGhlIGJhY2tlbmRcblx0X3JlbW92ZUNvbnRleHRzRnJvbVBhZ2VzKCkge1xuXHRcdGxldCBhUGFnZXM6IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdGNvbnN0IG9GQ0wgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKSBhcyBGbGV4aWJsZUNvbHVtbkxheW91dDtcblx0XHRcdGFQYWdlcyA9IGFQYWdlcy5jb25jYXQob0ZDTC5nZXRNaWRDb2x1bW5QYWdlcygpIHx8IFtdKTtcblx0XHRcdGFQYWdlcyA9IGFQYWdlcy5jb25jYXQob0ZDTC5nZXRFbmRDb2x1bW5QYWdlcygpIHx8IFtdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpIGFzIE5hdkNvbnRhaW5lcjtcblx0XHRcdGFQYWdlcyA9IG9OYXZDb250YWluZXIuZ2V0UGFnZXMoKSB8fCBbXTtcblx0XHR9XG5cblx0XHRhUGFnZXMuZm9yRWFjaChmdW5jdGlvbiAob1BhZ2U6IGFueSkge1xuXHRcdFx0aWYgKG9QYWdlLmlzQShcInNhcC51aS5jb3JlLkNvbXBvbmVudENvbnRhaW5lclwiKSkge1xuXHRcdFx0XHRvUGFnZSA9IG9QYWdlLmdldENvbXBvbmVudEluc3RhbmNlKCk7IC8vIFRoZSBiaW5kaW5nIGNvbnRleHQgaXMgc2V0IGF0IHRoZSBjb21wb25lbnQgbGV2ZWwsIG5vdCB0aGUgY29tcG9uZW50IGNvbnRhaW5lclxuXHRcdFx0fVxuXG5cdFx0XHRpZiAob1BhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0XHRvUGFnZS5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tU3ViU2VjdGlvbnMob0NvbnRyb2w6IGFueSwgc092ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKSB7XG5cdFx0bGV0IG9DdXJyZW50Q29udHJvbDogYW55O1xuXG5cdFx0ZnVuY3Rpb24gX2NoZWNrQWN0aW9ucyhhQWN0aW9uczogQXJyYXk8b2JqZWN0Pikge1xuXHRcdFx0bGV0IG9BY3Rpb25CaW5kaW5nQ29udGV4dDogYW55O1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YUFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0b0FjdGlvbkJpbmRpbmdDb250ZXh0ID0gb0FjdGlvbi5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9BY3Rpb25CaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHRcdFx0LmdldE1ldGFDb250ZXh0KG9BY3Rpb25CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHRcdFx0XHRcdC5nZXRPYmplY3QoXCIkVHlwZVwiKSA9PT0gc092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiY29udGV4dCBmb3VuZCAtIHN0b3AgYWN0aW9ucyBsb29wXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX2NoZWNrU3ViU2VjdGlvbnMoYVN1YlNlY3Rpb25zOiBBcnJheTxvYmplY3Q+KSB7XG5cdFx0XHRsZXQgb0FjdGlvbkJpbmRpbmdDb250ZXh0OiBhbnk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhU3ViU2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdGlmIChvQWN0aW9uQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbnRleHQgZm91bmQgLSBzdG9wIFN1YlNlY3Rpb25zIGxvb3BcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5nZXRCaW5kaW5nQ29udGV4dCgpID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhQWN0aW9ucyA9IG9TdWJTZWN0aW9uLmdldEFnZ3JlZ2F0aW9uKFwiYWN0aW9uc1wiKTtcblx0XHRcdFx0XHRvQWN0aW9uQmluZGluZ0NvbnRleHQgPSBfY2hlY2tBY3Rpb25zKGFBY3Rpb25zKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQgPyBvQWN0aW9uQmluZGluZ0NvbnRleHQgOiB1bmRlZmluZWQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBvQWN0aW9uQmluZGluZ0NvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvQ29udHJvbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcImlucHV0IHBhcmFtZXRlciBvQ29udHJvbCB1bmRlZmluZWQgd2hlbiB0cnlpbmcgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gb3ZlcmxvYWQgY29udGV4dFwiKTtcblx0XHRcdH1cblxuXHRcdFx0b0N1cnJlbnRDb250cm9sID0gb0NvbnRyb2w7XG5cdFx0XHR3aGlsZSAoIW9DdXJyZW50Q29udHJvbC5pc0EoXCJzYXAudXhhcC5PYmplY3RQYWdlU2VjdGlvblwiKSkge1xuXHRcdFx0XHRvQ3VycmVudENvbnRyb2wgPSBvQ3VycmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghb0N1cnJlbnRDb250cm9sKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9iamVjdFBhZ2VTZWN0aW9uIG5vdCBmb3VuZCBpbiBVSSBoaWVyYXJjaHlcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvQ3VycmVudENvbnRyb2wuZ2V0QWdncmVnYXRpb24oXCJzdWJTZWN0aW9uc1wiKTtcblx0XHRcdFx0cmV0dXJuIF9jaGVja1N1YlNlY3Rpb25zKGFTdWJTZWN0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogVjRDb250ZXh0LCBuZXdDb250ZXh0OiBWNENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2RzIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoIGZvclxuXHQgKiBhbGwgaW50ZXJtZWRpYXRlcyBwYXRocyBiZXR3ZWVuIHRoZSBPUCBhbmQgdGhlIHN1Yi1PUC5cblx0ICpcblx0ICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0XG5cdCAqIEBwYXJhbSBzUHJvZ3JhbW1pbmdNb2RlbCBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHBhcmFtIGRvTm90Q29tcHV0ZUlmUm9vdCBJZiB0cnVlLCB3ZSBkb24ndCBjb21wdXRlIHNpYmxpbmdJbmZvIGlmIHRoZSByb290IGFuZCB0aGUgcmlnaHRtb3N0IGNvbnRleHRzIGFyZSB0aGUgc2FtZVxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IFY0Q29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdGRvTm90Q29tcHV0ZUlmUm9vdDogYm9vbGVhblxuXHQpOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgPz8gcm9vdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0aWYgKGRvTm90Q29tcHV0ZUlmUm9vdCAmJiByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkgPT09IHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cblx0XHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0cmV0dXJuIGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ocm9vdEN1cnJlbnRDb250ZXh0LCByaWdodG1vc3RDdXJyZW50Q29udGV4dCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vdCBpbiBkcmFmdCBtb2RlLCB3ZSBqdXN0IHJlY3JlYXRlIGEgY29udGV4dCBmcm9tIHRoZSBwYXRoIG9mIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0Ly8gTm8gcGF0aCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKSxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdfQ==
|