@magic-xpa/engine 4.801.0-dev481.243 → 4.801.0-dev481.249
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/esm2020/index.mjs +190 -0
- package/{esm2015/magic-xpa-engine.js → esm2020/magic-xpa-engine.mjs} +0 -0
- package/esm2020/src/AccessHelper.mjs +3 -0
- package/esm2020/src/ClientManager.mjs +403 -0
- package/esm2020/src/CommandsProcessorBase.mjs +58 -0
- package/esm2020/src/CommandsProcessorManager.mjs +26 -0
- package/esm2020/src/CommandsTable.mjs +163 -0
- package/{esm2015/src/ConstInterface.js → esm2020/src/ConstInterface.mjs} +0 -0
- package/{esm2015/src/CurrentClientVersion.js → esm2020/src/CurrentClientVersion.mjs} +2 -2
- package/{esm2015/src/FlowMonitorInterface.js → esm2020/src/FlowMonitorInterface.mjs} +0 -0
- package/esm2020/src/GUIManager.mjs +63 -0
- package/{esm2015/src/GlobalCommandsManager.js → esm2020/src/GlobalCommandsManager.mjs} +0 -0
- package/{esm2015/src/GuiEventsProcessor.js → esm2020/src/GuiEventsProcessor.mjs} +0 -0
- package/{esm2015/src/ICommandsTable.js → esm2020/src/ICommandsTable.mjs} +1 -0
- package/{esm2015/src/ServerConfig.js → esm2020/src/ServerConfig.mjs} +0 -0
- package/{esm2015/src/bridge/IGuiEvent.js → esm2020/src/bridge/IGuiEvent.mjs} +0 -0
- package/esm2020/src/bridge/MagicBridge.mjs +41 -0
- package/{esm2015/src/commands/ClientOriginatedCommandTaskTag.js → esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserLocateDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserRangeDataviewCommand.js → esm2020/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/AddUserSortDataViewCommand.js → esm2020/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js → esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js → esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js → esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs} +0 -0
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +278 -0
- package/{esm2015/src/commands/ClientToServer/CommandSerializationHelper.js → esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ComputeEventCommand.js → esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js → esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js → esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ControlItemsRefreshCommand.js → esm2020/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataViewOutputCommand.js → esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/DataviewCommand.js → esm2020/src/commands/ClientToServer/DataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/EvaluateCommand.js → esm2020/src/commands/ClientToServer/EvaluateCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/EventCommand.js → esm2020/src/commands/ClientToServer/EventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ExecOperCommand.js → esm2020/src/commands/ClientToServer/ExecOperCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js → esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/GlobalParamsQueryCommand.js → esm2020/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/ICommandTaskTag.js → esm2020/src/commands/ClientToServer/ICommandTaskTag.mjs} +1 -0
- package/{esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js → esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js → esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js → esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/QueryCommand.js → esm2020/src/commands/ClientToServer/QueryCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RecomputeCommand.js → esm2020/src/commands/ClientToServer/RecomputeCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RefreshEventCommand.js → esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js → esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/RollbackEventCommand.js → esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SelectProgramCommand.js → esm2020/src/commands/ClientToServer/SelectProgramCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SetTransactionStateDataviewCommand.js → esm2020/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js → esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js → esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/TransactionCommand.js → esm2020/src/commands/ClientToServer/TransactionCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
- package/{esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js → esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs} +0 -0
- package/esm2020/src/commands/DataViewCommandBase.mjs +10 -0
- package/{esm2015/src/commands/IClientCommand.js → esm2020/src/commands/IClientCommand.mjs} +1 -0
- package/esm2020/src/commands/IClientTargetedCommand.mjs +9 -0
- package/{esm2015/src/commands/IClientToServerCommandInfo.js → esm2020/src/commands/IClientToServerCommandInfo.mjs} +1 -0
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/esm2020/src/commands/ServerToClient/AddLocateCommand.mjs +22 -0
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/{esm2015/src/commands/ServerToClient/ClientRefreshCommand.js → esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs} +14 -17
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +27 -0
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +222 -0
- package/esm2020/src/commands/ServerToClient/ResetLocateCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetRangeCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResetSortCommand.mjs +15 -0
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +85 -0
- package/{esm2015/src/commands/ServerToClient/XMLBasedCommandBuilder.js → esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs} +0 -0
- package/{esm2015/src/communications/IConnectionStateManager.js → esm2020/src/communications/IConnectionStateManager.mjs} +1 -0
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +17 -0
- package/{esm2015/src/data/DataSourceIdKey.js → esm2020/src/data/DataSourceIdKey.mjs} +0 -0
- package/esm2020/src/data/DataView.mjs +1634 -0
- package/{esm2015/src/data/DataViewBase.js → esm2020/src/data/DataViewBase.mjs} +0 -0
- package/esm2020/src/data/DataviewManager.mjs +28 -0
- package/esm2020/src/data/DataviewManagerBase.mjs +15 -0
- package/{esm2015/src/data/DvCache.js → esm2020/src/data/DvCache.mjs} +0 -0
- package/esm2020/src/data/Field.mjs +645 -0
- package/esm2020/src/data/FieldBase.mjs +18 -0
- package/{esm2015/src/data/FieldsTable.js → esm2020/src/data/FieldsTable.mjs} +0 -0
- package/{esm2015/src/data/IRecordsTable.js → esm2020/src/data/IRecordsTable.mjs} +1 -0
- package/{esm2015/src/data/Key.js → esm2020/src/data/Key.mjs} +0 -0
- package/{esm2015/src/data/Record.js → esm2020/src/data/Record.mjs} +0 -0
- package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
- package/{esm2015/src/data/RecordsTable.js → esm2020/src/data/RecordsTable.mjs} +0 -0
- package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
- package/{esm2015/src/data/XMLBasedDcValuesBuilder.js → esm2020/src/data/XMLBasedDcValuesBuilder.mjs} +0 -0
- package/{esm2015/src/enums.js → esm2020/src/enums.mjs} +0 -0
- package/esm2020/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2020/src/env/Environment.mjs +554 -0
- package/{esm2015/src/env/ILanguageData.js → esm2020/src/env/ILanguageData.mjs} +1 -0
- package/esm2020/src/env/LanguageData.mjs +222 -0
- package/esm2020/src/env/MirrorString.mjs +66 -0
- package/{esm2015/src/event/ActionManager.js → esm2020/src/event/ActionManager.mjs} +0 -0
- package/esm2020/src/event/Event.mjs +1436 -0
- package/esm2020/src/event/EventHandler.mjs +773 -0
- package/{esm2015/src/event/EventHandlerPosition.js → esm2020/src/event/EventHandlerPosition.mjs} +0 -0
- package/esm2020/src/event/EventsManager.mjs +2983 -0
- package/{esm2015/src/event/IEventsManager.js → esm2020/src/event/IEventsManager.mjs} +0 -0
- package/{esm2015/src/event/RunTimeEvent.js → esm2020/src/event/RunTimeEvent.mjs} +0 -0
- package/{esm2015/src/event/RunTimeEventBase.js → esm2020/src/event/RunTimeEventBase.mjs} +0 -0
- package/{esm2015/src/event/UserEventsTable.js → esm2020/src/event/UserEventsTable.mjs} +0 -0
- package/{esm2015/src/exp/ExpTable.js → esm2020/src/exp/ExpTable.mjs} +0 -0
- package/esm2020/src/exp/Expression.mjs +200 -0
- package/{esm2015/src/exp/ExpressionDict.js → esm2020/src/exp/ExpressionDict.mjs} +0 -0
- package/esm2020/src/exp/ExpressionEvaluator.mjs +4373 -0
- package/{esm2015/src/exp/ExpressionLocalJpn.js → esm2020/src/exp/ExpressionLocalJpn.mjs} +0 -0
- package/esm2020/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2020/src/exp/YesNoExp.mjs +41 -0
- package/{esm2015/src/gui/CreatedFormVector.js → esm2020/src/gui/CreatedFormVector.mjs} +0 -0
- package/esm2020/src/gui/FormsTable.mjs +66 -0
- package/esm2020/src/gui/MgControl.mjs +357 -0
- package/esm2020/src/gui/MgForm.mjs +1195 -0
- package/esm2020/src/http/HttpManager.mjs +97 -0
- package/esm2020/src/http/client/HttpClientAsync.mjs +67 -0
- package/esm2020/src/http/client/HttpClientBase.mjs +148 -0
- package/{esm2015/src/http/client/HttpClientEvents.js → esm2020/src/http/client/HttpClientEvents.mjs} +0 -0
- package/esm2020/src/http/client/HttpClientSync.mjs +42 -0
- package/{esm2015/src/http/client/HttpUtility.js → esm2020/src/http/client/HttpUtility.mjs} +0 -0
- package/{esm2015/src/http/client/ICommunicationsFailureHandler.js → esm2020/src/http/client/ICommunicationsFailureHandler.mjs} +1 -0
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +872 -0
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/{esm2015/src/remote/RemoteDataViewCommandFactory.js → esm2020/src/remote/RemoteDataViewCommandFactory.mjs} +0 -0
- package/esm2020/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +16 -0
- package/esm2020/src/remote/RemoteDataviewManager.mjs +17 -0
- package/esm2020/src/remote/RemoteInitDataViewCommand.mjs +11 -0
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/esm2020/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +13 -0
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/{esm2015/src/remote/ServerError.js → esm2020/src/remote/ServerError.mjs} +0 -0
- package/{esm2015/src/remote/SetTransactionStateRemoteDataViewCommand.js → esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs} +8 -11
- package/esm2020/src/rt/Argument.mjs +274 -0
- package/esm2020/src/rt/ArgumentsList.mjs +103 -0
- package/esm2020/src/rt/Boundary.mjs +158 -0
- package/{esm2015/src/rt/CompMainPrgTable.js → esm2020/src/rt/CompMainPrgTable.mjs} +0 -0
- package/esm2020/src/rt/DataviewHeaderBase.mjs +96 -0
- package/{esm2015/src/rt/DataviewHeaderFactory.js → esm2020/src/rt/DataviewHeaderFactory.mjs} +0 -0
- package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
- package/{esm2015/src/rt/DataviewHeadersSaxHandler.js → esm2020/src/rt/DataviewHeadersSaxHandler.mjs} +0 -0
- package/{esm2015/src/rt/ExecutionStack.js → esm2020/src/rt/ExecutionStack.mjs} +0 -0
- package/{esm2015/src/rt/ExecutionStackEntry.js → esm2020/src/rt/ExecutionStackEntry.mjs} +0 -0
- package/{esm2015/src/rt/HandlersTable.js → esm2020/src/rt/HandlersTable.mjs} +0 -0
- package/{esm2015/src/rt/IDataSourceViewDefinition.js → esm2020/src/rt/IDataSourceViewDefinition.mjs} +1 -0
- package/{esm2015/src/rt/IDataviewHeader.js → esm2020/src/rt/IDataviewHeader.mjs} +1 -0
- package/{esm2015/src/rt/IResultValue.js → esm2020/src/rt/IResultValue.mjs} +1 -0
- package/{esm2015/src/rt/LastFocusedManager.js → esm2020/src/rt/LastFocusedManager.mjs} +0 -0
- package/esm2020/src/rt/Operation.mjs +745 -0
- package/{esm2015/src/rt/OperationTable.js → esm2020/src/rt/OperationTable.mjs} +0 -0
- package/esm2020/src/rt/Recompute.mjs +355 -0
- package/{esm2015/src/rt/RecomputeTable.js → esm2020/src/rt/RecomputeTable.mjs} +0 -0
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +105 -0
- package/{esm2015/src/rt/ResultValue.js → esm2020/src/rt/ResultValue.mjs} +0 -0
- package/esm2020/src/rt/TableCache.mjs +177 -0
- package/esm2020/src/rt/TableCacheManager.mjs +67 -0
- package/{esm2015/src/rt/Transaction.js → esm2020/src/rt/Transaction.mjs} +0 -0
- package/{esm2015/src/security/UserDetails.js → esm2020/src/security/UserDetails.mjs} +0 -0
- package/{esm2015/src/tasks/IMGDataCollection.js → esm2020/src/tasks/IMGDataCollection.mjs} +1 -0
- package/esm2020/src/tasks/MGData.mjs +552 -0
- package/esm2020/src/tasks/MGDataCollection.mjs +259 -0
- package/{esm2015/src/tasks/MenusDeserializer.js → esm2020/src/tasks/MenusDeserializer.mjs} +0 -0
- package/{esm2015/src/tasks/RCTimer.js → esm2020/src/tasks/RCTimer.mjs} +0 -0
- package/{esm2015/src/tasks/RemoteTaskService.js → esm2020/src/tasks/RemoteTaskService.mjs} +0 -0
- package/esm2020/src/tasks/Task.mjs +2501 -0
- package/{esm2015/src/tasks/TaskBase.js → esm2020/src/tasks/TaskBase.mjs} +22 -1
- package/esm2020/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2020/src/tasks/TasksTable.mjs +80 -0
- package/{esm2015/src/tasks/sort/Sort.js → esm2020/src/tasks/sort/Sort.mjs} +0 -0
- package/{esm2015/src/tasks/sort/SortCollection.js → esm2020/src/tasks/sort/SortCollection.mjs} +0 -0
- package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
- package/esm2020/src/util/FlowMonitorQueue.mjs +361 -0
- package/{esm2015/src/util/HeapSort.js → esm2020/src/util/HeapSort.mjs} +0 -0
- package/{esm2015/src/util/IMirrorXML.js → esm2020/src/util/IMirrorXML.mjs} +2 -1
- package/{esm2015/src/util/IServerConfig.js → esm2020/src/util/IServerConfig.mjs} +1 -0
- package/{esm2015/src/util/MgBlockingQueue.js → esm2020/src/util/MgBlockingQueue.mjs} +1 -0
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +76 -0
- package/{esm2015/src/util/MgPriorityQueue.js → esm2020/src/util/MgPriorityQueue.mjs} +0 -0
- package/esm2020/src/util/ParamParseResult.mjs +8 -0
- package/esm2020/src/util/PrmMap.mjs +151 -0
- package/{esm2015/src/util/Process.js → esm2020/src/util/Process.mjs} +0 -0
- package/{esm2015/src/util/ReturnResult.js → esm2020/src/util/ReturnResult.mjs} +0 -0
- package/{esm2015/src/util/ReturnResultBase.js → esm2020/src/util/ReturnResultBase.mjs} +0 -0
- package/{esm2015/src/util/Scrambler.js → esm2020/src/util/Scrambler.mjs} +0 -0
- package/{esm2015/src/util/UniqueIDUtils.js → esm2020/src/util/UniqueIDUtils.mjs} +0 -0
- package/{esm2015/src/util/cookie.service.js → esm2020/src/util/cookie.service.mjs} +0 -0
- package/fesm2015/{magic-xpa-engine.js → magic-xpa-engine.mjs} +102 -5
- package/fesm2015/magic-xpa-engine.mjs.map +1 -0
- package/fesm2020/magic-xpa-engine.mjs +30705 -0
- package/fesm2020/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/package.json +27 -13
- package/src/AccessHelper.d.ts +1 -1
- package/src/CommandsProcessorBase.d.ts +3 -3
- package/src/commands/DataViewCommandBase.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +1 -1
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
- package/src/data/FieldBase.d.ts +3 -3
- package/src/env/EnvVariablesTable.d.ts +2 -15
- package/src/env/MirrorString.d.ts +15 -0
- package/src/exp/GlobalParamsTable.d.ts +2 -1
- package/src/http/client/HttpClientBase.d.ts +2 -2
- package/src/rt/DataviewHeaderBase.d.ts +1 -1
- package/src/tasks/TaskBase.d.ts +7 -7
- package/src/util/IMirrorXML.d.ts +1 -1
- package/src/util/ParamParseResult.d.ts +6 -0
- package/src/util/PrmMap.d.ts +0 -6
- package/bundles/magic-xpa-engine.umd.js +0 -37983
- package/bundles/magic-xpa-engine.umd.js.map +0 -1
- package/bundles/magic-xpa-engine.umd.min.js +0 -16
- package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
- package/esm2015/index.js +0 -188
- package/esm2015/src/AccessHelper.js +0 -3
- package/esm2015/src/ClientManager.js +0 -412
- package/esm2015/src/CommandsProcessorBase.js +0 -54
- package/esm2015/src/CommandsProcessorManager.js +0 -31
- package/esm2015/src/CommandsTable.js +0 -166
- package/esm2015/src/GUIManager.js +0 -72
- package/esm2015/src/bridge/MagicBridge.js +0 -44
- package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
- package/esm2015/src/commands/DataViewCommandBase.js +0 -6
- package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
- package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
- package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
- package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
- package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
- package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
- package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
- package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
- package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
- package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
- package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
- package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
- package/esm2015/src/data/DataView.js +0 -1692
- package/esm2015/src/data/DataviewManager.js +0 -31
- package/esm2015/src/data/DataviewManagerBase.js +0 -18
- package/esm2015/src/data/Field.js +0 -671
- package/esm2015/src/data/FieldBase.js +0 -9
- package/esm2015/src/data/TaskTransactionManager.js +0 -110
- package/esm2015/src/env/EnvVariablesTable.js +0 -408
- package/esm2015/src/env/Environment.js +0 -557
- package/esm2015/src/env/LanguageData.js +0 -229
- package/esm2015/src/event/Event.js +0 -1441
- package/esm2015/src/event/EventHandler.js +0 -786
- package/esm2015/src/event/EventsManager.js +0 -3106
- package/esm2015/src/exp/Expression.js +0 -209
- package/esm2015/src/exp/ExpressionEvaluator.js +0 -4440
- package/esm2015/src/exp/GlobalParamsTable.js +0 -84
- package/esm2015/src/exp/YesNoExp.js +0 -44
- package/esm2015/src/gui/FormsTable.js +0 -73
- package/esm2015/src/gui/MgControl.js +0 -424
- package/esm2015/src/gui/MgForm.js +0 -1291
- package/esm2015/src/http/HttpManager.js +0 -100
- package/esm2015/src/http/client/HttpClientAsync.js +0 -72
- package/esm2015/src/http/client/HttpClientBase.js +0 -147
- package/esm2015/src/http/client/HttpClientSync.js +0 -47
- package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
- package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -901
- package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
- package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
- package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
- package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
- package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
- package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
- package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
- package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
- package/esm2015/src/rt/Argument.js +0 -281
- package/esm2015/src/rt/ArgumentsList.js +0 -108
- package/esm2015/src/rt/Boundary.js +0 -161
- package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
- package/esm2015/src/rt/Operation.js +0 -772
- package/esm2015/src/rt/Recompute.js +0 -372
- package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
- package/esm2015/src/rt/TableCache.js +0 -182
- package/esm2015/src/rt/TableCacheManager.js +0 -70
- package/esm2015/src/tasks/MGData.js +0 -561
- package/esm2015/src/tasks/MGDataCollection.js +0 -270
- package/esm2015/src/tasks/Task.js +0 -2601
- package/esm2015/src/tasks/TaskServiceBase.js +0 -30
- package/esm2015/src/tasks/TasksTable.js +0 -87
- package/esm2015/src/util/FlowMonitorQueue.js +0 -364
- package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
- package/esm2015/src/util/PrmMap.js +0 -157
- package/fesm2015/magic-xpa-engine.js.map +0 -1
|
@@ -0,0 +1,745 @@
|
|
|
1
|
+
import { ApplicationException, Debug, Int32, NNumber, NString, Thread } from '@magic-xpa/mscorelib';
|
|
2
|
+
import { CallOsShow, Constants, Logger, StorageAttribute, StorageAttributeCheck, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
|
3
|
+
import { Commands, NUM_TYPE, PropInterface, Styles, TaskDefinitionIdTableSaxHandler, VectorType } from '@magic-xpa/gui';
|
|
4
|
+
import { YesNoExp } from '../exp/YesNoExp';
|
|
5
|
+
import { ArgumentsList } from './ArgumentsList';
|
|
6
|
+
import { RunTimeEvent } from '../event/RunTimeEvent';
|
|
7
|
+
import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
|
|
8
|
+
import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
|
|
9
|
+
import { ExecOperCommand } from '../commands/ClientToServer/ExecOperCommand';
|
|
10
|
+
import { ConstInterface } from '../ConstInterface';
|
|
11
|
+
import { FlowMonitorInterface } from '../FlowMonitorInterface';
|
|
12
|
+
import { LanguageData } from '../env/LanguageData';
|
|
13
|
+
import { LastFocusedManager } from './LastFocusedManager';
|
|
14
|
+
import { AccessHelper } from '../AccessHelper';
|
|
15
|
+
import { GUIManager } from "../GUIManager";
|
|
16
|
+
export class Operation {
|
|
17
|
+
constructor() {
|
|
18
|
+
this._condExp = new YesNoExp(true);
|
|
19
|
+
this._retainFocus = new YesNoExp(false);
|
|
20
|
+
this._waitExp = new YesNoExp(false);
|
|
21
|
+
this._syncData = new YesNoExp(false);
|
|
22
|
+
this._argList = null;
|
|
23
|
+
this._blockClose = 0;
|
|
24
|
+
this._blockEnd = 0;
|
|
25
|
+
this._buttons = '\0';
|
|
26
|
+
this._checkByServer = false;
|
|
27
|
+
this._cmdToServer = null;
|
|
28
|
+
this._display = 'S';
|
|
29
|
+
this._errLogAppend = false;
|
|
30
|
+
this._evtHandler = null;
|
|
31
|
+
this._execOnServer = false;
|
|
32
|
+
this._execOnClient = false;
|
|
33
|
+
this._exp = null;
|
|
34
|
+
this._field = null;
|
|
35
|
+
this._globalParamsShouldBeCopied = false;
|
|
36
|
+
this._image = '\0';
|
|
37
|
+
this._incremental = false;
|
|
38
|
+
this._methodNameSnippet = null;
|
|
39
|
+
this._mode = '\0';
|
|
40
|
+
this._prgDescription = null;
|
|
41
|
+
this._publicName = null;
|
|
42
|
+
this._returnVal = null;
|
|
43
|
+
this._rtEvt = null;
|
|
44
|
+
this._serverId = -1;
|
|
45
|
+
this.calledTaskDefinitionId = null;
|
|
46
|
+
this._show = CallOsShow.Normal;
|
|
47
|
+
this._subformCtrlName = null;
|
|
48
|
+
this._subtype = '\0';
|
|
49
|
+
this._task = null;
|
|
50
|
+
this._text = null;
|
|
51
|
+
this._title = null;
|
|
52
|
+
this._titleExp = null;
|
|
53
|
+
this._type = 0;
|
|
54
|
+
this._undo = true;
|
|
55
|
+
this._isRoute = false;
|
|
56
|
+
this._routerPath = null;
|
|
57
|
+
this._originalRouterOutletName = null;
|
|
58
|
+
this._routeParams = null;
|
|
59
|
+
this.OperCallMode = 0;
|
|
60
|
+
}
|
|
61
|
+
get CalledTaskDefinitionId() {
|
|
62
|
+
return this.calledTaskDefinitionId;
|
|
63
|
+
}
|
|
64
|
+
set Task(value) {
|
|
65
|
+
this._task = value;
|
|
66
|
+
}
|
|
67
|
+
get Task() {
|
|
68
|
+
return this._task;
|
|
69
|
+
}
|
|
70
|
+
async Immediate() {
|
|
71
|
+
return await this._waitExp.getVal();
|
|
72
|
+
}
|
|
73
|
+
fillData(taskRef, evtHandler, parser) {
|
|
74
|
+
this._task = taskRef;
|
|
75
|
+
this._evtHandler = evtHandler;
|
|
76
|
+
while (this.initInnerObjects(parser, parser.getNextTag(), taskRef)) {
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
initInnerObjects(parser, foundTagName, taskRef) {
|
|
80
|
+
if (foundTagName === null)
|
|
81
|
+
return false;
|
|
82
|
+
if (foundTagName === ConstInterface.MG_TAG_EVENT) {
|
|
83
|
+
this._rtEvt = new RunTimeEvent(taskRef);
|
|
84
|
+
this._rtEvt.fillData(parser, taskRef);
|
|
85
|
+
}
|
|
86
|
+
else if (foundTagName === ConstInterface.MG_TAG_OPER) {
|
|
87
|
+
this.fillAttributes(parser, taskRef);
|
|
88
|
+
}
|
|
89
|
+
else if (foundTagName === "/" + ConstInterface.MG_TAG_OPER) {
|
|
90
|
+
parser.setCurrIndex2EndOfTag();
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
else if (foundTagName === XMLConstants.MG_TAG_TASKDEFINITIONID_ENTRY) {
|
|
94
|
+
this.InitTaskDefinitionID(parser);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in Operation. Insert else if to Operation.initInnerObjects for " + foundTagName);
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
fillAttributes(parser, taskRef) {
|
|
103
|
+
let tokensVector;
|
|
104
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
|
105
|
+
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
|
106
|
+
let tag = parser.getXMLsubstring(endContext);
|
|
107
|
+
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_OPER) + ConstInterface.MG_TAG_OPER.length);
|
|
108
|
+
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
|
109
|
+
this.initElements(tokensVector, taskRef);
|
|
110
|
+
parser.setCurrIndex(endContext + XMLConstants.TAG_CLOSE.length);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Command.FillData() out of string bounds");
|
|
114
|
+
}
|
|
115
|
+
initElements(tokensVector, taskRef) {
|
|
116
|
+
let attribute, valueStr;
|
|
117
|
+
let expId;
|
|
118
|
+
let isGuiThreadExecution = false;
|
|
119
|
+
for (let j = 0; j < tokensVector.length; j += 2) {
|
|
120
|
+
attribute = (tokensVector.get_Item(j));
|
|
121
|
+
valueStr = (tokensVector.get_Item(j + 1));
|
|
122
|
+
switch (attribute) {
|
|
123
|
+
case XMLConstants.MG_ATTR_TYPE:
|
|
124
|
+
this._type = XmlParser.getInt(valueStr);
|
|
125
|
+
break;
|
|
126
|
+
case ConstInterface.MG_ATTR_FLD:
|
|
127
|
+
this._field = Operation.InitField(valueStr, this._task);
|
|
128
|
+
break;
|
|
129
|
+
case XMLConstants.MG_ATTR_EXP:
|
|
130
|
+
expId = XmlParser.getInt(valueStr);
|
|
131
|
+
this._exp = taskRef.getExpById(expId);
|
|
132
|
+
break;
|
|
133
|
+
case ConstInterface.MG_ATTR_TEXT:
|
|
134
|
+
this._text = XmlParser.unescape(valueStr);
|
|
135
|
+
break;
|
|
136
|
+
case ConstInterface.MG_ATTR_MODE:
|
|
137
|
+
this._mode = valueStr[0];
|
|
138
|
+
break;
|
|
139
|
+
case ConstInterface.MG_ATTR_SUBTYPE:
|
|
140
|
+
this._subtype = valueStr[0];
|
|
141
|
+
if (this._type === ConstInterface.MG_OPER_BLOCK) {
|
|
142
|
+
if (this._subtype === 'E')
|
|
143
|
+
this._type = ConstInterface.MG_OPER_ELSE;
|
|
144
|
+
else if (this._subtype === 'L')
|
|
145
|
+
this._type = ConstInterface.MG_OPER_LOOP;
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case ConstInterface.MG_ATTR_CLOSE:
|
|
149
|
+
this._blockClose = XmlParser.getInt(valueStr);
|
|
150
|
+
break;
|
|
151
|
+
case ConstInterface.MG_ATTR_END:
|
|
152
|
+
this._blockEnd = XmlParser.getInt(valueStr);
|
|
153
|
+
break;
|
|
154
|
+
case ConstInterface.MG_ATTR_HOW:
|
|
155
|
+
this._incremental = (valueStr === "I");
|
|
156
|
+
break;
|
|
157
|
+
case ConstInterface.MG_ATTR_UNDO:
|
|
158
|
+
if (valueStr[0] === 'N')
|
|
159
|
+
this._undo = false;
|
|
160
|
+
else if (valueStr[0] === 'Y')
|
|
161
|
+
this._undo = true;
|
|
162
|
+
else
|
|
163
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Operation.initElements(): No such value to the MG_ATTR_UNDO for " + valueStr);
|
|
164
|
+
break;
|
|
165
|
+
case ConstInterface.MG_ATTR_DISPLAY:
|
|
166
|
+
this._display = valueStr[0];
|
|
167
|
+
break;
|
|
168
|
+
case ConstInterface.MG_ATTR_WAIT:
|
|
169
|
+
this._waitExp.setVal(taskRef, valueStr);
|
|
170
|
+
break;
|
|
171
|
+
case ConstInterface.MG_ATTR_RETAIN_FOCUS:
|
|
172
|
+
this._retainFocus.setVal(taskRef, valueStr);
|
|
173
|
+
break;
|
|
174
|
+
case ConstInterface.MG_ATTR_SYNC_DATA:
|
|
175
|
+
this._syncData.setVal(taskRef, valueStr);
|
|
176
|
+
break;
|
|
177
|
+
case ConstInterface.MG_ATTR_SHOW:
|
|
178
|
+
this._show = XmlParser.getInt(valueStr);
|
|
179
|
+
break;
|
|
180
|
+
case ConstInterface.MG_ATTR_CND:
|
|
181
|
+
this._condExp.setVal(taskRef, valueStr);
|
|
182
|
+
break;
|
|
183
|
+
case ConstInterface.MG_ATTR_ARGLIST:
|
|
184
|
+
this._argList = new ArgumentsList();
|
|
185
|
+
this._argList.fillList(valueStr, this._task);
|
|
186
|
+
break;
|
|
187
|
+
case ConstInterface.MG_ATTR_REFRESHON:
|
|
188
|
+
this._argList.RefreshOnString = valueStr.Trim();
|
|
189
|
+
break;
|
|
190
|
+
case ConstInterface.MG_ATTR_SERVER_ID:
|
|
191
|
+
this._serverId = XmlParser.getInt(valueStr);
|
|
192
|
+
break;
|
|
193
|
+
case ConstInterface.MG_ATTR_OPER_CALLMODE:
|
|
194
|
+
this.OperCallMode = valueStr[0];
|
|
195
|
+
break;
|
|
196
|
+
case ConstInterface.MG_ATTR_SUBFORM_CTRL:
|
|
197
|
+
this._subformCtrlName = XmlParser.unescape(valueStr);
|
|
198
|
+
break;
|
|
199
|
+
case ConstInterface.MG_ATTR_CHECK_BY_SERVER:
|
|
200
|
+
this._checkByServer = XmlParser.getBoolean(valueStr);
|
|
201
|
+
break;
|
|
202
|
+
case ConstInterface.MG_ATTR_PUBLIC:
|
|
203
|
+
this._publicName = valueStr;
|
|
204
|
+
break;
|
|
205
|
+
case ConstInterface.MG_ATTR_PRG_DESCRIPTION:
|
|
206
|
+
this._prgDescription = valueStr;
|
|
207
|
+
break;
|
|
208
|
+
case ConstInterface.MG_ATTR_CPY_GLB_PRMS:
|
|
209
|
+
this._globalParamsShouldBeCopied = XmlParser.getBoolean(valueStr);
|
|
210
|
+
break;
|
|
211
|
+
case ConstInterface.MG_ATTR_EXEC_ON_SERVER:
|
|
212
|
+
this._execOnServer = XmlParser.getBoolean(valueStr);
|
|
213
|
+
break;
|
|
214
|
+
case ConstInterface.MG_ATTR_EXEC_ON_CLIENT:
|
|
215
|
+
this._execOnClient = XmlParser.getBoolean(valueStr);
|
|
216
|
+
break;
|
|
217
|
+
case ConstInterface.MG_ATTR_TITLE:
|
|
218
|
+
this._title = XmlParser.unescape(valueStr);
|
|
219
|
+
break;
|
|
220
|
+
case ConstInterface.MG_ATTR_TITLE_EXP:
|
|
221
|
+
expId = XmlParser.getInt(valueStr);
|
|
222
|
+
this._titleExp = taskRef.getExpById(expId);
|
|
223
|
+
break;
|
|
224
|
+
case ConstInterface.MG_ATTR_IMAGE:
|
|
225
|
+
this._image = valueStr[0];
|
|
226
|
+
break;
|
|
227
|
+
case ConstInterface.MG_ATTR_BUTTONS:
|
|
228
|
+
this._buttons = valueStr[0];
|
|
229
|
+
break;
|
|
230
|
+
case ConstInterface.MG_ATTR_RETURN_VAL:
|
|
231
|
+
this._returnVal = Operation.InitField(valueStr, this._task);
|
|
232
|
+
break;
|
|
233
|
+
case ConstInterface.MG_ATTR_ERR_LOG_APPEND:
|
|
234
|
+
this._errLogAppend = XmlParser.getBoolean(valueStr);
|
|
235
|
+
break;
|
|
236
|
+
case ConstInterface.MG_ATTR_OPER_METHODNAME:
|
|
237
|
+
this._methodNameSnippet = valueStr;
|
|
238
|
+
break;
|
|
239
|
+
case ConstInterface.MG_ATTR_IS_GUI_THREAD_EXECUTION:
|
|
240
|
+
isGuiThreadExecution = XmlParser.getBoolean(valueStr);
|
|
241
|
+
break;
|
|
242
|
+
case ConstInterface.MG_ATTR_IS_ROUTE:
|
|
243
|
+
this._isRoute = XmlParser.getBoolean(valueStr);
|
|
244
|
+
break;
|
|
245
|
+
case XMLConstants.MG_ATTR_ROUTER_PATH:
|
|
246
|
+
this._routerPath = XmlParser.unescape(valueStr);
|
|
247
|
+
break;
|
|
248
|
+
default:
|
|
249
|
+
Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in Operation class. Insert case to Operation.initElements for " + attribute);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (this._serverId > -1)
|
|
254
|
+
this._cmdToServer = CommandFactory.CreateExecOperCommand(this._task.getTaskTag(), "" + this._evtHandler.getId(), this._serverId, Int32.MinValue, null);
|
|
255
|
+
if (this._isRoute) {
|
|
256
|
+
this._originalRouterOutletName = this._subformCtrlName !== null ? this._subformCtrlName : "";
|
|
257
|
+
if (this._subformCtrlName == null) {
|
|
258
|
+
let defaultRouterOutlet = this._task.getForm().DefaultRouterOutlet;
|
|
259
|
+
this._subformCtrlName = defaultRouterOutlet !== null ? defaultRouterOutlet.Name : "";
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
InitTaskDefinitionID(parser) {
|
|
264
|
+
let xmlBuffer = parser.ReadToEndOfCurrentElement();
|
|
265
|
+
let taskDefinitionIdTableSaxHandler = new TaskDefinitionIdTableSaxHandler(this.SetTaskDefinitionId);
|
|
266
|
+
taskDefinitionIdTableSaxHandler.parse(xmlBuffer);
|
|
267
|
+
}
|
|
268
|
+
SetTaskDefinitionId(taskDefinitionId) {
|
|
269
|
+
this.calledTaskDefinitionId = taskDefinitionId;
|
|
270
|
+
}
|
|
271
|
+
static InitField(valueStr, task) {
|
|
272
|
+
let TaskField = XmlParser.getTokens(valueStr, ',');
|
|
273
|
+
if (TaskField.length === 2) {
|
|
274
|
+
let parent = NNumber.Parse(TaskField.get_Item(0));
|
|
275
|
+
let fldID = NNumber.Parse(TaskField.get_Item(1));
|
|
276
|
+
let field = task.getFieldDef(parent, fldID);
|
|
277
|
+
return field;
|
|
278
|
+
}
|
|
279
|
+
Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unknown field: '{0}'", valueStr));
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
async execute(returnedFromServer) {
|
|
283
|
+
let lastRtEvent = AccessHelper.eventsManager.getLastRtEvent();
|
|
284
|
+
let mprgCreator = null;
|
|
285
|
+
let flowMonitor = FlowMonitorQueue.Instance;
|
|
286
|
+
if (lastRtEvent !== null)
|
|
287
|
+
mprgCreator = lastRtEvent.getMainPrgCreator();
|
|
288
|
+
if (returnedFromServer ||
|
|
289
|
+
(!returnedFromServer && (this._type !== ConstInterface.MG_OPER_SERVER || !this._condExp.isServerExp()))) {
|
|
290
|
+
if (!await this.canExecute()) {
|
|
291
|
+
if (this._type !== ConstInterface.MG_OPER_LOOP)
|
|
292
|
+
await flowMonitor.addFlowFieldOperation(this, false, this._task.GetTaskDetails());
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (this._type !== ConstInterface.MG_OPER_LOOP && this._type !== ConstInterface.MG_OPER_ENDBLOCK)
|
|
297
|
+
await flowMonitor.addFlowFieldOperation(this, true, this._task.GetTaskDetails());
|
|
298
|
+
try {
|
|
299
|
+
switch (this._type) {
|
|
300
|
+
case ConstInterface.MG_OPER_VERIFY:
|
|
301
|
+
return await this.operVerify();
|
|
302
|
+
case ConstInterface.MG_OPER_BLOCK:
|
|
303
|
+
return this.operBlock();
|
|
304
|
+
case ConstInterface.MG_OPER_LOOP:
|
|
305
|
+
if (!this.getExecOnServer())
|
|
306
|
+
return this.operBlock();
|
|
307
|
+
else {
|
|
308
|
+
await this.operServer(mprgCreator);
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
case ConstInterface.MG_OPER_ELSE:
|
|
312
|
+
return this.operElse();
|
|
313
|
+
case ConstInterface.MG_OPER_EVALUATE:
|
|
314
|
+
await this.operEvaluate();
|
|
315
|
+
break;
|
|
316
|
+
case ConstInterface.MG_OPER_UPDATE:
|
|
317
|
+
await this.operUpdate(mprgCreator);
|
|
318
|
+
break;
|
|
319
|
+
case ConstInterface.MG_OPER_RAISE_EVENT:
|
|
320
|
+
await this.operRaiseEvent(mprgCreator, returnedFromServer);
|
|
321
|
+
break;
|
|
322
|
+
case ConstInterface.MG_OPER_SERVER:
|
|
323
|
+
await this.operServer(mprgCreator);
|
|
324
|
+
break;
|
|
325
|
+
case ConstInterface.MG_OPER_CALL:
|
|
326
|
+
if (this._publicName != null) {
|
|
327
|
+
this.operCallParallel();
|
|
328
|
+
}
|
|
329
|
+
else if (this._subformCtrlName == null)
|
|
330
|
+
await this.operCall(mprgCreator);
|
|
331
|
+
else {
|
|
332
|
+
let subformTask;
|
|
333
|
+
let isEndProg = true;
|
|
334
|
+
if (this._checkByServer) {
|
|
335
|
+
if (!(this._cmdToServer instanceof ExecOperCommand))
|
|
336
|
+
Debug.Assert(false);
|
|
337
|
+
let command = this._cmdToServer;
|
|
338
|
+
command.CheckOnly = true;
|
|
339
|
+
await this.operCall(mprgCreator);
|
|
340
|
+
command.CheckOnly = false;
|
|
341
|
+
if (AccessHelper.eventsManager.getNextOperIdx(this, true) > -1)
|
|
342
|
+
isEndProg = false;
|
|
343
|
+
}
|
|
344
|
+
if (isEndProg) {
|
|
345
|
+
let destSubForm = this._task.getForm().getSubFormCtrlByName(this._subformCtrlName);
|
|
346
|
+
if (this._isRoute && (destSubForm === null || !destSubForm.IsRouterOutlet()))
|
|
347
|
+
return false;
|
|
348
|
+
if (destSubForm != null) {
|
|
349
|
+
if (this._isRoute) {
|
|
350
|
+
let canRoute = false;
|
|
351
|
+
let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
|
|
352
|
+
if (rtEvnt !== null) {
|
|
353
|
+
this._routeParams = rtEvnt.getRouteParamList();
|
|
354
|
+
if ((await rtEvnt.getArgList().getArg(0).getValue(StorageAttribute.ALPHA, 0)).trim() === this._routerPath &&
|
|
355
|
+
((rtEvnt.getArgList().getArg(1).skipArg()) ||
|
|
356
|
+
(await rtEvnt.getArgList().getArg(1).getValue(StorageAttribute.ALPHA, 0)).trim() === this._originalRouterOutletName))
|
|
357
|
+
canRoute = true;
|
|
358
|
+
if (!canRoute)
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
subformTask = destSubForm.getSubformTask();
|
|
363
|
+
if (subformTask != null) {
|
|
364
|
+
let terminateTaskGracefully = true;
|
|
365
|
+
let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
|
|
366
|
+
if (this._isRoute && rtEvnt !== null && rtEvnt.isGuiTriggeredEvent()) {
|
|
367
|
+
terminateTaskGracefully = false;
|
|
368
|
+
AccessHelper.eventsManager.setStopExecution(true);
|
|
369
|
+
}
|
|
370
|
+
if (await subformTask.endTask(true, false, !terminateTaskGracefully, true)) {
|
|
371
|
+
let parentTask = destSubForm.getForm().getTask();
|
|
372
|
+
parentTask.TaskService.RemoveRecomputes(parentTask);
|
|
373
|
+
}
|
|
374
|
+
else
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
if (LastFocusedManager.getLastFocusedControl() != null &&
|
|
378
|
+
LastFocusedManager.getLastFocusedControl().isDescendentOfControl(destSubForm))
|
|
379
|
+
this._task.RetainFocus = false;
|
|
380
|
+
else
|
|
381
|
+
this._task.RetainFocus = await this._retainFocus.getVal();
|
|
382
|
+
}
|
|
383
|
+
await this.operCall(mprgCreator);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return this._isRoute;
|
|
387
|
+
default:
|
|
388
|
+
Logger.Instance.WriteExceptionToLogWithMsg("There is no such type of operation " + this._type);
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
catch (ex) {
|
|
393
|
+
throw ex;
|
|
394
|
+
}
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
operCallParallel() {
|
|
398
|
+
Operation.callParallel();
|
|
399
|
+
}
|
|
400
|
+
static callParallel() {
|
|
401
|
+
}
|
|
402
|
+
async getCondVal() {
|
|
403
|
+
return await this._condExp.getVal();
|
|
404
|
+
}
|
|
405
|
+
getType() {
|
|
406
|
+
return this._type;
|
|
407
|
+
}
|
|
408
|
+
getRouteParams() {
|
|
409
|
+
return this._routeParams;
|
|
410
|
+
}
|
|
411
|
+
getServerId() {
|
|
412
|
+
return this._serverId;
|
|
413
|
+
}
|
|
414
|
+
async operVerify() {
|
|
415
|
+
let isError = (this._mode === ConstInterface.FLW_VERIFY_MODE_ERROR);
|
|
416
|
+
let textToDisplay = this._exp === null ? this._text : await this._exp.evaluateWithResultTypeAndLength(StorageAttribute.UNICODE, 255);
|
|
417
|
+
let titleToDisplay = this._titleExp === null ? this._title : await this._titleExp.evaluateWithResultTypeAndLength(StorageAttribute.UNICODE, 255);
|
|
418
|
+
textToDisplay = textToDisplay === null ? "" : StrUtil.rtrim(textToDisplay);
|
|
419
|
+
titleToDisplay = titleToDisplay === null ? "" : StrUtil.rtrim(titleToDisplay);
|
|
420
|
+
if (this._errLogAppend) {
|
|
421
|
+
let prgDescription = this._task.GetContextTask().GetComputedProperty(PropInterface.PROP_TYPE_NAME).GetComputedValue();
|
|
422
|
+
Logger.Instance.WriteExceptionToLogWithMsg(textToDisplay + ", program : " + prgDescription);
|
|
423
|
+
}
|
|
424
|
+
if (this._display === ConstInterface.DISPLAY_STATUS) {
|
|
425
|
+
if (!NString.IsNullOrEmpty(textToDisplay)) {
|
|
426
|
+
FlowMonitorQueue.Instance.addFlowVerifyInfo(textToDisplay, this._task.GetTaskDetails());
|
|
427
|
+
this._task.GetContextTask().WriteToMessagePane(textToDisplay);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
if (!NString.IsNullOrEmpty(textToDisplay)) {
|
|
432
|
+
let mlsTransTextToDisplay = LanguageData.Instance.translate(textToDisplay);
|
|
433
|
+
let mlsTransTitleToDisplay = LanguageData.Instance.translate(titleToDisplay);
|
|
434
|
+
let verifyMode = Operation.getButtons(this._buttons);
|
|
435
|
+
verifyMode = verifyMode || Operation.getImage(this._image);
|
|
436
|
+
verifyMode = verifyMode;
|
|
437
|
+
if (UtilStrByteMode.isLocaleDefLangJPN()) {
|
|
438
|
+
let delimPos = mlsTransTextToDisplay.indexOf('|');
|
|
439
|
+
if (0 <= delimPos && delimPos < mlsTransTextToDisplay.length) {
|
|
440
|
+
mlsTransTitleToDisplay = mlsTransTextToDisplay.substr(delimPos + 1);
|
|
441
|
+
mlsTransTextToDisplay = mlsTransTextToDisplay.substr(0, delimPos);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
let mgForm = null;
|
|
445
|
+
if (!this._task.GetContextTask().getMGData().IsAborting)
|
|
446
|
+
mgForm = this._task.GetContextTask().getTopMostForm();
|
|
447
|
+
if (mgForm == null && LastFocusedManager.Instance.getLastFocusedTask() != null)
|
|
448
|
+
mgForm = LastFocusedManager.Instance.getLastFocusedTask().getTopMostForm();
|
|
449
|
+
if (mgForm != null) {
|
|
450
|
+
mgForm.RefreshUI();
|
|
451
|
+
Commands.invoke();
|
|
452
|
+
await Thread.Sleep(10);
|
|
453
|
+
}
|
|
454
|
+
let returnValue = await GUIManager.Instance.MessageBox(mlsTransTitleToDisplay, mlsTransTextToDisplay, verifyMode);
|
|
455
|
+
await Operation.setoperVerifyReturnValue(returnValue, this._returnVal);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return isError;
|
|
459
|
+
}
|
|
460
|
+
static getButtons(buttonsID) {
|
|
461
|
+
let tmpbuttons = 0;
|
|
462
|
+
switch (buttonsID) {
|
|
463
|
+
case ConstInterface.BUTTONS_OK:
|
|
464
|
+
tmpbuttons = Styles.MSGBOX_BUTTON_OK;
|
|
465
|
+
break;
|
|
466
|
+
case ConstInterface.BUTTONS_OK_CANCEL:
|
|
467
|
+
tmpbuttons = Styles.MSGBOX_BUTTON_OK_CANCEL;
|
|
468
|
+
break;
|
|
469
|
+
case ConstInterface.BUTTONS_ABORT_RETRY_IGNORE:
|
|
470
|
+
tmpbuttons = Styles.MSGBOX_BUTTON_ABORT_RETRY_IGNORE;
|
|
471
|
+
break;
|
|
472
|
+
case ConstInterface.BUTTONS_YES_NO_CANCEL:
|
|
473
|
+
tmpbuttons = Styles.MSGBOX_BUTTON_YES_NO_CANCEL;
|
|
474
|
+
break;
|
|
475
|
+
case ConstInterface.BUTTONS_YES_NO:
|
|
476
|
+
tmpbuttons = Styles.MSGBOX_BUTTON_YES_NO;
|
|
477
|
+
break;
|
|
478
|
+
case ConstInterface.BUTTONS_RETRY_CANCEL:
|
|
479
|
+
tmpbuttons = Styles.MSGBOX_BUTTON_RETRY_CANCEL;
|
|
480
|
+
break;
|
|
481
|
+
default:
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
return tmpbuttons;
|
|
485
|
+
}
|
|
486
|
+
static getImage(imageID) {
|
|
487
|
+
let tmpImage = 0;
|
|
488
|
+
switch (imageID) {
|
|
489
|
+
case ConstInterface.IMAGE_EXCLAMATION:
|
|
490
|
+
tmpImage = Styles.MSGBOX_ICON_EXCLAMATION;
|
|
491
|
+
break;
|
|
492
|
+
case ConstInterface.IMAGE_CRITICAL:
|
|
493
|
+
tmpImage = Styles.MSGBOX_ICON_ERROR;
|
|
494
|
+
break;
|
|
495
|
+
case ConstInterface.IMAGE_QUESTION:
|
|
496
|
+
tmpImage = Styles.MSGBOX_ICON_QUESTION;
|
|
497
|
+
break;
|
|
498
|
+
case ConstInterface.IMAGE_INFORMATION:
|
|
499
|
+
tmpImage = Styles.MSGBOX_ICON_INFORMATION;
|
|
500
|
+
break;
|
|
501
|
+
default:
|
|
502
|
+
break;
|
|
503
|
+
}
|
|
504
|
+
return tmpImage;
|
|
505
|
+
}
|
|
506
|
+
static async setoperVerifyReturnValue(returnValue, returnVal) {
|
|
507
|
+
if (returnVal !== null) {
|
|
508
|
+
let retValueNum = new NUM_TYPE();
|
|
509
|
+
retValueNum.NUM_4_LONG(returnValue);
|
|
510
|
+
let returnValueStr = retValueNum.toXMLrecord();
|
|
511
|
+
await returnVal.setValueAndStartRecompute(returnValueStr, false, true, true, false);
|
|
512
|
+
await returnVal.updateDisplay();
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
operBlock() {
|
|
516
|
+
return true;
|
|
517
|
+
}
|
|
518
|
+
operElse() {
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
async operEvaluate() {
|
|
522
|
+
let result = '\0';
|
|
523
|
+
if (this._field !== null) {
|
|
524
|
+
result = await this._exp.evaluateWithResultTypeAndLength(this._field.getType(), this._field.getSize());
|
|
525
|
+
await this._field.setValueAndStartRecompute(result, result === null, true, true, false);
|
|
526
|
+
await this._field.updateDisplay();
|
|
527
|
+
}
|
|
528
|
+
else
|
|
529
|
+
result = await this._exp.evaluateWithResultTypeAndLength(StorageAttribute.BOOLEAN, 0);
|
|
530
|
+
}
|
|
531
|
+
async operUpdate(mprgCreator) {
|
|
532
|
+
let result, oldVal, newVal, fieldVal;
|
|
533
|
+
let setRecordUpdated;
|
|
534
|
+
let recompute;
|
|
535
|
+
let nOld, nNew, nResult;
|
|
536
|
+
let flowMonitor = FlowMonitorQueue.Instance;
|
|
537
|
+
flowMonitor.addFlowOperationUpdate(FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
|
|
538
|
+
if (!this._field.DbModifiable && (this._task.getMode() !== Constants.TASK_MODE_CREATE)) {
|
|
539
|
+
if (!await this.CanModify(mprgCreator))
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
let fieldType = this._field.getType();
|
|
543
|
+
if (this._incremental) {
|
|
544
|
+
if (!this._field.IsLinkField) {
|
|
545
|
+
fieldVal = this._field.getValue(true);
|
|
546
|
+
nResult = (fieldVal != null
|
|
547
|
+
? new NUM_TYPE(fieldVal)
|
|
548
|
+
: null);
|
|
549
|
+
if (this._task.getMode() !== Constants.TASK_MODE_CREATE) {
|
|
550
|
+
this._task.setEvalOldValues(true);
|
|
551
|
+
oldVal = (this._field.isNull()
|
|
552
|
+
? this._field.getMagicDefaultValue()
|
|
553
|
+
: await this._exp.evaluateWithResultTypeAndLength(fieldType, this._field.getSize()));
|
|
554
|
+
this._task.setEvalOldValues(false);
|
|
555
|
+
nOld = new NUM_TYPE(oldVal);
|
|
556
|
+
nResult = NUM_TYPE.sub(nResult, nOld);
|
|
557
|
+
}
|
|
558
|
+
if (this._task.getMode() !== Constants.TASK_MODE_DELETE) {
|
|
559
|
+
newVal = await this._exp.evaluateWithResultTypeAndLength(fieldType, this._field.getSize());
|
|
560
|
+
if (newVal != null) {
|
|
561
|
+
nNew = new NUM_TYPE(newVal);
|
|
562
|
+
nResult = NUM_TYPE.add(nResult, nNew);
|
|
563
|
+
}
|
|
564
|
+
else
|
|
565
|
+
nNew = nResult = null;
|
|
566
|
+
}
|
|
567
|
+
if (nResult != null)
|
|
568
|
+
result = nResult.toXMLrecord();
|
|
569
|
+
else
|
|
570
|
+
result = this._field.getMagicDefaultValue();
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
await this.operServer(mprgCreator);
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
else
|
|
578
|
+
result = await this._exp.evaluateWithResultTypeAndLength(fieldType, this._field.getSize());
|
|
579
|
+
if (fieldType === StorageAttribute.BLOB_VECTOR)
|
|
580
|
+
if (result != null)
|
|
581
|
+
result = Operation.operUpdateVectors(this._field, result);
|
|
582
|
+
recompute = (this._field.getTask() === this._task);
|
|
583
|
+
setRecordUpdated = (!recompute || !this._undo);
|
|
584
|
+
await this._field.setValueAndStartRecompute(result, result == null, true, setRecordUpdated, false);
|
|
585
|
+
if (!this._undo)
|
|
586
|
+
this._field.setUpdated();
|
|
587
|
+
this._field.setModified();
|
|
588
|
+
await this._field.updateDisplay();
|
|
589
|
+
flowMonitor.addFlowOperationUpdate(FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
|
|
590
|
+
}
|
|
591
|
+
async CanModify(mprgCreator) {
|
|
592
|
+
let execOperCommand = ((this._cmdToServer instanceof ExecOperCommand) ? this._cmdToServer : null);
|
|
593
|
+
execOperCommand.Operation = this;
|
|
594
|
+
execOperCommand.MprgCreator = mprgCreator;
|
|
595
|
+
return (await this.Task.DataviewManager.Execute(this._cmdToServer)).Success;
|
|
596
|
+
}
|
|
597
|
+
static operUpdateVectors(field, vec) {
|
|
598
|
+
let result = null;
|
|
599
|
+
if (field.getType() === StorageAttribute.BLOB_VECTOR) {
|
|
600
|
+
let cellsAttr = VectorType.getCellsAttr(vec);
|
|
601
|
+
let cellsType = field.getCellsType();
|
|
602
|
+
if (StorageAttributeCheck.isTheSameType(cellsAttr, cellsType)) {
|
|
603
|
+
let newVec = new VectorType(vec);
|
|
604
|
+
newVec.adjustToFit(field);
|
|
605
|
+
return newVec.toString();
|
|
606
|
+
}
|
|
607
|
+
return result;
|
|
608
|
+
}
|
|
609
|
+
throw new ApplicationException("in operUpdateVectors " + field.getName() + " is not of type vector");
|
|
610
|
+
}
|
|
611
|
+
async operRaiseEvent(mprgCreator, returnedFromServer) {
|
|
612
|
+
let immediate = await this.Immediate();
|
|
613
|
+
let aRtEvt = this._rtEvt.replicate();
|
|
614
|
+
await aRtEvt.setPublicName();
|
|
615
|
+
aRtEvt.setImmediate(immediate);
|
|
616
|
+
aRtEvt.setMainPrgCreator(null);
|
|
617
|
+
if (immediate) {
|
|
618
|
+
aRtEvt.setCtrl(this._task.getLastParkedCtrl());
|
|
619
|
+
aRtEvt.setArgList(this._argList);
|
|
620
|
+
if (aRtEvt.getTask().isMainProg())
|
|
621
|
+
aRtEvt.setMainPrgCreator(mprgCreator);
|
|
622
|
+
AccessHelper.eventsManager.checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt);
|
|
623
|
+
AccessHelper.eventsManager.pushExecStack(this._task.getTaskTag(), this._evtHandler.getId().toString(), this._serverId);
|
|
624
|
+
await AccessHelper.eventsManager.handleEvent(aRtEvt, returnedFromServer);
|
|
625
|
+
AccessHelper.eventsManager.popExecStack();
|
|
626
|
+
}
|
|
627
|
+
else {
|
|
628
|
+
let arglist = new ArgumentsList();
|
|
629
|
+
await arglist.Initialize(this._argList);
|
|
630
|
+
aRtEvt.setArgList(arglist);
|
|
631
|
+
aRtEvt.setTask(null);
|
|
632
|
+
AccessHelper.eventsManager.addToTail(aRtEvt);
|
|
633
|
+
AccessHelper.eventsManager.checkAndSaveRouteEventIfCtxRemovedFromSrvr(aRtEvt);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
async operCall(mprgCreator) {
|
|
637
|
+
await this.operServer(mprgCreator);
|
|
638
|
+
}
|
|
639
|
+
async operServer(mprgCreator) {
|
|
640
|
+
let command = ((this._cmdToServer instanceof ExecOperCommand) ? this._cmdToServer : null);
|
|
641
|
+
Debug.Assert(command !== null);
|
|
642
|
+
if (this._task.isMainProg())
|
|
643
|
+
command.MprgCreator = mprgCreator;
|
|
644
|
+
else
|
|
645
|
+
command.MprgCreator = null;
|
|
646
|
+
command.SetExecutionStack(AccessHelper.eventsManager.getExecStack());
|
|
647
|
+
command.Operation = this;
|
|
648
|
+
await AccessHelper.mgDataTable.execRequestWithSubformRecordCycle(this._task.getMGData().CmdsToServer, this._cmdToServer, null);
|
|
649
|
+
}
|
|
650
|
+
getBlockEnd() {
|
|
651
|
+
return this._blockEnd;
|
|
652
|
+
}
|
|
653
|
+
setBlockEnd(val) {
|
|
654
|
+
this._blockEnd = val;
|
|
655
|
+
}
|
|
656
|
+
getBlockClose() {
|
|
657
|
+
return this._blockClose;
|
|
658
|
+
}
|
|
659
|
+
setBlockClose(val) {
|
|
660
|
+
this._blockClose = val;
|
|
661
|
+
}
|
|
662
|
+
getTaskTag() {
|
|
663
|
+
return this._task.getTaskTag();
|
|
664
|
+
}
|
|
665
|
+
getHandlerId() {
|
|
666
|
+
return this._evtHandler.getId().toString();
|
|
667
|
+
}
|
|
668
|
+
getEventHandler() {
|
|
669
|
+
return this._evtHandler;
|
|
670
|
+
}
|
|
671
|
+
getExecOnServer() {
|
|
672
|
+
return this._execOnServer;
|
|
673
|
+
}
|
|
674
|
+
setExecOnServer(val) {
|
|
675
|
+
this._execOnServer = val;
|
|
676
|
+
}
|
|
677
|
+
getExecOnClient() {
|
|
678
|
+
return this._execOnClient;
|
|
679
|
+
}
|
|
680
|
+
async canExecute() {
|
|
681
|
+
return await this.getCondVal();
|
|
682
|
+
}
|
|
683
|
+
async AddFlowDescription(buffer) {
|
|
684
|
+
switch (this._type) {
|
|
685
|
+
case ConstInterface.MG_OPER_VERIFY:
|
|
686
|
+
buffer.Append("Verify: ");
|
|
687
|
+
if (this._exp == null)
|
|
688
|
+
buffer.Append(this._text);
|
|
689
|
+
else
|
|
690
|
+
buffer.Append("Exp #").Append(this._exp.getId());
|
|
691
|
+
break;
|
|
692
|
+
case ConstInterface.MG_OPER_BLOCK:
|
|
693
|
+
buffer.Append("Block If");
|
|
694
|
+
break;
|
|
695
|
+
case ConstInterface.MG_OPER_LOOP:
|
|
696
|
+
buffer.Append("Block Loop");
|
|
697
|
+
break;
|
|
698
|
+
case ConstInterface.MG_OPER_ELSE:
|
|
699
|
+
buffer.Append("Block Else");
|
|
700
|
+
break;
|
|
701
|
+
case ConstInterface.MG_OPER_EVALUATE:
|
|
702
|
+
buffer.Append("Evaluate Exp #").Append(this._exp.getId());
|
|
703
|
+
break;
|
|
704
|
+
case ConstInterface.MG_OPER_UPDATE:
|
|
705
|
+
buffer.AppendFormat("Update {0} with Exp #{1}", this._field.getVarName(), this._exp.getId());
|
|
706
|
+
break;
|
|
707
|
+
case ConstInterface.MG_OPER_ENDBLOCK:
|
|
708
|
+
buffer.Append("End Block");
|
|
709
|
+
break;
|
|
710
|
+
case ConstInterface.MG_OPER_USR_EXIT:
|
|
711
|
+
buffer.Append("Invoke OS");
|
|
712
|
+
break;
|
|
713
|
+
case ConstInterface.MG_OPER_RAISE_EVENT:
|
|
714
|
+
buffer.Append("Raise Event:");
|
|
715
|
+
this._rtEvt.AppendDescription(buffer);
|
|
716
|
+
buffer.AppendFormat(" (Wait={0})", (await this.Immediate() ? 'Y' : 'N'));
|
|
717
|
+
break;
|
|
718
|
+
case ConstInterface.MG_OPER_SERVER:
|
|
719
|
+
buffer.Append("Run server-side operation");
|
|
720
|
+
break;
|
|
721
|
+
case ConstInterface.MG_OPER_CALL:
|
|
722
|
+
buffer.Append("Call program");
|
|
723
|
+
break;
|
|
724
|
+
default:
|
|
725
|
+
buffer.AppendFormat("<<Unknown Operation Code {0}>>", this._type);
|
|
726
|
+
break;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
GetArgList() {
|
|
730
|
+
return this._argList;
|
|
731
|
+
}
|
|
732
|
+
GetReturnValueField() {
|
|
733
|
+
return this._field;
|
|
734
|
+
}
|
|
735
|
+
GetSubformControlName() {
|
|
736
|
+
return this._subformCtrlName;
|
|
737
|
+
}
|
|
738
|
+
toString() {
|
|
739
|
+
return NString.Format("Executing operation number {0}", this._serverId + 1);
|
|
740
|
+
}
|
|
741
|
+
GetRuntimeEvent() {
|
|
742
|
+
return this._rtEvt;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ydC9PcGVyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQVEsT0FBTyxFQUFFLE9BQU8sRUFBaUIsTUFBTSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFdkgsT0FBTyxFQUVMLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUNMLFFBQVEsRUFFUixRQUFRLEVBQ1IsYUFBYSxFQUNiLE1BQU0sRUFFTiwrQkFBK0IsRUFDL0IsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUs5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUUzRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FB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QkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxNQUFNO1lBQ1IsS0FBSyxjQUFjLENBQUMsY0FBYztnQkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNO1lBQ1IsS0FBSyxjQUFjLENBQUMsWUFBWTtnQkFDOUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDOUIsTUFBTTtZQUNSO2dCQUNFLE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRSxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBTUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBTUQsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBTUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGdDQUFnQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQU1ELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgRGVidWcsIEludDMyLCBMaXN0LCBOTnVtYmVyLCBOU3RyaW5nLCBTdHJpbmdCdWlsZGVyLCBUaHJlYWR9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ2FsbE9wZXJhdGlvbk1vZGUsXHJcbiAgQ2FsbE9zU2hvdyxcclxuICBDb25zdGFudHMsXHJcbiAgTG9nZ2VyLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBOVU1fVFlQRSxcclxuICBQcm9wSW50ZXJmYWNlLFxyXG4gIFN0eWxlcyxcclxuICBUYXNrRGVmaW5pdGlvbklkLFxyXG4gIFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIsXHJcbiAgVmVjdG9yVHlwZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuXHJcbmltcG9ydCB7WWVzTm9FeHB9IGZyb20gJy4uL2V4cC9ZZXNOb0V4cCc7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSAnLi9Bcmd1bWVudHNMaXN0JztcclxuaW1wb3J0IHtJQ2xpZW50Q29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvSUNsaWVudENvbW1hbmQnO1xyXG5pbXBvcnQge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cC9FeHByZXNzaW9uJztcclxuaW1wb3J0IHtFdmVudEhhbmRsZXJ9IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlcic7XHJcbmltcG9ydCB7RmllbGR9IGZyb20gJy4uL2RhdGEvRmllbGQnO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSAnLi4vZXZlbnQvUnVuVGltZUV2ZW50JztcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gJy4uL2d1aS9NZ0Zvcm0nO1xyXG5pbXBvcnQge0NvbW1hbmRGYWN0b3J5fSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSAnLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlJztcclxuaW1wb3J0IHtFeGVjT3BlckNvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0V4ZWNPcGVyQ29tbWFuZCc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gJy4uL3Rhc2tzL1Rhc2snO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9ySW50ZXJmYWNlfSBmcm9tICcuLi9GbG93TW9uaXRvckludGVyZmFjZSc7XHJcbmltcG9ydCB7TGFuZ3VhZ2VEYXRhfSBmcm9tICcuLi9lbnYvTGFuZ3VhZ2VEYXRhJztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4vTGFzdEZvY3VzZWRNYW5hZ2VyJztcclxuaW1wb3J0IHtDb21tYW5kc1RhYmxlfSBmcm9tICcuLi9Db21tYW5kc1RhYmxlJztcclxuaW1wb3J0IHtBY2Nlc3NIZWxwZXJ9IGZyb20gJy4uL0FjY2Vzc0hlbHBlcic7XHJcbmltcG9ydCB7R1VJTWFuYWdlcn0gZnJvbSBcIi4uL0dVSU1hbmFnZXJcIjtcclxuXHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxvcGVyPiB0YWdcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbiB7XHJcbiAgcHJpdmF0ZSBfY29uZEV4cDogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAodHJ1ZSk7XHJcbiAgcHJpdmF0ZSBfcmV0YWluRm9jdXM6IFllc05vRXhwID0gbmV3IFllc05vRXhwKGZhbHNlKTtcclxuICBwcml2YXRlIF93YWl0RXhwOiBZZXNOb0V4cCA9IG5ldyBZZXNOb0V4cChmYWxzZSk7XHJcbiAgcHJpdmF0ZSBfc3luY0RhdGE6IFllc05vRXhwID0gbmV3IFllc05vRXhwKGZhbHNlKTsgLy8gY2FsbCBvcGVyYXRpb246IFN5bmMgZGF0YVxyXG4gIHByaXZhdGUgX2FyZ0xpc3Q6IEFyZ3VtZW50c0xpc3QgPSBudWxsO1xyXG4gIHByaXZhdGUgX2Jsb2NrQ2xvc2U6IG51bWJlciA9IDA7XHJcbiAgLy8gaW4gQmxvY2sgQmVnaW4vRWxzZS9Mb29wIG9wZXJhdGlvbjogdGhlIG9wZXJhdGlvbiBpZCB3aGljaCBpcyB0aGUgZW5kIG9mIHRoZSBleGVjdXRpb24gYmxvY2sgKGVsc2UvZW5kKVxyXG4gIHByaXZhdGUgX2Jsb2NrRW5kOiBudW1iZXIgPSAwOyAgLy8gaW4gQmxvY2sgQmVnaW4vRWxzZS9Mb29wIG9wZXJhdGlvbjogdGhlIEJsb2NrIEVuZCBvcGVyYXRpb24gdGhhdCBlbmRzIHRoZSBuZXN0aW5nIGxldmVsXHJcbiAgcHJpdmF0ZSBfYnV0dG9uczogc3RyaW5nID0gJ1xcMCc7IC8vIGJ1dHRvbnMgb2YgdmVyaWZ5IG9wclxyXG4gIHByaXZhdGUgX2NoZWNrQnlTZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gZm9yIENhbGwgb3BlcmF0aW9uIHdpdGggc3ViZm9ybSBkZXN0aW5hdGlvblxyXG4gIHByaXZhdGUgX2NtZFRvU2VydmVyOiBJQ2xpZW50Q29tbWFuZCA9IG51bGw7IC8vIGRlZmF1bHQgYnV0dG9uIG9mIHZlcmlmeSBvcHJcclxuICBwcml2YXRlIF9kaXNwbGF5OiBzdHJpbmcgPSAnUyc7IC8vIFN0YXR1cyBsaW5lIHwgbWVzc2FnZSBCb3hcclxuICBwcml2YXRlIF9lcnJMb2dBcHBlbmQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gYXBwZW5kIHRvIGVycm9yIGxvZyBmb3IgdmVyaWZ5IG9wclxyXG4gIHByaXZhdGUgX2V2dEhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXhlY09uU2VydmVyOiBib29sZWFuID0gZmFsc2U7IC8vIGZvciBibG9jayBpZiB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdGhlIHNlcnZlclxyXG4gIHByaXZhdGUgX2V4ZWNPbkNsaWVudDogYm9vbGVhbiA9IGZhbHNlOyAvLyBmb3IgYmxvY2sgaWYgd2hpY2ggbXVzdCBiZSBleGVjdXRlZCBvbiB0aGUgY2xpZW50XHJcbiAgcHJpdmF0ZSBfZXhwOiBFeHByZXNzaW9uID0gbnVsbDtcclxuICBwcml2YXRlIF9maWVsZDogRmllbGQgPSBudWxsOyAvLyByZWZlcmVuY2UgdG8gdGhlIGZpZWxkXHJcbiAgcHJpdmF0ZSBfZ2xvYmFsUGFyYW1zU2hvdWxkQmVDb3BpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pbWFnZTogc3RyaW5nID0gJ1xcMCc7IC8vIGltYWdlIG9mIHZlcmlmeSBvcHJcclxuICBwcml2YXRlIF9pbmNyZW1lbnRhbDogYm9vbGVhbiA9IGZhbHNlOyAgLy8gSU5DUi0+dHJ1ZSwgTk9STUFMLT5mYWxzZSAoaG93IGF0dHJpYnV0ZSlcclxuICBwcml2YXRlIF9tZXRob2ROYW1lU25pcHBldDogc3RyaW5nID0gbnVsbDsgLy8gRW50cnkgcG9pbnQgbWV0aG9kTmFtZSBmb3Igc25pcHBldFxyXG4gIHByaXZhdGUgX21vZGU6IHN0cmluZyA9ICdcXDAnOyAvLyBFcnJvcnxXYXJuaW5nXHJcbiAgLy8gYnV0IHdlIHN0aWxsIG5lZWQgdG8gc2tpcCB0aGUgYmxvY2sgb3BlcmF0aW9ucyBpbiB0aGUgY2xpZW50XHJcbiAgcHJpdmF0ZSBfcHJnRGVzY3JpcHRpb246IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcHVibGljTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9yZXR1cm5WYWw6IEZpZWxkID0gbnVsbDsgLy8gcmV0dXJuIHZhbHVlIG9mIHZlcmlmeSBvcHJcclxuICBwcml2YXRlIF9ydEV2dDogUnVuVGltZUV2ZW50ID0gbnVsbDsgLy8gZm9yIFJhaXNlIGV2ZW50XHJcbiAgcHJpdmF0ZSBfc2VydmVySWQ6IG51bWJlciA9IC0xO1xyXG4gIC8vIHRoZSBpbmRleCBvZiB0aGlzIG9wZXJhdGlvbiBpbiB0aGUgc2VydmVyJ3MgZmxvdyAoMCBtZWFucyBpdCdzIHRoZSBmaXJzdCBvcGVyYXRpb24gaW4gdGhlIGhhbmRsZXIsIDEgZm9yIHRoZSBzZWNvbmQgZXRjLikuIFZhbGlkIGZvcjogU2VydmVyXHJcbiAgcHJpdmF0ZSBjYWxsZWRUYXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfc2hvdzogQ2FsbE9zU2hvdyA9IENhbGxPc1Nob3cuTm9ybWFsO1xyXG4gIHByaXZhdGUgX3N1YmZvcm1DdHJsTmFtZTogc3RyaW5nID0gbnVsbDsgLy8gZm9yIENhbGwgb3BlcmF0aW9uIHdpdGggc3ViZm9ybSBkZXN0aW5hdGlvblxyXG4gIHByaXZhdGUgX3N1YnR5cGU6IHN0cmluZyA9ICdcXDAnOyAvLyBJZnxFbHNlfExvb3BcclxuICBwcml2YXRlIF90YXNrOiBUYXNrID0gbnVsbDsgLy8gdGhlIHRhc2sgb2YgdGhlIG9wZXJhdGlvblxyXG4gIHByaXZhdGUgX3RleHQ6IHN0cmluZyA9IG51bGw7IC8vIHRoZSB2ZXJpZnkgbWVzc2FnZVxyXG4gIHByaXZhdGUgX3RpdGxlOiBzdHJpbmcgPSBudWxsOyAvLyB0aXRsZSBvZiB2ZXJpZnkgb3ByXHJcbiAgcHJpdmF0ZSBfdGl0bGVFeHA6IEV4cHJlc3Npb24gPSBudWxsOyAvLyBleHByZXNzaW9uIGF0dGFjaGVkIHRvIHRpdGxlIG9mIHZlcmlmeSBvcHJcclxuICBwcml2YXRlIF90eXBlOiBudW1iZXIgPSAwOyAvLyBvcGVyYXRpb24gbnVtYmVyIChsaWtlIGluIE1hZ2ljKVxyXG4gIHByaXZhdGUgX3VuZG86IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9pc1JvdXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcm91dGVyUGF0aDogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9vcmlnaW5hbFJvdXRlck91dGxldE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcm91dGVQYXJhbXM6IExpc3Q8YW55PiA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCl7XHJcbiAgfVxyXG5cclxuICBnZXQgQ2FsbGVkVGFza0RlZmluaXRpb25JZCgpOiBUYXNrRGVmaW5pdGlvbklkIHtcclxuICAgIHJldHVybiB0aGlzLmNhbGxlZFRhc2tEZWZpbml0aW9uSWQ7XHJcbiAgfVxyXG5cclxuICBPcGVyQ2FsbE1vZGU6IENhbGxPcGVyYXRpb25Nb2RlID0gMDtcclxuXHJcbiAgc2V0IFRhc2sodmFsdWU6IFRhc2spIHtcclxuICAgIHRoaXMuX3Rhc2sgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBUYXNrKCk6IFRhc2sge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEltbWVkaWF0ZSgpOiAgUHJvbWlzZTxib29sZWFuPiAge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dhaXRFeHAuZ2V0VmFsKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIGFuIG9wZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbERhdGEodGFza1JlZjogVGFzaywgZXZ0SGFuZGxlcjogRXZlbnRIYW5kbGVyLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fdGFzayA9IHRhc2tSZWY7XHJcbiAgICB0aGlzLl9ldnRIYW5kbGVyID0gZXZ0SGFuZGxlcjtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSwgdGFza1JlZikpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0IGlubmVyIGF0dHJpYnV0ZXMgb2YgT3BlcmF0aW9uIG9iamVjdCBvbiBwYXJzaW5nIHRpbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgaW5pdElubmVyT2JqZWN0cyhwYXJzZXI6IFhtbFBhcnNlciwgZm91bmRUYWdOYW1lOiBzdHJpbmcsIHRhc2tSZWY6IFRhc2spOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlQpIHtcclxuICAgICAgdGhpcy5fcnRFdnQgPSBuZXcgUnVuVGltZUV2ZW50KHRhc2tSZWYpO1xyXG4gICAgICB0aGlzLl9ydEV2dC5maWxsRGF0YShwYXJzZXIsIHRhc2tSZWYpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfT1BFUikge1xyXG4gICAgICB0aGlzLmZpbGxBdHRyaWJ1dGVzKHBhcnNlciwgdGFza1JlZik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFwiL1wiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX09QRVIpIHtcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpOyAvLyBzZXRDdXJySW5kZXgoWG1sUGFyc2VyLmlzTmV4dFRhZ0Nsb3NlZChNR19UQUdfQ09OVFJPTCkpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfVEFTS0RFRklOSVRJT05JRF9FTlRSWSkge1xyXG4gICAgICB0aGlzLkluaXRUYXNrRGVmaW5pdGlvbklEKHBhcnNlcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gT3BlcmF0aW9uLiBJbnNlcnQgZWxzZSBpZiB0byBPcGVyYXRpb24uaW5pdElubmVyT2JqZWN0cyBmb3IgXCIgKyBmb3VuZFRhZ05hbWUpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBvcGVyYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPnRoZSB0YXNrIG9mIHRoZSBoYW5kbGVyIGN1cnJlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgZmlsbEF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIsIHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPjtcclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcblxyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogU3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX09QRVIpICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX09QRVIubGVuZ3RoKTtcclxuXHJcbiAgICAgIHRva2Vuc1ZlY3RvciA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgdGhpcy5pbml0RWxlbWVudHModG9rZW5zVmVjdG9yLCB0YXNrUmVmKTtcclxuXHJcbiAgICAgIC8vIGluaXQgaW5uZXIgcmVmZXJlbmNlOlxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFLmxlbmd0aCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcImluIENvbW1hbmQuRmlsbERhdGEoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBNYWtlIGluaXRpYWxpemF0aW9uIG9mIHByaXZhdGUgZWxlbWVudHMgYnkgZm91bmQgdG9rZW5zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRva2Vuc1ZlY3RvclwiPmZvdW5kIHRva2Vucywgd2hpY2ggY29uc2lzdCBhdHRyaWJ1dGUvdmFsdWUgb2YgZXZlcnkgZm91bmRcdGVsZW1lbnQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPmN1cnJlbnQ8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxTdHJpbmc+LCB0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBTdHJpbmcsIHZhbHVlU3RyO1xyXG4gICAgbGV0IGV4cElkOiBudW1iZXI7XHJcbiAgICBsZXQgaXNHdWlUaHJlYWRFeGVjdXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICB2YWx1ZVN0ciA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UWVBFOlxyXG4gICAgICAgICAgdGhpcy5fdHlwZSA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0ZMRDpcclxuICAgICAgICAgIHRoaXMuX2ZpZWxkID0gT3BlcmF0aW9uLkluaXRGaWVsZCh2YWx1ZVN0ciwgdGhpcy5fdGFzayk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0VYUDpcclxuICAgICAgICAgIGV4cElkID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB0aGlzLl9leHAgPSB0YXNrUmVmLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RFWFQ6XHJcbiAgICAgICAgICB0aGlzLl90ZXh0ID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9NT0RFOlxyXG4gICAgICAgICAgdGhpcy5fbW9kZSA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1NVQlRZUEU6XHJcbiAgICAgICAgICB0aGlzLl9zdWJ0eXBlID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3VidHlwZSA9PT0gJ0UnKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3R5cGUgPSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0U7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3N1YnR5cGUgPT09ICdMJylcclxuICAgICAgICAgICAgICB0aGlzLl90eXBlID0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NMT1NFOlxyXG4gICAgICAgICAgdGhpcy5fYmxvY2tDbG9zZSA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VORDpcclxuICAgICAgICAgIHRoaXMuX2Jsb2NrRW5kID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSE9XOlxyXG4gICAgICAgICAgdGhpcy5faW5jcmVtZW50YWwgPSAodmFsdWVTdHIgPT09IFwiSVwiKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9VTkRPOlxyXG4gICAgICAgICAgaWYgKHZhbHVlU3RyWzBdID09PSAnTicpXHJcbiAgICAgICAgICAgIHRoaXMuX3VuZG8gPSBmYWxzZTtcclxuICAgICAgICAgIGVsc2UgaWYgKHZhbHVlU3RyWzBdID09PSAnWScpXHJcbiAgICAgICAgICAgIHRoaXMuX3VuZG8gPSB0cnVlO1xyXG4gICAgICAgICAgZWxzZSBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBPcGVyYXRpb24uaW5pdEVsZW1lbnRzKCk6IE5vIHN1Y2ggdmFsdWUgdG8gdGhlIE1HX0FUVFJfVU5ETyBmb3IgXCIgKyB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRElTUExBWTpcclxuICAgICAgICAgIHRoaXMuX2Rpc3BsYXkgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9XQUlUOlxyXG4gICAgICAgICAgdGhpcy5fd2FpdEV4cC5zZXRWYWwodGFza1JlZiwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFVEFJTl9GT0NVUzpcclxuICAgICAgICAgIHRoaXMuX3JldGFpbkZvY3VzLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU1lOQ19EQVRBOlxyXG4gICAgICAgICAgdGhpcy5fc3luY0RhdGEuc2V0VmFsKHRhc2tSZWYsIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TSE9XOlxyXG4gICAgICAgICAgdGhpcy5fc2hvdyA9IDxDYWxsT3NTaG93PlhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NORDpcclxuICAgICAgICAgIHRoaXMuX2NvbmRFeHAuc2V0VmFsKHRhc2tSZWYsIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9BUkdMSVNUOlxyXG4gICAgICAgICAgdGhpcy5fYXJnTGlzdCA9IG5ldyBBcmd1bWVudHNMaXN0KCk7XHJcbiAgICAgICAgICB0aGlzLl9hcmdMaXN0LmZpbGxMaXN0KHZhbHVlU3RyLCB0aGlzLl90YXNrKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRUZSRVNIT046XHJcbiAgICAgICAgICB0aGlzLl9hcmdMaXN0LlJlZnJlc2hPblN0cmluZyA9IHZhbHVlU3RyLlRyaW0oKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TRVJWRVJfSUQ6XHJcbiAgICAgICAgICB0aGlzLl9zZXJ2ZXJJZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX09QRVJfQ0FMTE1PREU6XHJcbiAgICAgICAgICB0aGlzLk9wZXJDYWxsTW9kZSA9IDxDYWxsT3BlcmF0aW9uTW9kZT52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU1VCRk9STV9DVFJMOlxyXG4gICAgICAgICAgdGhpcy5fc3ViZm9ybUN0cmxOYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DSEVDS19CWV9TRVJWRVI6XHJcbiAgICAgICAgICB0aGlzLl9jaGVja0J5U2VydmVyID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BVQkxJQzpcclxuICAgICAgICAgIHRoaXMuX3B1YmxpY05hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QUkdfREVTQ1JJUFRJT046XHJcbiAgICAgICAgICB0aGlzLl9wcmdEZXNjcmlwdGlvbiA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NQWV9HTEJfUFJNUzpcclxuICAgICAgICAgIHRoaXMuX2dsb2JhbFBhcmFtc1Nob3VsZEJlQ29waWVkID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VYRUNfT05fU0VSVkVSOlxyXG4gICAgICAgICAgdGhpcy5fZXhlY09uU2VydmVyID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblx0XHRjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRVhFQ19PTl9DTElFTlQ6XHJcbiAgICAgICAgICB0aGlzLl9leGVjT25DbGllbnQgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVElUTEU6XHJcbiAgICAgICAgICB0aGlzLl90aXRsZSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVElUTEVfRVhQOlxyXG4gICAgICAgICAgZXhwSWQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIHRoaXMuX3RpdGxlRXhwID0gdGFza1JlZi5nZXRFeHBCeUlkKGV4cElkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTUFHRTpcclxuICAgICAgICAgIHRoaXMuX2ltYWdlID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQlVUVE9OUzpcclxuICAgICAgICAgIHRoaXMuX2J1dHRvbnMgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRVRVUk5fVkFMOlxyXG4gICAgICAgICAgdGhpcy5fcmV0dXJuVmFsID0gT3BlcmF0aW9uLkluaXRGaWVsZCh2YWx1ZVN0ciwgdGhpcy5fdGFzayk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRVJSX0xPR19BUFBFTkQ6XHJcbiAgICAgICAgICB0aGlzLl9lcnJMb2dBcHBlbmQgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT1BFUl9NRVRIT0ROQU1FOlxyXG4gICAgICAgICAgdGhpcy5fbWV0aG9kTmFtZVNuaXBwZXQgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JU19HVUlfVEhSRUFEX0VYRUNVVElPTjpcclxuICAgICAgICAgIGlzR3VpVGhyZWFkRXhlY3V0aW9uID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTX1JPVVRFOlxyXG4gICAgICAgICAgdGhpcy5faXNSb3V0ZSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfUk9VVEVSX1BBVEg6XHJcbiAgICAgICAgICB0aGlzLl9yb3V0ZXJQYXRoID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBPcGVyYXRpb24gY2xhc3MuIEluc2VydCBjYXNlIHRvIE9wZXJhdGlvbi5pbml0RWxlbWVudHMgZm9yIFwiICsgYXR0cmlidXRlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fc2VydmVySWQgPiAtMSlcclxuICAgICAgdGhpcy5fY21kVG9TZXJ2ZXIgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFeGVjT3BlckNvbW1hbmQodGhpcy5fdGFzay5nZXRUYXNrVGFnKCksIFwiXCIgKyB0aGlzLl9ldnRIYW5kbGVyLmdldElkKCksIHRoaXMuX3NlcnZlcklkLCBJbnQzMi5NaW5WYWx1ZSwgbnVsbCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzUm91dGUpIHtcclxuICAgICAgdGhpcy5fb3JpZ2luYWxSb3V0ZXJPdXRsZXROYW1lID0gdGhpcy5fc3ViZm9ybUN0cmxOYW1lICE9PSBudWxsID8gdGhpcy5fc3ViZm9ybUN0cmxOYW1lIDogXCJcIjtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9zdWJmb3JtQ3RybE5hbWUgPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBkZWZhdWx0Um91dGVyT3V0bGV0OiBNZ0NvbnRyb2xCYXNlID0gdGhpcy5fdGFzay5nZXRGb3JtKCkuRGVmYXVsdFJvdXRlck91dGxldDtcclxuICAgICAgICB0aGlzLl9zdWJmb3JtQ3RybE5hbWUgPSBkZWZhdWx0Um91dGVyT3V0bGV0ICE9PSBudWxsID8gZGVmYXVsdFJvdXRlck91dGxldC5OYW1lIDogXCJcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicGFyc2VyXCI+PC9wYXJhbT5cclxuICBJbml0VGFza0RlZmluaXRpb25JRChwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IHhtbEJ1ZmZlcjogc3RyaW5nID0gcGFyc2VyLlJlYWRUb0VuZE9mQ3VycmVudEVsZW1lbnQoKTtcclxuICAgIGxldCB0YXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyOiBUYXNrRGVmaW5pdGlvbklkVGFibGVTYXhIYW5kbGVyID0gbmV3IFRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIodGhpcy5TZXRUYXNrRGVmaW5pdGlvbklkKTtcclxuICAgIHRhc2tEZWZpbml0aW9uSWRUYWJsZVNheEhhbmRsZXIucGFyc2UoeG1sQnVmZmVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2FsbGJhY2sgZm9yIHRoZSBzYXggcGFyc2VyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrRGVmaW5pdGlvbklkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ4bWxJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZGVmYXVsdFRhZ0xpc3RcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0VGFza0RlZmluaXRpb25JZCh0YXNrRGVmaW5pdGlvbklkOiBUYXNrRGVmaW5pdGlvbklkKTogdm9pZCB7XHJcbiAgICB0aGlzLmNhbGxlZFRhc2tEZWZpbml0aW9uSWQgPSB0YXNrRGVmaW5pdGlvbklkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXRpYWxpemUgdGhlIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbHVlU3RyXCI+YSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIHN0YXRpYyBJbml0RmllbGQodmFsdWVTdHI6IHN0cmluZywgdGFzazogVGFzayk6IEZpZWxkIHtcclxuICAgIGxldCBUYXNrRmllbGQ6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnModmFsdWVTdHIsICcsJykvKicsJyovO1xyXG4gICAgaWYgKFRhc2tGaWVsZC5sZW5ndGggPT09IDIpIHtcclxuICAgICAgbGV0IHBhcmVudDogbnVtYmVyID0gTk51bWJlci5QYXJzZShUYXNrRmllbGQuZ2V0X0l0ZW0oMCkpO1xyXG4gICAgICBsZXQgZmxkSUQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoVGFza0ZpZWxkLmdldF9JdGVtKDEpKTtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50YXNrLmdldEZpZWxkRGVmKHBhcmVudCwgZmxkSUQpO1xyXG4gICAgICByZXR1cm4gZmllbGQ7XHJcbiAgICB9XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJVbmtub3duIGZpZWxkOiAnezB9J1wiLCB2YWx1ZVN0cikpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1wcmdDcmVhdG9yXCI+cmVsZXZhbnQgb25seSB3aGVuIHRoZSBvcGVyYXRpb24gYmVsb25ncyB0byBhIG1haW4gcHJvZ3JhbS5cclxuICAvLy8gICBJdCBpZGVudGlmaWVzIHRoZSB0YXNrIHdoaWNoIGNhdXNlZCB0aGlzIG1haW4gcHJvZ3JhbSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgcnVudGltZVxyXG4gIC8vLyAgIGZsb3cgKGkuZS4gd2hlbiBydW5uaW5nIGEgdGFzayBmcm9tIGEgZGlmZmVyZW50IGNvbXBvbmVudCwgd2UgaW5zdGFudGlhdGUgaGlzIG1haW4gcHJvZ3JhbVxyXG4gIC8vLyAgIHJpZ2h0IGFib3ZlIGl0LlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPnRoZSBmb2N1cyBuZWVkIHRvIGJlIHJldHVybmVkIGFmdGVyIHRoZSBWRVJJRlkgb3BlcmF0aW9uIGluIE1lc3NhZ2UgQm94IG5lZWRzIG9ubHlcclxuICAvLy8gICBhbGwgYW5vdGhlciBvcGVyYXRpb25zIGNhbiB1c2UgbnVsbFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV0dXJuZWRGcm9tU2VydmVyXCI+dHJ1ZSBpZiB0aGUgc2VydmVyIHJldHVybmVkIHRoZSBleGVjdXRpb24gdG8gdGhpcyBvcGVyYXRpb248L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiBmb3IgdmVyaWZ5IGFuZCBibG9jayBvcGVyYXRpb25zPC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgbGFzdFJ0RXZlbnQ6IFJ1blRpbWVFdmVudCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICBsZXQgbXByZ0NyZWF0b3I6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICBpZiAobGFzdFJ0RXZlbnQgIT09IG51bGwpXHJcbiAgICAgIG1wcmdDcmVhdG9yID0gPFRhc2s+bGFzdFJ0RXZlbnQuZ2V0TWFpblByZ0NyZWF0b3IoKTtcclxuXHJcbiAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyIHx8XHJcbiAgICAgICghcmV0dXJuZWRGcm9tU2VydmVyICYmICh0aGlzLl90eXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX1NFUlZFUiB8fCAhdGhpcy5fY29uZEV4cC5pc1NlcnZlckV4cCgpKSkpIHtcclxuICAgICAgaWYgKCEgYXdhaXQgdGhpcy5jYW5FeGVjdXRlKCkpIHtcclxuICAgICAgICBpZiAodGhpcy5fdHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QKVxyXG4gICAgICAgICAgYXdhaXQgZmxvd01vbml0b3IuYWRkRmxvd0ZpZWxkT3BlcmF0aW9uKHRoaXMsIGZhbHNlLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUCAmJiB0aGlzLl90eXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VOREJMT0NLKVxyXG4gICAgLy8gV2UgY2FsbCBhZGRGbG93T3BlcmF0aW9uU2VsZWN0IG9ubHkgYXQgdGhlIGJlZ2luaW5nIGFuZCBlbmQgb2YgdGhlIGxvb3AgYXQgRXZlbnRIYW5kbGVyOjpleGVjdXRlXHJcbiAgICAgIGF3YWl0IGZsb3dNb25pdG9yLmFkZEZsb3dGaWVsZE9wZXJhdGlvbih0aGlzLCB0cnVlLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5fdHlwZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9WRVJJRlk6XHJcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vcGVyVmVyaWZ5KCk7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMub3BlckJsb2NrKCk7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1A6XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZ2V0RXhlY09uU2VydmVyKCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZXJCbG9jaygpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub3BlclNlcnZlcihtcHJnQ3JlYXRvcik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTFNFOlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMub3BlckVsc2UoKTtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRVZBTFVBVEU6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9wZXJFdmFsdWF0ZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1VQREFURTpcclxuICAgICAgICAgIGF3YWl0IHRoaXMub3BlclVwZGF0ZShtcHJnQ3JlYXRvcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfUkFJU0VfRVZFTlQ6XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm9wZXJSYWlzZUV2ZW50KG1wcmdDcmVhdG9yLCByZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1NFUlZFUjpcclxuICAgICAgICAgIGF3YWl0IHRoaXMub3BlclNlcnZlcihtcHJnQ3JlYXRvcik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQ0FMTDpcclxuICAgICAgICAgIGlmICh0aGlzLl9wdWJsaWNOYW1lICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVyQ2FsbFBhcmFsbGVsKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh0aGlzLl9zdWJmb3JtQ3RybE5hbWUgPT0gbnVsbClcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vcGVyQ2FsbChtcHJnQ3JlYXRvcik7XHJcbiAgICAgICAgICAvLyBTdWJmb3JtIERlc3RpbmF0aW9uIENhbGwgb1IgQ2FsbCBSb3V0ZVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJmb3JtVGFzazogVGFzaztcclxuICAgICAgICAgICAgbGV0IGlzRW5kUHJvZzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tCeVNlcnZlcikge1xyXG4gICAgICAgICAgICAgIGlmICghKHRoaXMuX2NtZFRvU2VydmVyIGluc3RhbmNlb2YgRXhlY09wZXJDb21tYW5kKSlcclxuICAgICAgICAgICAgICAgIERlYnVnLkFzc2VydChmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBjb21tYW5kOiBFeGVjT3BlckNvbW1hbmQgPSA8RXhlY09wZXJDb21tYW5kPnRoaXMuX2NtZFRvU2VydmVyO1xyXG4gICAgICAgICAgICAgIGNvbW1hbmQuQ2hlY2tPbmx5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZXJDYWxsKG1wcmdDcmVhdG9yKTtcclxuICAgICAgICAgICAgICBjb21tYW5kLkNoZWNrT25seSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeCh0aGlzLCB0cnVlKSA+IC0xKVxyXG4gICAgICAgICAgICAgICAgaXNFbmRQcm9nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlzRW5kUHJvZykge1xyXG4gICAgICAgICAgICAgIGxldCBkZXN0U3ViRm9ybTogTWdDb250cm9sID0gKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLmdldFN1YkZvcm1DdHJsQnlOYW1lKHRoaXMuX3N1YmZvcm1DdHJsTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIEEgY2FsbCByb3V0ZSBvcGVyYXRpb24gbmVlZHMgYW4gb3V0bGV0LiBJZiBhIG1hdGNoaW5nIG91dGxldCBpcyBub3QgZm91bmQsIENhbGwgcm91dGUgY2Fubm90IGV4ZWN1dGUuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzUm91dGUgJiYgKGRlc3RTdWJGb3JtID09PSBudWxsIHx8ICFkZXN0U3ViRm9ybS5Jc1JvdXRlck91dGxldCgpKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGRlc3RTdWJGb3JtICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNSb3V0ZSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2FuUm91dGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgbGV0IHJ0RXZudCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChydEV2bnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZVBhcmFtcyA9IHJ0RXZudC5nZXRSb3V0ZVBhcmFtTGlzdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IHJ0RXZudC5nZXRBcmdMaXN0KCkuZ2V0QXJnKDApLmdldFZhbHVlKFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEEsIDApKS50cmltKCkgPT09IHRoaXMuX3JvdXRlclBhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICAgICgocnRFdm50LmdldEFyZ0xpc3QoKS5nZXRBcmcoMSkuc2tpcEFyZygpKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgcnRFdm50LmdldEFyZ0xpc3QoKS5nZXRBcmcoMSkuZ2V0VmFsdWUoU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSwgMCkpLnRyaW0oKSA9PT0gdGhpcy5fb3JpZ2luYWxSb3V0ZXJPdXRsZXROYW1lKSlcclxuICAgICAgICAgICAgICAgICAgICAgIGNhblJvdXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5Sb3V0ZSlcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHN1YmZvcm1UYXNrID0gPFRhc2s+ZGVzdFN1YkZvcm0uZ2V0U3ViZm9ybVRhc2soKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZm9ybVRhc2sgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGVybWluYXRlVGFza0dyYWNlZnVsbHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcnRFdm50ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TGFzdFJ0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzUm91dGUgJiYgcnRFdm50ICE9PSBudWxsICYmIHJ0RXZudC5pc0d1aVRyaWdnZXJlZEV2ZW50KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVUYXNrR3JhY2VmdWxseSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnNldFN0b3BFeGVjdXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHN1YmZvcm1UYXNrLmVuZFRhc2sodHJ1ZSwgZmFsc2UsICF0ZXJtaW5hdGVUYXNrR3JhY2VmdWxseSwgdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50VGFzazogVGFzayA9IDxUYXNrPmRlc3RTdWJGb3JtLmdldEZvcm0oKS5nZXRUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50VGFzay5UYXNrU2VydmljZS5SZW1vdmVSZWNvbXB1dGVzKHBhcmVudFRhc2spO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhc2sgZmFpbGVkIHRvIHRlcm1pbmF0ZSwgZG8gbm8gcHJvY2VlZCB0byBjYWxsIHRoZSBuZXcgdGFzay5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgICBMYXN0Rm9jdXNlZE1hbmFnZXIuZ2V0TGFzdEZvY3VzZWRDb250cm9sKCkuaXNEZXNjZW5kZW50T2ZDb250cm9sKGRlc3RTdWJGb3JtKSlcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fdGFzay5SZXRhaW5Gb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLl90YXNrLlJldGFpbkZvY3VzID0gYXdhaXQgdGhpcy5fcmV0YWluRm9jdXMuZ2V0VmFsKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wZXJDYWxsKG1wcmdDcmVhdG9yKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIENhbGwgb3BlcmF0aW9uIHNob3VsZCByZXR1cm4gd2hldGhlciBpdCBleGVjdXRlZCBhIENhbGwgUm91dGUgb3Igbm90LlxyXG4gICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgYnkgdGhlIGNhbGxlciBiZWNhdXNlLCBpdCBoYXMgdG8gc3RvcCBleGVjdXRpbmcgc3Vic2VxdWVudFxyXG4gICAgICAgICAgLy8gb3BlcmF0aW9ucyBpbiBjYXNlIGEgY2FsbCByb3V0ZSBnZXRzIGV4ZWN1dGVkLlxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUm91dGU7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhcIlRoZXJlIGlzIG5vIHN1Y2ggdHlwZSBvZiBvcGVyYXRpb24gXCIgKyB0aGlzLl90eXBlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjYWxsIGEgcGFyYWxsZWwgcmljaC1jbGllbnQgcHJvZ3JhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBvcGVyQ2FsbFBhcmFsbGVsKCk6IHZvaWQge1xyXG4gICAgT3BlcmF0aW9uLmNhbGxQYXJhbGxlbCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbGxQYXJhbGxlbCgpOiB2b2lkIHtcclxuICAvLyAgIGlmICh0YXNrLklzT2ZmbGluZSkge1xyXG4gIC8vICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJDYW4ndCBydW4gYSBwYXJhbGxlbCBwcm9ncmFtIGZyb20gYW4gb2ZmbGluZSB0YXNrXCIpO1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy9cclxuICAvLyAgIC8vICBUaGUgcmljaC1jbGllbnQgd2lsbCBxdWVyeSB0aGUgcnVudGltZS1lbmdpbmUgZm9yIHRoZSB1cC10by1kYXRlIGxpc3Qgb2YgZ2xvYmFsIHBhcmFtc1xyXG4gIC8vICAgLy8gIG9mIHRoZSBjdXJyZW50IGNvbnRleHQgb25seSBpZiB0aGUgY2FsbEVEIChwYXJhbGxlbCkgcHJvZ3JhbSByZXF1ZXN0cyBjb3B5aW5nIG9mIGdsb2JhbCBwYXJhbXMsXHJcbiAgLy8gICAvLyAgdGhlIGNhbGxFUiBwcm9ncmFtIHNob3VsZCBxdWVyeSB0aGVtIGZyb20gdGhlIHJ1bnRpbWUtZW5naW5lXHJcbiAgLy8gICBpZiAoZ2xvYmFsUGFyYW1zU2hvdWxkQmVDb3BpZWQpIHtcclxuICAvLyAgICAgbGV0IG1nRGF0YTogTUdEYXRhID0gdGFzay5nZXRNR0RhdGEoKTtcclxuICAvLyAgICAgbGV0IGNtZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVRdWVyeUdsb2JhbFBhcmFtc0NvbW1hbmQoKTtcclxuICAvLyAgICAgbWdEYXRhLkNtZHNUb1NlcnZlci5BZGQoY21kKTtcclxuICAvLyAgICAgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLk9OTFlfQ09NTUFORFMpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgLy8gY2xvbmUgdGhlIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IGNsaWVudFxyXG4gIC8vICAgTG9nZ2VyLmluc3RhbmNlLldyaXRlRXJyb3JUb0xvZyhcImNhbGxQYXJhbGxlbCBjYWxsZWRcIik7XHJcbiAgLy8gICBsZXQgY2FsbGVkUHJvZ3JhbVByb3BzOiBhbnkgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmNvcHlFeGVjdXRpb25Qcm9wcygpO1xyXG4gIC8vICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldEdsb2JhbFBhcmFtcyhudWxsKTtcclxuICAvL1xyXG4gIC8vICAgLy8gc2V0IHRoZSBjYWxsZWQgcHJvZ3JhbSdzIGludGVybmFsIG5hbWVcclxuICAvLyAgIGNhbGxlZFByb2dyYW1Qcm9wcy5zZXRfSXRlbShDb25zdEludGVyZmFjZS5SRVFfUFJHX05BTUUsIHB1YmxpY05hbWUpO1xyXG4gIC8vXHJcbiAgLy8gICAvLyBTZXJ2ZXIgc2VuZHMgcHJnRGVzY2lwcnRpb24gb25seSB3aGVuIFB1YmxpY05hbWUgaXMgbm90IHNwZWNpZmllZC5cclxuICAvLyAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgc2VuZHMgYSBmaWN0aXZlIHByZ0Rlc2NyaXB0aW9uIGxpa2UgOiBfUHJvZ3JhbV9JZF88SVNOPi5cclxuICAvLyAgIC8vIFdoZW4gcHVibGljIG5hbWUgaXMgc3BlY2lmaWVkIHByZ0Rlc2NyaXB0aW9uIGlzIG5vdCB1c2VkIGFuZCBpdCB3aWxsIGJlIG51bGwuXHJcbiAgLy8gICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShwcmdEZXNjcmlwdGlvbikpIHtcclxuICAvLyAgICAgY2FsbGVkUHJvZ3JhbVByb3BzLnNldF9JdGVtKENvbnN0SW50ZXJmYWNlLlJFUV9QUkdfREVTQ1JJUFRJT04sIHByZ0Rlc2NyaXB0aW9uKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGNhbGxlZFByb2dyYW1Qcm9wcy5zZXRfSXRlbShDb25zdEludGVyZmFjZS5QQVJBTExFTF9FWEVDVVRJT04sIFwiWVwiKTtcclxuICAvL1xyXG4gIC8vICAgLy8gYXJndW1lbnRzIHRvIHRoZSBwYXJhbGxlbCBwcm9ncmFtXHJcbiAgLy8gICBpZiAoYXJnTGlzdCAhPT0gbnVsbCkge1xyXG4gIC8vICAgICBsZXQgcHJnQXJnczogc3RyaW5nID0gYXJnTGlzdC50b1VSTCh0cnVlKTtcclxuICAvLyAgICAgY2FsbGVkUHJvZ3JhbVByb3BzLnNldF9JdGVtKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdTLCBwcmdBcmdzKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBYTUxkYXRhOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAvLyAgIHRyeSB7XHJcbiAgLy8gICAgIGNhbGxlZFByb2dyYW1Qcm9wcy5zdG9yZVRvWE1MKFhNTGRhdGEpO1xyXG4gIC8vXHJcbiAgLy8gICAgIC8vIElmIGVuY29kaW5nIHdhcyBkaXNhYmxlZCwgZW5hYmxlIGl0IHRvIGNyZWF0ZSB0aGUgcmlnaHQgY29tbWFuZCBsaW5lIGZvciB0aGUgcGFyYWxsZWwgcHJvZ3JhbVxyXG4gIC8vICAgICBsZXQgZW5jb2RpbmdFbmFibGVkOiBib29sZWFuID0gSHR0cFV0aWxpdHkuRW5jb2RpbmdFbmFibGVkO1xyXG4gIC8vICAgICBpZiAoIWVuY29kaW5nRW5hYmxlZClcclxuICAvLyAgICAgICBIdHRwVXRpbGl0eS5FbmNvZGluZ0VuYWJsZWQgPSB0cnVlO1xyXG4gIC8vXHJcbiAgLy8gICAgIGxldCBzcGF3bmluZ0FyZ3VtZW50czogc3RyaW5nID0gSHR0cFV0aWxpdHkuVXJsRW5jb2RlKFhNTGRhdGEuVG9TdHJpbmcoKSwgRW5jb2RpbmcuVVRGOCk7XHJcbiAgLy8gICAgIGlmICghZW5jb2RpbmdFbmFibGVkKVxyXG4gIC8vICAgICAgIEh0dHBVdGlsaXR5LkVuY29kaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG4gIC8vXHJcbiAgLy8gICAgIC8vIHNwYXduIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhc3NlbWJseSBpbnNpZGUgdGhlIGN1cnJlbnQgcHJvY2Vzc1xyXG4gIC8vICAgICBQcm9jZXNzLlN0YXJ0Q3VycmVudEV4ZWN1dGFibGUoc3Bhd25pbmdBcmd1bWVudHMpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY2F0Y2ggKGV4KSB7XHJcbiAgLy8gICAgIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gIC8vICAgICAgIE9wZXJhdGlvbi5jYWxsT3ByU2hvd0Vycm9yKHRhc2ssIGV4LnRvU3RyaW5nKCkpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGVsc2VcclxuICAvLyAgICAgICB0aHJvdyBleDtcclxuICAvLyAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjb25kaXRpb24gdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29uZFZhbCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25kRXhwLmdldFZhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgb3BlcmF0aW9uIHR5cGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFR5cGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgb3BlcmF0aW9uIHR5cGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJvdXRlUGFyYW1zKCk6IExpc3Q8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm91dGVQYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgc2VydmVyIElEIG9mIHRoaXMgb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTZXJ2ZXJJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlcklkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgVmVyaWZ5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiBtb2RlPT1lcnJvcjwvcmV0dXJucz5cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVyVmVyaWZ5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGlzRXJyb3I6IGJvb2xlYW4gPSAodGhpcy5fbW9kZSA9PT0gQ29uc3RJbnRlcmZhY2UuRkxXX1ZFUklGWV9NT0RFX0VSUk9SKTtcclxuXHJcbiAgICBsZXQgdGV4dFRvRGlzcGxheTogc3RyaW5nID0gdGhpcy5fZXhwID09PSBudWxsID8gdGhpcy5fdGV4dCA6IGF3YWl0IHRoaXMuX2V4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSwgMjU1KTtcclxuXHJcbiAgICBsZXQgdGl0bGVUb0Rpc3BsYXk6IHN0cmluZyA9IHRoaXMuX3RpdGxlRXhwID09PSBudWxsID8gdGhpcy5fdGl0bGUgOiBhd2FpdCB0aGlzLl90aXRsZUV4cC5ldmFsdWF0ZVdpdGhSZXN1bHRUeXBlQW5kTGVuZ3RoKFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERSwgMjU1KTtcclxuXHJcbiAgICB0ZXh0VG9EaXNwbGF5ID0gdGV4dFRvRGlzcGxheSA9PT0gbnVsbCA/IFwiXCIgOiBTdHJVdGlsLnJ0cmltKHRleHRUb0Rpc3BsYXkpO1xyXG4gICAgdGl0bGVUb0Rpc3BsYXkgPSB0aXRsZVRvRGlzcGxheSA9PT0gbnVsbCA/IFwiXCIgOiBTdHJVdGlsLnJ0cmltKHRpdGxlVG9EaXNwbGF5KTtcclxuXHJcbiAgICAvLyBJbk9yZGVyIHRvIGtlZXAgdGhlIGJlaGF2aW9yIHNhbWUgYXMgaW4gT25saW5lLCBWZXJpZnkgT3BlcmF0aW9uIFdhcm5pbmcgbWVzc2FnZXMgd2lsbCBiZSB3cml0dGVuXHJcbiAgICAvLyBhcyBFcnJvciBtZXNzYWdlcyBpbiBDbGllbnQgbG9nIChRQ1IgIzkxNTEyMilcclxuICAgIGlmICh0aGlzLl9lcnJMb2dBcHBlbmQpIHtcclxuICAgICAgbGV0IHByZ0Rlc2NyaXB0aW9uID0gKDxUYXNrPiB0aGlzLl90YXNrLkdldENvbnRleHRUYXNrKCkpLkdldENvbXB1dGVkUHJvcGVydHkoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2codGV4dFRvRGlzcGxheSArIFwiLCBwcm9ncmFtIDogXCIgKyBwcmdEZXNjcmlwdGlvbik7XHJcbiAgICB9XHJcbiAgICAvLyBTdGF0dXMgbGluZVxyXG4gICAgaWYgKHRoaXMuX2Rpc3BsYXkgPT09IENvbnN0SW50ZXJmYWNlLkRJU1BMQVlfU1RBVFVTKSB7XHJcbiAgICAgIC8vIEJsYW5rIE1lc3NhZ2Ugd2lsbCBub3QgYmUgc2hvd24sIHNhbWUgYXMgaW4gT25saW5lXHJcbiAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHRUb0Rpc3BsYXkpKSB7XHJcblxyXG4gICAgICAgIEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2UuYWRkRmxvd1ZlcmlmeUluZm8odGV4dFRvRGlzcGxheSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAvLyBQcm9kdWN0ICMxNzgsIFRvcGljICM2MTogYmVlcCBvbiB0aGUgY2xpZW50IHNpZGUgb25seSB1cG9uIHVzZXIgZXJyb3JzIChlLmcuIGR1cGxpY2F0ZSByZWNvcmQpLFxyXG4gICAgICAgIC8vIG90aGVyd2lzZSBvbmx5IGlmIHN0YXJ0ZWQgZnJvbSB0aGUgc3R1ZGlvIChGNylcclxuICAgICAgICAoPFRhc2s+IHRoaXMuX3Rhc2suR2V0Q29udGV4dFRhc2soKSkuV3JpdGVUb01lc3NhZ2VQYW5lKHRleHRUb0Rpc3BsYXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBNZXNzYWdlIEJveFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIEJsYW5rIE1lc3NhZ2Ugd2lsbCBub3QgYmUgc2hvd24sIHNhbWUgYXMgaW4gT25saW5lXHJcbiAgICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHRUb0Rpc3BsYXkpKSB7XHJcbiAgICAgICAgLy8gbWxzIHRyYW5zbGF0aW9uIHdoZW4gZGlzcGxheWluZyB0byBib3guIGZvciBzdGF0dXMgdGhlIHJhbnMgaXMgaSB0aGUgY29udHJvbCBwcm9wZXJ0eS5cclxuICAgICAgICBsZXQgbWxzVHJhbnNUZXh0VG9EaXNwbGF5OiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKHRleHRUb0Rpc3BsYXkpO1xyXG4gICAgICAgIGxldCBtbHNUcmFuc1RpdGxlVG9EaXNwbGF5OiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKHRpdGxlVG9EaXNwbGF5KTtcclxuXHJcblxyXG4gICAgICAgIGxldCB2ZXJpZnlNb2RlOiBudW1iZXIgPSBPcGVyYXRpb24uZ2V0QnV0dG9ucyh0aGlzLl9idXR0b25zKTtcclxuICAgICAgICB2ZXJpZnlNb2RlID0gdmVyaWZ5TW9kZSB8fCBPcGVyYXRpb24uZ2V0SW1hZ2UodGhpcy5faW1hZ2UpO1xyXG4gICAgICAgIHZlcmlmeU1vZGUgPSB2ZXJpZnlNb2RlIDtcclxuXHJcbiAgICAgICAgaWYgKFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdKUE4oKSkge1xyXG4gICAgICAgICAgbGV0IGRlbGltUG9zOiBudW1iZXIgPSBtbHNUcmFuc1RleHRUb0Rpc3BsYXkuaW5kZXhPZignfCcpO1xyXG4gICAgICAgICAgaWYgKDAgPD0gZGVsaW1Qb3MgJiYgZGVsaW1Qb3MgPCBtbHNUcmFuc1RleHRUb0Rpc3BsYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIG1sc1RyYW5zVGl0bGVUb0Rpc3BsYXkgPSBtbHNUcmFuc1RleHRUb0Rpc3BsYXkuc3Vic3RyKGRlbGltUG9zICsgMSk7XHJcbiAgICAgICAgICAgIG1sc1RyYW5zVGV4dFRvRGlzcGxheSA9IG1sc1RyYW5zVGV4dFRvRGlzcGxheS5zdWJzdHIoMCwgZGVsaW1Qb3MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gbnVsbDtcclxuICAgICAgICAvLyBnZXQgdGhlIG9iamVjdCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2Vib3ggd2lsbCBiZSBkaXNwbGF5ZWRcclxuICAgICAgICBpZiAoISg8VGFzaz4gdGhpcy5fdGFzay5HZXRDb250ZXh0VGFzaygpKS5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKVxyXG4gICAgICAgICAgbWdGb3JtID0gPE1nRm9ybT4oPFRhc2s+IHRoaXMuX3Rhc2suR2V0Q29udGV4dFRhc2soKSkuZ2V0VG9wTW9zdEZvcm0oKTtcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIGZvcm0gb2YgdGhlIGN1cnJlbnQgdGFzayBpcyBudWxsIChtYWluIHByb2dyYW0pIHRoZW4gdXNlIHRoZSBmb3JtXHJcbiAgICAgICAgLy8gb2YgbGFzdCBmb2N1c2VkIHRhc2tcclxuICAgICAgICBpZiAobWdGb3JtID09IG51bGwgJiYgTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpICE9IG51bGwpXHJcbiAgICAgICAgICBtZ0Zvcm0gPSA8TWdGb3JtPkxhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKS5nZXRUb3BNb3N0Rm9ybSgpO1xyXG4gICAgICAgIGlmIChtZ0Zvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgbWdGb3JtLlJlZnJlc2hVSSgpO1xyXG4gICAgICAgICAgQ29tbWFuZHMuaW52b2tlKCk7XHJcbiAgICAgICAgICBhd2FpdCBUaHJlYWQuU2xlZXAoMTApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmV0dXJuVmFsdWU6IG51bWJlciA9IGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveChtbHNUcmFuc1RpdGxlVG9EaXNwbGF5LCBtbHNUcmFuc1RleHRUb0Rpc3BsYXksIHZlcmlmeU1vZGUpO1xyXG4gICAgICAgIGF3YWl0IE9wZXJhdGlvbi5zZXRvcGVyVmVyaWZ5UmV0dXJuVmFsdWUocmV0dXJuVmFsdWUsIHRoaXMuX3JldHVyblZhbCk7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRXJyb3I7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBjb2RlIGFzc2lnbmVkIHRvIGNvcnJlc3BvbmRpbmcgYnV0dG9uc0lEXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRCdXR0b25zKGJ1dHRvbnNJRDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCB0bXBidXR0b25zOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHN3aXRjaCAoYnV0dG9uc0lEKSB7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuQlVUVE9OU19PSzpcclxuICAgICAgICB0bXBidXR0b25zID0gU3R5bGVzLk1TR0JPWF9CVVRUT05fT0s7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuQlVUVE9OU19PS19DQU5DRUw6XHJcbiAgICAgICAgdG1wYnV0dG9ucyA9IFN0eWxlcy5NU0dCT1hfQlVUVE9OX09LX0NBTkNFTDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5CVVRUT05TX0FCT1JUX1JFVFJZX0lHTk9SRTpcclxuICAgICAgICB0bXBidXR0b25zID0gU3R5bGVzLk1TR0JPWF9CVVRUT05fQUJPUlRfUkVUUllfSUdOT1JFO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkJVVFRPTlNfWUVTX05PX0NBTkNFTDpcclxuICAgICAgICB0bXBidXR0b25zID0gU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PX0NBTkNFTDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5CVVRUT05TX1lFU19OTzpcclxuICAgICAgICB0bXBidXR0b25zID0gU3R5bGVzLk1TR0JPWF9CVVRUT05fWUVTX05PO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLkJVVFRPTlNfUkVUUllfQ0FOQ0VMOlxyXG4gICAgICAgIHRtcGJ1dHRvbnMgPSBTdHlsZXMuTVNHQk9YX0JVVFRPTl9SRVRSWV9DQU5DRUw7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG1wYnV0dG9ucztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGNvZGUgYXNzaWduZWQgdG8gY29ycmVzcG9uZGluZyBpbWFnZUlEXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgc3RhdGljIGdldEltYWdlKGltYWdlSUQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgdG1wSW1hZ2U6IG51bWJlciA9IDA7XHJcbiAgICBzd2l0Y2ggKGltYWdlSUQpIHtcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5JTUFHRV9FWENMQU1BVElPTjpcclxuICAgICAgICB0bXBJbWFnZSA9IFN0eWxlcy5NU0dCT1hfSUNPTl9FWENMQU1BVElPTjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5JTUFHRV9DUklUSUNBTDpcclxuICAgICAgICB0bXBJbWFnZSA9IFN0eWxlcy5NU0dCT1hfSUNPTl9FUlJPUjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5JTUFHRV9RVUVTVElPTjpcclxuICAgICAgICB0bXBJbWFnZSA9IFN0eWxlcy5NU0dCT1hfSUNPTl9RVUVTVElPTjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5JTUFHRV9JTkZPUk1BVElPTjpcclxuICAgICAgICB0bXBJbWFnZSA9IFN0eWxlcy5NU0dCT1hfSUNPTl9JTkZPUk1BVElPTjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiB0bXBJbWFnZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0IFZlcmlmeSBPcGVyYXRpb24gUmV0dXJuIFZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgc2V0b3BlclZlcmlmeVJldHVyblZhbHVlKHJldHVyblZhbHVlOiBudW1iZXIsIHJldHVyblZhbDogRmllbGQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChyZXR1cm5WYWwgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHJldFZhbHVlTnVtOiBOVU1fVFlQRSA9IG5ldyBOVU1fVFlQRSgpO1xyXG5cclxuICAgICAgcmV0VmFsdWVOdW0uTlVNXzRfTE9ORyhyZXR1cm5WYWx1ZSk7XHJcbiAgICAgIGxldCByZXR1cm5WYWx1ZVN0cjogc3RyaW5nID0gcmV0VmFsdWVOdW0udG9YTUxyZWNvcmQoKTtcclxuXHJcbiAgICAgIGF3YWl0IHJldHVyblZhbC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHJldHVyblZhbHVlU3RyLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICBhd2FpdCByZXR1cm5WYWwudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgQmxvY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIG9wZXJCbG9jaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgZWxzZSAvIGVsc2VpZlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWVcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgb3BlckVsc2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIEV2YWx1YXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIG9wZXJFdmFsdWF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9ICdcXDAnO1xyXG5cclxuICAgIGlmICh0aGlzLl9maWVsZCAhPT0gbnVsbCkge1xyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9leHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aCh0aGlzLl9maWVsZC5nZXRUeXBlKCksIHRoaXMuX2ZpZWxkLmdldFNpemUoKSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2ZpZWxkLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUocmVzdWx0LCByZXN1bHQgPT09IG51bGwsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgYXdhaXQgdGhpcy5fZmllbGQudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9leHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChTdG9yYWdlQXR0cmlidXRlLkJPT0xFQU4sIDApO1xyXG4gICAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSBVcGRhdGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgb3BlclVwZGF0ZShtcHJnQ3JlYXRvcjogVGFzayk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nLCBvbGRWYWwsIG5ld1ZhbCwgZmllbGRWYWw7XHJcbiAgICBsZXQgc2V0UmVjb3JkVXBkYXRlZDogYm9vbGVhbjtcclxuICAgIGxldCByZWNvbXB1dGU6IGJvb2xlYW47XHJcbiAgICBsZXQgbk9sZDogTlVNX1RZUEUsIG5OZXcsIG5SZXN1bHQ7XHJcblxyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIGZsb3dNb25pdG9yLmFkZEZsb3dPcGVyYXRpb25VcGRhdGUoRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG5cclxuICAgIC8vIGZvciBub24tbW9kaWZpYWJsZSBmaWVsZCBnbyB0byB0aGUgc2VydmVyLCBpLmUuIHNlcnZlciBjYW4gYWJvcnQgdGhlIHRhc2tcclxuICAgIGlmICghdGhpcy5fZmllbGQuRGJNb2RpZmlhYmxlICYmICh0aGlzLl90YXNrLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSB7XHJcbiAgICAgIGlmICghYXdhaXQgdGhpcy5DYW5Nb2RpZnkobXByZ0NyZWF0b3IpKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBmaWVsZFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB0aGlzLl9maWVsZC5nZXRUeXBlKCk7XHJcblxyXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBpbmNyZW1lbnRhbCB1cGRhdGVcclxuICAgIGlmICh0aGlzLl9pbmNyZW1lbnRhbCkge1xyXG4gICAgICBpZiAoIXRoaXMuX2ZpZWxkLklzTGlua0ZpZWxkKSB7XHJcbiAgICAgICAgZmllbGRWYWwgPSB0aGlzLl9maWVsZC5nZXRWYWx1ZSh0cnVlKTtcclxuICAgICAgICBuUmVzdWx0ID0gKGZpZWxkVmFsICE9IG51bGxcclxuICAgICAgICAgID8gbmV3IE5VTV9UWVBFKGZpZWxkVmFsKVxyXG4gICAgICAgICAgOiBudWxsKTtcclxuXHJcbiAgICAgICAgLy8gc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSBpZiBub3QgaW4gY3JlYXRlIG1vZGVcclxuICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcblxyXG4gICAgICAgICAgLy8gaW5kaWNhdGUgd2UgYXJlIGV2YWx1YXRpbmcgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgZmllbGRzXHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldEV2YWxPbGRWYWx1ZXModHJ1ZSk7XHJcbiAgICAgICAgICBvbGRWYWwgPSAodGhpcy5fZmllbGQuaXNOdWxsKClcclxuICAgICAgICAgICAgPyB0aGlzLl9maWVsZC5nZXRNYWdpY0RlZmF1bHRWYWx1ZSgpXHJcbiAgICAgICAgICAgIDogYXdhaXQgdGhpcy5fZXhwLmV2YWx1YXRlV2l0aFJlc3VsdFR5cGVBbmRMZW5ndGgoZmllbGRUeXBlLCB0aGlzLl9maWVsZC5nZXRTaXplKCkpKTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0RXZhbE9sZFZhbHVlcyhmYWxzZSk7XHJcbiAgICAgICAgICBuT2xkID0gbmV3IE5VTV9UWVBFKG9sZFZhbCk7XHJcbiAgICAgICAgICBuUmVzdWx0ID0gTlVNX1RZUEUuc3ViKG5SZXN1bHQsIG5PbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0RFTEVURSkge1xyXG4gICAgICAgICAgbmV3VmFsID0gYXdhaXQgdGhpcy5fZXhwLmV2YWx1YXRlV2l0aFJlc3VsdFR5cGVBbmRMZW5ndGgoZmllbGRUeXBlLCB0aGlzLl9maWVsZC5nZXRTaXplKCkpO1xyXG4gICAgICAgICAgaWYgKG5ld1ZhbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG5OZXcgPSBuZXcgTlVNX1RZUEUobmV3VmFsKTtcclxuICAgICAgICAgICAgblJlc3VsdCA9IE5VTV9UWVBFLmFkZChuUmVzdWx0LCBuTmV3KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgbk5ldyA9IG5SZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoblJlc3VsdCAhPSBudWxsKVxyXG4gICAgICAgICAgcmVzdWx0ID0gblJlc3VsdC50b1hNTHJlY29yZCgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpZWxkLmdldE1hZ2ljRGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLyogSWYgdGhlIGluY3JlbWVudGFsIHVwZGF0ZSBpcyBmb3IgYSBsaW5rIGZpZWxkLCBnbyB0byBzZXJ2ZXIuICovXHJcbiAgICAgICAgLyogVGhpcyBpcyByZXF1aXJlZCB0byBiZSBkb25lIG9uIHNlcnZlciBiZWNhdXNlIG9uIGNsaWVudCwgd2UgZG8gKi9cclxuICAgICAgICAvKiBub3QgaGF2ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBvbGQgbGluayByZWNvcmQuICovXHJcbiAgICAgICAgLyogQW5kIGZvciBpbmNyZW1lbnRhbCB1cGRhdGUsIHdlIG5lZWQgdG8gd29yayBvbiAyIHJlY29yZHMgYXMgaW4gKi9cclxuICAgICAgICAvKiBjYXNlIG9mIFFDUiMgOTAwNzM4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgIGF3YWl0IHRoaXMub3BlclNlcnZlcihtcHJnQ3JlYXRvcik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBlbmQgb2YgIGluY3JlbWVudGFsIHVwZGF0ZVxyXG4gICAgZWxzZVxyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9leHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChmaWVsZFR5cGUsIHRoaXMuX2ZpZWxkLmdldFNpemUoKSk7XHJcblxyXG4gICAgLy8gUUNSIDc0NjA1MyBpZiB0aGUgY2VsbHMgdHlwZSBkb24ndCBtYXRjaCB0aHJvdyBlcnJvclxyXG4gICAgaWYgKGZpZWxkVHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUilcclxuICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKVxyXG4gICAgICAgIHJlc3VsdCA9IE9wZXJhdGlvbi5vcGVyVXBkYXRlVmVjdG9ycyh0aGlzLl9maWVsZCwgcmVzdWx0KTtcclxuXHJcbiAgICByZWNvbXB1dGUgPSAodGhpcy5fZmllbGQuZ2V0VGFzaygpID09PSB0aGlzLl90YXNrKTtcclxuICAgIHNldFJlY29yZFVwZGF0ZWQgPSAoIXJlY29tcHV0ZSB8fCAhdGhpcy5fdW5kbyk7XHJcbiAgICBhd2FpdCB0aGlzLl9maWVsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHJlc3VsdCwgcmVzdWx0ID09IG51bGwsIHRydWUsIHNldFJlY29yZFVwZGF0ZWQsIGZhbHNlKTtcclxuICAgIGlmICghdGhpcy5fdW5kbylcclxuICAgICAgdGhpcy5fZmllbGQuc2V0VXBkYXRlZCgpO1xyXG5cclxuICAgIC8vIFFDUiAjIDI3MDk0OSA6IElmIGZpZWxkIGlzIHVwZGF0ZWQgd2l0aCB1cGRhdGUgb3BlcmF0aW9uLCBtb2RpZmllZCBmbGFnIHNob3VsZCBiZSBzZXQgaW4gb3JkZXIgdG8gY2F1c2UgcmUtY29tcHV0ZS5cclxuICAgIHRoaXMuX2ZpZWxkLnNldE1vZGlmaWVkKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5fZmllbGQudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgZmxvd01vbml0b3IuYWRkRmxvd09wZXJhdGlvblVwZGF0ZShGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYW4gYSBub24tbW9kaWZpYWJsZSBmaWVsZCBiZSBtb2RpZmllZC4gdGhlIHdheSB0byBnZXQgdGhlIGFuc3dlciBkZXBlbmRzIG9uIHRoZSBsb2NhbC9yZW1vdGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1wcmdDcmVhdG9yXCI+dHJ1ZSBpZiB0aGUgZmllbGQgbWF5IGJlIG1vZGlmaWVkIGFuZCB0aGUgY2FsbGluZyBtZXRob2Qgc2hvdWxkIGNvbnRpbnVlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgQ2FuTW9kaWZ5KG1wcmdDcmVhdG9yOiBUYXNrKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZXhlY09wZXJDb21tYW5kOiBFeGVjT3BlckNvbW1hbmQgPSAoKHRoaXMuX2NtZFRvU2VydmVyIGluc3RhbmNlb2YgRXhlY09wZXJDb21tYW5kKSA/IDxFeGVjT3BlckNvbW1hbmQ+dGhpcy5fY21kVG9TZXJ2ZXIgOiBudWxsKTtcclxuXHJcbiAgICBleGVjT3BlckNvbW1hbmQuT3BlcmF0aW9uID0gdGhpcztcclxuICAgIGV4ZWNPcGVyQ29tbWFuZC5NcHJnQ3JlYXRvciA9IG1wcmdDcmVhdG9yO1xyXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLlRhc2suRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUodGhpcy5fY21kVG9TZXJ2ZXIpKS5TdWNjZXNzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHVwZGF0ZXMgdGhlIGRhdGEgY29udGVudCBvZiBhIHZlY3RvciB3aXRob3V0IGNoYW5naW5nIGl0cyBoZWFkZXIgZGF0YVxyXG4gIC8vLyAgIHN1Y2ggYXMgY2VsbCB0eXBlIGFuZCBzaXplIC0gaXMgdXNlZCBvbmx5IGluIHVwZGF0ZSBvcGVyYXRpb25zIGJldHdlZW4gdmVjdG9yc1xyXG4gIC8vLyAgIGZvciBleGFtcGxlIHZlY3RvcnMgb2YgYWxwaGEgd2l0aCBjZWxsIHNpemUgdGhlIGRpZmZlciBvciB2ZWN0b3Igb2YgbWVtbyB3aXRoIHZlY3RvciBvZiBhbHBoYVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2ZWNcIj50aGUgZmxhdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGhlIG5ldyB2ZWN0b3JcclxuICAvLy8gICBmaWVsZCB0aGUgZmllbGQgdG8gYmUgdXBkYXRlZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYSBmbGF0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1cGRhdGVkIHZlY3RvciBhZnRlciB0aGUgVXBkYXRlPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBvcGVyVXBkYXRlVmVjdG9ycyhmaWVsZDogRmllbGQsIHZlYzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBpZiAoZmllbGQuZ2V0VHlwZSgpID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIGxldCBjZWxsc0F0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBWZWN0b3JUeXBlLmdldENlbGxzQXR0cih2ZWMpO1xyXG4gICAgICBsZXQgY2VsbHNUeXBlOiBTdG9yYWdlQXR0cmlidXRlID0gZmllbGQuZ2V0Q2VsbHNUeXBlKCk7XHJcblxyXG4gICAgICBpZiAoU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVGhlU2FtZVR5cGUoY2VsbHNBdHRyLCBjZWxsc1R5cGUpKSB7XHJcbiAgICAgICAgbGV0IG5ld1ZlYzogVmVjdG9yVHlwZSA9IG5ldyBWZWN0b3JUeXBlKHZlYyk7XHJcbiAgICAgICAgbmV3VmVjLmFkanVzdFRvRml0KGZpZWxkKTtcclxuICAgICAgICByZXR1cm4gbmV3VmVjLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcImluIG9wZXJVcGRhdGVWZWN0b3JzIFwiICsgZmllbGQuZ2V0TmFtZSgpICsgXCIgaXMgbm90IG9mIHR5cGUgdmVjdG9yXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgUmFpc2UgRXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibXByZ0NyZWF0b3JcIj5pZiB0aGUgb3BlcmF0aW9uIGJlbG9uZ3MgdG8gYSBtYWluIHByb2dyYW0gaXQgcG9pbnRzIHRvIHRoZSB0YXNrIHdoaWNoXHJcbiAgLy8vICAgY2F1c2VkIHRoZSBtYWluIHByb2dyYW0gdG8gYmVjb21lIGFjdGl2ZS4gT3RoZXJ3aXNlIGl0J3MgZmFsc2UuXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXR1cm5lZEZyb21TZXJ2ZXJcIj5pbmRpY2F0ZXMgd2hldGhlciB3ZSBqdXN0IGNhbWUgYmFjayBmcm9tIHRoZSBzZXJ2ZXIgdG8gYmUgcGFzc2VkIHRvIEV2ZW50c01hbmFnZXIuSW5zdGFuY2UuaGFuZGxlRXZlbnQoKTwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVyUmFpc2VFdmVudChtcHJnQ3JlYXRvcjogVGFzaywgcmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgbGV0IGltbWVkaWF0ZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuSW1tZWRpYXRlKCk7XHJcblxyXG4gICAgLy8gY3JlYXRlIGEgbmV3IHJ1biB0aW1lIGV2ZW50IHVzaW5nIHRoZSBvcmlnaW5hbCBhcyB0ZW1wbGF0ZVxyXG4gICAgbGV0IGFSdEV2dDogUnVuVGltZUV2ZW50ID0gdGhpcy5fcnRFdnQucmVwbGljYXRlKCk7XHJcbiAgICBhd2FpdCBhUnRFdnQuc2V0UHVibGljTmFtZSgpO1xyXG5cclxuICAgIGFSdEV2dC5zZXRJbW1lZGlhdGUoaW1tZWRpYXRlKTtcclxuICAgIGFSdEV2dC5zZXRNYWluUHJnQ3JlYXRvcihudWxsKTtcclxuXHJcbiAgICBpZiAoaW1tZWRpYXRlKSB7XHJcbiAgICAgIGFSdEV2dC5zZXRDdHJsKDxNZ0NvbnRyb2w+dGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpKTtcclxuICAgICAgYVJ0RXZ0LnNldEFyZ0xpc3QodGhpcy5fYXJnTGlzdCk7XHJcblxyXG4gICAgICBpZiAoYVJ0RXZ0LmdldFRhc2soKS5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgYVJ0RXZ0LnNldE1haW5QcmdDcmVhdG9yKG1wcmdDcmVhdG9yKTtcclxuXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmNoZWNrQW5kU2F2ZVJvdXRlRXZlbnRJZkN0eFJlbW92ZWRGcm9tU3J2ciAoYVJ0RXZ0KTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaEV4ZWNTdGFjayh0aGlzLl90YXNrLmdldFRhc2tUYWcoKSAsIHRoaXMuX2V2dEhhbmRsZXIuZ2V0SWQoKS50b1N0cmluZygpICwgdGhpcy5fc2VydmVySWQpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudChhUnRFdnQsIHJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcEV4ZWNTdGFjaygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIHNlbmQgYXJndW1lbnRzIGJ5IHZhbHVlXHJcbiAgICAgIGxldCBhcmdsaXN0ID0gbmV3IEFyZ3VtZW50c0xpc3QoKTtcclxuICAgICAgYXdhaXQgYXJnbGlzdC5Jbml0aWFsaXplKHRoaXMuX2FyZ0xpc3QpXHJcbiAgICAgIGFSdEV2dC5zZXRBcmdMaXN0KGFyZ2xpc3QpO1xyXG4gICAgICBhUnRFdnQuc2V0VGFzayhudWxsKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkVG9UYWlsKGFSdEV2dCk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmNoZWNrQW5kU2F2ZVJvdXRlRXZlbnRJZkN0eFJlbW92ZWRGcm9tU3J2ciAoYVJ0RXZ0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgYnJvd3NlciBDYWxsIG9wZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtcHJnQ3JlYXRvclwiPmlmIHRoZSBvcGVyYXRpb24gYmVsb25ncyB0byBhIG1haW4gcHJvZ3JhbSBpdCBwb2ludHMgdG8gdGhlIHRhc2sgd2hpY2hcclxuICAvLy8gICBjYXVzZWQgdGhlIG1haW4gcHJvZ3JhbSB0byBiZWNvbWUgYWN0aXZlLiBPdGhlcndpc2UgaXQncyBmYWxzZS5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIG9wZXJDYWxsKG1wcmdDcmVhdG9yOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLm9wZXJTZXJ2ZXIobXByZ0NyZWF0b3IpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgU2VydmVyIG9wZXJhdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtcHJnQ3JlYXRvclwiPmlmIHRoZSBvcGVyYXRpb24gYmVsb25ncyB0byBhIG1haW4gcHJvZ3JhbSBpdCBwb2ludHMgdG8gdGhlIHRhc2sgd2hpY2hcclxuICAvLy8gICBjYXVzZWQgdGhlIG1haW4gcHJvZ3JhbSB0byBiZWNvbWUgYWN0aXZlLiBPdGhlcndpc2UgaXQncyBmYWxzZS5cclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBvcGVyU2VydmVyKG1wcmdDcmVhdG9yOiBUYXNrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY29tbWFuZDogRXhlY09wZXJDb21tYW5kID0gKCh0aGlzLl9jbWRUb1NlcnZlciBpbnN0YW5jZW9mIEV4ZWNPcGVyQ29tbWFuZCkgPyA8RXhlY09wZXJDb21tYW5kPnRoaXMuX2NtZFRvU2VydmVyIDogbnVsbCk7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQoY29tbWFuZCAhPT0gbnVsbCk7XHJcbiAgICBpZiAodGhpcy5fdGFzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgIGNvbW1hbmQuTXByZ0NyZWF0b3IgPSBtcHJnQ3JlYXRvcjtcclxuICAgIGVsc2VcclxuICAgICAgY29tbWFuZC5NcHJnQ3JlYXRvciA9IG51bGw7XHJcblxyXG4gICAgY29tbWFuZC5TZXRFeGVjdXRpb25TdGFjayhBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRFeGVjU3RhY2soKSk7XHJcbiAgICBjb21tYW5kLk9wZXJhdGlvbiA9IHRoaXM7XHJcbiAgICBhd2FpdCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZXhlY1JlcXVlc3RXaXRoU3ViZm9ybVJlY29yZEN5Y2xlKDxDb21tYW5kc1RhYmxlPnRoaXMuX3Rhc2suZ2V0TUdEYXRhKCkuQ21kc1RvU2VydmVyLCB0aGlzLl9jbWRUb1NlcnZlciwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEJsb2NrIEVuZCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0QmxvY2tFbmQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ibG9ja0VuZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQmxvY2sgRW5kIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRCbG9ja0VuZCh2YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fYmxvY2tFbmQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIEJsb2NrIENsb3NlIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRCbG9ja0Nsb3NlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmxvY2tDbG9zZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQmxvY2sgQ2xvc2UgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEJsb2NrQ2xvc2UodmFsOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Jsb2NrQ2xvc2UgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXRUYXNrVGFnKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuICBnZXRIYW5kbGVySWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9ldnRIYW5kbGVyLmdldElkKCkudG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIGdldEV2ZW50SGFuZGxlcigpOiBFdmVudEhhbmRsZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2dEhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBnZXRFeGVjT25TZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXhlY09uU2VydmVyO1xyXG4gIH1cclxuXHJcbiAgc2V0RXhlY09uU2VydmVyKHZhbCA6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2V4ZWNPblNlcnZlciA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldEV4ZWNPbkNsaWVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9leGVjT25DbGllbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHRoZSBvcGVyYXRpb24gY2FuIGJlIGV4ZWN1dGVkIG9yIG5vdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGNhbkV4ZWN1dGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDb25kVmFsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ1ZmZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwdWJsaWMgYXN5bmMgQWRkRmxvd0Rlc2NyaXB0aW9uKGJ1ZmZlcjogU3RyaW5nQnVpbGRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgc3dpdGNoICh0aGlzLl90eXBlKSB7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9WRVJJRlk6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIlZlcmlmeTogXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9leHAgPT0gbnVsbClcclxuICAgICAgICAgIGJ1ZmZlci5BcHBlbmQodGhpcy5fdGV4dCk7XHJcbiAgICAgICAgZWxzZSBidWZmZXIuQXBwZW5kKFwiRXhwICNcIikuQXBwZW5kKHRoaXMuX2V4cC5nZXRJZCgpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJCbG9jayBJZlwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1A6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIkJsb2NrIExvb3BcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTFNFOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJCbG9jayBFbHNlXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRVZBTFVBVEU6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIkV2YWx1YXRlIEV4cCAjXCIpLkFwcGVuZCh0aGlzLl9leHAuZ2V0SWQoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9VUERBVEU6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZEZvcm1hdChcIlVwZGF0ZSB7MH0gd2l0aCBFeHAgI3sxfVwiLCB0aGlzLl9maWVsZC5nZXRWYXJOYW1lKCksIHRoaXMuX2V4cC5nZXRJZCgpKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VOREJMT0NLOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJFbmQgQmxvY2tcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9VU1JfRVhJVDpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiSW52b2tlIE9TXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfUkFJU0VfRVZFTlQ6XHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIlJhaXNlIEV2ZW50OlwiKTtcclxuICAgICAgICB0aGlzLl9ydEV2dC5BcHBlbmREZXNjcmlwdGlvbihidWZmZXIpO1xyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmRGb3JtYXQoXCIgKFdhaXQ9ezB9KVwiLCAoYXdhaXQgdGhpcy5JbW1lZGlhdGUoKSA/ICdZJyA6ICdOJykpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfU0VSVkVSOlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmQoXCJSdW4gc2VydmVyLXNpZGUgb3BlcmF0aW9uXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQ0FMTDpcclxuICAgICAgICBidWZmZXIuQXBwZW5kKFwiQ2FsbCBwcm9ncmFtXCIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJ1ZmZlci5BcHBlbmRGb3JtYXQoXCI8PFVua25vd24gT3BlcmF0aW9uIENvZGUgezB9Pj5cIiwgdGhpcy5fdHlwZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldEFyZ0xpc3QoKTogQXJndW1lbnRzTGlzdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXJnTGlzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0UmV0dXJuVmFsdWVGaWVsZCgpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmllbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICByZXR1cm5zIHN1YmZvcm0gY29udHJvbCBuYW1lIGZvciBjYWxsIHdpdGggZGVzdGluYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0U3ViZm9ybUNvbnRyb2xOYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3ViZm9ybUN0cmxOYW1lO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIkV4ZWN1dGluZyBvcGVyYXRpb24gbnVtYmVyIHswfVwiLCB0aGlzLl9zZXJ2ZXJJZCArIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgcmV0dXJucyBydW50aW1lRXZlbnQgZm9yIGEgcmFpc2UgZXZlbnQgb3BlcmF0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJ1bnRpbWVFdmVudCgpOiBSdW5UaW1lRXZlbnR7XHJcbiAgICByZXR1cm4gdGhpcy5fcnRFdnQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|