@sapui5/sap.fe.core 1.110.0 → 1.111.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -4
- package/package.json +2 -23
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime-dbg.js +182 -0
- package/src/sap/fe/core/ActionRuntime.js +3 -181
- package/src/sap/fe/core/ActionRuntime.js.map +1 -0
- package/src/sap/fe/core/ActionRuntime.ts +3 -5
- package/src/sap/fe/core/AppComponent-dbg.js +435 -0
- package/src/sap/fe/core/AppComponent.js +3 -439
- package/src/sap/fe/core/AppComponent.js.map +1 -0
- package/src/sap/fe/core/AppComponent.ts +0 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +200 -0
- package/src/sap/fe/core/AppStateHandler.js +3 -227
- package/src/sap/fe/core/AppStateHandler.js.map +1 -0
- package/src/sap/fe/core/BaseController-dbg.js +76 -0
- package/src/sap/fe/core/BaseController.js +3 -73
- package/src/sap/fe/core/BaseController.js.map +1 -0
- package/src/sap/fe/core/CommonUtils-dbg.js +2135 -0
- package/src/sap/fe/core/CommonUtils.js +3 -2296
- package/src/sap/fe/core/CommonUtils.js.map +1 -0
- package/src/sap/fe/core/CommonUtils.ts +34 -28
- package/src/sap/fe/core/ExtensionAPI-dbg.js +273 -0
- package/src/sap/fe/core/ExtensionAPI.js +3 -280
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -0
- package/src/sap/fe/core/PageController-dbg.js +203 -0
- package/src/sap/fe/core/PageController.js +3 -200
- package/src/sap/fe/core/PageController.js.map +1 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +218 -0
- package/src/sap/fe/core/TemplateComponent.js +3 -216
- package/src/sap/fe/core/TemplateComponent.js.map +1 -0
- package/src/sap/fe/core/TemplateModel-dbg.js +75 -0
- package/src/sap/fe/core/TemplateModel.js +3 -72
- package/src/sap/fe/core/TemplateModel.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +57 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +3 -54
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +410 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +11 -355
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +118 -52
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter-dbg.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +3 -11
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +44 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +3 -40
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +932 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +16 -1292
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +40 -42
- package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +434 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -481
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -5
- package/src/sap/fe/core/controllerextensions/BusyLocker-dbg.js +92 -0
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +3 -89
- package/src/sap/fe/core/controllerextensions/BusyLocker.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +1659 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +3 -1868
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +180 -125
- package/src/sap/fe/core/controllerextensions/Feedback-dbg.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.js +3 -67
- package/src/sap/fe/core/controllerextensions/Feedback.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation-dbg.js +83 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -84
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -8
- package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +711 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +3 -707
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +79 -48
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +791 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +3 -696
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +107 -7
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +984 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +3 -996
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +43 -23
- package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1013 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +3 -1011
- package/src/sap/fe/core/controllerextensions/KPIManagement.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -10
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +135 -0
- package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -133
- package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +221 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +3 -224
- package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +254 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +3 -279
- package/src/sap/fe/core/controllerextensions/PageReady.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/PageReady.ts +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +169 -0
- package/src/sap/fe/core/controllerextensions/Paginator.js +3 -174
- package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Paginator.ts +4 -5
- package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +132 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -130
- package/src/sap/fe/core/controllerextensions/Placeholder.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Routing-dbg.js +138 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +3 -135
- package/src/sap/fe/core/controllerextensions/Routing.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener-dbg.js +10 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -7
- package/src/sap/fe/core/controllerextensions/RoutingListener.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +317 -0
- package/src/sap/fe/core/controllerextensions/Share.js +3 -356
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -1
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +553 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -651
- package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +411 -553
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +903 -0
- package/src/sap/fe/core/controllerextensions/ViewState.js +3 -967
- package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/ViewState.ts +90 -41
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +99 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -96
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +314 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +3 -336
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +152 -0
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +3 -161
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +243 -0
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +3 -302
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +252 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +6 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +188 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +1196 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +3 -1479
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +239 -289
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +689 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -785
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +134 -142
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup-dbg.js +236 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -287
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +1422 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +3 -1598
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +40 -24
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +185 -0
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +3 -214
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +4 -5
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +1219 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -1213
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +304 -0
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +3 -339
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason-dbg.js +15 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +6 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.ts +6 -0
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +798 -0
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +3 -799
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -0
- package/src/sap/fe/core/controls/Any-dbg.js +32 -0
- package/src/sap/fe/core/controls/Any.js +3 -29
- package/src/sap/fe/core/controls/Any.js.map +1 -0
- package/src/sap/fe/core/controls/AnyElement-dbg.js +29 -0
- package/src/sap/fe/core/controls/AnyElement.js +3 -26
- package/src/sap/fe/core/controls/AnyElement.js.map +1 -0
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +72 -0
- package/src/sap/fe/core/controls/CommandExecution.js +3 -69
- package/src/sap/fe/core/controls/CommandExecution.js.map +1 -0
- package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +151 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -148
- package/src/sap/fe/core/controls/ConditionalWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +330 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +3 -328
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +126 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -124
- package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +1 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +170 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -171
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -0
- package/src/sap/fe/core/controls/FieldWrapper-dbg.js +194 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +3 -191
- package/src/sap/fe/core/controls/FieldWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/FileWrapper-dbg.js +280 -0
- package/src/sap/fe/core/controls/FileWrapper.js +3 -277
- package/src/sap/fe/core/controls/FileWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/FilterBar-dbg.js +167 -0
- package/src/sap/fe/core/controls/FilterBar.js +3 -166
- package/src/sap/fe/core/controls/FilterBar.js.map +1 -0
- package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +92 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +3 -89
- package/src/sap/fe/core/controls/FormElementWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/MassEditSelect-dbg.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.js +3 -30
- package/src/sap/fe/core/controls/MassEditSelect.js.map +1 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate-dbg.js +37 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -34
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +119 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -121
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +267 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +3 -264
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +150 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -150
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +310 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -307
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +491 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -504
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +2 -2
- package/src/sap/fe/core/converters/ConverterContext-dbg.js +403 -0
- package/src/sap/fe/core/converters/ConverterContext.js +3 -406
- package/src/sap/fe/core/converters/ConverterContext.js.map +1 -0
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +88 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +3 -84
- package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -0
- package/src/sap/fe/core/converters/ManifestSettings.ts +3 -1
- package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +402 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +3 -406
- package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -0
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +1161 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +3 -1225
- package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -0
- package/src/sap/fe/core/converters/MetaModelConverter.ts +193 -199
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +89 -0
- package/src/sap/fe/core/converters/TemplateConverter.js +3 -86
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -0
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +396 -0
- package/src/sap/fe/core/converters/annotations/DataField.js +3 -394
- package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -0
- package/src/sap/fe/core/converters/annotations/DataField.ts +5 -5
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1948 -0
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +3 -1868
- package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +424 -0
- package/src/sap/fe/core/converters/controls/Common/Action.js +3 -446
- package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Action.ts +31 -14
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +276 -0
- package/src/sap/fe/core/converters/controls/Common/Chart.js +3 -260
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +52 -7
- package/src/sap/fe/core/converters/controls/Common/Criticality-dbg.js +42 -0
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -39
- package/src/sap/fe/core/converters/controls/Common/Criticality.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +247 -0
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -242
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +229 -0
- package/src/sap/fe/core/converters/controls/Common/Form.js +3 -234
- package/src/sap/fe/core/converters/controls/Common/Form.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +374 -0
- package/src/sap/fe/core/converters/controls/Common/KPI.js +3 -371
- package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +2596 -0
- package/src/sap/fe/core/converters/controls/Common/Table.js +3 -2527
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Table.ts +214 -77
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +522 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +3 -527
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +51 -50
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +786 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +3 -845
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +0 -64
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +291 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +3 -316
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +30 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +56 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +3 -53
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +438 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -431
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +597 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +3 -630
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +204 -0
- package/src/sap/fe/core/converters/helpers/Aggregation.js +3 -204
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +100 -0
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -99
- package/src/sap/fe/core/converters/helpers/BindingHelper.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +199 -0
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +3 -199
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +143 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +3 -140
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +2 -1
- package/src/sap/fe/core/converters/helpers/ID-dbg.js +92 -0
- package/src/sap/fe/core/converters/helpers/ID.js +3 -89
- package/src/sap/fe/core/converters/helpers/ID.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +62 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +3 -59
- package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/Key-dbg.js +62 -0
- package/src/sap/fe/core/converters/helpers/Key.js +3 -59
- package/src/sap/fe/core/converters/helpers/Key.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper-dbg.js +80 -0
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +3 -77
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js.map +1 -0
- package/src/sap/fe/core/converters/objectPage/FormMenuActions-dbg.js +142 -0
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +3 -139
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js.map +1 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +406 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +3 -422
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +132 -111
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +557 -0
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +3 -589
- package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -0
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +474 -0
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +3 -477
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -0
- package/src/sap/fe/core/designtime/AppComponent-dbg.designtime.js +103 -0
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -100
- package/src/sap/fe/core/designtime/AppComponent.designtime.js.map +1 -0
- package/src/sap/fe/core/designtime/library-preload.designtime.js +7 -0
- package/src/sap/fe/core/designtime/library-preload.designtime.js.map +1 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +95 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +3 -92
- package/src/sap/fe/core/formatters/CollaborationFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +46 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -44
- package/src/sap/fe/core/formatters/FPMFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/FPMFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +343 -0
- package/src/sap/fe/core/formatters/FiscalFormat.js +6 -0
- package/src/sap/fe/core/formatters/FiscalFormat.js.map +1 -0
- package/src/sap/fe/core/formatters/FiscalFormat.ts +319 -0
- package/src/sap/fe/core/formatters/KPIFormatter-dbg.js +86 -0
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -83
- package/src/sap/fe/core/formatters/KPIFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/StandardFormatter-dbg.js +80 -0
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -78
- package/src/sap/fe/core/formatters/StandardFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/TableFormatter-dbg.js +276 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +3 -275
- package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/TableFormatterTypes-dbg.js +20 -0
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +3 -17
- package/src/sap/fe/core/formatters/TableFormatterTypes.js.map +1 -0
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +172 -0
- package/src/sap/fe/core/formatters/ValueFormatter.js +3 -161
- package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -8
- package/src/sap/fe/core/fpm/Component-dbg.js +94 -0
- package/src/sap/fe/core/fpm/Component.js +3 -91
- package/src/sap/fe/core/fpm/Component.js.map +1 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AnnotationEnum-dbg.js +30 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +3 -36
- package/src/sap/fe/core/helpers/AnnotationEnum.js.map +1 -0
- package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +334 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +3 -335
- package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +1739 -0
- package/src/sap/fe/core/helpers/BindingToolkit.js +3 -1611
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -0
- package/src/sap/fe/core/helpers/BindingToolkit.ts +277 -97
- package/src/sap/fe/core/helpers/ClassSupport-dbg.js +421 -0
- package/src/sap/fe/core/helpers/ClassSupport.js +3 -420
- package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -0
- package/src/sap/fe/core/helpers/ClassSupport.ts +13 -15
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +526 -0
- package/src/sap/fe/core/helpers/DeleteHelper.js +3 -618
- package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +116 -134
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper-dbg.js +55 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +3 -52
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/EditState-dbg.js +80 -0
- package/src/sap/fe/core/helpers/EditState.js +3 -77
- package/src/sap/fe/core/helpers/EditState.js.map +1 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper-dbg.js +55 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +3 -52
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/FPMHelper-dbg.js +55 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -52
- package/src/sap/fe/core/helpers/FPMHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +180 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -177
- package/src/sap/fe/core/helpers/KeepAliveHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes-dbg.js +28 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +3 -25
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js.map +1 -0
- package/src/sap/fe/core/helpers/LoaderUtils-dbg.js +29 -0
- package/src/sap/fe/core/helpers/LoaderUtils.js +3 -30
- package/src/sap/fe/core/helpers/LoaderUtils.js.map +1 -0
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +1229 -0
- package/src/sap/fe/core/helpers/MassEditHelper.js +3 -1309
- package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/MassEditHelper.ts +6 -6
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +65 -0
- package/src/sap/fe/core/helpers/MessageStrip.js +3 -62
- package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -0
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +489 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +3 -503
- package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/ModelHelper.ts +13 -36
- package/src/sap/fe/core/helpers/PasteHelper-dbg.js +174 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -185
- package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +371 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -368
- package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +70 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +141 -0
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +3 -137
- package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SideEffectsHelper.ts +3 -2
- package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +204 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +3 -208
- package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/Synchronization-dbg.js +35 -0
- package/src/sap/fe/core/helpers/Synchronization.js +3 -33
- package/src/sap/fe/core/helpers/Synchronization.js.map +1 -0
- package/src/sap/fe/core/helpers/ToES6Promise-dbg.js +29 -0
- package/src/sap/fe/core/helpers/ToES6Promise.js +3 -26
- package/src/sap/fe/core/helpers/ToES6Promise.js.map +1 -0
- package/src/sap/fe/core/helpers/TypeGuards-dbg.js +20 -0
- package/src/sap/fe/core/helpers/TypeGuards.js +3 -19
- package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +5 -1
- package/src/sap/fe/core/jsx-runtime/Fragment-dbg.js +14 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +3 -11
- package/src/sap/fe/core/jsx-runtime/Fragment.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +76 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -86
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +124 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -98
- package/src/sap/fe/core/jsx-runtime/jsx-control.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +43 -17
- package/src/sap/fe/core/jsx-runtime/jsx-dbg.js +41 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml-dbg.js +94 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +3 -90
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +3 -28
- package/src/sap/fe/core/jsx-runtime/jsx.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx.ts +19 -1
- package/src/sap/fe/core/jsx-runtime/jsxs-dbg.js +10 -0
- package/src/sap/fe/core/jsx-runtime/jsxs.js +3 -7
- package/src/sap/fe/core/jsx-runtime/jsxs.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +154 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +3 -153
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -0
- package/src/sap/fe/core/library-dbg.js +437 -0
- package/src/sap/fe/core/library-preload.js +900 -0
- package/src/sap/fe/core/library-preload.js.map +1 -0
- package/src/sap/fe/core/library-preload.support.js +177 -0
- package/src/sap/fe/core/library-preload.support.js.map +1 -0
- package/src/sap/fe/core/library.js +3 -461
- package/src/sap/fe/core/library.js.map +1 -0
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +12 -25
- package/src/sap/fe/core/manifest.json +100 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +99 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -96
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -0
- package/src/sap/fe/core/messagebundle.properties +6 -0
- package/src/sap/fe/core/messagebundle_ar.properties +22 -0
- package/src/sap/fe/core/messagebundle_bg.properties +22 -0
- package/src/sap/fe/core/messagebundle_ca.properties +22 -0
- package/src/sap/fe/core/messagebundle_cs.properties +22 -0
- package/src/sap/fe/core/messagebundle_cy.properties +22 -0
- package/src/sap/fe/core/messagebundle_da.properties +22 -0
- package/src/sap/fe/core/messagebundle_de.properties +22 -0
- package/src/sap/fe/core/messagebundle_el.properties +22 -0
- package/src/sap/fe/core/messagebundle_en.properties +22 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +22 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +22 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +4 -0
- package/src/sap/fe/core/messagebundle_es.properties +22 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +22 -0
- package/src/sap/fe/core/messagebundle_et.properties +22 -0
- package/src/sap/fe/core/messagebundle_fi.properties +22 -0
- package/src/sap/fe/core/messagebundle_fr.properties +22 -0
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -0
- package/src/sap/fe/core/messagebundle_hi.properties +22 -0
- package/src/sap/fe/core/messagebundle_hr.properties +23 -1
- package/src/sap/fe/core/messagebundle_hu.properties +22 -0
- package/src/sap/fe/core/messagebundle_id.properties +22 -0
- package/src/sap/fe/core/messagebundle_it.properties +22 -0
- package/src/sap/fe/core/messagebundle_iw.properties +22 -0
- package/src/sap/fe/core/messagebundle_ja.properties +22 -0
- package/src/sap/fe/core/messagebundle_kk.properties +22 -0
- package/src/sap/fe/core/messagebundle_ko.properties +22 -0
- package/src/sap/fe/core/messagebundle_lt.properties +22 -0
- package/src/sap/fe/core/messagebundle_lv.properties +22 -0
- package/src/sap/fe/core/messagebundle_ms.properties +22 -0
- package/src/sap/fe/core/messagebundle_nl.properties +22 -0
- package/src/sap/fe/core/messagebundle_no.properties +22 -0
- package/src/sap/fe/core/messagebundle_pl.properties +22 -0
- package/src/sap/fe/core/messagebundle_pt.properties +22 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -0
- package/src/sap/fe/core/messagebundle_ro.properties +22 -0
- package/src/sap/fe/core/messagebundle_ru.properties +22 -0
- package/src/sap/fe/core/messagebundle_sh.properties +22 -0
- package/src/sap/fe/core/messagebundle_sk.properties +22 -0
- package/src/sap/fe/core/messagebundle_sl.properties +22 -0
- package/src/sap/fe/core/messagebundle_sv.properties +22 -0
- package/src/sap/fe/core/messagebundle_th.properties +22 -0
- package/src/sap/fe/core/messagebundle_tr.properties +22 -0
- package/src/sap/fe/core/messagebundle_uk.properties +22 -0
- package/src/sap/fe/core/messagebundle_vi.properties +22 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -0
- package/src/sap/fe/core/operationsHelper-dbg.js +155 -0
- package/src/sap/fe/core/operationsHelper.js +3 -205
- package/src/sap/fe/core/operationsHelper.js.map +1 -0
- package/src/sap/fe/core/operationsHelper.ts +14 -68
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +837 -0
- package/src/sap/fe/core/rootView/Fcl.controller.js +3 -855
- package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -0
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +190 -0
- package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -190
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -0
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +506 -0
- package/src/sap/fe/core/rootView/RootViewBaseController.js +3 -538
- package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -0
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -4
- package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +60 -0
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -60
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +196 -0
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -219
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +80 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -82
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +320 -0
- package/src/sap/fe/core/services/NavigationServiceFactory.js +3 -320
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +91 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -89
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +817 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -847
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +6 -3
- package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +732 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +3 -752
- package/src/sap/fe/core/services/ShellServicesFactory.js.map +1 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +569 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +3 -599
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -3
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +355 -0
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +3 -387
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage-dbg.controller.js +37 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +3 -34
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js.map +1 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +3 -3
- package/src/sap/fe/core/support/CommonHelper-dbg.js +63 -0
- package/src/sap/fe/core/support/CommonHelper.js +3 -60
- package/src/sap/fe/core/support/CommonHelper.js.map +1 -0
- package/src/sap/fe/core/support/Diagnostics-dbg.js +44 -0
- package/src/sap/fe/core/support/Diagnostics.js +3 -49
- package/src/sap/fe/core/support/Diagnostics.js.map +1 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +3 -3
- package/src/sap/fe/core/templating/CommonFormatters-dbg.js +70 -0
- package/src/sap/fe/core/templating/CommonFormatters.js +3 -66
- package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +9 -3
- package/src/sap/fe/core/templating/CriticalityFormatters-dbg.js +136 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +3 -133
- package/src/sap/fe/core/templating/CriticalityFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/DataFieldFormatters-dbg.js +58 -0
- package/src/sap/fe/core/templating/DataFieldFormatters.js +3 -55
- package/src/sap/fe/core/templating/DataFieldFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +363 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +3 -372
- package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +17 -8
- package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +56 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +3 -124
- package/src/sap/fe/core/templating/DisplayModeFormatter.js.map +1 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +0 -47
- package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +68 -0
- package/src/sap/fe/core/templating/EntitySetHelper.js +3 -81
- package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -0
- package/src/sap/fe/core/templating/FieldControlHelper-dbg.js +77 -0
- package/src/sap/fe/core/templating/FieldControlHelper.js +3 -74
- package/src/sap/fe/core/templating/FieldControlHelper.js.map +1 -0
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +346 -0
- package/src/sap/fe/core/templating/FilterHelper.js +3 -339
- package/src/sap/fe/core/templating/FilterHelper.js.map +1 -0
- package/src/sap/fe/core/templating/FilterHelper.ts +2 -21
- package/src/sap/fe/core/templating/FilterTemplating-dbg.js +62 -0
- package/src/sap/fe/core/templating/FilterTemplating.js +3 -59
- package/src/sap/fe/core/templating/FilterTemplating.js.map +1 -0
- package/src/sap/fe/core/templating/PropertyFormatters-dbg.js +93 -0
- package/src/sap/fe/core/templating/PropertyFormatters.js +3 -90
- package/src/sap/fe/core/templating/PropertyFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +340 -0
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -337
- package/src/sap/fe/core/templating/PropertyHelper.js.map +1 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper-dbg.js +91 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +3 -43
- package/src/sap/fe/core/templating/SemanticObjectHelper.js.map +1 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +45 -1
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +498 -0
- package/src/sap/fe/core/templating/UIFormatters.js +3 -544
- package/src/sap/fe/core/templating/UIFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/UIFormatters.ts +60 -110
- package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +35 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -33
- package/src/sap/fe/core/type/DateTimeWithTimezone.js.map +1 -0
- package/src/sap/fe/core/type/EDM-dbg.js +84 -0
- package/src/sap/fe/core/type/EDM.js +6 -0
- package/src/sap/fe/core/type/EDM.js.map +1 -0
- package/src/sap/fe/core/type/EDM.ts +70 -0
- package/src/sap/fe/core/type/Email-dbg.js +29 -0
- package/src/sap/fe/core/type/Email.js +3 -26
- package/src/sap/fe/core/type/Email.js.map +1 -0
- package/src/sap/fe/core/type/FiscalDate-dbg.js +174 -0
- package/src/sap/fe/core/type/FiscalDate.js +6 -0
- package/src/sap/fe/core/type/FiscalDate.js.map +1 -0
- package/src/sap/fe/core/type/FiscalDate.ts +179 -0
- package/src/sap/fe/core/type/TypeUtil-dbg.js +58 -0
- package/src/sap/fe/core/type/TypeUtil.js +3 -55
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -0
- package/src/sap/fe/core/type/TypeUtil.ts +1 -0
- package/src/.eslintrc +0 -7
|
@@ -1,1614 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
* (c) Copyright 2009-
|
|
3
|
+
* (c) Copyright 2009-2023 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var _exports = {};
|
|
9
|
-
var resolveEnumValue = AnnotationEnum.resolveEnumValue;
|
|
10
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
11
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
12
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
13
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
14
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
15
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
16
|
-
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
17
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
18
|
-
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
19
|
-
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
20
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
21
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
22
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
23
|
-
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
24
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
25
|
-
var unresolveableExpression = {
|
|
26
|
-
_type: "Unresolvable"
|
|
27
|
-
};
|
|
28
|
-
_exports.unresolveableExpression = unresolveableExpression;
|
|
29
|
-
function escapeXmlAttribute(inputString) {
|
|
30
|
-
return inputString.replace(/'/g, "\\'");
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Typeguard to ensure that the given expression is a binding toolkit expression.
|
|
35
|
-
*
|
|
36
|
-
* @param expression
|
|
37
|
-
* @returns `true` if the expression is a binding toolkit expression
|
|
38
|
-
*/
|
|
39
|
-
function isBindingToolkitExpression(expression) {
|
|
40
|
-
return (expression === null || expression === void 0 ? void 0 : expression._type) !== undefined;
|
|
41
|
-
}
|
|
42
|
-
_exports.isBindingToolkitExpression = isBindingToolkitExpression;
|
|
43
|
-
function hasUnresolveableExpression() {
|
|
44
|
-
for (var _len = arguments.length, expressions = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
45
|
-
expressions[_key] = arguments[_key];
|
|
46
|
-
}
|
|
47
|
-
return expressions.find(function (expr) {
|
|
48
|
-
return expr._type === "Unresolvable";
|
|
49
|
-
}) !== undefined;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Check two expressions for (deep) equality.
|
|
53
|
-
*
|
|
54
|
-
* @param a
|
|
55
|
-
* @param b
|
|
56
|
-
* @returns `true` if the two expressions are equal
|
|
57
|
-
* @private
|
|
58
|
-
*/
|
|
59
|
-
_exports.hasUnresolveableExpression = hasUnresolveableExpression;
|
|
60
|
-
function _checkExpressionsAreEqual(a, b) {
|
|
61
|
-
if (a._type !== b._type) {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
switch (a._type) {
|
|
65
|
-
case "Unresolvable":
|
|
66
|
-
return false;
|
|
67
|
-
// Unresolvable is never equal to anything even itself
|
|
68
|
-
case "Constant":
|
|
69
|
-
case "EmbeddedBinding":
|
|
70
|
-
case "EmbeddedExpressionBinding":
|
|
71
|
-
return a.value === b.value;
|
|
72
|
-
case "Not":
|
|
73
|
-
return _checkExpressionsAreEqual(a.operand, b.operand);
|
|
74
|
-
case "Truthy":
|
|
75
|
-
return _checkExpressionsAreEqual(a.operand, b.operand);
|
|
76
|
-
case "Set":
|
|
77
|
-
return a.operator === b.operator && a.operands.length === b.operands.length && a.operands.every(function (expression) {
|
|
78
|
-
return b.operands.some(function (otherExpression) {
|
|
79
|
-
return _checkExpressionsAreEqual(expression, otherExpression);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
case "IfElse":
|
|
83
|
-
return _checkExpressionsAreEqual(a.condition, b.condition) && _checkExpressionsAreEqual(a.onTrue, b.onTrue) && _checkExpressionsAreEqual(a.onFalse, b.onFalse);
|
|
84
|
-
case "Comparison":
|
|
85
|
-
return a.operator === b.operator && _checkExpressionsAreEqual(a.operand1, b.operand1) && _checkExpressionsAreEqual(a.operand2, b.operand2);
|
|
86
|
-
case "Concat":
|
|
87
|
-
var aExpressions = a.expressions;
|
|
88
|
-
var bExpressions = b.expressions;
|
|
89
|
-
if (aExpressions.length !== bExpressions.length) {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
return aExpressions.every(function (expression, index) {
|
|
93
|
-
return _checkExpressionsAreEqual(expression, bExpressions[index]);
|
|
94
|
-
});
|
|
95
|
-
case "Length":
|
|
96
|
-
return _checkExpressionsAreEqual(a.pathInModel, b.pathInModel);
|
|
97
|
-
case "PathInModel":
|
|
98
|
-
return a.modelName === b.modelName && a.path === b.path && a.targetEntitySet === b.targetEntitySet;
|
|
99
|
-
case "Formatter":
|
|
100
|
-
return a.fn === b.fn && a.parameters.length === b.parameters.length && a.parameters.every(function (value, index) {
|
|
101
|
-
return _checkExpressionsAreEqual(b.parameters[index], value);
|
|
102
|
-
});
|
|
103
|
-
case "ComplexType":
|
|
104
|
-
return a.type === b.type && a.bindingParameters.length === b.bindingParameters.length && a.bindingParameters.every(function (value, index) {
|
|
105
|
-
return _checkExpressionsAreEqual(b.bindingParameters[index], value);
|
|
106
|
-
});
|
|
107
|
-
case "Function":
|
|
108
|
-
var otherFunction = b;
|
|
109
|
-
if (a.obj === undefined || otherFunction.obj === undefined) {
|
|
110
|
-
return a.obj === otherFunction;
|
|
111
|
-
}
|
|
112
|
-
return a.fn === otherFunction.fn && _checkExpressionsAreEqual(a.obj, otherFunction.obj) && a.parameters.length === otherFunction.parameters.length && a.parameters.every(function (value, index) {
|
|
113
|
-
return _checkExpressionsAreEqual(otherFunction.parameters[index], value);
|
|
114
|
-
});
|
|
115
|
-
case "Ref":
|
|
116
|
-
return a.ref === b.ref;
|
|
117
|
-
}
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Converts a nested SetExpression by inlining operands of type SetExpression with the same operator.
|
|
123
|
-
*
|
|
124
|
-
* @param expression The expression to flatten
|
|
125
|
-
* @returns A new SetExpression with the same operator
|
|
126
|
-
*/
|
|
127
|
-
_exports._checkExpressionsAreEqual = _checkExpressionsAreEqual;
|
|
128
|
-
function flattenSetExpression(expression) {
|
|
129
|
-
return expression.operands.reduce(function (result, operand) {
|
|
130
|
-
var candidatesForFlattening = operand._type === "Set" && operand.operator === expression.operator ? operand.operands : [operand];
|
|
131
|
-
candidatesForFlattening.forEach(function (candidate) {
|
|
132
|
-
if (result.operands.every(function (e) {
|
|
133
|
-
return !_checkExpressionsAreEqual(e, candidate);
|
|
134
|
-
})) {
|
|
135
|
-
result.operands.push(candidate);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
return result;
|
|
139
|
-
}, {
|
|
140
|
-
_type: "Set",
|
|
141
|
-
operator: expression.operator,
|
|
142
|
-
operands: []
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Detects whether an array of boolean expressions contains an expression and its negation.
|
|
148
|
-
*
|
|
149
|
-
* @param expressions Array of expressions
|
|
150
|
-
* @returns `true` if the set of expressions contains an expression and its negation
|
|
151
|
-
*/
|
|
152
|
-
function hasOppositeExpressions(expressions) {
|
|
153
|
-
var negatedExpressions = expressions.map(not);
|
|
154
|
-
return expressions.some(function (expression, index) {
|
|
155
|
-
for (var i = index + 1; i < negatedExpressions.length; i++) {
|
|
156
|
-
if (_checkExpressionsAreEqual(expression, negatedExpressions[i])) {
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return false;
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Logical `and` expression.
|
|
166
|
-
*
|
|
167
|
-
* The expression is simplified to false if this can be decided statically (that is, if one operand is a constant
|
|
168
|
-
* false or if the expression contains an operand and its negation).
|
|
169
|
-
*
|
|
170
|
-
* @param operands Expressions to connect by `and`
|
|
171
|
-
* @returns Expression evaluating to boolean
|
|
172
|
-
*/
|
|
173
|
-
function and() {
|
|
174
|
-
for (var _len2 = arguments.length, operands = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
175
|
-
operands[_key2] = arguments[_key2];
|
|
176
|
-
}
|
|
177
|
-
var expressions = flattenSetExpression({
|
|
178
|
-
_type: "Set",
|
|
179
|
-
operator: "&&",
|
|
180
|
-
operands: operands.map(wrapPrimitive)
|
|
181
|
-
}).operands;
|
|
182
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
|
|
183
|
-
return unresolveableExpression;
|
|
184
|
-
}
|
|
185
|
-
var isStaticFalse = false;
|
|
186
|
-
var nonTrivialExpression = expressions.filter(function (expression) {
|
|
187
|
-
if (isFalse(expression)) {
|
|
188
|
-
isStaticFalse = true;
|
|
189
|
-
}
|
|
190
|
-
return !isConstant(expression);
|
|
191
|
-
});
|
|
192
|
-
if (isStaticFalse) {
|
|
193
|
-
return constant(false);
|
|
194
|
-
} else if (nonTrivialExpression.length === 0) {
|
|
195
|
-
// Resolve the constant then
|
|
196
|
-
var isValid = expressions.reduce(function (result, expression) {
|
|
197
|
-
return result && isTrue(expression);
|
|
198
|
-
}, true);
|
|
199
|
-
return constant(isValid);
|
|
200
|
-
} else if (nonTrivialExpression.length === 1) {
|
|
201
|
-
return nonTrivialExpression[0];
|
|
202
|
-
} else if (hasOppositeExpressions(nonTrivialExpression)) {
|
|
203
|
-
return constant(false);
|
|
204
|
-
} else {
|
|
205
|
-
return {
|
|
206
|
-
_type: "Set",
|
|
207
|
-
operator: "&&",
|
|
208
|
-
operands: nonTrivialExpression
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Logical `or` expression.
|
|
215
|
-
*
|
|
216
|
-
* The expression is simplified to true if this can be decided statically (that is, if one operand is a constant
|
|
217
|
-
* true or if the expression contains an operand and its negation).
|
|
218
|
-
*
|
|
219
|
-
* @param operands Expressions to connect by `or`
|
|
220
|
-
* @returns Expression evaluating to boolean
|
|
221
|
-
*/
|
|
222
|
-
_exports.and = and;
|
|
223
|
-
function or() {
|
|
224
|
-
for (var _len3 = arguments.length, operands = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
225
|
-
operands[_key3] = arguments[_key3];
|
|
226
|
-
}
|
|
227
|
-
var expressions = flattenSetExpression({
|
|
228
|
-
_type: "Set",
|
|
229
|
-
operator: "||",
|
|
230
|
-
operands: operands.map(wrapPrimitive)
|
|
231
|
-
}).operands;
|
|
232
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
|
|
233
|
-
return unresolveableExpression;
|
|
234
|
-
}
|
|
235
|
-
var isStaticTrue = false;
|
|
236
|
-
var nonTrivialExpression = expressions.filter(function (expression) {
|
|
237
|
-
if (isTrue(expression)) {
|
|
238
|
-
isStaticTrue = true;
|
|
239
|
-
}
|
|
240
|
-
return !isConstant(expression) || expression.value;
|
|
241
|
-
});
|
|
242
|
-
if (isStaticTrue) {
|
|
243
|
-
return constant(true);
|
|
244
|
-
} else if (nonTrivialExpression.length === 0) {
|
|
245
|
-
// Resolve the constant then
|
|
246
|
-
var isValid = expressions.reduce(function (result, expression) {
|
|
247
|
-
return result && isTrue(expression);
|
|
248
|
-
}, true);
|
|
249
|
-
return constant(isValid);
|
|
250
|
-
} else if (nonTrivialExpression.length === 1) {
|
|
251
|
-
return nonTrivialExpression[0];
|
|
252
|
-
} else if (hasOppositeExpressions(nonTrivialExpression)) {
|
|
253
|
-
return constant(true);
|
|
254
|
-
} else {
|
|
255
|
-
return {
|
|
256
|
-
_type: "Set",
|
|
257
|
-
operator: "||",
|
|
258
|
-
operands: nonTrivialExpression
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Logical `not` operator.
|
|
265
|
-
*
|
|
266
|
-
* @param operand The expression to reverse
|
|
267
|
-
* @returns The resulting expression that evaluates to boolean
|
|
268
|
-
*/
|
|
269
|
-
_exports.or = or;
|
|
270
|
-
function not(operand) {
|
|
271
|
-
operand = wrapPrimitive(operand);
|
|
272
|
-
if (hasUnresolveableExpression(operand)) {
|
|
273
|
-
return unresolveableExpression;
|
|
274
|
-
} else if (isConstant(operand)) {
|
|
275
|
-
return constant(!operand.value);
|
|
276
|
-
} else if (typeof operand === "object" && operand._type === "Set" && operand.operator === "||" && operand.operands.every(function (expression) {
|
|
277
|
-
return isConstant(expression) || isComparison(expression);
|
|
278
|
-
})) {
|
|
279
|
-
return and.apply(void 0, _toConsumableArray(operand.operands.map(function (expression) {
|
|
280
|
-
return not(expression);
|
|
281
|
-
})));
|
|
282
|
-
} else if (typeof operand === "object" && operand._type === "Set" && operand.operator === "&&" && operand.operands.every(function (expression) {
|
|
283
|
-
return isConstant(expression) || isComparison(expression);
|
|
284
|
-
})) {
|
|
285
|
-
return or.apply(void 0, _toConsumableArray(operand.operands.map(function (expression) {
|
|
286
|
-
return not(expression);
|
|
287
|
-
})));
|
|
288
|
-
} else if (isComparison(operand)) {
|
|
289
|
-
// Create the reverse comparison
|
|
290
|
-
switch (operand.operator) {
|
|
291
|
-
case "!==":
|
|
292
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
293
|
-
operator: "==="
|
|
294
|
-
});
|
|
295
|
-
case "<":
|
|
296
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
297
|
-
operator: ">="
|
|
298
|
-
});
|
|
299
|
-
case "<=":
|
|
300
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
301
|
-
operator: ">"
|
|
302
|
-
});
|
|
303
|
-
case "===":
|
|
304
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
305
|
-
operator: "!=="
|
|
306
|
-
});
|
|
307
|
-
case ">":
|
|
308
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
309
|
-
operator: "<="
|
|
310
|
-
});
|
|
311
|
-
case ">=":
|
|
312
|
-
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
313
|
-
operator: "<"
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
} else if (operand._type === "Not") {
|
|
317
|
-
return operand.operand;
|
|
318
|
-
}
|
|
319
|
-
return {
|
|
320
|
-
_type: "Not",
|
|
321
|
-
operand: operand
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Evaluates whether a binding expression is equal to true with a loose equality.
|
|
327
|
-
*
|
|
328
|
-
* @param operand The expression to check
|
|
329
|
-
* @returns The resulting expression that evaluates to boolean
|
|
330
|
-
*/
|
|
331
|
-
_exports.not = not;
|
|
332
|
-
function isTruthy(operand) {
|
|
333
|
-
if (isConstant(operand)) {
|
|
334
|
-
return constant(!!operand.value);
|
|
335
|
-
} else {
|
|
336
|
-
return {
|
|
337
|
-
_type: "Truthy",
|
|
338
|
-
operand: operand
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Creates a binding expression that will be evaluated by the corresponding model.
|
|
345
|
-
*
|
|
346
|
-
* @param path
|
|
347
|
-
* @param modelName
|
|
348
|
-
* @param visitedNavigationPaths
|
|
349
|
-
* @param pathVisitor
|
|
350
|
-
* @returns An expression representating that path in the model
|
|
351
|
-
* @deprecated use pathInModel instead
|
|
352
|
-
*/
|
|
353
|
-
_exports.isTruthy = isTruthy;
|
|
354
|
-
function bindingExpression(path, modelName) {
|
|
355
|
-
var visitedNavigationPaths = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
356
|
-
var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
|
|
357
|
-
return pathInModel(path, modelName, visitedNavigationPaths, pathVisitor);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Creates a binding expression that will be evaluated by the corresponding model.
|
|
362
|
-
*
|
|
363
|
-
* @template TargetType
|
|
364
|
-
* @param path The path on the model
|
|
365
|
-
* @param [modelName] The name of the model
|
|
366
|
-
* @param [visitedNavigationPaths] The paths from the root entitySet
|
|
367
|
-
* @param [pathVisitor] A function to modify the resulting path
|
|
368
|
-
* @returns An expression representating that path in the model
|
|
369
|
-
*/
|
|
370
|
-
_exports.bindingExpression = bindingExpression;
|
|
371
|
-
function pathInModel(path, modelName) {
|
|
372
|
-
var visitedNavigationPaths = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
373
|
-
var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
|
|
374
|
-
if (path === undefined) {
|
|
375
|
-
return unresolveableExpression;
|
|
376
|
-
}
|
|
377
|
-
var targetPath;
|
|
378
|
-
if (pathVisitor) {
|
|
379
|
-
targetPath = pathVisitor(path);
|
|
380
|
-
if (targetPath === undefined) {
|
|
381
|
-
return unresolveableExpression;
|
|
382
|
-
}
|
|
383
|
-
} else {
|
|
384
|
-
var localPath = visitedNavigationPaths.concat();
|
|
385
|
-
localPath.push(path);
|
|
386
|
-
targetPath = localPath.join("/");
|
|
387
|
-
}
|
|
388
|
-
return {
|
|
389
|
-
_type: "PathInModel",
|
|
390
|
-
modelName: modelName,
|
|
391
|
-
path: targetPath
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
_exports.pathInModel = pathInModel;
|
|
395
|
-
/**
|
|
396
|
-
* Creates a constant expression based on a primitive value.
|
|
397
|
-
*
|
|
398
|
-
* @template T
|
|
399
|
-
* @param value The constant to wrap in an expression
|
|
400
|
-
* @returns The constant expression
|
|
401
|
-
*/
|
|
402
|
-
function constant(value) {
|
|
403
|
-
var constantValue;
|
|
404
|
-
if (typeof value === "object" && value !== null && value !== undefined) {
|
|
405
|
-
if (Array.isArray(value)) {
|
|
406
|
-
constantValue = value.map(wrapPrimitive);
|
|
407
|
-
} else if (isPrimitiveObject(value)) {
|
|
408
|
-
constantValue = value.valueOf();
|
|
409
|
-
} else {
|
|
410
|
-
constantValue = Object.entries(value).reduce(function (plainExpression, _ref) {
|
|
411
|
-
var _ref2 = _slicedToArray(_ref, 2),
|
|
412
|
-
key = _ref2[0],
|
|
413
|
-
val = _ref2[1];
|
|
414
|
-
var wrappedValue = wrapPrimitive(val);
|
|
415
|
-
if (wrappedValue._type !== "Constant" || wrappedValue.value !== undefined) {
|
|
416
|
-
plainExpression[key] = wrappedValue;
|
|
417
|
-
}
|
|
418
|
-
return plainExpression;
|
|
419
|
-
}, {});
|
|
420
|
-
}
|
|
421
|
-
} else {
|
|
422
|
-
constantValue = value;
|
|
423
|
-
}
|
|
424
|
-
return {
|
|
425
|
-
_type: "Constant",
|
|
426
|
-
value: constantValue
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
|
-
_exports.constant = constant;
|
|
430
|
-
function resolveBindingString(value, targetType) {
|
|
431
|
-
if (value !== undefined && typeof value === "string" && value.startsWith("{")) {
|
|
432
|
-
if (value.startsWith("{=")) {
|
|
433
|
-
// Expression binding, we can just remove the outer binding things
|
|
434
|
-
return {
|
|
435
|
-
_type: "EmbeddedExpressionBinding",
|
|
436
|
-
value: value
|
|
437
|
-
};
|
|
438
|
-
} else {
|
|
439
|
-
return {
|
|
440
|
-
_type: "EmbeddedBinding",
|
|
441
|
-
value: value
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
} else if (targetType === "boolean" && typeof value === "string" && (value === "true" || value === "false")) {
|
|
445
|
-
return constant(value === "true");
|
|
446
|
-
} else if (targetType === "number" && typeof value === "string" && (!isNaN(Number(value)) || value === "NaN")) {
|
|
447
|
-
return constant(Number(value));
|
|
448
|
-
} else {
|
|
449
|
-
return constant(value);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/**
|
|
454
|
-
* A named reference.
|
|
455
|
-
*
|
|
456
|
-
* @see fn
|
|
457
|
-
* @param reference Reference
|
|
458
|
-
* @returns The object reference binding part
|
|
459
|
-
*/
|
|
460
|
-
_exports.resolveBindingString = resolveBindingString;
|
|
461
|
-
function ref(reference) {
|
|
462
|
-
return {
|
|
463
|
-
_type: "Ref",
|
|
464
|
-
ref: reference
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
/**
|
|
469
|
-
* Determine whether the type is an expression.
|
|
470
|
-
*
|
|
471
|
-
* Every object having a property named `_type` of some value is considered an expression, even if there is actually
|
|
472
|
-
* no such expression type supported.
|
|
473
|
-
*
|
|
474
|
-
* @param something Type to check
|
|
475
|
-
* @returns `true` if the type is considered to be an expression
|
|
476
|
-
*/
|
|
477
|
-
_exports.ref = ref;
|
|
478
|
-
function isExpression(something) {
|
|
479
|
-
return something !== null && typeof something === "object" && something._type !== undefined;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/**
|
|
483
|
-
* Wrap a primitive into a constant expression if it is not already an expression.
|
|
484
|
-
*
|
|
485
|
-
* @template T
|
|
486
|
-
* @param something The object to wrap in a Constant expression
|
|
487
|
-
* @returns Either the original object or the wrapped one depending on the case
|
|
488
|
-
*/
|
|
489
|
-
function wrapPrimitive(something) {
|
|
490
|
-
if (isExpression(something)) {
|
|
491
|
-
return something;
|
|
492
|
-
}
|
|
493
|
-
return constant(something);
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
/**
|
|
497
|
-
* Checks if the expression or value provided is constant or not.
|
|
498
|
-
*
|
|
499
|
-
* @template T The target type
|
|
500
|
-
* @param maybeConstant The expression or primitive value that is to be checked
|
|
501
|
-
* @returns `true` if it is constant
|
|
502
|
-
*/
|
|
503
|
-
function isConstant(maybeConstant) {
|
|
504
|
-
return typeof maybeConstant !== "object" || maybeConstant._type === "Constant";
|
|
505
|
-
}
|
|
506
|
-
_exports.isConstant = isConstant;
|
|
507
|
-
function isTrue(expression) {
|
|
508
|
-
return isConstant(expression) && expression.value === true;
|
|
509
|
-
}
|
|
510
|
-
function isFalse(expression) {
|
|
511
|
-
return isConstant(expression) && expression.value === false;
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/**
|
|
515
|
-
* Checks if the expression or value provided is a path in model expression or not.
|
|
516
|
-
*
|
|
517
|
-
* @template T The target type
|
|
518
|
-
* @param maybeBinding The expression or primitive value that is to be checked
|
|
519
|
-
* @returns `true` if it is a path in model expression
|
|
520
|
-
*/
|
|
521
|
-
function isPathInModelExpression(maybeBinding) {
|
|
522
|
-
return typeof maybeBinding === "object" && maybeBinding._type === "PathInModel";
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
/**
|
|
526
|
-
* Checks if the expression or value provided is a complex type expression.
|
|
527
|
-
*
|
|
528
|
-
* @template T The target type
|
|
529
|
-
* @param maybeBinding The expression or primitive value that is to be checked
|
|
530
|
-
* @returns `true` if it is a path in model expression
|
|
531
|
-
*/
|
|
532
|
-
_exports.isPathInModelExpression = isPathInModelExpression;
|
|
533
|
-
function isComplexTypeExpression(maybeBinding) {
|
|
534
|
-
return typeof maybeBinding === "object" && maybeBinding._type === "ComplexType";
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
/**
|
|
538
|
-
* Checks if the expression or value provided is a concat expression or not.
|
|
539
|
-
*
|
|
540
|
-
* @param expression
|
|
541
|
-
* @returns `true` if the expression is a ConcatExpression
|
|
542
|
-
*/
|
|
543
|
-
_exports.isComplexTypeExpression = isComplexTypeExpression;
|
|
544
|
-
function isConcatExpression(expression) {
|
|
545
|
-
return typeof expression === "object" && expression._type === "Concat";
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
/**
|
|
549
|
-
* Checks if the expression provided is a comparison or not.
|
|
550
|
-
*
|
|
551
|
-
* @template T The target type
|
|
552
|
-
* @param expression The expression
|
|
553
|
-
* @returns `true` if the expression is a ComparisonExpression
|
|
554
|
-
*/
|
|
555
|
-
function isComparison(expression) {
|
|
556
|
-
return expression._type === "Comparison";
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
/**
|
|
560
|
-
* Checks whether the input parameter is a constant expression of type undefined.
|
|
561
|
-
*
|
|
562
|
-
* @param expression The input expression or object in general
|
|
563
|
-
* @returns `true` if the input is constant which has undefined for value
|
|
564
|
-
*/
|
|
565
|
-
function isUndefinedExpression(expression) {
|
|
566
|
-
var expressionAsExpression = expression;
|
|
567
|
-
return (expressionAsExpression === null || expressionAsExpression === void 0 ? void 0 : expressionAsExpression._type) === "Constant" && (expressionAsExpression === null || expressionAsExpression === void 0 ? void 0 : expressionAsExpression.value) === undefined;
|
|
568
|
-
}
|
|
569
|
-
_exports.isUndefinedExpression = isUndefinedExpression;
|
|
570
|
-
function isPrimitiveObject(objectType) {
|
|
571
|
-
switch (objectType.constructor.name) {
|
|
572
|
-
case "String":
|
|
573
|
-
case "Number":
|
|
574
|
-
case "Boolean":
|
|
575
|
-
return true;
|
|
576
|
-
default:
|
|
577
|
-
return false;
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
/**
|
|
581
|
-
* Check if the passed annotation annotationValue is a ComplexAnnotationExpression.
|
|
582
|
-
*
|
|
583
|
-
* @template T The target type
|
|
584
|
-
* @param annotationValue The annotation annotationValue to evaluate
|
|
585
|
-
* @returns `true` if the object is a {ComplexAnnotationExpression}
|
|
586
|
-
*/
|
|
587
|
-
function isComplexAnnotationExpression(annotationValue) {
|
|
588
|
-
return typeof annotationValue === "object" && !isPrimitiveObject(annotationValue);
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
/**
|
|
592
|
-
* Generate the corresponding annotationValue for a given annotation annotationValue.
|
|
593
|
-
*
|
|
594
|
-
* @template T The target type
|
|
595
|
-
* @param annotationValue The source annotation annotationValue
|
|
596
|
-
* @param visitedNavigationPaths The path from the root entity set
|
|
597
|
-
* @param defaultValue Default value if the annotationValue is undefined
|
|
598
|
-
* @param pathVisitor A function to modify the resulting path
|
|
599
|
-
* @returns The annotationValue equivalent to that annotation annotationValue
|
|
600
|
-
* @deprecated use getExpressionFromAnnotation instead
|
|
601
|
-
*/
|
|
602
|
-
function annotationExpression(annotationValue) {
|
|
603
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
604
|
-
var defaultValue = arguments.length > 2 ? arguments[2] : undefined;
|
|
605
|
-
var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
|
|
606
|
-
return getExpressionFromAnnotation(annotationValue, visitedNavigationPaths, defaultValue, pathVisitor);
|
|
607
|
-
}
|
|
608
|
-
/**
|
|
609
|
-
* Generate the corresponding annotationValue for a given annotation annotationValue.
|
|
610
|
-
*
|
|
611
|
-
* @template T The target type
|
|
612
|
-
* @param annotationValue The source annotation annotationValue
|
|
613
|
-
* @param visitedNavigationPaths The path from the root entity set
|
|
614
|
-
* @param defaultValue Default value if the annotationValue is undefined
|
|
615
|
-
* @param pathVisitor A function to modify the resulting path
|
|
616
|
-
* @returns The annotationValue equivalent to that annotation annotationValue
|
|
617
|
-
*/
|
|
618
|
-
_exports.annotationExpression = annotationExpression;
|
|
619
|
-
function getExpressionFromAnnotation(annotationValue) {
|
|
620
|
-
var _annotationValue;
|
|
621
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
622
|
-
var defaultValue = arguments.length > 2 ? arguments[2] : undefined;
|
|
623
|
-
var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
|
|
624
|
-
if (annotationValue === undefined) {
|
|
625
|
-
return wrapPrimitive(defaultValue);
|
|
626
|
-
}
|
|
627
|
-
annotationValue = (_annotationValue = annotationValue) === null || _annotationValue === void 0 ? void 0 : _annotationValue.valueOf();
|
|
628
|
-
if (!isComplexAnnotationExpression(annotationValue)) {
|
|
629
|
-
return constant(annotationValue);
|
|
630
|
-
}
|
|
631
|
-
switch (annotationValue.type) {
|
|
632
|
-
case "Path":
|
|
633
|
-
return pathInModel(annotationValue.path, undefined, visitedNavigationPaths, pathVisitor);
|
|
634
|
-
case "If":
|
|
635
|
-
return annotationIfExpression(annotationValue.If, visitedNavigationPaths, pathVisitor);
|
|
636
|
-
case "Not":
|
|
637
|
-
return not(parseAnnotationCondition(annotationValue.Not, visitedNavigationPaths, pathVisitor));
|
|
638
|
-
case "Eq":
|
|
639
|
-
return equal(parseAnnotationCondition(annotationValue.Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Eq[1], visitedNavigationPaths, pathVisitor));
|
|
640
|
-
case "Ne":
|
|
641
|
-
return notEqual(parseAnnotationCondition(annotationValue.Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ne[1], visitedNavigationPaths, pathVisitor));
|
|
642
|
-
case "Gt":
|
|
643
|
-
return greaterThan(parseAnnotationCondition(annotationValue.Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Gt[1], visitedNavigationPaths, pathVisitor));
|
|
644
|
-
case "Ge":
|
|
645
|
-
return greaterOrEqual(parseAnnotationCondition(annotationValue.Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ge[1], visitedNavigationPaths, pathVisitor));
|
|
646
|
-
case "Lt":
|
|
647
|
-
return lessThan(parseAnnotationCondition(annotationValue.Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Lt[1], visitedNavigationPaths, pathVisitor));
|
|
648
|
-
case "Le":
|
|
649
|
-
return lessOrEqual(parseAnnotationCondition(annotationValue.Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Le[1], visitedNavigationPaths, pathVisitor));
|
|
650
|
-
case "Or":
|
|
651
|
-
return or.apply(void 0, _toConsumableArray(annotationValue.Or.map(function (orCondition) {
|
|
652
|
-
return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
|
|
653
|
-
})));
|
|
654
|
-
case "And":
|
|
655
|
-
return and.apply(void 0, _toConsumableArray(annotationValue.And.map(function (andCondition) {
|
|
656
|
-
return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
|
|
657
|
-
})));
|
|
658
|
-
case "Apply":
|
|
659
|
-
return annotationApplyExpression(annotationValue, visitedNavigationPaths, pathVisitor);
|
|
660
|
-
}
|
|
661
|
-
return unresolveableExpression;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
/**
|
|
665
|
-
* Parse the annotation condition into an expression.
|
|
666
|
-
*
|
|
667
|
-
* @template T The target type
|
|
668
|
-
* @param annotationValue The condition or value from the annotation
|
|
669
|
-
* @param visitedNavigationPaths The path from the root entity set
|
|
670
|
-
* @param pathVisitor A function to modify the resulting path
|
|
671
|
-
* @returns An equivalent expression
|
|
672
|
-
*/
|
|
673
|
-
_exports.getExpressionFromAnnotation = getExpressionFromAnnotation;
|
|
674
|
-
function parseAnnotationCondition(annotationValue) {
|
|
675
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
676
|
-
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
677
|
-
if (annotationValue === null || typeof annotationValue !== "object") {
|
|
678
|
-
return constant(annotationValue);
|
|
679
|
-
} else if (annotationValue.hasOwnProperty("$Or")) {
|
|
680
|
-
return or.apply(void 0, _toConsumableArray(annotationValue.$Or.map(function (orCondition) {
|
|
681
|
-
return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
|
|
682
|
-
})));
|
|
683
|
-
} else if (annotationValue.hasOwnProperty("$And")) {
|
|
684
|
-
return and.apply(void 0, _toConsumableArray(annotationValue.$And.map(function (andCondition) {
|
|
685
|
-
return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
|
|
686
|
-
})));
|
|
687
|
-
} else if (annotationValue.hasOwnProperty("$Not")) {
|
|
688
|
-
return not(parseAnnotationCondition(annotationValue.$Not, visitedNavigationPaths, pathVisitor));
|
|
689
|
-
} else if (annotationValue.hasOwnProperty("$Eq")) {
|
|
690
|
-
return equal(parseAnnotationCondition(annotationValue.$Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Eq[1], visitedNavigationPaths, pathVisitor));
|
|
691
|
-
} else if (annotationValue.hasOwnProperty("$Ne")) {
|
|
692
|
-
return notEqual(parseAnnotationCondition(annotationValue.$Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Ne[1], visitedNavigationPaths, pathVisitor));
|
|
693
|
-
} else if (annotationValue.hasOwnProperty("$Gt")) {
|
|
694
|
-
return greaterThan(parseAnnotationCondition(annotationValue.$Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Gt[1], visitedNavigationPaths, pathVisitor));
|
|
695
|
-
} else if (annotationValue.hasOwnProperty("$Ge")) {
|
|
696
|
-
return greaterOrEqual(parseAnnotationCondition(annotationValue.$Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Ge[1], visitedNavigationPaths, pathVisitor));
|
|
697
|
-
} else if (annotationValue.hasOwnProperty("$Lt")) {
|
|
698
|
-
return lessThan(parseAnnotationCondition(annotationValue.$Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Lt[1], visitedNavigationPaths, pathVisitor));
|
|
699
|
-
} else if (annotationValue.hasOwnProperty("$Le")) {
|
|
700
|
-
return lessOrEqual(parseAnnotationCondition(annotationValue.$Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.$Le[1], visitedNavigationPaths, pathVisitor));
|
|
701
|
-
} else if (annotationValue.hasOwnProperty("$Path")) {
|
|
702
|
-
return pathInModel(annotationValue.$Path, undefined, visitedNavigationPaths, pathVisitor);
|
|
703
|
-
} else if (annotationValue.hasOwnProperty("$Apply")) {
|
|
704
|
-
return getExpressionFromAnnotation({
|
|
705
|
-
type: "Apply",
|
|
706
|
-
Function: annotationValue.$Function,
|
|
707
|
-
Apply: annotationValue.$Apply
|
|
708
|
-
}, visitedNavigationPaths, undefined, pathVisitor);
|
|
709
|
-
} else if (annotationValue.hasOwnProperty("$If")) {
|
|
710
|
-
return getExpressionFromAnnotation({
|
|
711
|
-
type: "If",
|
|
712
|
-
If: annotationValue.$If
|
|
713
|
-
}, visitedNavigationPaths, undefined, pathVisitor);
|
|
714
|
-
} else if (annotationValue.hasOwnProperty("$EnumMember")) {
|
|
715
|
-
return constant(resolveEnumValue(annotationValue.$EnumMember));
|
|
716
|
-
}
|
|
717
|
-
return constant(false);
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
/**
|
|
721
|
-
* Process the {IfAnnotationExpressionValue} into an expression.
|
|
722
|
-
*
|
|
723
|
-
* @template T The target type
|
|
724
|
-
* @param annotationValue An If expression returning the type T
|
|
725
|
-
* @param visitedNavigationPaths The path from the root entity set
|
|
726
|
-
* @param pathVisitor A function to modify the resulting path
|
|
727
|
-
* @returns The equivalent ifElse expression
|
|
728
|
-
*/
|
|
729
|
-
function annotationIfExpression(annotationValue) {
|
|
730
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
731
|
-
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
732
|
-
return ifElse(parseAnnotationCondition(annotationValue[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[1], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[2], visitedNavigationPaths, pathVisitor));
|
|
733
|
-
}
|
|
734
|
-
_exports.annotationIfExpression = annotationIfExpression;
|
|
735
|
-
function annotationApplyExpression(applyExpression) {
|
|
736
|
-
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
737
|
-
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
738
|
-
switch (applyExpression.Function) {
|
|
739
|
-
case "odata.concat":
|
|
740
|
-
return concat.apply(void 0, _toConsumableArray(applyExpression.Apply.map(function (applyParam) {
|
|
741
|
-
var applyParamConverted = applyParam;
|
|
742
|
-
if (applyParam.hasOwnProperty("$Path")) {
|
|
743
|
-
applyParamConverted = {
|
|
744
|
-
type: "Path",
|
|
745
|
-
path: applyParam.$Path
|
|
746
|
-
};
|
|
747
|
-
} else if (applyParam.hasOwnProperty("$If")) {
|
|
748
|
-
applyParamConverted = {
|
|
749
|
-
type: "If",
|
|
750
|
-
If: applyParam.$If
|
|
751
|
-
};
|
|
752
|
-
} else if (applyParam.hasOwnProperty("$Apply")) {
|
|
753
|
-
applyParamConverted = {
|
|
754
|
-
type: "Apply",
|
|
755
|
-
Function: applyParam.$Function,
|
|
756
|
-
Apply: applyParam.$Apply
|
|
757
|
-
};
|
|
758
|
-
}
|
|
759
|
-
return getExpressionFromAnnotation(applyParamConverted, visitedNavigationPaths, undefined, pathVisitor);
|
|
760
|
-
})));
|
|
761
|
-
}
|
|
762
|
-
return unresolveableExpression;
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
/**
|
|
766
|
-
* Generic helper for the comparison operations (equal, notEqual, ...).
|
|
767
|
-
*
|
|
768
|
-
* @template T The target type
|
|
769
|
-
* @param operator The operator to apply
|
|
770
|
-
* @param leftOperand The operand on the left side of the operator
|
|
771
|
-
* @param rightOperand The operand on the right side of the operator
|
|
772
|
-
* @returns An expression representing the comparison
|
|
773
|
-
*/
|
|
774
|
-
_exports.annotationApplyExpression = annotationApplyExpression;
|
|
775
|
-
function comparison(operator, leftOperand, rightOperand) {
|
|
776
|
-
var leftExpression = wrapPrimitive(leftOperand);
|
|
777
|
-
var rightExpression = wrapPrimitive(rightOperand);
|
|
778
|
-
if (hasUnresolveableExpression(leftExpression, rightExpression)) {
|
|
779
|
-
return unresolveableExpression;
|
|
780
|
-
}
|
|
781
|
-
if (isConstant(leftExpression) && isConstant(rightExpression)) {
|
|
782
|
-
switch (operator) {
|
|
783
|
-
case "!==":
|
|
784
|
-
return constant(leftExpression.value !== rightExpression.value);
|
|
785
|
-
case "===":
|
|
786
|
-
return constant(leftExpression.value === rightExpression.value);
|
|
787
|
-
case "<":
|
|
788
|
-
return constant(leftExpression.value < rightExpression.value);
|
|
789
|
-
case "<=":
|
|
790
|
-
return constant(leftExpression.value <= rightExpression.value);
|
|
791
|
-
case ">":
|
|
792
|
-
return constant(leftExpression.value > rightExpression.value);
|
|
793
|
-
case ">=":
|
|
794
|
-
return constant(leftExpression.value >= rightExpression.value);
|
|
795
|
-
}
|
|
796
|
-
} else {
|
|
797
|
-
return {
|
|
798
|
-
_type: "Comparison",
|
|
799
|
-
operator: operator,
|
|
800
|
-
operand1: leftExpression,
|
|
801
|
-
operand2: rightExpression
|
|
802
|
-
};
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
function length(expression) {
|
|
806
|
-
if (expression._type === "Unresolvable") {
|
|
807
|
-
return expression;
|
|
808
|
-
}
|
|
809
|
-
return {
|
|
810
|
-
_type: "Length",
|
|
811
|
-
pathInModel: expression
|
|
812
|
-
};
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
/**
|
|
816
|
-
* Comparison: "equal" (===).
|
|
817
|
-
*
|
|
818
|
-
* @template T The target type
|
|
819
|
-
* @param leftOperand The operand on the left side
|
|
820
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
821
|
-
* @returns An expression representing the comparison
|
|
822
|
-
*/
|
|
823
|
-
_exports.length = length;
|
|
824
|
-
function equal(leftOperand, rightOperand) {
|
|
825
|
-
var _reduce;
|
|
826
|
-
var leftExpression = wrapPrimitive(leftOperand);
|
|
827
|
-
var rightExpression = wrapPrimitive(rightOperand);
|
|
828
|
-
if (hasUnresolveableExpression(leftExpression, rightExpression)) {
|
|
829
|
-
return unresolveableExpression;
|
|
830
|
-
}
|
|
831
|
-
if (_checkExpressionsAreEqual(leftExpression, rightExpression)) {
|
|
832
|
-
return constant(true);
|
|
833
|
-
}
|
|
834
|
-
function reduce(left, right) {
|
|
835
|
-
if (left._type === "Comparison" && isTrue(right)) {
|
|
836
|
-
// compare(a, b) === true ~~> compare(a, b)
|
|
837
|
-
return left;
|
|
838
|
-
} else if (left._type === "Comparison" && isFalse(right)) {
|
|
839
|
-
// compare(a, b) === false ~~> !compare(a, b)
|
|
840
|
-
return not(left);
|
|
841
|
-
} else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onTrue, right)) {
|
|
842
|
-
// (if (x) { a } else { b }) === a ~~> x || (b === a)
|
|
843
|
-
return or(left.condition, equal(left.onFalse, right));
|
|
844
|
-
} else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onFalse, right)) {
|
|
845
|
-
// (if (x) { a } else { b }) === b ~~> !x || (a === b)
|
|
846
|
-
return or(not(left.condition), equal(left.onTrue, right));
|
|
847
|
-
} else if (left._type === "IfElse" && isConstant(left.onTrue) && isConstant(left.onFalse) && isConstant(right) && !_checkExpressionsAreEqual(left.onTrue, right) && !_checkExpressionsAreEqual(left.onFalse, right)) {
|
|
848
|
-
return constant(false);
|
|
849
|
-
}
|
|
850
|
-
return undefined;
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
// exploit symmetry: a === b <~> b === a
|
|
854
|
-
var reduced = (_reduce = reduce(leftExpression, rightExpression)) !== null && _reduce !== void 0 ? _reduce : reduce(rightExpression, leftExpression);
|
|
855
|
-
return reduced !== null && reduced !== void 0 ? reduced : comparison("===", leftExpression, rightExpression);
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
/**
|
|
859
|
-
* Comparison: "not equal" (!==).
|
|
860
|
-
*
|
|
861
|
-
* @template T The target type
|
|
862
|
-
* @param leftOperand The operand on the left side
|
|
863
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
864
|
-
* @returns An expression representing the comparison
|
|
865
|
-
*/
|
|
866
|
-
_exports.equal = equal;
|
|
867
|
-
function notEqual(leftOperand, rightOperand) {
|
|
868
|
-
return not(equal(leftOperand, rightOperand));
|
|
869
|
-
}
|
|
870
|
-
|
|
871
|
-
/**
|
|
872
|
-
* Comparison: "greater or equal" (>=).
|
|
873
|
-
*
|
|
874
|
-
* @template T The target type
|
|
875
|
-
* @param leftOperand The operand on the left side
|
|
876
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
877
|
-
* @returns An expression representing the comparison
|
|
878
|
-
*/
|
|
879
|
-
_exports.notEqual = notEqual;
|
|
880
|
-
function greaterOrEqual(leftOperand, rightOperand) {
|
|
881
|
-
return comparison(">=", leftOperand, rightOperand);
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
/**
|
|
885
|
-
* Comparison: "greater than" (>).
|
|
886
|
-
*
|
|
887
|
-
* @template T The target type
|
|
888
|
-
* @param leftOperand The operand on the left side
|
|
889
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
890
|
-
* @returns An expression representing the comparison
|
|
891
|
-
*/
|
|
892
|
-
_exports.greaterOrEqual = greaterOrEqual;
|
|
893
|
-
function greaterThan(leftOperand, rightOperand) {
|
|
894
|
-
return comparison(">", leftOperand, rightOperand);
|
|
895
|
-
}
|
|
896
|
-
|
|
897
|
-
/**
|
|
898
|
-
* Comparison: "less or equal" (<=).
|
|
899
|
-
*
|
|
900
|
-
* @template T The target type
|
|
901
|
-
* @param leftOperand The operand on the left side
|
|
902
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
903
|
-
* @returns An expression representing the comparison
|
|
904
|
-
*/
|
|
905
|
-
_exports.greaterThan = greaterThan;
|
|
906
|
-
function lessOrEqual(leftOperand, rightOperand) {
|
|
907
|
-
return comparison("<=", leftOperand, rightOperand);
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
/**
|
|
911
|
-
* Comparison: "less than" (<).
|
|
912
|
-
*
|
|
913
|
-
* @template T The target type
|
|
914
|
-
* @param leftOperand The operand on the left side
|
|
915
|
-
* @param rightOperand The operand on the right side of the comparison
|
|
916
|
-
* @returns An expression representing the comparison
|
|
917
|
-
*/
|
|
918
|
-
_exports.lessOrEqual = lessOrEqual;
|
|
919
|
-
function lessThan(leftOperand, rightOperand) {
|
|
920
|
-
return comparison("<", leftOperand, rightOperand);
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
/**
|
|
924
|
-
* If-then-else expression.
|
|
925
|
-
*
|
|
926
|
-
* Evaluates to onTrue if the condition evaluates to true, else evaluates to onFalse.
|
|
927
|
-
*
|
|
928
|
-
* @template T The target type
|
|
929
|
-
* @param condition The condition to evaluate
|
|
930
|
-
* @param onTrue Expression result if the condition evaluates to true
|
|
931
|
-
* @param onFalse Expression result if the condition evaluates to false
|
|
932
|
-
* @returns The expression that represents this conditional check
|
|
933
|
-
*/
|
|
934
|
-
_exports.lessThan = lessThan;
|
|
935
|
-
function ifElse(condition, onTrue, onFalse) {
|
|
936
|
-
var conditionExpression = wrapPrimitive(condition);
|
|
937
|
-
var onTrueExpression = wrapPrimitive(onTrue);
|
|
938
|
-
var onFalseExpression = wrapPrimitive(onFalse);
|
|
939
|
-
if (hasUnresolveableExpression(conditionExpression, onTrueExpression, onFalseExpression)) {
|
|
940
|
-
return unresolveableExpression;
|
|
941
|
-
}
|
|
942
|
-
// swap branches if the condition is a negation
|
|
943
|
-
if (conditionExpression._type === "Not") {
|
|
944
|
-
// ifElse(not(X), a, b) --> ifElse(X, b, a)
|
|
945
|
-
var _ref3 = [onFalseExpression, onTrueExpression];
|
|
946
|
-
onTrueExpression = _ref3[0];
|
|
947
|
-
onFalseExpression = _ref3[1];
|
|
948
|
-
conditionExpression = not(conditionExpression);
|
|
949
|
-
}
|
|
950
|
-
|
|
951
|
-
// inline nested if-else expressions: onTrue branch
|
|
952
|
-
// ifElse(X, ifElse(X, a, b), c) ==> ifElse(X, a, c)
|
|
953
|
-
if (onTrueExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onTrueExpression.condition)) {
|
|
954
|
-
onTrueExpression = onTrueExpression.onTrue;
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
// inline nested if-else expressions: onFalse branch
|
|
958
|
-
// ifElse(X, a, ifElse(X, b, c)) ==> ifElse(X, a, c)
|
|
959
|
-
if (onFalseExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onFalseExpression.condition)) {
|
|
960
|
-
onFalseExpression = onFalseExpression.onFalse;
|
|
961
|
-
}
|
|
962
|
-
|
|
963
|
-
// (if true then a else b) ~~> a
|
|
964
|
-
// (if false then a else b) ~~> b
|
|
965
|
-
if (isConstant(conditionExpression)) {
|
|
966
|
-
return conditionExpression.value ? onTrueExpression : onFalseExpression;
|
|
967
|
-
}
|
|
968
|
-
|
|
969
|
-
// if (isConstantBoolean(onTrueExpression) || isConstantBoolean(onFalseExpression)) {
|
|
970
|
-
// return or(and(condition, onTrueExpression as Expression<boolean>), and(not(condition), onFalseExpression as Expression<boolean>)) as Expression<T>
|
|
971
|
-
// }
|
|
972
|
-
// (if X then a else a) ~~> a
|
|
973
|
-
if (_checkExpressionsAreEqual(onTrueExpression, onFalseExpression)) {
|
|
974
|
-
return onTrueExpression;
|
|
975
|
-
}
|
|
976
|
-
|
|
977
|
-
// if X then a else false ~~> X && a
|
|
978
|
-
if (isFalse(onFalseExpression)) {
|
|
979
|
-
return and(conditionExpression, onTrueExpression);
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
// if X then a else true ~~> !X || a
|
|
983
|
-
if (isTrue(onFalseExpression)) {
|
|
984
|
-
return or(not(conditionExpression), onTrueExpression);
|
|
985
|
-
}
|
|
986
|
-
|
|
987
|
-
// if X then false else a ~~> !X && a
|
|
988
|
-
if (isFalse(onTrueExpression)) {
|
|
989
|
-
return and(not(conditionExpression), onFalseExpression);
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
// if X then true else a ~~> X || a
|
|
993
|
-
if (isTrue(onTrueExpression)) {
|
|
994
|
-
return or(conditionExpression, onFalseExpression);
|
|
995
|
-
}
|
|
996
|
-
if (isComplexTypeExpression(condition) || isComplexTypeExpression(onTrue) || isComplexTypeExpression(onFalse)) {
|
|
997
|
-
var pathIdx = 0;
|
|
998
|
-
var myIfElseExpression = formatResult([condition, onTrue, onFalse], "sap.fe.core.formatters.StandardFormatter#ifElse");
|
|
999
|
-
var allParts = [];
|
|
1000
|
-
transformRecursively(myIfElseExpression, "PathInModel", function (constantPath) {
|
|
1001
|
-
allParts.push(constantPath);
|
|
1002
|
-
return pathInModel("$".concat(pathIdx++), "$");
|
|
1003
|
-
}, true);
|
|
1004
|
-
allParts.unshift(constant(JSON.stringify(myIfElseExpression)));
|
|
1005
|
-
return formatResult(allParts, "sap.fe.core.formatters.StandardFormatter#evaluateComplexExpression", undefined, true);
|
|
1006
|
-
}
|
|
1007
|
-
return {
|
|
1008
|
-
_type: "IfElse",
|
|
1009
|
-
condition: conditionExpression,
|
|
1010
|
-
onTrue: onTrueExpression,
|
|
1011
|
-
onFalse: onFalseExpression
|
|
1012
|
-
};
|
|
1013
|
-
}
|
|
1014
|
-
|
|
1015
|
-
/**
|
|
1016
|
-
* Checks whether the current expression has a reference to the default model (undefined).
|
|
1017
|
-
*
|
|
1018
|
-
* @param expression The expression to evaluate
|
|
1019
|
-
* @returns `true` if there is a reference to the default context
|
|
1020
|
-
*/
|
|
1021
|
-
_exports.ifElse = ifElse;
|
|
1022
|
-
function hasReferenceToDefaultContext(expression) {
|
|
1023
|
-
switch (expression._type) {
|
|
1024
|
-
case "Constant":
|
|
1025
|
-
case "Formatter":
|
|
1026
|
-
case "ComplexType":
|
|
1027
|
-
return false;
|
|
1028
|
-
case "Set":
|
|
1029
|
-
return expression.operands.some(hasReferenceToDefaultContext);
|
|
1030
|
-
case "PathInModel":
|
|
1031
|
-
return expression.modelName === undefined;
|
|
1032
|
-
case "Comparison":
|
|
1033
|
-
return hasReferenceToDefaultContext(expression.operand1) || hasReferenceToDefaultContext(expression.operand2);
|
|
1034
|
-
case "IfElse":
|
|
1035
|
-
return hasReferenceToDefaultContext(expression.condition) || hasReferenceToDefaultContext(expression.onTrue) || hasReferenceToDefaultContext(expression.onFalse);
|
|
1036
|
-
case "Not":
|
|
1037
|
-
case "Truthy":
|
|
1038
|
-
return hasReferenceToDefaultContext(expression.operand);
|
|
1039
|
-
default:
|
|
1040
|
-
return false;
|
|
1041
|
-
}
|
|
1042
|
-
}
|
|
1043
|
-
/**
|
|
1044
|
-
* Calls a formatter function to process the parameters.
|
|
1045
|
-
* If requireContext is set to true and no context is passed a default context will be added automatically.
|
|
1046
|
-
*
|
|
1047
|
-
* @template T
|
|
1048
|
-
* @template U
|
|
1049
|
-
* @param parameters The list of parameter that should match the type and number of the formatter function
|
|
1050
|
-
* @param formatterFunction The function to call
|
|
1051
|
-
* @param [contextEntityType] If no parameter refers to the context then we use this information to add a reference to the keys from the entity type.
|
|
1052
|
-
* @param [ignoreComplexType] Whether to ignore the transgformation to the StandardFormatter or not
|
|
1053
|
-
* @returns The corresponding expression
|
|
1054
|
-
*/
|
|
1055
|
-
function formatResult(parameters, formatterFunction, contextEntityType) {
|
|
1056
|
-
var ignoreComplexType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1057
|
-
var parameterExpressions = parameters.map(wrapPrimitive);
|
|
1058
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(parameterExpressions))) {
|
|
1059
|
-
return unresolveableExpression;
|
|
1060
|
-
}
|
|
1061
|
-
if (contextEntityType) {
|
|
1062
|
-
// Otherwise, if the context is required and no context is provided make sure to add the default binding
|
|
1063
|
-
if (!parameterExpressions.some(hasReferenceToDefaultContext)) {
|
|
1064
|
-
contextEntityType.keys.forEach(function (key) {
|
|
1065
|
-
return parameterExpressions.push(pathInModel(key.name, ""));
|
|
1066
|
-
});
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
var functionName = "";
|
|
1070
|
-
if (typeof formatterFunction === "string") {
|
|
1071
|
-
functionName = formatterFunction;
|
|
1072
|
-
} else {
|
|
1073
|
-
functionName = formatterFunction.__functionName;
|
|
1074
|
-
}
|
|
1075
|
-
// FormatterName can be of format sap.fe.core.xxx#methodName to have multiple formatter in one class
|
|
1076
|
-
var _functionName$split = functionName.split("#"),
|
|
1077
|
-
_functionName$split2 = _slicedToArray(_functionName$split, 2),
|
|
1078
|
-
formatterClass = _functionName$split2[0],
|
|
1079
|
-
formatterName = _functionName$split2[1];
|
|
1080
|
-
|
|
1081
|
-
// In some case we also cannot call directly a function because of too complex input, in that case we need to convert to a simpler function call
|
|
1082
|
-
if (!ignoreComplexType && (parameterExpressions.some(isComplexTypeExpression) || parameterExpressions.some(isConcatExpression))) {
|
|
1083
|
-
var pathIdx = 0;
|
|
1084
|
-
var myFormatExpression = formatResult(parameterExpressions, functionName, undefined, true);
|
|
1085
|
-
var allParts = [];
|
|
1086
|
-
transformRecursively(myFormatExpression, "PathInModel", function (constantPath) {
|
|
1087
|
-
allParts.push(constantPath);
|
|
1088
|
-
return pathInModel("$".concat(pathIdx++), "$");
|
|
1089
|
-
});
|
|
1090
|
-
allParts.unshift(constant(JSON.stringify(myFormatExpression)));
|
|
1091
|
-
return formatResult(allParts, "sap.fe.core.formatters.StandardFormatter#evaluateComplexExpression", undefined, true);
|
|
1092
|
-
} else if (!!formatterName && formatterName.length > 0) {
|
|
1093
|
-
parameterExpressions.unshift(constant(formatterName));
|
|
1094
|
-
}
|
|
1095
|
-
return {
|
|
1096
|
-
_type: "Formatter",
|
|
1097
|
-
fn: formatterClass,
|
|
1098
|
-
parameters: parameterExpressions
|
|
1099
|
-
};
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
/**
|
|
1103
|
-
* Calls a complex type to process the parameters.
|
|
1104
|
-
* If requireContext is set to true and no context is passed, a default context will be added automatically.
|
|
1105
|
-
*
|
|
1106
|
-
* @template T
|
|
1107
|
-
* @template U
|
|
1108
|
-
* @param parameters The list of parameters that should match the type for the complex type=
|
|
1109
|
-
* @param type The complex type to use
|
|
1110
|
-
* @param [contextEntityType] The context entity type to consider
|
|
1111
|
-
* @param oFormatOptions
|
|
1112
|
-
* @returns The corresponding expression
|
|
1113
|
-
*/
|
|
1114
|
-
_exports.formatResult = formatResult;
|
|
1115
|
-
function addTypeInformation(parameters, type, contextEntityType, oFormatOptions) {
|
|
1116
|
-
var _parameters$, _parameters$$type, _parameters$2, _parameters$2$type, _parameters$3, _parameters$3$type;
|
|
1117
|
-
var parameterExpressions = parameters.map(wrapPrimitive);
|
|
1118
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(parameterExpressions))) {
|
|
1119
|
-
return unresolveableExpression;
|
|
1120
|
-
}
|
|
1121
|
-
// If there is only one parameter and it is a constant and we don't expect the context then return the constant
|
|
1122
|
-
if (parameterExpressions.length === 1 && isConstant(parameterExpressions[0]) && !contextEntityType) {
|
|
1123
|
-
return parameterExpressions[0];
|
|
1124
|
-
} else if (contextEntityType) {
|
|
1125
|
-
// Otherwise, if the context is required and no context is provided make sure to add the default binding
|
|
1126
|
-
if (!parameterExpressions.some(hasReferenceToDefaultContext)) {
|
|
1127
|
-
contextEntityType.keys.forEach(function (key) {
|
|
1128
|
-
return parameterExpressions.push(pathInModel(key.name, ""));
|
|
1129
|
-
});
|
|
1130
|
-
}
|
|
1131
|
-
}
|
|
1132
|
-
// if showMeasure is set to false we want to not parse as string to see the 0
|
|
1133
|
-
// we do that also for all bindings because otherwise the mdc Field isn't editable
|
|
1134
|
-
if (!(oFormatOptions && oFormatOptions.showNumber === false) && (((_parameters$ = parameters[0]) === null || _parameters$ === void 0 ? void 0 : (_parameters$$type = _parameters$.type) === null || _parameters$$type === void 0 ? void 0 : _parameters$$type.indexOf("sap.ui.model.odata.type.Int")) === 0 || ((_parameters$2 = parameters[0]) === null || _parameters$2 === void 0 ? void 0 : (_parameters$2$type = _parameters$2.type) === null || _parameters$2$type === void 0 ? void 0 : _parameters$2$type.indexOf("sap.ui.model.odata.type.Decimal")) === 0 || ((_parameters$3 = parameters[0]) === null || _parameters$3 === void 0 ? void 0 : (_parameters$3$type = _parameters$3.type) === null || _parameters$3$type === void 0 ? void 0 : _parameters$3$type.indexOf("sap.ui.model.odata.type.Double")) === 0)) {
|
|
1135
|
-
var _parameters$4, _parameters$5;
|
|
1136
|
-
if (((_parameters$4 = parameters[0]) === null || _parameters$4 === void 0 ? void 0 : _parameters$4.type) === "sap.ui.model.odata.type.Int64" || ((_parameters$5 = parameters[0]) === null || _parameters$5 === void 0 ? void 0 : _parameters$5.type) === "sap.ui.model.odata.type.Decimal") {
|
|
1137
|
-
var _oFormatOptions;
|
|
1138
|
-
//sap.ui.model.odata.type.Int64 do not support parseAsString false
|
|
1139
|
-
oFormatOptions = ((_oFormatOptions = oFormatOptions) === null || _oFormatOptions === void 0 ? void 0 : _oFormatOptions.showMeasure) === false ? {
|
|
1140
|
-
emptyString: "",
|
|
1141
|
-
showMeasure: false
|
|
1142
|
-
} : {
|
|
1143
|
-
emptyString: ""
|
|
1144
|
-
};
|
|
1145
|
-
} else {
|
|
1146
|
-
var _oFormatOptions2;
|
|
1147
|
-
oFormatOptions = ((_oFormatOptions2 = oFormatOptions) === null || _oFormatOptions2 === void 0 ? void 0 : _oFormatOptions2.showMeasure) === false ? {
|
|
1148
|
-
parseAsString: false,
|
|
1149
|
-
emptyString: "",
|
|
1150
|
-
showMeasure: false
|
|
1151
|
-
} : {
|
|
1152
|
-
parseAsString: false,
|
|
1153
|
-
emptyString: ""
|
|
1154
|
-
};
|
|
1155
|
-
}
|
|
1156
|
-
}
|
|
1157
|
-
if (type === "sap.ui.model.odata.type.Unit") {
|
|
1158
|
-
var uomPath = pathInModel("/##@@requestUnitsOfMeasure");
|
|
1159
|
-
uomPath.targetType = "any";
|
|
1160
|
-
uomPath.mode = "OneTime";
|
|
1161
|
-
parameterExpressions.push(uomPath);
|
|
1162
|
-
} else if (type === "sap.ui.model.odata.type.Currency") {
|
|
1163
|
-
var currencyPath = pathInModel("/##@@requestCurrencyCodes");
|
|
1164
|
-
currencyPath.targetType = "any";
|
|
1165
|
-
currencyPath.mode = "OneTime";
|
|
1166
|
-
parameterExpressions.push(currencyPath);
|
|
1167
|
-
}
|
|
1168
|
-
return {
|
|
1169
|
-
_type: "ComplexType",
|
|
1170
|
-
type: type,
|
|
1171
|
-
formatOptions: oFormatOptions || {},
|
|
1172
|
-
parameters: {},
|
|
1173
|
-
bindingParameters: parameterExpressions
|
|
1174
|
-
};
|
|
1175
|
-
}
|
|
1176
|
-
/**
|
|
1177
|
-
* Function call, optionally with arguments.
|
|
1178
|
-
*
|
|
1179
|
-
* @param func Function name or reference to function
|
|
1180
|
-
* @param parameters Arguments
|
|
1181
|
-
* @param on Object to call the function on
|
|
1182
|
-
* @returns Expression representing the function call (not the result of the function call!)
|
|
1183
|
-
*/
|
|
1184
|
-
_exports.addTypeInformation = addTypeInformation;
|
|
1185
|
-
function fn(func, parameters, on) {
|
|
1186
|
-
var functionName = typeof func === "string" ? func : func.__functionName;
|
|
1187
|
-
return {
|
|
1188
|
-
_type: "Function",
|
|
1189
|
-
obj: on !== undefined ? wrapPrimitive(on) : undefined,
|
|
1190
|
-
fn: functionName,
|
|
1191
|
-
parameters: parameters.map(wrapPrimitive)
|
|
1192
|
-
};
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
/**
|
|
1196
|
-
* Shortcut function to determine if a binding value is null, undefined or empty.
|
|
1197
|
-
*
|
|
1198
|
-
* @param expression
|
|
1199
|
-
* @returns A Boolean expression evaluating the fact that the current element is empty
|
|
1200
|
-
*/
|
|
1201
|
-
_exports.fn = fn;
|
|
1202
|
-
function isEmpty(expression) {
|
|
1203
|
-
var aBindings = [];
|
|
1204
|
-
transformRecursively(expression, "PathInModel", function (expr) {
|
|
1205
|
-
aBindings.push(or(equal(expr, ""), equal(expr, undefined), equal(expr, null)));
|
|
1206
|
-
return expr;
|
|
1207
|
-
});
|
|
1208
|
-
return and.apply(void 0, aBindings);
|
|
1209
|
-
}
|
|
1210
|
-
_exports.isEmpty = isEmpty;
|
|
1211
|
-
function concat() {
|
|
1212
|
-
for (var _len4 = arguments.length, inExpressions = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
1213
|
-
inExpressions[_key4] = arguments[_key4];
|
|
1214
|
-
}
|
|
1215
|
-
var expressions = inExpressions.map(wrapPrimitive);
|
|
1216
|
-
if (hasUnresolveableExpression.apply(void 0, _toConsumableArray(expressions))) {
|
|
1217
|
-
return unresolveableExpression;
|
|
1218
|
-
}
|
|
1219
|
-
if (expressions.every(isConstant)) {
|
|
1220
|
-
return constant(expressions.reduce(function (concatenated, value) {
|
|
1221
|
-
if (value.value !== undefined) {
|
|
1222
|
-
return concatenated + value.value.toString();
|
|
1223
|
-
}
|
|
1224
|
-
return concatenated;
|
|
1225
|
-
}, ""));
|
|
1226
|
-
} else if (expressions.some(isComplexTypeExpression)) {
|
|
1227
|
-
var pathIdx = 0;
|
|
1228
|
-
var myConcatExpression = formatResult(expressions, "sap.fe.core.formatters.StandardFormatter#concat", undefined, true);
|
|
1229
|
-
var allParts = [];
|
|
1230
|
-
transformRecursively(myConcatExpression, "PathInModel", function (constantPath) {
|
|
1231
|
-
allParts.push(constantPath);
|
|
1232
|
-
return pathInModel("$".concat(pathIdx++), "$");
|
|
1233
|
-
});
|
|
1234
|
-
allParts.unshift(constant(JSON.stringify(myConcatExpression)));
|
|
1235
|
-
return formatResult(allParts, "sap.fe.core.formatters.StandardFormatter#evaluateComplexExpression", undefined, true);
|
|
1236
|
-
}
|
|
1237
|
-
return {
|
|
1238
|
-
_type: "Concat",
|
|
1239
|
-
expressions: expressions
|
|
1240
|
-
};
|
|
1241
|
-
}
|
|
1242
|
-
_exports.concat = concat;
|
|
1243
|
-
function transformRecursively(inExpression, expressionType, transformFunction) {
|
|
1244
|
-
var includeAllExpression = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1245
|
-
var expression = inExpression;
|
|
1246
|
-
switch (expression._type) {
|
|
1247
|
-
case "Function":
|
|
1248
|
-
case "Formatter":
|
|
1249
|
-
expression.parameters = expression.parameters.map(function (parameter) {
|
|
1250
|
-
return transformRecursively(parameter, expressionType, transformFunction, includeAllExpression);
|
|
1251
|
-
});
|
|
1252
|
-
break;
|
|
1253
|
-
case "Concat":
|
|
1254
|
-
expression.expressions = expression.expressions.map(function (subExpression) {
|
|
1255
|
-
return transformRecursively(subExpression, expressionType, transformFunction, includeAllExpression);
|
|
1256
|
-
});
|
|
1257
|
-
expression = concat.apply(void 0, _toConsumableArray(expression.expressions));
|
|
1258
|
-
break;
|
|
1259
|
-
case "ComplexType":
|
|
1260
|
-
expression.bindingParameters = expression.bindingParameters.map(function (bindingParameter) {
|
|
1261
|
-
return transformRecursively(bindingParameter, expressionType, transformFunction, includeAllExpression);
|
|
1262
|
-
});
|
|
1263
|
-
break;
|
|
1264
|
-
case "IfElse":
|
|
1265
|
-
var onTrue = transformRecursively(expression.onTrue, expressionType, transformFunction, includeAllExpression);
|
|
1266
|
-
var onFalse = transformRecursively(expression.onFalse, expressionType, transformFunction, includeAllExpression);
|
|
1267
|
-
var condition = expression.condition;
|
|
1268
|
-
if (includeAllExpression) {
|
|
1269
|
-
condition = transformRecursively(expression.condition, expressionType, transformFunction, includeAllExpression);
|
|
1270
|
-
}
|
|
1271
|
-
expression = ifElse(condition, onTrue, onFalse);
|
|
1272
|
-
break;
|
|
1273
|
-
case "Not":
|
|
1274
|
-
if (includeAllExpression) {
|
|
1275
|
-
var operand = transformRecursively(expression.operand, expressionType, transformFunction, includeAllExpression);
|
|
1276
|
-
expression = not(operand);
|
|
1277
|
-
}
|
|
1278
|
-
break;
|
|
1279
|
-
case "Truthy":
|
|
1280
|
-
break;
|
|
1281
|
-
case "Set":
|
|
1282
|
-
if (includeAllExpression) {
|
|
1283
|
-
var operands = expression.operands.map(function (operand) {
|
|
1284
|
-
return transformRecursively(operand, expressionType, transformFunction, includeAllExpression);
|
|
1285
|
-
});
|
|
1286
|
-
expression = expression.operator === "||" ? or.apply(void 0, _toConsumableArray(operands)) : and.apply(void 0, _toConsumableArray(operands));
|
|
1287
|
-
}
|
|
1288
|
-
break;
|
|
1289
|
-
case "Comparison":
|
|
1290
|
-
if (includeAllExpression) {
|
|
1291
|
-
var operand1 = transformRecursively(expression.operand1, expressionType, transformFunction, includeAllExpression);
|
|
1292
|
-
var operand2 = transformRecursively(expression.operand2, expressionType, transformFunction, includeAllExpression);
|
|
1293
|
-
expression = comparison(expression.operator, operand1, operand2);
|
|
1294
|
-
}
|
|
1295
|
-
break;
|
|
1296
|
-
case "Ref":
|
|
1297
|
-
case "Length":
|
|
1298
|
-
case "PathInModel":
|
|
1299
|
-
case "Constant":
|
|
1300
|
-
case "EmbeddedBinding":
|
|
1301
|
-
case "EmbeddedExpressionBinding":
|
|
1302
|
-
case "Unresolvable":
|
|
1303
|
-
// Do nothing
|
|
1304
|
-
break;
|
|
1305
|
-
}
|
|
1306
|
-
if (expressionType === expression._type) {
|
|
1307
|
-
expression = transformFunction(inExpression);
|
|
1308
|
-
}
|
|
1309
|
-
return expression;
|
|
1310
|
-
}
|
|
1311
|
-
_exports.transformRecursively = transformRecursively;
|
|
1312
|
-
var needParenthesis = function (expr) {
|
|
1313
|
-
return !isConstant(expr) && !isPathInModelExpression(expr) && isExpression(expr) && expr._type !== "IfElse" && expr._type !== "Function";
|
|
1314
|
-
};
|
|
1315
|
-
|
|
1316
|
-
/**
|
|
1317
|
-
* Compiles a constant object to a string.
|
|
1318
|
-
*
|
|
1319
|
-
* @param expr
|
|
1320
|
-
* @param isNullable
|
|
1321
|
-
* @returns The compiled string
|
|
1322
|
-
*/
|
|
1323
|
-
function compileConstantObject(expr) {
|
|
1324
|
-
var isNullable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1325
|
-
if (isNullable && Object.keys(expr.value).length === 0) {
|
|
1326
|
-
return "";
|
|
1327
|
-
}
|
|
1328
|
-
// Objects
|
|
1329
|
-
var o = expr.value;
|
|
1330
|
-
var properties = [];
|
|
1331
|
-
Object.keys(o).forEach(function (key) {
|
|
1332
|
-
var value = o[key];
|
|
1333
|
-
var childResult = compileExpression(value, true, false, isNullable);
|
|
1334
|
-
if (childResult && childResult.length > 0) {
|
|
1335
|
-
properties.push("".concat(key, ": ").concat(childResult));
|
|
1336
|
-
}
|
|
1337
|
-
});
|
|
1338
|
-
return "{".concat(properties.join(", "), "}");
|
|
1339
|
-
}
|
|
1340
|
-
|
|
1341
|
-
/**
|
|
1342
|
-
* Compiles a Constant Binding Expression.
|
|
1343
|
-
*
|
|
1344
|
-
* @param expr
|
|
1345
|
-
* @param embeddedInBinding
|
|
1346
|
-
* @param isNullable
|
|
1347
|
-
* @param doNotStringify
|
|
1348
|
-
* @returns The compiled string
|
|
1349
|
-
*/
|
|
1350
|
-
|
|
1351
|
-
function compileConstant(expr, embeddedInBinding) {
|
|
1352
|
-
var isNullable = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1353
|
-
var doNotStringify = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1354
|
-
if (expr.value === null) {
|
|
1355
|
-
return doNotStringify ? null : "null";
|
|
1356
|
-
}
|
|
1357
|
-
if (expr.value === undefined) {
|
|
1358
|
-
return doNotStringify ? undefined : "undefined";
|
|
1359
|
-
}
|
|
1360
|
-
if (typeof expr.value === "object") {
|
|
1361
|
-
if (Array.isArray(expr.value)) {
|
|
1362
|
-
var entries = expr.value.map(function (expression) {
|
|
1363
|
-
return compileExpression(expression, true);
|
|
1364
|
-
});
|
|
1365
|
-
return "[".concat(entries.join(", "), "]");
|
|
1366
|
-
} else {
|
|
1367
|
-
return compileConstantObject(expr, isNullable);
|
|
1368
|
-
}
|
|
1369
|
-
}
|
|
1370
|
-
if (embeddedInBinding) {
|
|
1371
|
-
switch (typeof expr.value) {
|
|
1372
|
-
case "number":
|
|
1373
|
-
case "bigint":
|
|
1374
|
-
case "boolean":
|
|
1375
|
-
return expr.value.toString();
|
|
1376
|
-
case "string":
|
|
1377
|
-
return "'".concat(escapeXmlAttribute(expr.value.toString()), "'");
|
|
1378
|
-
default:
|
|
1379
|
-
return "";
|
|
1380
|
-
}
|
|
1381
|
-
} else {
|
|
1382
|
-
return doNotStringify ? expr.value : expr.value.toString();
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
|
|
1386
|
-
/**
|
|
1387
|
-
* Generates the binding string for a Binding expression.
|
|
1388
|
-
*
|
|
1389
|
-
* @param expressionForBinding The expression to compile
|
|
1390
|
-
* @param embeddedInBinding Whether the expression to compile is embedded into another expression
|
|
1391
|
-
* @param embeddedSeparator The binding value evaluator ($ or % depending on whether we want to force the type or not)
|
|
1392
|
-
* @returns The corresponding expression binding
|
|
1393
|
-
*/
|
|
1394
|
-
_exports.compileConstant = compileConstant;
|
|
1395
|
-
function compilePathInModelExpression(expressionForBinding, embeddedInBinding, embeddedSeparator) {
|
|
1396
|
-
if (expressionForBinding.type || expressionForBinding.parameters || expressionForBinding.targetType || expressionForBinding.formatOptions || expressionForBinding.constraints) {
|
|
1397
|
-
// This is now a complex binding definition, let's prepare for it
|
|
1398
|
-
var complexBindingDefinition = {
|
|
1399
|
-
path: compilePathInModel(expressionForBinding),
|
|
1400
|
-
type: expressionForBinding.type,
|
|
1401
|
-
targetType: expressionForBinding.targetType,
|
|
1402
|
-
parameters: expressionForBinding.parameters,
|
|
1403
|
-
formatOptions: expressionForBinding.formatOptions,
|
|
1404
|
-
constraints: expressionForBinding.constraints
|
|
1405
|
-
};
|
|
1406
|
-
var outBinding = compileExpression(complexBindingDefinition, false, false, true);
|
|
1407
|
-
if (embeddedInBinding) {
|
|
1408
|
-
return "".concat(embeddedSeparator).concat(outBinding);
|
|
1409
|
-
}
|
|
1410
|
-
return outBinding;
|
|
1411
|
-
} else if (embeddedInBinding) {
|
|
1412
|
-
return "".concat(embeddedSeparator, "{").concat(compilePathInModel(expressionForBinding), "}");
|
|
1413
|
-
} else {
|
|
1414
|
-
return "{".concat(compilePathInModel(expressionForBinding), "}");
|
|
1415
|
-
}
|
|
1416
|
-
}
|
|
1417
|
-
function compileComplexTypeExpression(expression) {
|
|
1418
|
-
if (expression.bindingParameters.length === 1) {
|
|
1419
|
-
return "{".concat(compilePathParameter(expression.bindingParameters[0], true), ", type: '").concat(expression.type, "'}");
|
|
1420
|
-
}
|
|
1421
|
-
var outputEnd = "], type: '".concat(expression.type, "'");
|
|
1422
|
-
if (hasElements(expression.formatOptions)) {
|
|
1423
|
-
outputEnd += ", formatOptions: ".concat(compileExpression(expression.formatOptions));
|
|
1424
|
-
}
|
|
1425
|
-
if (hasElements(expression.parameters)) {
|
|
1426
|
-
outputEnd += ", parameters: ".concat(compileExpression(expression.parameters));
|
|
1427
|
-
}
|
|
1428
|
-
outputEnd += "}";
|
|
1429
|
-
return "{mode:'TwoWay', parts:[".concat(expression.bindingParameters.map(function (param) {
|
|
1430
|
-
return compilePathParameter(param);
|
|
1431
|
-
}).join(",")).concat(outputEnd);
|
|
1432
|
-
}
|
|
1433
|
-
|
|
1434
|
-
/**
|
|
1435
|
-
* Wrap the compiled binding string as required dependening on its context.
|
|
1436
|
-
*
|
|
1437
|
-
* @param expression The compiled expression
|
|
1438
|
-
* @param embeddedInBinding True if the compiled expression is to be embedded in a binding
|
|
1439
|
-
* @param parenthesisRequired True if the embedded binding needs to be wrapped in parethesis so that it is evaluated as one
|
|
1440
|
-
* @returns Finalized compiled expression
|
|
1441
|
-
*/
|
|
1442
|
-
function wrapBindingExpression(expression, embeddedInBinding) {
|
|
1443
|
-
var parenthesisRequired = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1444
|
-
if (embeddedInBinding) {
|
|
1445
|
-
if (parenthesisRequired) {
|
|
1446
|
-
return "(".concat(expression, ")");
|
|
1447
|
-
} else {
|
|
1448
|
-
return expression;
|
|
1449
|
-
}
|
|
1450
|
-
} else {
|
|
1451
|
-
return "{= ".concat(expression, "}");
|
|
1452
|
-
}
|
|
1453
|
-
}
|
|
1454
|
-
|
|
1455
|
-
/**
|
|
1456
|
-
* Compile an expression into an expression binding.
|
|
1457
|
-
*
|
|
1458
|
-
* @template T The target type
|
|
1459
|
-
* @param expression The expression to compile
|
|
1460
|
-
* @param embeddedInBinding Whether the expression to compile is embedded into another expression
|
|
1461
|
-
* @param keepTargetType Keep the target type of the embedded bindings instead of casting them to any
|
|
1462
|
-
* @param isNullable Whether binding expression can resolve to empty string or not
|
|
1463
|
-
* @returns The corresponding expression binding
|
|
1464
|
-
*/
|
|
1465
|
-
function compileExpression(expression) {
|
|
1466
|
-
var embeddedInBinding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1467
|
-
var keepTargetType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1468
|
-
var isNullable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1469
|
-
var expr = wrapPrimitive(expression);
|
|
1470
|
-
var embeddedSeparator = keepTargetType ? "$" : "%";
|
|
1471
|
-
switch (expr._type) {
|
|
1472
|
-
case "Unresolvable":
|
|
1473
|
-
return undefined;
|
|
1474
|
-
case "Constant":
|
|
1475
|
-
return compileConstant(expr, embeddedInBinding, isNullable);
|
|
1476
|
-
case "Ref":
|
|
1477
|
-
return expr.ref || "null";
|
|
1478
|
-
case "Function":
|
|
1479
|
-
var argumentString = "".concat(expr.parameters.map(function (arg) {
|
|
1480
|
-
return compileExpression(arg, true);
|
|
1481
|
-
}).join(", "));
|
|
1482
|
-
return expr.obj === undefined ? "".concat(expr.fn, "(").concat(argumentString, ")") : "".concat(compileExpression(expr.obj, true), ".").concat(expr.fn, "(").concat(argumentString, ")");
|
|
1483
|
-
case "EmbeddedExpressionBinding":
|
|
1484
|
-
return embeddedInBinding ? "(".concat(expr.value.substr(2, expr.value.length - 3), ")") : "".concat(expr.value);
|
|
1485
|
-
case "EmbeddedBinding":
|
|
1486
|
-
return embeddedInBinding ? "".concat(embeddedSeparator).concat(expr.value) : "".concat(expr.value);
|
|
1487
|
-
case "PathInModel":
|
|
1488
|
-
return compilePathInModelExpression(expr, embeddedInBinding, embeddedSeparator);
|
|
1489
|
-
case "Comparison":
|
|
1490
|
-
var comparisonExpression = compileComparisonExpression(expr);
|
|
1491
|
-
return wrapBindingExpression(comparisonExpression, embeddedInBinding);
|
|
1492
|
-
case "IfElse":
|
|
1493
|
-
var ifElseExpression = "".concat(compileExpression(expr.condition, true), " ? ").concat(compileExpression(expr.onTrue, true), " : ").concat(compileExpression(expr.onFalse, true));
|
|
1494
|
-
return wrapBindingExpression(ifElseExpression, embeddedInBinding, true);
|
|
1495
|
-
case "Set":
|
|
1496
|
-
var setExpression = expr.operands.map(function (operand) {
|
|
1497
|
-
return compileExpression(operand, true);
|
|
1498
|
-
}).join(" ".concat(expr.operator, " "));
|
|
1499
|
-
return wrapBindingExpression(setExpression, embeddedInBinding, true);
|
|
1500
|
-
case "Concat":
|
|
1501
|
-
var concatExpression = expr.expressions.map(function (nestedExpression) {
|
|
1502
|
-
return compileExpression(nestedExpression, true, true);
|
|
1503
|
-
}).join(" + ");
|
|
1504
|
-
return wrapBindingExpression(concatExpression, embeddedInBinding);
|
|
1505
|
-
case "Length":
|
|
1506
|
-
var lengthExpression = "".concat(compileExpression(expr.pathInModel, true), ".length");
|
|
1507
|
-
return wrapBindingExpression(lengthExpression, embeddedInBinding);
|
|
1508
|
-
case "Not":
|
|
1509
|
-
var notExpression = "!".concat(compileExpression(expr.operand, true));
|
|
1510
|
-
return wrapBindingExpression(notExpression, embeddedInBinding);
|
|
1511
|
-
case "Truthy":
|
|
1512
|
-
var truthyExpression = "!!".concat(compileExpression(expr.operand, true));
|
|
1513
|
-
return wrapBindingExpression(truthyExpression, embeddedInBinding);
|
|
1514
|
-
case "Formatter":
|
|
1515
|
-
var formatterExpression = compileFormatterExpression(expr);
|
|
1516
|
-
return embeddedInBinding ? "$".concat(formatterExpression) : formatterExpression;
|
|
1517
|
-
case "ComplexType":
|
|
1518
|
-
var complexTypeExpression = compileComplexTypeExpression(expr);
|
|
1519
|
-
return embeddedInBinding ? "$".concat(complexTypeExpression) : complexTypeExpression;
|
|
1520
|
-
default:
|
|
1521
|
-
return "";
|
|
1522
|
-
}
|
|
1523
|
-
}
|
|
1524
|
-
|
|
1525
|
-
/**
|
|
1526
|
-
* Compile a comparison expression.
|
|
1527
|
-
*
|
|
1528
|
-
* @param expression The comparison expression.
|
|
1529
|
-
* @returns The compiled expression. Needs wrapping before it can be used as an expression binding.
|
|
1530
|
-
*/
|
|
1531
|
-
_exports.compileExpression = compileExpression;
|
|
1532
|
-
function compileComparisonExpression(expression) {
|
|
1533
|
-
function compileOperand(operand) {
|
|
1534
|
-
var _compileExpression;
|
|
1535
|
-
var compiledOperand = (_compileExpression = compileExpression(operand, true)) !== null && _compileExpression !== void 0 ? _compileExpression : "undefined";
|
|
1536
|
-
return wrapBindingExpression(compiledOperand, true, needParenthesis(operand));
|
|
1537
|
-
}
|
|
1538
|
-
return "".concat(compileOperand(expression.operand1), " ").concat(expression.operator, " ").concat(compileOperand(expression.operand2));
|
|
1539
|
-
}
|
|
1540
|
-
|
|
1541
|
-
/**
|
|
1542
|
-
* Compile a formatter expression.
|
|
1543
|
-
*
|
|
1544
|
-
* @param expression The formatter expression.
|
|
1545
|
-
* @returns The compiled expression.
|
|
1546
|
-
*/
|
|
1547
|
-
function compileFormatterExpression(expression) {
|
|
1548
|
-
if (expression.parameters.length === 1) {
|
|
1549
|
-
return "{".concat(compilePathParameter(expression.parameters[0], true), ", formatter: '").concat(expression.fn, "'}");
|
|
1550
|
-
} else {
|
|
1551
|
-
var parts = expression.parameters.map(function (param) {
|
|
1552
|
-
if (param._type === "ComplexType") {
|
|
1553
|
-
return compileComplexTypeExpression(param);
|
|
1554
|
-
} else {
|
|
1555
|
-
return compilePathParameter(param);
|
|
1556
|
-
}
|
|
1557
|
-
});
|
|
1558
|
-
return "{parts: [".concat(parts.join(", "), "], formatter: '").concat(expression.fn, "'}");
|
|
1559
|
-
}
|
|
1560
|
-
}
|
|
1561
|
-
|
|
1562
|
-
/**
|
|
1563
|
-
* Compile the path parameter of a formatter call.
|
|
1564
|
-
*
|
|
1565
|
-
* @param expression The binding part to evaluate
|
|
1566
|
-
* @param singlePath Whether there is one or multiple path to consider
|
|
1567
|
-
* @returns The string snippet to include in the overall binding definition
|
|
1568
|
-
*/
|
|
1569
|
-
function compilePathParameter(expression) {
|
|
1570
|
-
var singlePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1571
|
-
var outValue = "";
|
|
1572
|
-
if (expression._type === "Constant") {
|
|
1573
|
-
if (expression.value === undefined) {
|
|
1574
|
-
// Special case otherwise the JSTokenizer complains about incorrect content
|
|
1575
|
-
outValue = "value: 'undefined'";
|
|
1576
|
-
} else {
|
|
1577
|
-
outValue = "value: ".concat(compileConstant(expression, true));
|
|
1578
|
-
}
|
|
1579
|
-
} else if (expression._type === "PathInModel") {
|
|
1580
|
-
outValue = "path: '".concat(compilePathInModel(expression), "'");
|
|
1581
|
-
outValue += expression.type ? ", type: '".concat(expression.type, "'") : ", targetType: 'any'";
|
|
1582
|
-
if (hasElements(expression.mode)) {
|
|
1583
|
-
outValue += ", mode: '".concat(compileExpression(expression.mode), "'");
|
|
1584
|
-
}
|
|
1585
|
-
if (hasElements(expression.constraints)) {
|
|
1586
|
-
outValue += ", constraints: ".concat(compileExpression(expression.constraints));
|
|
1587
|
-
}
|
|
1588
|
-
if (hasElements(expression.formatOptions)) {
|
|
1589
|
-
outValue += ", formatOptions: ".concat(compileExpression(expression.formatOptions));
|
|
1590
|
-
}
|
|
1591
|
-
if (hasElements(expression.parameters)) {
|
|
1592
|
-
outValue += ", parameters: ".concat(compileExpression(expression.parameters));
|
|
1593
|
-
}
|
|
1594
|
-
} else {
|
|
1595
|
-
return "";
|
|
1596
|
-
}
|
|
1597
|
-
return singlePath ? outValue : "{".concat(outValue, "}");
|
|
1598
|
-
}
|
|
1599
|
-
function hasElements(obj) {
|
|
1600
|
-
return obj && Object.keys(obj).length > 0;
|
|
1601
|
-
}
|
|
1602
|
-
|
|
1603
|
-
/**
|
|
1604
|
-
* Compile a binding expression path.
|
|
1605
|
-
*
|
|
1606
|
-
* @param expression The expression to compile.
|
|
1607
|
-
* @returns The compiled path.
|
|
1608
|
-
*/
|
|
1609
|
-
function compilePathInModel(expression) {
|
|
1610
|
-
return "".concat(expression.modelName ? "".concat(expression.modelName, ">") : "").concat(expression.path);
|
|
1611
|
-
}
|
|
1612
|
-
return _exports;
|
|
1613
|
-
}, false);
|
|
1614
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1bnJlc29sdmVhYmxlRXhwcmVzc2lvbiIsIl90eXBlIiwiZXNjYXBlWG1sQXR0cmlidXRlIiwiaW5wdXRTdHJpbmciLCJyZXBsYWNlIiwiaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwidW5kZWZpbmVkIiwiaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24iLCJleHByZXNzaW9ucyIsImZpbmQiLCJleHByIiwiX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbCIsImEiLCJiIiwidmFsdWUiLCJvcGVyYW5kIiwib3BlcmF0b3IiLCJvcGVyYW5kcyIsImxlbmd0aCIsImV2ZXJ5Iiwic29tZSIsIm90aGVyRXhwcmVzc2lvbiIsImNvbmRpdGlvbiIsIm9uVHJ1ZSIsIm9uRmFsc2UiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwiYUV4cHJlc3Npb25zIiwiYkV4cHJlc3Npb25zIiwiaW5kZXgiLCJwYXRoSW5Nb2RlbCIsIm1vZGVsTmFtZSIsInBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJmbiIsInBhcmFtZXRlcnMiLCJ0eXBlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJvdGhlckZ1bmN0aW9uIiwib2JqIiwicmVmIiwiZmxhdHRlblNldEV4cHJlc3Npb24iLCJyZWR1Y2UiLCJyZXN1bHQiLCJjYW5kaWRhdGVzRm9yRmxhdHRlbmluZyIsImZvckVhY2giLCJjYW5kaWRhdGUiLCJlIiwicHVzaCIsImhhc09wcG9zaXRlRXhwcmVzc2lvbnMiLCJuZWdhdGVkRXhwcmVzc2lvbnMiLCJtYXAiLCJub3QiLCJpIiwiYW5kIiwid3JhcFByaW1pdGl2ZSIsImlzU3RhdGljRmFsc2UiLCJub25Ucml2aWFsRXhwcmVzc2lvbiIsImZpbHRlciIsImlzRmFsc2UiLCJpc0NvbnN0YW50IiwiY29uc3RhbnQiLCJpc1ZhbGlkIiwiaXNUcnVlIiwib3IiLCJpc1N0YXRpY1RydWUiLCJpc0NvbXBhcmlzb24iLCJpc1RydXRoeSIsImJpbmRpbmdFeHByZXNzaW9uIiwidmlzaXRlZE5hdmlnYXRpb25QYXRocyIsInBhdGhWaXNpdG9yIiwidGFyZ2V0UGF0aCIsImxvY2FsUGF0aCIsImNvbmNhdCIsImpvaW4iLCJjb25zdGFudFZhbHVlIiwiQXJyYXkiLCJpc0FycmF5IiwiaXNQcmltaXRpdmVPYmplY3QiLCJ2YWx1ZU9mIiwiT2JqZWN0IiwiZW50cmllcyIsInBsYWluRXhwcmVzc2lvbiIsImtleSIsInZhbCIsIndyYXBwZWRWYWx1ZSIsInJlc29sdmVCaW5kaW5nU3RyaW5nIiwidGFyZ2V0VHlwZSIsInN0YXJ0c1dpdGgiLCJpc05hTiIsIk51bWJlciIsInJlZmVyZW5jZSIsImlzRXhwcmVzc2lvbiIsInNvbWV0aGluZyIsIm1heWJlQ29uc3RhbnQiLCJpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbiIsIm1heWJlQmluZGluZyIsImlzQ29tcGxleFR5cGVFeHByZXNzaW9uIiwiaXNDb25jYXRFeHByZXNzaW9uIiwiaXNVbmRlZmluZWRFeHByZXNzaW9uIiwiZXhwcmVzc2lvbkFzRXhwcmVzc2lvbiIsIm9iamVjdFR5cGUiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFubm90YXRpb25WYWx1ZSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiZGVmYXVsdFZhbHVlIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiYW5ub3RhdGlvbklmRXhwcmVzc2lvbiIsIklmIiwicGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uIiwiTm90IiwiZXF1YWwiLCJFcSIsIm5vdEVxdWFsIiwiTmUiLCJncmVhdGVyVGhhbiIsIkd0IiwiZ3JlYXRlck9yRXF1YWwiLCJHZSIsImxlc3NUaGFuIiwiTHQiLCJsZXNzT3JFcXVhbCIsIkxlIiwiT3IiLCJvckNvbmRpdGlvbiIsIkFuZCIsImFuZENvbmRpdGlvbiIsImFubm90YXRpb25BcHBseUV4cHJlc3Npb24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRPciIsIiRBbmQiLCIkTm90IiwiJEVxIiwiJE5lIiwiJEd0IiwiJEdlIiwiJEx0IiwiJExlIiwiJFBhdGgiLCJGdW5jdGlvbiIsIiRGdW5jdGlvbiIsIkFwcGx5IiwiJEFwcGx5IiwiJElmIiwicmVzb2x2ZUVudW1WYWx1ZSIsIiRFbnVtTWVtYmVyIiwiaWZFbHNlIiwiYXBwbHlFeHByZXNzaW9uIiwiYXBwbHlQYXJhbSIsImFwcGx5UGFyYW1Db252ZXJ0ZWQiLCJjb21wYXJpc29uIiwibGVmdE9wZXJhbmQiLCJyaWdodE9wZXJhbmQiLCJsZWZ0RXhwcmVzc2lvbiIsInJpZ2h0RXhwcmVzc2lvbiIsImxlZnQiLCJyaWdodCIsInJlZHVjZWQiLCJjb25kaXRpb25FeHByZXNzaW9uIiwib25UcnVlRXhwcmVzc2lvbiIsIm9uRmFsc2VFeHByZXNzaW9uIiwicGF0aElkeCIsIm15SWZFbHNlRXhwcmVzc2lvbiIsImZvcm1hdFJlc3VsdCIsImFsbFBhcnRzIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJjb25zdGFudFBhdGgiLCJ1bnNoaWZ0IiwiSlNPTiIsInN0cmluZ2lmeSIsImhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQiLCJmb3JtYXR0ZXJGdW5jdGlvbiIsImNvbnRleHRFbnRpdHlUeXBlIiwiaWdub3JlQ29tcGxleFR5cGUiLCJwYXJhbWV0ZXJFeHByZXNzaW9ucyIsImtleXMiLCJmdW5jdGlvbk5hbWUiLCJfX2Z1bmN0aW9uTmFtZSIsInNwbGl0IiwiZm9ybWF0dGVyQ2xhc3MiLCJmb3JtYXR0ZXJOYW1lIiwibXlGb3JtYXRFeHByZXNzaW9uIiwiYWRkVHlwZUluZm9ybWF0aW9uIiwib0Zvcm1hdE9wdGlvbnMiLCJzaG93TnVtYmVyIiwiaW5kZXhPZiIsInNob3dNZWFzdXJlIiwiZW1wdHlTdHJpbmciLCJwYXJzZUFzU3RyaW5nIiwidW9tUGF0aCIsIm1vZGUiLCJjdXJyZW5jeVBhdGgiLCJmb3JtYXRPcHRpb25zIiwiZnVuYyIsIm9uIiwiaXNFbXB0eSIsImFCaW5kaW5ncyIsImluRXhwcmVzc2lvbnMiLCJjb25jYXRlbmF0ZWQiLCJ0b1N0cmluZyIsIm15Q29uY2F0RXhwcmVzc2lvbiIsImluRXhwcmVzc2lvbiIsImV4cHJlc3Npb25UeXBlIiwidHJhbnNmb3JtRnVuY3Rpb24iLCJpbmNsdWRlQWxsRXhwcmVzc2lvbiIsInBhcmFtZXRlciIsInN1YkV4cHJlc3Npb24iLCJiaW5kaW5nUGFyYW1ldGVyIiwibmVlZFBhcmVudGhlc2lzIiwiY29tcGlsZUNvbnN0YW50T2JqZWN0IiwiaXNOdWxsYWJsZSIsIm8iLCJwcm9wZXJ0aWVzIiwiY2hpbGRSZXN1bHQiLCJjb21waWxlRXhwcmVzc2lvbiIsImNvbXBpbGVDb25zdGFudCIsImVtYmVkZGVkSW5CaW5kaW5nIiwiZG9Ob3RTdHJpbmdpZnkiLCJjb21waWxlUGF0aEluTW9kZWxFeHByZXNzaW9uIiwiZXhwcmVzc2lvbkZvckJpbmRpbmciLCJlbWJlZGRlZFNlcGFyYXRvciIsImNvbnN0cmFpbnRzIiwiY29tcGxleEJpbmRpbmdEZWZpbml0aW9uIiwiY29tcGlsZVBhdGhJbk1vZGVsIiwib3V0QmluZGluZyIsImNvbXBpbGVDb21wbGV4VHlwZUV4cHJlc3Npb24iLCJjb21waWxlUGF0aFBhcmFtZXRlciIsIm91dHB1dEVuZCIsImhhc0VsZW1lbnRzIiwicGFyYW0iLCJ3cmFwQmluZGluZ0V4cHJlc3Npb24iLCJwYXJlbnRoZXNpc1JlcXVpcmVkIiwia2VlcFRhcmdldFR5cGUiLCJhcmd1bWVudFN0cmluZyIsImFyZyIsInN1YnN0ciIsImNvbXBhcmlzb25FeHByZXNzaW9uIiwiY29tcGlsZUNvbXBhcmlzb25FeHByZXNzaW9uIiwiaWZFbHNlRXhwcmVzc2lvbiIsInNldEV4cHJlc3Npb24iLCJjb25jYXRFeHByZXNzaW9uIiwibmVzdGVkRXhwcmVzc2lvbiIsImxlbmd0aEV4cHJlc3Npb24iLCJub3RFeHByZXNzaW9uIiwidHJ1dGh5RXhwcmVzc2lvbiIsImZvcm1hdHRlckV4cHJlc3Npb24iLCJjb21waWxlRm9ybWF0dGVyRXhwcmVzc2lvbiIsImNvbXBsZXhUeXBlRXhwcmVzc2lvbiIsImNvbXBpbGVPcGVyYW5kIiwiY29tcGlsZWRPcGVyYW5kIiwicGFydHMiLCJzaW5nbGVQYXRoIiwib3V0VmFsdWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJpbmRpbmdUb29sa2l0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcblx0QW5kQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEFuZENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0QXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Q29uZGl0aW9uYWxDaGVja09yVmFsdWUsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0RXFBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0RXFDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdEdlQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRHdEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRHdENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlLFxuXHRMZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHRMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0THRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0THRDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdE5lQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHROb3RBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Tm90Q29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRPckFubm90YXRpb25FeHByZXNzaW9uLFxuXHRPckNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0UGF0aEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRQYXRoQ29uZGl0aW9uRXhwcmVzc2lvbixcblx0UHJvcGVydHlBbm5vdGF0aW9uVmFsdWVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyByZXNvbHZlRW51bVZhbHVlIH0gZnJvbSBcIi4vQW5ub3RhdGlvbkVudW1cIjtcblxudHlwZSBQcmltaXRpdmVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgYm9vbGVhbiB8IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQ7XG50eXBlIERlZmluZWRQcmltaXRpdmVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgYm9vbGVhbiB8IG9iamVjdDtcbnR5cGUgUHJpbWl0aXZlVHlwZUNhc3Q8UD4gPVxuXHR8IChQIGV4dGVuZHMgQm9vbGVhbiA/IGJvb2xlYW4gOiBuZXZlcilcblx0fCAoUCBleHRlbmRzIE51bWJlciA/IG51bWJlciA6IG5ldmVyKVxuXHR8IChQIGV4dGVuZHMgU3RyaW5nID8gc3RyaW5nIDogbmV2ZXIpXG5cdHwgUDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbnR5cGUgQmFzZUV4cHJlc3Npb248VD4gPSB7XG5cdF90eXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29uc3RhbnRcIjtcblx0dmFsdWU6IFQ7XG59O1xuXG50eXBlIFNldE9wZXJhdG9yID0gXCImJlwiIHwgXCJ8fFwiO1xuZXhwb3J0IHR5cGUgU2V0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJTZXRcIjtcblx0b3BlcmF0b3I6IFNldE9wZXJhdG9yO1xuXHRvcGVyYW5kczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W107XG59O1xuXG5leHBvcnQgdHlwZSBOb3RFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248Ym9vbGVhbj4gJiB7XG5cdF90eXBlOiBcIk5vdFwiO1xuXHRvcGVyYW5kOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj47XG59O1xuXG5leHBvcnQgdHlwZSBUcnV0aHlFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248Ym9vbGVhbj4gJiB7XG5cdF90eXBlOiBcIlRydXRoeVwiO1xuXHRvcGVyYW5kOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlZmVyZW5jZUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxvYmplY3Q+ICYge1xuXHRfdHlwZTogXCJSZWZcIjtcblx0cmVmOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJGb3JtYXR0ZXJcIjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT5bXTtcbn07XG5cbnR5cGUgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkNvbXBsZXhUeXBlXCI7XG5cdHR5cGU6IHN0cmluZztcblx0Zm9ybWF0T3B0aW9uczogYW55O1xuXHRwYXJhbWV0ZXJzOiBvYmplY3Q7XG5cdGJpbmRpbmdQYXJhbWV0ZXJzOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkZ1bmN0aW9uXCI7XG5cdG9iaj86IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxvYmplY3Q+O1xuXHRmbjogc3RyaW5nO1xuXHRwYXJhbWV0ZXJzOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uY2F0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPHN0cmluZz4gJiB7XG5cdF90eXBlOiBcIkNvbmNhdFwiO1xuXHRleHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIExlbmd0aEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxzdHJpbmc+ICYge1xuXHRfdHlwZTogXCJMZW5ndGhcIjtcblx0cGF0aEluTW9kZWw6IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxhbnk+O1xufTtcblxudHlwZSBVbnJlc29sdmVhYmxlUGF0aEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxzdHJpbmc+ICYge1xuXHRfdHlwZTogXCJVbnJlc29sdmFibGVcIjtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgUGF0aEluTW9kZWxFeHByZXNzaW9uXG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJQYXRoSW5Nb2RlbFwiO1xuXHRtb2RlbE5hbWU/OiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0O1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50cz86IGFueTtcblx0cGFyYW1ldGVycz86IGFueTtcblx0dGFyZ2V0VHlwZT86IHN0cmluZztcblx0bW9kZT86IHN0cmluZztcblx0Zm9ybWF0T3B0aW9ucz86IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGVkVUk1QmluZGluZ0V4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRW1iZWRkZWRCaW5kaW5nXCI7XG5cdHZhbHVlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBFbWJlZGRlZFVJNUV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI7XG5cdHZhbHVlOiBzdHJpbmc7XG59O1xuXG50eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPT09XCIgfCBcIiE9PVwiIHwgXCI+PVwiIHwgXCI+XCIgfCBcIjw9XCIgfCBcIjxcIjtcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25FeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248Ym9vbGVhbj4gJiB7XG5cdF90eXBlOiBcIkNvbXBhcmlzb25cIjtcblx0b3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcjtcblx0b3BlcmFuZDE6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxhbnk+O1xuXHRvcGVyYW5kMjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT47XG59O1xuXG5leHBvcnQgdHlwZSBJZkVsc2VFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIklmRWxzZVwiO1xuXHRjb25kaXRpb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPjtcblx0b25UcnVlOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdG9uRmFsc2U6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPjtcbn07XG5cbi8qKlxuICogQW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byB0eXBlIFQuXG4gKlxuICogQHR5cGVkZWYgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uXG4gKi9cbmV4cG9ydCB0eXBlIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPiA9XG5cdHwgVW5yZXNvbHZlYWJsZVBhdGhFeHByZXNzaW9uXG5cdHwgQ29uc3RhbnRFeHByZXNzaW9uPFQ+XG5cdHwgU2V0RXhwcmVzc2lvblxuXHR8IE5vdEV4cHJlc3Npb25cblx0fCBUcnV0aHlFeHByZXNzaW9uXG5cdHwgQ29uY2F0RXhwcmVzc2lvblxuXHR8IExlbmd0aEV4cHJlc3Npb25cblx0fCBQYXRoSW5Nb2RlbEV4cHJlc3Npb248VD5cblx0fCBFbWJlZGRlZFVJNUJpbmRpbmdFeHByZXNzaW9uPFQ+XG5cdHwgRW1iZWRkZWRVSTVFeHByZXNzaW9uQmluZGluZ0V4cHJlc3Npb248VD5cblx0fCBDb21wYXJpc29uRXhwcmVzc2lvblxuXHR8IElmRWxzZUV4cHJlc3Npb248VD5cblx0fCBGb3JtYXR0ZXJFeHByZXNzaW9uPFQ+XG5cdHwgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+XG5cdHwgUmVmZXJlbmNlRXhwcmVzc2lvblxuXHR8IEZ1bmN0aW9uRXhwcmVzc2lvbjxUPjtcblxuLyoqXG4gKiBBbiBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHR5cGUgVCwgb3IgYSBjb25zdGFudCB2YWx1ZSBvZiB0eXBlIFRcbiAqL1xudHlwZSBFeHByZXNzaW9uT3JQcmltaXRpdmU8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+ID0gQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHwgVDtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWFibGVFeHByZXNzaW9uOiBVbnJlc29sdmVhYmxlUGF0aEV4cHJlc3Npb24gPSB7XG5cdF90eXBlOiBcIlVucmVzb2x2YWJsZVwiXG59O1xuXG5mdW5jdGlvbiBlc2NhcGVYbWxBdHRyaWJ1dGUoaW5wdXRTdHJpbmc6IHN0cmluZykge1xuXHRyZXR1cm4gaW5wdXRTdHJpbmcucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpO1xufVxuXG4vKipcbiAqIFR5cGVndWFyZCB0byBlbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBhIGJpbmRpbmcgdG9vbGtpdCBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24oXG5cdGV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiB8IHVua25vd25cbik6IGV4cHJlc3Npb24gaXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+IHtcblx0cmV0dXJuIChleHByZXNzaW9uIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPik/Ll90eXBlICE9PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxhbnk+W10pOiBib29sZWFuIHtcblx0cmV0dXJuIGV4cHJlc3Npb25zLmZpbmQoKGV4cHIpID0+IGV4cHIuX3R5cGUgPT09IFwiVW5yZXNvbHZhYmxlXCIpICE9PSB1bmRlZmluZWQ7XG59XG4vKipcbiAqIENoZWNrIHR3byBleHByZXNzaW9ucyBmb3IgKGRlZXApIGVxdWFsaXR5LlxuICpcbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0d28gZXhwcmVzc2lvbnMgYXJlIGVxdWFsXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbDxUPihhOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD4sIGI6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPik6IGJvb2xlYW4ge1xuXHRpZiAoYS5fdHlwZSAhPT0gYi5fdHlwZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHN3aXRjaCAoYS5fdHlwZSkge1xuXHRcdGNhc2UgXCJVbnJlc29sdmFibGVcIjpcblx0XHRcdHJldHVybiBmYWxzZTsgLy8gVW5yZXNvbHZhYmxlIGlzIG5ldmVyIGVxdWFsIHRvIGFueXRoaW5nIGV2ZW4gaXRzZWxmXG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0Y2FzZSBcIkVtYmVkZGVkQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gYS52YWx1ZSA9PT0gKGIgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+KS52YWx1ZTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZCwgKGIgYXMgTm90RXhwcmVzc2lvbikub3BlcmFuZCk7XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kLCAoYiBhcyBUcnV0aHlFeHByZXNzaW9uKS5vcGVyYW5kKTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm9wZXJhdG9yID09PSAoYiBhcyBTZXRFeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRhLm9wZXJhbmRzLmxlbmd0aCA9PT0gKGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMubGVuZ3RoICYmXG5cdFx0XHRcdGEub3BlcmFuZHMuZXZlcnkoKGV4cHJlc3Npb24pID0+XG5cdFx0XHRcdFx0KGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMuc29tZSgob3RoZXJFeHByZXNzaW9uKSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGV4cHJlc3Npb24sIG90aGVyRXhwcmVzc2lvbikpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEuY29uZGl0aW9uLCAoYiBhcyBJZkVsc2VFeHByZXNzaW9uPFQ+KS5jb25kaXRpb24pICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vblRydWUsIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLm9uVHJ1ZSkgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9uRmFsc2UsIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLm9uRmFsc2UpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEub3BlcmF0b3IgPT09IChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZDEsIChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYW5kMSkgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9wZXJhbmQyLCAoYiBhcyBDb21wYXJpc29uRXhwcmVzc2lvbikub3BlcmFuZDIpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0Y29uc3QgYUV4cHJlc3Npb25zID0gYS5leHByZXNzaW9ucztcblx0XHRcdGNvbnN0IGJFeHByZXNzaW9ucyA9IChiIGFzIENvbmNhdEV4cHJlc3Npb24pLmV4cHJlc3Npb25zO1xuXHRcdFx0aWYgKGFFeHByZXNzaW9ucy5sZW5ndGggIT09IGJFeHByZXNzaW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFFeHByZXNzaW9ucy5ldmVyeSgoZXhwcmVzc2lvbiwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgYkV4cHJlc3Npb25zW2luZGV4XSk7XG5cdFx0XHR9KTtcblxuXHRcdGNhc2UgXCJMZW5ndGhcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEucGF0aEluTW9kZWwsIChiIGFzIExlbmd0aEV4cHJlc3Npb24pLnBhdGhJbk1vZGVsKTtcblxuXHRcdGNhc2UgXCJQYXRoSW5Nb2RlbFwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5tb2RlbE5hbWUgPT09IChiIGFzIFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxUPikubW9kZWxOYW1lICYmXG5cdFx0XHRcdGEucGF0aCA9PT0gKGIgYXMgUGF0aEluTW9kZWxFeHByZXNzaW9uPFQ+KS5wYXRoICYmXG5cdFx0XHRcdGEudGFyZ2V0RW50aXR5U2V0ID09PSAoYiBhcyBQYXRoSW5Nb2RlbEV4cHJlc3Npb248VD4pLnRhcmdldEVudGl0eVNldFxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEuZm4gPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLmZuICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSkpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS50eXBlID09PSAoYiBhcyBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pLnR5cGUgJiZcblx0XHRcdFx0YS5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEuYmluZGluZ1BhcmFtZXRlcnMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT5cblx0XHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiRnVuY3Rpb25cIjpcblx0XHRcdGNvbnN0IG90aGVyRnVuY3Rpb24gPSBiIGFzIEZ1bmN0aW9uRXhwcmVzc2lvbjxUPjtcblx0XHRcdGlmIChhLm9iaiA9PT0gdW5kZWZpbmVkIHx8IG90aGVyRnVuY3Rpb24ub2JqID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGEub2JqID09PSBvdGhlckZ1bmN0aW9uO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLmZuID09PSBvdGhlckZ1bmN0aW9uLmZuICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vYmosIG90aGVyRnVuY3Rpb24ub2JqKSAmJlxuXHRcdFx0XHRhLnBhcmFtZXRlcnMubGVuZ3RoID09PSBvdGhlckZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKG90aGVyRnVuY3Rpb24ucGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKSlcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiUmVmXCI6XG5cdFx0XHRyZXR1cm4gYS5yZWYgPT09IChiIGFzIFJlZmVyZW5jZUV4cHJlc3Npb24pLnJlZjtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBuZXN0ZWQgU2V0RXhwcmVzc2lvbiBieSBpbmxpbmluZyBvcGVyYW5kcyBvZiB0eXBlIFNldEV4cHJlc3Npb24gd2l0aCB0aGUgc2FtZSBvcGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBmbGF0dGVuXG4gKiBAcmV0dXJucyBBIG5ldyBTZXRFeHByZXNzaW9uIHdpdGggdGhlIHNhbWUgb3BlcmF0b3JcbiAqL1xuZnVuY3Rpb24gZmxhdHRlblNldEV4cHJlc3Npb24oZXhwcmVzc2lvbjogU2V0RXhwcmVzc2lvbik6IFNldEV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5yZWR1Y2UoXG5cdFx0KHJlc3VsdDogU2V0RXhwcmVzc2lvbiwgb3BlcmFuZCkgPT4ge1xuXHRcdFx0Y29uc3QgY2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcgPVxuXHRcdFx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmIG9wZXJhbmQub3BlcmF0b3IgPT09IGV4cHJlc3Npb24ub3BlcmF0b3IgPyBvcGVyYW5kLm9wZXJhbmRzIDogW29wZXJhbmRdO1xuXHRcdFx0Y2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcuZm9yRWFjaCgoY2FuZGlkYXRlKSA9PiB7XG5cdFx0XHRcdGlmIChyZXN1bHQub3BlcmFuZHMuZXZlcnkoKGUpID0+ICFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGUsIGNhbmRpZGF0ZSkpKSB7XG5cdFx0XHRcdFx0cmVzdWx0Lm9wZXJhbmRzLnB1c2goY2FuZGlkYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0sXG5cdFx0eyBfdHlwZTogXCJTZXRcIiwgb3BlcmF0b3I6IGV4cHJlc3Npb24ub3BlcmF0b3IsIG9wZXJhbmRzOiBbXSB9XG5cdCk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGFuIGFycmF5IG9mIGJvb2xlYW4gZXhwcmVzc2lvbnMgY29udGFpbnMgYW4gZXhwcmVzc2lvbiBhbmQgaXRzIG5lZ2F0aW9uLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9ucyBBcnJheSBvZiBleHByZXNzaW9uc1xuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzZXQgb2YgZXhwcmVzc2lvbnMgY29udGFpbnMgYW4gZXhwcmVzc2lvbiBhbmQgaXRzIG5lZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIGhhc09wcG9zaXRlRXhwcmVzc2lvbnMoZXhwcmVzc2lvbnM6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPltdKTogYm9vbGVhbiB7XG5cdGNvbnN0IG5lZ2F0ZWRFeHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hcChub3QpO1xuXHRyZXR1cm4gZXhwcmVzc2lvbnMuc29tZSgoZXhwcmVzc2lvbiwgaW5kZXgpID0+IHtcblx0XHRmb3IgKGxldCBpID0gaW5kZXggKyAxOyBpIDwgbmVnYXRlZEV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChleHByZXNzaW9uLCBuZWdhdGVkRXhwcmVzc2lvbnNbaV0pKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0pO1xufVxuXG4vKipcbiAqIExvZ2ljYWwgYGFuZGAgZXhwcmVzc2lvbi5cbiAqXG4gKiBUaGUgZXhwcmVzc2lvbiBpcyBzaW1wbGlmaWVkIHRvIGZhbHNlIGlmIHRoaXMgY2FuIGJlIGRlY2lkZWQgc3RhdGljYWxseSAodGhhdCBpcywgaWYgb25lIG9wZXJhbmQgaXMgYSBjb25zdGFudFxuICogZmFsc2Ugb3IgaWYgdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYW4gb3BlcmFuZCBhbmQgaXRzIG5lZ2F0aW9uKS5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZHMgRXhwcmVzc2lvbnMgdG8gY29ubmVjdCBieSBgYW5kYFxuICogQHJldHVybnMgRXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZCguLi5vcGVyYW5kczogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCImJlwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLmV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRsZXQgaXNTdGF0aWNGYWxzZSA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcigoZXhwcmVzc2lvbikgPT4ge1xuXHRcdGlmIChpc0ZhbHNlKGV4cHJlc3Npb24pKSB7XG5cdFx0XHRpc1N0YXRpY0ZhbHNlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuICFpc0NvbnN0YW50KGV4cHJlc3Npb24pO1xuXHR9KTtcblx0aWYgKGlzU3RhdGljRmFsc2UpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHR9IGVsc2UgaWYgKG5vblRyaXZpYWxFeHByZXNzaW9uLmxlbmd0aCA9PT0gMCkge1xuXHRcdC8vIFJlc29sdmUgdGhlIGNvbnN0YW50IHRoZW5cblx0XHRjb25zdCBpc1ZhbGlkID0gZXhwcmVzc2lvbnMucmVkdWNlKChyZXN1bHQsIGV4cHJlc3Npb24pID0+IHJlc3VsdCAmJiBpc1RydWUoZXhwcmVzc2lvbiksIHRydWUpO1xuXHRcdHJldHVybiBjb25zdGFudChpc1ZhbGlkKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gbm9uVHJpdmlhbEV4cHJlc3Npb25bMF07XG5cdH0gZWxzZSBpZiAoaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyhub25Ucml2aWFsRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRcdG9wZXJhdG9yOiBcIiYmXCIsXG5cdFx0XHRvcGVyYW5kczogbm9uVHJpdmlhbEV4cHJlc3Npb25cblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogTG9naWNhbCBgb3JgIGV4cHJlc3Npb24uXG4gKlxuICogVGhlIGV4cHJlc3Npb24gaXMgc2ltcGxpZmllZCB0byB0cnVlIGlmIHRoaXMgY2FuIGJlIGRlY2lkZWQgc3RhdGljYWxseSAodGhhdCBpcywgaWYgb25lIG9wZXJhbmQgaXMgYSBjb25zdGFudFxuICogdHJ1ZSBvciBpZiB0aGUgZXhwcmVzc2lvbiBjb250YWlucyBhbiBvcGVyYW5kIGFuZCBpdHMgbmVnYXRpb24pLlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kcyBFeHByZXNzaW9ucyB0byBjb25uZWN0IGJ5IGBvcmBcbiAqIEByZXR1cm5zIEV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvciguLi5vcGVyYW5kczogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCJ8fFwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IGlzU3RhdGljVHJ1ZSA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcigoZXhwcmVzc2lvbikgPT4ge1xuXHRcdGlmIChpc1RydWUoZXhwcmVzc2lvbikpIHtcblx0XHRcdGlzU3RhdGljVHJ1ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAhaXNDb25zdGFudChleHByZXNzaW9uKSB8fCBleHByZXNzaW9uLnZhbHVlO1xuXHR9KTtcblx0aWYgKGlzU3RhdGljVHJ1ZSkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDApIHtcblx0XHQvLyBSZXNvbHZlIHRoZSBjb25zdGFudCB0aGVuXG5cdFx0Y29uc3QgaXNWYWxpZCA9IGV4cHJlc3Npb25zLnJlZHVjZSgocmVzdWx0LCBleHByZXNzaW9uKSA9PiByZXN1bHQgJiYgaXNUcnVlKGV4cHJlc3Npb24pLCB0cnVlKTtcblx0XHRyZXR1cm4gY29uc3RhbnQoaXNWYWxpZCk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5vblRyaXZpYWxFeHByZXNzaW9uWzBdO1xuXHR9IGVsc2UgaWYgKGhhc09wcG9zaXRlRXhwcmVzc2lvbnMobm9uVHJpdmlhbEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRcdG9wZXJhdG9yOiBcInx8XCIsXG5cdFx0XHRvcGVyYW5kczogbm9uVHJpdmlhbEV4cHJlc3Npb25cblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogTG9naWNhbCBgbm90YCBvcGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZCBUaGUgZXhwcmVzc2lvbiB0byByZXZlcnNlXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gbm90KG9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdG9wZXJhbmQgPSB3cmFwUHJpbWl0aXZlKG9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24ob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoaXNDb25zdGFudChvcGVyYW5kKSkge1xuXHRcdHJldHVybiBjb25zdGFudCghb3BlcmFuZC52YWx1ZSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dHlwZW9mIG9wZXJhbmQgPT09IFwib2JqZWN0XCIgJiZcblx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYXRvciA9PT0gXCJ8fFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYW5kcy5ldmVyeSgoZXhwcmVzc2lvbikgPT4gaXNDb25zdGFudChleHByZXNzaW9uKSB8fCBpc0NvbXBhcmlzb24oZXhwcmVzc2lvbikpXG5cdCkge1xuXHRcdHJldHVybiBhbmQoLi4ub3BlcmFuZC5vcGVyYW5kcy5tYXAoKGV4cHJlc3Npb24pID0+IG5vdChleHByZXNzaW9uKSkpO1xuXHR9IGVsc2UgaWYgKFxuXHRcdHR5cGVvZiBvcGVyYW5kID09PSBcIm9iamVjdFwiICYmXG5cdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmF0b3IgPT09IFwiJiZcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmFuZHMuZXZlcnkoKGV4cHJlc3Npb24pID0+IGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgaXNDb21wYXJpc29uKGV4cHJlc3Npb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gb3IoLi4ub3BlcmFuZC5vcGVyYW5kcy5tYXAoKGV4cHJlc3Npb24pID0+IG5vdChleHByZXNzaW9uKSkpO1xuXHR9IGVsc2UgaWYgKGlzQ29tcGFyaXNvbihvcGVyYW5kKSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgcmV2ZXJzZSBjb21wYXJpc29uXG5cdFx0c3dpdGNoIChvcGVyYW5kLm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiIT09XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIj09PVwiIH07XG5cdFx0XHRjYXNlIFwiPFwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI+PVwiIH07XG5cdFx0XHRjYXNlIFwiPD1cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPlwiIH07XG5cdFx0XHRjYXNlIFwiPT09XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIiE9PVwiIH07XG5cdFx0XHRjYXNlIFwiPlwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI8PVwiIH07XG5cdFx0XHRjYXNlIFwiPj1cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPFwiIH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG9wZXJhbmQuX3R5cGUgPT09IFwiTm90XCIpIHtcblx0XHRyZXR1cm4gb3BlcmFuZC5vcGVyYW5kO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJOb3RcIixcblx0XHRvcGVyYW5kOiBvcGVyYW5kXG5cdH07XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIHdoZXRoZXIgYSBiaW5kaW5nIGV4cHJlc3Npb24gaXMgZXF1YWwgdG8gdHJ1ZSB3aXRoIGEgbG9vc2UgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIG9wZXJhbmQgVGhlIGV4cHJlc3Npb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RydXRoeShvcGVyYW5kOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGlmIChpc0NvbnN0YW50KG9wZXJhbmQpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KCEhb3BlcmFuZC52YWx1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIlRydXRoeVwiLFxuXHRcdFx0b3BlcmFuZDogb3BlcmFuZFxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYmluZGluZyBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwuXG4gKlxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBtb2RlbE5hbWVcbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzXG4gKiBAcGFyYW0gcGF0aFZpc2l0b3JcbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gcmVwcmVzZW50YXRpbmcgdGhhdCBwYXRoIGluIHRoZSBtb2RlbFxuICogQGRlcHJlY2F0ZWQgdXNlIHBhdGhJbk1vZGVsIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRpbmdFeHByZXNzaW9uPFRhcmdldFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0cGF0aDogYW55LFxuXHRtb2RlbE5hbWU/OiBzdHJpbmcsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxUYXJnZXRUeXBlPiB8IFVucmVzb2x2ZWFibGVQYXRoRXhwcmVzc2lvbiB7XG5cdHJldHVybiBwYXRoSW5Nb2RlbChwYXRoLCBtb2RlbE5hbWUsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYmluZGluZyBleHByZXNzaW9uIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWwuXG4gKlxuICogQHRlbXBsYXRlIFRhcmdldFR5cGVcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9uIHRoZSBtb2RlbFxuICogQHBhcmFtIFttb2RlbE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBtb2RlbFxuICogQHBhcmFtIFt2aXNpdGVkTmF2aWdhdGlvblBhdGhzXSBUaGUgcGF0aHMgZnJvbSB0aGUgcm9vdCBlbnRpdHlTZXRcbiAqIEBwYXJhbSBbcGF0aFZpc2l0b3JdIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiByZXByZXNlbnRhdGluZyB0aGF0IHBhdGggaW4gdGhlIG1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoSW5Nb2RlbChcblx0cGF0aDogdW5kZWZpbmVkLFxuXHRtb2RlbE5hbWU/OiBzdHJpbmcsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM/OiBzdHJpbmdbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogVW5yZXNvbHZlYWJsZVBhdGhFeHByZXNzaW9uO1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGhJbk1vZGVsPFRhcmdldFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0cGF0aDogc3RyaW5nLFxuXHRtb2RlbE5hbWU/OiBzdHJpbmcsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM/OiBzdHJpbmdbXSxcblx0cGF0aFZpc2l0b3I/OiB1bmRlZmluZWRcbik6IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxUYXJnZXRUeXBlPjtcbmV4cG9ydCBmdW5jdGlvbiBwYXRoSW5Nb2RlbDxUYXJnZXRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHBhdGg6IHN0cmluZyxcblx0bW9kZWxOYW1lPzogc3RyaW5nLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzPzogc3RyaW5nW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IFVucmVzb2x2ZWFibGVQYXRoRXhwcmVzc2lvbiB8IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxUYXJnZXRUeXBlPjtcbmV4cG9ydCBmdW5jdGlvbiBwYXRoSW5Nb2RlbDxUYXJnZXRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxOYW1lPzogc3RyaW5nLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzPzogc3RyaW5nW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IFVucmVzb2x2ZWFibGVQYXRoRXhwcmVzc2lvbiB8IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxUYXJnZXRUeXBlPjtcbmV4cG9ydCBmdW5jdGlvbiBwYXRoSW5Nb2RlbDxUYXJnZXRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxOYW1lPzogc3RyaW5nLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBVbnJlc29sdmVhYmxlUGF0aEV4cHJlc3Npb24gfCBQYXRoSW5Nb2RlbEV4cHJlc3Npb248VGFyZ2V0VHlwZT4ge1xuXHRpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGxldCB0YXJnZXRQYXRoO1xuXHRpZiAocGF0aFZpc2l0b3IpIHtcblx0XHR0YXJnZXRQYXRoID0gcGF0aFZpc2l0b3IocGF0aCk7XG5cdFx0aWYgKHRhcmdldFBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCBsb2NhbFBhdGggPSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLmNvbmNhdCgpO1xuXHRcdGxvY2FsUGF0aC5wdXNoKHBhdGgpO1xuXHRcdHRhcmdldFBhdGggPSBsb2NhbFBhdGguam9pbihcIi9cIik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJQYXRoSW5Nb2RlbFwiLFxuXHRcdG1vZGVsTmFtZTogbW9kZWxOYW1lLFxuXHRcdHBhdGg6IHRhcmdldFBhdGhcblx0fTtcbn1cblxudHlwZSBQbGFpbkV4cHJlc3Npb25PYmplY3QgPSB7IFtpbmRleDogc3RyaW5nXTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT4gfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBiYXNlZCBvbiBhIHByaW1pdGl2ZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHZhbHVlIFRoZSBjb25zdGFudCB0byB3cmFwIGluIGFuIGV4cHJlc3Npb25cbiAqIEByZXR1cm5zIFRoZSBjb25zdGFudCBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4odmFsdWU6IFQpOiBDb25zdGFudEV4cHJlc3Npb248VD4ge1xuXHRsZXQgY29uc3RhbnRWYWx1ZTogVDtcblxuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZS5tYXAod3JhcFByaW1pdGl2ZSkgYXMgVDtcblx0XHR9IGVsc2UgaWYgKGlzUHJpbWl0aXZlT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IHZhbHVlLnZhbHVlT2YoKSBhcyBUO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdGFudFZhbHVlID0gT2JqZWN0LmVudHJpZXModmFsdWUpLnJlZHVjZSgocGxhaW5FeHByZXNzaW9uLCBba2V5LCB2YWxdKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHdyYXBwZWRWYWx1ZSA9IHdyYXBQcmltaXRpdmUodmFsKTtcblx0XHRcdFx0aWYgKHdyYXBwZWRWYWx1ZS5fdHlwZSAhPT0gXCJDb25zdGFudFwiIHx8IHdyYXBwZWRWYWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cGxhaW5FeHByZXNzaW9uW2tleV0gPSB3cmFwcGVkVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHBsYWluRXhwcmVzc2lvbjtcblx0XHRcdH0sIHt9IGFzIFBsYWluRXhwcmVzc2lvbk9iamVjdCkgYXMgVDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3RhbnRWYWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0cmV0dXJuIHsgX3R5cGU6IFwiQ29uc3RhbnRcIiwgdmFsdWU6IGNvbnN0YW50VmFsdWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCaW5kaW5nU3RyaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0dmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIsXG5cdHRhcmdldFR5cGU/OiBzdHJpbmdcbik6IENvbnN0YW50RXhwcmVzc2lvbjxUPiB8IEVtYmVkZGVkVUk1QmluZGluZ0V4cHJlc3Npb248VD4gfCBFbWJlZGRlZFVJNUV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPiB7XG5cdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiez1cIikpIHtcblx0XHRcdC8vIEV4cHJlc3Npb24gYmluZGluZywgd2UgY2FuIGp1c3QgcmVtb3ZlIHRoZSBvdXRlciBiaW5kaW5nIHRoaW5nc1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0X3R5cGU6IFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdF90eXBlOiBcIkVtYmVkZGVkQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT09IFwiYm9vbGVhblwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAodmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcImZhbHNlXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHZhbHVlID09PSBcInRydWVcIikgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICghaXNOYU4oTnVtYmVyKHZhbHVlKSkgfHwgdmFsdWUgPT09IFwiTmFOXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KE51bWJlcih2YWx1ZSkpIGFzIENvbnN0YW50RXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodmFsdWUpIGFzIENvbnN0YW50RXhwcmVzc2lvbjxUPjtcblx0fVxufVxuXG4vKipcbiAqIEEgbmFtZWQgcmVmZXJlbmNlLlxuICpcbiAqIEBzZWUgZm5cbiAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlXG4gKiBAcmV0dXJucyBUaGUgb2JqZWN0IHJlZmVyZW5jZSBiaW5kaW5nIHBhcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZihyZWZlcmVuY2U6IHN0cmluZyB8IG51bGwpOiBSZWZlcmVuY2VFeHByZXNzaW9uIHtcblx0cmV0dXJuIHsgX3R5cGU6IFwiUmVmXCIsIHJlZjogcmVmZXJlbmNlIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHR5cGUgaXMgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBFdmVyeSBvYmplY3QgaGF2aW5nIGEgcHJvcGVydHkgbmFtZWQgYF90eXBlYCBvZiBzb21lIHZhbHVlIGlzIGNvbnNpZGVyZWQgYW4gZXhwcmVzc2lvbiwgZXZlbiBpZiB0aGVyZSBpcyBhY3R1YWxseVxuICogbm8gc3VjaCBleHByZXNzaW9uIHR5cGUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSBzb21ldGhpbmcgVHlwZSB0byBjaGVja1xuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0eXBlIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBpc0V4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHNvbWV0aGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogc29tZXRoaW5nIGlzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiBzb21ldGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHNvbWV0aGluZyA9PT0gXCJvYmplY3RcIiAmJiAoc29tZXRoaW5nIGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyYXAgYSBwcmltaXRpdmUgaW50byBhIGNvbnN0YW50IGV4cHJlc3Npb24gaWYgaXQgaXMgbm90IGFscmVhZHkgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHNvbWV0aGluZyBUaGUgb2JqZWN0IHRvIHdyYXAgaW4gYSBDb25zdGFudCBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBFaXRoZXIgdGhlIG9yaWdpbmFsIG9iamVjdCBvciB0aGUgd3JhcHBlZCBvbmUgZGVwZW5kaW5nIG9uIHRoZSBjYXNlXG4gKi9cbmZ1bmN0aW9uIHdyYXBQcmltaXRpdmU8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHNvbWV0aGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGlzRXhwcmVzc2lvbihzb21ldGhpbmcpKSB7XG5cdFx0cmV0dXJuIHNvbWV0aGluZztcblx0fVxuXG5cdHJldHVybiBjb25zdGFudChzb21ldGhpbmcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBvciB2YWx1ZSBwcm92aWRlZCBpcyBjb25zdGFudCBvciBub3QuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gIG1heWJlQ29uc3RhbnQgVGhlIGV4cHJlc3Npb24gb3IgcHJpbWl0aXZlIHZhbHVlIHRoYXQgaXMgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIGl0IGlzIGNvbnN0YW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihtYXliZUNvbnN0YW50OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBtYXliZUNvbnN0YW50IGlzIENvbnN0YW50RXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgbWF5YmVDb25zdGFudCAhPT0gXCJvYmplY3RcIiB8fCAobWF5YmVDb25zdGFudCBhcyBCYXNlRXhwcmVzc2lvbjxUPikuX3R5cGUgPT09IFwiQ29uc3RhbnRcIjtcbn1cblxuZnVuY3Rpb24gaXNUcnVlKGV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRyZXR1cm4gaXNDb25zdGFudChleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLnZhbHVlID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0ZhbHNlKGV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxQcmltaXRpdmVUeXBlPikge1xuXHRyZXR1cm4gaXNDb25zdGFudChleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLnZhbHVlID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGV4cHJlc3Npb24gb3IgdmFsdWUgcHJvdmlkZWQgaXMgYSBwYXRoIGluIG1vZGVsIGV4cHJlc3Npb24gb3Igbm90LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBtYXliZUJpbmRpbmcgVGhlIGV4cHJlc3Npb24gb3IgcHJpbWl0aXZlIHZhbHVlIHRoYXQgaXMgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIGl0IGlzIGEgcGF0aCBpbiBtb2RlbCBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdG1heWJlQmluZGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBtYXliZUJpbmRpbmcgaXMgUGF0aEluTW9kZWxFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHR5cGVvZiBtYXliZUJpbmRpbmcgPT09IFwib2JqZWN0XCIgJiYgKG1heWJlQmluZGluZyBhcyBCYXNlRXhwcmVzc2lvbjxUPikuX3R5cGUgPT09IFwiUGF0aEluTW9kZWxcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGV4cHJlc3Npb24gb3IgdmFsdWUgcHJvdmlkZWQgaXMgYSBjb21wbGV4IHR5cGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSAgbWF5YmVCaW5kaW5nIFRoZSBleHByZXNzaW9uIG9yIHByaW1pdGl2ZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCBpcyBhIHBhdGggaW4gbW9kZWwgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wbGV4VHlwZUV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRtYXliZUJpbmRpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogbWF5YmVCaW5kaW5nIGlzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgbWF5YmVCaW5kaW5nID09PSBcIm9iamVjdFwiICYmIChtYXliZUJpbmRpbmcgYXMgQmFzZUV4cHJlc3Npb248VD4pLl90eXBlID09PSBcIkNvbXBsZXhUeXBlXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIG9yIHZhbHVlIHByb3ZpZGVkIGlzIGEgY29uY2F0IGV4cHJlc3Npb24gb3Igbm90LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBDb25jYXRFeHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGlzQ29uY2F0RXhwcmVzc2lvbihleHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pOiBleHByZXNzaW9uIGlzIENvbmNhdEV4cHJlc3Npb24ge1xuXHRyZXR1cm4gdHlwZW9mIGV4cHJlc3Npb24gPT09IFwib2JqZWN0XCIgJiYgKGV4cHJlc3Npb24gYXMgQmFzZUV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pLl90eXBlID09PSBcIkNvbmNhdFwiO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBwcm92aWRlZCBpcyBhIGNvbXBhcmlzb24gb3Igbm90LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb25cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhIENvbXBhcmlzb25FeHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGFyaXNvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+KTogZXhwcmVzc2lvbiBpcyBDb21wYXJpc29uRXhwcmVzc2lvbiB7XG5cdHJldHVybiBleHByZXNzaW9uLl90eXBlID09PSBcIkNvbXBhcmlzb25cIjtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBvZiB0eXBlIHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgaW5wdXQgZXhwcmVzc2lvbiBvciBvYmplY3QgaW4gZ2VuZXJhbFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpbnB1dCBpcyBjb25zdGFudCB3aGljaCBoYXMgdW5kZWZpbmVkIGZvciB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWRFeHByZXNzaW9uKGV4cHJlc3Npb246IHVua25vd24pOiBib29sZWFuIHtcblx0Y29uc3QgZXhwcmVzc2lvbkFzRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24gYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+O1xuXHRyZXR1cm4gZXhwcmVzc2lvbkFzRXhwcmVzc2lvbj8uX3R5cGUgPT09IFwiQ29uc3RhbnRcIiAmJiBleHByZXNzaW9uQXNFeHByZXNzaW9uPy52YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG50eXBlIENvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPiA9XG5cdHwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IElmQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBPckFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgQW5kQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBOZUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgRXFBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE5vdEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgR3RBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEdlQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBMZUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTHRBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmVPYmplY3Qob2JqZWN0VHlwZTogb2JqZWN0KTogYm9vbGVhbiB7XG5cdHN3aXRjaCAob2JqZWN0VHlwZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG5cdFx0Y2FzZSBcIlN0cmluZ1wiOlxuXHRcdGNhc2UgXCJOdW1iZXJcIjpcblx0XHRjYXNlIFwiQm9vbGVhblwiOlxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcGFzc2VkIGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlIGlzIGEgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBhbm5vdGF0aW9uVmFsdWUgVGhlIGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBpcyBhIHtDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb259XG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFQ+KGFubm90YXRpb25WYWx1ZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8VD4pOiBhbm5vdGF0aW9uVmFsdWUgaXMgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHR5cGVvZiBhbm5vdGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIWlzUHJpbWl0aXZlT2JqZWN0KGFubm90YXRpb25WYWx1ZSBhcyBvYmplY3QpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGFubm90YXRpb25WYWx1ZSBmb3IgYSBnaXZlbiBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBhbm5vdGF0aW9uVmFsdWUgVGhlIHNvdXJjZSBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZVxuICogQHBhcmFtIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUgaWYgdGhlIGFubm90YXRpb25WYWx1ZSBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSBwYXRoVmlzaXRvciBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uVmFsdWUgZXF1aXZhbGVudCB0byB0aGF0IGFubm90YXRpb24gYW5ub3RhdGlvblZhbHVlXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25FeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0YW5ub3RhdGlvblZhbHVlOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxUPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0ZGVmYXVsdFZhbHVlPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZUNhc3Q8VD4+IHtcblx0cmV0dXJuIGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihhbm5vdGF0aW9uVmFsdWUsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIGRlZmF1bHRWYWx1ZSwgcGF0aFZpc2l0b3IpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgY29ycmVzcG9uZGluZyBhbm5vdGF0aW9uVmFsdWUgZm9yIGEgZ2l2ZW4gYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gYW5ub3RhdGlvblZhbHVlIFRoZSBzb3VyY2UgYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWVcbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIGlmIHRoZSBhbm5vdGF0aW9uVmFsdWUgaXMgdW5kZWZpbmVkXG4gKiBAcGFyYW0gcGF0aFZpc2l0b3IgQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyBUaGUgYW5ub3RhdGlvblZhbHVlIGVxdWl2YWxlbnQgdG8gdGhhdCBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0YW5ub3RhdGlvblZhbHVlOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxUPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0ZGVmYXVsdFZhbHVlPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZUNhc3Q8VD4+IHtcblx0aWYgKGFubm90YXRpb25WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHdyYXBQcmltaXRpdmUoZGVmYXVsdFZhbHVlIGFzIFQpO1xuXHR9XG5cdGFubm90YXRpb25WYWx1ZSA9IGFubm90YXRpb25WYWx1ZT8udmFsdWVPZigpIGFzIFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFQ+O1xuXHRpZiAoIWlzQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZSkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoYW5ub3RhdGlvblZhbHVlKTtcblx0fVxuXG5cdHN3aXRjaCAoYW5ub3RhdGlvblZhbHVlLnR5cGUpIHtcblx0XHRjYXNlIFwiUGF0aFwiOlxuXHRcdFx0cmV0dXJuIHBhdGhJbk1vZGVsKGFubm90YXRpb25WYWx1ZS5wYXRoLCB1bmRlZmluZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRjYXNlIFwiSWZcIjpcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uSWZFeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZS5JZiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBub3QocGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5Ob3QsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJFcVwiOlxuXHRcdFx0cmV0dXJuIGVxdWFsKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkVxWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuRXFbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIk5lXCI6XG5cdFx0XHRyZXR1cm4gbm90RXF1YWwoXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTmVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5OZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiR3RcIjpcblx0XHRcdHJldHVybiBncmVhdGVyVGhhbihcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5HdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkd0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJHZVwiOlxuXHRcdFx0cmV0dXJuIGdyZWF0ZXJPckVxdWFsKFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkdlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuR2VbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkx0XCI6XG5cdFx0XHRyZXR1cm4gbGVzc1RoYW4oXG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uVmFsdWUuTHRbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHQpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiTGVcIjpcblx0XHRcdHJldHVybiBsZXNzT3JFcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkxlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJPclwiOlxuXHRcdFx0cmV0dXJuIG9yKFxuXHRcdFx0XHQuLi5hbm5vdGF0aW9uVmFsdWUuT3IubWFwKGZ1bmN0aW9uIChvckNvbmRpdGlvbikge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb248Ym9vbGVhbj4ob3JDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0fSlcblx0XHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJBbmRcIjpcblx0XHRcdHJldHVybiBhbmQoXG5cdFx0XHRcdC4uLmFubm90YXRpb25WYWx1ZS5BbmQubWFwKGZ1bmN0aW9uIChhbmRDb25kaXRpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uPGJvb2xlYW4+KGFuZENvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdFx0Y2FzZSBcIkFwcGx5XCI6XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkFwcGx5RXhwcmVzc2lvbihcblx0XHRcdFx0YW5ub3RhdGlvblZhbHVlIGFzIEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdFx0cGF0aFZpc2l0b3Jcblx0XHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9XG5cdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgYW5ub3RhdGlvbiBjb25kaXRpb24gaW50byBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25WYWx1ZSBUaGUgY29uZGl0aW9uIG9yIHZhbHVlIGZyb20gdGhlIGFubm90YXRpb25cbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMgQW4gZXF1aXZhbGVudCBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGFubm90YXRpb25WYWx1ZTogQ29uZGl0aW9uYWxDaGVja09yVmFsdWUsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPiB7XG5cdGlmIChhbm5vdGF0aW9uVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGFubm90YXRpb25WYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuXHRcdHJldHVybiBjb25zdGFudChhbm5vdGF0aW9uVmFsdWUgYXMgVCk7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0cmV0dXJuIG9yKFxuXHRcdFx0Li4uKChhbm5vdGF0aW9uVmFsdWUgYXMgT3JDb25kaXRpb25hbEV4cHJlc3Npb24pLiRPci5tYXAoZnVuY3Rpb24gKG9yQ29uZGl0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb24ob3JDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdH0pIGFzIHVua25vd24gYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEFuZFwiKSkge1xuXHRcdHJldHVybiBhbmQoXG5cdFx0XHQuLi4oKGFubm90YXRpb25WYWx1ZSBhcyBBbmRDb25kaXRpb25hbEV4cHJlc3Npb24pLiRBbmQubWFwKGZ1bmN0aW9uIChhbmRDb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbmRDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdH0pIGFzIHVua25vd24gYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJE5vdFwiKSkge1xuXHRcdHJldHVybiBub3QoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBOb3RDb25kaXRpb25hbEV4cHJlc3Npb24pLiROb3QsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdHJldHVybiBlcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEVxQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kRXFbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEVxQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kRXFbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiROZVwiKSkge1xuXHRcdHJldHVybiBub3RFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTmVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTmVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRHdFwiKSkge1xuXHRcdHJldHVybiBncmVhdGVyVGhhbihcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEd0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR3RbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEd0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR3RbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdHJldHVybiBncmVhdGVyT3JFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR2VbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR2VbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRMdFwiKSkge1xuXHRcdHJldHVybiBsZXNzVGhhbihcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEx0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTHRbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEx0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTHRbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRMZVwiKSkge1xuXHRcdHJldHVybiBsZXNzT3JFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIExlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTGVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIExlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTGVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRQYXRoXCIpKSB7XG5cdFx0cmV0dXJuIHBhdGhJbk1vZGVsKChhbm5vdGF0aW9uVmFsdWUgYXMgUGF0aENvbmRpdGlvbkV4cHJlc3Npb248VD4pLiRQYXRoLCB1bmRlZmluZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRyZXR1cm4gZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiBcIkFwcGx5XCIsXG5cdFx0XHRcdEZ1bmN0aW9uOiAoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEZ1bmN0aW9uLFxuXHRcdFx0XHRBcHBseTogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRBcHBseVxuXHRcdFx0fSBhcyBULFxuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0cmV0dXJuIGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogXCJJZlwiLFxuXHRcdFx0XHRJZjogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRJZlxuXHRcdFx0fSBhcyBULFxuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEVudW1NZW1iZXJcIikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQocmVzb2x2ZUVudW1WYWx1ZSgoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEVudW1NZW1iZXIpIGFzIFQpO1xuXHR9XG5cdHJldHVybiBjb25zdGFudChmYWxzZSBhcyBUKTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSB7SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlfSBpbnRvIGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gYW5ub3RhdGlvblZhbHVlIEFuIElmIGV4cHJlc3Npb24gcmV0dXJuaW5nIHRoZSB0eXBlIFRcbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMgVGhlIGVxdWl2YWxlbnQgaWZFbHNlIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25JZkV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uVmFsdWU6IElmQW5ub3RhdGlvbkV4cHJlc3Npb25WYWx1ZTxUPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIGlmRWxzZShcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZVsxXSBhcyBhbnksIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlWzJdIGFzIGFueSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uKFxuXHRhcHBseUV4cHJlc3Npb246IEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRzd2l0Y2ggKGFwcGx5RXhwcmVzc2lvbi5GdW5jdGlvbikge1xuXHRcdGNhc2UgXCJvZGF0YS5jb25jYXRcIjpcblx0XHRcdHJldHVybiBjb25jYXQoXG5cdFx0XHRcdC4uLmFwcGx5RXhwcmVzc2lvbi5BcHBseS5tYXAoKGFwcGx5UGFyYW06IGFueSkgPT4ge1xuXHRcdFx0XHRcdGxldCBhcHBseVBhcmFtQ29udmVydGVkID0gYXBwbHlQYXJhbTtcblx0XHRcdFx0XHRpZiAoYXBwbHlQYXJhbS5oYXNPd25Qcm9wZXJ0eShcIiRQYXRoXCIpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVBhcmFtQ29udmVydGVkID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIixcblx0XHRcdFx0XHRcdFx0cGF0aDogYXBwbHlQYXJhbS4kUGF0aFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRcdFx0XHRcdGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiSWZcIixcblx0XHRcdFx0XHRcdFx0SWY6IGFwcGx5UGFyYW0uJElmXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYXBwbHlQYXJhbS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQYXJhbUNvbnZlcnRlZCA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJBcHBseVwiLFxuXHRcdFx0XHRcdFx0XHRGdW5jdGlvbjogYXBwbHlQYXJhbS4kRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdEFwcGx5OiBhcHBseVBhcmFtLiRBcHBseVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihhcHBseVBhcmFtQ29udmVydGVkLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdH1cblx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgaGVscGVyIGZvciB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb25zIChlcXVhbCwgbm90RXF1YWwsIC4uLikuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIHRvIGFwcGx5XG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgb3BlcmF0b3JcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIG9wZXJhdG9yXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5mdW5jdGlvbiBjb21wYXJpc29uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0b3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChpc0NvbnN0YW50KGxlZnRFeHByZXNzaW9uKSAmJiBpc0NvbnN0YW50KHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiIT09XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSAhPT0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI9PT1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID09PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIjxcIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlIDwgcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI8PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPD0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI+XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA+IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPj1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID49IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJDb21wYXJpc29uXCIsXG5cdFx0XHRvcGVyYXRvcjogb3BlcmF0b3IsXG5cdFx0XHRvcGVyYW5kMTogbGVmdEV4cHJlc3Npb24sXG5cdFx0XHRvcGVyYW5kMjogcmlnaHRFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGV4cHJlc3Npb246IFBhdGhJbk1vZGVsRXhwcmVzc2lvbjxhbnk+IHwgVW5yZXNvbHZlYWJsZVBhdGhFeHByZXNzaW9uKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPG51bWJlcj4ge1xuXHRpZiAoZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmFibGVcIikge1xuXHRcdHJldHVybiBleHByZXNzaW9uO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiTGVuZ3RoXCIsXG5cdFx0cGF0aEluTW9kZWw6IGV4cHJlc3Npb25cblx0fTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImVxdWFsXCIgKD09PSkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMgQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVkdWNlKGxlZnQ6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPiwgcmlnaHQ6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPikge1xuXHRcdGlmIChsZWZ0Ll90eXBlID09PSBcIkNvbXBhcmlzb25cIiAmJiBpc1RydWUocmlnaHQpKSB7XG5cdFx0XHQvLyBjb21wYXJlKGEsIGIpID09PSB0cnVlIH5+PiBjb21wYXJlKGEsIGIpXG5cdFx0XHRyZXR1cm4gbGVmdDtcblx0XHR9IGVsc2UgaWYgKGxlZnQuX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiICYmIGlzRmFsc2UocmlnaHQpKSB7XG5cdFx0XHQvLyBjb21wYXJlKGEsIGIpID09PSBmYWxzZSB+fj4gIWNvbXBhcmUoYSwgYilcblx0XHRcdHJldHVybiBub3QobGVmdCk7XG5cdFx0fSBlbHNlIGlmIChsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vblRydWUsIHJpZ2h0KSkge1xuXHRcdFx0Ly8gKGlmICh4KSB7IGEgfSBlbHNlIHsgYiB9KSA9PT0gYSB+fj4geCB8fCAoYiA9PT0gYSlcblx0XHRcdHJldHVybiBvcihsZWZ0LmNvbmRpdGlvbiwgZXF1YWwobGVmdC5vbkZhbHNlLCByaWdodCkpO1xuXHRcdH0gZWxzZSBpZiAobGVmdC5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnQub25GYWxzZSwgcmlnaHQpKSB7XG5cdFx0XHQvLyAoaWYgKHgpIHsgYSB9IGVsc2UgeyBiIH0pID09PSBiIH5+PiAheCB8fCAoYSA9PT0gYilcblx0XHRcdHJldHVybiBvcihub3QobGVmdC5jb25kaXRpb24pLCBlcXVhbChsZWZ0Lm9uVHJ1ZSwgcmlnaHQpKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0bGVmdC5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJlxuXHRcdFx0aXNDb25zdGFudChsZWZ0Lm9uVHJ1ZSkgJiZcblx0XHRcdGlzQ29uc3RhbnQobGVmdC5vbkZhbHNlKSAmJlxuXHRcdFx0aXNDb25zdGFudChyaWdodCkgJiZcblx0XHRcdCFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnQub25UcnVlLCByaWdodCkgJiZcblx0XHRcdCFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnQub25GYWxzZSwgcmlnaHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gZXhwbG9pdCBzeW1tZXRyeTogYSA9PT0gYiA8fj4gYiA9PT0gYVxuXHRjb25zdCByZWR1Y2VkID0gcmVkdWNlKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pID8/IHJlZHVjZShyaWdodEV4cHJlc3Npb24sIGxlZnRFeHByZXNzaW9uKTtcblx0cmV0dXJuIHJlZHVjZWQgPz8gY29tcGFyaXNvbihcIj09PVwiLCBsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcIm5vdCBlcXVhbFwiICghPT0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RFcXVhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gbm90KGVxdWFsKGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImdyZWF0ZXIgb3IgZXF1YWxcIiAoPj0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncmVhdGVyT3JFcXVhbDxUIGV4dGVuZHMgRGVmaW5lZFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI+PVwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImdyZWF0ZXIgdGhhblwiICg+KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JlYXRlclRoYW48VCBleHRlbmRzIERlZmluZWRQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPlwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImxlc3Mgb3IgZXF1YWxcIiAoPD0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzT3JFcXVhbDxUIGV4dGVuZHMgRGVmaW5lZFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI8PVwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImxlc3MgdGhhblwiICg8KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc1RoYW48VCBleHRlbmRzIERlZmluZWRQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPFwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBJZi10aGVuLWVsc2UgZXhwcmVzc2lvbi5cbiAqXG4gKiBFdmFsdWF0ZXMgdG8gb25UcnVlIGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUsIGVsc2UgZXZhbHVhdGVzIHRvIG9uRmFsc2UuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBjb25kaXRpb24gdG8gZXZhbHVhdGVcbiAqIEBwYXJhbSBvblRydWUgRXhwcmVzc2lvbiByZXN1bHQgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZVxuICogQHBhcmFtIG9uRmFsc2UgRXhwcmVzc2lvbiByZXN1bHQgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gZmFsc2VcbiAqIEByZXR1cm5zIFRoZSBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNvbmRpdGlvbmFsIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZkVsc2U8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRjb25kaXRpb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPixcblx0b25UcnVlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdG9uRmFsc2U6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHtcblx0bGV0IGNvbmRpdGlvbkV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKGNvbmRpdGlvbik7XG5cdGxldCBvblRydWVFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShvblRydWUpO1xuXHRsZXQgb25GYWxzZUV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKG9uRmFsc2UpO1xuXG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbihjb25kaXRpb25FeHByZXNzaW9uLCBvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0Ly8gc3dhcCBicmFuY2hlcyBpZiB0aGUgY29uZGl0aW9uIGlzIGEgbmVnYXRpb25cblx0aWYgKGNvbmRpdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiTm90XCIpIHtcblx0XHQvLyBpZkVsc2Uobm90KFgpLCBhLCBiKSAtLT4gaWZFbHNlKFgsIGIsIGEpXG5cdFx0W29uVHJ1ZUV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uXSA9IFtvbkZhbHNlRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbl07XG5cdFx0Y29uZGl0aW9uRXhwcmVzc2lvbiA9IG5vdChjb25kaXRpb25FeHByZXNzaW9uKTtcblx0fVxuXG5cdC8vIGlubGluZSBuZXN0ZWQgaWYtZWxzZSBleHByZXNzaW9uczogb25UcnVlIGJyYW5jaFxuXHQvLyBpZkVsc2UoWCwgaWZFbHNlKFgsIGEsIGIpLCBjKSA9PT4gaWZFbHNlKFgsIGEsIGMpXG5cdGlmIChvblRydWVFeHByZXNzaW9uLl90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbi5jb25kaXRpb24pKSB7XG5cdFx0b25UcnVlRXhwcmVzc2lvbiA9IG9uVHJ1ZUV4cHJlc3Npb24ub25UcnVlO1xuXHR9XG5cblx0Ly8gaW5saW5lIG5lc3RlZCBpZi1lbHNlIGV4cHJlc3Npb25zOiBvbkZhbHNlIGJyYW5jaFxuXHQvLyBpZkVsc2UoWCwgYSwgaWZFbHNlKFgsIGIsIGMpKSA9PT4gaWZFbHNlKFgsIGEsIGMpXG5cdGlmIChvbkZhbHNlRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uLmNvbmRpdGlvbikpIHtcblx0XHRvbkZhbHNlRXhwcmVzc2lvbiA9IG9uRmFsc2VFeHByZXNzaW9uLm9uRmFsc2U7XG5cdH1cblxuXHQvLyAoaWYgdHJ1ZSB0aGVuIGEgZWxzZSBiKSAgfn4+IGFcblx0Ly8gKGlmIGZhbHNlIHRoZW4gYSBlbHNlIGIpIH5+PiBiXG5cdGlmIChpc0NvbnN0YW50KGNvbmRpdGlvbkV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbmRpdGlvbkV4cHJlc3Npb24udmFsdWUgPyBvblRydWVFeHByZXNzaW9uIDogb25GYWxzZUV4cHJlc3Npb247XG5cdH1cblxuXHQvLyBpZiAoaXNDb25zdGFudEJvb2xlYW4ob25UcnVlRXhwcmVzc2lvbikgfHwgaXNDb25zdGFudEJvb2xlYW4ob25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdC8vIFx0cmV0dXJuIG9yKGFuZChjb25kaXRpb24sIG9uVHJ1ZUV4cHJlc3Npb24gYXMgRXhwcmVzc2lvbjxib29sZWFuPiksIGFuZChub3QoY29uZGl0aW9uKSwgb25GYWxzZUV4cHJlc3Npb24gYXMgRXhwcmVzc2lvbjxib29sZWFuPikpIGFzIEV4cHJlc3Npb248VD5cblx0Ly8gfVxuXHQvLyAoaWYgWCB0aGVuIGEgZWxzZSBhKSB+fj4gYVxuXHRpZiAoX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb25UcnVlRXhwcmVzc2lvbjtcblx0fVxuXG5cdC8vIGlmIFggdGhlbiBhIGVsc2UgZmFsc2Ugfn4+IFggJiYgYVxuXHRpZiAoaXNGYWxzZShvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gYW5kKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb24gYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gYSBlbHNlIHRydWUgfn4+ICFYIHx8IGFcblx0aWYgKGlzVHJ1ZShvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb3Iobm90KGNvbmRpdGlvbkV4cHJlc3Npb24pLCBvblRydWVFeHByZXNzaW9uIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPikgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHR9XG5cblx0Ly8gaWYgWCB0aGVuIGZhbHNlIGVsc2UgYSB+fj4gIVggJiYgYVxuXHRpZiAoaXNGYWxzZShvblRydWVFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBhbmQobm90KGNvbmRpdGlvbkV4cHJlc3Npb24pLCBvbkZhbHNlRXhwcmVzc2lvbiBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPjtcblx0fVxuXG5cdC8vIGlmIFggdGhlbiB0cnVlIGVsc2UgYSB+fj4gWCB8fCBhXG5cdGlmIChpc1RydWUob25UcnVlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb3IoY29uZGl0aW9uRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24gYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdH1cblx0aWYgKGlzQ29tcGxleFR5cGVFeHByZXNzaW9uKGNvbmRpdGlvbikgfHwgaXNDb21wbGV4VHlwZUV4cHJlc3Npb24ob25UcnVlKSB8fCBpc0NvbXBsZXhUeXBlRXhwcmVzc2lvbihvbkZhbHNlKSkge1xuXHRcdGxldCBwYXRoSWR4ID0gMDtcblx0XHRjb25zdCBteUlmRWxzZUV4cHJlc3Npb24gPSBmb3JtYXRSZXN1bHQoW2NvbmRpdGlvbiwgb25UcnVlLCBvbkZhbHNlXSwgXCJzYXAuZmUuY29yZS5mb3JtYXR0ZXJzLlN0YW5kYXJkRm9ybWF0dGVyI2lmRWxzZVwiKTtcblx0XHRjb25zdCBhbGxQYXJ0cyA9IFtdO1xuXHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KFxuXHRcdFx0bXlJZkVsc2VFeHByZXNzaW9uLFxuXHRcdFx0XCJQYXRoSW5Nb2RlbFwiLFxuXHRcdFx0KGNvbnN0YW50UGF0aDogUGF0aEluTW9kZWxFeHByZXNzaW9uPGFueT4pID0+IHtcblx0XHRcdFx0YWxsUGFydHMucHVzaChjb25zdGFudFBhdGgpO1xuXHRcdFx0XHRyZXR1cm4gcGF0aEluTW9kZWwoYFxcJCR7cGF0aElkeCsrfWAsIFwiJFwiKTtcblx0XHRcdH0sXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRhbGxQYXJ0cy51bnNoaWZ0KGNvbnN0YW50KEpTT04uc3RyaW5naWZ5KG15SWZFbHNlRXhwcmVzc2lvbikpKTtcblx0XHRyZXR1cm4gZm9ybWF0UmVzdWx0KGFsbFBhcnRzLCBcInNhcC5mZS5jb3JlLmZvcm1hdHRlcnMuU3RhbmRhcmRGb3JtYXR0ZXIjZXZhbHVhdGVDb21wbGV4RXhwcmVzc2lvblwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiSWZFbHNlXCIsXG5cdFx0Y29uZGl0aW9uOiBjb25kaXRpb25FeHByZXNzaW9uLFxuXHRcdG9uVHJ1ZTogb25UcnVlRXhwcmVzc2lvbixcblx0XHRvbkZhbHNlOiBvbkZhbHNlRXhwcmVzc2lvblxuXHR9O1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBkZWZhdWx0IG1vZGVsICh1bmRlZmluZWQpLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgY29udGV4dFxuICovXG5mdW5jdGlvbiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxhbnk+KTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpO1xuXHRcdGNhc2UgXCJQYXRoSW5Nb2RlbFwiOlxuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb24ubW9kZWxOYW1lID09PSB1bmRlZmluZWQ7XG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdHJldHVybiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub3BlcmFuZDEpIHx8IGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kMik7XG5cdFx0Y2FzZSBcIklmRWxzZVwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0aGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLmNvbmRpdGlvbikgfHxcblx0XHRcdFx0aGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9uVHJ1ZSkgfHxcblx0XHRcdFx0aGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9uRmFsc2UpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRyZXR1cm4gaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9wZXJhbmQpO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxudHlwZSBGbjxUPiA9ICgoLi4ucGFyYW1zOiBhbnkpID0+IFQpICYge1xuXHRfX2Z1bmN0aW9uTmFtZTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBXcmFwcGVkVHVwbGVcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWlnbm9yZVxudHlwZSBXcmFwcGVkVHVwbGU8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBXcmFwcGVkVHVwbGU8VFtLXT4gfCBFeHByZXNzaW9uT3JQcmltaXRpdmU8VFtLXT4gfTtcblxuLy8gU28sIHRoaXMgd29ya3MgYnV0IEkgY2Fubm90IGdldCBpdCB0byBjb21waWxlIDpELCBidXQgaXQgc3RpbGwgZG9lcyB3aGF0IGlzIGV4cGVjdGVkLi4uXG5cbi8qKlxuICogQSBmdW5jdGlvbiByZWZlcmVuY2Ugb3IgYSBmdW5jdGlvbiBuYW1lLlxuICovXG50eXBlIEZ1bmN0aW9uT3JOYW1lPFQ+ID0gRm48VD4gfCBzdHJpbmc7XG5cbi8qKlxuICogRnVuY3Rpb24gcGFyYW1ldGVycywgZWl0aGVyIGRlcml2ZWQgZnJvbSB0aGUgZnVuY3Rpb24gb3IgYW4gdW50eXBlZCBhcnJheS5cbiAqL1xudHlwZSBGdW5jdGlvblBhcmFtZXRlcnM8VCwgRiBleHRlbmRzIEZ1bmN0aW9uT3JOYW1lPFQ+PiA9IEYgZXh0ZW5kcyBGbjxUPiA/IFBhcmFtZXRlcnM8Rj4gOiBhbnlbXTtcblxuLyoqXG4gKiBDYWxscyBhIGZvcm1hdHRlciBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBwYXJhbWV0ZXJzLlxuICogSWYgcmVxdWlyZUNvbnRleHQgaXMgc2V0IHRvIHRydWUgYW5kIG5vIGNvbnRleHQgaXMgcGFzc2VkIGEgZGVmYXVsdCBjb250ZXh0IHdpbGwgYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFVcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBsaXN0IG9mIHBhcmFtZXRlciB0aGF0IHNob3VsZCBtYXRjaCB0aGUgdHlwZSBhbmQgbnVtYmVyIG9mIHRoZSBmb3JtYXR0ZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBmb3JtYXR0ZXJGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gY2FsbFxuICogQHBhcmFtIFtjb250ZXh0RW50aXR5VHlwZV0gSWYgbm8gcGFyYW1ldGVyIHJlZmVycyB0byB0aGUgY29udGV4dCB0aGVuIHdlIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGFkZCBhIHJlZmVyZW5jZSB0byB0aGUga2V5cyBmcm9tIHRoZSBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBbaWdub3JlQ29tcGxleFR5cGVdIFdoZXRoZXIgdG8gaWdub3JlIHRoZSB0cmFuc2dmb3JtYXRpb24gdG8gdGhlIFN0YW5kYXJkRm9ybWF0dGVyIG9yIG5vdFxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzdWx0PFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0Zm9ybWF0dGVyRnVuY3Rpb246IFUgfCBzdHJpbmcsXG5cdGNvbnRleHRFbnRpdHlUeXBlPzogRW50aXR5VHlwZSxcblx0aWdub3JlQ29tcGxleFR5cGUgPSBmYWxzZVxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3QgcGFyYW1ldGVyRXhwcmVzc2lvbnMgPSAocGFyYW1ldGVycyBhcyBhbnlbXSkubWFwKHdyYXBQcmltaXRpdmUpO1xuXG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5wYXJhbWV0ZXJFeHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0aWYgKGNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiB0aGUgY29udGV4dCBpcyByZXF1aXJlZCBhbmQgbm8gY29udGV4dCBpcyBwcm92aWRlZCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBkZWZhdWx0IGJpbmRpbmdcblx0XHRpZiAoIXBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCkpIHtcblx0XHRcdGNvbnRleHRFbnRpdHlUeXBlLmtleXMuZm9yRWFjaCgoa2V5KSA9PiBwYXJhbWV0ZXJFeHByZXNzaW9ucy5wdXNoKHBhdGhJbk1vZGVsKGtleS5uYW1lLCBcIlwiKSkpO1xuXHRcdH1cblx0fVxuXHRsZXQgZnVuY3Rpb25OYW1lID0gXCJcIjtcblx0aWYgKHR5cGVvZiBmb3JtYXR0ZXJGdW5jdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGZ1bmN0aW9uTmFtZSA9IGZvcm1hdHRlckZ1bmN0aW9uO1xuXHR9IGVsc2Uge1xuXHRcdGZ1bmN0aW9uTmFtZSA9IGZvcm1hdHRlckZ1bmN0aW9uLl9fZnVuY3Rpb25OYW1lO1xuXHR9XG5cdC8vIEZvcm1hdHRlck5hbWUgY2FuIGJlIG9mIGZvcm1hdCBzYXAuZmUuY29yZS54eHgjbWV0aG9kTmFtZSB0byBoYXZlIG11bHRpcGxlIGZvcm1hdHRlciBpbiBvbmUgY2xhc3Ncblx0Y29uc3QgW2Zvcm1hdHRlckNsYXNzLCBmb3JtYXR0ZXJOYW1lXSA9IGZ1bmN0aW9uTmFtZS5zcGxpdChcIiNcIik7XG5cblx0Ly8gSW4gc29tZSBjYXNlIHdlIGFsc28gY2Fubm90IGNhbGwgZGlyZWN0bHkgYSBmdW5jdGlvbiBiZWNhdXNlIG9mIHRvbyBjb21wbGV4IGlucHV0LCBpbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBjb252ZXJ0IHRvIGEgc2ltcGxlciBmdW5jdGlvbiBjYWxsXG5cdGlmICghaWdub3JlQ29tcGxleFR5cGUgJiYgKHBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaXNDb21wbGV4VHlwZUV4cHJlc3Npb24pIHx8IHBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaXNDb25jYXRFeHByZXNzaW9uKSkpIHtcblx0XHRsZXQgcGF0aElkeCA9IDA7XG5cdFx0Y29uc3QgbXlGb3JtYXRFeHByZXNzaW9uID0gZm9ybWF0UmVzdWx0KHBhcmFtZXRlckV4cHJlc3Npb25zLCBmdW5jdGlvbk5hbWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0Y29uc3QgYWxsUGFydHMgPSBbXTtcblx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShteUZvcm1hdEV4cHJlc3Npb24sIFwiUGF0aEluTW9kZWxcIiwgKGNvbnN0YW50UGF0aDogUGF0aEluTW9kZWxFeHByZXNzaW9uPGFueT4pID0+IHtcblx0XHRcdGFsbFBhcnRzLnB1c2goY29uc3RhbnRQYXRoKTtcblx0XHRcdHJldHVybiBwYXRoSW5Nb2RlbChgXFwkJHtwYXRoSWR4Kyt9YCwgXCIkXCIpO1xuXHRcdH0pO1xuXHRcdGFsbFBhcnRzLnVuc2hpZnQoY29uc3RhbnQoSlNPTi5zdHJpbmdpZnkobXlGb3JtYXRFeHByZXNzaW9uKSkpO1xuXHRcdHJldHVybiBmb3JtYXRSZXN1bHQoYWxsUGFydHMsIFwic2FwLmZlLmNvcmUuZm9ybWF0dGVycy5TdGFuZGFyZEZvcm1hdHRlciNldmFsdWF0ZUNvbXBsZXhFeHByZXNzaW9uXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH0gZWxzZSBpZiAoISFmb3JtYXR0ZXJOYW1lICYmIGZvcm1hdHRlck5hbWUubGVuZ3RoID4gMCkge1xuXHRcdHBhcmFtZXRlckV4cHJlc3Npb25zLnVuc2hpZnQoY29uc3RhbnQoZm9ybWF0dGVyTmFtZSkpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGb3JtYXR0ZXJcIixcblx0XHRmbjogZm9ybWF0dGVyQ2xhc3MsXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyRXhwcmVzc2lvbnNcblx0fTtcbn1cblxuLyoqXG4gKiBDYWxscyBhIGNvbXBsZXggdHlwZSB0byBwcm9jZXNzIHRoZSBwYXJhbWV0ZXJzLlxuICogSWYgcmVxdWlyZUNvbnRleHQgaXMgc2V0IHRvIHRydWUgYW5kIG5vIGNvbnRleHQgaXMgcGFzc2VkLCBhIGRlZmF1bHQgY29udGV4dCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgbGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIGZvciB0aGUgY29tcGxleCB0eXBlPVxuICogQHBhcmFtIHR5cGUgVGhlIGNvbXBsZXggdHlwZSB0byB1c2VcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcGFyYW0gb0Zvcm1hdE9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFR5cGVJbmZvcm1hdGlvbjxULCBVIGV4dGVuZHMgRm48VD4+KFxuXHRwYXJhbWV0ZXJzOiBXcmFwcGVkVHVwbGU8UGFyYW1ldGVyczxVPj4sXG5cdHR5cGU6IHN0cmluZyxcblx0Y29udGV4dEVudGl0eVR5cGU/OiBFbnRpdHlUeXBlLFxuXHRvRm9ybWF0T3B0aW9ucz86IGFueVxuKTogVW5yZXNvbHZlYWJsZVBhdGhFeHByZXNzaW9uIHwgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+IHwgQ29uc3RhbnRFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3QgcGFyYW1ldGVyRXhwcmVzc2lvbnMgPSAocGFyYW1ldGVycyBhcyBhbnlbXSkubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4ucGFyYW1ldGVyRXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhcmFtZXRlciBhbmQgaXQgaXMgYSBjb25zdGFudCBhbmQgd2UgZG9uJ3QgZXhwZWN0IHRoZSBjb250ZXh0IHRoZW4gcmV0dXJuIHRoZSBjb25zdGFudFxuXHRpZiAocGFyYW1ldGVyRXhwcmVzc2lvbnMubGVuZ3RoID09PSAxICYmIGlzQ29uc3RhbnQocGFyYW1ldGVyRXhwcmVzc2lvbnNbMF0pICYmICFjb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdHJldHVybiBwYXJhbWV0ZXJFeHByZXNzaW9uc1swXTtcblx0fSBlbHNlIGlmIChjb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdC8vIE90aGVyd2lzZSwgaWYgdGhlIGNvbnRleHQgaXMgcmVxdWlyZWQgYW5kIG5vIGNvbnRleHQgaXMgcHJvdmlkZWQgbWFrZSBzdXJlIHRvIGFkZCB0aGUgZGVmYXVsdCBiaW5kaW5nXG5cdFx0aWYgKCFwYXJhbWV0ZXJFeHByZXNzaW9ucy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpKSB7XG5cdFx0XHRjb250ZXh0RW50aXR5VHlwZS5rZXlzLmZvckVhY2goKGtleSkgPT4gcGFyYW1ldGVyRXhwcmVzc2lvbnMucHVzaChwYXRoSW5Nb2RlbChrZXkubmFtZSwgXCJcIikpKTtcblx0XHR9XG5cdH1cblx0Ly8gaWYgc2hvd01lYXN1cmUgaXMgc2V0IHRvIGZhbHNlIHdlIHdhbnQgdG8gbm90IHBhcnNlIGFzIHN0cmluZyB0byBzZWUgdGhlIDBcblx0Ly8gd2UgZG8gdGhhdCBhbHNvIGZvciBhbGwgYmluZGluZ3MgYmVjYXVzZSBvdGhlcndpc2UgdGhlIG1kYyBGaWVsZCBpc24ndCBlZGl0YWJsZVxuXHRpZiAoXG5cdFx0IShvRm9ybWF0T3B0aW9ucyAmJiBvRm9ybWF0T3B0aW9ucy5zaG93TnVtYmVyID09PSBmYWxzZSkgJiZcblx0XHQoKHBhcmFtZXRlcnNbMF0gYXMgYW55KT8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0KHBhcmFtZXRlcnNbMF0gYXMgYW55KT8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRlY2ltYWxcIikgPT09IDAgfHxcblx0XHRcdChwYXJhbWV0ZXJzWzBdIGFzIGFueSk/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDApXG5cdCkge1xuXHRcdGlmIChcblx0XHRcdChwYXJhbWV0ZXJzWzBdIGFzIGFueSk/LnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50NjRcIiB8fFxuXHRcdFx0KHBhcmFtZXRlcnNbMF0gYXMgYW55KT8udHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5EZWNpbWFsXCJcblx0XHQpIHtcblx0XHRcdC8vc2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50NjQgZG8gbm90IHN1cHBvcnQgcGFyc2VBc1N0cmluZyBmYWxzZVxuXHRcdFx0b0Zvcm1hdE9wdGlvbnMgPSBvRm9ybWF0T3B0aW9ucz8uc2hvd01lYXN1cmUgPT09IGZhbHNlID8geyBlbXB0eVN0cmluZzogXCJcIiwgc2hvd01lYXN1cmU6IGZhbHNlIH0gOiB7IGVtcHR5U3RyaW5nOiBcIlwiIH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9Gb3JtYXRPcHRpb25zID1cblx0XHRcdFx0b0Zvcm1hdE9wdGlvbnM/LnNob3dNZWFzdXJlID09PSBmYWxzZVxuXHRcdFx0XHRcdD8geyBwYXJzZUFzU3RyaW5nOiBmYWxzZSwgZW1wdHlTdHJpbmc6IFwiXCIsIHNob3dNZWFzdXJlOiBmYWxzZSB9XG5cdFx0XHRcdFx0OiB7IHBhcnNlQXNTdHJpbmc6IGZhbHNlLCBlbXB0eVN0cmluZzogXCJcIiB9O1xuXHRcdH1cblx0fVxuXHRpZiAodHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0XCIpIHtcblx0XHRjb25zdCB1b21QYXRoID0gcGF0aEluTW9kZWwoXCIvIyNAQHJlcXVlc3RVbml0c09mTWVhc3VyZVwiKTtcblx0XHR1b21QYXRoLnRhcmdldFR5cGUgPSBcImFueVwiO1xuXHRcdHVvbVBhdGgubW9kZSA9IFwiT25lVGltZVwiO1xuXHRcdHBhcmFtZXRlckV4cHJlc3Npb25zLnB1c2godW9tUGF0aCk7XG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeVwiKSB7XG5cdFx0Y29uc3QgY3VycmVuY3lQYXRoID0gcGF0aEluTW9kZWwoXCIvIyNAQHJlcXVlc3RDdXJyZW5jeUNvZGVzXCIpO1xuXHRcdGN1cnJlbmN5UGF0aC50YXJnZXRUeXBlID0gXCJhbnlcIjtcblx0XHRjdXJyZW5jeVBhdGgubW9kZSA9IFwiT25lVGltZVwiO1xuXHRcdHBhcmFtZXRlckV4cHJlc3Npb25zLnB1c2goY3VycmVuY3lQYXRoKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiQ29tcGxleFR5cGVcIixcblx0XHR0eXBlOiB0eXBlLFxuXHRcdGZvcm1hdE9wdGlvbnM6IG9Gb3JtYXRPcHRpb25zIHx8IHt9LFxuXHRcdHBhcmFtZXRlcnM6IHt9LFxuXHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiBwYXJhbWV0ZXJFeHByZXNzaW9uc1xuXHR9O1xufVxuLyoqXG4gKiBGdW5jdGlvbiBjYWxsLCBvcHRpb25hbGx5IHdpdGggYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBmdW5jIEZ1bmN0aW9uIG5hbWUgb3IgcmVmZXJlbmNlIHRvIGZ1bmN0aW9uXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBBcmd1bWVudHNcbiAqIEBwYXJhbSBvbiBPYmplY3QgdG8gY2FsbCB0aGUgZnVuY3Rpb24gb25cbiAqIEByZXR1cm5zIEV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBmdW5jdGlvbiBjYWxsIChub3QgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbCEpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbjxULCBVIGV4dGVuZHMgRnVuY3Rpb25Pck5hbWU8VD4+KFxuXHRmdW5jOiBVLFxuXHRwYXJhbWV0ZXJzOiBXcmFwcGVkVHVwbGU8RnVuY3Rpb25QYXJhbWV0ZXJzPFQsIFU+Pixcblx0b24/OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8b2JqZWN0PlxuKTogRnVuY3Rpb25FeHByZXNzaW9uPFQ+IHtcblx0Y29uc3QgZnVuY3Rpb25OYW1lID0gdHlwZW9mIGZ1bmMgPT09IFwic3RyaW5nXCIgPyBmdW5jIDogZnVuYy5fX2Z1bmN0aW9uTmFtZTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGdW5jdGlvblwiLFxuXHRcdG9iajogb24gIT09IHVuZGVmaW5lZCA/IHdyYXBQcmltaXRpdmUob24pIDogdW5kZWZpbmVkLFxuXHRcdGZuOiBmdW5jdGlvbk5hbWUsXG5cdFx0cGFyYW1ldGVyczogKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9O1xufVxuXG4vKipcbiAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGJpbmRpbmcgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBBIEJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBlbXB0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShleHByZXNzaW9uOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGFCaW5kaW5nczogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+W10gPSBbXTtcblx0dHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbiwgXCJQYXRoSW5Nb2RlbFwiLCAoZXhwcikgPT4ge1xuXHRcdGFCaW5kaW5ncy5wdXNoKG9yKGVxdWFsKGV4cHIsIFwiXCIpLCBlcXVhbChleHByLCB1bmRlZmluZWQpLCBlcXVhbChleHByLCBudWxsKSkpO1xuXHRcdHJldHVybiBleHByO1xuXHR9KTtcblx0cmV0dXJuIGFuZCguLi5hQmluZGluZ3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KC4uLmluRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+W10pOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IGV4cHJlc3Npb25zID0gaW5FeHByZXNzaW9ucy5tYXAod3JhcFByaW1pdGl2ZSk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0aWYgKGV4cHJlc3Npb25zLmV2ZXJ5KGlzQ29uc3RhbnQpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KFxuXHRcdFx0ZXhwcmVzc2lvbnMucmVkdWNlKChjb25jYXRlbmF0ZWQ6IHN0cmluZywgdmFsdWUpID0+IHtcblx0XHRcdFx0aWYgKHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29uY2F0ZW5hdGVkICsgKHZhbHVlIGFzIENvbnN0YW50RXhwcmVzc2lvbjxhbnk+KS52YWx1ZS50b1N0cmluZygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjb25jYXRlbmF0ZWQ7XG5cdFx0XHR9LCBcIlwiKVxuXHRcdCk7XG5cdH0gZWxzZSBpZiAoZXhwcmVzc2lvbnMuc29tZShpc0NvbXBsZXhUeXBlRXhwcmVzc2lvbikpIHtcblx0XHRsZXQgcGF0aElkeCA9IDA7XG5cdFx0Y29uc3QgbXlDb25jYXRFeHByZXNzaW9uID0gZm9ybWF0UmVzdWx0KGV4cHJlc3Npb25zLCBcInNhcC5mZS5jb3JlLmZvcm1hdHRlcnMuU3RhbmRhcmRGb3JtYXR0ZXIjY29uY2F0XCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0Y29uc3QgYWxsUGFydHMgPSBbXTtcblx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShteUNvbmNhdEV4cHJlc3Npb24sIFwiUGF0aEluTW9kZWxcIiwgKGNvbnN0YW50UGF0aDogUGF0aEluTW9kZWxFeHByZXNzaW9uPGFueT4pID0+IHtcblx0XHRcdGFsbFBhcnRzLnB1c2goY29uc3RhbnRQYXRoKTtcblx0XHRcdHJldHVybiBwYXRoSW5Nb2RlbChgXFwkJHtwYXRoSWR4Kyt9YCwgXCIkXCIpO1xuXHRcdH0pO1xuXHRcdGFsbFBhcnRzLnVuc2hpZnQoY29uc3RhbnQoSlNPTi5zdHJpbmdpZnkobXlDb25jYXRFeHByZXNzaW9uKSkpO1xuXHRcdHJldHVybiBmb3JtYXRSZXN1bHQoYWxsUGFydHMsIFwic2FwLmZlLmNvcmUuZm9ybWF0dGVycy5TdGFuZGFyZEZvcm1hdHRlciNldmFsdWF0ZUNvbXBsZXhFeHByZXNzaW9uXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJDb25jYXRcIixcblx0XHRleHByZXNzaW9uczogZXhwcmVzc2lvbnNcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtRnVuY3Rpb24gPSA8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGUgfCB1bmtub3duPihleHByZXNzaW9uUGFydDogYW55KSA9PiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5leHBvcnQgdHlwZSBFeHByZXNzaW9uVHlwZSA9IFBpY2s8QmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT4sIFwiX3R5cGVcIj5bXCJfdHlwZVwiXTtcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1SZWN1cnNpdmVseTxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSB8IHVua25vd24+KFxuXHRpbkV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPixcblx0ZXhwcmVzc2lvblR5cGU6IEV4cHJlc3Npb25UeXBlLFxuXHR0cmFuc2Zvcm1GdW5jdGlvbjogVHJhbnNmb3JtRnVuY3Rpb24sXG5cdGluY2x1ZGVBbGxFeHByZXNzaW9uID0gZmFsc2Vcbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPiB7XG5cdGxldCBleHByZXNzaW9uID0gaW5FeHByZXNzaW9uO1xuXHRzd2l0Y2ggKGV4cHJlc3Npb24uX3R5cGUpIHtcblx0XHRjYXNlIFwiRnVuY3Rpb25cIjpcblx0XHRjYXNlIFwiRm9ybWF0dGVyXCI6XG5cdFx0XHRleHByZXNzaW9uLnBhcmFtZXRlcnMgPSBleHByZXNzaW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KHBhcmFtZXRlciwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29uY2F0XCI6XG5cdFx0XHRleHByZXNzaW9uLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbi5leHByZXNzaW9ucy5tYXAoKHN1YkV4cHJlc3Npb24pID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KHN1YkV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0ZXhwcmVzc2lvbiA9IGNvbmNhdCguLi5leHByZXNzaW9uLmV4cHJlc3Npb25zKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMgPSBleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzLm1hcCgoYmluZGluZ1BhcmFtZXRlcikgPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkoYmluZGluZ1BhcmFtZXRlciwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRjb25zdCBvblRydWUgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9uVHJ1ZSwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRjb25zdCBvbkZhbHNlID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vbkZhbHNlLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdGxldCBjb25kaXRpb24gPSBleHByZXNzaW9uLmNvbmRpdGlvbjtcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRjb25kaXRpb24gPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLmNvbmRpdGlvbiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHR9XG5cdFx0XHRleHByZXNzaW9uID0gaWZFbHNlKGNvbmRpdGlvbiwgb25UcnVlLCBvbkZhbHNlKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD47XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZCA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBub3Qob3BlcmFuZCkgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+O1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIlNldFwiOlxuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmRzID0gZXhwcmVzc2lvbi5vcGVyYW5kcy5tYXAoKG9wZXJhbmQpID0+XG5cdFx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkob3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdFx0KTtcblx0XHRcdFx0ZXhwcmVzc2lvbiA9XG5cdFx0XHRcdFx0ZXhwcmVzc2lvbi5vcGVyYXRvciA9PT0gXCJ8fFwiXG5cdFx0XHRcdFx0XHQ/IChvciguLi5vcGVyYW5kcykgYXMgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPFQ+KVxuXHRcdFx0XHRcdFx0OiAoYW5kKC4uLm9wZXJhbmRzKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248VD4pO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRjb25zdCBvcGVyYW5kMSA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZDEsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0XHRjb25zdCBvcGVyYW5kMiA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZDIsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0XHRleHByZXNzaW9uID0gY29tcGFyaXNvbihleHByZXNzaW9uLm9wZXJhdG9yLCBvcGVyYW5kMSwgb3BlcmFuZDIpIGFzIEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRjYXNlIFwiTGVuZ3RoXCI6XG5cdFx0Y2FzZSBcIlBhdGhJbk1vZGVsXCI6XG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0Y2FzZSBcIkVtYmVkZGVkQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0Y2FzZSBcIlVucmVzb2x2YWJsZVwiOlxuXHRcdFx0Ly8gRG8gbm90aGluZ1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKGV4cHJlc3Npb25UeXBlID09PSBleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0ZXhwcmVzc2lvbiA9IHRyYW5zZm9ybUZ1bmN0aW9uKGluRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGV4cHJlc3Npb247XG59XG5cbmV4cG9ydCB0eXBlIENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uID0gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5jb25zdCBuZWVkUGFyZW50aGVzaXMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KGV4cHI6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdCFpc0NvbnN0YW50KGV4cHIpICYmICFpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbihleHByKSAmJiBpc0V4cHJlc3Npb24oZXhwcikgJiYgZXhwci5fdHlwZSAhPT0gXCJJZkVsc2VcIiAmJiBleHByLl90eXBlICE9PSBcIkZ1bmN0aW9uXCJcblx0KTtcbn07XG5cbi8qKlxuICogQ29tcGlsZXMgYSBjb25zdGFudCBvYmplY3QgdG8gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGV4cHJcbiAqIEBwYXJhbSBpc051bGxhYmxlXG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb25zdGFudE9iamVjdChleHByOiBDb25zdGFudEV4cHJlc3Npb248b2JqZWN0PiwgaXNOdWxsYWJsZSA9IGZhbHNlKSB7XG5cdGlmIChpc051bGxhYmxlICYmIE9iamVjdC5rZXlzKGV4cHIudmFsdWUpLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdC8vIE9iamVjdHNcblx0Y29uc3QgbyA9IGV4cHIudmFsdWUgYXMgUGxhaW5FeHByZXNzaW9uT2JqZWN0O1xuXHRjb25zdCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRPYmplY3Qua2V5cyhvKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IG9ba2V5XTtcblx0XHRjb25zdCBjaGlsZFJlc3VsdCA9IGNvbXBpbGVFeHByZXNzaW9uKHZhbHVlLCB0cnVlLCBmYWxzZSwgaXNOdWxsYWJsZSk7XG5cdFx0aWYgKGNoaWxkUmVzdWx0ICYmIGNoaWxkUmVzdWx0Lmxlbmd0aCA+IDApIHtcblx0XHRcdHByb3BlcnRpZXMucHVzaChgJHtrZXl9OiAke2NoaWxkUmVzdWx0fWApO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBgeyR7cHJvcGVydGllcy5qb2luKFwiLCBcIil9fWA7XG59XG5cbi8qKlxuICogQ29tcGlsZXMgYSBDb25zdGFudCBCaW5kaW5nIEV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIGV4cHJcbiAqIEBwYXJhbSBlbWJlZGRlZEluQmluZGluZ1xuICogQHBhcmFtIGlzTnVsbGFibGVcbiAqIEBwYXJhbSBkb05vdFN0cmluZ2lmeVxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZUNvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPFQ+LFxuXHRlbWJlZGRlZEluQmluZGluZzogYm9vbGVhbixcblx0aXNOdWxsYWJsZT86IGJvb2xlYW4sXG5cdGRvTm90U3RyaW5naWZ5PzogZmFsc2Vcbik6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlQ29uc3RhbnQ8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRleHByOiBDb25zdGFudEV4cHJlc3Npb248VD4sXG5cdGVtYmVkZGVkSW5CaW5kaW5nOiBib29sZWFuLFxuXHRpc051bGxhYmxlPzogYm9vbGVhbixcblx0ZG9Ob3RTdHJpbmdpZnk/OiB0cnVlXG4pOiBhbnk7XG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZUNvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPFQ+LFxuXHRlbWJlZGRlZEluQmluZGluZzogYm9vbGVhbixcblx0aXNOdWxsYWJsZSA9IGZhbHNlLFxuXHRkb05vdFN0cmluZ2lmeTogYm9vbGVhbiA9IGZhbHNlXG4pOiBzdHJpbmcgfCBhbnkge1xuXHRpZiAoZXhwci52YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBkb05vdFN0cmluZ2lmeSA/IG51bGwgOiBcIm51bGxcIjtcblx0fVxuXHRpZiAoZXhwci52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGRvTm90U3RyaW5naWZ5ID8gdW5kZWZpbmVkIDogXCJ1bmRlZmluZWRcIjtcblx0fVxuXHRpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShleHByLnZhbHVlKSkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGV4cHIudmFsdWUubWFwKChleHByZXNzaW9uKSA9PiBjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uLCB0cnVlKSk7XG5cdFx0XHRyZXR1cm4gYFske2VudHJpZXMuam9pbihcIiwgXCIpfV1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUNvbnN0YW50T2JqZWN0KGV4cHIgYXMgQ29uc3RhbnRFeHByZXNzaW9uPG9iamVjdD4sIGlzTnVsbGFibGUpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdHN3aXRjaCAodHlwZW9mIGV4cHIudmFsdWUpIHtcblx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdGNhc2UgXCJiaWdpbnRcIjpcblx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRcdHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHRjYXNlIFwic3RyaW5nXCI6XG5cdFx0XHRcdHJldHVybiBgJyR7ZXNjYXBlWG1sQXR0cmlidXRlKGV4cHIudmFsdWUudG9TdHJpbmcoKSl9J2A7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGRvTm90U3RyaW5naWZ5ID8gZXhwci52YWx1ZSA6IGV4cHIudmFsdWUudG9TdHJpbmcoKTtcblx0fVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgYmluZGluZyBzdHJpbmcgZm9yIGEgQmluZGluZyBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uRm9yQmluZGluZyBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmcgV2hldGhlciB0aGUgZXhwcmVzc2lvbiB0byBjb21waWxlIGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBleHByZXNzaW9uXG4gKiBAcGFyYW0gZW1iZWRkZWRTZXBhcmF0b3IgVGhlIGJpbmRpbmcgdmFsdWUgZXZhbHVhdG9yICgkIG9yICUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBmb3JjZSB0aGUgdHlwZSBvciBub3QpXG4gKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gY29tcGlsZVBhdGhJbk1vZGVsRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGV4cHJlc3Npb25Gb3JCaW5kaW5nOiBQYXRoSW5Nb2RlbEV4cHJlc3Npb248VD4sXG5cdGVtYmVkZGVkSW5CaW5kaW5nOiBib29sZWFuLFxuXHRlbWJlZGRlZFNlcGFyYXRvcjogc3RyaW5nXG4pIHtcblx0aWYgKFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLnR5cGUgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5wYXJhbWV0ZXJzIHx8XG5cdFx0ZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSB8fFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLmZvcm1hdE9wdGlvbnMgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5jb25zdHJhaW50c1xuXHQpIHtcblx0XHQvLyBUaGlzIGlzIG5vdyBhIGNvbXBsZXggYmluZGluZyBkZWZpbml0aW9uLCBsZXQncyBwcmVwYXJlIGZvciBpdFxuXHRcdGNvbnN0IGNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiA9IHtcblx0XHRcdHBhdGg6IGNvbXBpbGVQYXRoSW5Nb2RlbChleHByZXNzaW9uRm9yQmluZGluZyksXG5cdFx0XHR0eXBlOiBleHByZXNzaW9uRm9yQmluZGluZy50eXBlLFxuXHRcdFx0dGFyZ2V0VHlwZTogZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSxcblx0XHRcdHBhcmFtZXRlcnM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLnBhcmFtZXRlcnMsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBleHByZXNzaW9uRm9yQmluZGluZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0Y29uc3RyYWludHM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLmNvbnN0cmFpbnRzXG5cdFx0fTtcblx0XHRjb25zdCBvdXRCaW5kaW5nID0gY29tcGlsZUV4cHJlc3Npb24oY29tcGxleEJpbmRpbmdEZWZpbml0aW9uLCBmYWxzZSwgZmFsc2UsIHRydWUpO1xuXHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0cmV0dXJuIGAke2VtYmVkZGVkU2VwYXJhdG9yfSR7b3V0QmluZGluZ31gO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0QmluZGluZztcblx0fSBlbHNlIGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdHJldHVybiBgJHtlbWJlZGRlZFNlcGFyYXRvcn17JHtjb21waWxlUGF0aEluTW9kZWwoZXhwcmVzc2lvbkZvckJpbmRpbmcpfX1gO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBgeyR7Y29tcGlsZVBhdGhJbk1vZGVsKGV4cHJlc3Npb25Gb3JCaW5kaW5nKX19YDtcblx0fVxufVxuXG5mdW5jdGlvbiBjb21waWxlQ29tcGxleFR5cGVFeHByZXNzaW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByZXNzaW9uOiBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pIHtcblx0aWYgKGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIGB7JHtjb21waWxlUGF0aFBhcmFtZXRlcihleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzWzBdLCB0cnVlKX0sIHR5cGU6ICcke2V4cHJlc3Npb24udHlwZX0nfWA7XG5cdH1cblxuXHRsZXQgb3V0cHV0RW5kID0gYF0sIHR5cGU6ICcke2V4cHJlc3Npb24udHlwZX0nYDtcblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpfWA7XG5cdH1cblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24ucGFyYW1ldGVycykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uLnBhcmFtZXRlcnMpfWA7XG5cdH1cblx0b3V0cHV0RW5kICs9IFwifVwiO1xuXG5cdHJldHVybiBge21vZGU6J1R3b1dheScsIHBhcnRzOlske2V4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubWFwKChwYXJhbTogYW55KSA9PiBjb21waWxlUGF0aFBhcmFtZXRlcihwYXJhbSkpLmpvaW4oXCIsXCIpfSR7b3V0cHV0RW5kfWA7XG59XG5cbi8qKlxuICogV3JhcCB0aGUgY29tcGlsZWQgYmluZGluZyBzdHJpbmcgYXMgcmVxdWlyZWQgZGVwZW5kZW5pbmcgb24gaXRzIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBlbWJlZGRlZEluQmluZGluZyBUcnVlIGlmIHRoZSBjb21waWxlZCBleHByZXNzaW9uIGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgYmluZGluZ1xuICogQHBhcmFtIHBhcmVudGhlc2lzUmVxdWlyZWQgVHJ1ZSBpZiB0aGUgZW1iZWRkZWQgYmluZGluZyBuZWVkcyB0byBiZSB3cmFwcGVkIGluIHBhcmV0aGVzaXMgc28gdGhhdCBpdCBpcyBldmFsdWF0ZWQgYXMgb25lXG4gKiBAcmV0dXJucyBGaW5hbGl6ZWQgY29tcGlsZWQgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiB3cmFwQmluZGluZ0V4cHJlc3Npb24oXG5cdGV4cHJlc3Npb246IHN0cmluZyxcblx0ZW1iZWRkZWRJbkJpbmRpbmc6IGJvb2xlYW4sXG5cdHBhcmVudGhlc2lzUmVxdWlyZWQgPSBmYWxzZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRpZiAocGFyZW50aGVzaXNSZXF1aXJlZCkge1xuXHRcdFx0cmV0dXJuIGAoJHtleHByZXNzaW9ufSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGB7PSAke2V4cHJlc3Npb259fWA7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21waWxlIGFuIGV4cHJlc3Npb24gaW50byBhbiBleHByZXNzaW9uIGJpbmRpbmcuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmcgV2hldGhlciB0aGUgZXhwcmVzc2lvbiB0byBjb21waWxlIGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBleHByZXNzaW9uXG4gKiBAcGFyYW0ga2VlcFRhcmdldFR5cGUgS2VlcCB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIGVtYmVkZGVkIGJpbmRpbmdzIGluc3RlYWQgb2YgY2FzdGluZyB0aGVtIHRvIGFueVxuICogQHBhcmFtIGlzTnVsbGFibGUgV2hldGhlciBiaW5kaW5nIGV4cHJlc3Npb24gY2FuIHJlc29sdmUgdG8gZW1wdHkgc3RyaW5nIG9yIG5vdFxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvbiBiaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGV4cHJlc3Npb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0ZW1iZWRkZWRJbkJpbmRpbmcgPSBmYWxzZSxcblx0a2VlcFRhcmdldFR5cGUgPSBmYWxzZSxcblx0aXNOdWxsYWJsZSA9IGZhbHNlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IGV4cHIgPSB3cmFwUHJpbWl0aXZlKGV4cHJlc3Npb24pO1xuXHRjb25zdCBlbWJlZGRlZFNlcGFyYXRvciA9IGtlZXBUYXJnZXRUeXBlID8gXCIkXCIgOiBcIiVcIjtcblxuXHRzd2l0Y2ggKGV4cHIuX3R5cGUpIHtcblx0XHRjYXNlIFwiVW5yZXNvbHZhYmxlXCI6XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0XHRyZXR1cm4gY29tcGlsZUNvbnN0YW50KGV4cHIsIGVtYmVkZGVkSW5CaW5kaW5nLCBpc051bGxhYmxlKTtcblxuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRcdHJldHVybiBleHByLnJlZiB8fCBcIm51bGxcIjtcblxuXHRcdGNhc2UgXCJGdW5jdGlvblwiOlxuXHRcdFx0Y29uc3QgYXJndW1lbnRTdHJpbmcgPSBgJHtleHByLnBhcmFtZXRlcnMubWFwKChhcmcpID0+IGNvbXBpbGVFeHByZXNzaW9uKGFyZywgdHJ1ZSkpLmpvaW4oXCIsIFwiKX1gO1xuXHRcdFx0cmV0dXJuIGV4cHIub2JqID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyBgJHtleHByLmZufSgke2FyZ3VtZW50U3RyaW5nfSlgXG5cdFx0XHRcdDogYCR7Y29tcGlsZUV4cHJlc3Npb24oZXhwci5vYmosIHRydWUpfS4ke2V4cHIuZm59KCR7YXJndW1lbnRTdHJpbmd9KWA7XG5cblx0XHRjYXNlIFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIGVtYmVkZGVkSW5CaW5kaW5nID8gYCgke2V4cHIudmFsdWUuc3Vic3RyKDIsIGV4cHIudmFsdWUubGVuZ3RoIC0gMyl9KWAgOiBgJHtleHByLnZhbHVlfWA7XG5cblx0XHRjYXNlIFwiRW1iZWRkZWRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgJHtlbWJlZGRlZFNlcGFyYXRvcn0ke2V4cHIudmFsdWV9YCA6IGAke2V4cHIudmFsdWV9YDtcblxuXHRcdGNhc2UgXCJQYXRoSW5Nb2RlbFwiOlxuXHRcdFx0cmV0dXJuIGNvbXBpbGVQYXRoSW5Nb2RlbEV4cHJlc3Npb24oZXhwciwgZW1iZWRkZWRJbkJpbmRpbmcsIGVtYmVkZGVkU2VwYXJhdG9yKTtcblxuXHRcdGNhc2UgXCJDb21wYXJpc29uXCI6XG5cdFx0XHRjb25zdCBjb21wYXJpc29uRXhwcmVzc2lvbiA9IGNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24oY29tcGFyaXNvbkV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IGlmRWxzZUV4cHJlc3Npb24gPSBgJHtjb21waWxlRXhwcmVzc2lvbihleHByLmNvbmRpdGlvbiwgdHJ1ZSl9ID8gJHtjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0ZXhwci5vblRydWUsXG5cdFx0XHRcdHRydWVcblx0XHRcdCl9IDogJHtjb21waWxlRXhwcmVzc2lvbihleHByLm9uRmFsc2UsIHRydWUpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGlmRWxzZUV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nLCB0cnVlKTtcblxuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGNvbnN0IHNldEV4cHJlc3Npb24gPSBleHByLm9wZXJhbmRzLm1hcCgob3BlcmFuZCkgPT4gY29tcGlsZUV4cHJlc3Npb24ob3BlcmFuZCwgdHJ1ZSkpLmpvaW4oYCAke2V4cHIub3BlcmF0b3J9IGApO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihzZXRFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZywgdHJ1ZSk7XG5cblx0XHRjYXNlIFwiQ29uY2F0XCI6XG5cdFx0XHRjb25zdCBjb25jYXRFeHByZXNzaW9uID0gZXhwci5leHByZXNzaW9uc1xuXHRcdFx0XHQubWFwKChuZXN0ZWRFeHByZXNzaW9uKSA9PiBjb21waWxlRXhwcmVzc2lvbihuZXN0ZWRFeHByZXNzaW9uLCB0cnVlLCB0cnVlKSlcblx0XHRcdFx0LmpvaW4oXCIgKyBcIik7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGNvbmNhdEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJMZW5ndGhcIjpcblx0XHRcdGNvbnN0IGxlbmd0aEV4cHJlc3Npb24gPSBgJHtjb21waWxlRXhwcmVzc2lvbihleHByLnBhdGhJbk1vZGVsLCB0cnVlKX0ubGVuZ3RoYDtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24obGVuZ3RoRXhwcmVzc2lvbiwgZW1iZWRkZWRJbkJpbmRpbmcpO1xuXG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdFx0Y29uc3Qgbm90RXhwcmVzc2lvbiA9IGAhJHtjb21waWxlRXhwcmVzc2lvbihleHByLm9wZXJhbmQsIHRydWUpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKG5vdEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGNvbnN0IHRydXRoeUV4cHJlc3Npb24gPSBgISEke2NvbXBpbGVFeHByZXNzaW9uKGV4cHIub3BlcmFuZCwgdHJ1ZSl9YDtcblx0XHRcdHJldHVybiB3cmFwQmluZGluZ0V4cHJlc3Npb24odHJ1dGh5RXhwcmVzc2lvbiwgZW1iZWRkZWRJbkJpbmRpbmcpO1xuXG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0Y29uc3QgZm9ybWF0dGVyRXhwcmVzc2lvbiA9IGNvbXBpbGVGb3JtYXR0ZXJFeHByZXNzaW9uKGV4cHIpO1xuXHRcdFx0cmV0dXJuIGVtYmVkZGVkSW5CaW5kaW5nID8gYFxcJCR7Zm9ybWF0dGVyRXhwcmVzc2lvbn1gIDogZm9ybWF0dGVyRXhwcmVzc2lvbjtcblxuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0Y29uc3QgY29tcGxleFR5cGVFeHByZXNzaW9uID0gY29tcGlsZUNvbXBsZXhUeXBlRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiBlbWJlZGRlZEluQmluZGluZyA/IGBcXCQke2NvbXBsZXhUeXBlRXhwcmVzc2lvbn1gIDogY29tcGxleFR5cGVFeHByZXNzaW9uO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBcIlwiO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGNvbXBhcmlzb24gZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgY29tcGFyaXNvbiBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIGV4cHJlc3Npb24uIE5lZWRzIHdyYXBwaW5nIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBhcyBhbiBleHByZXNzaW9uIGJpbmRpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbihleHByZXNzaW9uOiBDb21wYXJpc29uRXhwcmVzc2lvbikge1xuXHRmdW5jdGlvbiBjb21waWxlT3BlcmFuZChvcGVyYW5kOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248YW55Pikge1xuXHRcdGNvbnN0IGNvbXBpbGVkT3BlcmFuZCA9IGNvbXBpbGVFeHByZXNzaW9uKG9wZXJhbmQsIHRydWUpID8/IFwidW5kZWZpbmVkXCI7XG5cdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihjb21waWxlZE9wZXJhbmQsIHRydWUsIG5lZWRQYXJlbnRoZXNpcyhvcGVyYW5kKSk7XG5cdH1cblxuXHRyZXR1cm4gYCR7Y29tcGlsZU9wZXJhbmQoZXhwcmVzc2lvbi5vcGVyYW5kMSl9ICR7ZXhwcmVzc2lvbi5vcGVyYXRvcn0gJHtjb21waWxlT3BlcmFuZChleHByZXNzaW9uLm9wZXJhbmQyKX1gO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBmb3JtYXR0ZXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZm9ybWF0dGVyIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUZvcm1hdHRlckV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KGV4cHJlc3Npb246IEZvcm1hdHRlckV4cHJlc3Npb248VD4pIHtcblx0aWYgKGV4cHJlc3Npb24ucGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gYHske2NvbXBpbGVQYXRoUGFyYW1ldGVyKGV4cHJlc3Npb24ucGFyYW1ldGVyc1swXSwgdHJ1ZSl9LCBmb3JtYXR0ZXI6ICcke2V4cHJlc3Npb24uZm59J31gO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHBhcnRzID0gZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcblx0XHRcdGlmIChwYXJhbS5fdHlwZSA9PT0gXCJDb21wbGV4VHlwZVwiKSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlQ29tcGxleFR5cGVFeHByZXNzaW9uKHBhcmFtKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBjb21waWxlUGF0aFBhcmFtZXRlcihwYXJhbSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGB7cGFydHM6IFske3BhcnRzLmpvaW4oXCIsIFwiKX1dLCBmb3JtYXR0ZXI6ICcke2V4cHJlc3Npb24uZm59J31gO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGlsZSB0aGUgcGF0aCBwYXJhbWV0ZXIgb2YgYSBmb3JtYXR0ZXIgY2FsbC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgYmluZGluZyBwYXJ0IHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gc2luZ2xlUGF0aCBXaGV0aGVyIHRoZXJlIGlzIG9uZSBvciBtdWx0aXBsZSBwYXRoIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIHNuaXBwZXQgdG8gaW5jbHVkZSBpbiB0aGUgb3ZlcmFsbCBiaW5kaW5nIGRlZmluaXRpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGFueT4sIHNpbmdsZVBhdGggPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBvdXRWYWx1ZSA9IFwiXCI7XG5cdGlmIChleHByZXNzaW9uLl90eXBlID09PSBcIkNvbnN0YW50XCIpIHtcblx0XHRpZiAoZXhwcmVzc2lvbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTcGVjaWFsIGNhc2Ugb3RoZXJ3aXNlIHRoZSBKU1Rva2VuaXplciBjb21wbGFpbnMgYWJvdXQgaW5jb3JyZWN0IGNvbnRlbnRcblx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAndW5kZWZpbmVkJ2A7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAke2NvbXBpbGVDb25zdGFudChleHByZXNzaW9uLCB0cnVlKX1gO1xuXHRcdH1cblx0fSBlbHNlIGlmIChleHByZXNzaW9uLl90eXBlID09PSBcIlBhdGhJbk1vZGVsXCIpIHtcblx0XHRvdXRWYWx1ZSA9IGBwYXRoOiAnJHtjb21waWxlUGF0aEluTW9kZWwoZXhwcmVzc2lvbil9J2A7XG5cblx0XHRvdXRWYWx1ZSArPSBleHByZXNzaW9uLnR5cGUgPyBgLCB0eXBlOiAnJHtleHByZXNzaW9uLnR5cGV9J2AgOiBgLCB0YXJnZXRUeXBlOiAnYW55J2A7XG5cdFx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24ubW9kZSkpIHtcblx0XHRcdG91dFZhbHVlICs9IGAsIG1vZGU6ICcke2NvbXBpbGVFeHByZXNzaW9uKGV4cHJlc3Npb24ubW9kZSl9J2A7XG5cdFx0fVxuXHRcdGlmIChoYXNFbGVtZW50cyhleHByZXNzaW9uLmNvbnN0cmFpbnRzKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgY29uc3RyYWludHM6ICR7Y29tcGlsZUV4cHJlc3Npb24oZXhwcmVzc2lvbi5jb25zdHJhaW50cyl9YDtcblx0XHR9XG5cdFx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykpIHtcblx0XHRcdG91dFZhbHVlICs9IGAsIGZvcm1hdE9wdGlvbnM6ICR7Y29tcGlsZUV4cHJlc3Npb24oZXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKX1gO1xuXHRcdH1cblx0XHRpZiAoaGFzRWxlbWVudHMoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlRXhwcmVzc2lvbihleHByZXNzaW9uLnBhcmFtZXRlcnMpfWA7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdHJldHVybiBzaW5nbGVQYXRoID8gb3V0VmFsdWUgOiBgeyR7b3V0VmFsdWV9fWA7XG59XG5cbmZ1bmN0aW9uIGhhc0VsZW1lbnRzKG9iajogYW55KSB7XG5cdHJldHVybiBvYmogJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBiaW5kaW5nIGV4cHJlc3Npb24gcGF0aC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlLlxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVQYXRoSW5Nb2RlbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogUGF0aEluTW9kZWxFeHByZXNzaW9uPFQ+KSB7XG5cdHJldHVybiBgJHtleHByZXNzaW9uLm1vZGVsTmFtZSA/IGAke2V4cHJlc3Npb24ubW9kZWxOYW1lfT5gIDogXCJcIn0ke2V4cHJlc3Npb24ucGF0aH1gO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE4S08sSUFBTUEsdUJBQW9ELEdBQUc7SUFDbkVDLEtBQUssRUFBRTtFQUNSLENBQUM7RUFBQztFQUVGLFNBQVNDLGtCQUFrQixDQUFDQyxXQUFtQixFQUFFO0lBQ2hELE9BQU9BLFdBQVcsQ0FBQ0MsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7RUFDeEM7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0MsMEJBQTBCLENBQ3pDQyxVQUF1RCxFQUNMO0lBQ2xELE9BQU8sQ0FBQ0EsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQXdDTCxLQUFLLE1BQUtNLFNBQVM7RUFDOUU7RUFBQztFQUNNLFNBQVNDLDBCQUEwQixHQUEyRDtJQUFBLGtDQUF2REMsV0FBVztNQUFYQSxXQUFXO0lBQUE7SUFDeEQsT0FBT0EsV0FBVyxDQUFDQyxJQUFJLENBQUMsVUFBQ0MsSUFBSTtNQUFBLE9BQUtBLElBQUksQ0FBQ1YsS0FBSyxLQUFLLGNBQWM7SUFBQSxFQUFDLEtBQUtNLFNBQVM7RUFDL0U7RUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUEE7RUFRTyxTQUFTSyx5QkFBeUIsQ0FBSUMsQ0FBOEIsRUFBRUMsQ0FBOEIsRUFBVztJQUNySCxJQUFJRCxDQUFDLENBQUNaLEtBQUssS0FBS2EsQ0FBQyxDQUFDYixLQUFLLEVBQUU7TUFDeEIsT0FBTyxLQUFLO0lBQ2I7SUFFQSxRQUFRWSxDQUFDLENBQUNaLEtBQUs7TUFDZCxLQUFLLGNBQWM7UUFDbEIsT0FBTyxLQUFLO01BQUU7TUFDZixLQUFL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
|
|
5
|
+
sap.ui.define(["./AnnotationEnum"],function(e){"use strict";var n={};var t=e.resolveEnumValue;const r={"Edm.Boolean":{type:"sap.ui.model.odata.type.Boolean"},"Edm.Byte":{type:"sap.ui.model.odata.type.Byte"},"Edm.Date":{type:"sap.ui.model.odata.type.Date"},"Edm.DateTimeOffset":{constraints:{$Precision:"precision",$V4:"V4"},type:"sap.ui.model.odata.type.DateTimeOffset"},"Edm.Decimal":{constraints:{"@Org.OData.Validation.V1.Minimum/$Decimal":"minimum","@Org.OData.Validation.V1.Minimum@Org.OData.Validation.V1.Exclusive":"minimumExclusive","@Org.OData.Validation.V1.Maximum/$Decimal":"maximum","@Org.OData.Validation.V1.Maximum@Org.OData.Validation.V1.Exclusive":"maximumExclusive",$Precision:"precision",$Scale:"scale"},type:"sap.ui.model.odata.type.Decimal"},"Edm.Double":{type:"sap.ui.model.odata.type.Double"},"Edm.Guid":{type:"sap.ui.model.odata.type.Guid"},"Edm.Int16":{type:"sap.ui.model.odata.type.Int16"},"Edm.Int32":{type:"sap.ui.model.odata.type.Int32"},"Edm.Int64":{type:"sap.ui.model.odata.type.Int64"},"Edm.SByte":{type:"sap.ui.model.odata.type.SByte"},"Edm.Single":{type:"sap.ui.model.odata.type.Single"},"Edm.Stream":{type:"sap.ui.model.odata.type.Stream"},"Edm.Binary":{type:"sap.ui.model.odata.type.Stream"},"Edm.String":{constraints:{"@com.sap.vocabularies.Common.v1.IsDigitSequence":"isDigitSequence",$MaxLength:"maxLength",$Nullable:"nullable"},type:"sap.ui.model.odata.type.String"},"Edm.TimeOfDay":{constraints:{$Precision:"precision"},type:"sap.ui.model.odata.type.TimeOfDay"}};n.EDM_TYPE_MAPPING=r;const a={_type:"Unresolvable"};n.unresolvableExpression=a;function o(e){return e.replace(/'/g,"\\'")}function i(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++){n[t]=arguments[t]}return n.find(e=>e._type==="Unresolvable")!==undefined}n.hasUnresolvableExpression=i;function s(e,n){if(e._type!==n._type){return false}switch(e._type){case"Unresolvable":return false;case"Constant":case"EmbeddedBinding":case"EmbeddedExpressionBinding":return e.value===n.value;case"Not":return s(e.operand,n.operand);case"Truthy":return s(e.operand,n.operand);case"Set":return e.operator===n.operator&&e.operands.length===n.operands.length&&e.operands.every(e=>n.operands.some(n=>s(e,n)));case"IfElse":return s(e.condition,n.condition)&&s(e.onTrue,n.onTrue)&&s(e.onFalse,n.onFalse);case"Comparison":return e.operator===n.operator&&s(e.operand1,n.operand1)&&s(e.operand2,n.operand2);case"Concat":const t=e.expressions;const r=n.expressions;if(t.length!==r.length){return false}return t.every((e,n)=>s(e,r[n]));case"Length":return s(e.pathInModel,n.pathInModel);case"PathInModel":return e.modelName===n.modelName&&e.path===n.path&&e.targetEntitySet===n.targetEntitySet;case"Formatter":return e.fn===n.fn&&e.parameters.length===n.parameters.length&&e.parameters.every((e,t)=>s(n.parameters[t],e));case"ComplexType":return e.type===n.type&&e.bindingParameters.length===n.bindingParameters.length&&e.bindingParameters.every((e,t)=>s(n.bindingParameters[t],e));case"Function":const a=n;if(e.obj===undefined||a.obj===undefined){return e.obj===a}return e.fn===a.fn&&s(e.obj,a.obj)&&e.parameters.length===a.parameters.length&&e.parameters.every((e,n)=>s(a.parameters[n],e));case"Ref":return e.ref===n.ref}return false}n._checkExpressionsAreEqual=s;function u(e){return e.operands.reduce((n,t)=>{const r=t._type==="Set"&&t.operator===e.operator?t.operands:[t];r.forEach(e=>{if(n.operands.every(n=>!s(n,e))){n.operands.push(e)}});return n},{_type:"Set",operator:e.operator,operands:[]})}function l(e){const n=e.map(f);return e.some((e,t)=>{for(let r=t+1;r<n.length;r++){if(s(e,n[r])){return true}}return false})}function p(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++){n[t]=arguments[t]}const r=u({_type:"Set",operator:"&&",operands:n.map($)}).operands;if(i(...r)){return a}let o=false;const s=r.filter(e=>{if(I(e)){o=true}return!E(e)});if(o){return v(false)}else if(s.length===0){const e=r.reduce((e,n)=>e&&O(n),true);return v(e)}else if(s.length===1){return s[0]}else if(l(s)){return v(false)}else{return{_type:"Set",operator:"&&",operands:s}}}n.and=p;function d(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++){n[t]=arguments[t]}const r=u({_type:"Set",operator:"||",operands:n.map($)}).operands;if(i(...r)){return a}let o=false;const s=r.filter(e=>{if(O(e)){o=true}return!E(e)||e.value});if(o){return v(true)}else if(s.length===0){const e=r.reduce((e,n)=>e&&O(n),true);return v(e)}else if(s.length===1){return s[0]}else if(l(s)){return v(true)}else{return{_type:"Set",operator:"||",operands:s}}}n.or=d;function f(e){e=$(e);if(i(e)){return a}else if(E(e)){return v(!e.value)}else if(typeof e==="object"&&e._type==="Set"&&e.operator==="||"&&e.operands.every(e=>E(e)||P(e))){return p(...e.operands.map(e=>f(e)))}else if(typeof e==="object"&&e._type==="Set"&&e.operator==="&&"&&e.operands.every(e=>E(e)||P(e))){return d(...e.operands.map(e=>f(e)))}else if(P(e)){switch(e.operator){case"!==":return{...e,operator:"==="};case"<":return{...e,operator:">="};case"<=":return{...e,operator:">"};case"===":return{...e,operator:"!=="};case">":return{...e,operator:"<="};case">=":return{...e,operator:"<"}}}else if(e._type==="Not"){return e.operand}return{_type:"Not",operand:e}}n.not=f;function c(e){if(E(e)){return v(!!e.value)}else{return{_type:"Truthy",operand:e}}}n.isTruthy=c;function m(e,n){let t=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];let r=arguments.length>3?arguments[3]:undefined;return y(e,n,t,r)}n.bindingExpression=m;function y(e,n){let t=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];let r=arguments.length>3?arguments[3]:undefined;if(e===undefined){return a}let o;if(r){o=r(e);if(o===undefined){return a}}else{const n=t.concat();n.push(e);o=n.join("/")}return{_type:"PathInModel",modelName:n,path:o}}n.pathInModel=y;function v(e){let n;if(typeof e==="object"&&e!==null&&e!==undefined){if(Array.isArray(e)){n=e.map($)}else if(F(e)){n=e.valueOf()}else{n=Object.entries(e).reduce((e,n)=>{let[t,r]=n;const a=$(r);if(a._type!=="Constant"||a.value!==undefined){e[t]=a}return e},{})}}else{n=e}return{_type:"Constant",value:n}}n.constant=v;function h(e,n){if(e!==undefined&&typeof e==="string"&&e.startsWith("{")){const n=/^{(.*)>(.+)}$/;const t=n.exec(e);if(e.startsWith("{=")){return{_type:"EmbeddedExpressionBinding",value:e}}else if(t){return y(t[2]||"",t[1]||undefined)}else{return{_type:"EmbeddedBinding",value:e}}}else if(n==="boolean"&&typeof e==="string"&&(e==="true"||e==="false")){return v(e==="true")}else if(n==="number"&&typeof e==="string"&&(!isNaN(Number(e))||e==="NaN")){return v(Number(e))}else{return v(e)}}n.resolveBindingString=h;function g(e){return{_type:"Ref",ref:e}}n.ref=g;function $(e){if(b(e)){return e}return v(e)}function b(e){return(e===null||e===void 0?void 0:e._type)!==undefined}n.isBindingToolkitExpression=b;function E(e){return typeof e!=="object"||e._type==="Constant"}n.isConstant=E;function O(e){return E(e)&&e.value===true}function I(e){return E(e)&&e.value===false}function _(e){return(e===null||e===void 0?void 0:e._type)==="PathInModel"}n.isPathInModelExpression=_;function x(e){return(e===null||e===void 0?void 0:e._type)==="ComplexType"}n.isComplexTypeExpression=x;function C(e){return(e===null||e===void 0?void 0:e._type)==="Concat"}function P(e){return e._type==="Comparison"}function S(e){const n=e;return(n===null||n===void 0?void 0:n._type)==="Constant"&&(n===null||n===void 0?void 0:n.value)===undefined}n.isUndefinedExpression=S;function F(e){switch(e.constructor.name){case"String":case"Number":case"Boolean":return true;default:return false}}function T(e){return typeof e==="object"&&!F(e)}function N(e){let n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];let t=arguments.length>2?arguments[2]:undefined;let r=arguments.length>3?arguments[3]:undefined;return M(e,n,t,r)}n.annotationExpression=N;function M(e){var n;let t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];let r=arguments.length>2?arguments[2]:undefined;let o=arguments.length>3?arguments[3]:undefined;if(e===undefined){return $(r)}e=(n=e)===null||n===void 0?void 0:n.valueOf();if(!T(e)){return v(e)}switch(e.type){case"Path":return y(e.path,undefined,t,o);case"If":return D(e.If,t,o);case"Not":return f(w(e.Not,t,o));case"Eq":return L(w(e.Eq[0],t,o),w(e.Eq[1],t,o));case"Ne":return k(w(e.Ne[0],t,o),w(e.Ne[1],t,o));case"Gt":return B(w(e.Gt[0],t,o),w(e.Gt[1],t,o));case"Ge":return q(w(e.Ge[0],t,o),w(e.Ge[1],t,o));case"Lt":return U(w(e.Lt[0],t,o),w(e.Lt[1],t,o));case"Le":return G(w(e.Le[0],t,o),w(e.Le[1],t,o));case"Or":return d(...e.Or.map(function(e){return w(e,t,o)}));case"And":return p(...e.And.map(function(e){return w(e,t,o)}));case"Apply":return A(e,t,o)}return a}n.getExpressionFromAnnotation=M;function w(e){let n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];let r=arguments.length>2?arguments[2]:undefined;if(e===null||typeof e!=="object"){return v(e)}else if(e.hasOwnProperty("$Or")){return d(...e.$Or.map(function(e){return w(e,n,r)}))}else if(e.hasOwnProperty("$And")){return p(...e.$And.map(function(e){return w(e,n,r)}))}else if(e.hasOwnProperty("$Not")){return f(w(e.$Not,n,r))}else if(e.hasOwnProperty("$Eq")){return L(w(e.$Eq[0],n,r),w(e.$Eq[1],n,r))}else if(e.hasOwnProperty("$Ne")){return k(w(e.$Ne[0],n,r),w(e.$Ne[1],n,r))}else if(e.hasOwnProperty("$Gt")){return B(w(e.$Gt[0],n,r),w(e.$Gt[1],n,r))}else if(e.hasOwnProperty("$Ge")){return q(w(e.$Ge[0],n,r),w(e.$Ge[1],n,r))}else if(e.hasOwnProperty("$Lt")){return U(w(e.$Lt[0],n,r),w(e.$Lt[1],n,r))}else if(e.hasOwnProperty("$Le")){return G(w(e.$Le[0],n,r),w(e.$Le[1],n,r))}else if(e.hasOwnProperty("$Path")){return y(e.$Path,undefined,n,r)}else if(e.hasOwnProperty("$Apply")){return M({type:"Apply",Function:e.$Function,Apply:e.$Apply},n,undefined,r)}else if(e.hasOwnProperty("$If")){return M({type:"If",If:e.$If},n,undefined,r)}else if(e.hasOwnProperty("$EnumMember")){return v(t(e.$EnumMember))}return v(false)}function D(e){let n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];let t=arguments.length>2?arguments[2]:undefined;return Y(w(e[0],n,t),w(e[1],n,t),w(e[2],n,t))}n.annotationIfExpression=D;function A(e){let n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];let t=arguments.length>2?arguments[2]:undefined;switch(e.Function){case"odata.concat":return ee(...e.Apply.map(e=>{let r=e;if(e.hasOwnProperty("$Path")){r={type:"Path",path:e.$Path}}else if(e.hasOwnProperty("$If")){r={type:"If",If:e.$If}}else if(e.hasOwnProperty("$Apply")){r={type:"Apply",Function:e.$Function,Apply:e.$Apply}}return M(r,n,undefined,t)}))}return a}n.annotationApplyExpression=A;function j(e,n,t){const r=$(n);const o=$(t);if(i(r,o)){return a}if(E(r)&&E(o)){switch(e){case"!==":return v(r.value!==o.value);case"===":return v(r.value===o.value);case"<":return v(r.value<o.value);case"<=":return v(r.value<=o.value);case">":return v(r.value>o.value);case">=":return v(r.value>=o.value)}}else{return{_type:"Comparison",operator:e,operand1:r,operand2:o}}}function V(e){if(e._type==="Unresolvable"){return e}return{_type:"Length",pathInModel:e}}n.length=V;function L(e,n){const t=$(e);const r=$(n);if(i(t,r)){return a}if(s(t,r)){return v(true)}function o(e,n){if(e._type==="Comparison"&&O(n)){return e}else if(e._type==="Comparison"&&I(n)){return f(e)}else if(e._type==="IfElse"&&s(e.onTrue,n)){return d(e.condition,L(e.onFalse,n))}else if(e._type==="IfElse"&&s(e.onFalse,n)){return d(f(e.condition),L(e.onTrue,n))}else if(e._type==="IfElse"&&E(e.onTrue)&&E(e.onFalse)&&E(n)&&!s(e.onTrue,n)&&!s(e.onFalse,n)){return v(false)}return undefined}const u=o(t,r)??o(r,t);return u??j("===",t,r)}n.equal=L;function k(e,n){return f(L(e,n))}n.notEqual=k;function q(e,n){return j(">=",e,n)}n.greaterOrEqual=q;function B(e,n){return j(">",e,n)}n.greaterThan=B;function G(e,n){return j("<=",e,n)}n.lessOrEqual=G;function U(e,n){return j("<",e,n)}n.lessThan=U;function Y(e,n,t){let r=$(e);let o=$(n);let u=$(t);if(i(r,o,u)){return a}if(r._type==="Not"){[o,u]=[u,o];r=f(r)}if(o._type==="IfElse"&&s(r,o.condition)){o=o.onTrue}if(u._type==="IfElse"&&s(r,u.condition)){u=u.onFalse}if(E(r)){return r.value?o:u}if(s(o,u)){return o}if(I(u)){return p(r,o)}if(O(u)){return d(f(r),o)}if(I(o)){return p(f(r),u)}if(O(o)){return d(r,u)}if(x(e)||x(n)||x(t)){let r=0;const a=R([e,n,t],"sap.fe.core.formatters.StandardFormatter#ifElse");const o=[];ne(a,"PathInModel",e=>{o.push(e);return y(`$${r++}`,"$")},true);o.unshift(v(JSON.stringify(a)));return R(o,"sap.fe.core.formatters.StandardFormatter#evaluateComplexExpression",undefined,true)}return{_type:"IfElse",condition:r,onTrue:o,onFalse:u}}n.ifElse=Y;function W(e){switch(e._type){case"Constant":case"Formatter":case"ComplexType":return false;case"Set":return e.operands.some(W);case"PathInModel":return e.modelName===undefined;case"Comparison":return W(e.operand1)||W(e.operand2);case"IfElse":return W(e.condition)||W(e.onTrue)||W(e.onFalse);case"Not":case"Truthy":return W(e.operand);default:return false}}function R(e,n,t){let r=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;const o=e.map($);if(i(...o)){return a}if(t){if(!o.some(W)){t.keys.forEach(e=>o.push(y(e.name,"")))}}let s="";if(typeof n==="string"){s=n}else{s=n.__functionName}const[u,l]=s.split("#");if(!r&&(o.some(x)||o.some(C))){let e=0;const n=R(o,s,undefined,true);const t=[];ne(n,"PathInModel",n=>{t.push(n);return y(`$${e++}`,"$")});t.unshift(v(JSON.stringify(n)));return R(t,"sap.fe.core.formatters.StandardFormatter#evaluateComplexExpression",undefined,true)}else if(!!l&&l.length>0){o.unshift(v(l))}return{_type:"Formatter",fn:u,parameters:o}}n.formatResult=R;function Q(e,n){var t,r,a,o,i,s,u,l,p,d,f,c,m;const y={};if(e!==null&&e!==void 0&&(t=e.constraints)!==null&&t!==void 0&&t.$Scale&&n.scale!==undefined){y.scale=n.scale}if(e!==null&&e!==void 0&&(r=e.constraints)!==null&&r!==void 0&&r.$Precision&&n.precision!==undefined){y.precision=n.precision}if(e!==null&&e!==void 0&&(a=e.constraints)!==null&&a!==void 0&&a.$MaxLength&&n.maxLength!==undefined){y.maxLength=n.maxLength}if(n.nullable===false){y.nullable=false}if(e!==null&&e!==void 0&&(o=e.constraints)!==null&&o!==void 0&&o["@Org.OData.Validation.V1.Minimum/$Decimal"]&&!isNaN((i=n.annotations)===null||i===void 0?void 0:(s=i.Validation)===null||s===void 0?void 0:s.Minimum)){var v,h;y.minimum=`${(v=n.annotations)===null||v===void 0?void 0:(h=v.Validation)===null||h===void 0?void 0:h.Minimum}`}if(e!==null&&e!==void 0&&(u=e.constraints)!==null&&u!==void 0&&u["@Org.OData.Validation.V1.Maximum/$Decimal"]&&!isNaN((l=n.annotations)===null||l===void 0?void 0:(p=l.Validation)===null||p===void 0?void 0:p.Maximum)){var g,$;y.maximum=`${(g=n.annotations)===null||g===void 0?void 0:($=g.Validation)===null||$===void 0?void 0:$.Maximum}`}if((d=n.annotations)!==null&&d!==void 0&&(f=d.Common)!==null&&f!==void 0&&f.IsDigitSequence&&e.type==="sap.ui.model.odata.type.String"&&e!==null&&e!==void 0&&(c=e.constraints)!==null&&c!==void 0&&c["@com.sap.vocabularies.Common.v1.IsDigitSequence"]){y.isDigitSequence=true}if(e!==null&&e!==void 0&&(m=e.constraints)!==null&&m!==void 0&&m.$V4){y.V4=true}return y}n.setUpConstraints=Q;function J(e,n){var t;let a=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;const o=n;if(e._type!=="Property"){return o}const i=r[e.type];if(!i){return o}if(!o.formatOptions){o.formatOptions={}}o.constraints={};o.type=i.type;if(!a){o.constraints=Q(i,e)}if((o===null||o===void 0?void 0:(t=o.type)===null||t===void 0?void 0:t.indexOf("sap.ui.model.odata.type.Int"))===0&&(o===null||o===void 0?void 0:o.type)!=="sap.ui.model.odata.type.Int64"||(o===null||o===void 0?void 0:o.type)==="sap.ui.model.odata.type.Double"){o.formatOptions=Object.assign(o.formatOptions,{parseAsString:false})}if(o.type==="sap.ui.model.odata.type.String"){o.formatOptions.parseKeepsEmptyString=true;const n=K(e);if(n){o.formatOptions.fiscalType=n;o.type="sap.fe.core.type.FiscalDate"}}if(o.type==="sap.ui.model.odata.type.Decimal"||(o===null||o===void 0?void 0:o.type)==="sap.ui.model.odata.type.Int64"){o.formatOptions=Object.assign(o.formatOptions,{emptyString:""})}return o}n.formatWithTypeInformation=J;const K=function(e){var n,t,r,a,o,i,s,u,l,p,d,f,c,m,y,v;if((n=e.annotations)!==null&&n!==void 0&&(t=n.Common)!==null&&t!==void 0&&t.IsFiscalYear){return"com.sap.vocabularies.Common.v1.IsFiscalYear"}if((r=e.annotations)!==null&&r!==void 0&&(a=r.Common)!==null&&a!==void 0&&a.IsFiscalPeriod){return"com.sap.vocabularies.Common.v1.IsFiscalPeriod"}if((o=e.annotations)!==null&&o!==void 0&&(i=o.Common)!==null&&i!==void 0&&i.IsFiscalYearPeriod){return"com.sap.vocabularies.Common.v1.IsFiscalYearPeriod"}if((s=e.annotations)!==null&&s!==void 0&&(u=s.Common)!==null&&u!==void 0&&u.IsFiscalQuarter){return"com.sap.vocabularies.Common.v1.IsFiscalQuarter"}if((l=e.annotations)!==null&&l!==void 0&&(p=l.Common)!==null&&p!==void 0&&p.IsFiscalYearQuarter){return"com.sap.vocabularies.Common.v1.IsFiscalYearQuarter"}if((d=e.annotations)!==null&&d!==void 0&&(f=d.Common)!==null&&f!==void 0&&f.IsFiscalWeek){return"com.sap.vocabularies.Common.v1.IsFiscalWeek"}if((c=e.annotations)!==null&&c!==void 0&&(m=c.Common)!==null&&m!==void 0&&m.IsFiscalYearWeek){return"com.sap.vocabularies.Common.v1.IsFiscalYearWeek"}if((y=e.annotations)!==null&&y!==void 0&&(v=y.Common)!==null&&v!==void 0&&v.IsDayOfFiscalYear){return"com.sap.vocabularies.Common.v1.IsDayOfFiscalYear"}};n.getFiscalType=K;function z(e,n,t,r){const o=e.map($);if(i(...o)){return a}if(o.length===1&&E(o[0])&&!t){return o[0]}else if(t){if(!o.some(W)){t.keys.forEach(e=>o.push(y(e.name,"")))}}r=H(e[0],r);if(n==="sap.ui.model.odata.type.Unit"){const e=y("/##@@requestUnitsOfMeasure");e.targetType="any";e.mode="OneTime";o.push(e)}else if(n==="sap.ui.model.odata.type.Currency"){const e=y("/##@@requestCurrencyCodes");e.targetType="any";e.mode="OneTime";o.push(e)}return{_type:"ComplexType",type:n,formatOptions:r||{},parameters:{},bindingParameters:o}}n.addTypeInformation=z;function H(e,n){var t,r;if(!(n&&n.showNumber===false)&&((e===null||e===void 0?void 0:(t=e.type)===null||t===void 0?void 0:t.indexOf("sap.ui.model.odata.type.Int"))===0||(e===null||e===void 0?void 0:e.type)==="sap.ui.model.odata.type.Decimal"||(e===null||e===void 0?void 0:e.type)==="sap.ui.model.odata.type.Double")){if((e===null||e===void 0?void 0:e.type)==="sap.ui.model.odata.type.Int64"||(e===null||e===void 0?void 0:e.type)==="sap.ui.model.odata.type.Decimal"){var a;n=((a=n)===null||a===void 0?void 0:a.showMeasure)===false?{emptyString:"",showMeasure:false}:{emptyString:""}}else{var o;n=((o=n)===null||o===void 0?void 0:o.showMeasure)===false?{parseAsString:false,showMeasure:false}:{parseAsString:false}}}if((e===null||e===void 0?void 0:(r=e.constraints)===null||r===void 0?void 0:r.nullable)!==false){var i;(i=n)===null||i===void 0?true:delete i.emptyString}return n}function X(e,n,t){const r=typeof e==="string"?e:e.__functionName;return{_type:"Function",obj:t!==undefined?$(t):undefined,fn:r,parameters:n.map($)}}n.fn=X;function Z(e){const n=[];ne(e,"PathInModel",e=>{n.push(d(L(e,""),L(e,undefined),L(e,null)));return e});return p(...n)}n.isEmpty=Z;function ee(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++){n[t]=arguments[t]}const r=n.map($);if(i(...r)){return a}if(r.every(E)){return v(r.reduce((e,n)=>{if(n.value!==undefined){return e+n.value.toString()}return e},""))}else if(r.some(x)){let e=0;const n=R(r,"sap.fe.core.formatters.StandardFormatter#concat",undefined,true);const t=[];ne(n,"PathInModel",n=>{t.push(n);return y(`$${e++}`,"$")});t.unshift(v(JSON.stringify(n)));return R(t,"sap.fe.core.formatters.StandardFormatter#evaluateComplexExpression",undefined,true)}return{_type:"Concat",expressions:r}}n.concat=ee;function ne(e,n,t){let r=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;let a=e;switch(a._type){case"Function":case"Formatter":a.parameters=a.parameters.map(e=>ne(e,n,t,r));break;case"Concat":a.expressions=a.expressions.map(e=>ne(e,n,t,r));a=ee(...a.expressions);break;case"ComplexType":a.bindingParameters=a.bindingParameters.map(e=>ne(e,n,t,r));break;case"IfElse":const e=ne(a.onTrue,n,t,r);const o=ne(a.onFalse,n,t,r);let i=a.condition;if(r){i=ne(a.condition,n,t,r)}a=Y(i,e,o);break;case"Not":if(r){const e=ne(a.operand,n,t,r);a=f(e)}break;case"Truthy":break;case"Set":if(r){const e=a.operands.map(e=>ne(e,n,t,r));a=a.operator==="||"?d(...e):p(...e)}break;case"Comparison":if(r){const e=ne(a.operand1,n,t,r);const o=ne(a.operand2,n,t,r);a=j(a.operator,e,o)}break;case"Ref":case"Length":case"PathInModel":case"Constant":case"EmbeddedBinding":case"EmbeddedExpressionBinding":case"Unresolvable":break}if(n===a._type){a=t(e)}return a}n.transformRecursively=ne;const te=function(e){return!E(e)&&!_(e)&&b(e)&&e._type!=="IfElse"&&e._type!=="Function"};function re(e){let n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(n&&Object.keys(e.value).length===0){return""}const t=e.value;const r=[];Object.keys(t).forEach(e=>{const a=t[e];const o=ue(a,true,false,n);if(o&&o.length>0){r.push(`${e}: ${o}`)}});return`{${r.join(", ")}}`}function ae(e,n){let t=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;let r=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;if(e.value===null){return r?null:"null"}if(e.value===undefined){return r?undefined:"undefined"}if(typeof e.value==="object"){if(Array.isArray(e.value)){const n=e.value.map(e=>ue(e,true));return`[${n.join(", ")}]`}else{return re(e,t)}}if(n){switch(typeof e.value){case"number":case"bigint":case"boolean":return e.value.toString();case"string":return`'${o(e.value.toString())}'`;default:return""}}else{return r?e.value:e.value.toString()}}n.compileConstant=ae;function oe(e,n,t){if(e.type||e.parameters||e.targetType||e.formatOptions||e.constraints){const r={path:ce(e),type:e.type,targetType:e.targetType,parameters:e.parameters,formatOptions:e.formatOptions,constraints:e.constraints};const a=ue(r,false,false,true);if(n){return`${t}${a}`}return a}else if(n){return`${t}{${ce(e)}}`}else{return`{${ce(e)}}`}}function ie(e){if(e.bindingParameters.length===1){return`{${de(e.bindingParameters[0],true)}, type: '${e.type}'}`}let n=`], type: '${e.type}'`;if(fe(e.formatOptions)){n+=`, formatOptions: ${ue(e.formatOptions)}`}if(fe(e.parameters)){n+=`, parameters: ${ue(e.parameters)}`}n+="}";return`{mode:'TwoWay', parts:[${e.bindingParameters.map(e=>de(e)).join(",")}${n}`}function se(e,n){let t=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(n){if(t){return`(${e})`}else{return e}}else{return`{= ${e}}`}}function ue(e){let n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;let t=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;let r=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;const a=$(e);const o=t?"$":"%";switch(a._type){case"Unresolvable":return undefined;case"Constant":return ae(a,n,r);case"Ref":return a.ref||"null";case"Function":const e=`${a.parameters.map(e=>ue(e,true)).join(", ")}`;return a.obj===undefined?`${a.fn}(${e})`:`${ue(a.obj,true)}.${a.fn}(${e})`;case"EmbeddedExpressionBinding":return n?`(${a.value.substring(2,a.value.length-1)})`:`${a.value}`;case"EmbeddedBinding":return n?`${o}${a.value}`:`${a.value}`;case"PathInModel":return oe(a,n,o);case"Comparison":const t=le(a);return se(t,n);case"IfElse":const i=`${ue(a.condition,true)} ? ${ue(a.onTrue,true)} : ${ue(a.onFalse,true)}`;return se(i,n,true);case"Set":const s=a.operands.map(e=>ue(e,true)).join(` ${a.operator} `);return se(s,n,true);case"Concat":const u=a.expressions.map(e=>ue(e,true,true)).join(" + ");return se(u,n);case"Length":const l=`${ue(a.pathInModel,true)}.length`;return se(l,n);case"Not":const p=`!${ue(a.operand,true)}`;return se(p,n);case"Truthy":const d=`!!${ue(a.operand,true)}`;return se(d,n);case"Formatter":const f=pe(a);return n?`$${f}`:f;case"ComplexType":const c=ie(a);return n?`$${c}`:c;default:return""}}n.compileExpression=ue;function le(e){function n(e){const n=ue(e,true)??"undefined";return se(n,true,te(e))}return`${n(e.operand1)} ${e.operator} ${n(e.operand2)}`}function pe(e){if(e.parameters.length===1){return`{${de(e.parameters[0],true)}, formatter: '${e.fn}'}`}else{const n=e.parameters.map(e=>{if(e._type==="ComplexType"){return ie(e)}else{return de(e)}});return`{parts: [${n.join(", ")}], formatter: '${e.fn}'}`}}function de(e){let n=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;let t="";if(e._type==="Constant"){if(e.value===undefined){t=`value: 'undefined'`}else{t=`value: ${ae(e,true)}`}}else if(e._type==="PathInModel"){t=`path: '${ce(e)}'`;t+=e.type?`, type: '${e.type}'`:`, targetType: 'any'`;if(fe(e.mode)){t+=`, mode: '${ue(e.mode)}'`}if(fe(e.constraints)){t+=`, constraints: ${ue(e.constraints)}`}if(fe(e.formatOptions)){t+=`, formatOptions: ${ue(e.formatOptions)}`}if(fe(e.parameters)){t+=`, parameters: ${ue(e.parameters)}`}}else{return""}return n?t:`{${t}}`}function fe(e){return e&&Object.keys(e).length>0}function ce(e){return`${e.modelName?`${e.modelName}>`:""}${e.path}`}return n},false);
|
|
6
|
+
//# sourceMappingURL=BindingToolkit.js.map
|