@magic-xpa/engine 4.1100.0-dev4110.20 → 4.1100.0-dev4110.202
Sign up to get free protection for your applications and to get access to all the features.
- package/{esm2020 → esm2022}/index.mjs +188 -188
- package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
- package/esm2022/src/AccessHelper.mjs +15 -0
- package/esm2022/src/ClientManager.mjs +409 -0
- package/esm2022/src/CommandsProcessorBase.mjs +56 -0
- package/esm2022/src/CommandsProcessorManager.mjs +26 -0
- package/esm2022/src/CommandsTable.mjs +162 -0
- package/esm2022/src/ConstInterface.mjs +517 -0
- package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
- package/esm2022/src/FlowMonitorInterface.mjs +16 -0
- package/esm2022/src/GUIManager.mjs +62 -0
- package/esm2022/src/GlobalCommandsManager.mjs +34 -0
- package/esm2022/src/GuiEventsProcessor.mjs +157 -0
- package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +122 -0
- package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
- package/{esm2020 → esm2022}/src/bridge/MagicBridge.mjs +40 -40
- package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -26
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +260 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +20 -20
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +19 -19
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
- package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
- package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +37 -0
- package/esm2022/src/commands/ClientToServer/EventCommand.mjs +40 -0
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/{esm2020 → esm2022}/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SelectProgramCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +30 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
- package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
- package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
- package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
- package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
- package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
- package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
- package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
- package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
- package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
- package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
- package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
- package/esm2022/src/data/DataView.mjs +1613 -0
- package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
- package/esm2022/src/data/DataviewManager.mjs +28 -0
- package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
- package/esm2022/src/data/DvCache.mjs +67 -0
- package/esm2022/src/data/Field.mjs +646 -0
- package/esm2022/src/data/FieldBase.mjs +15 -0
- package/esm2022/src/data/FieldsTable.mjs +103 -0
- package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
- package/esm2022/src/data/Key.mjs +88 -0
- package/esm2022/src/data/Record.mjs +866 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/esm2022/src/data/TaskTransactionManager.mjs +103 -0
- package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
- package/{esm2020 → esm2022}/src/enums.mjs +23 -23
- package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2022/src/env/Environment.mjs +487 -0
- package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
- package/esm2022/src/env/LanguageData.mjs +227 -0
- package/esm2022/src/env/MirrorString.mjs +65 -0
- package/esm2022/src/event/ActionManager.mjs +91 -0
- package/esm2022/src/event/Event.mjs +1333 -0
- package/esm2022/src/event/EventHandler.mjs +766 -0
- package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
- package/esm2022/src/event/EventsManager.mjs +2988 -0
- package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
- package/esm2022/src/event/RunTimeEvent.mjs +399 -0
- package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
- package/esm2022/src/event/UserEventsTable.mjs +47 -0
- package/esm2022/src/exp/ExpTable.mjs +57 -0
- package/esm2022/src/exp/Expression.mjs +200 -0
- package/esm2022/src/exp/ExpressionDict.mjs +727 -0
- package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
- package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
- package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2022/src/exp/YesNoExp.mjs +36 -0
- package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
- package/esm2022/src/gui/FormsTable.mjs +66 -0
- package/esm2022/src/gui/MgControl.mjs +363 -0
- package/esm2022/src/gui/MgForm.mjs +1181 -0
- package/esm2022/src/http/HttpManager.mjs +97 -0
- package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
- package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
- package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
- package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
- package/esm2022/src/http/client/HttpUtility.mjs +84 -0
- package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
- package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +882 -0
- package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
- package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
- package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
- package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
- package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/esm2022/src/remote/ServerError.mjs +40 -0
- package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
- package/esm2022/src/rt/Argument.mjs +265 -0
- package/esm2022/src/rt/ArgumentsList.mjs +103 -0
- package/esm2022/src/rt/Boundary.mjs +152 -0
- package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
- package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
- package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
- package/esm2022/src/rt/ExecutionStack.mjs +94 -0
- package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
- package/esm2022/src/rt/HandlersTable.mjs +96 -0
- package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
- package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
- package/esm2022/src/rt/Operation.mjs +735 -0
- package/esm2022/src/rt/OperationTable.mjs +67 -0
- package/esm2022/src/rt/Recompute.mjs +355 -0
- package/esm2022/src/rt/RecomputeTable.mjs +63 -0
- package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
- package/esm2022/src/rt/ResultValue.mjs +10 -0
- package/esm2022/src/rt/TableCache.mjs +177 -0
- package/esm2022/src/rt/TableCacheManager.mjs +67 -0
- package/esm2022/src/rt/Transaction.mjs +53 -0
- package/esm2022/src/security/UserDetails.mjs +71 -0
- package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
- package/esm2022/src/tasks/MGData.mjs +552 -0
- package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
- package/esm2022/src/tasks/RCTimer.mjs +63 -0
- package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
- package/esm2022/src/tasks/Task.mjs +2498 -0
- package/esm2022/src/tasks/TaskBase.mjs +83 -0
- package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2022/src/tasks/TasksTable.mjs +80 -0
- package/esm2022/src/tasks/sort/Sort.mjs +5 -0
- package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
- package/esm2022/src/util/ConstUtils.mjs +14 -0
- package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
- package/esm2022/src/util/HeapSort.mjs +70 -0
- package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
- package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
- package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
- package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
- package/esm2022/src/util/PrmMap.mjs +152 -0
- package/esm2022/src/util/ReturnResult.mjs +46 -0
- package/esm2022/src/util/ReturnResultBase.mjs +18 -0
- package/esm2022/src/util/Scrambler.mjs +89 -0
- package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
- package/esm2022/src/util/cookie.service.mjs +92 -0
- package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29750 -29693
- package/fesm2022/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +187 -187
- package/package.json +8 -14
- package/src/AccessHelper.d.ts +20 -20
- package/src/ClientManager.d.ts +34 -32
- package/src/CommandsProcessorBase.d.ts +23 -23
- package/src/CommandsProcessorManager.d.ts +6 -6
- package/src/CommandsTable.d.ts +22 -22
- package/src/ConstInterface.d.ts +516 -515
- package/src/CurrentClientVersion.d.ts +1 -1
- package/src/FlowMonitorInterface.d.ts +15 -15
- package/src/GUIManager.d.ts +17 -17
- package/src/GlobalCommandsManager.d.ts +17 -17
- package/src/GuiEventsProcessor.d.ts +24 -24
- package/src/ICommandsTable.d.ts +9 -9
- package/src/ServerConfig.d.ts +35 -34
- package/src/bridge/IGuiEvent.d.ts +19 -19
- package/src/bridge/MagicBridge.d.ts +16 -16
- package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
- package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
- package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
- package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
- package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
- package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
- package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
- package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
- package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +15 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
- package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
- package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -7
- package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
- package/src/commands/DataViewCommandBase.d.ts +6 -6
- package/src/commands/IClientCommand.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +12 -12
- package/src/commands/IClientToServerCommandInfo.d.ts +3 -3
- package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
- package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
- package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
- package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
- package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
- package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
- package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
- package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
- package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
- package/src/communications/IConnectionStateManager.d.ts +4 -4
- package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
- package/src/data/DataSourceIdKey.d.ts +2 -2
- package/src/data/DataView.d.ts +162 -162
- package/src/data/DataViewBase.d.ts +12 -12
- package/src/data/DataviewManager.d.ts +14 -14
- package/src/data/DataviewManagerBase.d.ts +11 -11
- package/src/data/DvCache.d.ts +15 -15
- package/src/data/Field.d.ts +103 -103
- package/src/data/FieldBase.d.ts +23 -23
- package/src/data/FieldsTable.d.ts +27 -27
- package/src/data/IRecordsTable.d.ts +7 -7
- package/src/data/Key.d.ts +15 -15
- package/src/data/Record.d.ts +156 -156
- package/src/data/RecordOutOfDataViewException.d.ts +10 -10
- package/src/data/RecordsTable.d.ts +38 -38
- package/src/data/TaskTransactionManager.d.ts +17 -17
- package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
- package/src/enums.d.ts +21 -21
- package/src/env/EnvVariablesTable.d.ts +17 -17
- package/src/env/Environment.d.ts +118 -118
- package/src/env/ILanguageData.d.ts +3 -3
- package/src/env/LanguageData.d.ts +20 -20
- package/src/env/MirrorString.d.ts +15 -15
- package/src/event/ActionManager.d.ts +14 -14
- package/src/event/Event.d.ts +79 -79
- package/src/event/EventHandler.d.ts +66 -66
- package/src/event/EventHandlerPosition.d.ts +25 -25
- package/src/event/EventsManager.d.ts +205 -204
- package/src/event/IEventsManager.d.ts +77 -77
- package/src/event/RunTimeEvent.d.ts +126 -123
- package/src/event/RunTimeEventBase.d.ts +5 -5
- package/src/event/UserEventsTable.d.ts +11 -11
- package/src/exp/ExpTable.d.ts +11 -11
- package/src/exp/Expression.d.ts +37 -37
- package/src/exp/ExpressionDict.d.ts +12 -12
- package/src/exp/ExpressionEvaluator.d.ts +198 -198
- package/src/exp/ExpressionLocalJpn.d.ts +18 -18
- package/src/exp/GlobalParamsTable.d.ts +19 -19
- package/src/exp/YesNoExp.d.ts +9 -9
- package/src/gui/CreatedFormVector.d.ts +10 -10
- package/src/gui/FormsTable.d.ts +15 -15
- package/src/gui/MgControl.d.ts +60 -60
- package/src/gui/MgForm.d.ts +93 -93
- package/src/http/HttpManager.d.ts +25 -25
- package/src/http/client/HttpClientAsync.d.ts +16 -16
- package/src/http/client/HttpClientBase.d.ts +30 -30
- package/src/http/client/HttpClientEvents.d.ts +18 -18
- package/src/http/client/HttpClientSync.d.ts +17 -17
- package/src/http/client/HttpUtility.d.ts +10 -10
- package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
- package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
- package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
- package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
- package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
- package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
- package/src/remote/RemoteDataviewManager.d.ts +9 -9
- package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
- package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ServerError.d.ts +16 -16
- package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
- package/src/rt/Argument.d.ts +36 -36
- package/src/rt/ArgumentsList.d.ts +24 -24
- package/src/rt/Boundary.d.ts +27 -27
- package/src/rt/CompMainPrgTable.d.ts +10 -10
- package/src/rt/DataviewHeaderBase.d.ts +34 -34
- package/src/rt/DataviewHeaderFactory.d.ts +5 -5
- package/src/rt/DataviewHeaders.d.ts +12 -12
- package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
- package/src/rt/ExecutionStack.d.ts +22 -22
- package/src/rt/ExecutionStackEntry.d.ts +7 -7
- package/src/rt/HandlersTable.d.ts +19 -19
- package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
- package/src/rt/IDataviewHeader.d.ts +10 -10
- package/src/rt/IResultValue.d.ts +4 -4
- package/src/rt/LastFocusedManager.d.ts +23 -23
- package/src/rt/Operation.d.ts +97 -97
- package/src/rt/OperationTable.d.ts +15 -15
- package/src/rt/Recompute.d.ts +41 -41
- package/src/rt/RecomputeTable.d.ts +9 -9
- package/src/rt/RemoteDataviewHeader.d.ts +14 -14
- package/src/rt/ResultValue.d.ts +7 -7
- package/src/rt/TableCache.d.ts +29 -29
- package/src/rt/TableCacheManager.d.ts +10 -10
- package/src/rt/Transaction.d.ts +23 -23
- package/src/security/UserDetails.d.ts +16 -16
- package/src/tasks/IMGDataCollection.d.ts +26 -26
- package/src/tasks/MGData.d.ts +63 -63
- package/src/tasks/MGDataCollection.d.ts +42 -42
- package/src/tasks/RCTimer.d.ts +13 -13
- package/src/tasks/RemoteTaskService.d.ts +16 -16
- package/src/tasks/Task.d.ts +312 -312
- package/src/tasks/TaskBase.d.ts +123 -123
- package/src/tasks/TaskServiceBase.d.ts +16 -16
- package/src/tasks/TasksTable.d.ts +21 -21
- package/src/tasks/sort/Sort.d.ts +4 -4
- package/src/tasks/sort/SortCollection.d.ts +11 -11
- package/src/util/ConstUtils.d.ts +3 -3
- package/src/util/FlowMonitorQueue.d.ts +70 -70
- package/src/util/HeapSort.d.ts +6 -6
- package/src/util/IMirrorXML.d.ts +6 -6
- package/src/util/IServerConfig.d.ts +11 -11
- package/src/util/MgBlockingQueue.d.ts +5 -5
- package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
- package/src/util/MgPriorityQueue.d.ts +13 -13
- package/src/util/ParamParseResult.d.ts +6 -6
- package/src/util/PrmMap.d.ts +28 -28
- package/src/util/ReturnResult.d.ts +18 -18
- package/src/util/ReturnResultBase.d.ts +11 -11
- package/src/util/Scrambler.d.ts +10 -10
- package/src/util/UniqueIDUtils.d.ts +4 -4
- package/src/util/cookie.service.d.ts +8 -8
- package/esm2020/src/AccessHelper.mjs +0 -9
- package/esm2020/src/ClientManager.mjs +0 -399
- package/esm2020/src/CommandsProcessorBase.mjs +0 -58
- package/esm2020/src/CommandsProcessorManager.mjs +0 -26
- package/esm2020/src/CommandsTable.mjs +0 -162
- package/esm2020/src/ConstInterface.mjs +0 -516
- package/esm2020/src/FlowMonitorInterface.mjs +0 -16
- package/esm2020/src/GUIManager.mjs +0 -62
- package/esm2020/src/GlobalCommandsManager.mjs +0 -34
- package/esm2020/src/GuiEventsProcessor.mjs +0 -154
- package/esm2020/src/ServerConfig.mjs +0 -117
- package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +0 -40
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
- package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
- package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
- package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
- package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
- package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
- package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
- package/esm2020/src/data/DataView.mjs +0 -1610
- package/esm2020/src/data/DataviewManager.mjs +0 -28
- package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
- package/esm2020/src/data/DvCache.mjs +0 -67
- package/esm2020/src/data/Field.mjs +0 -646
- package/esm2020/src/data/FieldBase.mjs +0 -18
- package/esm2020/src/data/FieldsTable.mjs +0 -103
- package/esm2020/src/data/Key.mjs +0 -88
- package/esm2020/src/data/Record.mjs +0 -846
- package/esm2020/src/data/RecordsTable.mjs +0 -267
- package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
- package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
- package/esm2020/src/env/Environment.mjs +0 -489
- package/esm2020/src/env/LanguageData.mjs +0 -226
- package/esm2020/src/env/MirrorString.mjs +0 -65
- package/esm2020/src/event/ActionManager.mjs +0 -91
- package/esm2020/src/event/Event.mjs +0 -1333
- package/esm2020/src/event/EventHandler.mjs +0 -766
- package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
- package/esm2020/src/event/EventsManager.mjs +0 -2975
- package/esm2020/src/event/RunTimeEvent.mjs +0 -392
- package/esm2020/src/event/UserEventsTable.mjs +0 -47
- package/esm2020/src/exp/ExpTable.mjs +0 -59
- package/esm2020/src/exp/Expression.mjs +0 -200
- package/esm2020/src/exp/ExpressionDict.mjs +0 -727
- package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
- package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
- package/esm2020/src/exp/YesNoExp.mjs +0 -36
- package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
- package/esm2020/src/gui/FormsTable.mjs +0 -66
- package/esm2020/src/gui/MgControl.mjs +0 -353
- package/esm2020/src/gui/MgForm.mjs +0 -1181
- package/esm2020/src/http/HttpManager.mjs +0 -97
- package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
- package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
- package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
- package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
- package/esm2020/src/http/client/HttpUtility.mjs +0 -84
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
- package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
- package/esm2020/src/remote/ServerError.mjs +0 -40
- package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
- package/esm2020/src/rt/Argument.mjs +0 -265
- package/esm2020/src/rt/ArgumentsList.mjs +0 -103
- package/esm2020/src/rt/Boundary.mjs +0 -152
- package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
- package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
- package/esm2020/src/rt/ExecutionStack.mjs +0 -94
- package/esm2020/src/rt/HandlersTable.mjs +0 -96
- package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
- package/esm2020/src/rt/Operation.mjs +0 -735
- package/esm2020/src/rt/OperationTable.mjs +0 -67
- package/esm2020/src/rt/Recompute.mjs +0 -355
- package/esm2020/src/rt/RecomputeTable.mjs +0 -63
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
- package/esm2020/src/rt/ResultValue.mjs +0 -12
- package/esm2020/src/rt/TableCache.mjs +0 -177
- package/esm2020/src/rt/TableCacheManager.mjs +0 -67
- package/esm2020/src/rt/Transaction.mjs +0 -53
- package/esm2020/src/security/UserDetails.mjs +0 -71
- package/esm2020/src/tasks/MGData.mjs +0 -552
- package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
- package/esm2020/src/tasks/RCTimer.mjs +0 -63
- package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
- package/esm2020/src/tasks/Task.mjs +0 -2495
- package/esm2020/src/tasks/TaskBase.mjs +0 -87
- package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
- package/esm2020/src/tasks/TasksTable.mjs +0 -80
- package/esm2020/src/tasks/sort/Sort.mjs +0 -7
- package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
- package/esm2020/src/util/ConstUtils.mjs +0 -14
- package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
- package/esm2020/src/util/HeapSort.mjs +0 -70
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
- package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
- package/esm2020/src/util/PrmMap.mjs +0 -151
- package/esm2020/src/util/ReturnResult.mjs +0 -46
- package/esm2020/src/util/ReturnResultBase.mjs +0 -18
- package/esm2020/src/util/Scrambler.mjs +0 -89
- package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
- package/esm2020/src/util/cookie.service.mjs +0 -92
- package/fesm2015/magic-xpa-engine.mjs +0 -30835
- package/fesm2015/magic-xpa-engine.mjs.map +0 -1
- package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,2498 @@
|
|
1
|
+
import { Debug, HashUtils, List, NNumber, NString, RefParam, Stack, StringBuilder, isNullOrUndefined } from '@magic-xpa/mscorelib';
|
2
|
+
import { Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttribute, StrUtil, WindowType, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
3
|
+
import { Commands, DataModificationTypes, DisplayConvertor, Events, GuiDataCollection, Helps, Manager, NUM_TYPE, PIC, PropInterface, RecordUtils, RuntimeContextBase, Styles, TaskDefinitionId } from '@magic-xpa/gui';
|
4
|
+
import { DataView } from '../data/DataView';
|
5
|
+
import { DvCache } from '../data/DvCache';
|
6
|
+
import { DataViewCommandType } from '../commands/ClientToServer/DataviewCommand';
|
7
|
+
import { CommandsProcessorBase_SendingInstruction } from '../CommandsProcessorBase';
|
8
|
+
import { TaskServiceBase } from './TaskServiceBase';
|
9
|
+
import { TaskTransactionManager } from '../data/TaskTransactionManager';
|
10
|
+
import { DataviewManager } from '../data/DataviewManager';
|
11
|
+
import { SortCollection } from './sort/SortCollection';
|
12
|
+
import { MgForm } from '../gui/MgForm';
|
13
|
+
import { RemoteTaskService } from './RemoteTaskService';
|
14
|
+
import { ReturnResult } from '../util/ReturnResult';
|
15
|
+
import { RunTimeEvent } from '../event/RunTimeEvent';
|
16
|
+
import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
|
17
|
+
import { DataviewHeaders } from '../rt/DataviewHeaders';
|
18
|
+
import { Transaction } from '../rt/Transaction';
|
19
|
+
import { TasksTable } from './TasksTable';
|
20
|
+
import { HandlersTable } from '../rt/HandlersTable';
|
21
|
+
import { RecomputeTable } from '../rt/RecomputeTable';
|
22
|
+
import { ExpTable } from '../exp/ExpTable';
|
23
|
+
import { UserEventsTable } from '../event/UserEventsTable';
|
24
|
+
import { FormsTable } from '../gui/FormsTable';
|
25
|
+
import { FlowMonitorQueue } from '../util/FlowMonitorQueue';
|
26
|
+
import { ActionManager } from '../event/ActionManager';
|
27
|
+
import { ConstInterface } from '../ConstInterface';
|
28
|
+
import { GUIManager } from '../GUIManager';
|
29
|
+
import { CommandsProcessorManager } from '../CommandsProcessorManager';
|
30
|
+
import { EventSubType } from '../enums';
|
31
|
+
import { OpeningTaskDetails, Task_SubformExecModeEnum, TaskBase } from './TaskBase';
|
32
|
+
import { LanguageData } from '../env/LanguageData';
|
33
|
+
import { Environment } from '../env/Environment';
|
34
|
+
import { LastFocusedManager } from '../rt/LastFocusedManager';
|
35
|
+
import { GlobalCommandsManager } from '../GlobalCommandsManager';
|
36
|
+
import { EventsAllowedType } from '../event/IEventsManager';
|
37
|
+
import { AccessHelper } from '../AccessHelper';
|
38
|
+
import { MGDataCollection } from './MGDataCollection';
|
39
|
+
import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
|
40
|
+
import { EventHandlerPosition } from '../event/EventHandlerPosition';
|
41
|
+
import { ClientManager } from "../ClientManager";
|
42
|
+
export var Task_Flow;
|
43
|
+
(function (Task_Flow) {
|
44
|
+
Task_Flow[Task_Flow["NONE"] = 0] = "NONE";
|
45
|
+
Task_Flow[Task_Flow["STEP"] = 1] = "STEP";
|
46
|
+
Task_Flow[Task_Flow["FAST"] = 2] = "FAST";
|
47
|
+
})(Task_Flow || (Task_Flow = {}));
|
48
|
+
export var Task_Direction;
|
49
|
+
(function (Task_Direction) {
|
50
|
+
Task_Direction[Task_Direction["BACK"] = -1] = "BACK";
|
51
|
+
Task_Direction[Task_Direction["NONE"] = 0] = "NONE";
|
52
|
+
Task_Direction[Task_Direction["FORE"] = 1] = "FORE";
|
53
|
+
})(Task_Direction || (Task_Direction = {}));
|
54
|
+
export class Task extends TaskBase {
|
55
|
+
_dvCache = null;
|
56
|
+
_mgData = null;
|
57
|
+
_aborting = false;
|
58
|
+
_bExecEndTask = false;
|
59
|
+
_isStarted = false;
|
60
|
+
_evalOldValues = false;
|
61
|
+
_inRecordSuffix = false;
|
62
|
+
_cancelWasRaised = false;
|
63
|
+
_counter = 0;
|
64
|
+
_currStartProgLevel = 0;
|
65
|
+
_destinationSubform = false;
|
66
|
+
_enableZoomHandler = false;
|
67
|
+
_firstRecordCycle = false;
|
68
|
+
_originalTaskMode = ' ';
|
69
|
+
_inCreateLine = false;
|
70
|
+
InSelect = false;
|
71
|
+
InStartProcess = false;
|
72
|
+
_isDestinationCall = false;
|
73
|
+
_knownToServer = true;
|
74
|
+
_loopStack = null;
|
75
|
+
allowRemoteCmdExecution;
|
76
|
+
DelayCommandExecution = false;
|
77
|
+
_parentTask = null;
|
78
|
+
get ParentTask() {
|
79
|
+
return this._parentTask;
|
80
|
+
}
|
81
|
+
ContextTask = null;
|
82
|
+
_triggeringTask = null;
|
83
|
+
PathParentTask = null;
|
84
|
+
_preventControlChange = false;
|
85
|
+
_preventRecordSuffix = false;
|
86
|
+
_taskPath = null;
|
87
|
+
_tryingToCommit = false;
|
88
|
+
set TryingToCommit(value) {
|
89
|
+
this._tryingToCommit = value;
|
90
|
+
}
|
91
|
+
get TryingToCommit() {
|
92
|
+
return this._tryingToCommit;
|
93
|
+
}
|
94
|
+
_useLoopStack = false;
|
95
|
+
_inProcessingTopMostEndTaskSaved = false;
|
96
|
+
InHandleActCancel = false;
|
97
|
+
RuntimeSorts = null;
|
98
|
+
VewFirst = 0;
|
99
|
+
dataViewContent = null;
|
100
|
+
PerformParentRecordPrefix = false;
|
101
|
+
ModeAsParent = false;
|
102
|
+
TaskTransactionManager = null;
|
103
|
+
ExecuteClientSubformRefresh = false;
|
104
|
+
InCommonHandlerBeforeRP = false;
|
105
|
+
_taskService = null;
|
106
|
+
get TaskService() {
|
107
|
+
if (this._taskService == null)
|
108
|
+
this._taskService = new RemoteTaskService();
|
109
|
+
return this._taskService;
|
110
|
+
}
|
111
|
+
static get CommandsProcessor() {
|
112
|
+
return CommandsProcessorManager.GetCommandsProcessor();
|
113
|
+
}
|
114
|
+
hasLocate = false;
|
115
|
+
taskDefinitionId = null;
|
116
|
+
ArgumentsList = null;
|
117
|
+
get LogicalStudioParentTask() {
|
118
|
+
if (this.StudioParentTask === null && !super.isMainProg()) {
|
119
|
+
return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, this._ctlIdx);
|
120
|
+
}
|
121
|
+
return this.StudioParentTask;
|
122
|
+
}
|
123
|
+
get KnownToServer() {
|
124
|
+
return this._knownToServer;
|
125
|
+
}
|
126
|
+
ConfirmUpdateNo = false;
|
127
|
+
DataSynced = false;
|
128
|
+
UniqueSort = null;
|
129
|
+
set Transaction(value) {
|
130
|
+
this.DataviewManager.CurrentDataviewManager.Transaction = value;
|
131
|
+
}
|
132
|
+
get Transaction() {
|
133
|
+
return this.DataviewManager.CurrentDataviewManager.Transaction;
|
134
|
+
}
|
135
|
+
RefreshOnVars = null;
|
136
|
+
DvPosDescriptor = null;
|
137
|
+
SubTasks = null;
|
138
|
+
ExpTab = null;
|
139
|
+
UserEvtTab = null;
|
140
|
+
DataviewHeadersTable = null;
|
141
|
+
HandlersTab = null;
|
142
|
+
_forms = null;
|
143
|
+
Name = null;
|
144
|
+
PublicName = null;
|
145
|
+
TaskSuffixExecuted = false;
|
146
|
+
get TaskDefinitionId() {
|
147
|
+
if (this.taskDefinitionId === null) {
|
148
|
+
this.taskDefinitionId = new TaskDefinitionId(this._ctlIdx, this.ProgramIsn, this.TaskIsn, this._isPrg);
|
149
|
+
}
|
150
|
+
return this.taskDefinitionId;
|
151
|
+
}
|
152
|
+
RetrunValueExp = 0;
|
153
|
+
SubformControl = null;
|
154
|
+
static StartProgLevel = 0;
|
155
|
+
static _idleTimerStarted = false;
|
156
|
+
static get IsBlockingBatch() {
|
157
|
+
return false;
|
158
|
+
}
|
159
|
+
constructor(parent) {
|
160
|
+
super();
|
161
|
+
if (isNullOrUndefined(parent)) {
|
162
|
+
this.constructor_0();
|
163
|
+
return;
|
164
|
+
}
|
165
|
+
this.constructor_1(parent);
|
166
|
+
}
|
167
|
+
constructor_0() {
|
168
|
+
this.ActionManager = new ActionManager();
|
169
|
+
this.DataView = new DataView(this);
|
170
|
+
this._flowMonitor = FlowMonitorQueue.Instance;
|
171
|
+
this.ContextTask = this;
|
172
|
+
this._dvCache = new DvCache(this);
|
173
|
+
this.PerformParentRecordPrefix = true;
|
174
|
+
this.DataviewManager = new DataviewManager(this);
|
175
|
+
this.allowRemoteCmdExecution = true;
|
176
|
+
this.TaskTransactionManager = new TaskTransactionManager(this);
|
177
|
+
}
|
178
|
+
Init() {
|
179
|
+
this.DataView.Init();
|
180
|
+
}
|
181
|
+
constructor_1(parent) {
|
182
|
+
this.constructor_0();
|
183
|
+
this.PathParentTask = parent;
|
184
|
+
this._parentTask = parent;
|
185
|
+
this._triggeringTask = null;
|
186
|
+
this.buildTaskPath();
|
187
|
+
}
|
188
|
+
static CreateTask() {
|
189
|
+
let task = new Task();
|
190
|
+
task.Init();
|
191
|
+
return task;
|
192
|
+
}
|
193
|
+
isAborting() {
|
194
|
+
return this._aborting;
|
195
|
+
}
|
196
|
+
buildTaskPath() {
|
197
|
+
this._taskPath = new List();
|
198
|
+
if (this._parentTask._taskPath !== null)
|
199
|
+
this._taskPath.AddRange(this._parentTask._taskPath.GetEnumerator());
|
200
|
+
this._taskPath.push(this);
|
201
|
+
}
|
202
|
+
async fillData(mgd, openingTaskDetails) {
|
203
|
+
if (!super.isMainProg()) {
|
204
|
+
if (this._parentTask === null && openingTaskDetails.CallingTask !== null) {
|
205
|
+
this._parentTask = openingTaskDetails.CallingTask;
|
206
|
+
this.buildTaskPath();
|
207
|
+
openingTaskDetails.CallingTask.addSubTask(this);
|
208
|
+
}
|
209
|
+
if (this.PathParentTask === null && openingTaskDetails.PathParentTask !== null) {
|
210
|
+
this.PathParentTask = openingTaskDetails.PathParentTask;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
if (this._parentTask !== null && this._parentTask.getEnableZoomHandler()) {
|
214
|
+
this.setEnableZoomHandler();
|
215
|
+
}
|
216
|
+
this._mgData = mgd;
|
217
|
+
this.fillAttributes();
|
218
|
+
this._mgData.addTask(this);
|
219
|
+
let parentForm = (this._parentTask !== null) ? this._parentTask.getForm() : null;
|
220
|
+
while (await this.initInnerObjects(RuntimeContextBase.Instance.Parser.getNextTag(), parentForm)) {
|
221
|
+
}
|
222
|
+
this.TaskTransactionManager.PrepareTransactionProperties(this.DataviewManager.RemoteDataviewManager.Transaction, false);
|
223
|
+
this.HandleTriggerTask();
|
224
|
+
this.HandlePreviouslyActiveTaskId();
|
225
|
+
this.CheckAndSetSubForm();
|
226
|
+
if (this.IsSubForm) {
|
227
|
+
let subFormCtrl = this.getParent().getForm().getSubFormCtrlForTask(this._taskTag);
|
228
|
+
if (subFormCtrl !== null) {
|
229
|
+
subFormCtrl.setSubformTaskId(this._taskTag);
|
230
|
+
}
|
231
|
+
if (this.Form !== null) {
|
232
|
+
this.Form.setSubFormCtrl(subFormCtrl);
|
233
|
+
}
|
234
|
+
}
|
235
|
+
}
|
236
|
+
HandlePreviouslyActiveTaskId() {
|
237
|
+
if (this._parentTask !== null && this._parentTask.GetContextTask() !== null && this._mgData !== this._parentTask.getMGData())
|
238
|
+
this.PreviouslyActiveTaskId = (this._parentTask.GetContextTask()).getTaskTag();
|
239
|
+
else if (this._parentTask !== null)
|
240
|
+
this.PreviouslyActiveTaskId = this._parentTask.getTaskTag();
|
241
|
+
}
|
242
|
+
HandleTriggerTask() {
|
243
|
+
this._triggeringTask = this._parentTask;
|
244
|
+
}
|
245
|
+
FillTaskTables(taskTablesData) {
|
246
|
+
if (arguments.length === 1) {
|
247
|
+
this.FillTaskTables_0();
|
248
|
+
return;
|
249
|
+
}
|
250
|
+
this.FillTaskTables_1();
|
251
|
+
}
|
252
|
+
FillTaskTables_0() {
|
253
|
+
}
|
254
|
+
fillAttributes() {
|
255
|
+
let parser = RuntimeContextBase.Instance.Parser;
|
256
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
257
|
+
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
258
|
+
super.fillAttributes(parser);
|
259
|
+
if (super.isMainProg())
|
260
|
+
this._mgData = AccessHelper.mgDataTable.getMGData(0);
|
261
|
+
}
|
262
|
+
else {
|
263
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Task.fillAttributes() out of string bounds");
|
264
|
+
}
|
265
|
+
}
|
266
|
+
setAttribute(attribute, valueStr) {
|
267
|
+
let isTagProcessed;
|
268
|
+
isTagProcessed = super.setAttribute(attribute, valueStr);
|
269
|
+
if (!isTagProcessed) {
|
270
|
+
isTagProcessed = true;
|
271
|
+
switch (attribute) {
|
272
|
+
case ConstInterface.MG_ATTR_REFRESHON:
|
273
|
+
if (!(valueStr.trim() === ""))
|
274
|
+
this.SetRefreshOnVars(valueStr);
|
275
|
+
break;
|
276
|
+
case XMLConstants.MG_ATTR_NAME:
|
277
|
+
this.Name = valueStr;
|
278
|
+
break;
|
279
|
+
case ConstInterface.MG_ATTR_DVPOS_DEC:
|
280
|
+
if (!(valueStr.trim() === ""))
|
281
|
+
this.setDescriptor(valueStr);
|
282
|
+
break;
|
283
|
+
case ConstInterface.MG_ATTR_HAS_LOCATE:
|
284
|
+
if (+valueStr == 1)
|
285
|
+
this.hasLocate = true;
|
286
|
+
break;
|
287
|
+
case ConstInterface.MG_ATTR_AS_PARENT:
|
288
|
+
if (+valueStr == 1)
|
289
|
+
this.ModeAsParent = true;
|
290
|
+
break;
|
291
|
+
case ConstInterface.MG_ATTR_TASK_UNIQUE_SORT:
|
292
|
+
this.UniqueSort = valueStr[0];
|
293
|
+
break;
|
294
|
+
case ConstInterface.MG_ATTR_TRANS_ID:
|
295
|
+
this.setRemoteTransaction(valueStr);
|
296
|
+
break;
|
297
|
+
case ConstInterface.MG_ATTR_PUBLIC:
|
298
|
+
this.PublicName = XmlParser.unescape(valueStr);
|
299
|
+
break;
|
300
|
+
case XMLConstants.MG_ATTR_IS_OFFLINE:
|
301
|
+
this.IsOffline = XmlParser.getBoolean(valueStr);
|
302
|
+
break;
|
303
|
+
case XMLConstants.MG_ATTR_RETURN_VALUE_EXP:
|
304
|
+
this.RetrunValueExp = XmlParser.getInt(valueStr);
|
305
|
+
break;
|
306
|
+
case XMLConstants.MG_ATTR_MENUS_FILE_NAME:
|
307
|
+
break;
|
308
|
+
default:
|
309
|
+
isTagProcessed = false;
|
310
|
+
break;
|
311
|
+
}
|
312
|
+
}
|
313
|
+
if (!isTagProcessed)
|
314
|
+
Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
|
315
|
+
return true;
|
316
|
+
}
|
317
|
+
async initInnerObjects(foundTagName, parentForm) {
|
318
|
+
if (foundTagName == null)
|
319
|
+
return false;
|
320
|
+
let parser = RuntimeContextBase.Instance.Parser;
|
321
|
+
switch (foundTagName) {
|
322
|
+
case XMLConstants.MG_TAG_HELPTABLE:
|
323
|
+
if (this._helpTab == null)
|
324
|
+
this._helpTab = new Helps();
|
325
|
+
if (Events.ShouldLog(Logger_LogLevels.Development))
|
326
|
+
Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
|
327
|
+
this._helpTab.fillData(parser);
|
328
|
+
break;
|
329
|
+
case XMLConstants.MG_TAG_DVHEADER:
|
330
|
+
if (Events.ShouldLog(Logger_LogLevels.Development))
|
331
|
+
Events.WriteDevToLog(NString.Format("{0} ...", foundTagName));
|
332
|
+
this.DataView.fillHeaderData(parser);
|
333
|
+
break;
|
334
|
+
case XMLConstants.MG_TAG_PROP:
|
335
|
+
this._propTab.fillData(this, 'T', parser);
|
336
|
+
break;
|
337
|
+
case XMLConstants.MG_TAG_FORM:
|
338
|
+
this.Form = this.FormInitData(parentForm);
|
339
|
+
break;
|
340
|
+
case XMLConstants.MG_ATTR_MENU_CONTENT:
|
341
|
+
break;
|
342
|
+
case "assemblies":
|
343
|
+
let endContext = parser.getXMLdata().indexOf('/assemblies', parser.getCurrIndex());
|
344
|
+
parser.setCurrIndex(endContext);
|
345
|
+
parser.setCurrIndex2EndOfTag();
|
346
|
+
break;
|
347
|
+
case XMLConstants.MG_TAG_FORMS:
|
348
|
+
this._forms = new FormsTable(this, parentForm);
|
349
|
+
Logger.Instance.WriteDevToLog(NString.Format("{0} ...", foundTagName));
|
350
|
+
await this._forms.fillData();
|
351
|
+
break;
|
352
|
+
case XMLConstants.MG_TAG_TASK:
|
353
|
+
if (this.SubTasks == null)
|
354
|
+
this.SubTasks = new TasksTable();
|
355
|
+
let subtask = new Task(this);
|
356
|
+
subtask.Init();
|
357
|
+
this.SubTasks.addTask(subtask);
|
358
|
+
let mgd = this._mgData;
|
359
|
+
if (this.isMainProg())
|
360
|
+
mgd = AccessHelper.mgDataTable.GetMGDataForStartupProgram();
|
361
|
+
await subtask.fillData(mgd, new OpeningTaskDetails());
|
362
|
+
break;
|
363
|
+
case ConstInterface.MG_TAG_TASKURL:
|
364
|
+
await Task.ProcessTaskURL();
|
365
|
+
break;
|
366
|
+
case ConstInterface.MG_TAG_EXPTABLE:
|
367
|
+
if (this.ExpTab == null)
|
368
|
+
this.ExpTab = new ExpTable();
|
369
|
+
Logger.Instance.WriteDevToLog("goes to exp");
|
370
|
+
this.ExpTab.fillData(this, parser);
|
371
|
+
break;
|
372
|
+
case ConstInterface.MG_TAG_USER_EVENTS:
|
373
|
+
if (this.UserEvtTab == null)
|
374
|
+
this.UserEvtTab = new UserEventsTable();
|
375
|
+
Logger.Instance.WriteDevToLog("goes to user event tab");
|
376
|
+
this.UserEvtTab.fillData(this, parser);
|
377
|
+
break;
|
378
|
+
case ConstInterface.MG_TAG_LINKS:
|
379
|
+
this.DataviewHeadersTable = new DataviewHeaders(this);
|
380
|
+
this.DataviewHeadersTable.fillData(parser);
|
381
|
+
break;
|
382
|
+
case ConstInterface.MG_TAG_SORTS:
|
383
|
+
this.RuntimeSorts = new SortCollection();
|
384
|
+
this.RuntimeSorts.fillData(parser);
|
385
|
+
break;
|
386
|
+
case ConstInterface.MG_TAG_TASK_TABLES:
|
387
|
+
this.FillTaskTables();
|
388
|
+
break;
|
389
|
+
case XMLConstants.MG_TAG_RECOMPUTE:
|
390
|
+
Logger.Instance.WriteDevToLog("goes to recompute");
|
391
|
+
this.RecomputeFillData(parser);
|
392
|
+
break;
|
393
|
+
case ConstInterface.MG_TAG_EVENTHANDLERS:
|
394
|
+
Logger.Instance.WriteDevToLog("goes to eventhandlers");
|
395
|
+
if (this.HandlersTab == null)
|
396
|
+
this.HandlersTab = new HandlersTable();
|
397
|
+
this.HandlersTab.fillData(this, parser);
|
398
|
+
this.addExpHandlersToMGData();
|
399
|
+
break;
|
400
|
+
default:
|
401
|
+
if (foundTagName === ("/" + XMLConstants.MG_TAG_TASK)) {
|
402
|
+
RuntimeContextBase.Instance.Parser.setCurrIndex2EndOfTag();
|
403
|
+
return false;
|
404
|
+
}
|
405
|
+
else {
|
406
|
+
Logger.Instance.WriteDevToLog("There is no such tag in Task.initInnerObjects . Enter case for " + foundTagName);
|
407
|
+
return false;
|
408
|
+
}
|
409
|
+
}
|
410
|
+
return true;
|
411
|
+
}
|
412
|
+
RecomputeFillData(parser) {
|
413
|
+
let recomputeTable = new RecomputeTable();
|
414
|
+
recomputeTable.fillData_1(this.DataView, this, parser);
|
415
|
+
}
|
416
|
+
FillTaskTables_1() {
|
417
|
+
let parser = RuntimeContextBase.Instance.Parser;
|
418
|
+
let endContext = parser.getXMLdata().indexOf(ConstInterface.MG_TAG_TASK_TABLES_END, parser.getCurrIndex());
|
419
|
+
endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, endContext) + XMLConstants.TAG_CLOSE.length;
|
420
|
+
let taskTablesData = parser.getXMLsubstring(endContext);
|
421
|
+
this.FillTaskTables(taskTablesData);
|
422
|
+
parser.setCurrIndex(endContext);
|
423
|
+
}
|
424
|
+
addExpHandlersToMGData() {
|
425
|
+
let idx = 0;
|
426
|
+
for (let i = this.HandlersTab.getSize() - 1; i >= 0; i--) {
|
427
|
+
let handler = this.HandlersTab.getHandler(i);
|
428
|
+
let evt = handler.getEvent();
|
429
|
+
if (evt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION ||
|
430
|
+
(evt.getType() === ConstInterface.EVENT_TYPE_USER && evt.getUserEventType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
|
431
|
+
this._mgData.addExpHandler(handler, idx);
|
432
|
+
idx++;
|
433
|
+
}
|
434
|
+
}
|
435
|
+
}
|
436
|
+
SetRefreshOnVars(variables) {
|
437
|
+
let strTok = StrUtil.tokenize(variables, ",");
|
438
|
+
let fldNum;
|
439
|
+
let intVals = new List();
|
440
|
+
let i;
|
441
|
+
for (i = 0; i < strTok.length; i++) {
|
442
|
+
fldNum = NNumber.Parse(strTok[i]);
|
443
|
+
intVals.push(fldNum);
|
444
|
+
}
|
445
|
+
this.RefreshOnVars = new Array(intVals.length);
|
446
|
+
for (i = 0; i < intVals.length; i++) {
|
447
|
+
fldNum = intVals.get_Item(i);
|
448
|
+
this.RefreshOnVars[i] = fldNum;
|
449
|
+
}
|
450
|
+
}
|
451
|
+
setDataSynced(synced) {
|
452
|
+
this.DataSynced = synced;
|
453
|
+
}
|
454
|
+
getField(fldName) {
|
455
|
+
return this.DataView.getFieldByName(fldName);
|
456
|
+
}
|
457
|
+
getExpById(id) {
|
458
|
+
if (this.ExpTab !== null)
|
459
|
+
return this.ExpTab.getExpById(id);
|
460
|
+
else
|
461
|
+
Logger.Instance.WriteExceptionToLogWithMsg("in Task.GetExpById(): no expression table");
|
462
|
+
return null;
|
463
|
+
}
|
464
|
+
getExpObjectById(id) {
|
465
|
+
return this.getExpById(id);
|
466
|
+
}
|
467
|
+
GetExpressionStorage(expId) {
|
468
|
+
let result = null;
|
469
|
+
if (expId > 0) {
|
470
|
+
let expById = this.getExpById(expId);
|
471
|
+
Debug.Assert(expById !== null);
|
472
|
+
result = expById.GetStorageAttribute();
|
473
|
+
}
|
474
|
+
return result;
|
475
|
+
}
|
476
|
+
async CalculateExpression(expId, resType, length) {
|
477
|
+
let result = null;
|
478
|
+
if (expId > 0) {
|
479
|
+
let expById = this.getExpById(expId);
|
480
|
+
Debug.Assert(expById !== null);
|
481
|
+
result = await expById.evaluateWithResultTypeAndLength(resType, length);
|
482
|
+
}
|
483
|
+
return result;
|
484
|
+
}
|
485
|
+
async insertRecordTable(invalidate, parser) {
|
486
|
+
if (await this.isCached()) {
|
487
|
+
let firstTime = this.DataView.getFirstDv();
|
488
|
+
if (!firstTime && invalidate) {
|
489
|
+
if (!this.hasLocate) {
|
490
|
+
if (this.DataView.IncludesFirst()) {
|
491
|
+
if (!this.DataView.getChanged())
|
492
|
+
this._dvCache.putInCache(this.DataView.replicate());
|
493
|
+
else
|
494
|
+
this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
|
495
|
+
}
|
496
|
+
}
|
497
|
+
else
|
498
|
+
this.locatePutInCache();
|
499
|
+
}
|
500
|
+
}
|
501
|
+
await this.DataView.fillData(parser);
|
502
|
+
if (invalidate)
|
503
|
+
this.DataView.setChanged(false);
|
504
|
+
}
|
505
|
+
getHandlersTab() {
|
506
|
+
return this.HandlersTab;
|
507
|
+
}
|
508
|
+
async buildXML(message) {
|
509
|
+
this.IsAfterRetryBeforeBuildXML = this.getAfterRetry();
|
510
|
+
if (this.KnownToServer && !this.IsOffline) {
|
511
|
+
message.Append(XMLConstants.START_TAG + XMLConstants.MG_TAG_TASK);
|
512
|
+
message.Append(" " + XMLConstants.MG_ATTR_TASKID + "=\"" + this.getTaskTag() + "\"");
|
513
|
+
message.Append(" " + ConstInterface.MG_ATTR_TASK_MAINLEVEL + "=\"" + this.getMainLevel() + "\"");
|
514
|
+
message.Append(XMLConstants.TAG_CLOSE);
|
515
|
+
await this.DataView.buildXML(message);
|
516
|
+
if (this.Form != null && this.Form.Opened)
|
517
|
+
message.Append(this.Form.GetHiddenControlListXML());
|
518
|
+
message.Append("\n </" + XMLConstants.MG_TAG_TASK + XMLConstants.TAG_CLOSE);
|
519
|
+
}
|
520
|
+
}
|
521
|
+
buildXMLForRngs(message, UserRanges, locate) {
|
522
|
+
let i;
|
523
|
+
let fld;
|
524
|
+
let cellAttr = StorageAttribute.SKIP;
|
525
|
+
let toBase64 = (Environment.Instance.GetDebugLevel() <= 1);
|
526
|
+
message.Append(XMLConstants.TAG_CLOSE);
|
527
|
+
for (i = 0; i < UserRanges.length; i++) {
|
528
|
+
message.Append(XMLConstants.START_TAG + ConstInterface.USER_RNG);
|
529
|
+
let rng = UserRanges.get_Item(i);
|
530
|
+
message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + rng.veeIdx + "\"");
|
531
|
+
fld = this.DataView.getField(rng.veeIdx - 1);
|
532
|
+
let fldAttr = fld.getType();
|
533
|
+
if (rng.nullMin)
|
534
|
+
message.Append(" " + ConstInterface.NULL_MIN_RNG + "=\"1\"");
|
535
|
+
if (!rng.discardMin && rng.min != null) {
|
536
|
+
let val = RecordUtils.itemValToXML(rng.min, fldAttr, cellAttr, toBase64);
|
537
|
+
message.Append(" " + ConstInterface.MIN_RNG + "=\"" + val + "\"");
|
538
|
+
}
|
539
|
+
if (rng.nullMax)
|
540
|
+
message.Append(" " + ConstInterface.NULL_MAX_RNG + "=\"1\"");
|
541
|
+
if (!rng.discardMax && rng.max != null) {
|
542
|
+
let val = RecordUtils.itemValToXML(rng.max, fldAttr, cellAttr, toBase64);
|
543
|
+
message.Append(" " + ConstInterface.MAX_RNG + "=\"" + val + "\"");
|
544
|
+
}
|
545
|
+
message.Append(XMLConstants.TAG_TERM);
|
546
|
+
}
|
547
|
+
if (locate)
|
548
|
+
message.Append(XMLConstants.END_TAG + ConstInterface.USER_LOCATES + XMLConstants.TAG_CLOSE);
|
549
|
+
else
|
550
|
+
message.Append(XMLConstants.END_TAG + ConstInterface.USER_RANGES + XMLConstants.TAG_CLOSE);
|
551
|
+
}
|
552
|
+
buildXMLForSorts(message) {
|
553
|
+
if (this.UserSorts != null && this.UserSorts.length > 0) {
|
554
|
+
let i;
|
555
|
+
for (i = 0; i < this.UserSorts.length; i++) {
|
556
|
+
message.Append(XMLConstants.TAG_CLOSE);
|
557
|
+
let srt = this.UserSorts.get_Item(i);
|
558
|
+
message.Append(XMLConstants.START_TAG + ConstInterface.SORT);
|
559
|
+
message.Append(" " + XMLConstants.MG_TAG_FLD + "=\"" + srt.fldIdx + "\"");
|
560
|
+
if (srt.dir)
|
561
|
+
message.Append(" " + ConstInterface.MG_ATTR_DIR + "=\"1\"");
|
562
|
+
message.Append(XMLConstants.TAG_TERM);
|
563
|
+
}
|
564
|
+
this.UserSorts.Clear();
|
565
|
+
this.UserSorts = null;
|
566
|
+
message.Append(XMLConstants.END_TAG + ConstInterface.MG_TAG_SORTS + XMLConstants.TAG_CLOSE);
|
567
|
+
}
|
568
|
+
}
|
569
|
+
getUserEvent(idx) {
|
570
|
+
Debug.Assert(this.UserEvtTab !== null);
|
571
|
+
let retEvent = null;
|
572
|
+
if (this.UserEvtTab !== null)
|
573
|
+
retEvent = this.UserEvtTab.getEvent(idx);
|
574
|
+
return retEvent;
|
575
|
+
}
|
576
|
+
SetMoveToFirstControl(moveToFirstControl) {
|
577
|
+
if (moveToFirstControl || !this.IsSubForm) {
|
578
|
+
if (this.Form !== null) {
|
579
|
+
let alreadyMoved = this.Form.alreadyMovedToFirstControl();
|
580
|
+
if (!alreadyMoved)
|
581
|
+
this.Form.MovedToFirstControl = true;
|
582
|
+
}
|
583
|
+
}
|
584
|
+
}
|
585
|
+
async Start(moveToFirstControl, callByDestSubForm) {
|
586
|
+
let nonInteractiveTask = null;
|
587
|
+
if (!this._isStarted) {
|
588
|
+
this._isStarted = true;
|
589
|
+
this.InitializeExecution();
|
590
|
+
this.InStartProcess = true;
|
591
|
+
let result = await this.Setup();
|
592
|
+
if (!result.Success)
|
593
|
+
return null;
|
594
|
+
this._inProcessingTopMostEndTaskSaved = AccessHelper.eventsManager.getProcessingTopMostEndTask();
|
595
|
+
AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
|
596
|
+
await this.EnableActions();
|
597
|
+
result = await this.InitializeForm(moveToFirstControl);
|
598
|
+
if (!result.Success)
|
599
|
+
return null;
|
600
|
+
if (!this.IsInteractive && !this._isMainPrg)
|
601
|
+
nonInteractiveTask = this;
|
602
|
+
this.DataViewWasRetrieved = true;
|
603
|
+
let subTasks = this.SubTasks;
|
604
|
+
if (this.isMainProg())
|
605
|
+
this.SubTasks = null;
|
606
|
+
if (this.isMainProg())
|
607
|
+
this.SubTasks = subTasks;
|
608
|
+
if (!result.Success)
|
609
|
+
return null;
|
610
|
+
if (this._aborting)
|
611
|
+
return null;
|
612
|
+
let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.FirstChunk);
|
613
|
+
result = await this.DataviewManager.Execute(dataViewCommand);
|
614
|
+
if (!result.Success)
|
615
|
+
return null;
|
616
|
+
this.ResumeSubformLayout();
|
617
|
+
}
|
618
|
+
nonInteractiveTask = await this.StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm);
|
619
|
+
this.InStartProcess = false;
|
620
|
+
return nonInteractiveTask;
|
621
|
+
}
|
622
|
+
InitializeExecution() {
|
623
|
+
super.setBrkLevel(ConstInterface.BRK_LEVEL_REC_MAIN, -1);
|
624
|
+
this._firstRecordCycle = true;
|
625
|
+
this._currStartProgLevel = ((this.IsSubForm && this.getParent().getForm().alreadyMovedToFirstControl())
|
626
|
+
? this.getParent()._currStartProgLevel
|
627
|
+
: Task.StartProgLevel);
|
628
|
+
}
|
629
|
+
async InitializeForm(moveToFirstControl) {
|
630
|
+
if (this.Form !== null) {
|
631
|
+
this.SetMoveToFirstControl(moveToFirstControl);
|
632
|
+
AccessHelper.eventsManager.pushNewExecStacks();
|
633
|
+
this.routeParams = this.DataView.GetRouteParams();
|
634
|
+
await this.InitForm();
|
635
|
+
AccessHelper.eventsManager.popNewExecStacks();
|
636
|
+
this.getMGData().StartTimers();
|
637
|
+
Commands.beginInvoke();
|
638
|
+
}
|
639
|
+
return new ReturnResult();
|
640
|
+
}
|
641
|
+
async StartSubTasks(moveToFirstControl, nonInteractiveTask, callByDestSubForm) {
|
642
|
+
if (this.hasSubTasks()) {
|
643
|
+
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
|
644
|
+
let task = this.SubTasks.getTask(i);
|
645
|
+
let tmpNonInteractiveTask = await task.Start(moveToFirstControl, callByDestSubForm);
|
646
|
+
if (nonInteractiveTask === null)
|
647
|
+
nonInteractiveTask = tmpNonInteractiveTask;
|
648
|
+
else if (tmpNonInteractiveTask !== null)
|
649
|
+
Debug.Assert(false, "more than 1 non interactive in task.start");
|
650
|
+
}
|
651
|
+
}
|
652
|
+
return nonInteractiveTask;
|
653
|
+
}
|
654
|
+
async EnableActions() {
|
655
|
+
let actList = ActionManager.actEnabled;
|
656
|
+
this.ActionManager.enableList(actList, true, false);
|
657
|
+
if (this.IsSubForm)
|
658
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_POST_REFRESH_BY_PARENT, true);
|
659
|
+
await this.enableModes();
|
660
|
+
if (await this.checkProp(PropInterface.PROP_TYPE_SELECTION, false)) {
|
661
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_SELECT, true);
|
662
|
+
}
|
663
|
+
let enablePrintdata = await this.checkProp(PropInterface.PROP_TYPE_PRINT_DATA, false);
|
664
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_PRINT_DATA, enablePrintdata);
|
665
|
+
if (this.getEnableZoomHandler())
|
666
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_ZOOM, true);
|
667
|
+
}
|
668
|
+
async ShowError(text) {
|
669
|
+
let mlsTransText = LanguageData.Instance.translate(text);
|
670
|
+
let mlsTransTitle = LanguageData.Instance.translate(ConstInterface.ERROR_STRING);
|
671
|
+
await GUIManager.Instance.MessageBox(mlsTransTitle, mlsTransText, Styles.MSGBOX_ICON_ERROR | Styles.MSGBOX_BUTTON_OK);
|
672
|
+
}
|
673
|
+
async EndTaskOnError(result, displayError) {
|
674
|
+
if (!result.Success && !this.isAborting()) {
|
675
|
+
if (this.InStartProcess) {
|
676
|
+
await this.endTask(false, false, false);
|
677
|
+
if (displayError)
|
678
|
+
await this.ShowError(result.ErrorDescription);
|
679
|
+
this.InStartProcess = false;
|
680
|
+
return true;
|
681
|
+
}
|
682
|
+
else {
|
683
|
+
if (displayError)
|
684
|
+
await this.ShowError(result.ErrorDescription);
|
685
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_EXIT);
|
686
|
+
}
|
687
|
+
}
|
688
|
+
return false;
|
689
|
+
}
|
690
|
+
async Setup() {
|
691
|
+
let result;
|
692
|
+
this.TaskService.InitTaskPrefixExecutedFlag(this);
|
693
|
+
this.TaskSuffixExecuted = false;
|
694
|
+
TaskServiceBase.CreateFirstRecord(this);
|
695
|
+
let dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Init);
|
696
|
+
result = await this.DataviewManager.Execute(dataViewCommand);
|
697
|
+
if (!result.Success)
|
698
|
+
return result;
|
699
|
+
if (result.Success) {
|
700
|
+
let commands = GlobalCommandsManager.Instance.getCommandsExecutedAfterTaskStarted();
|
701
|
+
for (let cmdIdx = 0; cmdIdx < commands.length; cmdIdx++) {
|
702
|
+
let command = (commands.get_Item(cmdIdx));
|
703
|
+
if (command.TaskTag === this.getTaskTag()) {
|
704
|
+
await command.Execute(null);
|
705
|
+
GlobalCommandsManager.Instance.removeCommandsExecutedAfterTaskStarted(command);
|
706
|
+
}
|
707
|
+
}
|
708
|
+
dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Prepare);
|
709
|
+
result = await this.DataviewManager.Execute(dataViewCommand);
|
710
|
+
}
|
711
|
+
if (result.Success) {
|
712
|
+
result = this.TaskService.PrepareTask(this);
|
713
|
+
if (!result.Success)
|
714
|
+
await this.EndTaskOnError(result, true);
|
715
|
+
}
|
716
|
+
if (result.Success) {
|
717
|
+
dataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.InitDataControlViews);
|
718
|
+
result = await this.DataviewManager.Execute(dataViewCommand);
|
719
|
+
}
|
720
|
+
return result;
|
721
|
+
}
|
722
|
+
async doFirstRecordCycle() {
|
723
|
+
if (!this._isMainPrg) {
|
724
|
+
AccessHelper.eventsManager.pushNewExecStacks();
|
725
|
+
this.SubformExecMode = Task_SubformExecModeEnum.FIRST_TIME;
|
726
|
+
await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(this, InternalInterface.MG_ACT_REC_PREFIX, this.IsSubForm);
|
727
|
+
if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
728
|
+
if (this.IsSubForm) {
|
729
|
+
if (this.hasSubTasks())
|
730
|
+
for (let i = 0; i < this.SubTasks.getSize(); i++) {
|
731
|
+
let subTask = this.SubTasks.getTask(i);
|
732
|
+
if (subTask.IsSubForm) {
|
733
|
+
subTask.getForm().IgnoreFirstRecordCycle = true;
|
734
|
+
await subTask.doFirstRecordCycle();
|
735
|
+
}
|
736
|
+
}
|
737
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
|
738
|
+
}
|
739
|
+
}
|
740
|
+
this.SubformExecMode = Task_SubformExecModeEnum.SET_FOCUS;
|
741
|
+
AccessHelper.eventsManager.popNewExecStacks();
|
742
|
+
}
|
743
|
+
}
|
744
|
+
CheckAndSetSubForm() {
|
745
|
+
this.IsSubForm = (!super.isMainProg() && this !== this._mgData.getFirstTask());
|
746
|
+
}
|
747
|
+
IsRoute() {
|
748
|
+
return (this.RouterPath != null);
|
749
|
+
}
|
750
|
+
async stop() {
|
751
|
+
let task;
|
752
|
+
if (this._aborting)
|
753
|
+
return;
|
754
|
+
if (this.hasSubTasks()) {
|
755
|
+
while ((task = this.SubTasks.getTask(0)) != null) {
|
756
|
+
task.setDestinationSubform(this._destinationSubform);
|
757
|
+
await task.stop();
|
758
|
+
}
|
759
|
+
}
|
760
|
+
if (!this._isMainPrg)
|
761
|
+
this._aborting = true;
|
762
|
+
if (this._parentTask != null) {
|
763
|
+
this._parentTask.removeSubTask(this);
|
764
|
+
if (this.IsSubForm) {
|
765
|
+
let oldTimers = new List(), newTimers = new List();
|
766
|
+
let mgd = this.getMGData();
|
767
|
+
if (mgd.getTimerHandlers() != null)
|
768
|
+
oldTimers = mgd.getTimerHandlers().getTimersVector();
|
769
|
+
mgd.removeTimerHandler(this);
|
770
|
+
mgd.removeExpressionHandler(this);
|
771
|
+
if (mgd.getTimerHandlers() != null)
|
772
|
+
newTimers = mgd.getTimerHandlers().getTimersVector();
|
773
|
+
mgd.changeTimers(oldTimers, newTimers);
|
774
|
+
mgd.removeTask(this);
|
775
|
+
GUIManager.Instance.abort(this.getForm());
|
776
|
+
}
|
777
|
+
}
|
778
|
+
this.AbortTransaction();
|
779
|
+
if (this.getClickedControl() != null)
|
780
|
+
RuntimeContextBase.Instance.CurrentClickedCtrl = null;
|
781
|
+
if (this.Form != null)
|
782
|
+
this.Form.removeRefsToCtrls();
|
783
|
+
if (this.IsSubForm) {
|
784
|
+
let subForm = this.Form.getSubFormCtrl();
|
785
|
+
subForm.setSubformTaskId(null);
|
786
|
+
subForm.initSubformTask();
|
787
|
+
if (LastFocusedManager.Instance.getLastFocusedTask() === this)
|
788
|
+
LastFocusedManager.Instance.setLastFocusedTask(this._parentTask);
|
789
|
+
if (subForm.SubformLoaded)
|
790
|
+
await (subForm.getProp(PropInterface.PROP_TYPE_VISIBLE)).RefreshDisplay(true);
|
791
|
+
}
|
792
|
+
let clearDataViewCommand = CommandFactory.CreateDataViewCommand(this.getTaskTag(), DataViewCommandType.Clear);
|
793
|
+
await this.DataviewManager.Execute(clearDataViewCommand);
|
794
|
+
}
|
795
|
+
abort() {
|
796
|
+
this.getMGData().abort();
|
797
|
+
}
|
798
|
+
hasSubTasks() {
|
799
|
+
return this.SubTasks !== null && this.SubTasks.getSize() > 0;
|
800
|
+
}
|
801
|
+
getTaskDepth(byParentOrder) {
|
802
|
+
if (byParentOrder)
|
803
|
+
return this.getTaskDepth_(byParentOrder);
|
804
|
+
let depth = this.GetContextTask().getTaskDepth_(byParentOrder);
|
805
|
+
if (this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
|
806
|
+
depth = depth + 1;
|
807
|
+
return depth;
|
808
|
+
}
|
809
|
+
getTaskDepth_(byParentOrder) {
|
810
|
+
let tmpTask = this.getTriggeringTask();
|
811
|
+
if (tmpTask == null || byParentOrder)
|
812
|
+
if (this._parentTask == null)
|
813
|
+
return 1;
|
814
|
+
else {
|
815
|
+
if (byParentOrder && this.getCtlIdx() !== this._parentTask.getCtlIdx())
|
816
|
+
return 2 + this._parentTask.getTaskDepth_(byParentOrder);
|
817
|
+
return 1 + this._parentTask.getTaskDepth_(byParentOrder);
|
818
|
+
}
|
819
|
+
return 1 + (tmpTask).getTaskDepth_(byParentOrder);
|
820
|
+
}
|
821
|
+
GetTaskAncestor(generation) {
|
822
|
+
return this.getTaskAncestor_(generation);
|
823
|
+
}
|
824
|
+
getTaskAncestor_(generation) {
|
825
|
+
let retTask = null;
|
826
|
+
if (generation === 0)
|
827
|
+
retTask = this;
|
828
|
+
else {
|
829
|
+
let tmpTask = this.getTriggeringTask();
|
830
|
+
if (tmpTask === null)
|
831
|
+
tmpTask = this._parentTask;
|
832
|
+
if (tmpTask !== null)
|
833
|
+
retTask = tmpTask.getTaskAncestor_(--generation);
|
834
|
+
}
|
835
|
+
return retTask;
|
836
|
+
}
|
837
|
+
GetTaskDepth() {
|
838
|
+
return this.getTaskDepth(false);
|
839
|
+
}
|
840
|
+
pathContains(task) {
|
841
|
+
return this._taskPath.Contains(task);
|
842
|
+
}
|
843
|
+
SetContextTask(context) {
|
844
|
+
this.ContextTask = context;
|
845
|
+
}
|
846
|
+
GetContextTask() {
|
847
|
+
let currRec = (this.DataView.getCurrRec());
|
848
|
+
if (this.InStartProcess
|
849
|
+
|| currRec !== null && (currRec.InCompute || currRec.InRecompute)
|
850
|
+
|| this.Form !== null && this.Form.inRefreshDisplay())
|
851
|
+
return this;
|
852
|
+
return this.ContextTask;
|
853
|
+
}
|
854
|
+
getTriggeringTask() {
|
855
|
+
if (this._triggeringTask !== null && this._triggeringTask.getMGData().IsAborting)
|
856
|
+
this._triggeringTask = this._parentTask;
|
857
|
+
return this._triggeringTask;
|
858
|
+
}
|
859
|
+
setLastParkedCtrl(ctrl) {
|
860
|
+
super.setLastParkedCtrl(ctrl);
|
861
|
+
LastFocusedManager.setLastFocusedControl(this, ctrl);
|
862
|
+
}
|
863
|
+
queryTaskPath() {
|
864
|
+
let insertedNames = 0;
|
865
|
+
let result = new StringBuilder(7936);
|
866
|
+
let treeRoute = new Array(this.getTaskDepth(false));
|
867
|
+
this.pathToRoot(treeRoute, false);
|
868
|
+
for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
|
869
|
+
let currTsk = treeRoute[tsk];
|
870
|
+
if (currTsk.isMainProg())
|
871
|
+
continue;
|
872
|
+
let nameProp = currTsk.getProp(PropInterface.PROP_TYPE_NAME);
|
873
|
+
if (nameProp == null)
|
874
|
+
continue;
|
875
|
+
let name = nameProp.GetComputedValue();
|
876
|
+
if (!NString.IsNullOrEmpty(name)) {
|
877
|
+
if (insertedNames++ !== 0)
|
878
|
+
result.Append(';');
|
879
|
+
result.Append(name);
|
880
|
+
}
|
881
|
+
}
|
882
|
+
return result;
|
883
|
+
}
|
884
|
+
ctl_itm_2_parent_vee(itm) {
|
885
|
+
let currTsk;
|
886
|
+
let currItm = 0;
|
887
|
+
let lastItm = 0;
|
888
|
+
let treeRoute = new Array(this.getTaskDepth(true));
|
889
|
+
this.pathToRoot(treeRoute, true);
|
890
|
+
for (let tsk = treeRoute.length - 1; tsk >= 0; tsk--) {
|
891
|
+
currTsk = treeRoute[tsk];
|
892
|
+
currItm += currTsk.DataView.GetFieldsTab().getSize();
|
893
|
+
if (itm < currItm) {
|
894
|
+
itm -= lastItm;
|
895
|
+
return currTsk.DataView.getField(itm);
|
896
|
+
}
|
897
|
+
lastItm = currItm;
|
898
|
+
}
|
899
|
+
return null;
|
900
|
+
}
|
901
|
+
GetControlIDFromVarItem(item) {
|
902
|
+
let currTask;
|
903
|
+
let currItem = 0;
|
904
|
+
let lastItem = 0;
|
905
|
+
let noOfControlsBeforeCurrTask = 0;
|
906
|
+
let treeRoute = new Array(this.getTaskDepth(true));
|
907
|
+
this.pathToRoot(treeRoute, true);
|
908
|
+
for (let task = treeRoute.length - 1; task >= 0; task--) {
|
909
|
+
currTask = treeRoute[task];
|
910
|
+
currItem += currTask.DataView.GetFieldsTab().getSize();
|
911
|
+
if (item < currItem) {
|
912
|
+
item -= lastItem;
|
913
|
+
let field = currTask.DataView.getField(item);
|
914
|
+
if (field.getCtrl() != null)
|
915
|
+
return noOfControlsBeforeCurrTask = noOfControlsBeforeCurrTask + currTask.Form.getControlIdx(field.getCtrl()) + 1;
|
916
|
+
return 0;
|
917
|
+
}
|
918
|
+
if (currTask.Form != null)
|
919
|
+
noOfControlsBeforeCurrTask += currTask.Form.getCtrlCount();
|
920
|
+
lastItem = currItem;
|
921
|
+
}
|
922
|
+
return 0;
|
923
|
+
}
|
924
|
+
GetControlFromControlID(controlID, parent) {
|
925
|
+
let control = null;
|
926
|
+
parent.value = -1;
|
927
|
+
if (controlID >= 0) {
|
928
|
+
let currTask = null;
|
929
|
+
let callerTask = null;
|
930
|
+
let noOfControlsInCurrtask = 0;
|
931
|
+
let noOfControlsBeforeCurrTask = 0;
|
932
|
+
let controlIdx = 0;
|
933
|
+
let treeRoute = new Array(this.getTaskDepth(true));
|
934
|
+
this.pathToRoot(treeRoute, true);
|
935
|
+
for (let task = treeRoute.length - 1; task >= 0; task--) {
|
936
|
+
currTask = treeRoute[task];
|
937
|
+
if (currTask.Form != null) {
|
938
|
+
noOfControlsInCurrtask = currTask.Form.getCtrlCount();
|
939
|
+
if (controlID < (noOfControlsBeforeCurrTask + noOfControlsInCurrtask)) {
|
940
|
+
controlIdx = controlID - noOfControlsBeforeCurrTask;
|
941
|
+
control = currTask.Form.CtrlTab.getCtrl(controlIdx);
|
942
|
+
callerTask = currTask;
|
943
|
+
break;
|
944
|
+
}
|
945
|
+
noOfControlsBeforeCurrTask += noOfControlsInCurrtask;
|
946
|
+
}
|
947
|
+
}
|
948
|
+
if (control != null) {
|
949
|
+
parent.value = 0;
|
950
|
+
let prevCtlIdx = treeRoute[0].TaskDefinitionId.CtlIndex;
|
951
|
+
for (let task = 0; task < treeRoute.length - 1; task++) {
|
952
|
+
currTask = treeRoute[task];
|
953
|
+
if (prevCtlIdx !== currTask.TaskDefinitionId.CtlIndex)
|
954
|
+
parent.value++;
|
955
|
+
if (callerTask.TaskDefinitionId.CtlIndex === currTask.TaskDefinitionId.CtlIndex)
|
956
|
+
break;
|
957
|
+
prevCtlIdx = currTask.TaskDefinitionId.CtlIndex;
|
958
|
+
}
|
959
|
+
}
|
960
|
+
}
|
961
|
+
return control;
|
962
|
+
}
|
963
|
+
ctl_itm_4_parent_vee(parent, vee) {
|
964
|
+
let tsk;
|
965
|
+
let depth = this.getTaskDepth(true);
|
966
|
+
if (parent !== TaskBase.MAIN_PRG_PARENT_ID && depth <= parent)
|
967
|
+
return vee;
|
968
|
+
let treeRoute = new Array(depth);
|
969
|
+
if (vee !== 0) {
|
970
|
+
this.pathToRoot(treeRoute, true);
|
971
|
+
let indOfParentInTaskTree = this.getIndOfParentInTaskTree(parent, treeRoute);
|
972
|
+
let i;
|
973
|
+
for (i = treeRoute.length - 1; i > indOfParentInTaskTree; i--) {
|
974
|
+
tsk = treeRoute[i];
|
975
|
+
vee += tsk.DataView.GetFieldsTab().getSize();
|
976
|
+
}
|
977
|
+
}
|
978
|
+
return vee;
|
979
|
+
}
|
980
|
+
getIndOfParentInTaskTree(parent, taskTree) {
|
981
|
+
let indOfParentInTaskTree = 0;
|
982
|
+
if (parent === TaskBase.MAIN_PRG_PARENT_ID) {
|
983
|
+
for (let i = 1; i < taskTree.length; i = i + 1) {
|
984
|
+
if (taskTree[i].isMainProg() && this._ctlIdx === taskTree[i].getCtlIdx()) {
|
985
|
+
indOfParentInTaskTree = i;
|
986
|
+
break;
|
987
|
+
}
|
988
|
+
}
|
989
|
+
}
|
990
|
+
else
|
991
|
+
indOfParentInTaskTree = parent;
|
992
|
+
return indOfParentInTaskTree;
|
993
|
+
}
|
994
|
+
getFieldByName(fldName) {
|
995
|
+
return (this.GetContextTask()).getFieldByName_(fldName);
|
996
|
+
}
|
997
|
+
getFieldByName_(fldName) {
|
998
|
+
let tmpTask;
|
999
|
+
if (fldName == null)
|
1000
|
+
return null;
|
1001
|
+
let fld = this.getField(fldName);
|
1002
|
+
if (fld == null) {
|
1003
|
+
tmpTask = this.getTriggeringTask() != null ? this.getTriggeringTask() : this._parentTask;
|
1004
|
+
if (tmpTask != null) {
|
1005
|
+
if (!this.isMainProg() && this.getCtlIdx() !== tmpTask.getCtlIdx()) {
|
1006
|
+
let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, this.getCtlIdx());
|
1007
|
+
fld = mainPrg.getFieldByName_(fldName);
|
1008
|
+
}
|
1009
|
+
if (fld == null)
|
1010
|
+
fld = tmpTask.getFieldByName_(fldName);
|
1011
|
+
}
|
1012
|
+
}
|
1013
|
+
return fld;
|
1014
|
+
}
|
1015
|
+
getIndexOfFieldByName(fldName) {
|
1016
|
+
let depth = this.getTaskDepth(true);
|
1017
|
+
let index = 0;
|
1018
|
+
let fld = this.getFieldByName(fldName);
|
1019
|
+
let fldTab;
|
1020
|
+
if (fld == null)
|
1021
|
+
return 0;
|
1022
|
+
let treeRoute = new Array(depth);
|
1023
|
+
this.pathToRoot(treeRoute, true);
|
1024
|
+
for (let curr = depth - 1; curr >= 0; curr--) {
|
1025
|
+
let currTask = treeRoute[curr];
|
1026
|
+
if (currTask === fld.getTask()) {
|
1027
|
+
curr = fld.getId();
|
1028
|
+
index += ++curr;
|
1029
|
+
break;
|
1030
|
+
}
|
1031
|
+
fldTab = currTask.DataView.GetFieldsTab();
|
1032
|
+
index += fldTab.getSize();
|
1033
|
+
}
|
1034
|
+
return index;
|
1035
|
+
}
|
1036
|
+
pathToRoot(path, byParentOrder) {
|
1037
|
+
let task = (byParentOrder ? this : this.GetContextTask());
|
1038
|
+
for (let i = 0; i < path.length; i++) {
|
1039
|
+
path[i] = task;
|
1040
|
+
let ctlIdx = task.getCtlIdx();
|
1041
|
+
let tmpTask = byParentOrder ? null : task.getTriggeringTask();
|
1042
|
+
if (tmpTask != null)
|
1043
|
+
task = tmpTask;
|
1044
|
+
else {
|
1045
|
+
task = task.getParent();
|
1046
|
+
if (task == null) {
|
1047
|
+
if (!byParentOrder && this.isMainProg() && this.getCtlIdx() !== ConstInterface.TOP_LEVEL_CONTAINER)
|
1048
|
+
path[i + 1] = this;
|
1049
|
+
break;
|
1050
|
+
}
|
1051
|
+
if (byParentOrder && ctlIdx !== task.getCtlIdx())
|
1052
|
+
path[++i] = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
|
1053
|
+
}
|
1054
|
+
}
|
1055
|
+
}
|
1056
|
+
shouldBeRefreshed() {
|
1057
|
+
let dataView = this._parentTask.DataView;
|
1058
|
+
let result = false;
|
1059
|
+
if (this._parentTask === null || dataView.isPrevCurrRecNull() ||
|
1060
|
+
(this.RefreshOnVars !== null && !dataView.currEqualsPrev(this.RefreshOnVars)))
|
1061
|
+
result = true;
|
1062
|
+
return result;
|
1063
|
+
}
|
1064
|
+
async CheckRefreshSubTasks() {
|
1065
|
+
let ret = false;
|
1066
|
+
if (this._enteredRecLevel) {
|
1067
|
+
let subformsToRefresh = await this.GetSubformsToRefresh();
|
1068
|
+
if (subformsToRefresh.length > 0)
|
1069
|
+
ret = true;
|
1070
|
+
}
|
1071
|
+
return ret;
|
1072
|
+
}
|
1073
|
+
GetSubTasks() {
|
1074
|
+
let subTasks = new List();
|
1075
|
+
if (this.hasSubTasks()) {
|
1076
|
+
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1)
|
1077
|
+
subTasks.push(this.SubTasks.getTask(i));
|
1078
|
+
}
|
1079
|
+
return subTasks;
|
1080
|
+
}
|
1081
|
+
async GetSubformsToRefresh() {
|
1082
|
+
let subTasks = this.GetSubTasks();
|
1083
|
+
let subTasksToRefresh = new List();
|
1084
|
+
for (let i = 0; i < subTasks.length; i++) {
|
1085
|
+
let subTask = subTasks.get_Item(i);
|
1086
|
+
if (await this.ShouldRefreshSubformTask(subTask))
|
1087
|
+
subTasksToRefresh.push(subTask);
|
1088
|
+
}
|
1089
|
+
return subTasksToRefresh;
|
1090
|
+
}
|
1091
|
+
async ShouldRefreshSubformTask(subTask) {
|
1092
|
+
let refresh = false;
|
1093
|
+
let subformCtrl = subTask.getForm().getSubFormCtrl();
|
1094
|
+
subTask.DoSubformPrefixSuffix = false;
|
1095
|
+
if (subformCtrl != null && !subTask.InSelect && subTask.AfterFirstRecordPrefix) {
|
1096
|
+
let parentMode = this.getMode();
|
1097
|
+
let modeProperty = (parentMode === Constants.TASK_MODE_QUERY ? PropInterface.PROP_TYPE_ALLOW_QUERY
|
1098
|
+
: parentMode === Constants.TASK_MODE_MODIFY
|
1099
|
+
? PropInterface.PROP_TYPE_ALLOW_MODIFY
|
1100
|
+
: PropInterface.PROP_TYPE_ALLOW_CREATE);
|
1101
|
+
if (subTask.ModeAsParent && parentMode !== subTask.getMode() &&
|
1102
|
+
this.getLevel() === Constants.TASK_LEVEL_RECORD &&
|
1103
|
+
await (subTask.getProp(PropInterface.PROP_TYPE_ALLOW_OPTION)).getValueBoolean() &&
|
1104
|
+
await subTask.checkProp(modeProperty, true)) {
|
1105
|
+
if (!subformCtrl.isVisible() &&
|
1106
|
+
!await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)) {
|
1107
|
+
subformCtrl.RefreshOnVisible = true;
|
1108
|
+
refresh = false;
|
1109
|
+
}
|
1110
|
+
else
|
1111
|
+
refresh = true;
|
1112
|
+
await subTask.SetModeAsParent(parentMode);
|
1113
|
+
}
|
1114
|
+
else {
|
1115
|
+
refresh = await subformCtrl.checkProp(PropInterface.PROP_TYPE_AUTO_REFRESH, true) && subTask.shouldBeRefreshed();
|
1116
|
+
if (refresh) {
|
1117
|
+
if (!subformCtrl.isVisible() &&
|
1118
|
+
!await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false)) {
|
1119
|
+
subformCtrl.RefreshOnVisible = true;
|
1120
|
+
refresh = false;
|
1121
|
+
}
|
1122
|
+
}
|
1123
|
+
}
|
1124
|
+
if (refresh)
|
1125
|
+
subTask.DoSubformPrefixSuffix = true;
|
1126
|
+
}
|
1127
|
+
return refresh;
|
1128
|
+
}
|
1129
|
+
async SetModeAsParent(parentMode) {
|
1130
|
+
await this.enableModes();
|
1131
|
+
if (parentMode === Constants.TASK_MODE_CREATE) {
|
1132
|
+
let cmd = CommandFactory.CreateEventCommand(this.getTaskTag(), InternalInterface.MG_ACT_RTO_CREATE);
|
1133
|
+
await this.DataviewManager.Execute(cmd);
|
1134
|
+
}
|
1135
|
+
else if (this.getMode() === Constants.TASK_MODE_CREATE) {
|
1136
|
+
this.setPreventRecordSuffix(true);
|
1137
|
+
this.setPreventControlChange(true);
|
1138
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_RT_REFRESH_VIEW);
|
1139
|
+
this.setPreventRecordSuffix(false);
|
1140
|
+
this.setPreventControlChange(false);
|
1141
|
+
let subTaskDv = this.DataView;
|
1142
|
+
if (!subTaskDv.isEmpty() && (subTaskDv.getCurrRec()).getMode() !== DataModificationTypes.Insert)
|
1143
|
+
this.setMode(parentMode);
|
1144
|
+
else
|
1145
|
+
this.setMode(Constants.TASK_MODE_CREATE);
|
1146
|
+
await this.getForm().RefreshDisplay(Constants.TASK_REFRESH_CURR_REC);
|
1147
|
+
}
|
1148
|
+
else
|
1149
|
+
this.setMode(parentMode);
|
1150
|
+
this.setOriginalTaskMode(parentMode);
|
1151
|
+
await this.setCreateDeleteActsEnableState();
|
1152
|
+
}
|
1153
|
+
async doSubformRecPrefixSuffix() {
|
1154
|
+
let subTasks = this.GetSubTasks();
|
1155
|
+
for (let i = 0; i < subTasks.length; i++) {
|
1156
|
+
let subTask = subTasks.get_Item(i);
|
1157
|
+
if (subTask.DoSubformPrefixSuffix) {
|
1158
|
+
await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subTask, InternalInterface.MG_ACT_REC_PREFIX, true);
|
1159
|
+
if (!AccessHelper.eventsManager.GetStopExecutionFlag())
|
1160
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_REC_SUFFIX);
|
1161
|
+
}
|
1162
|
+
}
|
1163
|
+
}
|
1164
|
+
CleanDoSubformPrefixSuffix() {
|
1165
|
+
let subTasks = this.GetSubTasks();
|
1166
|
+
for (let i = 0; i < subTasks.length; i++) {
|
1167
|
+
let subTask = subTasks.get_Item(i);
|
1168
|
+
subTask.DoSubformPrefixSuffix = false;
|
1169
|
+
}
|
1170
|
+
}
|
1171
|
+
mustConfirmInDeleteMode() {
|
1172
|
+
let prop = this.getProp(PropInterface.PROP_TYPE_CONFIRM_UPDATE);
|
1173
|
+
return !prop.isExpression();
|
1174
|
+
}
|
1175
|
+
addSubTask(subTask) {
|
1176
|
+
if (this.SubTasks === null)
|
1177
|
+
this.SubTasks = new TasksTable();
|
1178
|
+
this.SubTasks.addTask(subTask);
|
1179
|
+
}
|
1180
|
+
removeSubTask(subTask) {
|
1181
|
+
if (this.SubTasks !== null)
|
1182
|
+
this.SubTasks.removeTask(subTask);
|
1183
|
+
}
|
1184
|
+
setTransactionFailed(val) {
|
1185
|
+
this._transactionFailed = val;
|
1186
|
+
if (!val)
|
1187
|
+
this.TransactionErrorHandlingsRetry = null;
|
1188
|
+
}
|
1189
|
+
transactionFailed(level) {
|
1190
|
+
if (level === ConstInterface.TRANS_NONE ||
|
1191
|
+
(this.Transaction != null && this.Transaction.getLevel() === level))
|
1192
|
+
return this._transactionFailed;
|
1193
|
+
else if (level === ConstInterface.TRANS_NONE ||
|
1194
|
+
(this.TransactionErrorHandlingsRetry != null && this.TransactionErrorHandlingsRetry.getLevel() === level))
|
1195
|
+
return this._transactionFailed;
|
1196
|
+
return false;
|
1197
|
+
}
|
1198
|
+
setAfterRetry(val) {
|
1199
|
+
if (this.Transaction != null)
|
1200
|
+
this.Transaction.setAfterRetry(val);
|
1201
|
+
else if (this.TransactionErrorHandlingsRetry != null) {
|
1202
|
+
if (val === ConstInterface.RECOVERY_NONE)
|
1203
|
+
this.TransactionErrorHandlingsRetry = null;
|
1204
|
+
else
|
1205
|
+
this.TransactionErrorHandlingsRetry.setAfterRetry(val);
|
1206
|
+
}
|
1207
|
+
}
|
1208
|
+
getAfterRetry(recovery) {
|
1209
|
+
if (arguments.length === 0) {
|
1210
|
+
return this.getAfterRetry_0();
|
1211
|
+
}
|
1212
|
+
return this.getAfterRetry_1(recovery);
|
1213
|
+
}
|
1214
|
+
getAfterRetry_0() {
|
1215
|
+
if (this.Transaction != null)
|
1216
|
+
return this.Transaction.getAfterRetry();
|
1217
|
+
else if (this.TransactionErrorHandlingsRetry != null)
|
1218
|
+
return this.TransactionErrorHandlingsRetry.getAfterRetry();
|
1219
|
+
return false;
|
1220
|
+
}
|
1221
|
+
getAfterRetry_1(recovery) {
|
1222
|
+
if (this.Transaction != null)
|
1223
|
+
return this.Transaction.getAfterRetry(recovery);
|
1224
|
+
else if (this.TransactionErrorHandlingsRetry != null)
|
1225
|
+
return this.TransactionErrorHandlingsRetry.getAfterRetry(recovery);
|
1226
|
+
return false;
|
1227
|
+
}
|
1228
|
+
getExecEndTask() {
|
1229
|
+
return this._bExecEndTask;
|
1230
|
+
}
|
1231
|
+
resetExecEndTask() {
|
1232
|
+
this._bExecEndTask = false;
|
1233
|
+
}
|
1234
|
+
setExecEndTask() {
|
1235
|
+
this._bExecEndTask = true;
|
1236
|
+
}
|
1237
|
+
async evalEndCond(mode) {
|
1238
|
+
let endTaskCondProp;
|
1239
|
+
let evalEndCondProp = this.getProp(PropInterface.PROP_TYPE_EVAL_END_CONDITION);
|
1240
|
+
if (this.InEndTask)
|
1241
|
+
return false;
|
1242
|
+
if (this._bExecEndTask)
|
1243
|
+
return true;
|
1244
|
+
if (evalEndCondProp != null && (NString.Compare(await evalEndCondProp.getValue(), ConstInterface.END_COND_EVAL_IMMIDIATE, true) === 0 || ((await evalEndCondProp.getValue()).toLowerCase() === mode.toLowerCase()))) {
|
1245
|
+
endTaskCondProp = this.getProp(PropInterface.PROP_TYPE_END_CONDITION);
|
1246
|
+
if (endTaskCondProp == null)
|
1247
|
+
return false;
|
1248
|
+
let endTask = await endTaskCondProp.getValue();
|
1249
|
+
if (DisplayConvertor.toBoolean(endTask)) {
|
1250
|
+
this._bExecEndTask = true;
|
1251
|
+
return true;
|
1252
|
+
}
|
1253
|
+
return false;
|
1254
|
+
}
|
1255
|
+
return false;
|
1256
|
+
}
|
1257
|
+
setTryingToStop(val) {
|
1258
|
+
if (this.hasSubTasks()) {
|
1259
|
+
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
|
1260
|
+
let task = this.SubTasks.getTask(i);
|
1261
|
+
task.setTryingToStop(val);
|
1262
|
+
}
|
1263
|
+
}
|
1264
|
+
this.IsTryingToStop = val;
|
1265
|
+
}
|
1266
|
+
getInRecordSuffix() {
|
1267
|
+
return this._inRecordSuffix;
|
1268
|
+
}
|
1269
|
+
setInRecordSuffix(bValue) {
|
1270
|
+
if (bValue !== this._inRecordSuffix) {
|
1271
|
+
this._inRecordSuffix = bValue;
|
1272
|
+
return true;
|
1273
|
+
}
|
1274
|
+
return false;
|
1275
|
+
}
|
1276
|
+
setEvalOldValues(bFlag) {
|
1277
|
+
if (bFlag !== this._evalOldValues) {
|
1278
|
+
this._evalOldValues = bFlag;
|
1279
|
+
return true;
|
1280
|
+
}
|
1281
|
+
return false;
|
1282
|
+
}
|
1283
|
+
getEvalOldValues() {
|
1284
|
+
return this._evalOldValues;
|
1285
|
+
}
|
1286
|
+
async endTask(reversibleExit, onlyDescs, dueToVerifyError, subformDestination) {
|
1287
|
+
if (isNullOrUndefined(subformDestination))
|
1288
|
+
return await this.endTask_1(reversibleExit, onlyDescs, false, dueToVerifyError);
|
1289
|
+
else
|
1290
|
+
return await this.endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError);
|
1291
|
+
}
|
1292
|
+
async endTask_1(reversibleExit, onlyDescs, subformDestination, dueToVerifyError) {
|
1293
|
+
let succeeded = true;
|
1294
|
+
let closedSubForm = false;
|
1295
|
+
let subTask;
|
1296
|
+
let mgdTab = AccessHelper.mgDataTable;
|
1297
|
+
if ((this.IsSubForm && !subformDestination) && !this._parentTask.InEndTask) {
|
1298
|
+
succeeded = await this._parentTask.endTask(reversibleExit, onlyDescs, dueToVerifyError);
|
1299
|
+
}
|
1300
|
+
else if (!this.isAborting() && !this.InEndTask) {
|
1301
|
+
try {
|
1302
|
+
this.InEndTask = true;
|
1303
|
+
if ((MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI) && AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
1304
|
+
let cmd = CommandFactory.CreateUnloadCommand();
|
1305
|
+
MGDataCollection.Instance.getMGData(0).CmdsToServer.Add(cmd);
|
1306
|
+
await CommandsProcessorManager.GetCommandsProcessor().Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
1307
|
+
return;
|
1308
|
+
}
|
1309
|
+
if (!this.IsTryingToStop)
|
1310
|
+
this.setTryingToStop(true);
|
1311
|
+
let i;
|
1312
|
+
if (reversibleExit) {
|
1313
|
+
if (this.hasSubTasks()) {
|
1314
|
+
if (!RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
|
1315
|
+
let pendingTransactions = true;
|
1316
|
+
let clientOperExist = await this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_TASK_SUFFIX);
|
1317
|
+
if (!clientOperExist) {
|
1318
|
+
clientOperExist = await this.CheckIfClientOperationExistsInSubformTasks(this, InternalInterface.MG_ACT_REC_SUFFIX);
|
1319
|
+
if (!clientOperExist)
|
1320
|
+
pendingTransactions = this.CheckIfPendingTransactions(this);
|
1321
|
+
}
|
1322
|
+
if (!clientOperExist && !pendingTransactions) {
|
1323
|
+
this.allowRemoteCmdExecution = false;
|
1324
|
+
this.SetServerSideTaskSuffix(this);
|
1325
|
+
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
|
1326
|
+
}
|
1327
|
+
}
|
1328
|
+
else
|
1329
|
+
this.SetServerSideTaskSuffix(this);
|
1330
|
+
for (i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
|
1331
|
+
subTask = this.SubTasks.getTask(i);
|
1332
|
+
closedSubForm = closedSubForm || subTask.IsSubForm;
|
1333
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(subTask, InternalInterface.MG_ACT_EXIT);
|
1334
|
+
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
1335
|
+
}
|
1336
|
+
}
|
1337
|
+
else {
|
1338
|
+
if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution)
|
1339
|
+
this.SetServerSideTaskSuffix(this);
|
1340
|
+
}
|
1341
|
+
if (this === mgdTab.StartupMgData.getFirstTask()) {
|
1342
|
+
for (i = mgdTab.getSize() - 1; i > 0 && succeeded; i--) {
|
1343
|
+
if (mgdTab.getMGData(i) != null) {
|
1344
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(mgdTab.getMGData(i).getFirstTask(), InternalInterface.MG_ACT_EXIT);
|
1345
|
+
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
1346
|
+
}
|
1347
|
+
}
|
1348
|
+
}
|
1349
|
+
}
|
1350
|
+
if (succeeded) {
|
1351
|
+
if (reversibleExit && !dueToVerifyError) {
|
1352
|
+
let forceSuffix = await this.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
1353
|
+
if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
|
1354
|
+
this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "0");
|
1355
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_REC_SUFFIX);
|
1356
|
+
if (!this.IsInteractive && forceSuffix === true && this.getMode() === Constants.TASK_MODE_CREATE)
|
1357
|
+
this.setProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, "1");
|
1358
|
+
}
|
1359
|
+
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
1360
|
+
if (succeeded && !onlyDescs)
|
1361
|
+
this.HandleTransactionInfo();
|
1362
|
+
let preTskSuffix = succeeded;
|
1363
|
+
if (succeeded && !onlyDescs && reversibleExit && !dueToVerifyError &&
|
1364
|
+
(!this.IsSubForm || subformDestination) &&
|
1365
|
+
this.TaskPrefixExecuted && !this.TaskSuffixExecuted)
|
1366
|
+
succeeded = await this.handleTaskSuffix(true);
|
1367
|
+
if (reversibleExit && this.hasSubTasks())
|
1368
|
+
for (i = 0; i < this.SubTasks.getSize(); i++) {
|
1369
|
+
subTask = this.SubTasks.getTask(i);
|
1370
|
+
if (!subTask.IsSubForm)
|
1371
|
+
await AccessHelper.eventsManager.handleNonReversibleEvent(subTask, InternalInterface.MG_ACT_EXIT);
|
1372
|
+
}
|
1373
|
+
if (reversibleExit)
|
1374
|
+
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError);
|
1375
|
+
if (preTskSuffix)
|
1376
|
+
AccessHelper.eventsManager.setStopExecution(false);
|
1377
|
+
this.setAfterRetry(ConstInterface.RECOVERY_NONE);
|
1378
|
+
if (!this.isAborting() && succeeded && !onlyDescs) {
|
1379
|
+
if (reversibleExit) {
|
1380
|
+
this.setTransactionFailed(false);
|
1381
|
+
await this.TaskTransactionManager.checkAndCommit(false, ConstInterface.TRANS_TASK_PREFIX, false);
|
1382
|
+
succeeded = (!AccessHelper.eventsManager.GetStopExecutionFlag() || dueToVerifyError) && !this.isAborting() && !this.transactionFailed(ConstInterface.TRANS_TASK_PREFIX);
|
1383
|
+
}
|
1384
|
+
this.setAfterRetry(ConstInterface.RECOVERY_NONE);
|
1385
|
+
if (succeeded) {
|
1386
|
+
if (!this.allowRemoteCmdExecution) {
|
1387
|
+
this.allowRemoteCmdExecution = true;
|
1388
|
+
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
|
1389
|
+
}
|
1390
|
+
else if (this.DelayCommandExecution) {
|
1391
|
+
this.DelayCommandExecution = false;
|
1392
|
+
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = true;
|
1393
|
+
}
|
1394
|
+
let baseMgd = AccessHelper.mgDataTable.StartupMgData;
|
1395
|
+
if (reversibleExit && baseMgd.getFirstTask().getTaskTag() === this.getTaskTag()) {
|
1396
|
+
AccessHelper.eventsManager.setProcessingTopMostEndTask(true);
|
1397
|
+
await AccessHelper.eventsManager.handleEvents(baseMgd, 0);
|
1398
|
+
AccessHelper.eventsManager.setProcessingTopMostEndTask(false);
|
1399
|
+
if (this.isAborting()) {
|
1400
|
+
RemoteCommandsProcessor.GetInstance().DelayCommandExecution = false;
|
1401
|
+
this.DelayCommandExecution = false;
|
1402
|
+
this.allowRemoteCmdExecution = true;
|
1403
|
+
return true;
|
1404
|
+
}
|
1405
|
+
}
|
1406
|
+
await TaskServiceBase.Exit(this, reversibleExit, subformDestination);
|
1407
|
+
if (this._parentTask != null && this._parentTask.isMainProg()) {
|
1408
|
+
let mgd = AccessHelper.mgDataTable.getMGData(0);
|
1409
|
+
let mainPrgTask = mgd.getMainProg(0);
|
1410
|
+
let rootTask = AccessHelper.mgDataTable.StartupMgData.getFirstTask();
|
1411
|
+
let endMainPrg = await mainPrgTask.checkProp(PropInterface.PROP_TYPE_END_CONDITION, false);
|
1412
|
+
if (this !== rootTask && endMainPrg) {
|
1413
|
+
let rtEvt = new RunTimeEvent(rootTask);
|
1414
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_CLOSE);
|
1415
|
+
rtEvt.setCtrl(null);
|
1416
|
+
rtEvt.setArgList(null);
|
1417
|
+
AccessHelper.eventsManager.addToTail(rtEvt);
|
1418
|
+
}
|
1419
|
+
}
|
1420
|
+
MgForm.CreatedForms.remove(this.Form);
|
1421
|
+
}
|
1422
|
+
}
|
1423
|
+
}
|
1424
|
+
}
|
1425
|
+
finally {
|
1426
|
+
if (!this.IsSubForm || subformDestination)
|
1427
|
+
this.handleFinallyEndTask(succeeded, reversibleExit);
|
1428
|
+
}
|
1429
|
+
}
|
1430
|
+
else if (this.InEndTask)
|
1431
|
+
succeeded = false;
|
1432
|
+
AccessHelper.eventsManager.setProcessingTopMostEndTask(this._inProcessingTopMostEndTaskSaved);
|
1433
|
+
return succeeded;
|
1434
|
+
}
|
1435
|
+
SetServerSideTaskSuffix(task) {
|
1436
|
+
var rtEvt = new RunTimeEvent(task);
|
1437
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_TASK_SUFFIX);
|
1438
|
+
let handler = null;
|
1439
|
+
var evtHanPos = new EventHandlerPosition();
|
1440
|
+
evtHanPos.init(rtEvt);
|
1441
|
+
handler = evtHanPos.getNext();
|
1442
|
+
if (handler != null) {
|
1443
|
+
for (let i = 0; i < handler.getOperationTab().getSize(); i++) {
|
1444
|
+
let oper = handler.getOperationTab().getOperation(i);
|
1445
|
+
oper.setExecOnServer(true);
|
1446
|
+
}
|
1447
|
+
}
|
1448
|
+
if (task.hasSubTasks()) {
|
1449
|
+
for (let i = 0; i < task.GetSubTasks().length; i++) {
|
1450
|
+
let subTask = task.SubTasks.getTask(i);
|
1451
|
+
this.SetServerSideTaskSuffix(subTask);
|
1452
|
+
}
|
1453
|
+
}
|
1454
|
+
}
|
1455
|
+
async CheckIfClientOperationExistsInSubformTasks(task, eventCode) {
|
1456
|
+
let clientOperationExist = false;
|
1457
|
+
var rtEvt = new RunTimeEvent(task);
|
1458
|
+
rtEvt.setInternal(eventCode);
|
1459
|
+
let handler = null;
|
1460
|
+
var evtHanPos = new EventHandlerPosition();
|
1461
|
+
evtHanPos.init(rtEvt);
|
1462
|
+
handler = evtHanPos.getNext();
|
1463
|
+
if (eventCode == InternalInterface.MG_ACT_REC_SUFFIX) {
|
1464
|
+
let currRecord = task.DataView.getCurrRec();
|
1465
|
+
if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
|
1466
|
+
clientOperationExist = true;
|
1467
|
+
if (!clientOperationExist) {
|
1468
|
+
let forceSuffix = await task.checkProp(PropInterface.PROP_TYPE_FORCE_SUFFIX, false);
|
1469
|
+
if (forceSuffix === true)
|
1470
|
+
if (task.IsInteractive || task.getMode() !== Constants.TASK_MODE_CREATE)
|
1471
|
+
clientOperationExist = true;
|
1472
|
+
}
|
1473
|
+
}
|
1474
|
+
if (handler != null && !clientOperationExist) {
|
1475
|
+
let cnt = handler.getOperationTab().getSize();
|
1476
|
+
for (let i = 0; i < cnt; i++) {
|
1477
|
+
let oper = handler.getOperationTab().getOperation(i);
|
1478
|
+
if (oper.getExecOnClient()) {
|
1479
|
+
clientOperationExist = true;
|
1480
|
+
break;
|
1481
|
+
}
|
1482
|
+
else {
|
1483
|
+
if (oper.getType() == ConstInterface.MG_OPER_RAISE_EVENT) {
|
1484
|
+
if (oper.GetRuntimeEvent().getType() == ConstInterface.EVENT_TYPE_INTERNAL &&
|
1485
|
+
oper.GetRuntimeEvent().getInternalCode() === InternalInterface.MG_ACT_RT_REFRESH_VIEW) {
|
1486
|
+
clientOperationExist = true;
|
1487
|
+
break;
|
1488
|
+
}
|
1489
|
+
}
|
1490
|
+
}
|
1491
|
+
}
|
1492
|
+
}
|
1493
|
+
if (!clientOperationExist && task.hasSubTasks()) {
|
1494
|
+
for (let i = 0; (!clientOperationExist && i < task.getSubTasks().getSize()); i++) {
|
1495
|
+
let subTask = task.SubTasks.getTask(i);
|
1496
|
+
clientOperationExist = await this.CheckIfClientOperationExistsInSubformTasks(subTask, eventCode);
|
1497
|
+
}
|
1498
|
+
}
|
1499
|
+
return clientOperationExist;
|
1500
|
+
}
|
1501
|
+
CheckIfPendingTransactions(task) {
|
1502
|
+
let pendingTransactions = false;
|
1503
|
+
let currRecord = task.DataView.getCurrRec();
|
1504
|
+
if (task.DataView.modifiedRecordsNumber() > 0 || (currRecord != null && currRecord.Modified))
|
1505
|
+
pendingTransactions = true;
|
1506
|
+
if (!pendingTransactions && task.hasSubTasks()) {
|
1507
|
+
for (let i = 0; (!pendingTransactions && i < task.getSubTasks().getSize()); i++) {
|
1508
|
+
let subTask = task.SubTasks.getTask(i);
|
1509
|
+
pendingTransactions = this.CheckIfPendingTransactions(subTask);
|
1510
|
+
}
|
1511
|
+
}
|
1512
|
+
return pendingTransactions;
|
1513
|
+
}
|
1514
|
+
HandleTransactionInfo() {
|
1515
|
+
let transaction = this.DataviewManager.RemoteDataviewManager.Transaction;
|
1516
|
+
if (transaction !== null && transaction.isOwner(this) && transaction.getLevel() === 'P') {
|
1517
|
+
this.DataviewManager.RemoteDataviewManager.Transaction = null;
|
1518
|
+
this.DataView.setTransCleared();
|
1519
|
+
}
|
1520
|
+
}
|
1521
|
+
async Exit(reversibleExit, subformDestination) {
|
1522
|
+
let cmd = reversibleExit ?
|
1523
|
+
CommandFactory.CreateBrowserEscEventCommand(this.getTaskTag(), subformDestination) :
|
1524
|
+
CommandFactory.CreateNonReversibleExitCommand(this.getTaskTag(), subformDestination);
|
1525
|
+
this._mgData.CmdsToServer.Add(cmd);
|
1526
|
+
if (!subformDestination) {
|
1527
|
+
try {
|
1528
|
+
if (this.getTaskTag() == MGDataCollection.Instance.StartupMgData.getFirstTask().getTaskTag() ||
|
1529
|
+
!(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI))
|
1530
|
+
await Task.CommandsProcessor.Execute(CommandsProcessorBase_SendingInstruction.TASKS_AND_COMMANDS);
|
1531
|
+
}
|
1532
|
+
catch (err) {
|
1533
|
+
if (this.isMainProg()) {
|
1534
|
+
this._mgData.CmdsToServer.Add(cmd);
|
1535
|
+
}
|
1536
|
+
else
|
1537
|
+
throw err;
|
1538
|
+
}
|
1539
|
+
}
|
1540
|
+
}
|
1541
|
+
handleFinallyEndTask(succeeded, reversibleExit) {
|
1542
|
+
let subTask;
|
1543
|
+
if (this.hasSubTasks()) {
|
1544
|
+
for (let i = 0; i < this.SubTasks.getSize(); i++) {
|
1545
|
+
subTask = this.SubTasks.getTask(i);
|
1546
|
+
subTask.handleFinallyEndTask(succeeded, reversibleExit);
|
1547
|
+
}
|
1548
|
+
}
|
1549
|
+
this.InEndTask = false;
|
1550
|
+
if (succeeded)
|
1551
|
+
this._isStarted = false;
|
1552
|
+
if (!succeeded && reversibleExit && this.IsTryingToStop)
|
1553
|
+
this.setTryingToStop(false);
|
1554
|
+
}
|
1555
|
+
async handleTaskSuffix(withSubTasks) {
|
1556
|
+
let succeeded = true;
|
1557
|
+
let subTask;
|
1558
|
+
if (withSubTasks) {
|
1559
|
+
if (this.hasSubTasks()) {
|
1560
|
+
for (let i = 0; i < this.SubTasks.getSize() && succeeded; i++) {
|
1561
|
+
subTask = this.SubTasks.getTask(i);
|
1562
|
+
succeeded = await subTask.handleTaskSuffix(withSubTasks);
|
1563
|
+
}
|
1564
|
+
}
|
1565
|
+
}
|
1566
|
+
if (succeeded)
|
1567
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this, InternalInterface.MG_ACT_TASK_SUFFIX);
|
1568
|
+
succeeded = !AccessHelper.eventsManager.GetStopExecutionFlag();
|
1569
|
+
this.TaskSuffixExecuted = true;
|
1570
|
+
return succeeded;
|
1571
|
+
}
|
1572
|
+
setInCreateLine(inCreateLine) {
|
1573
|
+
this._inCreateLine = inCreateLine;
|
1574
|
+
}
|
1575
|
+
getInCreateLine() {
|
1576
|
+
return this._inCreateLine;
|
1577
|
+
}
|
1578
|
+
async handleEventOnSlaveTasks(internalEvtCode) {
|
1579
|
+
let i;
|
1580
|
+
let task = null;
|
1581
|
+
let failureTask = null;
|
1582
|
+
let mgdTab = AccessHelper.mgDataTable;
|
1583
|
+
let triggeredTasks = mgdTab.getTriggeredTasks(this);
|
1584
|
+
let orphans = null;
|
1585
|
+
let sameTrans;
|
1586
|
+
let hasSlaves = false;
|
1587
|
+
let isOwner = this.Transaction != null && this.Transaction.isOwner(this);
|
1588
|
+
if (isOwner) {
|
1589
|
+
AccessHelper.eventsManager.setEventScopeTrans();
|
1590
|
+
orphans = new List();
|
1591
|
+
mgdTab.startTasksIteration();
|
1592
|
+
while ((task = mgdTab.getNextTask()) != null) {
|
1593
|
+
sameTrans = task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
|
1594
|
+
if (task !== this && sameTrans && task.PreviouslyActiveTaskId != null && mgdTab.GetTaskByID(task.PreviouslyActiveTaskId) == null)
|
1595
|
+
orphans.push(task);
|
1596
|
+
}
|
1597
|
+
}
|
1598
|
+
let scopeTrans = AccessHelper.eventsManager.isEventScopeTrans();
|
1599
|
+
for (i = 0; i < triggeredTasks.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
|
1600
|
+
task = triggeredTasks.get_Item(i);
|
1601
|
+
sameTrans = this.Transaction != null && task.Transaction != null && this.Transaction.getTransId() === task.Transaction.getTransId();
|
1602
|
+
if (!task.IsSubForm && (scopeTrans && sameTrans) && task.isStarted()) {
|
1603
|
+
if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
|
1604
|
+
await task.DataView.currRecCompute(false);
|
1605
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
|
1606
|
+
hasSlaves = true;
|
1607
|
+
}
|
1608
|
+
}
|
1609
|
+
for (; isOwner && i < orphans.length && !AccessHelper.eventsManager.GetStopExecutionFlag(); i++) {
|
1610
|
+
task = orphans.get_Item(i);
|
1611
|
+
if (task.getForm().FormRefreshed && internalEvtCode === InternalInterface.MG_ACT_REC_PREFIX && task.getLevel() === Constants.TASK_LEVEL_TASK)
|
1612
|
+
await task.DataView.currRecCompute(false);
|
1613
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(task, internalEvtCode);
|
1614
|
+
hasSlaves = true;
|
1615
|
+
}
|
1616
|
+
if (hasSlaves && AccessHelper.eventsManager.GetStopExecutionFlag())
|
1617
|
+
failureTask = task;
|
1618
|
+
if (isOwner)
|
1619
|
+
AccessHelper.eventsManager.clearEventScope();
|
1620
|
+
return failureTask;
|
1621
|
+
}
|
1622
|
+
async enableRecordActions() {
|
1623
|
+
let dataview = this.DataView;
|
1624
|
+
await this.setCreateDeleteActsEnableState();
|
1625
|
+
if (dataview.IncludesFirst() || dataview.IsOneWayKey) {
|
1626
|
+
if (dataview.isEmptyDataview() || dataview.getCurrRecIdx() === 0) {
|
1627
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, false);
|
1628
|
+
if (dataview.IsOneWayKey)
|
1629
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
1630
|
+
else
|
1631
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, false);
|
1632
|
+
if (this.Form.isScreenMode())
|
1633
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
|
1634
|
+
}
|
1635
|
+
else {
|
1636
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
|
1637
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
1638
|
+
if (this.Form.isScreenMode())
|
1639
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
|
1640
|
+
}
|
1641
|
+
if (!this.Form.isScreenMode())
|
1642
|
+
if (dataview.isEmptyDataview() || (dataview.getCurrRecIdx() === 0) || (dataview.getTopRecIdx() === 0))
|
1643
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, false);
|
1644
|
+
else
|
1645
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
|
1646
|
+
}
|
1647
|
+
else {
|
1648
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
1649
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVPAGE, true);
|
1650
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_PRVLINE, true);
|
1651
|
+
}
|
1652
|
+
if (dataview.IncludesLast()) {
|
1653
|
+
if (((this.getMode() === Constants.TASK_MODE_QUERY) || dataview.isEmptyDataview() ||
|
1654
|
+
((this.getMode() === Constants.TASK_MODE_MODIFY) &&
|
1655
|
+
(!Environment.Instance.allowCreateInModifyMode(this.getCompIdx()) ||
|
1656
|
+
!await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)))) && (dataview.getCurrRecIdx() + 1) === dataview.getSize()) {
|
1657
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, false);
|
1658
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, false);
|
1659
|
+
if (this.Form.isScreenMode())
|
1660
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
|
1661
|
+
}
|
1662
|
+
else {
|
1663
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
|
1664
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
|
1665
|
+
if (this.Form.isScreenMode())
|
1666
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
|
1667
|
+
}
|
1668
|
+
if (!this.Form.isScreenMode()) {
|
1669
|
+
if (dataview.isEmptyDataview() || ((dataview.getSize() - dataview.getTopRecIdx()) <= this.Form.getRowsInPage()))
|
1670
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, false);
|
1671
|
+
else
|
1672
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
|
1673
|
+
}
|
1674
|
+
}
|
1675
|
+
else {
|
1676
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTLINE, true);
|
1677
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_NXTPAGE, true);
|
1678
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_TBL_ENDTBL, true);
|
1679
|
+
}
|
1680
|
+
if (dataview.isEmptyDataview())
|
1681
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, false);
|
1682
|
+
else
|
1683
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_CANCEL, true);
|
1684
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_ENTER_ROW_EDITING, true);
|
1685
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_NO_PROG_EXE_RIGHTS, true);
|
1686
|
+
}
|
1687
|
+
isStarted() {
|
1688
|
+
return this._isStarted;
|
1689
|
+
}
|
1690
|
+
getSubTasks() {
|
1691
|
+
return this.SubTasks;
|
1692
|
+
}
|
1693
|
+
refreshesOn(fldId) {
|
1694
|
+
let result = false;
|
1695
|
+
for (let i = 0; !result && this.RefreshOnVars !== null && i < this.RefreshOnVars.length; i++) {
|
1696
|
+
result = (this.RefreshOnVars[i] === fldId);
|
1697
|
+
}
|
1698
|
+
return result;
|
1699
|
+
}
|
1700
|
+
AbortTransaction() {
|
1701
|
+
this.DataviewManager.RemoteDataviewManager.Transaction = null;
|
1702
|
+
}
|
1703
|
+
setPreventRecordSuffix(val) {
|
1704
|
+
this._preventRecordSuffix = val;
|
1705
|
+
}
|
1706
|
+
getPreventRecordSuffix() {
|
1707
|
+
return this._preventRecordSuffix;
|
1708
|
+
}
|
1709
|
+
setPreventControlChange(val) {
|
1710
|
+
this._preventControlChange = val;
|
1711
|
+
}
|
1712
|
+
getPreventControlChange() {
|
1713
|
+
return this._preventControlChange;
|
1714
|
+
}
|
1715
|
+
resetKnownToServer() {
|
1716
|
+
this._knownToServer = false;
|
1717
|
+
}
|
1718
|
+
evaluateDescriptor() {
|
1719
|
+
let result = "";
|
1720
|
+
let res;
|
1721
|
+
if (this.DvPosDescriptor == null)
|
1722
|
+
return HashUtils.GetHashCode(result);
|
1723
|
+
let first = true;
|
1724
|
+
for (let i = 0; i < this.DvPosDescriptor.length; i++) {
|
1725
|
+
if (!first)
|
1726
|
+
result += ";";
|
1727
|
+
let currentCell = this.DvPosDescriptor.get_Item(i);
|
1728
|
+
let currentTag = currentCell[0];
|
1729
|
+
let currentVeeIdx = NNumber.Parse(currentCell[1]);
|
1730
|
+
let currentTask = AccessHelper.mgDataTable.GetTaskByID(currentTag);
|
1731
|
+
let currentField = currentTask.DataView.getField(currentVeeIdx);
|
1732
|
+
let dispVal = currentField.getDispValue();
|
1733
|
+
if (currentField.isNull())
|
1734
|
+
dispVal = "";
|
1735
|
+
let pic;
|
1736
|
+
switch (currentField.getType()) {
|
1737
|
+
case StorageAttribute.BOOLEAN:
|
1738
|
+
case StorageAttribute.ALPHA:
|
1739
|
+
case StorageAttribute.UNICODE:
|
1740
|
+
case StorageAttribute.BLOB:
|
1741
|
+
case StorageAttribute.BLOB_VECTOR:
|
1742
|
+
result += dispVal;
|
1743
|
+
break;
|
1744
|
+
case StorageAttribute.DATE:
|
1745
|
+
case StorageAttribute.TIME:
|
1746
|
+
if (dispVal !== "") {
|
1747
|
+
pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
|
1748
|
+
let conv = DisplayConvertor.Instance;
|
1749
|
+
result += conv.mg2disp(dispVal, "", pic, false, this.getCompIdx(), false);
|
1750
|
+
}
|
1751
|
+
break;
|
1752
|
+
case StorageAttribute.NUMERIC:
|
1753
|
+
if (dispVal !== "") {
|
1754
|
+
res = new NUM_TYPE(dispVal);
|
1755
|
+
pic = new PIC(currentField.getPicture(), currentField.getType(), 0);
|
1756
|
+
result += res.to_a(pic);
|
1757
|
+
}
|
1758
|
+
break;
|
1759
|
+
}
|
1760
|
+
first = false;
|
1761
|
+
}
|
1762
|
+
let tmpStr2 = StrUtil.stringToHexaDump(result, 4);
|
1763
|
+
return HashUtils.GetHashCode(tmpStr2);
|
1764
|
+
}
|
1765
|
+
setDescriptor(newDesc) {
|
1766
|
+
if (!(newDesc.trim() === "")) {
|
1767
|
+
let desc = StrUtil.tokenize(newDesc, ";");
|
1768
|
+
this.DvPosDescriptor = new List();
|
1769
|
+
for (let i = 0; i < desc.length; i = i + 1) {
|
1770
|
+
let cell = new Array(2);
|
1771
|
+
let tagVeePair = StrUtil.tokenize(desc[i], ",");
|
1772
|
+
cell[0] = tagVeePair[0];
|
1773
|
+
cell[1] = tagVeePair[1];
|
1774
|
+
this.DvPosDescriptor.push(cell);
|
1775
|
+
}
|
1776
|
+
}
|
1777
|
+
}
|
1778
|
+
getTaskCache() {
|
1779
|
+
return this._dvCache;
|
1780
|
+
}
|
1781
|
+
async prepareCache(ignoreCurr) {
|
1782
|
+
let success = true;
|
1783
|
+
if (!ignoreCurr) {
|
1784
|
+
if (await this.isCached()) {
|
1785
|
+
if (this.DataView.getChanged()) {
|
1786
|
+
this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
|
1787
|
+
success = false;
|
1788
|
+
}
|
1789
|
+
}
|
1790
|
+
else {
|
1791
|
+
if (this.IsSubForm && !await this.isCached()) {
|
1792
|
+
success = false;
|
1793
|
+
}
|
1794
|
+
}
|
1795
|
+
}
|
1796
|
+
let curretTask;
|
1797
|
+
if (this.hasSubTasks()) {
|
1798
|
+
for (let i = 0; i < this.SubTasks.getSize(); i = i + 1) {
|
1799
|
+
curretTask = this.SubTasks.getTask(i);
|
1800
|
+
if (!await curretTask.prepareCache(false)) {
|
1801
|
+
success = false;
|
1802
|
+
}
|
1803
|
+
}
|
1804
|
+
}
|
1805
|
+
return success;
|
1806
|
+
}
|
1807
|
+
async testAndSet(ignoreCurr) {
|
1808
|
+
if (!ignoreCurr && await this.isCached()) {
|
1809
|
+
let requestedDv = this.evaluateDescriptor();
|
1810
|
+
if (requestedDv !== this.DataView.getDvPosValue()) {
|
1811
|
+
let fromCache = this._dvCache.getCachedDataView(requestedDv);
|
1812
|
+
if (fromCache == null)
|
1813
|
+
return false;
|
1814
|
+
await this.changeDv(fromCache);
|
1815
|
+
}
|
1816
|
+
this.DoSubformPrefixSuffix = true;
|
1817
|
+
}
|
1818
|
+
if (this.hasSubTasks()) {
|
1819
|
+
for (let i = 0; i < this.SubTasks.getSize(); i++) {
|
1820
|
+
if (!await this.SubTasks.getTask(i).testAndSet(false))
|
1821
|
+
return false;
|
1822
|
+
}
|
1823
|
+
}
|
1824
|
+
return true;
|
1825
|
+
}
|
1826
|
+
async changeDv(fromCache) {
|
1827
|
+
let dataview = this.DataView;
|
1828
|
+
if (!this.hasLocate) {
|
1829
|
+
if (!dataview.getChanged() && dataview.IncludesFirst())
|
1830
|
+
this._dvCache.putInCache(dataview.replicate());
|
1831
|
+
}
|
1832
|
+
else
|
1833
|
+
this.locatePutInCache();
|
1834
|
+
await dataview.setSameAs(fromCache);
|
1835
|
+
dataview.takeFldValsFromCurrRec();
|
1836
|
+
this.Form.SetTableItemsCount(0, true);
|
1837
|
+
this.Form.setTableItemsCount(false);
|
1838
|
+
await this.Form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
1839
|
+
this.setOriginalTaskMode(this.getMode());
|
1840
|
+
}
|
1841
|
+
setOriginalTaskMode(originalTaskMode) {
|
1842
|
+
this._originalTaskMode = originalTaskMode.charAt(0);
|
1843
|
+
}
|
1844
|
+
getOriginalTaskMode() {
|
1845
|
+
return this._originalTaskMode;
|
1846
|
+
}
|
1847
|
+
async isCached() {
|
1848
|
+
return this.IsSubForm && await this.Form.getSubFormCtrl().checkProp(PropInterface.PROP_TYPE_IS_CACHED, false);
|
1849
|
+
}
|
1850
|
+
locatePutInCache() {
|
1851
|
+
let cached = this._dvCache.getCachedDataView(this.DataView.getDvPosValue());
|
1852
|
+
if (cached != null) {
|
1853
|
+
if (this.DataView.checkFirst(cached.getLocateFirstRec()) && !this.DataView.getChanged()) {
|
1854
|
+
this.DataView.setLocateFirstRec(cached.getLocateFirstRec());
|
1855
|
+
this._dvCache.putInCache(this.DataView.replicate());
|
1856
|
+
}
|
1857
|
+
else
|
1858
|
+
this._dvCache.removeDvFromCache(this.DataView.getDvPosValue(), true);
|
1859
|
+
}
|
1860
|
+
else {
|
1861
|
+
if (!this.DataView.getChanged())
|
1862
|
+
this._dvCache.putInCache(this.DataView.replicate());
|
1863
|
+
}
|
1864
|
+
}
|
1865
|
+
HasLoacte() {
|
1866
|
+
return this.hasLocate;
|
1867
|
+
}
|
1868
|
+
setRemoteTransaction(transId) {
|
1869
|
+
let mgdTab = AccessHelper.mgDataTable;
|
1870
|
+
let transTask;
|
1871
|
+
let isFind = false;
|
1872
|
+
mgdTab.startTasksIteration();
|
1873
|
+
while ((transTask = mgdTab.getNextTask()) != null) {
|
1874
|
+
if (transTask.DataviewManager.RemoteDataviewManager.Transaction != null &&
|
1875
|
+
transTask.DataviewManager.RemoteDataviewManager.Transaction.getTransId() === transId) {
|
1876
|
+
isFind = true;
|
1877
|
+
break;
|
1878
|
+
}
|
1879
|
+
}
|
1880
|
+
this.DataviewManager.RemoteDataviewManager.Transaction = (isFind ?
|
1881
|
+
transTask.DataviewManager.RemoteDataviewManager.Transaction :
|
1882
|
+
new Transaction(this, transId));
|
1883
|
+
}
|
1884
|
+
setTransOwnerTask() {
|
1885
|
+
this.Transaction.setOwnerTask(this);
|
1886
|
+
this.Transaction.setTransBegin('T');
|
1887
|
+
}
|
1888
|
+
getLoopCounter() {
|
1889
|
+
let result = 0;
|
1890
|
+
if (this._useLoopStack && this._loopStack !== null && !(this._loopStack.count() === 0)) {
|
1891
|
+
result = this._loopStack.peek();
|
1892
|
+
}
|
1893
|
+
return result;
|
1894
|
+
}
|
1895
|
+
enterLoop() {
|
1896
|
+
if (this._loopStack === null)
|
1897
|
+
this._loopStack = new Stack();
|
1898
|
+
this._loopStack.push(0);
|
1899
|
+
}
|
1900
|
+
leaveLoop() {
|
1901
|
+
this.popLoopCounter();
|
1902
|
+
}
|
1903
|
+
popLoopCounter() {
|
1904
|
+
let result = 0;
|
1905
|
+
if (this._loopStack !== null && !(this._loopStack.count() === 0))
|
1906
|
+
result = this._loopStack.pop();
|
1907
|
+
return result;
|
1908
|
+
}
|
1909
|
+
increaseLoopCounter() {
|
1910
|
+
this._loopStack.push(this.popLoopCounter() + 1);
|
1911
|
+
}
|
1912
|
+
getLoopStackSize() {
|
1913
|
+
if (this._loopStack !== null)
|
1914
|
+
return this._loopStack.count();
|
1915
|
+
return 0;
|
1916
|
+
}
|
1917
|
+
setUseLoopStack(val) {
|
1918
|
+
this._useLoopStack = val;
|
1919
|
+
}
|
1920
|
+
getDataviewHeaders() {
|
1921
|
+
return this.DataviewHeadersTable;
|
1922
|
+
}
|
1923
|
+
isFirstRecordCycle(Value_) {
|
1924
|
+
if (arguments.length === 0) {
|
1925
|
+
return this.isFirstRecordCycle_0();
|
1926
|
+
}
|
1927
|
+
return this.isFirstRecordCycle_1(Value_);
|
1928
|
+
}
|
1929
|
+
isFirstRecordCycle_0() {
|
1930
|
+
return this._firstRecordCycle;
|
1931
|
+
}
|
1932
|
+
isFirstRecordCycle_1(Value_) {
|
1933
|
+
this._firstRecordCycle = Value_;
|
1934
|
+
}
|
1935
|
+
getPublicName() {
|
1936
|
+
return this.PublicName;
|
1937
|
+
}
|
1938
|
+
async isAllowEvents() {
|
1939
|
+
let prop = this.getProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_EVENTS);
|
1940
|
+
return await prop.getValueBoolean();
|
1941
|
+
}
|
1942
|
+
getExternalTaskId() {
|
1943
|
+
let taskId = "";
|
1944
|
+
let prop = this.getProp(PropInterface.PROP_TYPE_TASK_ID);
|
1945
|
+
if (prop != null)
|
1946
|
+
taskId = prop.GetComputedValue();
|
1947
|
+
return taskId;
|
1948
|
+
}
|
1949
|
+
isTransactionOwner() {
|
1950
|
+
let isTransOwner = false;
|
1951
|
+
if (this.Transaction != null && this.Transaction.isOwner(this))
|
1952
|
+
isTransOwner = true;
|
1953
|
+
return isTransOwner;
|
1954
|
+
}
|
1955
|
+
isTransactionOnLevel(level) {
|
1956
|
+
return this.isTransactionOwner() && this.Transaction.getLevel() === level;
|
1957
|
+
}
|
1958
|
+
isProgram() {
|
1959
|
+
return this._isPrg;
|
1960
|
+
}
|
1961
|
+
async enableModes() {
|
1962
|
+
let enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_MODIFY, true);
|
1963
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_MODIFY, enable);
|
1964
|
+
enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true);
|
1965
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_CREATE, enable);
|
1966
|
+
enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_QUERY, true);
|
1967
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_QUERY, enable);
|
1968
|
+
enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_RANGE, true);
|
1969
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_RANGE, enable);
|
1970
|
+
enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_LOCATE, true);
|
1971
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_LOCATE, enable);
|
1972
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RTO_SEARCH, enable);
|
1973
|
+
enable = await this.checkProp(PropInterface.PROP_TYPE_ALLOW_SORT, true);
|
1974
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_SORT_RECORDS, enable);
|
1975
|
+
enable = await this.checkProp(PropInterface.PROP_TYPE_TASK_PROPERTIES_ALLOW_INDEX, true);
|
1976
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_VIEW_BY_KEY, enable);
|
1977
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_DUMP_ENVIRONMENT, true);
|
1978
|
+
}
|
1979
|
+
setEnableZoomHandler() {
|
1980
|
+
this._enableZoomHandler = true;
|
1981
|
+
}
|
1982
|
+
getEnableZoomHandler() {
|
1983
|
+
return this._enableZoomHandler;
|
1984
|
+
}
|
1985
|
+
isDestinationSubform() {
|
1986
|
+
return this._destinationSubform;
|
1987
|
+
}
|
1988
|
+
setDestinationSubform(destinationSubform) {
|
1989
|
+
this._destinationSubform = destinationSubform;
|
1990
|
+
}
|
1991
|
+
getIsDestinationCall() {
|
1992
|
+
return this._isDestinationCall;
|
1993
|
+
}
|
1994
|
+
setIsDestinationCall(isDestinationCall) {
|
1995
|
+
this._isDestinationCall = isDestinationCall;
|
1996
|
+
}
|
1997
|
+
setCancelWasRaised(val) {
|
1998
|
+
this._cancelWasRaised = val;
|
1999
|
+
}
|
2000
|
+
cancelWasRaised() {
|
2001
|
+
return this._cancelWasRaised;
|
2002
|
+
}
|
2003
|
+
enableCreateActs(val) {
|
2004
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE, val);
|
2005
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_CRELINE_ABOVE, (this.getForm().HasTable()) ? val : false);
|
2006
|
+
}
|
2007
|
+
async setCreateDeleteActsEnableState() {
|
2008
|
+
if (!(this.DataView).isEmptyDataview() && await this.checkProp(PropInterface.PROP_TYPE_ALLOW_DELETE, true) &&
|
2009
|
+
this.getMode() === Constants.TASK_MODE_MODIFY && this.DataView.HasMainTable)
|
2010
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, true);
|
2011
|
+
else
|
2012
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_DELLINE, false);
|
2013
|
+
if ((await this.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true)) &&
|
2014
|
+
(this.DataView.HasMainTable &&
|
2015
|
+
(this.getMode() === Constants.TASK_MODE_MODIFY && Environment.Instance.allowCreateInModifyMode(this.getCompIdx())) ||
|
2016
|
+
(this.getMode() === Constants.TASK_MODE_CREATE)))
|
2017
|
+
this.enableCreateActs(true);
|
2018
|
+
else
|
2019
|
+
this.enableCreateActs(false);
|
2020
|
+
}
|
2021
|
+
setEmptyDataview(emptyDataview) {
|
2022
|
+
this.DataView.setEmptyDataview(emptyDataview);
|
2023
|
+
}
|
2024
|
+
getName() {
|
2025
|
+
return this.Name;
|
2026
|
+
}
|
2027
|
+
async emptyDataviewOpen(subformRefresh) {
|
2028
|
+
if (this.getLevel() === Constants.TASK_LEVEL_TASK) {
|
2029
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, true);
|
2030
|
+
if (this.IsSubForm) {
|
2031
|
+
let rtEvnt = AccessHelper.eventsManager.getLastRtEvent();
|
2032
|
+
if ((rtEvnt != null && rtEvnt.getInternalCode() == InternalInterface.MG_ACT_RT_REFRESH_VIEW) || subformRefresh) {
|
2033
|
+
let rtEvt = new RunTimeEvent(this);
|
2034
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_EMPTY_DATAVIEW);
|
2035
|
+
rtEvt.SetEventSubType(EventSubType.Normal);
|
2036
|
+
await AccessHelper.eventsManager.handleEvent(rtEvt, false);
|
2037
|
+
}
|
2038
|
+
}
|
2039
|
+
else
|
2040
|
+
AccessHelper.eventsManager.addInternalEventWithItaskAndCode(this, InternalInterface.MG_ACT_EMPTY_DATAVIEW);
|
2041
|
+
this.setLevel(Constants.TASK_LEVEL_RECORD);
|
2042
|
+
if (this.SubformExecMode !== Task_SubformExecModeEnum.FIRST_TIME && subformRefresh && await this.CheckRefreshSubTasks()) {
|
2043
|
+
await this.DataView.computeSubForms();
|
2044
|
+
await this.doSubformRecPrefixSuffix();
|
2045
|
+
}
|
2046
|
+
await this.enableRecordActions();
|
2047
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, false);
|
2048
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, false);
|
2049
|
+
}
|
2050
|
+
}
|
2051
|
+
emptyDataviewClose() {
|
2052
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_EMPTY_DATAVIEW, false);
|
2053
|
+
this.setLevel(Constants.TASK_LEVEL_TASK);
|
2054
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_RECORD, true);
|
2055
|
+
this.ActionManager.enable(InternalInterface.MG_ACT_RT_REFRESH_SCREEN, true);
|
2056
|
+
}
|
2057
|
+
async SubformRefresh(subformTask, explicitSubformRefresh) {
|
2058
|
+
let currTask = LastFocusedManager.Instance.getLastFocusedTask();
|
2059
|
+
let isInside = await subformTask.ExecuteNestedRS(currTask);
|
2060
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
2061
|
+
return;
|
2062
|
+
if (subformTask.getLevel() !== Constants.TASK_LEVEL_TASK && !AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
2063
|
+
AccessHelper.eventsManager.pushNewExecStacks();
|
2064
|
+
await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_SUFFIX, true);
|
2065
|
+
AccessHelper.eventsManager.popNewExecStacks();
|
2066
|
+
isInside = true;
|
2067
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
2068
|
+
return;
|
2069
|
+
}
|
2070
|
+
let cmd = CommandFactory.CreateSubformRefreshCommand(this.getTaskTag(), subformTask.getTaskTag(), explicitSubformRefresh);
|
2071
|
+
await subformTask.DataviewManager.Execute(cmd);
|
2072
|
+
if (subformTask.isAborting())
|
2073
|
+
return;
|
2074
|
+
if (explicitSubformRefresh) {
|
2075
|
+
AccessHelper.eventsManager.pushNewExecStacks();
|
2076
|
+
let performParentRecordPrefixOrg = subformTask.PerformParentRecordPrefix;
|
2077
|
+
subformTask.PerformParentRecordPrefix = false;
|
2078
|
+
await AccessHelper.eventsManager.handleInternalEventWithTaskAndSubformRefresh(subformTask, InternalInterface.MG_ACT_REC_PREFIX, true);
|
2079
|
+
subformTask.PerformParentRecordPrefix = performParentRecordPrefixOrg;
|
2080
|
+
AccessHelper.eventsManager.popNewExecStacks();
|
2081
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
2082
|
+
return;
|
2083
|
+
}
|
2084
|
+
if (isInside) {
|
2085
|
+
}
|
2086
|
+
else {
|
2087
|
+
if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
2088
|
+
if (explicitSubformRefresh) {
|
2089
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(subformTask, InternalInterface.MG_ACT_REC_SUFFIX);
|
2090
|
+
if (currTask != null)
|
2091
|
+
currTask.DataView.setPrevCurrRec();
|
2092
|
+
subformTask.DoSubformPrefixSuffix = false;
|
2093
|
+
}
|
2094
|
+
}
|
2095
|
+
}
|
2096
|
+
}
|
2097
|
+
async ExecuteNestedRS(lastTask) {
|
2098
|
+
let isExecuteNestedRS = false;
|
2099
|
+
if (lastTask == null)
|
2100
|
+
return isExecuteNestedRS;
|
2101
|
+
if (this.getLevel() !== Constants.TASK_LEVEL_TASK && lastTask.getMgdID() !== this.getMgdID())
|
2102
|
+
return isExecuteNestedRS;
|
2103
|
+
for (let task = lastTask; task !== this && task.pathContains(this) && task.getLevel() !== Constants.TASK_LEVEL_TASK; task = task.getParent()) {
|
2104
|
+
AccessHelper.eventsManager.pushNewExecStacks();
|
2105
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(task, InternalInterface.MG_ACT_REC_SUFFIX);
|
2106
|
+
AccessHelper.eventsManager.popNewExecStacks();
|
2107
|
+
isExecuteNestedRS = true;
|
2108
|
+
}
|
2109
|
+
return isExecuteNestedRS;
|
2110
|
+
}
|
2111
|
+
async execSubformRecSuffix(newTask) {
|
2112
|
+
let subfTask;
|
2113
|
+
let i, idx = 0;
|
2114
|
+
for (i = this._taskPath.length; i > 0; i--) {
|
2115
|
+
subfTask = this._taskPath.get_Item(i - 1);
|
2116
|
+
if (!newTask._taskPath.Contains(subfTask)) {
|
2117
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(subfTask, InternalInterface.MG_ACT_REC_SUFFIX);
|
2118
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
2119
|
+
break;
|
2120
|
+
if (subfTask.getMode() === Constants.TASK_MODE_CREATE && !(subfTask.DataView.getCurrRec()).isNewRec())
|
2121
|
+
subfTask.setMode(Constants.TASK_MODE_MODIFY);
|
2122
|
+
}
|
2123
|
+
else {
|
2124
|
+
idx = newTask._taskPath.indexOf(subfTask);
|
2125
|
+
break;
|
2126
|
+
}
|
2127
|
+
}
|
2128
|
+
Debug.Assert(i > 0);
|
2129
|
+
return idx;
|
2130
|
+
}
|
2131
|
+
getCounter() {
|
2132
|
+
return this._counter;
|
2133
|
+
}
|
2134
|
+
increaseCounter() {
|
2135
|
+
this._counter = this._counter + 1;
|
2136
|
+
}
|
2137
|
+
setCounter(cnt) {
|
2138
|
+
this._counter = cnt;
|
2139
|
+
}
|
2140
|
+
isCurrentStartProgLevel() {
|
2141
|
+
return this._currStartProgLevel === Task.StartProgLevel;
|
2142
|
+
}
|
2143
|
+
static isMainProgramField(fieldStr) {
|
2144
|
+
let Field = XmlParser.getTokens(fieldStr, ',');
|
2145
|
+
let mainProgField = false;
|
2146
|
+
if (Field.length === 2) {
|
2147
|
+
let parent = NNumber.Parse(Field.get_Item(0));
|
2148
|
+
if (parent === TaskBase.MAIN_PRG_PARENT_ID)
|
2149
|
+
mainProgField = true;
|
2150
|
+
}
|
2151
|
+
return mainProgField;
|
2152
|
+
}
|
2153
|
+
getTaskInfo() {
|
2154
|
+
let taskName = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
|
2155
|
+
return NString.Format('{0} {1}', this.isProgram() ? 'Program' : 'Subtask', taskName);
|
2156
|
+
}
|
2157
|
+
toString() {
|
2158
|
+
return NString.Format("(task {0}-\"{1}\"{2})", this._taskTag, this.Name, super.isMainProg() ? (" ctl " + this._ctlIdx) : "");
|
2159
|
+
}
|
2160
|
+
ConstructMgForm(alreadySetParentForm) {
|
2161
|
+
let form = new MgForm();
|
2162
|
+
let parentForm = (this.ParentTask != null ? this.ParentTask.getForm() : null);
|
2163
|
+
while (parentForm != null && !parentForm.getTask().isOpenWin()) {
|
2164
|
+
parentForm = parentForm.ParentForm;
|
2165
|
+
}
|
2166
|
+
form.ParentForm = parentForm;
|
2167
|
+
alreadySetParentForm.value = true;
|
2168
|
+
return form;
|
2169
|
+
}
|
2170
|
+
getMgdID() {
|
2171
|
+
return this._mgData.GetId();
|
2172
|
+
}
|
2173
|
+
getMGData() {
|
2174
|
+
return this._mgData;
|
2175
|
+
}
|
2176
|
+
async RefreshDisplay() {
|
2177
|
+
if (this.Form !== null && !this.isAborting() && this.isStarted()) {
|
2178
|
+
Logger.Instance.WriteDevToLog("Start task.RefreshDisplay()");
|
2179
|
+
if (this._refreshType !== Constants.TASK_REFRESH_NONE) {
|
2180
|
+
let form = this.Form;
|
2181
|
+
let wasRefreshed = await form.RefreshDisplay(Constants.TASK_REFRESH_FORM);
|
2182
|
+
if (wasRefreshed) {
|
2183
|
+
this._refreshType = Constants.TASK_REFRESH_NONE;
|
2184
|
+
}
|
2185
|
+
}
|
2186
|
+
Logger.Instance.WriteDevToLog("End task.RefreshDisplay()");
|
2187
|
+
}
|
2188
|
+
}
|
2189
|
+
getFieldDisplayValue(fieldDef, value, isNull) {
|
2190
|
+
value.value = fieldDef.getDispValue();
|
2191
|
+
isNull.value = fieldDef.isNull();
|
2192
|
+
}
|
2193
|
+
async UpdateFieldValueAndStartRecompute(fieldDef, value, isNull) {
|
2194
|
+
if (this.TaskPrefixExecuted) {
|
2195
|
+
await fieldDef.setValueAndStartRecompute(value, isNull, true, false, false);
|
2196
|
+
}
|
2197
|
+
}
|
2198
|
+
ShouldNonInteractiveChildBeModal() {
|
2199
|
+
return this.ShouldChildBeModal();
|
2200
|
+
}
|
2201
|
+
ShouldChildBeModal() {
|
2202
|
+
let childShouldBehaveAsModal = false;
|
2203
|
+
if ((this.Form.ConcreteWindowType === WindowType.Overlay) && this.getForm().Opened)
|
2204
|
+
childShouldBehaveAsModal = true;
|
2205
|
+
else if (!this.IsInteractive) {
|
2206
|
+
childShouldBehaveAsModal = true;
|
2207
|
+
}
|
2208
|
+
return childShouldBehaveAsModal;
|
2209
|
+
}
|
2210
|
+
getParent() {
|
2211
|
+
return this._parentTask;
|
2212
|
+
}
|
2213
|
+
isDescendentOf(chkTask) {
|
2214
|
+
if (chkTask === this)
|
2215
|
+
return true;
|
2216
|
+
else if (chkTask === null || this._parentTask === null)
|
2217
|
+
return false;
|
2218
|
+
return this._parentTask.isDescendentOf(chkTask);
|
2219
|
+
}
|
2220
|
+
GetSubformModalParentTask() {
|
2221
|
+
let currTask = this;
|
2222
|
+
while (currTask._parentTask != null && currTask._parentTask.getIsDestinationCall()) {
|
2223
|
+
let subformCtrl = (currTask._parentTask.getForm().getSubFormCtrl());
|
2224
|
+
if (subformCtrl.IsModal()) {
|
2225
|
+
return subformCtrl;
|
2226
|
+
}
|
2227
|
+
currTask = currTask._parentTask;
|
2228
|
+
}
|
2229
|
+
return null;
|
2230
|
+
}
|
2231
|
+
ShouldEvaluatePropertyLocally(propId) {
|
2232
|
+
return this.TaskService.ShouldEvaluatePropertyLocally(propId);
|
2233
|
+
}
|
2234
|
+
EnsureValidForm() {
|
2235
|
+
if (this._isMainPrg && this.Form !== null) {
|
2236
|
+
if (!this._openWin || !this.Form.isLegalForm) {
|
2237
|
+
this.Form = null;
|
2238
|
+
}
|
2239
|
+
}
|
2240
|
+
}
|
2241
|
+
async ComputeMainDisplay() {
|
2242
|
+
let propMainDisplay = this.getProp(PropInterface.PROP_TYPE_MAIN_DISPLAY);
|
2243
|
+
let mainDisplayIndex = await propMainDisplay.getValueInt();
|
2244
|
+
mainDisplayIndex = this.GetRealMainDisplayIndexOnCurrentTask(mainDisplayIndex);
|
2245
|
+
this._forms.InitFormFromXmlString(mainDisplayIndex);
|
2246
|
+
this.EnsureValidForm();
|
2247
|
+
}
|
2248
|
+
async PrepareTaskForm() {
|
2249
|
+
await TaskServiceBase.PreparePropOpenTaskWindow(this);
|
2250
|
+
return await RemoteTaskService.PreparePropMainDisplay(this);
|
2251
|
+
}
|
2252
|
+
FormIsLegal() {
|
2253
|
+
let isFormIsLegal = super.isMainProg();
|
2254
|
+
return isFormIsLegal || super.getForm().isLegalForm;
|
2255
|
+
}
|
2256
|
+
GetRealMainDisplayIndexOnDepth(mainDspIdx) {
|
2257
|
+
let task = this.LogicalStudioParentTask;
|
2258
|
+
while (task != null) {
|
2259
|
+
mainDspIdx += task._forms.Count;
|
2260
|
+
task = task.LogicalStudioParentTask;
|
2261
|
+
}
|
2262
|
+
return mainDspIdx;
|
2263
|
+
}
|
2264
|
+
GetRealMainDisplayIndexOnCurrentTask(mainDspIdx) {
|
2265
|
+
if (mainDspIdx > 1) {
|
2266
|
+
let task = this.LogicalStudioParentTask;
|
2267
|
+
while (task != null) {
|
2268
|
+
mainDspIdx -= task._forms.Count;
|
2269
|
+
task = task.LogicalStudioParentTask;
|
2270
|
+
}
|
2271
|
+
}
|
2272
|
+
return mainDspIdx;
|
2273
|
+
}
|
2274
|
+
GetAncestorTaskByTaskDefinitionId(findTaskDefinitionId) {
|
2275
|
+
let currentTask = this;
|
2276
|
+
if (findTaskDefinitionId.IsMainProgram())
|
2277
|
+
return GuiDataCollection.MGDataTable.GetMainProgByCtlIdx(this.ContextID, findTaskDefinitionId.CtlIndex);
|
2278
|
+
while (currentTask != null) {
|
2279
|
+
if (currentTask.TaskDefinitionId.Equals(findTaskDefinitionId))
|
2280
|
+
return currentTask;
|
2281
|
+
currentTask = currentTask._parentTask;
|
2282
|
+
}
|
2283
|
+
return null;
|
2284
|
+
}
|
2285
|
+
SetDataControlValuesReference(controlId, dcValuesId) {
|
2286
|
+
let ctrl = super.getForm().getCtrl(controlId);
|
2287
|
+
ctrl.setDcValId(dcValuesId);
|
2288
|
+
}
|
2289
|
+
DisplayMessageToStatusBar(text) {
|
2290
|
+
let taskToVerifyOn = this.GetContextTask();
|
2291
|
+
if (taskToVerifyOn.getForm() == null)
|
2292
|
+
taskToVerifyOn = LastFocusedManager.Instance.getLastFocusedTask();
|
2293
|
+
taskToVerifyOn.WriteToMessagePane(text);
|
2294
|
+
}
|
2295
|
+
isTableWithAbsolutesScrollbar() {
|
2296
|
+
let isTableWithAbsolutesScrollbar = false;
|
2297
|
+
if (this.getForm() != null)
|
2298
|
+
isTableWithAbsolutesScrollbar = this.getForm().isTableWithAbsoluteScrollbar();
|
2299
|
+
return isTableWithAbsolutesScrollbar;
|
2300
|
+
}
|
2301
|
+
GetTaskDetails() {
|
2302
|
+
let names = (this.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue();
|
2303
|
+
let task = this;
|
2304
|
+
while (task.ParentTask !== null && !task.ParentTask.isMainProg()) {
|
2305
|
+
task = task.ParentTask;
|
2306
|
+
names = (task.getProp(PropInterface.PROP_TYPE_NAME)).GetComputedValue() + "." + names;
|
2307
|
+
}
|
2308
|
+
return names;
|
2309
|
+
}
|
2310
|
+
static async ProcessTaskURL() {
|
2311
|
+
let xmlData = RuntimeContextBase.Instance.Parser.getXMLdata();
|
2312
|
+
let endTaskUrlIdx = xmlData.indexOf(XMLConstants.TAG_CLOSE, RuntimeContextBase.Instance.Parser.getCurrIndex());
|
2313
|
+
Debug.Assert(endTaskUrlIdx !== -1 && endTaskUrlIdx < xmlData.length);
|
2314
|
+
let tag = RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx);
|
2315
|
+
RuntimeContextBase.Instance.Parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_TASKURL) + ConstInterface.MG_TAG_TASKURL.length);
|
2316
|
+
let tokensVector = XmlParser.getTokens(RuntimeContextBase.Instance.Parser.getXMLsubstring(endTaskUrlIdx), XMLConstants.XML_ATTR_DELIM);
|
2317
|
+
let taskCacheURL = tokensVector.get_Item(1);
|
2318
|
+
let refListStr = tokensVector.get_Item(3);
|
2319
|
+
let taskContentOriginal = "";
|
2320
|
+
if (taskCacheURL.trim() != "") {
|
2321
|
+
if (taskCacheURL.startsWith("./"))
|
2322
|
+
taskCacheURL = NString.Replace(taskCacheURL, './', ClientManager.GetAssetsURL() + '/cache/');
|
2323
|
+
taskContentOriginal = await Task.CommandsProcessor.GetContent(taskCacheURL, true);
|
2324
|
+
}
|
2325
|
+
let taskContentFinal = new StringBuilder(xmlData.substr(0, RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1)), taskContentOriginal.length);
|
2326
|
+
let reflist = this.getReflist(refListStr, ';', true, -1);
|
2327
|
+
let refListIdx = 0;
|
2328
|
+
let currIdx = taskContentOriginal.indexOf("[:");
|
2329
|
+
let prevIdx = 0;
|
2330
|
+
while (currIdx !== -1) {
|
2331
|
+
taskContentFinal.Append(taskContentOriginal.substr(prevIdx, currIdx - prevIdx));
|
2332
|
+
taskContentFinal.Append(reflist.get_Item(refListIdx++));
|
2333
|
+
currIdx += 2;
|
2334
|
+
prevIdx = currIdx;
|
2335
|
+
currIdx = taskContentOriginal.indexOf("[:", prevIdx);
|
2336
|
+
}
|
2337
|
+
taskContentFinal.Append(taskContentOriginal.substr(prevIdx));
|
2338
|
+
taskContentFinal.Append(xmlData.substr(xmlData.indexOf(XMLConstants.TAG_CLOSE, endTaskUrlIdx + 1) + 1));
|
2339
|
+
xmlData = taskContentFinal.ToString();
|
2340
|
+
Logger.Instance.WriteDevToLog(NString.Format("{0} -------> {1}", taskCacheURL, xmlData));
|
2341
|
+
RuntimeContextBase.Instance.Parser.setXMLdata(xmlData);
|
2342
|
+
RuntimeContextBase.Instance.Parser.setCurrIndex(RuntimeContextBase.Instance.Parser.getCurrIndex() - (ConstInterface.MG_TAG_TASKURL.length + 1));
|
2343
|
+
}
|
2344
|
+
static getReflist(data, delim, trunc, maxTokens) {
|
2345
|
+
let currStr = new StringBuilder();
|
2346
|
+
let list = new List();
|
2347
|
+
let tokensCnt = 0;
|
2348
|
+
for (let i = 1; i < data.length; i++) {
|
2349
|
+
let curr = data.charAt(i);
|
2350
|
+
if (curr !== '\\' && curr !== delim)
|
2351
|
+
currStr.Append(curr);
|
2352
|
+
else if (curr === delim) {
|
2353
|
+
list.push(currStr.ToString());
|
2354
|
+
currStr = new StringBuilder();
|
2355
|
+
tokensCnt++;
|
2356
|
+
if (tokensCnt === maxTokens)
|
2357
|
+
break;
|
2358
|
+
}
|
2359
|
+
else if (curr === '\\') {
|
2360
|
+
if (!trunc && data.charAt(i + 1) !== delim)
|
2361
|
+
currStr.Append(data.charAt(i));
|
2362
|
+
i++;
|
2363
|
+
currStr.Append(data.charAt(i));
|
2364
|
+
}
|
2365
|
+
}
|
2366
|
+
list.push(currStr.ToString());
|
2367
|
+
return list;
|
2368
|
+
}
|
2369
|
+
static async StartProgram(callByDestSubForm, moveToFirstControl) {
|
2370
|
+
let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
|
2371
|
+
let nonInteractiveTaskAlreadyExecuted = null;
|
2372
|
+
let allowEvents = AccessHelper.eventsManager.getAllowEvents();
|
2373
|
+
AccessHelper.eventsManager.setAllowEvents(EventsAllowedType.ALL);
|
2374
|
+
Logger.Instance.WriteDevToLog("Start \"startProg\"");
|
2375
|
+
Task.StartProgLevel++;
|
2376
|
+
AccessHelper.eventsManager.setStopExecution(false);
|
2377
|
+
nonInteractiveTaskAlreadyExecuted = await this.ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl);
|
2378
|
+
let nonInteractiveTaskAlreadyExecutedRef = new RefParam(nonInteractiveTaskAlreadyExecuted);
|
2379
|
+
let currentNonInteractiveTaskRef = new RefParam(null);
|
2380
|
+
await Task.ExecuteMainProgram(0, callByDestSubForm, moveToFirstControl, nonInteractiveTaskAlreadyExecutedRef, currentNonInteractiveTaskRef, AccessHelper.mgDataTable);
|
2381
|
+
nonInteractiveTaskAlreadyExecuted = nonInteractiveTaskAlreadyExecutedRef.value;
|
2382
|
+
if (!Task._idleTimerStarted) {
|
2383
|
+
GUIManager.Instance.startTimer(AccessHelper.mgDataTable.getMGData(0), Environment.Instance.getIdleTime(0), true);
|
2384
|
+
Task._idleTimerStarted = true;
|
2385
|
+
}
|
2386
|
+
await this.OpenForms(callByDestSubForm);
|
2387
|
+
await this.DoFirstRecordCycle();
|
2388
|
+
await this.MoveToFirstControls(callByDestSubForm);
|
2389
|
+
if (Task.StartProgLevel === 1) {
|
2390
|
+
let resetAllowEvents = false;
|
2391
|
+
let canExecuteEvents = true;
|
2392
|
+
if (nonInteractiveTaskAlreadyExecuted !== null && nonInteractiveTaskAlreadyExecuted.isStarted()) {
|
2393
|
+
resetAllowEvents = true;
|
2394
|
+
AccessHelper.eventsManager.setNonInteractiveAllowEvents(await nonInteractiveTaskAlreadyExecuted.isAllowEvents());
|
2395
|
+
canExecuteEvents = await nonInteractiveTaskAlreadyExecuted.isAllowEvents();
|
2396
|
+
}
|
2397
|
+
if (LastFocusedManager.Instance.getLastFocusedTask() !== null && canExecuteEvents) {
|
2398
|
+
AccessHelper.eventsManager.pushNewExecStacks();
|
2399
|
+
await AccessHelper.eventsManager.handleEvents(AccessHelper.mgDataTable.getCurrMGData(), 0);
|
2400
|
+
AccessHelper.eventsManager.popNewExecStacks();
|
2401
|
+
}
|
2402
|
+
if (resetAllowEvents)
|
2403
|
+
AccessHelper.eventsManager.setAllowEvents(allowEvents);
|
2404
|
+
}
|
2405
|
+
Task.StartProgLevel--;
|
2406
|
+
Logger.Instance.WriteDevToLog("End \"startProg\"");
|
2407
|
+
if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
|
2408
|
+
if (orgStopExecution && !AccessHelper.eventsManager.GetStopExecutionFlag())
|
2409
|
+
AccessHelper.eventsManager.setStopExecution(orgStopExecution);
|
2410
|
+
return nonInteractiveTaskAlreadyExecuted;
|
2411
|
+
}
|
2412
|
+
static async ExecuteComponentMainPrograms(callByDestSubForm, moveToFirstControl) {
|
2413
|
+
let currentNonInteractiveTask = new RefParam(null);
|
2414
|
+
let nonInteractiveTaskAlreadyExecuted = new RefParam(null);
|
2415
|
+
let maxCtlIdx = AccessHelper.mgDataTable.getMGData(0).getMaxCtlIdx();
|
2416
|
+
for (let i = 1; i <= maxCtlIdx; i = i + 1) {
|
2417
|
+
let componentMainProgram = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, i);
|
2418
|
+
if (componentMainProgram !== null)
|
2419
|
+
await Task.ExecuteMainProgram(i, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, AccessHelper.mgDataTable);
|
2420
|
+
}
|
2421
|
+
return nonInteractiveTaskAlreadyExecuted.value;
|
2422
|
+
}
|
2423
|
+
static async ExecuteMainProgram(CtlIndex, callByDestSubForm, moveToFirstControl, currentNonInteractiveTask, nonInteractiveTaskAlreadyExecuted, mgDataTable) {
|
2424
|
+
let mainProgramTask = mgDataTable.GetMainProgByCtlIdx(-1, CtlIndex);
|
2425
|
+
Logger.Instance.WriteDevToLog(NString.Format(" ClientManager.startProg: ctlIdx={0}, task={1}", CtlIndex, mainProgramTask));
|
2426
|
+
currentNonInteractiveTask.value = (await mainProgramTask.Start(moveToFirstControl, callByDestSubForm));
|
2427
|
+
if (nonInteractiveTaskAlreadyExecuted.value === null)
|
2428
|
+
nonInteractiveTaskAlreadyExecuted.value = currentNonInteractiveTask.value;
|
2429
|
+
else if (currentNonInteractiveTask.value !== null) {
|
2430
|
+
Debug.Assert(false, "more than 1 non interactive tasks in startProg");
|
2431
|
+
}
|
2432
|
+
}
|
2433
|
+
static async OpenForms(callByDestSubForm) {
|
2434
|
+
let createdForms = MgForm.CreatedForms;
|
2435
|
+
if (createdForms.Count() > 0) {
|
2436
|
+
let i = 0;
|
2437
|
+
while (i < createdForms.Count()) {
|
2438
|
+
let mgForm = createdForms.get(i);
|
2439
|
+
let canOpen = false;
|
2440
|
+
if (mgForm.isSubForm()) {
|
2441
|
+
let opened = mgForm.getSubFormCtrl().getForm().Opened;
|
2442
|
+
if (opened) {
|
2443
|
+
canOpen = true;
|
2444
|
+
}
|
2445
|
+
}
|
2446
|
+
else {
|
2447
|
+
if (mgForm.getTask().isCurrentStartProgLevel()) {
|
2448
|
+
canOpen = true;
|
2449
|
+
}
|
2450
|
+
}
|
2451
|
+
if (canOpen) {
|
2452
|
+
Manager.OpenForm(mgForm);
|
2453
|
+
await Manager.DoFirstRefreshTable(mgForm);
|
2454
|
+
}
|
2455
|
+
if (mgForm.Opened) {
|
2456
|
+
createdForms.remove(mgForm);
|
2457
|
+
}
|
2458
|
+
else
|
2459
|
+
i++;
|
2460
|
+
}
|
2461
|
+
}
|
2462
|
+
}
|
2463
|
+
static async DoFirstRecordCycle() {
|
2464
|
+
for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
|
2465
|
+
let mgd = AccessHelper.mgDataTable.getMGData(i);
|
2466
|
+
if (mgd === null || mgd.IsAborting)
|
2467
|
+
continue;
|
2468
|
+
for (let j = 0; j < mgd.getTasksCount(); j++) {
|
2469
|
+
let task = mgd.getTask(j);
|
2470
|
+
if (task !== null) {
|
2471
|
+
let mgForm = task.getForm();
|
2472
|
+
if (mgForm !== null && task.isCurrentStartProgLevel() && !mgForm.IgnoreFirstRecordCycle) {
|
2473
|
+
mgForm.IgnoreFirstRecordCycle = true;
|
2474
|
+
await task.doFirstRecordCycle();
|
2475
|
+
}
|
2476
|
+
}
|
2477
|
+
}
|
2478
|
+
}
|
2479
|
+
}
|
2480
|
+
static async MoveToFirstControls(callByDestSubForm) {
|
2481
|
+
for (let i = 0; i < AccessHelper.mgDataTable.getSize(); i++) {
|
2482
|
+
let mgd = AccessHelper.mgDataTable.getMGData(i);
|
2483
|
+
if (mgd === null || mgd.IsAborting)
|
2484
|
+
continue;
|
2485
|
+
let tasksCount = mgd.getTasksCount();
|
2486
|
+
for (let j = 0; j < tasksCount; j++) {
|
2487
|
+
let task = mgd.getTask(j);
|
2488
|
+
let mgForm = task.getForm();
|
2489
|
+
if (task.isCurrentStartProgLevel() && mgForm !== null && mgForm.MovedToFirstControl) {
|
2490
|
+
mgForm.MovedToFirstControl = false;
|
2491
|
+
if (!callByDestSubForm)
|
2492
|
+
await AccessHelper.eventsManager.HandleNonParkableControls(task);
|
2493
|
+
}
|
2494
|
+
}
|
2495
|
+
}
|
2496
|
+
}
|
2497
|
+
}
|
2498
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdGFza3MvVGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pJLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFFUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFNBQVMsRUFDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxRQUFRLEVBQ1IscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixNQUFNLEVBRU4saUJBQWlCLEVBQ2pCLEtBQUssRUFFTCxPQUFPLEVBR1AsUUFBUSxFQUNSLEdBQUcsRUFFSCxhQUFhLEVBQ2IsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRSxPQUFPLEVBQXdCLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVB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QUFTO1lBRVgsSUFBSSxVQUFVLEdBQVcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxJQUFJLEdBQVMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxNQUFNLEdBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFFNUMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUNwRixNQUFNLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO29CQUNuQyxJQUFJLENBQUMsaUJBQWlCO3dCQUNsQixNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlYnVnLCBIYXNoVXRpbHMsIExpc3QsIE5OdW1iZXIsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdGFjaywgU3RyaW5nQnVpbGRlciwgaXNOdWxsT3JVbmRlZmluZWR9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcclxuaW1wb3J0IHtcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdHJVdGlsLFxyXG4gIFVuaXF1ZVRza1NvcnQsXHJcbiAgV2luZG93VHlwZSxcclxuICBYTUxDb25zdGFudHMsXHJcbiAgWG1sUGFyc2VyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHMsXHJcbiAgRGF0YU1vZGlmaWNhdGlvblR5cGVzLFxyXG4gIERpc3BsYXlDb252ZXJ0b3IsXHJcbiAgRXZlbnRzLFxyXG4gIEZpZWxkRGVmLFxyXG4gIEd1aURhdGFDb2xsZWN0aW9uLFxyXG4gIEhlbHBzLFxyXG4gIElUYXNrLFxyXG4gIE1hbmFnZXIsXHJcbiAgTWdDb250cm9sQmFzZSxcclxuICBNZ0Zvcm1CYXNlLFxyXG4gIE5VTV9UWVBFLFxyXG4gIFBJQyxcclxuICBQcm9wZXJ0eSxcclxuICBQcm9wSW50ZXJmYWNlLFxyXG4gIFJlY29yZFV0aWxzLFxyXG4gIFJ1bnRpbWVDb250ZXh0QmFzZSxcclxuICBTdHlsZXMsXHJcbiAgVGFza0RlZmluaXRpb25JZFxyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi4vZXZlbnQvRXZlbnQnO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tICcuLi9kYXRhL0RhdGFWaWV3JztcclxuaW1wb3J0IHtEdkNhY2hlfSBmcm9tICcuLi9kYXRhL0R2Q2FjaGUnO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSAnLi9NR0RhdGEnO1xyXG5pbXBvcnQge0RhdGFWaWV3Q29tbWFuZFR5cGV9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0RhdGF2aWV3Q29tbWFuZCc7XHJcbmltcG9ydCB7Q29tbWFuZHNQcm9jZXNzb3JCYXNlLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9ufSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3NvckJhc2UnO1xyXG5pbXBvcnQge1Rhc2tTZXJ2aWNlQmFzZX0gZnJvbSAnLi9UYXNrU2VydmljZUJhc2UnO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gJy4uL3J0L0FyZ3VtZW50c0xpc3QnO1xyXG5pbXBvcnQge1Rhc2tUcmFuc2FjdGlvbk1hbmFnZXJ9IGZyb20gJy4uL2RhdGEvVGFza1RyYW5zYWN0aW9uTWFuYWdlcic7XHJcbmltcG9ydCB7RGF0YXZpZXdNYW5hZ2VyfSBmcm9tICcuLi9kYXRhL0RhdGF2aWV3TWFuYWdlcic7XHJcbmltcG9ydCB7U29ydENvbGxlY3Rpb259IGZyb20gJy4vc29ydC9Tb3J0Q29sbGVjdGlvbic7XHJcbmltcG9ydCB7U29ydH0gZnJvbSAnLi9zb3J0L1NvcnQnO1xyXG5pbXBvcnQge01nRm9ybX0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tICcuLi9ndWkvTWdDb250cm9sJztcclxuaW1wb3J0IHtSZW1vdGVUYXNrU2VydmljZX0gZnJvbSAnLi9SZW1vdGVUYXNrU2VydmljZSc7XHJcbmltcG9ydCB7UmV0dXJuUmVzdWx0fSBmcm9tICcuLi91dGlsL1JldHVyblJlc3VsdCc7XHJcbmltcG9ydCB7UnVuVGltZUV2ZW50fSBmcm9tICcuLi9ldmVudC9SdW5UaW1lRXZlbnQnO1xyXG5pbXBvcnQge0lDbGllbnRDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9JQ2xpZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7Q29tbWFuZEZhY3Rvcnl9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0NvbW1hbmRGYWN0b3J5JztcclxuaW1wb3J0IHtEYXRhdmlld0hlYWRlcnN9IGZyb20gJy4uL3J0L0RhdGF2aWV3SGVhZGVycyc7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb259IGZyb20gJy4uL3J0L1RyYW5zYWN0aW9uJztcclxuaW1wb3J0IHtUYXNrc1RhYmxlfSBmcm9tICcuL1Rhc2tzVGFibGUnO1xyXG5pbXBvcnQge0lDbGllbnRUYXJnZXRlZENvbW1hbmR9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRUYXJnZXRlZENvbW1hbmQnO1xyXG5pbXBvcnQge0hhbmRsZXJzVGFibGV9IGZyb20gJy4uL3J0L0hhbmRsZXJzVGFibGUnO1xyXG5pbXBvcnQge1JlY29tcHV0ZVRhYmxlfSBmcm9tICcuLi9ydC9SZWNvbXB1dGVUYWJsZSc7XHJcbmltcG9ydCB7RXhwVGFibGV9IGZyb20gJy4uL2V4cC9FeHBUYWJsZSc7XHJcbmltcG9ydCB7VXNlckV2ZW50c1RhYmxlfSBmcm9tICcuLi9ldmVudC9Vc2VyRXZlbnRzVGFibGUnO1xyXG5pbXBvcnQge0Zvcm1zVGFibGV9IGZyb20gJy4uL2d1aS9Gb3Jtc1RhYmxlJztcclxuaW1wb3J0IHtGbG93TW9uaXRvclF1ZXVlfSBmcm9tICcuLi91dGlsL0Zsb3dNb25pdG9yUXVldWUnO1xyXG5pbXBvcnQge0ZpZWxkfSBmcm9tICcuLi9kYXRhL0ZpZWxkJztcclxuaW1wb3J0IHtBY3Rpb25NYW5hZ2VyfSBmcm9tICcuLi9ldmVudC9BY3Rpb25NYW5hZ2VyJztcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSAnLi4vQ29uc3RJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0V2ZW50SGFuZGxlcn0gZnJvbSAnLi4vZXZlbnQvRXZlbnRIYW5kbGVyJztcclxuaW1wb3J0IHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHAvRXhwcmVzc2lvbic7XHJcbmltcG9ydCB7RmllbGRzVGFibGVFeHQgYXMgRmllbGRzVGFibGV9IGZyb20gJy4uL2RhdGEvRmllbGRzVGFibGUnO1xyXG5pbXBvcnQge0dVSU1hbmFnZXJ9IGZyb20gJy4uL0dVSU1hbmFnZXInO1xyXG5pbXBvcnQge0NvbW1hbmRzUHJvY2Vzc29yTWFuYWdlcn0gZnJvbSAnLi4vQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyJztcclxuaW1wb3J0IHtSZWNvcmR9IGZyb20gJy4uL2RhdGEvUmVjb3JkJztcclxuaW1wb3J0IHtFdmVudFN1YlR5cGV9IGZyb20gJy4uL2VudW1zJztcclxuaW1wb3J0IHtPcGVuaW5nVGFza0RldGFpbHMsIFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bSwgVGFza0Jhc2UsIFVzZXJSYW5nZX0gZnJvbSAnLi9UYXNrQmFzZSc7XHJcbmltcG9ydCB7TGFuZ3VhZ2VEYXRhfSBmcm9tICcuLi9lbnYvTGFuZ3VhZ2VEYXRhJztcclxuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSAnLi4vZW52L0Vudmlyb25tZW50JztcclxuaW1wb3J0IHtMYXN0Rm9jdXNlZE1hbmFnZXJ9IGZyb20gJy4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlcic7XHJcbmltcG9ydCB7R2xvYmFsQ29tbWFuZHNNYW5hZ2VyfSBmcm9tICcuLi9HbG9iYWxDb21tYW5kc01hbmFnZXInO1xyXG5pbXBvcnQge0V2ZW50c0FsbG93ZWRUeXBlfSBmcm9tICcuLi9ldmVudC9JRXZlbnRzTWFuYWdlcic7XHJcbmltcG9ydCB7Q3JlYXRlZEZvcm1WZWN0b3J9IGZyb20gJy4uL2d1aS9DcmVhdGVkRm9ybVZlY3Rvcic7XHJcbmltcG9ydCB7QWNjZXNzSGVscGVyfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5pbXBvcnQge0lNR0RhdGFDb2xsZWN0aW9ufSBmcm9tICcuL0lNR0RhdGFDb2xsZWN0aW9uJztcclxuaW1wb3J0IHtNR0RhdGFDb2xsZWN0aW9ufSBmcm9tICcuL01HRGF0YUNvbGxlY3Rpb24nO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcbmltcG9ydCB7RXZlbnRIYW5kbGVyUG9zaXRpb259IGZyb20gJy4uL2V2ZW50L0V2ZW50SGFuZGxlclBvc2l0aW9uJztcclxuaW1wb3J0IHtDbGllbnRNYW5hZ2VyfSBmcm9tIFwiLi4vQ2xpZW50TWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGVudW0gVGFza19GbG93IHtcclxuICBOT05FLFxyXG4gIFNURVAsXHJcbiAgRkFTVFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBUYXNrX0RpcmVjdGlvbiB7XHJcbiAgQkFDSyA9IC0xLFxyXG4gIE5PTkUsXHJcbiAgRk9SRVxyXG59XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgVGFzayBleHRlbmRzIFRhc2tCYXNlIHtcclxuICBwcml2YXRlIF9kdkNhY2hlOiBEdkNhY2hlID0gbnVsbDtcclxuICBwcml2YXRlIF9tZ0RhdGE6IE1HRGF0YSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYWJvcnRpbmc6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBhbiBhYm9ydCBjb21tYW5kIHdhcyBleGVjdXRlZCBmb3IgdGhpcyB0YXNrIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzXHJcbiAgcHJpdmF0ZSBfYkV4ZWNFbmRUYXNrOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZXZhbE9sZFZhbHVlczogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgLy8gaW5kaWNhdGVzIGZvciB0aGUgZ2V0IHZhbHVlIHRvIGdldCB0aGUgb2xkIHZhbHVlIG9mIHRoZSBmaWVsZFxyXG4gIHByaXZhdGUgX2luUmVjb3JkU3VmZml4OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgIC8vIGluZGljYXRlIHdlIGFyZSBpbiByZWNvcmQgc3VmZml4IChoYW5kbGUgYmVmb3JlKVxyXG4gIHByaXZhdGUgX2NhbmNlbFdhc1JhaXNlZDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgIC8vIHdhcyBjYW5jZWwvcXVpdCBldmVudCByYWlzZWQgP1xyXG4gIHByaXZhdGUgX2NvdW50ZXI6IG51bWJlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlcyBvbmx5IGluIG5vbiBpbnRlcnZhbCB0YXNrcy5cclxuICBwcml2YXRlIF9jdXJyU3RhcnRQcm9nTGV2ZWw6IG51bWJlciA9IDA7ICAgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2Ygc3RhcnRQcm9nIHJlcXVlc3QgaW4gd2hpY2ggd2UgdGFzayBpcyBzdGFydGVkXHJcbiAgcHJpdmF0ZSBfZGVzdGluYXRpb25TdWJmb3JtOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgLy8gaWYgVFJVRSwgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2tcclxuICBwcml2YXRlIF9lbmFibGVab29tSGFuZGxlcjogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAvLyBpZiBUUlVFLCB0aGVyZSBpcyBhIHpvb20gaGFuZGxlciBmb3IgdGhpcyBmaWVsZFxyXG4gIHByaXZhdGUgX2ZpcnN0UmVjb3JkQ3ljbGU6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBpbiB0aGUgZmlyc3QgcmVjb3JkIGN5Y2xlXHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWxUYXNrTW9kZTogc3RyaW5nID0gJyAnO1xyXG4gIHByaXZhdGUgX2luQ3JlYXRlTGluZTogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIGlzIHRoZSB0YXNrIGludG8gcHJvY2Vzc2luZyBDUkVBVEUgTElORVxyXG4gIHB1YmxpYyBJblNlbGVjdDogYm9vbGVhbiA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIHdoZW4gdGhlIHRhc2sgaXMgZXhlY3V0aW5nIGEgU0VMRUNUIGludGVybmFsIGV2ZW50XHJcbiAgcHVibGljIEluU3RhcnRQcm9jZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNEZXN0aW5hdGlvbkNhbGw6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgLy8gaWYgVFJVRSwgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2sgYnkgY2FsbCBvcGVyYXRpb25cclxuICBwcml2YXRlIF9rbm93blRvU2VydmVyOiBib29sZWFuID0gdHJ1ZTsgICAgICAgICAgICAgICAvLyBGYWxzZSBpZiB0aGUgc2VydmVyIGhhc1xyXG4gIHByaXZhdGUgX2xvb3BTdGFjazogU3RhY2s8bnVtYmVyPiA9IG51bGw7XHJcbiAgcHJpdmF0ZSBhbGxvd1JlbW90ZUNtZEV4ZWN1dGlvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgRGVsYXlDb21tYW5kRXhlY3V0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLzxzdW1tYXJ5PlxyXG4gIC8vLyBUaGlzIGlzIHRoZSB0YXNrIHdoaWNoIGludm9rZWQgdGhlIGhhbmRsZXIgY29udGFpbmluZyB0aGUgQ2FsbCBvcGVyYXRpb24uXHJcbiAgLy8vIFRoaXMgbWVtYmVyIGlzIHVzZWQgZm9yIHNlYXJjaGluZyB0aGUgdmFyaWFibGVzIGxpa2UgVmFySW5kZXgoKSwgZXRjXHJcbiAgLy8vPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgX3BhcmVudFRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgZ2V0IFBhcmVudFRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29udGV4dFRhc2s6IFRhc2sgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgY29udGV4dCBvZiB3aGljaCB0YXNrIHRoaXMgdGFzayBpcyBjdXJyZW50bHkgcnVubmluZ1xyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVGhpcyBpcyBzYW1lIGFzIF9wYXJlbnRUYXNrIGV4Y2VwdCBmb3IgTW9kYWwgdGFza3MuIEluIGNhc2UsIHRoZSBjdXJyZW50IHRhc2sgaXMgbW9kYWwsIF90cmlnZ2VyaW5nVGFzayByZWZlcnMgdG9cclxuICAvLy8gIHRoZSB0YXNrIHdoaWNoIGludm9rZWQgdGhlIGhhbmRsZXIgb2YgdGhlIF9wYXJlbnRUYXNrLiBUaGlzIG1lbWJlciBpcyB1c2VkIGZvciBhbGwgZ2VuZXJhdGlvbi1iYXNlZCBmdW5jdGlvbnMgYW5kIFByb2coKS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgX3RyaWdnZXJpbmdUYXNrOiBUYXNrID0gbnVsbDsgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgdGFzayB0aGF0IHRyaWdnZXJlZCB0aGUgaGFuZGxlciB3aGljaCBjcmVhdGVkIG1lXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgaXMgdGhlIHRhc2sgd2hpY2ggY29udGFpbmVkIHRoZSBDYWxsIG9wZXJhdGlvbi4gSWYgdGhlIHRhc2sgd2FzIGV4ZWN1dGVkIHdpdGhvdXQgY2FsbFxyXG4gIC8vLyAgIG9wZXJhdGlvbiBlZy4gdGhlIE1QLCB0aGUgc3RhcnR1cCBwcm9ncmFtLCBldGMuLCBpdCByZWZlcnMgdG8gaXRzZWxmLiBUaGlzIG1lbWJlciB1c2VkIHRvIHNlYXJjaCBmb3IgdGhlIGV2ZW50IGhhbmRsZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgUGF0aFBhcmVudFRhc2s6IFRhc2sgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9wcmV2ZW50Q29udHJvbENoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3ByZXZlbnRSZWNvcmRTdWZmaXg6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF90YXNrUGF0aDogTGlzdDxUYXNrPiA9IG51bGw7XHJcblxyXG4gIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBpcyBjdXJyZW50bHkgdHJ5aW5nIHRvIGNvbW1pdCBhIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICBwcml2YXRlIF90cnlpbmdUb0NvbW1pdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZXQgVHJ5aW5nVG9Db21taXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3RyeWluZ1RvQ29tbWl0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQgVHJ5aW5nVG9Db21taXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJ5aW5nVG9Db21taXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91c2VMb29wU3RhY2s6IGJvb2xlYW4gPSBmYWxzZTsgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhwcmVzc2lvbiAoTE9PUENPVU5URVIoKSkgaXMgaW4gdGhlIHNjb3BlIG9mIEJsb2NrIExvb3AuXHJcbiAgcHJpdmF0ZSBfaW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgSW5IYW5kbGVBY3RDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgUnVudGltZVNvcnRzOiBTb3J0Q29sbGVjdGlvbiA9IG51bGw7XHJcbiAgcHVibGljIFZld0ZpcnN0OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBkYXRhVmlld0NvbnRlbnQ6IHN0cmluZyA9IG51bGw7ICAgICAgICAgICAgICAgIC8vIGRhdGFWaWV3Q29udGVudCByZXRyaWV2ZWQgYnkgR2V0RGF0YVZpZXdDb250ZW50IGNvbW1hbmQuXHJcbiAgcHVibGljIFBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXg6IGJvb2xlYW4gPSBmYWxzZTsgICAgLy8gSW4gcmVjb3JkIHByZWZpeCAoY29tbW9uSGFuZGxlckJlZm9yZSkgd2UgZXhlY3V0ZSByZWNvcmQgcHJlZml4IG9mIGFsbCBmYXRoZXJzLlxyXG5cclxuICAvLyBCdXQgd2UgZG8gbm90IG5lZWQgaXQgaW4gYWxsIGNhc2VzLlxyXG4gIC8vIFdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIHNlcnZlciB3ZSBkbyBub3QgbmVlZCBpdC5cclxuICAvLyBXaGVuIHdlIGNsaWNrIG9uIHRoZSBuZXN0ZWQgc3ViZm9ybSB3ZSBuZWVkIGl0LlxyXG4gIC8vIGlmIHRydWUsIGRvIHRoZSBwYXJlbnQgc3ViZm9ybSByZWNvcmQgcHJlZml4XHJcblxyXG4gIC8vIC0xIOKAkyBUaGUgdGFzayBpcyBub3QgZXhlY3V0ZWQgYXMgYSBzdWJmb3JtXHJcbiAgLy8gIDAg4oCTIFRoZSB0YXNrIGlzIGV4ZWN1dGVkIGJ5IHNldHRpbmcgdGhlIGZvY3VzIG9uIGl0XHJcbiAgLy8gIDEg4oCTIFRoZSBzdWJ0YXNrIGlzIGV4ZWN1dGVkIGZvciB0aGUgZmlyc3QgdGltZVxyXG4gIC8vICAyIOKAkyBUaGUgdGFzayBpcyBleGVjdXRlZCBiZWNhdXNlIHRoZSBBdXRvbWF0aWMgUmVmcmVzaCBwcm9wZXJ0eVxyXG4gIC8vICAgICAgb3IgdGhlIFN1YmZvcm0gUmVmcmVzaCBldmVudCBoYXMgYmVlbiB0cmlnZ2VyZWRcclxuICBwdWJsaWMgTW9kZUFzUGFyZW50OiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzayBtb2RlIGlzICdBcyBQYXJlbnQnIHdlIG5lZWQgdG8gY2FyZSBvdXQgaXQgc3BlY2lmaWNhbGx5XHJcbiAgcHVibGljIFRhc2tUcmFuc2FjdGlvbk1hbmFnZXI6IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIgPSBudWxsO1xyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgc3ViZm9ybSBtdXN0IGJlIHJlZnJlc2hlZCBvbiB0aGUgY2xpZW50LlxyXG4gIC8vLyBSZWxldmFudCBvbmx5IGZvciBub24tb2ZmbGluZSB3aXRoIGxvY2FsIGRhdGEuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgRXhlY3V0ZUNsaWVudFN1YmZvcm1SZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgZXhlY3V0ZXMgQ29tbW9uSGFuZGxlckJlZm9yZSBtZXRob2QuXHJcbiAgLy8vIEZvciBzdWJmb3JtcyB3ZSBkbyBub3QgZXhlY3V0ZSBpdCdzIFJQIGlmIHRoZSBwYXJlbnQgZGlkbid0IGZpbmlzaGVkIHlldFxyXG4gIC8vLyBpdCdzIENvbW1hbmRIYW5kbGVyQmVmb3JlIG1ldGhvZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBJbkNvbW1vbkhhbmRsZXJCZWZvcmVSUDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHJpZXZlIGFuZCByZXR1cm4gYSBzZXJ2aWNlIG9iamVjdCBjb250YWluaW5nIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBkaWZmZXJlbnQgaW4gdGhlIHRhc2sgbGV2ZWwgYmV0d2VlbiBjb25uZWN0ZWQgYW5kIG9mZmxpbmUgc3RhdGVzLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBfdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlQmFzZSA9IG51bGw7XHJcblxyXG4gIGdldCBUYXNrU2VydmljZSgpOiBUYXNrU2VydmljZUJhc2Uge1xyXG4gICAgaWYgKHRoaXMuX3Rhc2tTZXJ2aWNlID09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tTZXJ2aWNlID0gbmV3IFJlbW90ZVRhc2tTZXJ2aWNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXRyaWV2ZSBhbmQgcmV0dXJuIGEgY29tbWFuZHMgcHJvY2Vzc29yIGRlcGVuZGluZyBvbiB0YXNrIHR5cGUgYW5kIHN0YXRlLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGdldCBDb21tYW5kc1Byb2Nlc3NvcigpOiBDb21tYW5kc1Byb2Nlc3NvckJhc2Uge1xyXG4gICAgcmV0dXJuIENvbW1hbmRzUHJvY2Vzc29yTWFuYWdlci5HZXRDb21tYW5kc1Byb2Nlc3NvcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNMb2NhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHRhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQgPSBudWxsO1xyXG4gIHB1YmxpYyBBcmd1bWVudHNMaXN0OiBBcmd1bWVudHNMaXN0ID0gbnVsbDsgICAgICAgICAgIC8vIG9mZi1saW5lIGV4ZWN1dGlvbiAtIHRhc2sgYXJndW1lbnQsIHRvIGVuYWJsZSB0aGUgdXBkYXRlIG9mIGZpZWxkIHZhbHVlc1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHBhcmVudCB0YXNrIG9mIHRoZSBzdWJ0YXNrIGJ5IHRvb2xraXQgdHJlZSBpbmNsdWRlIHRoZSBtYWluIHByb2dyYW0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgTG9naWNhbFN0dWRpb1BhcmVudFRhc2soKTogVGFzayB7XHJcbiAgICBpZiAodGhpcy5TdHVkaW9QYXJlbnRUYXNrID09PSBudWxsICYmICFzdXBlci5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgcmV0dXJuIDxUYXNrPkd1aURhdGFDb2xsZWN0aW9uLk1HRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgodGhpcy5Db250ZXh0SUQsIHRoaXMuX2N0bElkeCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIDxUYXNrPnRoaXMuU3R1ZGlvUGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIGdldCBLbm93blRvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2tub3duVG9TZXJ2ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ29uZmlybVVwZGF0ZU5vOiBib29sZWFuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgLy8gb25seSBmb3IgY29uZmlybXMgdXBkYXRlXHJcbiAgcHVibGljIERhdGFTeW5jZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgVW5pcXVlU29ydDogVW5pcXVlVHNrU29ydCA9IG51bGw7XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHRoZSB0cmFuc2FjdGlvbiBuZWVkIHRvIGJlIG9uIHRoZSBkYXRhIHZpZXcgbWFuYWdlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0IFRyYW5zYWN0aW9uKHZhbHVlOiBUcmFuc2FjdGlvbikge1xyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IFRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLkRhdGF2aWV3TWFuYWdlci5DdXJyZW50RGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZnJlc2hPblZhcnM6IG51bWJlcltdID0gbnVsbDtcclxuICBwdWJsaWMgRHZQb3NEZXNjcmlwdG9yOiBMaXN0PHN0cmluZ1tdPiA9IG51bGw7XHJcbiAgcHVibGljIFN1YlRhc2tzOiBUYXNrc1RhYmxlID0gbnVsbDtcclxuICBwdWJsaWMgRXhwVGFiOiBFeHBUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIFVzZXJFdnRUYWI6IFVzZXJFdmVudHNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIERhdGF2aWV3SGVhZGVyc1RhYmxlOiBEYXRhdmlld0hlYWRlcnMgPSBudWxsO1xyXG4gIHB1YmxpYyBIYW5kbGVyc1RhYjogSGFuZGxlcnNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIF9mb3JtczogRm9ybXNUYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHVibGljIFB1YmxpY05hbWU6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhc2sgc3VmZml4IHdhcyBwZXJmb3JtZWQgZm9yIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIFRhc2tTdWZmaXhFeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBnZXQgVGFza0RlZmluaXRpb25JZCgpOiBUYXNrRGVmaW5pdGlvbklkIHtcclxuICAgIGlmICh0aGlzLnRhc2tEZWZpbml0aW9uSWQgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy50YXNrRGVmaW5pdGlvbklkID0gbmV3IFRhc2tEZWZpbml0aW9uSWQodGhpcy5fY3RsSWR4LCB0aGlzLlByb2dyYW1Jc24sIHRoaXMuVGFza0lzbiwgdGhpcy5faXNQcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGFza0RlZmluaXRpb25JZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZXRydW5WYWx1ZUV4cDogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgU3ViZm9ybUNvbnRyb2w6IE1nQ29udHJvbCA9IG51bGw7XHJcblxyXG4gIHN0YXRpYyBTdGFydFByb2dMZXZlbDogbnVtYmVyID0gMDsgIC8vIHJlY3Vyc2l2ZSBsZXZlbCBvZiBcInN0YXJ0UHJvZ1wiIGludm9jYXRpb25zXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9pZGxlVGltZXJTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHN0YXRpYyBnZXQgSXNCbG9ja2luZ0JhdGNoKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVGFzayk7XHJcbiAgY29uc3RydWN0b3IocGFyZW50PzogVGFzaykge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQocGFyZW50KSkge1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8xKHBhcmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcigpO1xyXG4gICAgdGhpcy5EYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzKTtcclxuICAgIHRoaXMuX2Zsb3dNb25pdG9yID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSB0aGlzO1xyXG4gICAgdGhpcy5fZHZDYWNoZSA9IG5ldyBEdkNhY2hlKHRoaXMpO1xyXG4gICAgdGhpcy5QZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4ID0gdHJ1ZTtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyID0gbmV3IERhdGF2aWV3TWFuYWdlcih0aGlzKTtcclxuICAgIHRoaXMuYWxsb3dSZW1vdGVDbWRFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyID0gbmV3IFRhc2tUcmFuc2FjdGlvbk1hbmFnZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YVZpZXcuSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8xKHBhcmVudDogVGFzayk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25zdHJ1Y3Rvcl8wKCk7XHJcbiAgICB0aGlzLlBhdGhQYXJlbnRUYXNrID0gcGFyZW50O1xyXG4gICAgdGhpcy5fcGFyZW50VGFzayA9IHBhcmVudDtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gbnVsbDtcclxuICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIENyZWF0ZVRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgbGV0IHRhc2sgPSAgbmV3IFRhc2soKTtcclxuICAgIHRhc2suSW5pdCgpO1xyXG4gICAgcmV0dXJuIHRhc2s7XHJcbiAgfVxyXG5cclxuICAvLyBJVGFzayBNZW1iZXJzXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlbGxzIHdoZXRoZXIgdGhlIHRhc2sgaXMgYWJvcnRpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzQWJvcnRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWJvcnRpbmc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkVGFza1BhdGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90YXNrUGF0aCA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzay5fdGFza1BhdGggIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX3Rhc2tQYXRoLkFkZFJhbmdlKHRoaXMuX3BhcmVudFRhc2suX3Rhc2tQYXRoLkdldEVudW1lcmF0b3IoKSk7XHJcbiAgICB0aGlzLl90YXNrUGF0aC5wdXNoKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgdGFzayBkYXRhIGJ5IHBhcnNpbmcgdGhlIHhtbCBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibWdkXCI+cmVmZXJlbmNlIHRvIE1HRGF0YTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIGFzeW5jIGZpbGxEYXRhKG1nZDogTUdEYXRhLCBvcGVuaW5nVGFza0RldGFpbHM6IE9wZW5pbmdUYXNrRGV0YWlscyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gSWYgdGhpcyB0YXNrIHdhcyBvcGVuZWQgYnkgYW4gXCJvcGVuIHdpbmRvd1wiIGNvbW1hbmQgLSBjb25uZWN0IGhpbSB0byBpdHMgcGFyZW50XHJcbiAgICBpZiAoIXN1cGVyLmlzTWFpblByb2coKSkge1xyXG4gICAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCAmJiBvcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2sgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRUYXNrID0gPFRhc2s+b3BlbmluZ1Rhc2tEZXRhaWxzLkNhbGxpbmdUYXNrO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUYXNrUGF0aCgpO1xyXG4gICAgICAgICg8VGFzaz5vcGVuaW5nVGFza0RldGFpbHMuQ2FsbGluZ1Rhc2spLmFkZFN1YlRhc2sodGhpcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuUGF0aFBhcmVudFRhc2sgPT09IG51bGwgJiYgb3BlbmluZ1Rhc2tEZXRhaWxzLlBhdGhQYXJlbnRUYXNrICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5QYXRoUGFyZW50VGFzayA9IDxUYXNrPm9wZW5pbmdUYXNrRGV0YWlscy5QYXRoUGFyZW50VGFzaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gZm9yIE1HX0FDVF9aT09NIGFjdGlvbiBlbmFibGVcclxuICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrICE9PSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suZ2V0RW5hYmxlWm9vbUhhbmRsZXIoKSkge1xyXG4gICAgICB0aGlzLnNldEVuYWJsZVpvb21IYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbWdEYXRhID0gbWdkO1xyXG4gICAgdGhpcy5maWxsQXR0cmlidXRlcygpO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5hZGRUYXNrKHRoaXMpO1xyXG5cclxuICAgIGxldCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlID0gKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwpID8gdGhpcy5fcGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsO1xyXG5cclxuICAgIHdoaWxlIChhd2FpdCB0aGlzLmluaXRJbm5lck9iamVjdHMoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5nZXROZXh0VGFnKCksIHBhcmVudEZvcm0pKSB7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5UYXNrVHJhbnNhY3Rpb25NYW5hZ2VyLlByZXBhcmVUcmFuc2FjdGlvblByb3BlcnRpZXModGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uLCBmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5IYW5kbGVUcmlnZ2VyVGFzaygpO1xyXG4gICAgdGhpcy5IYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk7XHJcblxyXG4gICAgLy8gU2V0IGlzU3ViZm9ybSBmbGFnXHJcbiAgICB0aGlzLkNoZWNrQW5kU2V0U3ViRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAvLyBnZXQgdGhlIHN1YmZvcm0gY29udHJvbCBmcm9tIHRoZSBwYXJlbnQgdGFza1xyXG4gICAgICBsZXQgc3ViRm9ybUN0cmw6IE1nQ29udHJvbCA9ICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5nZXRTdWJGb3JtQ3RybEZvclRhc2sodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIGlmIChzdWJGb3JtQ3RybCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHN1YkZvcm1DdHJsLnNldFN1YmZvcm1UYXNrSWQodGhpcy5fdGFza1RhZyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHVwZGF0ZSB0aGUgZm9ybSB3aXRoIHRoZSBzdWJmb3JtIGNvbnRyb2wgZnJvbSB0aGUgcGFyZW50IHRhc2tcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuc2V0U3ViRm9ybUN0cmwoc3ViRm9ybUN0cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gaGFuZGxlIHRoZSBQcmV2aW91c2x5QWN0aXZlVGFza0lkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVQcmV2aW91c2x5QWN0aXZlVGFza0lkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT09IG51bGwgJiYgdGhpcy5fcGFyZW50VGFzay5HZXRDb250ZXh0VGFzaygpICE9PSBudWxsICYmIHRoaXMuX21nRGF0YSAhPT0gdGhpcy5fcGFyZW50VGFzay5nZXRNR0RhdGEoKSlcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gKHRoaXMuX3BhcmVudFRhc2suR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza1RhZygpO1xyXG4gICAgZWxzZSBpZiAodGhpcy5fcGFyZW50VGFzayAhPT0gbnVsbClcclxuICAgICAgdGhpcy5QcmV2aW91c2x5QWN0aXZlVGFza0lkID0gdGhpcy5fcGFyZW50VGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGhhbmRsZSB0aGUgdHJpZ2dlciB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBIYW5kbGVUcmlnZ2VyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXJpbmdUYXNrID0gdGhpcy5fcGFyZW50VGFzaztcclxuICB9XHJcblxyXG4gIEZpbGxUYXNrVGFibGVzKHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcpOiB2b2lkO1xyXG4gIEZpbGxUYXNrVGFibGVzKCk6IHZvaWQ7XHJcbiAgRmlsbFRhc2tUYWJsZXModGFza1RhYmxlc0RhdGE/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXNfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkZpbGxUYXNrVGFibGVzXzEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgRmlsbFRhc2tUYWJsZXNfMCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIHRhc2sgYXR0cmlidXRlc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICBsZXQgcGFyc2VyOiBYbWxQYXJzZXIgPSBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICBzdXBlci5maWxsQXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgLy8gUUNSICM3NTk5MTE6IG1wcmcgbXVzdCBiZWxvbmcgdG8gdGhlIG1haW4gYXBwbGljYXRpb24ncyBNR0RhdGEuXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBpdCB3aWxsIG5vdCBiZSBkaXNjYXJkZWQgdW50aWwgdGhlIGVuZCBvZiBleGVjdXRpb24uXHJcbiAgICAgIGlmIChzdXBlci5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5fbWdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLmZpbGxBdHRyaWJ1dGVzKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0YXNrIGF0dHJpYnV0ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhZ1Byb2Nlc3NlZDogYm9vbGVhbjtcclxuICAgIGlzVGFnUHJvY2Vzc2VkID0gc3VwZXIuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWVTdHIpO1xyXG4gICAgaWYgKCFpc1RhZ1Byb2Nlc3NlZCkge1xyXG4gICAgICBpc1RhZ1Byb2Nlc3NlZCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFRlJFU0hPTjpcclxuICAgICAgICAgIGlmICghKHZhbHVlU3RyLnRyaW0oKSA9PT0gXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMuU2V0UmVmcmVzaE9uVmFycyh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX05BTUU6XHJcbiAgICAgICAgICB0aGlzLk5hbWUgPSB2YWx1ZVN0cjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EVlBPU19ERUM6XHJcbiAgICAgICAgICBpZiAoISh2YWx1ZVN0ci50cmltKCkgPT09IFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLnNldERlc2NyaXB0b3IodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBU19MT0NBVEU6XHJcbiAgICAgICAgICBpZiAoK3ZhbHVlU3RyID09IDEpXHJcbiAgICAgICAgICAgIHRoaXMuaGFzTG9jYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9BU19QQVJFTlQ6XHJcbiAgICAgICAgICBpZiAoK3ZhbHVlU3RyID09IDEpXHJcbiAgICAgICAgICAgIHRoaXMuTW9kZUFzUGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UQVNLX1VOSVFVRV9TT1JUOlxyXG4gICAgICAgICAgdGhpcy5VbmlxdWVTb3J0ID0gPFVuaXF1ZVRza1NvcnQ+dmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVFJBTlNfSUQ6XHJcbiAgICAgICAgICB0aGlzLnNldFJlbW90ZVRyYW5zYWN0aW9uKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QVUJMSUM6XHJcbiAgICAgICAgICB0aGlzLlB1YmxpY05hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9JU19PRkZMSU5FOlxyXG4gICAgICAgICAgdGhpcy5Jc09mZmxpbmUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1JFVFVSTl9WQUxVRV9FWFA6XHJcbiAgICAgICAgICB0aGlzLlJldHJ1blZhbHVlRXhwID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX01FTlVTX0ZJTEVfTkFNRTpcclxuICAgICAgICAgIC8vIFRPRE8gLSBub3QgdG8gc2VyaWFsaXplIFtTdG9yeSAxNTQ1NDddXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzVGFnUHJvY2Vzc2VkKVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coTlN0cmluZy5Gb3JtYXQoXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlOiAnezB9J1wiLCBhdHRyaWJ1dGUpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRvIGFsbG9jYXRlIGFuZCBmaWxsIGlubmVyIG9iamVjdHMgb2YgdGhlIGNsYXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPnBvc3NpYmxlIHRhZyBuYW1lICwgbmFtZSBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICBhc3luYyBpbml0SW5uZXJPYmplY3RzKGZvdW5kVGFnTmFtZTogc3RyaW5nLCBwYXJlbnRGb3JtOiBNZ0Zvcm1CYXNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICBzd2l0Y2ggKGZvdW5kVGFnTmFtZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfSEVMUFRBQkxFOlxyXG4gICAgICAgIGlmICh0aGlzLl9oZWxwVGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9oZWxwVGFiID0gbmV3IEhlbHBzKCk7XHJcblxyXG4gICAgICAgIGlmIChFdmVudHMuU2hvdWxkTG9nKExvZ2dlcl9Mb2dMZXZlbHMuRGV2ZWxvcG1lbnQpKVxyXG4gICAgICAgICAgRXZlbnRzLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLi4uXCIsIGZvdW5kVGFnTmFtZSkpO1xyXG5cclxuICAgICAgICB0aGlzLl9oZWxwVGFiLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVI6XHJcbiAgICAgICAgaWYgKEV2ZW50cy5TaG91bGRMb2coTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudCkpXHJcbiAgICAgICAgICBFdmVudHMuV3JpdGVEZXZUb0xvZyhOU3RyaW5nLkZvcm1hdChcInswfSAuLi5cIiwgZm91bmRUYWdOYW1lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuRGF0YVZpZXcuZmlsbEhlYWRlckRhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19QUk9QOlxyXG4gICAgICAgIHRoaXMuX3Byb3BUYWIuZmlsbERhdGEodGhpcywgJ1QnLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0ZPUk06XHJcbiAgICAgICAgdGhpcy5Gb3JtID0gdGhpcy5Gb3JtSW5pdERhdGEocGFyZW50Rm9ybSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX01FTlVfQ09OVEVOVDpcclxuICAgICAgICAvLyBUT0RPIC0gbm90IHRvIHNlcmlhbGl6ZSBbU3RvcnkgMTU0NTQ3XVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImFzc2VtYmxpZXNcIjpcclxuICAgICAgICBsZXQgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZignL2Fzc2VtYmxpZXMnLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCk7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleDJFbmRPZlRhZygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX0ZPUk1TOlxyXG4gICAgICAgIHRoaXMuX2Zvcm1zID0gbmV3IEZvcm1zVGFibGUodGhpcywgcGFyZW50Rm9ybSk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLi4uXCIsIGZvdW5kVGFnTmFtZSkpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2Zvcm1zLmZpbGxEYXRhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLOlxyXG4gICAgICAgIGlmICh0aGlzLlN1YlRhc2tzID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLlN1YlRhc2tzID0gbmV3IFRhc2tzVGFibGUoKTtcclxuICAgICAgICBsZXQgc3VidGFzayA9IG5ldyBUYXNrKHRoaXMpO1xyXG4gICAgICAgIHN1YnRhc2suSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuU3ViVGFza3MuYWRkVGFzayhzdWJ0YXNrKTtcclxuICAgICAgICBsZXQgbWdkOiBNR0RhdGEgPSB0aGlzLl9tZ0RhdGE7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYWluUHJvZygpKVxyXG4gICAgICAgICAgbWdkID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1HRGF0YUZvclN0YXJ0dXBQcm9ncmFtKCk7XHJcbiAgICAgICAgYXdhaXQgc3VidGFzay5maWxsRGF0YShtZ2QsIG5ldyBPcGVuaW5nVGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkw6XHJcbiAgICAgICAgYXdhaXQgVGFzay5Qcm9jZXNzVGFza1VSTCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FWFBUQUJMRTpcclxuICAgICAgICBpZiAodGhpcy5FeHBUYWIgPT0gbnVsbClcclxuICAgICAgICAgIHRoaXMuRXhwVGFiID0gbmV3IEV4cFRhYmxlKCk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIGV4cFwiKTtcclxuICAgICAgICB0aGlzLkV4cFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19VU0VSX0VWRU5UUzpcclxuICAgICAgICBpZiAodGhpcy5Vc2VyRXZ0VGFiID09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLlVzZXJFdnRUYWIgPSBuZXcgVXNlckV2ZW50c1RhYmxlKCk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJnb2VzIHRvIHVzZXIgZXZlbnQgdGFiXCIpO1xyXG4gICAgICAgIHRoaXMuVXNlckV2dFRhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX1RBR19MSU5LUzpcclxuICAgICAgICB0aGlzLkRhdGF2aWV3SGVhZGVyc1RhYmxlID0gbmV3IERhdGF2aWV3SGVhZGVycyh0aGlzKTtcclxuICAgICAgICB0aGlzLkRhdGF2aWV3SGVhZGVyc1RhYmxlLmZpbGxEYXRhKHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTOlxyXG4gICAgICAgIHRoaXMuUnVudGltZVNvcnRzID0gbmV3IFNvcnRDb2xsZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5SdW50aW1lU29ydHMuZmlsbERhdGEoIHBhcnNlcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tfVEFCTEVTOlxyXG4gICAgICAgIHRoaXMuRmlsbFRhc2tUYWJsZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfVEFHX1JFQ09NUFVURTpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gcmVjb21wdXRlXCIpO1xyXG4gICAgICAgIHRoaXMuUmVjb21wdXRlRmlsbERhdGEocGFyc2VyKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlRIQU5ETEVSUzpcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcImdvZXMgdG8gZXZlbnRoYW5kbGVyc1wiKTtcclxuICAgICAgICBpZiAodGhpcy5IYW5kbGVyc1RhYiA9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5IYW5kbGVyc1RhYiA9IG5ldyBIYW5kbGVyc1RhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5IYW5kbGVyc1RhYi5maWxsRGF0YSh0aGlzLCBwYXJzZXIpO1xyXG4gICAgICAgIHRoaXMuYWRkRXhwSGFuZGxlcnNUb01HRGF0YSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IChcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfVEFTSykpIHtcclxuICAgICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBUYXNrLmluaXRJbm5lck9iamVjdHMgLiBFbnRlciBjYXNlIGZvciBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBSZWNvbXB1dGVGaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IHJlY29tcHV0ZVRhYmxlOiBSZWNvbXB1dGVUYWJsZSA9IG5ldyBSZWNvbXB1dGVUYWJsZSgpO1xyXG4gICAgcmVjb21wdXRlVGFibGUuZmlsbERhdGFfMSg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldywgdGhpcywgcGFyc2VyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgRmlsbFRhc2tUYWJsZXNfMSgpOiB2b2lkIHtcclxuICAgIGxldCBwYXJzZXI6IFhtbFBhcnNlciA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXI7XHJcbiAgICAvLyBHZXQgdGhlIGVuZCBvZiB0aGUgdGFzayB0YWJsZSBlbGVtZW50XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLX1RBQkxFU19FTkQsIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICBlbmRDb250ZXh0ID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZENvbnRleHQpICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRS5sZW5ndGg7XHJcbiAgICAvLyBnZXQgdGhlIHRhc2sgdGFibGUgeG1sIHN0cmluZ1xyXG4gICAgbGV0IHRhc2tUYWJsZXNEYXRhOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgdGhpcy5GaWxsVGFza1RhYmxlcyh0YXNrVGFibGVzRGF0YSk7XHJcbiAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgaGFuZGxlcnMgdHJpZ2dlcmVkIGJ5IGV4cHJlc3Npb25zIHRvIG1nZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhZGRFeHBIYW5kbGVyc1RvTUdEYXRhKCk6IHZvaWQge1xyXG4gICAgbGV0IGlkeDogbnVtYmVyID0gMDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuSGFuZGxlcnNUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgbGV0IGhhbmRsZXI6IEV2ZW50SGFuZGxlciA9IHRoaXMuSGFuZGxlcnNUYWIuZ2V0SGFuZGxlcihpKTtcclxuICAgICAgbGV0IGV2dDogRXZlbnQgPSBoYW5kbGVyLmdldEV2ZW50KCk7XHJcbiAgICAgIGlmIChldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gfHxcclxuICAgICAgICAoZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIGV2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTikpIHtcclxuICAgICAgICB0aGlzLl9tZ0RhdGEuYWRkRXhwSGFuZGxlcihoYW5kbGVyLCBpZHgpO1xyXG4gICAgICAgIGlkeCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSByZWZyZXNoIG9uIHZhcmlhYmxlIGxpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBTZXRSZWZyZXNoT25WYXJzKHZhcmlhYmxlczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgc3RyVG9rOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUodmFyaWFibGVzLCBcIixcIik7XHJcbiAgICBsZXQgZmxkTnVtOiBudW1iZXI7XHJcbiAgICBsZXQgaW50VmFscyA9IG5ldyBMaXN0PG51bWJlcj4oKTtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyVG9rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZsZE51bSA9IE5OdW1iZXIuUGFyc2Uoc3RyVG9rW2ldKTtcclxuICAgICAgaW50VmFscy5wdXNoKGZsZE51bSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLlJlZnJlc2hPblZhcnMgPSBuZXcgQXJyYXkoaW50VmFscy5sZW5ndGgpO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IGludFZhbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgZmxkTnVtID0gaW50VmFscy5nZXRfSXRlbShpKTtcclxuICAgICAgdGhpcy5SZWZyZXNoT25WYXJzW2ldID0gZmxkTnVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgRGF0YVN5bmNlZCBwcm9wZXJ0eSBvZiB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREYXRhU3luY2VkKHN5bmNlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5EYXRhU3luY2VkID0gc3luY2VkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIGZpZWxkIGJ5IGl0cyBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZE5hbWVcIj5vZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGZpZWxkIGJ5IGl0cyBuYW1lPC9yZXR1cm5zPlxyXG4gIGdldEZpZWxkKGZsZE5hbWU6IHN0cmluZyk6IEZpZWxkIHtcclxuICAgIHJldHVybiAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldEZpZWxkQnlOYW1lKGZsZE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiBhbiBleHByZXNzaW9uIGJ5IGl0cyBpZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPmlkIG9mIHRoZSBleHByZXNzaW9uPC9wYXJhbT5cclxuICBnZXRFeHBCeUlkKGlkOiBudW1iZXIpOiBFeHByZXNzaW9uIHtcclxuICAgIGlmICh0aGlzLkV4cFRhYiAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuRXhwVGFiLmdldEV4cEJ5SWQoaWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBUYXNrLkdldEV4cEJ5SWQoKTogbm8gZXhwcmVzc2lvbiB0YWJsZVwiKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RXhwT2JqZWN0QnlJZChpZDogbnVtYmVyKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmdldEV4cEJ5SWQoaWQpO1xyXG4gIH1cclxuXHJcbiAgR2V0RXhwcmVzc2lvblN0b3JhZ2UoZXhwSWQ6IG51bWJlcik6IGFueSB7XHJcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgaWYgKGV4cElkID4gMCkge1xyXG4gICAgICBsZXQgZXhwQnlJZDogRXhwcmVzc2lvbiA9IHRoaXMuZ2V0RXhwQnlJZChleHBJZCk7XHJcbiAgICAgIERlYnVnLkFzc2VydChleHBCeUlkICE9PSBudWxsKTtcclxuICAgICAgcmVzdWx0ID0gZXhwQnlJZC5HZXRTdG9yYWdlQXR0cmlidXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDYWxjdWxhdGUgZXhwcmVzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHBJZFwiPlRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXNUeXBlXCI+VGhlIGV4cGVjdGVkIHJlc3VsdCB0eXBlLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibGVuZ3RoXCI+VGhlIGV4cGVjdGVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0LjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY29udGVudFR5cGVVbmljb2RlXCI+RGVub3RlcyB3aGV0aGVyIHRoZSByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgYSB1bmljb2RlIHN0cmluZy48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc0NlbGxUeXBlXCI+Tm90IHVzZWQuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIENhbGN1bGF0ZUV4cHJlc3Npb24oZXhwSWQ6IG51bWJlciwgcmVzVHlwZTogU3RvcmFnZUF0dHJpYnV0ZSwgbGVuZ3RoOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChleHBJZCA+IDApIHtcclxuICAgICAgbGV0IGV4cEJ5SWQ6IEV4cHJlc3Npb24gPSB0aGlzLmdldEV4cEJ5SWQoZXhwSWQpO1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZXhwQnlJZCAhPT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4cEJ5SWQuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aChyZXNUeXBlLCBsZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBJbnNlcnQgUmVjb3JkIFRhYmxlIHRvIGRhdGF2aWV3IG9mIHRoZSB0YXNrIGlmIGl0IGNhbWUgYWZ0ZXIgY2xvc2luZyB0YXNrIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgaW5zZXJ0UmVjb3JkVGFibGUoaW52YWxpZGF0ZTogYm9vbGVhbiwgcGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGNoZWNrIGNhY2hlIGxvZ2ljIG9ubHkgZm9yIHN1Yi1mb3Jtc1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICBsZXQgZmlyc3RUaW1lOiBib29sZWFuID0gKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRGaXJzdER2KCk7XHJcbiAgICAgIC8vIGlmIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHRoZSB0YXNrIGdldCBkdiBvciB0aGUgb2xkIGR2IGlzIG5vdCBpbnZhbGlkYXRlZCBvclxyXG4gICAgICAvLyB0aGUgb2xkIGR2IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpcnN0IHJlY29yZCBkbyBub3QgcHV0IGluIGNhY2hlXHJcbiAgICAgIGlmICghZmlyc3RUaW1lICYmIGludmFsaWRhdGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzTG9jYXRlKSB7XHJcbiAgICAgICAgICAvLyB0aGUgb2xkIGQudiB3YXMgbm90IHVwZGF0ZWQgcHV0IGl0IGluIGNhY2hlIChpdHMgcmVwbGljYXRlKVxyXG4gICAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuSW5jbHVkZXNGaXJzdCgpKSB7XHJcbiAgICAgICAgICAgIGlmICghKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDaGFuZ2VkKCkpXHJcbiAgICAgICAgICAgICAgdGhpcy5fZHZDYWNoZS5wdXRJbkNhY2hlKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykucmVwbGljYXRlKCkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgdGhpcy5sb2NhdGVQdXRJbkNhY2hlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHBhcnNlIHRoZSBuZXcgZGF0YXZpZXdcclxuICAgIGF3YWl0ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZmlsbERhdGEocGFyc2VyKTtcclxuXHJcbiAgICBpZiAoaW52YWxpZGF0ZSlcclxuICAgICAgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5zZXRDaGFuZ2VkKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGhhbmRsZXJzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRIYW5kbGVyc1RhYigpOiBIYW5kbGVyc1RhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLkhhbmRsZXJzVGFiO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGJ1aWxkWE1MKG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuSXNBZnRlclJldHJ5QmVmb3JlQnVpbGRYTUwgPSB0aGlzLmdldEFmdGVyUmV0cnkoKTtcclxuICAgIGlmICh0aGlzLktub3duVG9TZXJ2ZXIgJiYgIXRoaXMuSXNPZmZsaW5lKSB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBYTUxDb25zdGFudHMuTUdfVEFHX1RBU0spO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRCArIFwiPVxcXCJcIiArIHRoaXMuZ2V0VGFza1RhZygpICsgXCJcXFwiXCIpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS19NQUlOTEVWRUwgKyBcIj1cXFwiXCIgKyB0aGlzLmdldE1haW5MZXZlbCgpICsgXCJcXFwiXCIpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgICAgYXdhaXQgKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgICAgaWYgKHRoaXMuRm9ybSAhPSBudWxsICYmIHRoaXMuRm9ybS5PcGVuZWQpXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5HZXRIaWRkZW5Db250cm9sTGlzdFhNTCgpKTtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCJcXG4gICA8L1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19UQVNLICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYnVpbGQgdGhlIFhNTCBzdHJpbmcgZm9yIHRoZSByYW5nZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGJ1aWxkWE1MRm9yUm5ncyhtZXNzYWdlOiBTdHJpbmdCdWlsZGVyLCBVc2VyUmFuZ2VzOiBMaXN0PFVzZXJSYW5nZT4sIGxvY2F0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmbGQ6IEZpZWxkO1xyXG4gICAgbGV0IGNlbGxBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5TS0lQO1xyXG4gICAgbGV0IHRvQmFzZTY0OiBib29sZWFuID0gKEVudmlyb25tZW50Lkluc3RhbmNlLkdldERlYnVnTGV2ZWwoKSA8PSAxKTtcclxuXHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBVc2VyUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JORyk7XHJcblxyXG4gICAgICBsZXQgcm5nOiBVc2VyUmFuZ2UgPSBVc2VyUmFuZ2VzLmdldF9JdGVtKGkpO1xyXG5cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0ZMRCArIFwiPVxcXCJcIiArIHJuZy52ZWVJZHggKyBcIlxcXCJcIik7XHJcblxyXG4gICAgICBmbGQgPSA8RmllbGQ+dGhpcy5EYXRhVmlldy5nZXRGaWVsZCg8bnVtYmVyPnJuZy52ZWVJZHggLSAxKTtcclxuICAgICAgbGV0IGZsZEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmbGQuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKHJuZy5udWxsTWluKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgQ29uc3RJbnRlcmZhY2UuTlVMTF9NSU5fUk5HICsgXCI9XFxcIjFcXFwiXCIpO1xyXG5cclxuICAgICAgaWYgKCFybmcuZGlzY2FyZE1pbiAmJiBybmcubWluICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgdmFsOiBzdHJpbmcgPSBSZWNvcmRVdGlscy5pdGVtVmFsVG9YTUwocm5nLm1pbiwgZmxkQXR0ciwgY2VsbEF0dHIsIHRvQmFzZTY0KTtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1JTl9STkcgKyBcIj1cXFwiXCIgKyB2YWwgKyBcIlxcXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChybmcubnVsbE1heClcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk5VTExfTUFYX1JORyArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgIGlmICghcm5nLmRpc2NhcmRNYXggJiYgcm5nLm1heCAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gUmVjb3JkVXRpbHMuaXRlbVZhbFRvWE1MKHJuZy5tYXgsIGZsZEF0dHIsIGNlbGxBdHRyLCB0b0Jhc2U2NCk7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NQVhfUk5HICsgXCI9XFxcIlwiICsgdmFsICsgXCJcXFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGxvY2F0ZSlcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX0xPQ0FURVMgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIGVsc2VcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLkVORF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JBTkdFUyArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIHRoZSBYTUwgc3RyaW5nIGZvciB0aGUgdXNlciBhZGRlZCBzb3J0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUxGb3JTb3J0cyhtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5Vc2VyU29ydHMgIT0gbnVsbCAmJiB0aGlzLlVzZXJTb3J0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlVzZXJTb3J0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG4gICAgICAgIGxldCBzcnQ6IFNvcnQgPSB0aGlzLlVzZXJTb3J0cy5nZXRfSXRlbShpKTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLlNPUlQpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19GTEQgKyBcIj1cXFwiXCIgKyBzcnQuZmxkSWR4ICsgXCJcXFwiXCIpO1xyXG4gICAgICAgIGlmIChzcnQuZGlyKVxyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoXCIgXCIgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0RJUiArIFwiPVxcXCIxXFxcIlwiKTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlVzZXJTb3J0cy5DbGVhcigpO1xyXG4gICAgICB0aGlzLlVzZXJTb3J0cyA9IG51bGw7XHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5FTkRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBhIHVzZXIgZXZlbnQgYnkgaXRzIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGV2ZW50PC9wYXJhbT5cclxuICBnZXRVc2VyRXZlbnQoaWR4OiBudW1iZXIpOiBFdmVudCB7XHJcbiAgICBEZWJ1Zy5Bc3NlcnQodGhpcy5Vc2VyRXZ0VGFiICE9PSBudWxsKTtcclxuICAgIGxldCByZXRFdmVudDogRXZlbnQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuVXNlckV2dFRhYiAhPT0gbnVsbClcclxuICAgICAgcmV0RXZlbnQgPSB0aGlzLlVzZXJFdnRUYWIuZ2V0RXZlbnQoaWR4KTtcclxuICAgIHJldHVybiByZXRFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gU2V0IHRoZSBNb3ZlVG9GaXJzdENvbnRyb2wgZmxhZyBvbiB0aGUgZm9ybS4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRNb3ZlVG9GaXJzdENvbnRyb2wobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAobW92ZVRvRmlyc3RDb250cm9sIHx8ICF0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICAgLy8gdGhpcyBpcyBhIGNhbGwgZGVzdGluYXRpb24vIHN1YmZvcm0gY2FsbFxyXG4gICAgICAgIC8vIFdlIHBlcmZvcm0gbW92ZSB0byBmaXJzdCBjb250cm9sIG9ubHkgdG8gb25lIGNvbnRyb2wgZm9ybSBwZXIgcmVxdWVzdCAtIHRoZSBmaXJzdCBvbmUgdGhhdCB3ZSByZWNlaXZlXHJcbiAgICAgICAgbGV0IGFscmVhZHlNb3ZlZDogYm9vbGVhbiA9ICg8TWdGb3JtPnRoaXMuRm9ybSkuYWxyZWFkeU1vdmVkVG9GaXJzdENvbnRyb2woKTtcclxuICAgICAgICBpZiAoIWFscmVhZHlNb3ZlZClcclxuICAgICAgICAgICg8TWdGb3JtPnRoaXMuRm9ybSkuTW92ZWRUb0ZpcnN0Q29udHJvbCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIGFuZCBpdHMgc3ViVGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFN0YXJ0KG1vdmVUb0ZpcnN0Q29udHJvbDogYm9vbGVhbiwgY2FsbEJ5RGVzdFN1YkZvcm06IGJvb2xlYW4pOiBQcm9taXNlPElUYXNrPiB7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrOiBUYXNrID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzU3RhcnRlZCkge1xyXG4gICAgICB0aGlzLl9pc1N0YXJ0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5Jbml0aWFsaXplRXhlY3V0aW9uKCk7XHJcblxyXG4gICAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gdHJ1ZTtcclxuICAgICAgbGV0IHJlc3VsdDogUmV0dXJuUmVzdWx0ID0gYXdhaXQgdGhpcy5TZXR1cCgpO1xyXG5cclxuICAgICAgLy8gdGFzayBpbml0aWFsaXphdGlvbiBmYWlsZWQgLSBjbG9zZSB0aGUgdGFza1xyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgdGhpcy5faW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldFByb2Nlc3NpbmdUb3BNb3N0RW5kVGFzaygpO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soZmFsc2UpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5FbmFibGVBY3Rpb25zKCk7XHJcblxyXG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLkluaXRpYWxpemVGb3JtKG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgIXRoaXMuX2lzTWFpblByZylcclxuICAgICAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSB0aGlzO1xyXG5cclxuICAgICAgdGhpcy5EYXRhVmlld1dhc1JldHJpZXZlZCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBRQ1IgIyAxNjczMzIgOlxyXG4gICAgICAvLyBJZiB3ZSBzdGFydCBwb3JncmFtIFAxLCBmb3Igd2hpY2ggTVAgaXMgc3RhcnRlZC4gTVAgaXMgY2FsbGluZyBQMiBmcm9tIGl0J3MgVFAuIFNvLCB3aGVuIGl0IGNhbGxzIFAyXHJcbiAgICAgIC8vIGFnYWluIGl0IHN0YXJ0cyBNUCwgYnV0IGZyb20gTVAgaXQgYWdhaW4gc3RhcnRzIFAxLiBhcyBQMSBpcyBpbiBpdCdzIHN1YnRhc2sgYW5kIGl0IGlzIG5vdCB5ZXQgc3RhcnRlZC5cclxuICAgICAgLy8gU28sIGl0J3Mgd3JvbmcgdG8gc3RhcnQgUDEgd2hpbGUgZXhlY3V0aW5nIFRQIG9mIE1QLiBJdCBzaG91bGQgZXhlY3V0ZSBvbmx5IFAyLlxyXG4gICAgICAvLyBTbywgaW4gb3JkZXIgdG8gYXZvaWQgdGhpcywgc2V0IE1QJ3Mgc3VidGFza3MgdG8gbnVsbCBiZWZvcmUgZW50ZXJpbmcgVFAuIGFuZCBhZ2FpbiByZXN0b3JlIGl0IGJhY2ssIGluIG9yZGVyIHRvXHJcbiAgICAgIC8vIHN0YXJ0IFAxIHByb3Blcmx5LlxyXG4gICAgICBsZXQgc3ViVGFza3M6IFRhc2tzVGFibGUgPSB0aGlzLlN1YlRhc2tzO1xyXG4gICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgdGhpcy5TdWJUYXNrcyA9IG51bGw7XHJcbiAgICAgIGlmICh0aGlzLmlzTWFpblByb2coKSlcclxuICAgICAgICB0aGlzLlN1YlRhc2tzID0gc3ViVGFza3M7XHJcblxyXG4gICAgICBpZiAoIXJlc3VsdC5TdWNjZXNzKVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBpZiAodGhpcy5fYWJvcnRpbmcpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5GaXJzdENodW5rKTtcclxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5EYXRhdmlld01hbmFnZXIuRXhlY3V0ZShkYXRhVmlld0NvbW1hbmQpO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIHRoaXMuUmVzdW1lU3ViZm9ybUxheW91dCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2sgPSBhd2FpdCB0aGlzLlN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2ssIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIHRoaXMuSW5TdGFydFByb2Nlc3MgPSBmYWxzZTtcclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluaXRpYWxpemUgZXhlY3V0aW9uLXJlbGF0ZWQgc3R1ZmYuXHJcbiAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgT05MWSBmcm9tIFRhc2suU3RhcnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgSW5pdGlhbGl6ZUV4ZWN1dGlvbigpOiB2b2lkIHtcclxuICAgIC8vIGN1cnJlbnRseSB0aGUgaXMgbm8gY29udHJvbCBleGVjdXRpbmcgdGhlcmUgZm9yIHRoZVxyXG4gICAgLy8gY3VycmVudCBleGVjdXRpbmcgY29udHJvbCBpbmRleCBpcyBzZXQgdG8gLTFcclxuICAgIHN1cGVyLnNldEJya0xldmVsKENvbnN0SW50ZXJmYWNlLkJSS19MRVZFTF9SRUNfTUFJTiwgLTEpO1xyXG4gICAgdGhpcy5fZmlyc3RSZWNvcmRDeWNsZSA9IHRydWU7ICAgICAgLy8gV2hpbGUgc3RhcnRpbmcgYSBUYXNrLCBzZXQgZmlyc3RSZWNvcmRDeWNsZSA9IFRSVUVcclxuXHJcbiAgICB0aGlzLl9jdXJyU3RhcnRQcm9nTGV2ZWwgPSAoKHRoaXMuSXNTdWJGb3JtICYmICg8TWdGb3JtPnRoaXMuZ2V0UGFyZW50KCkuZ2V0Rm9ybSgpKS5hbHJlYWR5TW92ZWRUb0ZpcnN0Q29udHJvbCgpKVxyXG4gICAgICA/ICg8VGFzaz50aGlzLmdldFBhcmVudCgpKS5fY3VyclN0YXJ0UHJvZ0xldmVsXHJcbiAgICAgIDogVGFzay5TdGFydFByb2dMZXZlbCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGluaXRpYWxpemUgZm9ybS1yZWxhdGVkIHN0dWZmXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBJbml0aWFsaXplRm9ybShtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgaWYgKHRoaXMuRm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBzZXQgTW92ZVRvRmlyc3RDb250cm9sIGZsYWcgb24gdGhlIGZvcm0uXHJcbiAgICAgIHRoaXMuU2V0TW92ZVRvRmlyc3RDb250cm9sKG1vdmVUb0ZpcnN0Q29udHJvbCk7XHJcblxyXG4gICAgICAvLyB0aGUgSW5pdEZvcm0gbWlnaHQgY2F1c2UgZXhlY3V0aW9uIG9mIGNvZGUgKHZhcmlhYmxlIGNoYW5nZSkgc28gd2Ugc2hvdWxkIGRvIGl0IHdpdGggYSBuZXcgc2VydmVyIGV4ZWN1dGlvbiBzdGFja1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG5cclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtcyA9ICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuR2V0Um91dGVQYXJhbXMoKTtcclxuXHJcbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgdGFzaydzIGZvcm0uXHJcbiAgICAgIGF3YWl0IHRoaXMuSW5pdEZvcm0oKTtcclxuXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0TUdEYXRhKCkuU3RhcnRUaW1lcnMoKTtcclxuICAgICAgQ29tbWFuZHMuYmVnaW5JbnZva2UoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFJldHVyblJlc3VsdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCBzdWIgdGFza3Mgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb3ZlVG9GaXJzdENvbnRyb2xcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5vbkludGVyYWN0aXZlVGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFN0YXJ0U3ViVGFza3MobW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBub25JbnRlcmFjdGl2ZVRhc2s6IFRhc2ssIGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgbGV0IHRtcE5vbkludGVyYWN0aXZlVGFzazogVGFzayA9ICA8VGFzaz4gYXdhaXQgdGFzay5TdGFydChtb3ZlVG9GaXJzdENvbnRyb2wsIGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgICAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrID09PSBudWxsKVxyXG4gICAgICAgICAgbm9uSW50ZXJhY3RpdmVUYXNrID0gdG1wTm9uSW50ZXJhY3RpdmVUYXNrO1xyXG4gICAgICAgIGVsc2UgaWYgKHRtcE5vbkludGVyYWN0aXZlVGFzayAhPT0gbnVsbClcclxuICAgICAgICAgIERlYnVnLkFzc2VydChmYWxzZSwgXCJtb3JlIHRoYW4gMSBub24gaW50ZXJhY3RpdmUgaW4gdGFzay5zdGFydFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIEVuYWJsZUFjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgYWN0TGlzdDogbnVtYmVyW10gPSBBY3Rpb25NYW5hZ2VyLmFjdEVuYWJsZWQ7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlTGlzdChhY3RMaXN0LCB0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNTdWJGb3JtKVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9QT1NUX1JFRlJFU0hfQllfUEFSRU5ULCB0cnVlKTtcclxuXHJcblxyXG4gICAgLy8gZW5hYmxlIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRhc2sgcHJvcGVydGllc1xyXG4gICAgYXdhaXQgdGhpcy5lbmFibGVNb2RlcygpO1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1NFTEVDVElPTiwgZmFsc2UpKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NFTEVDVCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGVuYWJsZVByaW50ZGF0YTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1BSSU5UX0RBVEEsIGZhbHNlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1BSSU5UX0RBVEEsIGVuYWJsZVByaW50ZGF0YSk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00sIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzaG93IGVycm9yIG9uIHRhc2sncyBmb3JtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBhc3luYyBTaG93RXJyb3IodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWxzVHJhbnNUZXh0OiBzdHJpbmcgPSBMYW5ndWFnZURhdGEuSW5zdGFuY2UudHJhbnNsYXRlKHRleHQpO1xyXG4gICAgbGV0IG1sc1RyYW5zVGl0bGU6IHN0cmluZyA9IExhbmd1YWdlRGF0YS5JbnN0YW5jZS50cmFuc2xhdGUoQ29uc3RJbnRlcmZhY2UuRVJST1JfU1RSSU5HKTtcclxuICAgIC8vIG1scyA/Pz9cclxuICAgIGF3YWl0IEdVSU1hbmFnZXIuSW5zdGFuY2UuTWVzc2FnZUJveChtbHNUcmFuc1RpdGxlLCBtbHNUcmFuc1RleHQsIFN0eWxlcy5NU0dCT1hfSUNPTl9FUlJPUiB8IFN0eWxlcy5NU0dCT1hfQlVUVE9OX09LKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgdGhlIHJlc3VsdC4gSWYgZmFpbGVkIC0gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZWJveCBhbmQgZW5kIHRoZSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXN1bHRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgRW5kVGFza09uRXJyb3IocmVzdWx0OiBSZXR1cm5SZXN1bHQsIGRpc3BsYXlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFyZXN1bHQuU3VjY2VzcyAmJiAhdGhpcy5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuSW5TdGFydFByb2Nlc3MpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuZFRhc2soZmFsc2UsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICB0aGlzLkluU3RhcnRQcm9jZXNzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGRpc3BsYXlFcnJvcilcclxuICAgICAgICAgIGF3YWl0IHRoaXMuU2hvd0Vycm9yKHJlc3VsdC5FcnJvckRlc2NyaXB0aW9uKTtcclxuICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VYSVQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIFNldHVwKCk6IFByb21pc2U8UmV0dXJuUmVzdWx0PiB7XHJcbiAgICBsZXQgcmVzdWx0OiBSZXR1cm5SZXN1bHQ7XHJcbiAgICB0aGlzLlRhc2tTZXJ2aWNlLkluaXRUYXNrUHJlZml4RXhlY3V0ZWRGbGFnKHRoaXMpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBUYXNrU2VydmljZUJhc2UuQ3JlYXRlRmlyc3RSZWNvcmQodGhpcyk7XHJcblxyXG4gICAgLy8gaW5pdCBkYXRhIHZpZXdcclxuICAgIC8vIE5vdGU6IEV2ZW4gaWYgdGhlIHJlc3VsdEluaXRNb2RlIGlzIGZhbHNlIHdlIE1VU1QgaW5pdCB0aGUgZGF0YSB2aWV3XHJcbiAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0KTtcclxuICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuXHJcbiAgICAvLyBuZWVkIHRvIGNoZWNrIHJlc3VsdChvZiB0aGUgZGF0YSB2aWV3IGluaXQgYW5kIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmV0dXJuIHRoaXMgZXJyb3JcclxuICAgIGlmICghcmVzdWx0LlN1Y2Nlc3MpXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQsIHdob3NlIGV4ZWN1dGlvbiB3YXMgZGVsYXllZCBiZWN1YXNlIHRhc2sgd2FzIG5vdCBzdGFydGVkLiBTbyBFeGN1dGUgdGhvc2UgY29tbWFuZHMgYWZ0ZXIgdGFzayBzdGFydGVkLlxyXG4gICAgICBsZXQgY29tbWFuZHM6IExpc3Q8SUNsaWVudFRhcmdldGVkQ29tbWFuZD4gPSBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UuZ2V0Q29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGNtZElkeDogbnVtYmVyID0gMDsgY21kSWR4IDwgY29tbWFuZHMubGVuZ3RoOyBjbWRJZHgrKykge1xyXG4gICAgICAgIGxldCBjb21tYW5kOiBJQ2xpZW50VGFyZ2V0ZWRDb21tYW5kID0gKGNvbW1hbmRzLmdldF9JdGVtKGNtZElkeCkpO1xyXG4gICAgICAgIGlmIChjb21tYW5kLlRhc2tUYWcgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICBhd2FpdCBjb21tYW5kLkV4ZWN1dGUobnVsbCk7XHJcbiAgICAgICAgICBHbG9iYWxDb21tYW5kc01hbmFnZXIuSW5zdGFuY2UucmVtb3ZlQ29tbWFuZHNFeGVjdXRlZEFmdGVyVGFza1N0YXJ0ZWQoY29tbWFuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVEYXRhVmlld0NvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIERhdGFWaWV3Q29tbWFuZFR5cGUuUHJlcGFyZSk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzdWx0LlN1Y2Nlc3MpIHtcclxuICAgICAgcmVzdWx0ID0gdGhpcy5UYXNrU2VydmljZS5QcmVwYXJlVGFzayh0aGlzKTtcclxuICAgICAgaWYgKCFyZXN1bHQuU3VjY2VzcylcclxuICAgICAgICBhd2FpdCB0aGlzLkVuZFRhc2tPbkVycm9yKHJlc3VsdCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5TdWNjZXNzKSB7XHJcbiAgICAgIGRhdGFWaWV3Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZURhdGFWaWV3Q29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgRGF0YVZpZXdDb21tYW5kVHlwZS5Jbml0RGF0YUNvbnRyb2xWaWV3cyk7XHJcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkbyBmaXJzdCByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgLy8vICAgVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBvbmx5IGZvciBjb25uZWN0ZWQgdGFzay5cclxuICAvLy8gICBGb3Igb2ZmbGluZSB0YXNrIHdlIHJ1biBFbnRlckZpcnN0UmVjb3JkIGZ1bmN0aW9uLiBUaGVyZSB3ZSBleGVjdXRlIFJQIGFuZCBvcGVuIHN1YmZvcm1zLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZG9GaXJzdFJlY29yZEN5Y2xlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl9pc01haW5QcmcpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgdGhpcy5TdWJmb3JtRXhlY01vZGUgPSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2godGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRoaXMuSXNTdWJGb3JtKTtcclxuXHJcbiAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgc3ViVGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICAgICAgICBpZiAoc3ViVGFzay5Jc1N1YkZvcm0pIHtcclxuICAgICAgICAgICAgICAgICg8TWdGb3JtPnN1YlRhc2suZ2V0Rm9ybSgpKS5JZ25vcmVGaXJzdFJlY29yZEN5Y2xlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHN1YlRhc2suZG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpOyAgXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLlN1YmZvcm1FeGVjTW9kZSA9IFRhc2tfU3ViZm9ybUV4ZWNNb2RlRW51bS5TRVRfRk9DVVM7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrIGlzIGEgc3ViIGZvcm0gYnkgaXRzIG1nZCBkZWZpbml0aW9uICh1c2VkIG9ubHkgd2hpbGUgaW5pdGlhdGluZyB0YXNrIGZvciBzZXR0aW5nIGlzU3ViZm9ybSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQ2hlY2tBbmRTZXRTdWJGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5Jc1N1YkZvcm0gPSAoIXN1cGVyLmlzTWFpblByb2coKSAmJiB0aGlzICE9PSB0aGlzLl9tZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIElzUm91dGUoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuUm91dGVyUGF0aCAhPSBudWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzdG9wIHRoZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHRhc2s6IFRhc2s7XHJcbiAgICBpZiAodGhpcy5fYWJvcnRpbmcpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzaygwKSkgIT0gbnVsbCkge1xyXG4gICAgICAgIHRhc2suc2V0RGVzdGluYXRpb25TdWJmb3JtKHRoaXMuX2Rlc3RpbmF0aW9uU3ViZm9ybSk7XHJcbiAgICAgICAgYXdhaXQgdGFzay5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzTWFpblByZylcclxuICAgICAgdGhpcy5fYWJvcnRpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vIGlmIHRoaXMgdGFzayBhbmQgaXRzIHBhcmVudCBhcmUgZnJvbSBkaWZmZXJlbnQgTUdEQVRBIG9iamVjdHMgdGhlbiBkaXNjb25uZWN0XHJcbiAgICAvLyB0aGVtIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhpcyB0YXNrIGZyb20gaXRzIHBhcmVudFxyXG4gICAgaWYgKHRoaXMuX3BhcmVudFRhc2sgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9wYXJlbnRUYXNrLnJlbW92ZVN1YlRhc2sodGhpcyk7XHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBvbGRUaW1lcnM6IExpc3Q8bnVtYmVyPiA9IG5ldyBMaXN0PG51bWJlcj4oKSwgbmV3VGltZXJzID0gbmV3IExpc3Q8bnVtYmVyPigpO1xyXG4gICAgICAgIGxldCBtZ2QgPSB0aGlzLmdldE1HRGF0YSgpO1xyXG5cclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgb2xkVGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QucmVtb3ZlVGltZXJIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIG1nZC5yZW1vdmVFeHByZXNzaW9uSGFuZGxlcih0aGlzKTtcclxuICAgICAgICBpZiAobWdkLmdldFRpbWVySGFuZGxlcnMoKSAhPSBudWxsKVxyXG4gICAgICAgICAgbmV3VGltZXJzID0gbWdkLmdldFRpbWVySGFuZGxlcnMoKS5nZXRUaW1lcnNWZWN0b3IoKTtcclxuICAgICAgICBtZ2QuY2hhbmdlVGltZXJzKG9sZFRpbWVycywgbmV3VGltZXJzKTtcclxuXHJcbiAgICAgICAgbWdkLnJlbW92ZVRhc2sodGhpcyk7XHJcbiAgICAgICAgR1VJTWFuYWdlci5JbnN0YW5jZS5hYm9ydCg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQWJvcnRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgIC8vIElmIHRoZSB0YXNrIGdvdCBjbG9zZWQgZHVlIHRvIGEgY2xpY2sgb24gc2FtZSB0YXNrLCB0aGVuIHNldCBDdXJyZW50Q2xpY2tlZEN0cmwgdG8gbnVsbFxyXG4gICAgaWYgKHRoaXMuZ2V0Q2xpY2tlZENvbnRyb2woKSAhPSBudWxsKVxyXG4gICAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ3VycmVudENsaWNrZWRDdHJsID0gbnVsbDtcclxuICAgIGlmICh0aGlzLkZvcm0gIT0gbnVsbClcclxuICAgICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5yZW1vdmVSZWZzVG9DdHJscygpO1xyXG5cclxuICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICBsZXQgc3ViRm9ybSA9IDxNZ0NvbnRyb2w+dGhpcy5Gb3JtLmdldFN1YkZvcm1DdHJsKCk7XHJcblxyXG4gICAgICBzdWJGb3JtLnNldFN1YmZvcm1UYXNrSWQobnVsbCk7XHJcbiAgICAgIHN1YkZvcm0uaW5pdFN1YmZvcm1UYXNrKCk7XHJcblxyXG4gICAgICBpZiAoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpID09PSB0aGlzKVxyXG4gICAgICAgIExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5zZXRMYXN0Rm9jdXNlZFRhc2sodGhpcy5fcGFyZW50VGFzayk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzMxMDExMy4gSWYgdGhlIHN1YmZvcm0gdGFzayBmb3Igd2FzIG5vdCBsb2FkZWQgeWV0LCBkbyBub3QgcmVmcmVzaCBpdC5cclxuICAgICAgaWYgKHN1YkZvcm0uU3ViZm9ybUxvYWRlZClcclxuICAgICAgICBhd2FpdCAoc3ViRm9ybS5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1ZJU0lCTEUpKS5SZWZyZXNoRGlzcGxheSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2xlYXJEYXRhVmlld0NvbW1hbmQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRGF0YVZpZXdDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBEYXRhVmlld0NvbW1hbmRUeXBlLkNsZWFyKTtcclxuICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY2xlYXJEYXRhVmlld0NvbW1hbmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBhYm9ydCB0aGUgTWdEYXRhIHRvIHdoaWNoIHRoZSB0YXNrIGJlbG9uZ3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFib3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRNR0RhdGEoKS5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBoYXMgc3ViLXRhc2tzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBoYXNTdWJUYXNrcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlN1YlRhc2tzICE9PSBudWxsICYmIHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBBIG51bWJlciwgMS0yNCwgdGhlIGN1cnJlbnQgdGFzaydzIGRlcHRoIGluIHRoZSB0YXNrIGV4ZWN1dGlvbiBoaWVyYXJjaHkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gZGVwdGggb2YgdGhlIHRhc2ssIDEgaWYgY2FsbGVkIGZyb20gdGhlIHJvb3QgdGFzazwvcmV0dXJucz5cclxuICBnZXRUYXNrRGVwdGgoYnlQYXJlbnRPcmRlcjogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBpZiAoYnlQYXJlbnRPcmRlcilcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcblxyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSAoPFRhc2s+IHRoaXMuR2V0Q29udGV4dFRhc2soKSkuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuXHJcbiAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBoYW5kbGVyIGFkZCBpdCB0byB0aGUgcGF0aFxyXG4gICAgaWYgKHRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IENvbnN0SW50ZXJmYWNlLlRPUF9MRVZFTF9DT05UQUlORVIpXHJcbiAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xyXG5cclxuICAgIHJldHVybiBkZXB0aDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgZ2V0VGFza0RlcHRoIHJlY3Vyc2lvbi5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYnlQYXJlbnRPcmRlclwiPmlmIHRydWUsIHdlIHRyYXZlbCB0aGUgcGFyZW50cywgb3RoZXJ3aXNlIHdlIHRyYXZlbCB0aGUgdHJpZ2dlcmluZyB0YXNrczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBnZXRUYXNrRGVwdGhfKGJ5UGFyZW50T3JkZXI6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICBpZiAodG1wVGFzayA9PSBudWxsIHx8IGJ5UGFyZW50T3JkZXIpXHJcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRUYXNrID09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8qIGlmIHRoZSBjdGxJZHggb2YgdGhlIGN1cnJlbnQgdGFzayBhbmQgdGhlIHBhcmVudCBhcmUgZGlmZmVyZW50LCAgICovXHJcbiAgICAgICAgLyogdGhhdCBpcyB0aGUgY3VycmVudCB0YXNrIGlzIGZyb20gYSBjb21wb25lbnQsIGFkZCB0aGUgY29tcG9uZW50J3MgKi9cclxuICAgICAgICAvKiBNYWluIFByZyBhcyB3ZWxsLiAqL1xyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRoaXMuX3BhcmVudFRhc2suZ2V0Q3RsSWR4KCkpXHJcbiAgICAgICAgICByZXR1cm4gMiArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgICByZXR1cm4gMSArIHRoaXMuX3BhcmVudFRhc2suZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICAgICAgfVxyXG4gICAgcmV0dXJuIDEgKyAodG1wVGFzaykuZ2V0VGFza0RlcHRoXyhieVBhcmVudE9yZGVyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGFuY2VzdG9yIG9mIHRoZSBUYXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImdlbmVyYXRpb25cIj5vZiB0aGUgYW5jZXN0b3IgdGFzazwvcGFyYW0+XHJcbiAgR2V0VGFza0FuY2VzdG9yKGdlbmVyYXRpb246IG51bWJlcik6IElUYXNrIHtcclxuICAgIHJldHVybiB0aGlzLmdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldFRhc2tBbmNlc3Rvcl8oZ2VuZXJhdGlvbjogbnVtYmVyKTogSVRhc2sge1xyXG4gICAgbGV0IHJldFRhc2s6IElUYXNrID0gbnVsbDtcclxuXHJcbiAgICBpZiAoZ2VuZXJhdGlvbiA9PT0gMClcclxuICAgICAgcmV0VGFzayA9IHRoaXM7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSB0aGlzLmdldFRyaWdnZXJpbmdUYXNrKCk7XHJcbiAgICAgIGlmICh0bXBUYXNrID09PSBudWxsKVxyXG4gICAgICAgIHRtcFRhc2sgPSB0aGlzLl9wYXJlbnRUYXNrO1xyXG4gICAgICBpZiAodG1wVGFzayAhPT0gbnVsbClcclxuICAgICAgICByZXRUYXNrID0gdG1wVGFzay5nZXRUYXNrQW5jZXN0b3JfKC0tZ2VuZXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJldFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGFzayBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRUYXNrRGVwdGgoKTogbnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGFza0RlcHRoKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz50cnVlIGlmZiB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCB0YXNrIGNvbnRhaW5zIHRoZSB0YXNrIHBhc3NlZCBhcyBwYXJhbWV0ZXI8L3JldHVybnM+XHJcbiAgcGF0aENvbnRhaW5zKHRhc2s6IFRhc2tCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFza1BhdGguQ29udGFpbnMoPFRhc2s+dGFzayk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgY29udGV4dCB0YXNrIG9mIHRoaXMgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb250ZXh0XCI+dGhlIG5ldyBjb250ZXh0IHRhc2sgb2YgdGhlIGN1cnJlbnQgdGFzazwvcGFyYW0+XHJcbiAgU2V0Q29udGV4dFRhc2soY29udGV4dDogVGFza0Jhc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuQ29udGV4dFRhc2sgPSA8VGFzaz5jb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHRhc2sgd2hpY2ggaXMgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlci5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldENvbnRleHRUYXNrKCk6IElUYXNrIHtcclxuICAgIGxldCBjdXJyUmVjOiBSZWNvcmQgPSAoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpO1xyXG5cclxuICAgIGlmICh0aGlzLkluU3RhcnRQcm9jZXNzXHJcbiAgICAgIHx8IGN1cnJSZWMgIT09IG51bGwgJiYgKGN1cnJSZWMuSW5Db21wdXRlIHx8IGN1cnJSZWMuSW5SZWNvbXB1dGUpXHJcbiAgICAgIHx8IHRoaXMuRm9ybSAhPT0gbnVsbCAmJiB0aGlzLkZvcm0uaW5SZWZyZXNoRGlzcGxheSgpKVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuXHJcbiAgICByZXR1cm4gdGhpcy5Db250ZXh0VGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhbmRsZXIgd2hpY2ggY3JlYXRlZCBtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VHJpZ2dlcmluZ1Rhc2soKTogVGFzayB7XHJcbiAgICAvLyBUaGlzIGlzIGEgc2VtaSBwYXRjaCB3aGljaCBmaXhlcyBwcm9ibGVtcyBzdWNoIGFzIHRoZSBvbmVzIGluIFFDUiAjMjk2NDI4XHJcbiAgICAvLyBXaGVuIGEgbW9kYWwgdGFzayBnZXRzIG9wZW5lZCwgaXQgbWlnaHQgc2V0IGl0cyB0cmlnZ2VyaW5nIHRhc2sgdG8gYSB0YXNrXHJcbiAgICAvLyB3aG9zZSAnYWJvcnQnIGNvbW1hbmQgYXJyaXZlZCBhbmQgaXMgcGVuZGluZyBmb3IgZXhlY3V0aW9uLiBVbmRlciB0aGVzZVxyXG4gICAgLy8gY2lyY3Vtc3RhbmNlcywgd2UgbXVzdCBjaGVjayBldmVyeSBhY2Nlc3MgdG8gdHJpZ2dlcmluZ1Rhc2sgYW5kIG1ha2Ugc3VyZVxyXG4gICAgLy8gaXQgcG9pbnRzIHRvIGEgdmFsaWQgdGFzay5cclxuICAgIGlmICh0aGlzLl90cmlnZ2VyaW5nVGFzayAhPT0gbnVsbCAmJiB0aGlzLl90cmlnZ2VyaW5nVGFzay5nZXRNR0RhdGEoKS5Jc0Fib3J0aW5nKVxyXG4gICAgICB0aGlzLl90cmlnZ2VyaW5nVGFzayA9IHRoaXMuX3BhcmVudFRhc2s7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJpbmdUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgbGFzdCBwYXJrZWQgY29udHJvbCBpbiB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY3RybFwiPmxhc3QgZm9jdXNlZCBjb250cm9sPC9wYXJhbT5cclxuICBzZXRMYXN0UGFya2VkQ3RybChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICBzdXBlci5zZXRMYXN0UGFya2VkQ3RybChjdHJsKTtcclxuICAgIExhc3RGb2N1c2VkTWFuYWdlci5zZXRMYXN0Rm9jdXNlZENvbnRyb2wodGhpcywgY3RybCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUXVlcnkgVGFzayBQYXRoIFJldHVybnMgdGhlIHRhc2sgcGF0aCB0aGF0IGxlYWRzIHRvIHRoZSBjdXJyZW50IHRhc2suIFRoZSByZXN1bHRpbmcgYWxwaGEgc3RyaW5nXHJcbiAgLy8vICAgY29udGFpbnMgdGhlIHRhc2sgbmFtZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgbmFtZSBvZiB0aGUgdGFzay4gTmFtZXMgYXJlIHNlcGFyYXRlZCBieSB0aGUgJzsnXHJcbiAgLy8vICAgY2hhcmFjdGVyLiBGb3IgUFJPRygpIHVzaW5nLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcXVlcnlUYXNrUGF0aCgpOiBTdHJpbmdCdWlsZGVyIHtcclxuICAgIGxldCBpbnNlcnRlZE5hbWVzOiBudW1iZXIgPSAwOyAgICAgICAgLy8gaG93IG1hY2ggbmFtZXMgaW5zZXJ0ZWQgdG8gdGhlIG91dHB1dCBzdHJpbmdcclxuICAgIGxldCByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcig3OTM2KTsgLy8gMzEgKiAyNTYgKi9cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkodGhpcy5nZXRUYXNrRGVwdGgoZmFsc2UpKTtcclxuICAgIHRoaXMucGF0aFRvUm9vdCh0cmVlUm91dGUsIGZhbHNlKTtcclxuICAgIGZvciAobGV0IHRzazogbnVtYmVyID0gdHJlZVJvdXRlLmxlbmd0aCAtIDE7IHRzayA+PSAwOyB0c2stLSkge1xyXG4gICAgICBsZXQgY3VyclRzazogVGFzayA9IHRyZWVSb3V0ZVt0c2tdO1xyXG4gICAgICBpZiAoY3VyclRzay5pc01haW5Qcm9nKCkpXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIGxldCBuYW1lUHJvcDogUHJvcGVydHkgPSBjdXJyVHNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSk7XHJcbiAgICAgIGlmIChuYW1lUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gbmFtZVByb3AuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgMSBuYW1lIC0+IGRvbid0IGluc2VydCAnOydcclxuICAgICAgICAvLyBhZnRlciBsYXN0IG5hbWUgZG9uJ3QgaW5zZXJ0ICc7JyB0b28uXHJcbiAgICAgICAgaWYgKGluc2VydGVkTmFtZXMrKyAhPT0gMClcclxuICAgICAgICAgIHJlc3VsdC5BcHBlbmQoJzsnKTtcclxuICAgICAgICByZXN1bHQuQXBwZW5kKG5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEdldCBGaWVsZCB3aGljaCBjb250YWluIGl0ZW0gbnVtYmVyIGl0bVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY3RsX2l0bV8yX3BhcmVudF92ZWUoaXRtOiBudW1iZXIpOiBGaWVsZCB7XHJcbiAgICBsZXQgY3VyclRzazogVGFzaztcclxuICAgIGxldCBjdXJySXRtOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGxhc3RJdG06IG51bWJlciA9IDA7ICAgICAgLy8gc3RhcnQgb2YgdGhlIGZpZWxkIGluIGZpZWxkZVRhYiBudW1iZXIgZm9yIGNoZWNrZWQgdGFza1xyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aC0xXVxyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgZm9yIChsZXQgdHNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdHNrID49IDA7IHRzay0tKSB7XHJcbiAgICAgIGN1cnJUc2sgPSB0cmVlUm91dGVbdHNrXTtcclxuXHJcbiAgICAgIGN1cnJJdG0gKz0gY3VyclRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcblxyXG4gICAgICAvLyBmb3VuZCB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgZmllbGRcclxuICAgICAgaWYgKGl0bSA8IGN1cnJJdG0pIHtcclxuICAgICAgICAvLyBudW1iZXIgb2YgRmllbGQgaW4gZm91bmQgdGFza1xyXG4gICAgICAgIGl0bSAtPSBsYXN0SXRtO1xyXG4gICAgICAgIHJldHVybiA8RmllbGQ+Y3VyclRzay5EYXRhVmlldy5nZXRGaWVsZChpdG0pO1xyXG4gICAgICB9XHJcbiAgICAgIGxhc3RJdG0gPSBjdXJySXRtO1xyXG4gICAgfVxyXG4gICAgLy8gbm90IGZvdW5kIHRoZSBmaWVsZFxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEdldCB0aGUgY29udHJvbCBpZCB3aGljaCBjb250YWluIGZpZWxkIGF0dGFjaGVkIHRvIGNvbnRyb2xcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIml0ZW1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbElERnJvbVZhckl0ZW0oaXRlbTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBjdXJyVGFzazogVGFzaztcclxuICAgIGxldCBjdXJySXRlbTogbnVtYmVyID0gMDtcclxuICAgIGxldCBsYXN0SXRlbTogbnVtYmVyID0gMDsgICAvLyBzdGFydCBvZiB0aGUgZmllbGQgaW4gZmllbGRlVGFiIG51bWJlciBmb3IgY2hlY2tlZCB0YXNrXHJcbiAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgbGV0IHRyZWVSb3V0ZSA9IG5ldyBBcnJheSh0aGlzLmdldFRhc2tEZXB0aCh0cnVlKSk7XHJcbiAgICAvLyB0aGUgcm91dGUgdXAsIHRoZSBpbnNlcnQgKG91ciB0YXNrKSBpcyBbMF0sIGFuZCBleGl0IChyb290KSBpcyBbdHJlZVJvdXRlLmxlbmd0aCAtIDFdXHJcbiAgICB0aGlzLnBhdGhUb1Jvb3QodHJlZVJvdXRlLCB0cnVlKTtcclxuXHJcbiAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcbiAgICAgIGN1cnJJdGVtICs9IGN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpLmdldFNpemUoKTtcclxuXHJcbiAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbCAmIGZpZWxkXHJcbiAgICAgIGlmIChpdGVtIDwgY3Vyckl0ZW0pIHtcclxuICAgICAgICAvLyBOdW1iZXIgb2YgZmllbGRzIGluIGZvdW5kIHRhc2tcclxuICAgICAgICBpdGVtIC09IGxhc3RJdGVtO1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPmN1cnJUYXNrLkRhdGFWaWV3LmdldEZpZWxkKGl0ZW0pO1xyXG4gICAgICAgIGlmIChmaWVsZC5nZXRDdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayA9IG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrICsgY3VyclRhc2suRm9ybS5nZXRDb250cm9sSWR4KGZpZWxkLmdldEN0cmwoKSkgKyAxO1xyXG5cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGN1cnJUYXNrLkZvcm0gIT0gbnVsbClcclxuICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgbGFzdEl0ZW0gPSBjdXJySXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb250cm9sIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSBpbiBzYW1lIHRhc2sgbm90IGZvdW5kXHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0IHRoZSBjb250cm9sIGZyb20gY29udHJvbElEXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250cm9sSURcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgR2V0Q29udHJvbEZyb21Db250cm9sSUQoY29udHJvbElEOiBudW1iZXIsIHBhcmVudDogUmVmUGFyYW08bnVtYmVyPik6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY29udHJvbDogTWdDb250cm9sID0gbnVsbDtcclxuICAgIHBhcmVudC52YWx1ZSA9IC0xO1xyXG5cclxuICAgIGlmIChjb250cm9sSUQgPj0gMCkge1xyXG4gICAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgICBsZXQgY2FsbGVyVGFzazogVGFzayA9IG51bGw7XHJcbiAgICAgIGxldCBub09mQ29udHJvbHNJbkN1cnJ0YXNrOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgbm9PZkNvbnRyb2xzQmVmb3JlQ3VyclRhc2s6IG51bWJlciA9IDA7XHJcbiAgICAgIGxldCBjb250cm9sSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgLy8gc2F2ZSB0aGUgcm91dGUgdG8gdGhlIHJvb3QgaW4gdGhlIHRyZWVSb3V0ZSBhcnJheVxyXG4gICAgICBsZXQgdHJlZVJvdXRlID0gbmV3IEFycmF5KHRoaXMuZ2V0VGFza0RlcHRoKHRydWUpKTtcclxuXHJcbiAgICAgIC8vIHRoZSByb3V0ZSB1cCwgdGhlIGluc2VydCAob3VyIHRhc2spIGlzIFswXSwgYW5kIGV4aXQgKHJvb3QpIGlzIFt0cmVlUm91dGUubGVuZ3RoIC0gMV1cclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBmb3IgKGxldCB0YXNrOiBudW1iZXIgPSB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzayA+PSAwOyB0YXNrLS0pIHtcclxuXHJcbiAgICAgICAgY3VyclRhc2sgPSB0cmVlUm91dGVbdGFza107XHJcblxyXG4gICAgICAgIGlmIChjdXJyVGFzay5Gb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIG5vT2ZDb250cm9sc0luQ3VycnRhc2sgPSBjdXJyVGFzay5Gb3JtLmdldEN0cmxDb3VudCgpO1xyXG5cclxuICAgICAgICAgIC8vIEZvdW5kIHRoZSB0YXNrIHdoaWNoIGNvbnRhaW5zIHRoZSBuZWVkZWQgY29udHJvbFxyXG4gICAgICAgICAgaWYgKGNvbnRyb2xJRCA8IChub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArIG5vT2ZDb250cm9sc0luQ3VycnRhc2spKSB7XHJcbiAgICAgICAgICAgIC8vIElkeCBvZiB0aGUgY29udHJvbCBpbiBjdXJyZW50IHRhc2tcclxuICAgICAgICAgICAgY29udHJvbElkeCA9IGNvbnRyb2xJRCAtIG5vT2ZDb250cm9sc0JlZm9yZUN1cnJUYXNrO1xyXG4gICAgICAgICAgICBjb250cm9sID0gPE1nQ29udHJvbD5jdXJyVGFzay5Gb3JtLkN0cmxUYWIuZ2V0Q3RybChjb250cm9sSWR4KTtcclxuICAgICAgICAgICAgY2FsbGVyVGFzayA9IGN1cnJUYXNrO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBub09mQ29udHJvbHNCZWZvcmVDdXJyVGFzayArPSBub09mQ29udHJvbHNJbkN1cnJ0YXNrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gR2V0IHBhcmVudFxyXG4gICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50LnZhbHVlID0gMDtcclxuICAgICAgICBsZXQgcHJldkN0bElkeDogbnVtYmVyID0gdHJlZVJvdXRlWzBdLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHRhc2s6IG51bWJlciA9IDA7IHRhc2sgPCB0cmVlUm91dGUubGVuZ3RoIC0gMTsgdGFzaysrKSB7XHJcbiAgICAgICAgICBjdXJyVGFzayA9IHRyZWVSb3V0ZVt0YXNrXTtcclxuXHJcbiAgICAgICAgICBpZiAocHJldkN0bElkeCAhPT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgcGFyZW50LnZhbHVlKys7XHJcblxyXG4gICAgICAgICAgaWYgKGNhbGxlclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleCA9PT0gY3VyclRhc2suVGFza0RlZmluaXRpb25JZC5DdGxJbmRleClcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgcHJldkN0bElkeCA9IGN1cnJUYXNrLlRhc2tEZWZpbml0aW9uSWQuQ3RsSW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udHJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgQ29udHJvbElEXHJcbiAgICByZXR1cm4gY29udHJvbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGN0bF9pdG1fNF9wYXJlbnRfdmVlKHBhcmVudDogbnVtYmVyLCB2ZWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgdHNrOiBUYXNrO1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSB0aGlzLmdldFRhc2tEZXB0aCh0cnVlKTtcclxuXHJcbiAgICBpZiAocGFyZW50ICE9PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQgJiYgZGVwdGggPD0gcGFyZW50KVxyXG4gICAgICByZXR1cm4gdmVlO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG5cclxuICAgIGlmICh2ZWUgIT09IDApIHtcclxuICAgICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHBhcmVudCBpbiB0aGUgdGFzayB0cmVlXHJcbiAgICAgIGxldCBpbmRPZlBhcmVudEluVGFza1RyZWU6IG51bWJlciA9IHRoaXMuZ2V0SW5kT2ZQYXJlbnRJblRhc2tUcmVlKHBhcmVudCwgdHJlZVJvdXRlKTtcclxuXHJcbiAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgIGZvciAoaSA9IHRyZWVSb3V0ZS5sZW5ndGggLSAxOyBpID4gaW5kT2ZQYXJlbnRJblRhc2tUcmVlOyBpLS0pIHtcclxuICAgICAgICB0c2sgPSB0cmVlUm91dGVbaV07XHJcbiAgICAgICAgdmVlICs9IHRzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKS5nZXRTaXplKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2ZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBhcmVudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrVHJlZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRJbmRPZlBhcmVudEluVGFza1RyZWUocGFyZW50OiBudW1iZXIsIHRhc2tUcmVlOiBUYXNrW10pOiBudW1iZXIge1xyXG4gICAgbGV0IGluZE9mUGFyZW50SW5UYXNrVHJlZTogbnVtYmVyID0gMDtcclxuICAgIGlmIChwYXJlbnQgPT09IFRhc2tCYXNlLk1BSU5fUFJHX1BBUkVOVF9JRCkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDwgdGFza1RyZWUubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAodGFza1RyZWVbaV0uaXNNYWluUHJvZygpICYmIHRoaXMuX2N0bElkeCA9PT0gdGFza1RyZWVbaV0uZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGluZE9mUGFyZW50SW5UYXNrVHJlZSA9IGk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgaW5kT2ZQYXJlbnRJblRhc2tUcmVlID0gcGFyZW50O1xyXG5cclxuICAgIHJldHVybiBpbmRPZlBhcmVudEluVGFza1RyZWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZW50cnkgcG9pbnQgdG8gdGhlIHJlY3Vyc2lvbiBpbmR1Y2VkIGJ5IGdldEZpZWxkQnlOYW1lXy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gYSBmaWVsZCB3aGljaCBiZWxvbmdzIHRvIG1lIG9yIHRvIG15IHBhcmVudHMgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZTwvcmV0dXJucz5cclxuICBnZXRGaWVsZEJ5TmFtZShmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcbiAgICByZXR1cm4gKDxUYXNrPiAodGhpcy5HZXRDb250ZXh0VGFzaygpKSkuZ2V0RmllbGRCeU5hbWVfKGZsZE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZpbmQgZmllbGQgd2l0aCB0aGUgbmFtZSBpbiB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWUsIHRoZSBuYW1lIGNhbiBiZSBlbXB0eSBzdHJpbmcgdG9vPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IElmIHRoZSB2YXJpYWJsZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBOVUxMLjwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEZpZWxkQnlOYW1lXyhmbGROYW1lOiBzdHJpbmcpOiBGaWVsZHtcclxuICAgIGxldCB0bXBUYXNrOiBUYXNrO1xyXG5cclxuICAgIGlmIChmbGROYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgbGV0IGZsZDogRmllbGQgPSB0aGlzLmdldEZpZWxkKGZsZE5hbWUpO1xyXG5cclxuICAgIC8vIGlmIHRoZSBmaWVsZCBpcyBub3Qgb3VycyAtIHJlY3Vyc2l2ZSBjaGVjayB0aGUgYW5jZXN0b3JzXHJcbiAgICBpZiAoZmxkID09IG51bGwpIHtcclxuICAgICAgdG1wVGFzayA9IHRoaXMuZ2V0VHJpZ2dlcmluZ1Rhc2soKSAhPSBudWxsID8gdGhpcy5nZXRUcmlnZ2VyaW5nVGFzaygpIDogdGhpcy5fcGFyZW50VGFzaztcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYWluUHJvZygpICYmIHRoaXMuZ2V0Q3RsSWR4KCkgIT09IHRtcFRhc2suZ2V0Q3RsSWR4KCkpIHtcclxuICAgICAgICAgIGxldCBtYWluUHJnOiBUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIHRoaXMuZ2V0Q3RsSWR4KCkpO1xyXG4gICAgICAgICAgZmxkID0gbWFpblByZy5nZXRGaWVsZEJ5TmFtZV8oZmxkTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgICAgICBmbGQgPSB0bXBUYXNrLmdldEZpZWxkQnlOYW1lXyhmbGROYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZsZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaW5kZXggb2YgdGhlIGZpZWxkIGluIHRoZSB0YXNrIG9yIGl0cyBhbmNlc3RvcnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPm5hbWU8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gSWYgdGhlIHZhcmlhYmxlIG5hbWUgaXMgbm90IGZvdW5kIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBaZXJvLjwvcmV0dXJucz5cclxuICBnZXRJbmRleE9mRmllbGRCeU5hbWUoZmxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGxldCBkZXB0aDogbnVtYmVyID0gdGhpcy5nZXRUYXNrRGVwdGgodHJ1ZSk7XHJcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZmxkOiBGaWVsZCA9IHRoaXMuZ2V0RmllbGRCeU5hbWUoZmxkTmFtZSk7XHJcbiAgICBsZXQgZmxkVGFiOiBGaWVsZHNUYWJsZTtcclxuXHJcbiAgICBpZiAoZmxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiAwO1xyXG5cclxuICAgIGxldCB0cmVlUm91dGUgPSBuZXcgQXJyYXkoZGVwdGgpO1xyXG4gICAgdGhpcy5wYXRoVG9Sb290KHRyZWVSb3V0ZSwgdHJ1ZSk7XHJcbiAgICBmb3IgKGxldCBjdXJyOiBudW1iZXIgPSBkZXB0aCAtIDE7IGN1cnIgPj0gMDsgY3Vyci0tKSB7XHJcbiAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IHRyZWVSb3V0ZVtjdXJyXTtcclxuICAgICAgaWYgKGN1cnJUYXNrID09PSBmbGQuZ2V0VGFzaygpKSB7XHJcbiAgICAgICAgY3VyciA9IGZsZC5nZXRJZCgpO1xyXG4gICAgICAgIGluZGV4ICs9ICsrY3VycjsgICAgICAgICAvLyBzdGFydCBpbmRleCBpbiBNYWdpYyBmcm9tIDEgYW5kIG5vdCBmcm9tIDBcclxuICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG91dCBvZiB0aGUgdGFzayB0cmVlIC0gdGhlIGluZGV4IGlzIGZvdW5kXHJcbiAgICAgIH1cclxuICAgICAgZmxkVGFiID0gPEZpZWxkc1RhYmxlPmN1cnJUYXNrLkRhdGFWaWV3LkdldEZpZWxkc1RhYigpO1xyXG4gICAgICBpbmRleCArPSBmbGRUYWIuZ2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNhbGN1bGF0ZSB0aGUgcGF0aCBmcm9tIHRoaXMgdGFzayB0byB0aGUgcm9vdCBvZiB0aGUgdGFza3MgdHJlZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwYXRoXCI+YXJyYXkgb2YgdGFza3MsIHRoZSByb3V0ZSB1cC4gVGhlIDAgaXRlbSBpcyBzdGFydCBwb2ludCB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJ5UGFyZW50T3JkZXJcIj5pZiB0cnVlLCB3ZSB0cmF2ZWwgdGhlIHBhcmVudHMsIG90aGVyd2lzZSB3ZSB0cmF2ZWwgdGhlIHRyaWdnZXJpbmcgdGFza3M8L3BhcmFtPlxyXG4gIHBhdGhUb1Jvb3QocGF0aDogVGFza1tdLCBieVBhcmVudE9yZGVyOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IChieVBhcmVudE9yZGVyID8gdGhpcyA6IDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCkpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHBhdGhbaV0gPSB0YXNrO1xyXG4gICAgICBsZXQgY3RsSWR4OiBudW1iZXIgPSB0YXNrLmdldEN0bElkeCgpO1xyXG5cclxuICAgICAgbGV0IHRtcFRhc2s6IFRhc2sgPSBieVBhcmVudE9yZGVyID8gbnVsbCA6IHRhc2suZ2V0VHJpZ2dlcmluZ1Rhc2soKTtcclxuXHJcbiAgICAgIGlmICh0bXBUYXNrICE9IG51bGwpXHJcbiAgICAgICAgdGFzayA9IHRtcFRhc2s7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG5cclxuICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBRQ1IgMzY2NzQ4IGlmIHdlIGFyZSBpbiBhIGNvbXBvbmVudCBnbG9iYWwgaGFuZGxlciBhZGQgaXQgdG8gdGhlIHBhdGhcclxuICAgICAgICAgIGlmICghYnlQYXJlbnRPcmRlciAmJiB0aGlzLmlzTWFpblByb2coKSAmJiB0aGlzLmdldEN0bElkeCgpICE9PSBDb25zdEludGVyZmFjZS5UT1BfTEVWRUxfQ09OVEFJTkVSKVxyXG4gICAgICAgICAgICBwYXRoW2kgKyAxXSA9IHRoaXM7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChieVBhcmVudE9yZGVyICYmIGN0bElkeCAhPT0gdGFzay5nZXRDdGxJZHgoKSlcclxuICAgICAgICAgIHBhdGhbKytpXSA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRNYWluUHJvZ0J5Q3RsSWR4KC0xLCBjdGxJZHgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyB0YXNrIHNob3VsZCBiZSByZWZyZXNoZWQgLSBjb21wYXJlIHRoZSBcInJlZnJlc2ggb25cIiBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZVxyXG4gIC8vLyAgIHByZXZpb3VzIHJlY29yZCBhbmQgaWYgZGlmZmVyZW50IHZhbHVlcyBhcmUgZm91bmQgcmV0dXJucyB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNob3VsZEJlUmVmcmVzaGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGRhdGFWaWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl9wYXJlbnRUYXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHByZXZDdXJyUmVjIGlzIG51bGwgb25seSBpZiBpdCBpcyB0aGUgZmlyc3QgdGltZSBvciBhZnRlciBDYW5jZWwuXHJcbiAgICAvLyBBZnRlciBDYW5jZWwgaW4gdGhlIHBhcmVudCB0YXNrIFN1YmZvcm0gcmVmcmVzaCBtdXN0IGJlIGRvbmUgYWx3YXlzXHJcbiAgICBpZiAodGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbCB8fCBkYXRhVmlldy5pc1ByZXZDdXJyUmVjTnVsbCgpIHx8XHJcbiAgICAgICh0aGlzLlJlZnJlc2hPblZhcnMgIT09IG51bGwgJiYgIWRhdGFWaWV3LmN1cnJFcXVhbHNQcmV2KHRoaXMuUmVmcmVzaE9uVmFycykpKVxyXG4gICAgICByZXN1bHQgPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBzdWJUYXNrcyAoc3ViZm9ybXMpIHNob3VsZCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIENoZWNrUmVmcmVzaFN1YlRhc2tzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHJldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8vIGRvIG5vdCByZWZyZXNoIHN1YmZvcm1zIGJlZm9yZSB0aGUgZmlyc3QgcmVjb3JkIHByZWZpeC4gVGhlIHNlcnZlciBzZW50IHVzIHRoZWlyIGRhdGF2aWV3IVxyXG4gICAgaWYgKHRoaXMuX2VudGVyZWRSZWNMZXZlbCkge1xyXG4gICAgICBsZXQgc3ViZm9ybXNUb1JlZnJlc2g6IExpc3Q8VGFzaz4gPSBhd2FpdCB0aGlzLkdldFN1YmZvcm1zVG9SZWZyZXNoKCk7XHJcblxyXG4gICAgICBpZiAoc3ViZm9ybXNUb1JlZnJlc2gubGVuZ3RoID4gMClcclxuICAgICAgICByZXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gR2V0cyBhIGxpc3Qgb2Ygc3VidGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5hIGxpc3Qgb2Ygc3VidGFza3M8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBHZXRTdWJUYXNrcygpOiBMaXN0PFRhc2s+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSlcclxuICAgICAgICBzdWJUYXNrcy5wdXNoKDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBHZXRzIGEgbGlzdCBvZiB0aG9zZSBzdWJmb3JtcyB0aGF0IG11c3QgYmUgcmVmcmVzaGVkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmxpc3Qgb2Ygc3ViZm9ybXMgdG8gcmVmcmVzaDwvcmV0dXJucz5cclxuICBhc3luYyBHZXRTdWJmb3Jtc1RvUmVmcmVzaCgpOiBQcm9taXNlPExpc3Q8VGFzaz4+IHtcclxuICAgIGxldCBzdWJUYXNrczogTGlzdDxUYXNrPiA9IHRoaXMuR2V0U3ViVGFza3MoKTtcclxuICAgIGxldCBzdWJUYXNrc1RvUmVmcmVzaDogTGlzdDxUYXNrPiA9IG5ldyBMaXN0PFRhc2s+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1YlRhc2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gc3ViVGFza3MuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLlNob3VsZFJlZnJlc2hTdWJmb3JtVGFzayhzdWJUYXNrKSlcclxuICAgICAgICBzdWJUYXNrc1RvUmVmcmVzaC5wdXNoKHN1YlRhc2spXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN1YlRhc2tzVG9SZWZyZXNoO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2sgaWYgdGhlIHNwZWNpZmljIHN1YmZvcm0gbXVzdCBiZSByZWZyZXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YlRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgYXN5bmMgU2hvdWxkUmVmcmVzaFN1YmZvcm1UYXNrKHN1YlRhc2s6IFRhc2spOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+c3ViVGFzay5nZXRGb3JtKCkuZ2V0U3ViRm9ybUN0cmwoKTtcclxuXHJcbiAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgLy8gRGVmZWN0IDc2OTc5LiBTdWJmb3JtIGNhbiBleGVjdXRlIHJlZnJlc2ggb25seSBhZnRlciBpdCBoYXMgVGFza1ZpZXcuXHJcbiAgICBpZiAoc3ViZm9ybUN0cmwgIT0gbnVsbCAmJiAhc3ViVGFzay5JblNlbGVjdCAmJiBzdWJUYXNrLkFmdGVyRmlyc3RSZWNvcmRQcmVmaXgpIHtcclxuICAgICAgbGV0IHBhcmVudE1vZGU6IHN0cmluZyA9IHRoaXMuZ2V0TW9kZSgpO1xyXG4gICAgICBsZXQgbW9kZVByb3BlcnR5OiBudW1iZXIgPSAocGFyZW50TW9kZSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX1FVRVJZXHJcbiAgICAgICAgOiBwYXJlbnRNb2RlID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX01PRElGWVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSk7XHJcblxyXG4gICAgICAvLyBGb3IgYSBzdWJmb3JtIHdpdGggJ0FzUGFyZW50JyBtb2RlIHdlIGFsc28gbXVzdCByZWZyZXNoIHRoZSBzdWJmb3JtXHJcbiAgICAgIC8vIGFmdGVyIHRoZSBwYXJlbnQgcmVjb3JkIHByZWZpeC4gSWYgdGhlIHNwZWNpZmljIG1vZGUgaXMgbm90IGFsbG93ZWRcclxuICAgICAgLy8gdGhlIHN1YmZvcm0gY29udGludWVzIGluIHRoZSBvbGQgbW9kZS5cclxuICAgICAgaWYgKHN1YlRhc2suTW9kZUFzUGFyZW50ICYmIHBhcmVudE1vZGUgIT09IHN1YlRhc2suZ2V0TW9kZSgpICYmXHJcbiAgICAgICAgdGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQgJiZcclxuICAgICAgICBhd2FpdCAoc3ViVGFzay5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX09QVElPTikpLmdldFZhbHVlQm9vbGVhbigpICYmXHJcbiAgICAgICAgYXdhaXQgc3ViVGFzay5jaGVja1Byb3AobW9kZVByb3BlcnR5LCB0cnVlKSkge1xyXG4gICAgICAgIGlmICghc3ViZm9ybUN0cmwuaXNWaXNpYmxlKCkgJiZcclxuICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICBzdWJmb3JtQ3RybC5SZWZyZXNoT25WaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHJlZnJlc2ggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVmcmVzaCA9IHRydWU7XHJcblxyXG4gICAgICAgIGF3YWl0IHN1YlRhc2suU2V0TW9kZUFzUGFyZW50KHBhcmVudE1vZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJlZnJlc2ggPSBhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQVVUT19SRUZSRVNILCB0cnVlKSAmJiBzdWJUYXNrLnNob3VsZEJlUmVmcmVzaGVkKCk7XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICBpZiAoIXN1YmZvcm1DdHJsLmlzVmlzaWJsZSgpICYmXHJcbiAgICAgICAgICAgICFhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKSB7XHJcbiAgICAgICAgICAgIHN1YmZvcm1DdHJsLlJlZnJlc2hPblZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICByZWZyZXNoID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVmcmVzaClcclxuICAgICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmcmVzaDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0cyB0aGUgdGFzayBtb2RlIGFzIHBhcmVudCBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJwYXJlbnRNb2RlXCI+PC9wYXJhbT5cclxuICBhc3luYyBTZXRNb2RlQXNQYXJlbnQocGFyZW50TW9kZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmVuYWJsZU1vZGVzKCk7XHJcblxyXG4gICAgaWYgKHBhcmVudE1vZGUgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlRXZlbnRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY21kKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICB0aGlzLnNldFByZXZlbnRSZWNvcmRTdWZmaXgodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodHJ1ZSk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgdGhpcy5zZXRQcmV2ZW50Q29udHJvbENoYW5nZShmYWxzZSk7XHJcbiAgICAgIGxldCBzdWJUYXNrRHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuRGF0YVZpZXc7XHJcbiAgICAgIGlmICghc3ViVGFza0R2LmlzRW1wdHkoKSAmJiAoc3ViVGFza0R2LmdldEN1cnJSZWMoKSkuZ2V0TW9kZSgpICE9PSBEYXRhTW9kaWZpY2F0aW9uVHlwZXMuSW5zZXJ0KVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShwYXJlbnRNb2RlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSk7XHJcbiAgICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0NVUlJfUkVDKTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5zZXRNb2RlKHBhcmVudE1vZGUpO1xyXG5cclxuICAgIHRoaXMuc2V0T3JpZ2luYWxUYXNrTW9kZShwYXJlbnRNb2RlKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBhZnRlciBjb21wdXRlIGRvIHN1YmZvcm0gdGFzayByZWNvcmQgcHJlZml4ICYgc3VmZml4XHJcbiAgYXN5bmMgZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgc3ViVGFza3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHN1YlRhc2s6IFRhc2sgPSBzdWJUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgaWYgKHN1YlRhc2suRG9TdWJmb3JtUHJlZml4U3VmZml4KSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrQW5kU3ViZm9ybVJlZnJlc2goc3ViVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2xlYW4gZmxhZyBmb3IgU3ViZm9ybSByZWNvcmQgY3ljbGUgPC9zdW1tYXJ5PlxyXG4gIENsZWFuRG9TdWJmb3JtUHJlZml4U3VmZml4KCk6IHZvaWQge1xyXG4gICAgbGV0IHN1YlRhc2tzOiBMaXN0PFRhc2s+ID0gdGhpcy5HZXRTdWJUYXNrcygpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdWJUYXNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgc3ViVGFzazogVGFzayA9IHN1YlRhc2tzLmdldF9JdGVtKGkpO1xyXG4gICAgICBzdWJUYXNrLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBtdXN0IGRpc3BsYXkgY29uZmlybWF0aW9uIHdpbmRvdyBwcmlvciB0byBkZWxldGluZyBhIHJlY29yZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIG11c3RDb25maXJtSW5EZWxldGVNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByb3A6IFByb3BlcnR5ID0gdGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0NPTkZJUk1fVVBEQVRFKTtcclxuXHJcbiAgICAvLyBBcyBzdHJhbmdlIGFzIGl0IHNvdW5kcywgaWYgdGhlIHByb3BlcnR5IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvXHJcbiAgICAvLyBGYWxzZSwgdGhlbiBubyBuZWVkIHRvIGRpc3BsYXkgY29uZmlybWF0aW9uLi4uXHJcbiAgICByZXR1cm4gIXByb3AuaXNFeHByZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYWRkIGEgc3ViLXRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViVGFza1wiPnRoZSBzdWIgdGFzayB0byBhZGQ8L3BhcmFtPlxyXG4gIGFkZFN1YlRhc2soc3ViVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuU3ViVGFza3MgPT09IG51bGwpXHJcbiAgICAgIHRoaXMuU3ViVGFza3MgPSBuZXcgVGFza3NUYWJsZSgpO1xyXG4gICAgdGhpcy5TdWJUYXNrcy5hZGRUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSBvbmUgb2YgdGhpcyB0YXNrcyBzdWItdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdWJUYXNrXCI+YSByZWZlcmVuY2UgdG8gdGhlIHN1Yi10YXNrIHRvIHJlbW92ZTwvcGFyYW0+XHJcbiAgcmVtb3ZlU3ViVGFzayhzdWJUYXNrOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5TdWJUYXNrcyAhPT0gbnVsbClcclxuICAgICAgdGhpcy5TdWJUYXNrcy5yZW1vdmVUYXNrKHN1YlRhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgb2YgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyYW5zYWN0aW9uRmFpbGVkKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQgPSB2YWw7XHJcblxyXG4gICAgaWYgKCF2YWwpXHJcbiAgICAgIHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgXCJkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGZhaWxlZFwiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibGV2ZWxcIj5pcyB0aGUgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBsZXZlbCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjaGVja2luZy4gVFJBTlNfTk9ORSAtLT4gY2hlY2sgZm9yIGFueVxyXG4gIC8vLyAgIGR5bmFtaWNEZWYudHJhbnNhY3Rpb24gbGV2ZWwgZmFpbHVyZSBUUkFOU19SRUNPUkQvVEFTS19QUkVGSVggLS0+IGNoZWNrIGZvciBhIGZhaWx1cmUgaW4gdGhhdCBzcGVjaWZpY1xyXG4gIC8vLyAgIGxldmVsPC9wYXJhbT5cclxuICB0cmFuc2FjdGlvbkZhaWxlZChsZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldExldmVsKCkgPT09IGxldmVsKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRmFpbGVkO1xyXG4gICAgZWxzZSBpZiAobGV2ZWwgPT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUgfHxcclxuICAgICAgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuZ2V0TGV2ZWwoKSA9PT0gbGV2ZWwpKVxyXG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25GYWlsZWQ7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBmbGFnIG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiByZXRyeSBvbiB0aGUgdGFzaydzIGR5bmFtaWNEZWYudHJhbnNhY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dmFsdWUgb2YgZmxhZzwvcGFyYW0+XHJcbiAgc2V0QWZ0ZXJSZXRyeSh2YWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbClcclxuICAgICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRBZnRlclJldHJ5KHZhbCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeSAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh2YWwgPT09IENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkgPSBudWxsO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5UcmFuc2FjdGlvbkVycm9ySGFuZGxpbmdzUmV0cnkuc2V0QWZ0ZXJSZXRyeSh2YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QWZ0ZXJSZXRyeSgpOiBib29sZWFuO1xyXG4gIGdldEFmdGVyUmV0cnkocmVjb3Zlcnk6IHN0cmluZyk6IGJvb2xlYW47XHJcbiAgZ2V0QWZ0ZXJSZXRyeShyZWNvdmVyeT86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QWZ0ZXJSZXRyeV8wKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBZnRlclJldHJ5XzEocmVjb3ZlcnkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoaXMgdGFzayBpcyBwYXJ0IG9mIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBjdXJyZW50bHkgYmVpbmcgcmV0cmllZDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlRyYW5zYWN0aW9uICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uLmdldEFmdGVyUmV0cnkoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhpcyB0YXNrIGlzIHBhcnQgb2YgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uIGN1cnJlbnRseSBiZWluZyByZXRyaWVkIHdpdGggYSBzcGVjaWZpYyByZWNvdmVyeTwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldEFmdGVyUmV0cnlfMShyZWNvdmVyeTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5UcmFuc2FjdGlvbi5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIGVsc2UgaWYgKHRoaXMuVHJhbnNhY3Rpb25FcnJvckhhbmRsaW5nc1JldHJ5ICE9IG51bGwpXHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zYWN0aW9uRXJyb3JIYW5kbGluZ3NSZXRyeS5nZXRBZnRlclJldHJ5KHJlY292ZXJ5KTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIEV4ZWNFbmRUYXNrIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIF9iRXhlY0VuZFRhc2sgdmFsdWU8L3JldHVybnM+XHJcbiAgZ2V0RXhlY0VuZFRhc2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYkV4ZWNFbmRUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSBcImV4ZWN1dGUgZW5kIHRhc2tcIiBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICByZXNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgdGhlIFwiZXhlY3V0ZSBlbmQgdGFza1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEV4ZWNFbmRUYXNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBFdmFsdWF0ZSB0aGUgZW5kIGNvbmRpdGlvbiBwcm9wZXJ0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtb2RlXCI+dGhlIG1vZGUgdG8gY29tcGFyZSB0bzwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBzaG91bGQgd2UgZXZhbHVhdGUgdGhlIGVuZCBjb25kaXRpb24/PC9yZXR1cm5zPlxyXG4gIGFzeW5jIGV2YWxFbmRDb25kKG1vZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGVuZFRhc2tDb25kUHJvcDogUHJvcGVydHk7XHJcbiAgICBsZXQgZXZhbEVuZENvbmRQcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FVkFMX0VORF9DT05ESVRJT04pO1xyXG5cclxuICAgIC8vIERvbnQgZXZhbHVhdGUgZW5kIGNvbmRpdGlvbiBpZiB3ZSBhcmUgYWxyZWFkeSBjbG9zaW5nIHRoZSB0YXNrXHJcbiAgICBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fYkV4ZWNFbmRUYXNrKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZXZhbEVuZENvbmRQcm9wICE9IG51bGwgJiYgKCBOU3RyaW5nLkNvbXBhcmUoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCksIENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFLFxyXG4gICAgICAgIHRydWUpID09PSAwIHx8ICgoYXdhaXQgZXZhbEVuZENvbmRQcm9wLmdldFZhbHVlKCkpLnRvTG93ZXJDYXNlKCkgPT09IG1vZGUudG9Mb3dlckNhc2UoKSkpKSB7XHJcbiAgICAgIC8vIGNoZWNrIHRoZSBlbmQgY29uZGl0aW9uXHJcbiAgICAgIGVuZFRhc2tDb25kUHJvcCA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OKTtcclxuICAgICAgaWYgKGVuZFRhc2tDb25kUHJvcCA9PSBudWxsKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgbGV0IGVuZFRhc2s6IHN0cmluZyA9IGF3YWl0IGVuZFRhc2tDb25kUHJvcC5nZXRWYWx1ZSgpO1xyXG4gICAgICAvLyBzaWduYWwgd2UgbmVlZCB0byBwZXJmb3JtIGFuIGVuZCB0YXNrIGFmdGVyIHdlIGdldCBvdXQgb2YgdGhlIGxvb3BcclxuICAgICAgaWYgKERpc3BsYXlDb252ZXJ0b3IudG9Cb29sZWFuKGVuZFRhc2spKSB7XHJcbiAgICAgICAgdGhpcy5fYkV4ZWNFbmRUYXNrID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBcInRyeWluZyB0byBzdG9wXCIgZmxhZyBmb3IgdGhlIHRhc2sgYW5kIGl0J3Mgc3ViVGFza3NcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidmFsXCI+dGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGZsYWc8L3BhcmFtPlxyXG4gIHNldFRyeWluZ1RvU3RvcCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICB0YXNrLnNldFRyeWluZ1RvU3RvcCh2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLklzVHJ5aW5nVG9TdG9wID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeVxyXG4gIGdldEluUmVjb3JkU3VmZml4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luUmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgYkluUmVjb3JkU3VmZml4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRJblJlY29yZFN1ZmZpeChiVmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiVmFsdWUgIT09IHRoaXMuX2luUmVjb3JkU3VmZml4KSB7XHJcbiAgICAgIHRoaXMuX2luUmVjb3JkU3VmZml4ID0gYlZhbHVlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIGJFdmFsT2xkVmFsdWVzIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYkZsYWdcIj50cnVlL2ZhbHNlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUvZmxhc2UgLSB2YWx1ZSB1cGRhdGVkPC9yZXR1cm5zPlxyXG4gIHNldEV2YWxPbGRWYWx1ZXMoYkZsYWc6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmIChiRmxhZyAhPT0gdGhpcy5fZXZhbE9sZFZhbHVlcykge1xyXG4gICAgICB0aGlzLl9ldmFsT2xkVmFsdWVzID0gYkZsYWc7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYkV2YWxPbGRWYWx1ZXMgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZS9mYWxzZSAtIGxvb2sgYXQgb2xkIHZhbHVlcyB3aGVuIGdldHRpbmcgdGhlIGZpZWxkIHZhbHVlPC9yZXR1cm5zPlxyXG4gIGdldEV2YWxPbGRWYWx1ZXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZhbE9sZFZhbHVlcztcclxuICB9XHJcblxyXG4gICBhc3luYyBlbmRUYXNrKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIGR1ZVRvVmVyaWZ5RXJyb3I6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbj86IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChzdWJmb3JtRGVzdGluYXRpb24pKVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZmFsc2UsIGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lbmRUYXNrXzEocmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgc3ViZm9ybURlc3RpbmF0aW9uLCBkdWVUb1ZlcmlmeUVycm9yKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkIGluIGVuZGluZyB0aGUgdGFzayBhbmQgaXRzIHN1YiB0YXNrc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZXZlcnNpYmxlRXhpdFwiPmlmIHRydWUgdGhlbiB0aGUgZXhpdCBpcyByZXZlcnNpYmxlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9ubHlEZXNjc1wiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGUgc3ViIHRhc2tzIGFuZCBoYW5kbGUgcmVjIHN1ZmZpeCBmb3IgdGhpcyB0YXNrPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN1YmZvcm1EZXN0aW5hdGlvblwiPmlmIHRydWUgdGhlbiBlbmQgb25seSB0aGlzIHRhc2s8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZW5kVGFza18xKHJldmVyc2libGVFeGl0OiBib29sZWFuLCBvbmx5RGVzY3M6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbiwgZHVlVG9WZXJpZnlFcnJvcjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgY2xvc2VkU3ViRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IHN1YlRhc2s6IFRhc2s7XHJcbiAgICBsZXQgbWdkVGFiOiBJTUdEYXRhQ29sbGVjdGlvbiA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZTtcclxuXHJcbiAgICBpZiAoKHRoaXMuSXNTdWJGb3JtICYmICFzdWJmb3JtRGVzdGluYXRpb24pICYmICF0aGlzLl9wYXJlbnRUYXNrLkluRW5kVGFzaykge1xyXG4gICAgICAvLyBpZiB0aGlzIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBpdHMgcGFyZW50IGlzIG5vdCB0cnlpbmcgdG8gc3RvcCB0aGVuXHJcbiAgICAgIC8vIHN0YXJ0IHN0b3BwaW5nIHRoZSB0YXNrcyBzdWIgdHJlZSBmcm9tIHRoZSBwYXJlbnQgZm9ybVxyXG4gICAgICBzdWNjZWVkZWQgPSBhd2FpdCB0aGlzLl9wYXJlbnRUYXNrLmVuZFRhc2socmV2ZXJzaWJsZUV4aXQsIG9ubHlEZXNjcywgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghdGhpcy5pc0Fib3J0aW5nKCkgJiYgIXRoaXMuSW5FbmRUYXNrKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5JbkVuZFRhc2sgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBJbiBjYXNlIG9mIGVycm9yIGFuZCBicm93c2VyIGNsb3NlLCBpbnRpbWF0ZSBzZXJ2ZXIgYWJvdXQgYnJvd3NlciBjbG9zZVxyXG4gICAgICAgIGlmKChNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuSW5FbmRUYXNrICYmIE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5DbG9zaW5nRm9ybVVJKSAmJiBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBjbWQ6IElDbGllbnRDb21tYW5kID0gQ29tbWFuZEZhY3RvcnkuQ3JlYXRlVW5sb2FkQ29tbWFuZCgpO1xyXG4gICAgICAgICAgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5nZXRNR0RhdGEoMCkuQ21kc1RvU2VydmVyLkFkZChjbWQpO1xyXG4gICAgICAgICAgYXdhaXQgQ29tbWFuZHNQcm9jZXNzb3JNYW5hZ2VyLkdldENvbW1hbmRzUHJvY2Vzc29yKCkuRXhlY3V0ZShDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuSXNUcnlpbmdUb1N0b3ApXHJcbiAgICAgICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcCh0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gZXhpdCBmcm9tIHN1YlRhc2tzIGluIGEgcHJlZml4IG1hbm5lclxyXG4gICAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KSB7XHJcbiAgICAgICAgICAvLyBleGl0IGZyb20gdGhlIHN1YiB0YXNrc1xyXG4gICAgICAgICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICAgIGxldCBwZW5kaW5nVHJhbnNhY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBsZXQgY2xpZW50T3BlckV4aXN0OiBib29sZWFuID0gYXdhaXQgdGhpcy5DaGVja0lmQ2xpZW50T3BlcmF0aW9uRXhpc3RzSW5TdWJmb3JtVGFza3ModGhpcyxcclxuICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCk7XHJcbiAgICAgICAgICAgICAgaWYgKCFjbGllbnRPcGVyRXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNsaWVudE9wZXJFeGlzdCA9IGF3YWl0IHRoaXMuQ2hlY2tJZkNsaWVudE9wZXJhdGlvbkV4aXN0c0luU3ViZm9ybVRhc2tzKHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgICAgICAgICBpZiAoIWNsaWVudE9wZXJFeGlzdClcclxuICAgICAgICAgICAgICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRoaXMuQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnModGhpcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICghY2xpZW50T3BlckV4aXN0ICYmICFwZW5kaW5nVHJhbnNhY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNldFNlcnZlclNpZGVUYXNrU3VmZml4KHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKSAmJiBzdWNjZWVkZWQ7IGkrKykge1xyXG4gICAgICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICAgICAgY2xvc2VkU3ViRm9ybSA9IGNsb3NlZFN1YkZvcm0gfHwgc3ViVGFzay5Jc1N1YkZvcm07XHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YlRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FWElUKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uKVxyXG4gICAgICAgICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgodGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBleGl0IGZvciB0aGUgZmlyc3QgdGFzayBtdXN0IGVuZCBhbGwgdGFza3NcclxuICAgICAgICAgIGlmICh0aGlzID09PSBtZ2RUYWIuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSkge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSBtZ2RUYWIuZ2V0U2l6ZSgpIC0gMTsgaSA+IDAgJiYgc3VjY2VlZGVkOyBpLS0pIHtcclxuICAgICAgICAgICAgICBpZiAobWdkVGFiLmdldE1HRGF0YShpKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sobWdkVGFiLmdldE1HRGF0YShpKS5nZXRGaXJzdFRhc2soKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3VjY2VlZGVkKSB7XHJcbiAgICAgICAgICAvLyBpZiBjbG9zaW5nIHRoZSBzdWIgdGFza3Mgd2FzIHN1Y2Nlc3NmdWwgdGhlbiBleGVjdXRlIHJlY29yZCBzdWZmaXhcclxuICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCAmJiAhZHVlVG9WZXJpZnlFcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgZm9yY2VTdWZmaXg6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gZm9yIG5vbiBpbnRlcmFjdGl2ZSwgdHVybiBvZmYgdGhlIGZvcmNlIHJlY29yZCBzdWZmaXgsXHJcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBhbiB1bndhbnRlZCB1cGRhdGUgbWlnaHQgYmUgc2VudCB3aGVuIHRhc2sgZW5kcy5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLklzSW50ZXJhY3RpdmUgJiYgZm9yY2VTdWZmaXggPT09IHRydWUgJiYgdGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9GT1JDRV9TVUZGSVgsIFwiMFwiKTtcclxuXHJcbiAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBmb3JjZSBzdWZmaXgsIGZvciBqdXN0IGluIGNhc2UuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Jc0ludGVyYWN0aXZlICYmIGZvcmNlU3VmZml4ID09PSB0cnVlICYmIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSlcclxuICAgICAgICAgICAgICB0aGlzLnNldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfRk9SQ0VfU1VGRklYLCBcIjFcIik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc3VjY2VlZGVkID0gKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpIHx8IGR1ZVRvVmVyaWZ5RXJyb3IpO1xyXG5cclxuICAgICAgICAgIGlmIChzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcylcclxuICAgICAgICAgICAgdGhpcy5IYW5kbGVUcmFuc2FjdGlvbkluZm8oKTtcclxuXHJcbiAgICAgICAgICBsZXQgcHJlVHNrU3VmZml4OiBib29sZWFuID0gc3VjY2VlZGVkO1xyXG5cclxuICAgICAgICAgIC8vIG5vdyBwZXJmb3JtIHRhc2sgc3VmZml4XHJcbiAgICAgICAgICBpZiAoc3VjY2VlZGVkICYmICFvbmx5RGVzY3MgJiYgcmV2ZXJzaWJsZUV4aXQgJiYgIWR1ZVRvVmVyaWZ5RXJyb3IgJiZcclxuICAgICAgICAgICAgKCF0aGlzLklzU3ViRm9ybSB8fCBzdWJmb3JtRGVzdGluYXRpb24pICYmXHJcbiAgICAgICAgICAgIHRoaXMuVGFza1ByZWZpeEV4ZWN1dGVkICYmICF0aGlzLlRhc2tTdWZmaXhFeGVjdXRlZClcclxuICAgICAgICAgICAgc3VjY2VlZGVkID0gYXdhaXQgdGhpcy5oYW5kbGVUYXNrU3VmZml4KHRydWUpO1xyXG5cclxuICAgICAgICAgIC8vIERvbid0IGZvcmdldCB0byBleGl0IGZyb20gYW55IHN1YlRhc2tzIG9wZW5lZCBkdXJpbmcgdGhlIGxhc3QgcmVjLXN1ZmZpeCBvciB0YXNrIHN1ZmZpeFxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0ICYmIHRoaXMuaGFzU3ViVGFza3MoKSlcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuU3ViVGFza3MuZ2V0U2l6ZSgpOyBpKyspIHtcclxuXHJcbiAgICAgICAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKCFzdWJUYXNrLklzU3ViRm9ybSlcclxuICAgICAgICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZU5vblJldmVyc2libGVFdmVudChzdWJUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRVhJVCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBkb250IGNvbnRpbnVlIHdpdGggdGFzayBleGl0IGlmIGEgZGF0YSBlcnJvciBvY2N1cmVkIGR1cmluZyB0YXNrIHN1ZmZpeCAoZS5nLiByb2xsYmFjaygpKVxyXG4gICAgICAgICAgaWYgKHJldmVyc2libGVFeGl0KVxyXG4gICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcik7XHJcblxyXG4gICAgICAgICAgLy8gdGFzayBzdWZmaXggb25seSBzdG9wcyBleGVjdXRpb24gZm9yIGN1cnJlbnQgdGFzaywgd2hpY2ggaXMgYmVpbmcgY2xvc2VkXHJcbiAgICAgICAgICBpZiAocHJlVHNrU3VmZml4KVxyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNldEFmdGVyUmV0cnkoQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSk7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQWJvcnRpbmcoKSAmJiBzdWNjZWVkZWQgJiYgIW9ubHlEZXNjcykge1xyXG4gICAgICAgICAgICAvLyBUcnkgY2xvc2luZyBhbnkgdGFzayBsZXZlbCBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgICAgICAgICAgIGlmIChyZXZlcnNpYmxlRXhpdCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25GYWlsZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuVGFza1RyYW5zYWN0aW9uTWFuYWdlci5jaGVja0FuZENvbW1pdChmYWxzZSwgQ29uc3RJbnRlcmZhY2UuVFJBTlNfVEFTS19QUkVGSVgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBzdWNjZWVkZWQgPSAoIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkgfHwgZHVlVG9WZXJpZnlFcnJvcikgJiYgIXRoaXMuaXNBYm9ydGluZygpICYmICF0aGlzLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1RBU0tfUFJFRklYKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX05PTkUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN1Y2NlZWRlZCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkdldEluc3RhbmNlKCkuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBsZXQgYmFzZU1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGE7XHJcbiAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGNsb3NpbmcgdGhlIHRvcG1vc3QgdGFzayAtIGRvbnQgbG9vc2UgYW55IGV2ZW50cywgbGVmdCBpbiB0aGUgcXVldWVcclxuICAgICAgICAgICAgICBpZiAocmV2ZXJzaWJsZUV4aXQgJiYgYmFzZU1nZC5nZXRGaXJzdFRhc2soKS5nZXRUYXNrVGFnKCkgPT09IHRoaXMuZ2V0VGFza1RhZygpKSB7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudHMoYmFzZU1nZCwgMCk7XHJcbiAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2soZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZhciBzdCA9IG5ldyBTZXNzaW9uU3RhdGlzdGljc0Zvcm0oKTtcclxuICAgICAgICAgICAgICAgIC8vIHN0LldyaXRlVG9GbG93TW9uaXRvcigoRmxvd01vbml0b3JRdWV1ZSlfZmxvd01vbml0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAvL2Fib3J0aW5nIHRhc2sgY2xvc3VyZVxyXG4gICAgICAgICAgICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVtb3RlQ21kRXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBhd2FpdCBUYXNrU2VydmljZUJhc2UuRXhpdCh0aGlzLCByZXZlcnNpYmxlRXhpdCwgc3ViZm9ybURlc3RpbmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gV2hlbiBjbG9zaW5nIGEgdGFzayB3aG9zZSBwYXJlbnQgaXMgYSBtYWluIHByb2dyYW0sIGNoZWNrIHRoZSBtYWluIHByb2dyYW0ncyBlbmRcclxuICAgICAgICAgICAgICAvLyBjb25kaXRpb25cclxuICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50VGFzayAhPSBudWxsICYmIHRoaXMuX3BhcmVudFRhc2suaXNNYWluUHJvZygpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1haW5QcmdUYXNrOiBUYXNrID0gbWdkLmdldE1haW5Qcm9nKDApO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvb3RUYXNrOiBUYXNrID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5kTWFpblByZzogYm9vbGVhbiA9IGF3YWl0IG1haW5QcmdUYXNrLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9FTkRfQ09ORElUSU9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBlbmQgdGhlIHJvb3QgdGFzayBpZiB3ZSBhcmUgYWxyZWFkeSBkb2luZyBpdC5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzICE9PSByb290VGFzayAmJiBlbmRNYWluUHJnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQocm9vdFRhc2spO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0xPU0UpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRDdHJsKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBydEV2dC5zZXRBcmdMaXN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5hZGRUb1RhaWwocnRFdnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBNZ0Zvcm0uQ3JlYXRlZEZvcm1zLnJlbW92ZSg8TWdGb3JtPnRoaXMuRm9ybSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIGlmICghdGhpcy5Jc1N1YkZvcm0gfHwgc3ViZm9ybURlc3RpbmF0aW9uKVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQsIHJldmVyc2libGVFeGl0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFFjciAjOTE0NjQ1IDogcmV0dXJuIGZhbHNlIGluIGEgcmVjdXJzaXZlIGNhbGwuXHJcbiAgICAvLyBvdGhlcndpc2UgY29tbW9uSGFuZGxlckFmdGVyKGV2ZW50TWFuYWdlcikgd2lsbCBub3QgYmUgZXhlY3V0ZWQgaWYgdGhlIGNhbGwgaXMgcmVjdXJzaXZlbHkgbWFkZSBmcm9tIGhhbmRsZUV2ZW50LlxyXG4gICAgLy8gZm9yIGV4YW1wbGUgOiB0YXNrIGNvbmQgZnVsZmlsbGVkLiBoYW5kbGVJbnRlcm5hbEV2ZW50KHRoaXMsIE1HX0FDVF9SRUNfU1VGRklYKSBpcyBjYWxsZWQuXHJcbiAgICAvLyB3aGlsZSBpbiByZWMgc3VmIGhhbmRsZXIsIGVuZFRhc2sgaXMgY2FsbGVkIGFnYWluLi5pZiB3ZSByZXR1cm4gdHJ1ZSB0aGVuIHRoZSBjb21tb25IYW5kbGVyQWZ0ZXIgaXMgbm90IGV4ZWN1dGVkLlxyXG4gICAgLy8gaWYgdGhlIHJlYyBzdWZmaXggaGFuZGxlciBkaWQgbm90IGV4aXN0LCB0aGVyZSB3aWxsIGJlIG5vIGNhbGwgdG8gZW5kVGFzayBhbmQgdGhlIGNvbW1vbkhhbmRsZXJBZnRlciB3aWxsIGJlIGV4ZWN1dGVkLlxyXG4gICAgLy8gVGhlIG5hbWUgJ3N1Y2NlZWRlZCcgaXMgYSBiaXQgbWlzbGVhZGluZy4uaXRzIG1vcmUgbGlrZSAnZXhlY3V0ZWQnLi5idXQgd2UgZGVjaWRlZCB0byBrZWVwIGl0LlxyXG4gICAgZWxzZSBpZiAodGhpcy5JbkVuZFRhc2spXHJcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHJlc3RvcmUgdGhlIGZsYWcuXHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRQcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2sodGhpcy5faW5Qcm9jZXNzaW5nVG9wTW9zdEVuZFRhc2tTYXZlZCk7XHJcblxyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBTZXRTZXJ2ZXJTaWRlVGFza1N1ZmZpeCAodGFzayA6IFRhc2spIDogdm9pZFxyXG4gIHtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpO1xyXG5cclxuICAgIGxldCAgaGFuZGxlcjogRXZlbnRIYW5kbGVyID0gbnVsbDtcclxuICAgIC8vIGZpbmQgaWYgTUdfQUNUX1RBU0tfU1VGRklYIGhhbmRsZXIgZXhpc3RzP1xyXG4gICAgdmFyIGV2dEhhblBvcyA9IG5ldyBFdmVudEhhbmRsZXJQb3NpdGlvbigpO1xyXG4gICAgZXZ0SGFuUG9zLmluaXQocnRFdnQpO1xyXG4gICAgaGFuZGxlciA9IGV2dEhhblBvcy5nZXROZXh0KCk7XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgIGkgPSAwOyBpIDwgaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRTaXplKCk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBvcGVyID0gaGFuZGxlci5nZXRPcGVyYXRpb25UYWIoKS5nZXRPcGVyYXRpb24oaSk7XHJcbiAgICAgICAgb3Blci5zZXRFeGVjT25TZXJ2ZXIodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXNrLmhhc1N1YlRhc2tzKCkpICAge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2suR2V0U3ViVGFza3MoKS5sZW5ndGg7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrOiBUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHRoaXMuU2V0U2VydmVyU2lkZVRhc2tTdWZmaXgoc3ViVGFzayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcygpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIENoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyAodGFzazogVGFzaywgZXZlbnRDb2RlOiBudW1iZXIpOiBQcm9taXNlIDxib29sZWFuPiB7XHJcbiAgICBsZXQgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBmYWxzZTtcclxuICAgIHZhciBydEV2dCA9IG5ldyBSdW5UaW1lRXZlbnQodGFzayk7XHJcbiAgICBydEV2dC5zZXRJbnRlcm5hbChldmVudENvZGUpO1xyXG5cclxuICAgIGxldCBoYW5kbGVyOiBFdmVudEhhbmRsZXIgPSBudWxsO1xyXG4gICAgLy8gZmluZCBpZiBNR19BQ1RfVEFTS19TVUZGSVggLyBNR19BQ1RfUkVDX1NVRkZJWCBoYW5kbGVyIGV4aXN0cz9cclxuICAgIHZhciBldnRIYW5Qb3MgPSBuZXcgRXZlbnRIYW5kbGVyUG9zaXRpb24oKTtcclxuICAgIGV2dEhhblBvcy5pbml0KHJ0RXZ0KTtcclxuICAgIGhhbmRsZXIgPSBldnRIYW5Qb3MuZ2V0TmV4dCgpO1xyXG5cclxuICAgIGlmIChldmVudENvZGUgPT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpIHtcclxuICAgICAgbGV0IGN1cnJSZWNvcmQgPSAoPERhdGFWaWV3PnRhc2suRGF0YVZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgICAgaWYgKCg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykubW9kaWZpZWRSZWNvcmRzTnVtYmVyKCkgPiAwIHx8IChjdXJyUmVjb3JkICE9IG51bGwgJiYgY3VyclJlY29yZC5Nb2RpZmllZCkpXHJcbiAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCFjbGllbnRPcGVyYXRpb25FeGlzdCkge1xyXG4gICAgICAgIGxldCBmb3JjZVN1ZmZpeDogYm9vbGVhbiA9IGF3YWl0IHRhc2suY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0ZPUkNFX1NVRkZJWCwgZmFsc2UpO1xyXG4gICAgICAgIC8vIGZvciBub24gaW50ZXJhY3RpdmUsIGNyZWF0ZSBtb2RlIHRhc2suICBmb3JjZSByZWNvcmQgc3VmZml4IGlzIGNhbmNlbGxlZFxyXG5cclxuICAgICAgICBpZiAoZm9yY2VTdWZmaXggPT09IHRydWUpXHJcbiAgICAgICAgaWYgKHRhc2suSXNJbnRlcmFjdGl2ZSB8fCAgdGFzay5nZXRNb2RlKCkgIT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKVxyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYW5kbGVyICE9IG51bGwgJiYgIWNsaWVudE9wZXJhdGlvbkV4aXN0KSB7XHJcbiAgICAgICAgbGV0IGNudCA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0U2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgb3BlciA9IGhhbmRsZXIuZ2V0T3BlcmF0aW9uVGFiKCkuZ2V0T3BlcmF0aW9uKGkpO1xyXG4gICAgICAgICAgaWYgKG9wZXIuZ2V0RXhlY09uQ2xpZW50KCkpIHtcclxuICAgICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob3Blci5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9SQUlTRV9FVkVOVCl7XHJcbiAgICAgICAgICAgICAgaWYgKG9wZXIuR2V0UnVudGltZUV2ZW50KCkuZ2V0VHlwZSgpID09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiZcclxuICAgICAgICAgICAgICBvcGVyLkdldFJ1bnRpbWVFdmVudCgpLmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRfUkVGUkVTSF9WSUVXKSB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRPcGVyYXRpb25FeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgdGFzay5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICghY2xpZW50T3BlcmF0aW9uRXhpc3QgJiYgaSA8IHRhc2suZ2V0U3ViVGFza3MoKS5nZXRTaXplKCkpOyBpKyspIHtcclxuICAgICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgICAgY2xpZW50T3BlcmF0aW9uRXhpc3QgPSBhd2FpdCB0aGlzLkNoZWNrSWZDbGllbnRPcGVyYXRpb25FeGlzdHNJblN1YmZvcm1UYXNrcyhzdWJUYXNrLCBldmVudENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGNsaWVudE9wZXJhdGlvbkV4aXN0O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gQ2hlY2tJZlBlbmRpbmdUcmFuc2FjdGlvbnMoKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidGFza1wiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBDaGVja0lmUGVuZGluZ1RyYW5zYWN0aW9ucyh0YXNrIDogVGFzayk6IGJvb2xlYW5cclxuICB7XHJcbiAgICBsZXQgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgbGV0IGN1cnJSZWNvcmQgPSAgKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAoKDxEYXRhVmlldz50YXNrLkRhdGFWaWV3KS5tb2RpZmllZFJlY29yZHNOdW1iZXIoKSA+IDAgfHwgKGN1cnJSZWNvcmQgIT0gbnVsbCAmJiBjdXJyUmVjb3JkLk1vZGlmaWVkKSlcclxuICAgICAgcGVuZGluZ1RyYW5zYWN0aW9ucyA9IHRydWU7XHJcblxyXG4gICAgaWYgKCFwZW5kaW5nVHJhbnNhY3Rpb25zICYmIHRhc2suaGFzU3ViVGFza3MoKSlcclxuICAgIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7ICghcGVuZGluZ1RyYW5zYWN0aW9ucyAmJiBpIDwgdGFzay5nZXRTdWJUYXNrcygpLmdldFNpemUoKSk7IGkrKylcclxuICAgICAge1xyXG4gICAgICAgIGxldCBzdWJUYXNrID0gPFRhc2s+dGFzay5TdWJUYXNrcy5nZXRUYXNrKGkpO1xyXG4gICAgICAgIHBlbmRpbmdUcmFuc2FjdGlvbnMgPSB0aGlzLkNoZWNrSWZQZW5kaW5nVHJhbnNhY3Rpb25zKHN1YlRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBlbmRpbmdUcmFuc2FjdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvbmx5RGVzY3NcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1Y2NlZWRlZFwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBIYW5kbGVUcmFuc2FjdGlvbkluZm8oKTogdm9pZCB7XHJcbiAgICAvLyB3aGlsZSByZW1vdGUgdGFzayB3aXRob3V0IGxvY2FsIGRhdGEsIGhhcyBzdWJmb3JtIHRoYXQgaGFzIGxvY2FsIGRhdGEgOiBSZW1vdGUgdHJhbnNhY3Rpb24gaXMgc2V0IG9uIHRoZSBwYXJlbnQgdGFzayBhbmQgbG9jYWwgVHJhbnNhY3Rpb24gaXMgc2V0IG9uIHN1YmZvcm0uXHJcbiAgICAvLyBUaGUgbWVtYmVyIHRhc2suVHJhbnNhY3Rpb24gaXMgZ2V0IHRoZSBEYXRhdmlld01hbmFnZXIuQ3VycmVudERhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvblxyXG4gICAgLy8gZm9yIHN1YmZvcm0gOiAgdGhlIEN1cnJlbnREYXRhdmlld01hbmFnZXIgaXMgdGhlIGxvY2FsRGF0YXZpZXcgc28gdGhlIHRyYW5zYWN0aW9uIGlzIHRoZSBsb2NhbCB0cmFuc2FjdGlvbiB0aGF0IHRoZSBzdWJmb3JtIGlzIHRoZSBvd25lciBidXQgbm90IHRoZSBvd25lciBvZiB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICAvLyBUaGUgbWV0aG9kIHNldFRyYW5zQ2xlYXJlZCgpIG5lZWQgdG8gYmUgY2FsbGVkIG9ubHkgZm9yIHJlbW90ZSB0cmFuc2FjdGlvbiB0aGF0IGlzIHRoZSBvd25lciB0YXNrIC4gKF90cmFuc0NsZWFyZWQgaXMgc2VuZCB0byB0aGUgc2VydmVyIClcclxuXHJcbiAgICAvLyBjaGVjayB0aGUgcmVtb3RlIHRyYW5zYWN0aW9uXHJcbiAgICBsZXQgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0gdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uICE9PSBudWxsICYmIHRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykgJiYgdHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gJ1AnKSB7XHJcbiAgICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0VHJhbnNDbGVhcmVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENyZWF0ZXMgZXhpdCBjb21tYW5kLCBhZGRzIGl0IHRvIGNvbW1hbmRzIGZvciBleGVjdXRpb24gYW5kIGV4ZWN1dGUgaXQgaWYgaXQncyBuZWVkZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJldmVyc2libGVFeGl0XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtRGVzdGluYXRpb25cIj48L3BhcmFtPlxyXG4gIGFzeW5jIEV4aXQocmV2ZXJzaWJsZUV4aXQ6IGJvb2xlYW4sIHN1YmZvcm1EZXN0aW5hdGlvbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgcmVjb3JkIHN1ZmZpeCB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhpcyB0YXNrIGlzIG5vdCBhIHN1YiBmb3JtXHJcbiAgICAvLyB0aGVuIGVuZCB0aGUgdGFzayBhdCB0aGUgc2VydmVyIHNpZGVcclxuXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IHJldmVyc2libGVFeGl0ID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDbGllbnRDb21tYW5kPkNvbW1hbmRGYWN0b3J5LkNyZWF0ZUJyb3dzZXJFc2NFdmVudENvbW1hbmQodGhpcy5nZXRUYXNrVGFnKCksIHN1YmZvcm1EZXN0aW5hdGlvbikgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNsaWVudENvbW1hbmQ+Q29tbWFuZEZhY3RvcnkuQ3JlYXRlTm9uUmV2ZXJzaWJsZUV4aXRDb21tYW5kKHRoaXMuZ2V0VGFza1RhZygpLCBzdWJmb3JtRGVzdGluYXRpb24pO1xyXG5cclxuICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICBpZiAoIXN1YmZvcm1EZXN0aW5hdGlvbikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIEJyb3dlckVzY0NvbW1hbmQgaW1tZWRpYXRlbHkgb25seSBpZlxyXG4gICAgICAgIC8vIDEuIElmIHdlIGFyZSB0cnlpbmcgdG8gY2xvc2UgdGhlIGJyb3dzZXIgYW5kIHRoZSB0b3Btb3N0IHRhc2sgaXMgY2xvc2luZ1xyXG4gICAgICAgIC8vIDIuIElmIHVzZXIgZXhwbGljaXRseSBjbG9zZXMgdGhlIGN1cnJlbnQgdGFzayAobGlrZSBjbG9zaW5nIG92ZXJsYXkpXHJcbiAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBFeGl0KCkgY29tbWFuZHMsIGp1c3QgYWRkIHRoZSBCcm93c2VyRXNjQ29tbWFuZCB0byBDbWRzVG9TZXJ2ZXIuXHJcbiAgICAgICAgaWYodGhpcy5nZXRUYXNrVGFnKCkgPT0gTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLmdldFRhc2tUYWcoKSB8fFxyXG4gICAgICAgICAgICEoTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkluRW5kVGFzayAmJiBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkuQ2xvc2luZ0Zvcm1VSSkpXHJcbiAgICAgICAgICBhd2FpdCBUYXNrLkNvbW1hbmRzUHJvY2Vzc29yLkV4ZWN1dGUoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAvLyBJZiB0aGUgY2xvc2luZyBvZiBNYWluIFByb2dyYW0gZGlkbid0IHN1Y2NlZWQgb24gc2VydmVyLCBjbG9zZSBpdCBoZXJlIC0tLSBvZmNvdXJzZSBpdFxyXG4gICAgICAgIC8vIGluY2x1ZGVzIHRoZSBleGVjdXRpb24gb2YgVFMgYXMgd2VsbC5cclxuICAgICAgICBpZiAodGhpcy5pc01haW5Qcm9nKCkpIHtcclxuICAgICAgICAgIHRoaXMuX21nRGF0YS5DbWRzVG9TZXJ2ZXIuQWRkKGNtZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBSZWN1cnNpdmUgZnVuY3Rpb24gZm9yIGZpbmFsbHkgb3BlcmF0aW9uIG9mIGVuZFRhc2sgZnVuY3Rpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3VjY2VlZGVkXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldmVyc2libGVFeGl0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBoYW5kbGVGaW5hbGx5RW5kVGFzayhzdWNjZWVkZWQ6IGJvb2xlYW4sIHJldmVyc2libGVFeGl0OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAodGhpcy5oYXNTdWJUYXNrcygpKSB7XHJcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLlN1YlRhc2tzLmdldFNpemUoKTsgaSsrKSB7XHJcbiAgICAgICAgc3ViVGFzayA9IDxUYXNrPnRoaXMuU3ViVGFza3MuZ2V0VGFzayhpKTtcclxuICAgICAgICBzdWJUYXNrLmhhbmRsZUZpbmFsbHlFbmRUYXNrKHN1Y2NlZWRlZCwgcmV2ZXJzaWJsZUV4aXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5JbkVuZFRhc2sgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICB0aGlzLl9pc1N0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoIXN1Y2NlZWRlZCAmJiByZXZlcnNpYmxlRXhpdCAmJiB0aGlzLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICB0aGlzLnNldFRyeWluZ1RvU3RvcChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUmVjdXJzaXZlIGZ1bmN0aW9uIGZvciBUYXNrIFByZWZpeCBleGVjdXRpb24gZm9yIGFsbCBzdWJmb3Jtc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBoYW5kbGVUYXNrU3VmZml4KHdpdGhTdWJUYXNrczogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHN1Y2NlZWRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBsZXQgc3ViVGFzazogVGFzaztcclxuXHJcbiAgICBpZiAod2l0aFN1YlRhc2tzKSB7XHJcbiAgICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCkgJiYgc3VjY2VlZGVkOyBpKyspIHtcclxuICAgICAgICAgIHN1YlRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgICBzdWNjZWVkZWQgPSBhd2FpdCBzdWJUYXNrLmhhbmRsZVRhc2tTdWZmaXgod2l0aFN1YlRhc2tzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3VjY2VlZGVkKVxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYKTtcclxuICAgIHN1Y2NlZWRlZCA9ICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpO1xyXG4gICAgdGhpcy5UYXNrU3VmZml4RXhlY3V0ZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHN1Y2NlZWRlZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGlmIHRoZSB0YXNrIGludG8gY3JlYXRlIGxpbmUgcHJvY2Vzc2luZyBvciBub3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEluQ3JlYXRlTGluZShpbkNyZWF0ZUxpbmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2luQ3JlYXRlTGluZSA9IGluQ3JlYXRlTGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgaWYgdGhlIHRhc2sgaXMgaW50byBDcmVhdGUgbGluZSBwcm9jZXNzaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJbkNyZWF0ZUxpbmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5DcmVhdGVMaW5lO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBoYW5kbGUgYW4gaW50ZXJuYWwgZXZlbnQgb24gdGhpcyB0YXNrcyBzbGF2ZSB0YXNrcy4gU2xhdmUgdGFza3MgYXJlOiAoMSkgSWYgdGhpcyB0YXNrIGlzIGEgZHluYW1pY0RlZi50cmFuc2FjdGlvblxyXG4gIC8vLyAgIG93bmVyIC0gYWxsIHRhc2tzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIHRyYW5zYWN0aW9ucyBhcmUgaXRzIHNsYXZlcy4gKDIpIElmIHRoaXMgdGFzayBpcyBub3QgYW4gb3duZXIgLVxyXG4gIC8vLyAgIGFsbCBpdHMgc3ViZm9ybXMgYXJlIGNvbnNpZGVyZWQgc2xhdmVzLiBpZiBvbmUgb2YgdGhlIHN1YiB0YXNrcyBmYWlsZWQgaGFuZGxpbmcgdGhlIGV2ZW50IHRoZW4gYVxyXG4gIC8vLyAgIHJlZmVyZW5jZSB0byB0aGF0IHRhc2sgaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImludGVybmFsRXZ0Q29kZVwiPnRoZSBjb2RlIG9mIHRoZSBpbnRlcm5hbCBldmVudCB0byBoYW5kbGU8L3BhcmFtPlxyXG4gIGFzeW5jIGhhbmRsZUV2ZW50T25TbGF2ZVRhc2tzKGludGVybmFsRXZ0Q29kZTogbnVtYmVyKTogUHJvbWlzZTxUYXNrPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGZhaWx1cmVUYXNrOiBUYXNrID0gbnVsbDtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyaWdnZXJlZFRhc2tzOiBMaXN0PFRhc2tCYXNlPiA9IG1nZFRhYi5nZXRUcmlnZ2VyZWRUYXNrcyh0aGlzKTtcclxuICAgIGxldCBvcnBoYW5zOiBMaXN0PFRhc2s+ID0gbnVsbDtcclxuICAgIGxldCBzYW1lVHJhbnM6IGJvb2xlYW47XHJcbiAgICBsZXQgaGFzU2xhdmVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgaXNPd25lcjogYm9vbGVhbiA9IHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcyk7XHJcblxyXG4gICAgLy8gZXZlbnQgb24gdHJhbnMtb3duZXIgc2hvdWxkIGJlIHByb3BvZ2F0ZWQgdG8gYWxsIG90aGVyIHRhc2tzIGluIHRoZSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uLlxyXG4gICAgaWYgKGlzT3duZXIpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0RXZlbnRTY29wZVRyYW5zKCk7XHJcbiAgICAgIG9ycGhhbnMgPSBuZXcgTGlzdDxUYXNrPigpO1xyXG5cclxuICAgICAgLy8gSW4gY2FzZSBhIGNoYW5nZSBvZiB0cmFucy1vd25lcnNoaXAgcHJldmlvdXNseSB0b29rIHBsYWNlLCB0aGVyZSBtaWdodCBiZSB0YXNrc1xyXG4gICAgICAvLyB3aGljaCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgZHluYW1pY0RlZi50cmFuc2FjdGlvbiBidXQgdGhlaXIgcGFyZW50IGlzIGdvbmUuIFRoZXNlIGFyZSBvcnBoYW4gdGFza3NcclxuICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcHJvcG9nYXRlIHRoZSBldmVudCB0byB0aGVtIHRvby5cclxuICAgICAgbWdkVGFiLnN0YXJ0VGFza3NJdGVyYXRpb24oKTtcclxuICAgICAgd2hpbGUgKCh0YXNrID0gPFRhc2s+bWdkVGFiLmdldE5leHRUYXNrKCkpICE9IG51bGwpIHtcclxuICAgICAgICBzYW1lVHJhbnMgPSB0YXNrLlRyYW5zYWN0aW9uICE9IG51bGwgJiYgdGhpcy5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRhc2suVHJhbnNhY3Rpb24uZ2V0VHJhbnNJZCgpO1xyXG4gICAgICAgIGlmICh0YXNrICE9PSB0aGlzICYmIHNhbWVUcmFucyAmJiB0YXNrLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgIT0gbnVsbCAmJiBtZ2RUYWIuR2V0VGFza0J5SUQodGFzay5QcmV2aW91c2x5QWN0aXZlVGFza0lkKSA9PSBudWxsKVxyXG4gICAgICAgICAgb3JwaGFucy5wdXNoKHRhc2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNjb3BlVHJhbnM6IGJvb2xlYW4gPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5pc0V2ZW50U2NvcGVUcmFucygpO1xyXG5cclxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgZXZlbnQgYWNjb3JkaW5nIHRvIHRoZSBzY29wZSwgb24gYWxsIHRhc2tzIHRyaWdnZXJlZCBieSBtZVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWdnZXJlZFRhc2tzLmxlbmd0aCAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTsgaSsrKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50cmlnZ2VyZWRUYXNrcy5nZXRfSXRlbShpKTtcclxuICAgICAgc2FtZVRyYW5zID0gdGhpcy5UcmFuc2FjdGlvbiAhPSBudWxsICYmIHRhc2suVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmdldFRyYW5zSWQoKSA9PT0gdGFzay5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCk7XHJcblxyXG4gICAgICBpZiAoIXRhc2suSXNTdWJGb3JtICYmIChzY29wZVRyYW5zICYmIHNhbWVUcmFucykgJiYgdGFzay5pc1N0YXJ0ZWQoKSkge1xyXG4gICAgICAgIC8vIFFDUiA0Mzg1MzAgR3VhcmFudGVlIHRoYXQgYmVmb3JlIHByZWZpeCBjb21wdXRlIHdpbGwgYmUgZXhlY3V0ZWRcclxuICAgICAgICBpZiAodGFzay5nZXRGb3JtKCkuRm9ybVJlZnJlc2hlZCAmJiBpbnRlcm5hbEV2dENvZGUgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYICYmIHRhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSylcclxuICAgICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0YXNrLCBpbnRlcm5hbEV2dENvZGUpO1xyXG4gICAgICAgIGhhc1NsYXZlcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9wYWdhdGUgdGhlIGV2ZW50IG9uIG9ycGhhbnMgdG9vLlxyXG4gICAgZm9yICg7IGlzT3duZXIgJiYgaSA8IG9ycGhhbnMubGVuZ3RoICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpOyBpKyspIHtcclxuICAgICAgdGFzayA9IG9ycGhhbnMuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBRQ1IgNDM4NTMwIEd1YXJhbnRlZSB0aGF0IGJlZm9yZSBwcmVmaXggY29tcHV0ZSB3aWxsIGJlIGV4ZWN1dGVkXHJcbiAgICAgIGlmICh0YXNrLmdldEZvcm0oKS5Gb3JtUmVmcmVzaGVkICYmIGludGVybmFsRXZ0Q29kZSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVggJiYgdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgIGF3YWl0ICg8RGF0YVZpZXc+dGFzay5EYXRhVmlldykuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGFzaywgaW50ZXJuYWxFdnRDb2RlKTtcclxuICAgICAgaGFzU2xhdmVzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzU2xhdmVzICYmIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIGZhaWx1cmVUYXNrID0gdGFzaztcclxuXHJcbiAgICBpZiAoaXNPd25lcilcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuY2xlYXJFdmVudFNjb3BlKCk7XHJcblxyXG4gICAgcmV0dXJuIGZhaWx1cmVUYXNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGVuYWJsZS1kaXNhYmxlIGFjdGlvbnMgZm9yIGEgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVSZWNvcmRBY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG5cclxuICAgIGF3YWl0IHRoaXMuc2V0Q3JlYXRlRGVsZXRlQWN0c0VuYWJsZVN0YXRlKCk7XHJcblxyXG4gICAgaWYgKGRhdGF2aWV3LkluY2x1ZGVzRmlyc3QoKSB8fCBkYXRhdmlldy5Jc09uZVdheUtleSkge1xyXG4gICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgZGF0YXZpZXcuZ2V0Q3VyclJlY0lkeCgpID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIGZhbHNlKTtcclxuICAgICAgICBpZiAoZGF0YXZpZXcuSXNPbmVXYXlLZXkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMLCB0cnVlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVlBBR0UsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWTElORSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHwgKGRhdGF2aWV3LmdldEN1cnJSZWNJZHgoKSA9PT0gMCkgfHwgKGRhdGF2aWV3LmdldFRvcFJlY0lkeCgpID09PSAwKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCBmYWxzZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfUFJWUEFHRSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX0JFR1RCTCwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9QUlZQQUdFLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX1BSVkxJTkUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRhdmlldy5JbmNsdWRlc0xhc3QoKSkge1xyXG4gICAgICBpZiAoKCh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9RVUVSWSkgfHwgZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkgfHxcclxuICAgICAgICAgICgodGhpcy5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKSAmJlxyXG4gICAgICAgICAgICAoIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93Q3JlYXRlSW5Nb2RpZnlNb2RlKHRoaXMuZ2V0Q29tcElkeCgpKSB8fFxyXG4gICAgICAgICAgICAgICFhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpKSkpICYmIChkYXRhdmlldy5nZXRDdXJyUmVjSWR4KCkgKyAxKSA9PT0gZGF0YXZpZXcuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuRm9ybS5pc1NjcmVlbk1vZGUoKSlcclxuICAgICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVExJTkUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9FTkRUQkwsIHRydWUpO1xyXG4gICAgICAgIGlmICh0aGlzLkZvcm0uaXNTY3JlZW5Nb2RlKCkpXHJcbiAgICAgICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfTlhUUEFHRSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5Gb3JtLmlzU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgICAgaWYgKGRhdGF2aWV3LmlzRW1wdHlEYXRhdmlldygpIHx8ICgoZGF0YXZpZXcuZ2V0U2l6ZSgpIC0gZGF0YXZpZXcuZ2V0VG9wUmVjSWR4KCkpIDw9IHRoaXMuRm9ybS5nZXRSb3dzSW5QYWdlKCkpKVxyXG4gICAgICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIGZhbHNlKTtcclxuICAgICAgICBlbHNlIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRQQUdFLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9OWFRMSU5FLCB0cnVlKTtcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEJMX05YVFBBR0UsIHRydWUpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfRU5EVEJMLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YXZpZXcuaXNFbXB0eURhdGF2aWV3KCkpXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCwgZmFsc2UpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQU5DRUwsIHRydWUpO1xyXG5cclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VOVEVSX1JPV19FRElUSU5HLCB0cnVlKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9OT19QUk9HX0VYRV9SSUdIVFMsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGFzayBpcyBzdGFydGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1N0YXJ0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNTdGFydGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHN1YiB0YXNrcyB0YWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0U3ViVGFza3MoKTogVGFza3NUYWJsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5TdWJUYXNrcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhpcyB0YXNrcyByZWZyZXNoZXMgb24gYSBjaGFuZ2Ugb2Ygb25lIG9mIGl0cyBwYXJlbnQgZmllbGRzIHdpdGggdGhlIGdpdmVuIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZsZElkXCI+dGhlIGlkIG9mIHRoZSBwYXJlbnQgZmllbGQ8L3BhcmFtPlxyXG4gIHJlZnJlc2hlc09uKGZsZElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyAhcmVzdWx0ICYmIHRoaXMuUmVmcmVzaE9uVmFycyAhPT0gbnVsbCAmJiBpIDwgdGhpcy5SZWZyZXNoT25WYXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHJlc3VsdCA9ICh0aGlzLlJlZnJlc2hPblZhcnNbaV0gPT09IGZsZElkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNsZWFyIHRoaXMgdGFzayBmcm9tIHRoZSBhY3RpdmUgdHJhbnNhY3Rpb25zIGFjY291bnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgQWJvcnRUcmFuc2FjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXggdG8gdmFsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRydWUgaWYgd2UgYWxyZWFkeSBwZXJmb3JtZWQgcmVjb3JkIHN1ZmZpeDwvcGFyYW0+XHJcbiAgc2V0UHJldmVudFJlY29yZFN1ZmZpeCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXZlbnRSZWNvcmRTdWZmaXggPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHZhbHVlIG9mIHByZXZlbnRSZWNvcmRTdWZmaXhcclxuICAvLy8gPC9zdW1tYXJ5XHJcbiAgZ2V0UHJldmVudFJlY29yZFN1ZmZpeCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2ZW50UmVjb3JkU3VmZml4O1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldmVudENvbnRyb2xDaGFuZ2UodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2ZW50Q29udHJvbENoYW5nZSA9IHZhbDtcclxuICB9XHJcblxyXG4gIGdldFByZXZlbnRDb250cm9sQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZlbnRDb250cm9sQ2hhbmdlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNpZ25hbCB0aGUgc2VydmVyIGNsb3NlZCB0aGlzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0S25vd25Ub1NlcnZlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2tub3duVG9TZXJ2ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBkdlBvcyB2YWx1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCItXCI+ZXZhbHVhdGVzIHRoZSBkZXJjcmlwdG9yIGFuZCByZXR1cm4gdGhlIG5vbi1oYXZlIGR2UG9zIHZhbHVlPC9wYXJhbT5cclxuICBldmFsdWF0ZURlc2NyaXB0b3IoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgcmVzOiBOVU1fVFlQRTtcclxuICAgIGlmICh0aGlzLkR2UG9zRGVzY3JpcHRvciA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHJlc3VsdCk7XHJcblxyXG4gICAgbGV0IGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBnbyBvdmVyIHRoZSBsaXN0IG9mIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5EdlBvc0Rlc2NyaXB0b3IubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCFmaXJzdClcclxuICAgICAgICByZXN1bHQgKz0gXCI7XCI7XHJcblxyXG4gICAgICBsZXQgY3VycmVudENlbGw6IHN0cmluZ1tdID0gdGhpcy5EdlBvc0Rlc2NyaXB0b3IuZ2V0X0l0ZW0oaSk7XHJcblxyXG4gICAgICAvLyBwYXJzZSB0aGUgY3VycmVudCB0YXNrIGFuZCBmaWVsZCBudW1iZXJcclxuICAgICAgbGV0IGN1cnJlbnRUYWc6IHN0cmluZyA9IGN1cnJlbnRDZWxsWzBdO1xyXG4gICAgICBsZXQgY3VycmVudFZlZUlkeDogbnVtYmVyID0gTk51bWJlci5QYXJzZShjdXJyZW50Q2VsbFsxXSk7XHJcbiAgICAgIGxldCBjdXJyZW50VGFzayA9IDxUYXNrPkFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5HZXRUYXNrQnlJRChjdXJyZW50VGFnKTtcclxuICAgICAgbGV0IGN1cnJlbnRGaWVsZCA9IDxGaWVsZD5jdXJyZW50VGFzay5EYXRhVmlldy5nZXRGaWVsZChjdXJyZW50VmVlSWR4KTtcclxuICAgICAgbGV0IGRpc3BWYWw6IHN0cmluZyA9IGN1cnJlbnRGaWVsZC5nZXREaXNwVmFsdWUoKTtcclxuXHJcbiAgICAgIC8vIFFDUiA5Nzg1NjZcclxuICAgICAgaWYgKGN1cnJlbnRGaWVsZC5pc051bGwoKSlcclxuICAgICAgICBkaXNwVmFsID0gXCJcIjtcclxuXHJcbiAgICAgIC8vIFFDUiA3NDMyOTBcclxuICAgICAgbGV0IHBpYzogUElDO1xyXG4gICAgICBzd2l0Y2ggKGN1cnJlbnRGaWVsZC5nZXRUeXBlKCkpIHtcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjpcclxuICAgICAgICAvLyBib29sZWFuIGlzIHN0b3JlZCBhcyBcIm9cIiBvciBcIjFcIiBzbyB3ZSBqdXN0IGFkZCB0aGVtIGFzIHdlXHJcbiAgICAgICAgLy8gZG8gaW4gdGhlIHNlcnZlclxyXG4gICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICByZXN1bHQgKz0gZGlzcFZhbDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuREFURTpcclxuICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRTpcclxuICAgICAgICAgIC8vIFFDUiA3NDI5NjYgZGF0ZSBhbmQgdGltZSBzcGVjaWFsIHRyZWF0bWVudFxyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcGljID0gbmV3IFBJQyhjdXJyZW50RmllbGQuZ2V0UGljdHVyZSgpLCBjdXJyZW50RmllbGQuZ2V0VHlwZSgpLCAwKTtcclxuICAgICAgICAgICAgbGV0IGNvbnY6IERpc3BsYXlDb252ZXJ0b3IgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gY29udi5tZzJkaXNwKGRpc3BWYWwsIFwiXCIsIHBpYywgZmFsc2UsIHRoaXMuZ2V0Q29tcElkeCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6XHJcbiAgICAgICAgICAvLyBRQ1IgNTQzMjA0IHdoZW4gdGhlcmUgaXMgYW4gZW1wdHkgc3RyaW5nIChhbHBoYSlhcHBlbmQgbm90aGluZ1xyXG4gICAgICAgICAgaWYgKGRpc3BWYWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgcmVzID0gbmV3IE5VTV9UWVBFKGRpc3BWYWwpO1xyXG4gICAgICAgICAgICBwaWMgPSBuZXcgUElDKGN1cnJlbnRGaWVsZC5nZXRQaWN0dXJlKCksIGN1cnJlbnRGaWVsZC5nZXRUeXBlKCksIDApO1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gcmVzLnRvX2EocGljKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaXJzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0bXBTdHIyOiBzdHJpbmcgPSBTdHJVdGlsLnN0cmluZ1RvSGV4YUR1bXAocmVzdWx0LCA0KTtcclxuXHJcbiAgICByZXR1cm4gSGFzaFV0aWxzLkdldEhhc2hDb2RlKHRtcFN0cjIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkcyB0aGUgZHZQb3MgZGVzY3JpcHRvciB2ZWN0b3IgZWFjaCBvZiB0aGUgZHZQb3NEZXNjcmlwdG9yIHZlY3RvciBlbGVtZW50cyBpcyBhIFN0cmluZyBhcnJheSBvZiBzaXplXHJcbiAgLy8vICAgMiBpbiB0aGUgZmlyc3QgY2VsbCBvZiBlYWNoIGFycmF5IHdlIGhhdmUgdGhlIHRhZyBhbmQgaW4gdGhlIHNlY29uZCB3ZSBoYXZlIHRoZSB2ZWUgaWluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXREZXNjcmlwdG9yKG5ld0Rlc2M6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCEobmV3RGVzYy50cmltKCkgPT09IFwiXCIpKSB7XHJcbiAgICAgIGxldCBkZXNjOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUobmV3RGVzYywgXCI7XCIpO1xyXG4gICAgICB0aGlzLkR2UG9zRGVzY3JpcHRvciA9IG5ldyBMaXN0PHN0cmluZ1tdPigpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRlc2MubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBsZXQgY2VsbDogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigyKTtcclxuICAgICAgICBsZXQgdGFnVmVlUGFpcjogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGRlc2NbaV0sIFwiLFwiKTtcclxuICAgICAgICBjZWxsWzBdID0gdGFnVmVlUGFpclswXTtcclxuICAgICAgICBjZWxsWzFdID0gdGFnVmVlUGFpclsxXTtcclxuXHJcbiAgICAgICAgLy8gcHV0IHRoZSBjZWxsIHZhbHVlIGludG8gdGhlIHZlY3RvclxyXG4gICAgICAgIHRoaXMuRHZQb3NEZXNjcmlwdG9yLnB1c2goY2VsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBjYWNoZSBvYmplY3Qgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrQ2FjaGUoKTogRHZDYWNoZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHZDYWNoZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwcmVwYXJlIGFsbCBzdWItZm9ybSB0cmVlJ3MgdG8gZWl0aGVyIGdvIHRvIHNlcnZlciAoYWZ0ZXIgZGVsZXRpbmcgcmVsZXZhbnQgZW50cmllcykgb3IgdG8gdGFrZSBkLnYgZnJvbVxyXG4gIC8vLyAgIGNhY2hlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgYWxsIHN1YmZvcm0gY2FuIGRvIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlciBiZWNhdXNlIG9mIHVwZGF0ZXM8L3JldHVybnM+XHJcbiAgYXN5bmMgcHJlcGFyZUNhY2hlKGlnbm9yZUN1cnI6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBjaGVja2luZyBteXNlbGYgaWYgaSBhbSBhIHN1YmZvcm1cclxuICAgIGlmICghaWdub3JlQ3Vycikge1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgaWYgKCg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuZ2V0Q2hhbmdlZCgpKSB7XHJcbiAgICAgICAgICAvLyBpcyB0aGUgY3VycmVudCB1cGRhdGUgZGF0YXZpZXcgd2VyZSBwcmV2aW91c2x5IHRha2VuIGZyb20gY2FjaGVcclxuICAgICAgICAgIHRoaXMuX2R2Q2FjaGUucmVtb3ZlRHZGcm9tQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5nZXREdlBvc1ZhbHVlKCksIHRydWUpO1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBjaGVja3MgdGhhdCBpIGFtIGEgc3ViIGZvcm0gYnV0IGkgYW0gbm90IGNhY2hlZFxyXG4gICAgICAgIGlmICh0aGlzLklzU3ViRm9ybSAmJiAhIGF3YWl0IHRoaXMuaXNDYWNoZWQoKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBjdXJyZXRUYXNrOiBUYXNrO1xyXG5cclxuICAgIC8vIGNoZWNrIGFsbCBteSBzdWIgZm9ybXNcclxuICAgIGlmICh0aGlzLmhhc1N1YlRhc2tzKCkpIHtcclxuICAgICAgLy8gdGhpcyBsb29wIG11c3QgcnVuIHRvIGl0cyBlbmQgc28gYWxsIHVwZGF0ZWQgZC52IHdpbGwgYmUgZGVsZXRlZFxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkgPSBpICsgMSkge1xyXG4gICAgICAgIGN1cnJldFRhc2sgPSA8VGFzaz50aGlzLlN1YlRhc2tzLmdldFRhc2soaSk7XHJcbiAgICAgICAgLy8gaWYgb25lIG9mIG15IHN1Yi1mb3JtcyBuZWVkcyB0byBnbyB0byB0aGUgc2VydmVyIC0gc28gZG8gaVxyXG4gICAgICAgIGlmICghIGF3YWl0IGN1cnJldFRhc2sucHJlcGFyZUNhY2hlKGZhbHNlKSkge1xyXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHdlIGNhbiB0YWtlIHRoZSBkLnYgb2YgdGhlIHRhc2sgYW5kIGFsbCBoaXMgc3ViLWZvcm1zIGZyb20gY2FjaGUgaXMgd2UgY2FuIC0gdGFrZSB0aGVtIGFuZFxyXG4gIC8vLyAgIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBjdXJyZW50IGQudiBvZiBlYWNoIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdHJ1ZSBpZiBhbGwgZC52J3Mgd2VyZSBmb3VuZCBhbmQgc2V0PC9yZXR1cm5zPlxyXG4gIGFzeW5jIHRlc3RBbmRTZXQoaWdub3JlQ3VycjogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gY2hlY2sgY3VycmVudCB0YXNrXHJcbiAgICBpZiAoIWlnbm9yZUN1cnIgJiYgYXdhaXQgdGhpcy5pc0NhY2hlZCgpKSB7XHJcbiAgICAgIGxldCByZXF1ZXN0ZWREdjogbnVtYmVyID0gdGhpcy5ldmFsdWF0ZURlc2NyaXB0b3IoKTtcclxuXHJcbiAgICAgIC8vIHRyeSB0byB0YWtlIGZyb20gY2FjaGUgb25seSBpZiByZXF1ZXN0ZWQgaXMgbm90IGN1cnJlbnRcclxuICAgICAgaWYgKHJlcXVlc3RlZER2ICE9PSAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSkge1xyXG4gICAgICAgIGxldCBmcm9tQ2FjaGU6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldyhyZXF1ZXN0ZWREdik7XHJcbiAgICAgICAgaWYgKGZyb21DYWNoZSA9PSBudWxsKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlRHYoZnJvbUNhY2hlKTsgICAgIC8vIGNoYW5nZXMgdGhlIGN1cnJlbnQgZC52IHdpdGggdGhlIG9uZSB0YWtlbiBmcm9tIGNhY2hlIGRvIG5vdCBmb3JnZXQgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBuZWVkcyB0byBiZSBpbnNlcnRlZCB0byB0aGUgY2FjaGVcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUUNSICM0MzAwNDUuIEluZGljYXRlIHRoYXQgUlAgbXVzdCBiZSBleGVjdXRlZCBhZnRlciBnZXQgZnJvbSB0aGUgY2FjaGUuXHJcbiAgICAgIHRoaXMuRG9TdWJmb3JtUHJlZml4U3VmZml4ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBhbGwgc3ViLWZvcm1zIHRhc2tzZFxyXG4gICAgaWYgKHRoaXMuaGFzU3ViVGFza3MoKSkge1xyXG4gICAgICAvLyB0aGlzIGxvb3AgZG9lcyBub3QgbmVlZCB0byByZWFjaCBpdHMgZW5kXHJcbiAgICAgIC8vIHRoZSBtb21lbnQgb25lIHRoYXQgbmVlZCB0byBnbyB0byB0aGUgc2VydmVyIGlzIGRpc2NvdmVyZWQgYWxsIG5lZWQgdG8gZ28gYWxzb1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5TdWJUYXNrcy5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICAgIC8vIGRvZXMgdGhlIGktdGggc29uIG5lZWQgdG8gZ28gdG8gdGhlIHNlcnZlclxyXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5TdWJUYXNrcy5nZXRUYXNrKGkpLnRlc3RBbmRTZXQoZmFsc2UpKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hhbmdlcyB0aGUgY3VycmVudCBkLnYgd2l0aCBvbmUgdGFrZW4gZnJvbSBjYWNoZSBpbiB0aGlzIG1ldGhvZCB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCB1cGRhdGVzXHJcbiAgLy8vICAgb2YgdGhlIGN1cnJlbnQgZGF0YXZpZXcgc2luY2UgdGhlIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBmcm9tIHRlc3RBbmRTZXQgdGhhdCBpbiB0dXJuIGlzIG9ubHkgdXNlZCBhZnRlclxyXG4gIC8vLyAgIGEgU3VjY2Vzc2Z1bCBydW4gcHJhcHJlQ2FjaGUgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGZvciB1cGRhdGVzIGluIHRoZSBjdXJyZW50IGRhdGF2aWV3IG9mXHJcbiAgLy8vICAgZWFjaCByZWxhdGVkIHRhc2suIGhvd2V2ZXIgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSBjaGVjayBpdCBhbnl3YXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZnJvbUNhY2hlXCI+dGhlIG5ldyBkLnY8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY2hhbmdlRHYoZnJvbUNhY2hlOiBEYXRhVmlldyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRhdGF2aWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLkRhdGFWaWV3O1xyXG4gICAgLy8gdGhlIGRhdGEgdmlldyB3ZSByZWNlaXZlIGlzIENlcnRhaW5seSBmcm9tIHRoZSBjYWNoZVxyXG5cclxuICAgIGlmICghdGhpcy5oYXNMb2NhdGUpIHtcclxuICAgICAgaWYgKCFkYXRhdmlldy5nZXRDaGFuZ2VkKCkgJiYgZGF0YXZpZXcuSW5jbHVkZXNGaXJzdCgpKVxyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZShkYXRhdmlldy5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMubG9jYXRlUHV0SW5DYWNoZSgpO1xyXG5cclxuICAgIC8vIHNldCB0aGUgZGF0YSB2aWV3IGZyb20gdGhlIGNhY2hlIGFzIHRoZSBjdXJyZW50XHJcbiAgICBhd2FpdCBkYXRhdmlldy5zZXRTYW1lQXMoZnJvbUNhY2hlKTtcclxuICAgIGRhdGF2aWV3LnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuXHJcbiAgICB0aGlzLkZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgKDxNZ0Zvcm0+dGhpcy5Gb3JtKS5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG5cclxuICAgIGF3YWl0ICg8TWdGb3JtPnRoaXMuRm9ybSkuUmVmcmVzaERpc3BsYXkoQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9GT1JNKTtcclxuXHJcbiAgICAvLyBRQ1IgOTI0ODA5NFxyXG4gICAgdGhpcy5zZXRPcmlnaW5hbFRhc2tNb2RlKHRoaXMuZ2V0TW9kZSgpKTtcclxuICB9XHJcblxyXG4gIHNldE9yaWdpbmFsVGFza01vZGUob3JpZ2luYWxUYXNrTW9kZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlID0gb3JpZ2luYWxUYXNrTW9kZS5jaGFyQXQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBtb2RlIG9mIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldE9yaWdpbmFsVGFza01vZGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFRhc2tNb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGlzIENhY2hlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBzdWIgZm9ybSBjb250cm9sIHRoaXMgdGFzayBDb3JyZWxhdGVzIHdpdGggdGhpcyBtZXRob2RcclxuICAvLy8gICBhY3R1YWxseSBjb21iaW5lcyB0d28gdGVzdCBmaXJzdCB0aGF0IHRoZSB0YXNrIGlzIGEgc3ViIGZvcm0gc2Vjb25kIHRoYXQgdGhlIHN1YiB0aGF0IHRoZSBzdWIgZm9ybSBoYXNcclxuICAvLy8gICB0aGUgaXMgY2FjaGVkIHByb3BlcnR5IHNldCB0byB5ZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQ2FjaGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSXNTdWJGb3JtICYmIGF3YWl0ICg8TWdDb250cm9sQmFzZT50aGlzLkZvcm0uZ2V0U3ViRm9ybUN0cmwoKSkuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0lTX0NBQ0hFRCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGRvZXMgdGhlIGluc2VydCBpbiBjYWNoZSBsb2dpYyBpbiBjYXNlIHRoZSB0YXNrIGhhcyBsb2NhdGUgZXhwcmVzc2lvbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgbG9jYXRlUHV0SW5DYWNoZSgpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZWQ6IERhdGFWaWV3ID0gdGhpcy5fZHZDYWNoZS5nZXRDYWNoZWREYXRhVmlldygoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSk7XHJcblxyXG4gICAgLy8gaWYgdGhpcyBkYXRhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgdG8gdGhlIGNhY2hlIGJlZm9yZVxyXG4gICAgaWYgKGNhY2hlZCAhPSBudWxsKSB7XHJcbiAgICAgIGlmICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNoZWNrRmlyc3QoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpICYmICEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSkge1xyXG4gICAgICAgICg8RGF0YVZpZXc+dGhpcy5EYXRhVmlldykuc2V0TG9jYXRlRmlyc3RSZWMoY2FjaGVkLmdldExvY2F0ZUZpcnN0UmVjKCkpO1xyXG4gICAgICAgIHRoaXMuX2R2Q2FjaGUucHV0SW5DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLnJlcGxpY2F0ZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZHZDYWNoZS5yZW1vdmVEdkZyb21DYWNoZSgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldER2UG9zVmFsdWUoKSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBwdXQgaXQgaW4gdGhlIGNhY2hlIGlmIGl0IGlzIG5vdCB1cGRhdGVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCEoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmdldENoYW5nZWQoKSlcclxuICAgICAgICB0aGlzLl9kdkNhY2hlLnB1dEluQ2FjaGUoKDxEYXRhVmlldz50aGlzLkRhdGFWaWV3KS5yZXBsaWNhdGUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaGFzTG9jYXRlIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEhhc0xvYWN0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0xvY2F0ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBvcGVucyBhIG5ldyBUcmFuc2FjdGlvbiBvciBzZXQgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBUcmFuc2FjdGlvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRSZW1vdGVUcmFuc2FjdGlvbih0cmFuc0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBtZ2RUYWI6IElNR0RhdGFDb2xsZWN0aW9uID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlO1xyXG4gICAgbGV0IHRyYW5zVGFzazogVGFzaztcclxuICAgIGxldCBpc0ZpbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBtZ2RUYWIuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgd2hpbGUgKCh0cmFuc1Rhc2sgPSA8VGFzaz5tZ2RUYWIuZ2V0TmV4dFRhc2soKSkgIT0gbnVsbCkge1xyXG4gICAgICAvLyB0cmFuc2FjdGlvbiBtaWdodCBiZSBudWxsIHdoZW4gdGFzayBpcyBhYm9ydGluZyBidXQgbm90IHlldCB1bmxvYWRlZC5cclxuICAgICAgaWYgKHRyYW5zVGFzay5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uICE9IG51bGwgJiZcclxuICAgICAgICB0cmFuc1Rhc2suRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5UcmFuc2FjdGlvbi5nZXRUcmFuc0lkKCkgPT09IHRyYW5zSWQpIHtcclxuICAgICAgICBpc0ZpbmQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLlRyYW5zYWN0aW9uID0gKGlzRmluZCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNUYXNrLkRhdGF2aWV3TWFuYWdlci5SZW1vdGVEYXRhdmlld01hbmFnZXIuVHJhbnNhY3Rpb24gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbih0aGlzLCB0cmFuc0lkKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyB0aGUgbmV3IFRyYW5zYWN0aW9uIE93bmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRUcmFuc093bmVyVGFzaygpOiB2b2lkIHtcclxuICAgIHRoaXMuVHJhbnNhY3Rpb24uc2V0T3duZXJUYXNrKHRoaXMpO1xyXG4gICAgdGhpcy5UcmFuc2FjdGlvbi5zZXRUcmFuc0JlZ2luKCdUJykvKidUJyovO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHRoZSB0b3Btb3N0IHZhbHVlIGluIHRoZSBzdGFjayBhbmQgdGhlIHN0YXR1cyBvZiB0aGVcclxuICAvLy8gICBcInVzZUxvb3BTdGFja1wiIGZsYWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldExvb3BDb3VudGVyKCk6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3VzZUxvb3BTdGFjayAmJiB0aGlzLl9sb29wU3RhY2sgIT09IG51bGwgJiYgISh0aGlzLl9sb29wU3RhY2suY291bnQoKSA9PT0gMCkpIHtcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucGVlaygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwdXNoZXMgdGhlIHZhbHVlIDAgb24gdGhlIHRvcCBvZiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZW50ZXJMb29wKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fbG9vcFN0YWNrID0gbmV3IFN0YWNrKCk7XHJcblxyXG4gICAgdGhpcy5fbG9vcFN0YWNrLnB1c2goMCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdG9wbW9zdCBlbnRyeSBmcm9tIHRoZSBsb29wIHN0YWNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBsZWF2ZUxvb3AoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcExvb3BDb3VudGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcG9wcyB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgY291bnRlciBmcm9tIHRoZSBzdGFjayBhbmQgcmV0dXJucyBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcG9wTG9vcENvdW50ZXIoKTogbnVtYmVyIHtcclxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbCAmJiAhKHRoaXMuX2xvb3BTdGFjay5jb3VudCgpID09PSAwKSlcclxuICAgICAgcmVzdWx0ID0gPG51bWJlcj50aGlzLl9sb29wU3RhY2sucG9wKCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbmNyZWFzZXMgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3Agc3RhY2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGluY3JlYXNlTG9vcENvdW50ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9sb29wU3RhY2sucHVzaCh0aGlzLnBvcExvb3BDb3VudGVyKCkgKyAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbG9vcCBzdGFja1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TG9vcFN0YWNrU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuX2xvb3BTdGFjayAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIHRoaXMuX2xvb3BTdGFjay5jb3VudCgpO1xyXG5cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIFwidXNlIGxvb3Agc3RhY2tcIiB2YXJpYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj50aGUgbmV3IHZhbHVlIHRvIHNldDwvcGFyYW0+XHJcbiAgc2V0VXNlTG9vcFN0YWNrKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fdXNlTG9vcFN0YWNrID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbGlua3MgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldERhdGF2aWV3SGVhZGVycygpOiBEYXRhdmlld0hlYWRlcnMge1xyXG4gICAgcmV0dXJuIHRoaXMuRGF0YXZpZXdIZWFkZXJzVGFibGU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UmVjb3JkQ3ljbGUoVmFsdWVfPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UmVjb3JkQ3ljbGVfMCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RSZWNvcmRDeWNsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGaXJzdFJlY29yZEN5Y2xlXzEoVmFsdWVfOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maXJzdFJlY29yZEN5Y2xlID0gVmFsdWVfO1xyXG4gIH1cclxuXHJcbiAgLy8vPHN1bW1hcnk+Z2V0IHRoZSBpbnRlcm5hbCBuYW1lPC9zdW1tYXJ5PlxyXG4gIGdldFB1YmxpY05hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLlB1YmxpY05hbWU7XHJcbiAgfVxyXG5cclxuICAvLy88c3VtbWFyeT5nZXQgdGhlIEFsbG93RXZlbnRzPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzQWxsb3dFdmVudHMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcHJvcDogUHJvcGVydHkgPSB0aGlzLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVEFTS19QUk9QRVJUSUVTX0FMTE9XX0VWRU5UUyk7XHJcbiAgICByZXR1cm4gYXdhaXQgcHJvcC5nZXRWYWx1ZUJvb2xlYW4oKTtcclxuICB9XHJcblxyXG4gIC8vLzxzdW1tYXJ5PmdldCB0aGUgdGFzayBpZDwvc3VtbWFyeT5cclxuICBnZXRFeHRlcm5hbFRhc2tJZCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhc2tJZDogc3RyaW5nID0gXCJcIjtcclxuICAgIGxldCBwcm9wOiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX0lEKTtcclxuXHJcbiAgICBpZiAocHJvcCAhPSBudWxsKVxyXG4gICAgICB0YXNrSWQgPSBwcm9wLkdldENvbXB1dGVkVmFsdWUoKTtcclxuXHJcbiAgICByZXR1cm4gdGFza0lkO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIFRSVUUgaWYgdGhpcyB0YXNrIG93bnMgYSBkeW5hbWljRGVmLnRyYW5zYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1RyYW5zYWN0aW9uT3duZXIoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNUcmFuc093bmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuVHJhbnNhY3Rpb24gIT0gbnVsbCAmJiB0aGlzLlRyYW5zYWN0aW9uLmlzT3duZXIodGhpcykpXHJcbiAgICAgIGlzVHJhbnNPd25lciA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIGlzVHJhbnNPd25lcjtcclxuICB9XHJcblxyXG4gIGlzVHJhbnNhY3Rpb25PbkxldmVsKGxldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzVHJhbnNhY3Rpb25Pd25lcigpICYmIHRoaXMuVHJhbnNhY3Rpb24uZ2V0TGV2ZWwoKSA9PT0gbGV2ZWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHdoZXRoZXIgdGhlIHRhc2sgaXMgdGhlIFByb2dyYW0gKGkuZS4gbm90IGEgc3VidGFzaylcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzUHJvZ3JhbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1ByZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUtZGlzYWJsZSBhY3Rpb25zIGZvciB0YXNrIG1vZGVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBlbmFibGVNb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19NT0RJRlksIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX01PRElGWSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19DUkVBVEUsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX0NSRUFURSwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19RVUVSWSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fUVVFUlksIGVuYWJsZSk7XHJcblxyXG4gICAgZW5hYmxlID0gYXdhaXQgdGhpcy5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfUkFOR0UsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1JBTkdFLCBlbmFibGUpO1xyXG5cclxuICAgIGVuYWJsZSA9IGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0xPQ0FURSwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVE9fTE9DQVRFLCBlbmFibGUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUlRPX1NFQVJDSCwgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19TT1JULCB0cnVlKTtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1NPUlRfUkVDT1JEUywgZW5hYmxlKTtcclxuXHJcbiAgICBlbmFibGUgPSBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9UQVNLX1BST1BFUlRJRVNfQUxMT1dfSU5ERVgsIHRydWUpO1xyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVklFV19CWV9LRVksIGVuYWJsZSk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfRFVNUF9FTlZJUk9OTUVOVCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IGhhc1pvb21IYW5kbGVyIHRvIHRydWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEVuYWJsZVpvb21IYW5kbGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZW5hYmxlWm9vbUhhbmRsZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGhhc1pvb21IYW5kbGVyXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBnZXRFbmFibGVab29tSGFuZGxlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbmFibGVab29tSGFuZGxlcjtcclxuICB9XHJcblxyXG4gIC8vLyA8cmV0dXJucz4gaXMgdGhlIHRhc2sgaXMgYSBEZXN0aW5hdGlvbiBTdWJmb3JtIHRhc2s8L3JldHVybnM+XHJcbiAgaXNEZXN0aW5hdGlvblN1YmZvcm0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBmb3IgRGVzdGluYXRpb24gU3ViZm9ybSB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRlc3RpbmF0aW9uU3ViZm9ybVwiPjwvcGFyYW0+XHJcbiAgc2V0RGVzdGluYXRpb25TdWJmb3JtKGRlc3RpbmF0aW9uU3ViZm9ybTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdGluYXRpb25TdWJmb3JtID0gZGVzdGluYXRpb25TdWJmb3JtO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxyZXR1cm5zPiBpcyB0aGUgdGFzayBpcyBhIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFzazwvcmV0dXJucz5cclxuICBnZXRJc0Rlc3RpbmF0aW9uQ2FsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0Rlc3RpbmF0aW9uQ2FsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgZm9yIERlc3RpbmF0aW9uIFN1YmZvcm0gdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc0Rlc3RpbmF0aW9uQ2FsbFwiPjwvcGFyYW0+XHJcbiAgc2V0SXNEZXN0aW5hdGlvbkNhbGwoaXNEZXN0aW5hdGlvbkNhbGw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2lzRGVzdGluYXRpb25DYWxsID0gaXNEZXN0aW5hdGlvbkNhbGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWxcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBzZXRDYW5jZWxXYXNSYWlzZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYW5jZWxXYXNSYWlzZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBjYW5jZWxXYXNSYWlzZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FuY2VsV2FzUmFpc2VkO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlQ3JlYXRlQWN0cyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NSRUxJTkUsIHZhbCk7XHJcblxyXG4gICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSwgICh0aGlzLmdldEZvcm0oKS5IYXNUYWJsZSgpICkgPyB2YWwgOiBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0cyBlbmFibGUvZGlzYWJsZSBzdGF0dXMgb2YgY3JlYXRlIGFuZCBkZWxldGUgYWN0aW9uc1xyXG4gIC8vLyA8L3N1bW1hcnlcclxuICBhc3luYyBzZXRDcmVhdGVEZWxldGVBY3RzRW5hYmxlU3RhdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoISh0aGlzLkRhdGFWaWV3KS5pc0VtcHR5RGF0YXZpZXcoKSAmJiBhd2FpdCB0aGlzLmNoZWNrUHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9BTExPV19ERUxFVEUsIHRydWUpICYmXHJcbiAgICAgIHRoaXMuZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSAmJiAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSlcclxuICAgICAgdGhpcy5BY3Rpb25NYW5hZ2VyLmVuYWJsZShJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfREVMTElORSwgdHJ1ZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RFTExJTkUsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAoKGF3YWl0IHRoaXMuY2hlY2tQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX0FMTE9XX0NSRUFURSwgdHJ1ZSkpICYmXHJcbiAgICAgICgoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLkhhc01haW5UYWJsZSAmJlxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkgJiYgRW52aXJvbm1lbnQuSW5zdGFuY2UuYWxsb3dDcmVhdGVJbk1vZGlmeU1vZGUodGhpcy5nZXRDb21wSWR4KCkpKSB8fFxyXG4gICAgICAgICh0aGlzLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpKSlcclxuICAgICAgdGhpcy5lbmFibGVDcmVhdGVBY3RzKHRydWUpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmVuYWJsZUNyZWF0ZUFjdHMoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbXB0eURhdGF2aWV3XCI+dGhlIGVtcHR5RGF0YXZpZXcgdG8gc2V0IDwvcGFyYW0+XHJcbiAgc2V0RW1wdHlEYXRhdmlldyhlbXB0eURhdGF2aWV3OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLkRhdGFWaWV3LnNldEVtcHR5RGF0YXZpZXcoZW1wdHlEYXRhdmlldyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IDwvcmV0dXJucz5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5OYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIHN0YXJ0cyBpdHMgZXhlY3V0aW9uIGluIEVtcHR5IERhdGF2aWV3IG1vZGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGVtcHR5RGF0YXZpZXdPcGVuKHN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyB0byBwcmV2ZW50IGRvdWJsZSBwcmVmaXggb24gdGhlIHNhbWUgcmVjb3JkXHJcbiAgICBpZiAodGhpcy5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKSB7XHJcbiAgICAgIHRoaXMuQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXLCB0cnVlKTtcclxuICAgICAgLy8gaWYgdGhlIHRhc2sgaXMgYSBzdWJmb3JtIGFuZCBzdWJmb3JtIHJlZnJlc2ggaXMgZG9uZSwgc28gZXhlY3V0ZSB0aGUgZW1wdHkgZGF0YXR2aWV3IGhhbmRsZXIsXHJcbiAgICAgIC8vIGlmIHRoZSB0YXNrIGlzIG5vdCBhIHN1YmZvcm0sIHB1dCB0aGUgZW1wdHkgZGF0YXZpZXcgZXZlbnQgb24gdGhlIHF1ZXVlXHJcbiAgICAgIGlmICh0aGlzLklzU3ViRm9ybSkge1xyXG4gICAgICAgIGxldCBydEV2bnQgPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpO1xyXG4gICAgICAgIGlmICgocnRFdm50ICE9IG51bGwgJiYgcnRFdm50LmdldEludGVybmFsQ29kZSgpID09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1ZJRVcpIHx8IHN1YmZvcm1SZWZyZXNoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBydEV2dDogUnVuVGltZUV2ZW50ID0gbmV3IFJ1blRpbWVFdmVudCh0aGlzKTtcclxuICAgICAgICAgIHJ0RXZ0LnNldEludGVybmFsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVyk7XHJcbiAgICAgICAgICBydEV2dC5TZXRFdmVudFN1YlR5cGUoRXZlbnRTdWJUeXBlLk5vcm1hbCk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudChydEV2dCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuYWRkSW50ZXJuYWxFdmVudFdpdGhJdGFza0FuZENvZGUodGhpcywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0VNUFRZX0RBVEFWSUVXKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuXHJcbiAgICAgIC8vIGZvciBzdWJmb3JtIG1vZGUgJ0FzUGFyZW50Jy4gSWYgdGhlIHBhcmVudCB0YXNrIHRoYXQgaW4gJ0VtcHR5IERhdGF2aWV3JyBzdGF0ZSBjaGFuZ2VzIGl0cyBtb2RlXHJcbiAgICAgIC8vIHRoZSBzdWJmb3JtIGFsc28gbXVzdCBjaGFuZ2UgbW9kZS5cclxuICAgICAgLy8gUUNSICMyODE4NjIuIElmIHRoZSBzdWJmb3JtIHRhc2sgaXMgb3BlbmVkIGluIHRoZSBmaXJzdCB0aW1lIGRvIG5vdCByZWZyZXNoIGl0J3Mgc3ViZm9ybXMsXHJcbiAgICAgIC8vIGJlY2F1c2UgdGhleSd2ZSByZWNlaXZlZCB0aGVpciBkYXRhdmlld3MgYWxyZWFkeS5cclxuICAgICAgLy8gV2UgbXVzdCByZWZyZXNoIHRoZW0gd2hlbiB0aGUgc3ViZm9ybSB0YXNrIHBhc3NlcyB0byBlbXB0eSBEVi5cclxuICAgICAgaWYgKHRoaXMuU3ViZm9ybUV4ZWNNb2RlICE9PSBUYXNrX1N1YmZvcm1FeGVjTW9kZUVudW0uRklSU1RfVElNRSAmJiBzdWJmb3JtUmVmcmVzaCAmJiBhd2FpdCB0aGlzLkNoZWNrUmVmcmVzaFN1YlRhc2tzKCkpIHtcclxuICAgICAgICBhd2FpdCAoPERhdGFWaWV3PnRoaXMuRGF0YVZpZXcpLmNvbXB1dGVTdWJGb3JtcygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TdWJmb3JtUmVjUHJlZml4U3VmZml4KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUmVjb3JkQWN0aW9ucygpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgZmFsc2UpO1xyXG4gICAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiB0YXNrIGVuZHMgaXRzIGV4ZWN1dGlvbiBpbiBFbXB0eSBEYXRhdmlldyBtb2RlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBlbXB0eURhdGF2aWV3Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9FTVBUWV9EQVRBVklFVywgZmFsc2UpO1xyXG4gICAgdGhpcy5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1JFQ09SRCwgdHJ1ZSk7XHJcbiAgICB0aGlzLkFjdGlvbk1hbmFnZXIuZW5hYmxlKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SVF9SRUZSRVNIX1NDUkVFTiwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdWJmb3JtVGFza1wiPjwvcGFyYW0+XHJcbiAgYXN5bmMgU3ViZm9ybVJlZnJlc2goc3ViZm9ybVRhc2s6IFRhc2tCYXNlLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSBMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCk7XHJcbiAgICBsZXQgaXNJbnNpZGU6IGJvb2xlYW4gPSBhd2FpdCAoPFRhc2s+c3ViZm9ybVRhc2spLkV4ZWN1dGVOZXN0ZWRSUyhjdXJyVGFzayk7XHJcblxyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBRQ1IgIzQzNDQ2Ny4gRXhlY3V0ZSBSUyBvZiB0aGUgY3VycmVudCBzdWJmb3JtIGlmIGl0J3MgdGhlIGN1cnJlbnQgKGxhc3QgZm9jdXNlZCkgdGFzay5cclxuICAgIGlmIChzdWJmb3JtVGFzay5nZXRMZXZlbCgpICE9PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZFN1YmZvcm1SZWZyZXNoKHN1YmZvcm1UYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgdHJ1ZSk7XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnBvcE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgaXNJbnNpZGUgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gRGVmZWN0IDc3NDgzLiBEbyBub3QgY29udGludWUgaWYgdGhlIHJlY29yZCBzdWZmaXggZXhlY3V0aW9uIGlzIGZhaWxlZC5cclxuICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNyZWF0ZSBjb21tYW5kIGZvciB0aGUgc2VydmVyXHJcbiAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IENvbW1hbmRGYWN0b3J5LkNyZWF0ZVN1YmZvcm1SZWZyZXNoQ29tbWFuZCh0aGlzLmdldFRhc2tUYWcoKSwgc3ViZm9ybVRhc2suZ2V0VGFza1RhZygpLCBleHBsaWNpdFN1YmZvcm1SZWZyZXNoKTtcclxuICAgIGF3YWl0IHN1YmZvcm1UYXNrLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgICBpZiAoc3ViZm9ybVRhc2suaXNBYm9ydGluZygpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgLy8gUUNSICM0MjkxMTIuIFB1c2ggZXhlY3V0aW9uIHN0YWNrIGJlZm9yZSBSUCBleGVjdXRpb24uXHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcblxyXG4gICAgICAvLyBEZWZlY3QgIzc3MDQ5LiBEbyBub3QgZXhlY3V0ZSBwYXJlbnQgUlAuIFdlIG5lZWQgaXQgb25seSB3aGVuIGNsaWNrIG9uIHN1YmZvcm13YXMgZG9uZS5cclxuICAgICAgbGV0IHBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXhPcmc6IGJvb2xlYW4gPSAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXg7XHJcbiAgICAgICg8VGFzaz5zdWJmb3JtVGFzaykuUGVyZm9ybVBhcmVudFJlY29yZFByZWZpeCA9IGZhbHNlO1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2tBbmRTdWJmb3JtUmVmcmVzaChzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIHRydWUpO1xyXG4gICAgICAoPFRhc2s+c3ViZm9ybVRhc2spLlBlcmZvcm1QYXJlbnRSZWNvcmRQcmVmaXggPSBwZXJmb3JtUGFyZW50UmVjb3JkUHJlZml4T3JnO1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBTdWJmb3JtUmVmcmVzaCBldmVudCB0byBpdHNlbGYgc28gdGhlIGN1cnNvciBtdXN0IGJlIG9uIHRoZSBmaXJzdCBjb250cm9sIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgLy8gYXMgZm9yIFZpZXdSZWZyZXNoIGV2ZW50LlxyXG4gICAgaWYgKGlzSW5zaWRlKSB7XHJcbiAgICAgIC8vIERlZmVjdCAxMTU3OTMuIGN1cnJUYXNrIGNhbid0IGJlIG51bGwuXHJcbiAgICAgIC8vIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSAmJiAhc3ViZm9ybVRhc2suZ2V0UHJldmVudENvbnRyb2xDaGFuZ2UoKSAmJiBjdXJyVGFzayAhPSBudWxsKVxyXG4gICAgICAvLyAgIGN1cnJUYXNrLm1vdmVUb0ZpcnN0Q3RybChmYWxzZSk7XHJcbiAgICAgIC8vIFRPRE86IFRhYmJpbmcgJiBGb2N1c2luZzogSGFuZGxlIHRoaXMgc2l0dWF0aW9uXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSB7XHJcbiAgICAgICAgaWYgKGV4cGxpY2l0U3ViZm9ybVJlZnJlc2gpIHtcclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayhzdWJmb3JtVGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICAgICAgaWYgKGN1cnJUYXNrICE9IG51bGwpXHJcbiAgICAgICAgICAgICg8RGF0YVZpZXc+Y3VyclRhc2suRGF0YVZpZXcpLnNldFByZXZDdXJyUmVjKCk7XHJcbiAgICAgICAgICBzdWJmb3JtVGFzay5Eb1N1YmZvcm1QcmVmaXhTdWZmaXggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRXhlY3V0ZXMgUmVjb3JkIFN1ZmZpeGVzIG9mIGFsbCBuZXN0ZWQgc3ViZm9ybXMgZnJvbSBib3R0b20gdG8gdG9wLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImN1cnJUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGFzeW5jIEV4ZWN1dGVOZXN0ZWRSUyhsYXN0VGFzazogVGFzayk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IGlzRXhlY3V0ZU5lc3RlZFJTOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUUNSICMxNjgzNDIuIEEgbmV3IHRhc2sgaXMgc2V0IGFzIGZvY3VzZWQgdGFzayBhZnRlciB0aGUgZmlyc3QgQ1AuXHJcbiAgICAvLyBTbyBpZiBpbiBDUCBVcGRhdGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIGN1cnJUYXNrIGlzIG51bGwuIEJ1dCB3ZSBtdXN0IHJlZnJlc2ggdGhlIHN1YmZvcm0uXHJcbiAgICBpZiAobGFzdFRhc2sgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG5cclxuICAgIC8vIERvIG5vdCBleGVjdXRlIHN1YmZvcm0gcmVmcmVzaCB3aGVuIHRoZSBmb2N1c2VkIHRhc2sgaXMgbm90IG9wZW5lZCBhcyBhIHN1YmZvcm0gKGl0IHdhcyBvcGVuZWQgZnJvbSBjYWxsIG9wZXJhdGlvbiksXHJcbiAgICAvLyBidXQgdGhlIGZvY3VzZWQgdGFzayBpcyBhIGNoaWxkIG9mIHRoZSBzdWJmb3JtIHRhc2suIFNlZSBmb3IgZXhhbXBsZSBRQ1IgIzQzMTg1MC5cclxuICAgIGlmICh0aGlzLmdldExldmVsKCkgIT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0sgJiYgbGFzdFRhc2suZ2V0TWdkSUQoKSAhPT0gdGhpcy5nZXRNZ2RJRCgpKVxyXG4gICAgICByZXR1cm4gaXNFeGVjdXRlTmVzdGVkUlM7XHJcblxyXG4gICAgZm9yIChsZXQgdGFzazogVGFzayA9IGxhc3RUYXNrOyB0YXNrICE9PSB0aGlzICYmIHRhc2sucGF0aENvbnRhaW5zKHRoaXMpICYmIHRhc2suZ2V0TGV2ZWwoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfVEFTSzsgdGFzayA9IDxUYXNrPnRhc2suZ2V0UGFyZW50KCkpIHtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaE5ld0V4ZWNTdGFja3MoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYKTtcclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucG9wTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICBpc0V4ZWN1dGVOZXN0ZWRSUyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlzRXhlY3V0ZU5lc3RlZFJTO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIFJlYyBzdWZmaXggZm9yIGFsbCBuZXN0ZWQgc3ViZm9ybXMgdW50aWxsIHN1YmZvcm0gdGFzayB0aGF0IGNvbnRhaW5zIHRoZXNlIDIgc3ViZm9ybXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VGFza1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBleGVjU3ViZm9ybVJlY1N1ZmZpeChuZXdUYXNrOiBUYXNrKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBzdWJmVGFzazogVGFzaztcclxuICAgIGxldCBpOiBudW1iZXIsIGlkeCA9IDA7XHJcbiAgICBmb3IgKGkgPSB0aGlzLl90YXNrUGF0aC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgc3ViZlRhc2sgPSB0aGlzLl90YXNrUGF0aC5nZXRfSXRlbShpIC0gMSk7XHJcbiAgICAgIGlmICghbmV3VGFzay5fdGFza1BhdGguQ29udGFpbnMoc3ViZlRhc2spKSB7XHJcbiAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHN1YmZUYXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgaWYgKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBDcmVhdGUgbW9kZSB0byBNb2RpZnkgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIG5vdCBhIG5ldyByZWNvcmQuXHJcbiAgICAgICAgLy8gU28gdGhlIG1vZGUgaXMgY2hhbmdlZCBvbmx5IGZvciB0aGUgZmlyc3QgcmVjb3JkIHRoYXQgd2FzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgIGlmIChzdWJmVGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICEoKDxEYXRhVmlldz5zdWJmVGFzay5EYXRhVmlldykuZ2V0Q3VyclJlYygpKS5pc05ld1JlYygpKVxyXG4gICAgICAgICAgc3ViZlRhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWR4ID0gbmV3VGFzay5fdGFza1BhdGguaW5kZXhPZihzdWJmVGFzayk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIERlYnVnLkFzc2VydChpID4gMCk7XHJcbiAgICByZXR1cm4gaWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgY291bnRlciBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPmNvdW50ZXI8L3JldHVybnM+XHJcbiAgZ2V0Q291bnRlcigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvdW50ZXI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5jcmVhc2UgdGhlIHRhc2tzIGNvdW50ZXIgYnkgMS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz5jb3VudGVyPC9yZXR1cm5zPlxyXG4gIGluY3JlYXNlQ291bnRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLl9jb3VudGVyICsgMTtcclxuICB9XHJcblxyXG4gIHNldENvdW50ZXIoY250OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NvdW50ZXIgPSBjbnQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgISFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclN0YXJ0UHJvZ0xldmVsID09PSBUYXNrLlN0YXJ0UHJvZ0xldmVsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDaGVjayBpZiByZWZlcmVuY2UgdG8gbWFpbiBwcm9ncmFtIGZpZWxkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZpZWxkU3RyXCI+YSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc01haW5Qcm9ncmFtRmllbGQoZmllbGRTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IEZpZWxkOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKGZpZWxkU3RyLCAnLCcpO1xyXG4gICAgbGV0IG1haW5Qcm9nRmllbGQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoRmllbGQubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgIGxldCBwYXJlbnQ6IG51bWJlciA9IE5OdW1iZXIuUGFyc2UoRmllbGQuZ2V0X0l0ZW0oMCkpO1xyXG4gICAgICBpZiAocGFyZW50ID09PSBUYXNrQmFzZS5NQUlOX1BSR19QQVJFTlRfSUQpXHJcbiAgICAgICAgbWFpblByb2dGaWVsZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Qcm9nRmllbGQ7XHJcbiAgfVxyXG5cclxuICBnZXRUYXNrSW5mbygpOiBzdHJpbmcge1xyXG4gICAgLy8gR2V0IHRoZSB0YXNrIG5hbWUgdXNpbmcgdGhlIGdldFByb3AoKSBhcyBuYW1lIGlzIG9ubHkgc2VyaWFsaXplZCBmb3IgZGVidWdcclxuICAgIGxldCB0YXNrTmFtZTogc3RyaW5nID0gKHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9OQU1FKSkuR2V0Q29tcHV0ZWRWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KCd7MH0gezF9Jyx0aGlzLmlzUHJvZ3JhbSgpID8gJ1Byb2dyYW0nOiAnU3VidGFzaycsIHRhc2tOYW1lKTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCIodGFzayB7MH0tXFxcInsxfVxcXCJ7Mn0pXCIsIHRoaXMuX3Rhc2tUYWcsIHRoaXMuTmFtZSwgc3VwZXIuaXNNYWluUHJvZygpID8gKFwiIGN0bCBcIiArIHRoaXMuX2N0bElkeCkgOiBcIlwiKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIENvbnN0cnVjdE1nRm9ybShhbHJlYWR5U2V0UGFyZW50Rm9ybTogUmVmUGFyYW08Ym9vbGVhbj4pOiBNZ0Zvcm1CYXNlIHtcclxuICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSBuZXcgTWdGb3JtKCk7XHJcbiAgICBsZXQgcGFyZW50Rm9ybTogTWdGb3JtQmFzZSA9ICh0aGlzLlBhcmVudFRhc2sgIT0gbnVsbCA/IHRoaXMuUGFyZW50VGFzay5nZXRGb3JtKCkgOiBudWxsKTtcclxuXHJcbiAgICAvLyBQYXJlbnRGb3JtIG9mIGFueSBmb3JtIHNob3VsZCBiZSBhIHZpc2libGUgb25lLiBJdCBtaWdodCBoYXBwZW4gdGhhdCB0aGUgUGFyZW50VGFza1xyXG4gICAgLy8gaXMgYSBub24taW50ZXJhY3RpdmUgdGFzayB3aXRoIE9wZW5XaW5kb3c9Tm8uIEluIHRoaXMgY2FzZSwgdGhlIFBhcmVudCBvZiB0aGUgbm9uLWludGVyYWN0aXZlXHJcbiAgICAvLyB0YXNrLCBzaG91bGQgYmUgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBmb3JtLlxyXG4gICAgd2hpbGUgKHBhcmVudEZvcm0gIT0gbnVsbCAmJiAhcGFyZW50Rm9ybS5nZXRUYXNrKCkuaXNPcGVuV2luKCkpIHtcclxuICAgICAgcGFyZW50Rm9ybSA9IHBhcmVudEZvcm0uUGFyZW50Rm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtLlBhcmVudEZvcm0gPSBwYXJlbnRGb3JtO1xyXG4gICAgYWxyZWFkeVNldFBhcmVudEZvcm0udmFsdWUgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGZvcm07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbWdkYXRhIElEIHRvIHdoaWNoIHRhc2sgYmVsb25nc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TWdkSUQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGEuR2V0SWQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcmVmZXJlbmNlIHRvIGN1cnJlbnQgTUdEYXRhXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRNR0RhdGEoKTogTUdEYXRhIHtcclxuICAgIHJldHVybiB0aGlzLl9tZ0RhdGE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJlZnJlc2ggdGhlIGRpc3BsYXksIHBhaW50IHRoZSBjb250cm9scyBhbmQgdGhlaXIgcHJvcGVydGllcyBhZ2FpbiA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVmcmVzaERpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5Gb3JtICE9PSBudWxsICYmICF0aGlzLmlzQWJvcnRpbmcoKSAmJiB0aGlzLmlzU3RhcnRlZCgpKSB7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgdGFzay5SZWZyZXNoRGlzcGxheSgpXCIpO1xyXG5cclxuICAgICAgLy8gcmVjb3JkcyBmcm9tIHRoZSBEYXRhVmlldyBhbmQgcmVmcmVzaGVzIHRoZSByb3dzLlxyXG4gICAgICAvLyBOb3csIFRhc2suUmVmcmVzaERpc3BsYXkoKSBpcyBjYWxsZWQgZnJvbSAyIHBsYWNlczpcclxuICAgICAgLy8gMS4gd2hpbGUgaW5pdGluZyB0aGUgZm9ybVxyXG4gICAgICAvLyAyLiB3aGVuIGNvbWluZyBiYWNrIGZyb20gc2VydmVyXHJcbiAgICAgIC8vIEluIGNhc2UgIzEsIHdlIGRvIG5vdCBuZWVkIHRvIHJlZnJlc2ggdGhlIHRhYmxlIGFzIGl0IGlzIGRvbmUgZnJvbSBmaXJzdFRhYmxlUmVmcmVzaCgpLlxyXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNhbiBiZSBlbGltaW5hdGVkLlxyXG4gICAgICBpZiAodGhpcy5fcmVmcmVzaFR5cGUgIT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORSkge1xyXG4gICAgICAgIGxldCBmb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuRm9ybTtcclxuICAgICAgICBsZXQgd2FzUmVmcmVzaGVkOiBib29sZWFuID0gYXdhaXQgZm9ybS5SZWZyZXNoRGlzcGxheShDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk0pO1xyXG4gICAgICAgIGlmICh3YXNSZWZyZXNoZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3JlZnJlc2hUeXBlID0gQ29uc3RhbnRzLlRBU0tfUkVGUkVTSF9OT05FO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIkVuZCB0YXNrLlJlZnJlc2hEaXNwbGF5KClcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGdldCB0aGUgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICAvLyBUT0RPIHNhZGhhbiByZW1vdmUgdW51c2VkXHJcbiAgLy8gYXN5bmMgZ2V0RmllbGRWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgLy8gICB2YWx1ZS52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmdldFZhbHVlKGZhbHNlKTtcclxuICAvLyAgIGlzTnVsbC52YWx1ZSA9IGF3YWl0ICg8RmllbGQ+ZmllbGREZWYpLmlzTnVsbCgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIGRpc3BsYXkgdmFsdWUgb2YgYSBmaWVsZC4gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImZpZWxkRGVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsXCI+PC9wYXJhbT5cclxuICBnZXRGaWVsZERpc3BsYXlWYWx1ZShmaWVsZERlZjogRmllbGREZWYsIHZhbHVlOiBSZWZQYXJhbTxzdHJpbmc+LCBpc051bGw6IFJlZlBhcmFtPGJvb2xlYW4+KTogdm9pZCB7XHJcbiAgICB2YWx1ZS52YWx1ZSA9ICg8RmllbGQ+ZmllbGREZWYpLmdldERpc3BWYWx1ZSgpO1xyXG4gICAgaXNOdWxsLnZhbHVlID0gKDxGaWVsZD5maWVsZERlZikuaXNOdWxsKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHVwZGF0ZXMgdGhlIGZpZWxkJ3MgdmFsdWUgYW5kIHN0YXJ0cyByZWNvbXB1dGUuIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaWVsZERlZlwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmFsdWVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgYXN5bmMgVXBkYXRlRmllbGRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKGZpZWxkRGVmOiBGaWVsZERlZiwgdmFsdWU6IHN0cmluZywgaXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5UYXNrUHJlZml4RXhlY3V0ZWQpIHtcclxuICAgICAgYXdhaXQgKDxGaWVsZD5maWVsZERlZikuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZSh2YWx1ZSwgaXNOdWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgYSByaWNoY2xpZW50IHRhc2tzLCBjaGVjayBpZiBOb24tSW50ZXJhY3RpdmUgdGFzayBjaGlsZCBzaG91bGQgYmUgTW9kYWwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZTwvcmV0dXJucz5cclxuICBTaG91bGROb25JbnRlcmFjdGl2ZUNoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlNob3VsZENoaWxkQmVNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDaGVjayBpZiBhIHRhc2tzIGNoaWxkIHNob3VsZCBiZSBtb2RhbFxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFNob3VsZENoaWxkQmVNb2RhbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyB3aW5kb3cgaXMgb3BlbmVkIGFuZCBvZiBtb2RhbCB0eXBlIChkb2Vzbid0IG1hdHRlciBpZiBpbnRlcmFjdGl2ZSBvciBub3QpXHJcbiAgICBpZiAoKHRoaXMuRm9ybS5Db25jcmV0ZVdpbmRvd1R5cGUgPT09IFdpbmRvd1R5cGUuT3ZlcmxheSkgJiYgdGhpcy5nZXRGb3JtKCkuT3BlbmVkKVxyXG4gICAgICBjaGlsZFNob3VsZEJlaGF2ZUFzTW9kYWwgPSB0cnVlO1xyXG4gICAgZWxzZSBpZiAoIXRoaXMuSXNJbnRlcmFjdGl2ZSkge1xyXG4gICAgICAgIGNoaWxkU2hvdWxkQmVoYXZlQXNNb2RhbCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRTaG91bGRCZWhhdmVBc01vZGFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgcGFyZW50IHRhc2sgb2YgdGhpcyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQYXJlbnQoKTogVGFza0Jhc2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgdGFzayBpcyB0aGUgY2hlY2tlZCB0YXNrIG9yIGEgZGVzY2VuZGFudCBvZiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNEZXNjZW5kZW50T2YoY2hrVGFzazogVGFza0Jhc2UpOiBib29sZWFuIHtcclxuICAgIGlmIChjaGtUYXNrID09PSB0aGlzKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKGNoa1Rhc2sgPT09IG51bGwgfHwgdGhpcy5fcGFyZW50VGFzayA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnRUYXNrLmlzRGVzY2VuZGVudE9mKGNoa1Rhc2spO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgc3ViZm9ybUN0cmwgd2hpY2ggaXMgTW9kYWwgaW4gY3VycmVudCBydW50aW1lIHRyZWUgaWYgdGhlcmUgaXMgYW55Py5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBHZXRTdWJmb3JtTW9kYWxQYXJlbnRUYXNrKCk6IE1nQ29udHJvbCB7XHJcbiAgICBsZXQgY3VyclRhc2s6IFRhc2sgPSB0aGlzO1xyXG4gICAgd2hpbGUgKGN1cnJUYXNrLl9wYXJlbnRUYXNrICE9IG51bGwgJiYgY3VyclRhc2suX3BhcmVudFRhc2suZ2V0SXNEZXN0aW5hdGlvbkNhbGwoKSkge1xyXG4gICAgICBsZXQgc3ViZm9ybUN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+KGN1cnJUYXNrLl9wYXJlbnRUYXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpKTtcclxuICAgICAgaWYgKHN1YmZvcm1DdHJsLklzTW9kYWwoKSlcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybiBzdWJmb3JtQ3RybDtcclxuICAgICAgfVxyXG4gICAgICBjdXJyVGFzayA9IGN1cnJUYXNrLl9wYXJlbnRUYXNrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdHJ1ZSBmb3IgcmVtb3RlIHRhc2sgZm9yIGV4cHJlc3Npb24gdGhhdCB3YXMgY29tcHV0ZWQgb25jZSBvbiBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgU2hvdWxkRXZhbHVhdGVQcm9wZXJ0eUxvY2FsbHkocHJvcElkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlRhc2tTZXJ2aWNlLlNob3VsZEV2YWx1YXRlUHJvcGVydHlMb2NhbGx5KHByb3BJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRoaXMgbWV0aG9kIHJ1bnMgYWN0aW9ucyBhZnRlciB0aGUgJ2Zvcm0nIHRhZyBpcyBoYW5kbGVkLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgRW5zdXJlVmFsaWRGb3JtKCk6IHZvaWQge1xyXG4gICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kOlxyXG4gICAgLy8gSWYgdGhpcyB0YXNrIGlzIHRoZSBtYWluIHByb2dyYW0gYW5kIF9vcGVuV2luIGV2YWx1YXRlcyB0byAnZmFsc2UnLCB0aGVuXHJcbiAgICAvLyBwcmV2ZW50IHRoZSBkaXNwbGF5IG9mIHRoZSBmb3JtLCBieSBzZXR0aW5nIGl0IHRvICdudWxsJy5cclxuICAgIGlmICh0aGlzLl9pc01haW5QcmcgJiYgdGhpcy5Gb3JtICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICghdGhpcy5fb3BlbldpbiB8fCAhdGhpcy5Gb3JtLmlzTGVnYWxGb3JtKSB7ICAgLy8gVGhpcyBjYW4gYmUgbWRpIGZyYW1lXHJcbiAgICAgICAgdGhpcy5Gb3JtID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjb21wdXRlIHRoZSBtYWluIGRpc3BsYXkgb25jZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBhc3luYyBDb21wdXRlTWFpbkRpc3BsYXkoKTpQcm9taXNlPHZvaWQ+ICB7XHJcbiAgICBsZXQgcHJvcE1haW5EaXNwbGF5OiBQcm9wZXJ0eSA9IHRoaXMuZ2V0UHJvcChQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9NQUlOX0RJU1BMQVkpO1xyXG4gICAgLy8gZ2V0IHRoZSB2YWx1ZSBvZiBtYWluIGRpc3BsYXlcclxuICAgIGxldCBtYWluRGlzcGxheUluZGV4OiBudW1iZXIgPSBhd2FpdCBwcm9wTWFpbkRpc3BsYXkuZ2V0VmFsdWVJbnQoKTtcclxuXHJcbiAgICBtYWluRGlzcGxheUluZGV4ID0gdGhpcy5HZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uQ3VycmVudFRhc2sobWFpbkRpc3BsYXlJbmRleCk7XHJcblxyXG4gICAgdGhpcy5fZm9ybXMuSW5pdEZvcm1Gcm9tWG1sU3RyaW5nKG1haW5EaXNwbGF5SW5kZXgpO1xyXG4gICAgdGhpcy5FbnN1cmVWYWxpZEZvcm0oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcHJlcGFyZSB0YXNrIGZvcm1cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFByZXBhcmVUYXNrRm9ybSgpOiBQcm9taXNlPFJldHVyblJlc3VsdD4ge1xyXG4gICAgYXdhaXQgVGFza1NlcnZpY2VCYXNlLlByZXBhcmVQcm9wT3BlblRhc2tXaW5kb3codGhpcyk7XHJcbiAgICByZXR1cm4gYXdhaXQgUmVtb3RlVGFza1NlcnZpY2UuUHJlcGFyZVByb3BNYWluRGlzcGxheSh0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRydWUgaWYgZm9ybSBpcyBsZWdhbFxyXG4gIC8vLyB3ZSBhcmUgbm90IGdldCB0byB0aGF0IG1ldGhvZCBmb3IgbWFpbiBkaXNwbGF5IHRoYXQgb3BlbiB3aW5kb3cgaXMgZmFsc2VcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgRm9ybUlzTGVnYWwoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNGb3JtSXNMZWdhbDogYm9vbGVhbiA9IHN1cGVyLmlzTWFpblByb2coKTtcclxuICAgIHJldHVybiBpc0Zvcm1Jc0xlZ2FsIHx8IHN1cGVyLmdldEZvcm0oKS5pc0xlZ2FsRm9ybTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IHRoZSBtYWluIGRpc3BsYXkgb24gc3R1ZGlvIGRlcHRoXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtYWluRHNwSWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIEdldFJlYWxNYWluRGlzcGxheUluZGV4T25EZXB0aChtYWluRHNwSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG5cclxuICAgIHdoaWxlICh0YXNrICE9IG51bGwpIHtcclxuICAgICAgbWFpbkRzcElkeCArPSB0YXNrLl9mb3Jtcy5Db3VudDtcclxuICAgICAgdGFzayA9IHRhc2suTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1haW5Ec3BJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0aGUgbWFpbiBkaXNwbGF5IG9uIHN0dWRpbyBkZXB0aFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibWFpbkRzcElkeFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRSZWFsTWFpbkRpc3BsYXlJbmRleE9uQ3VycmVudFRhc2sobWFpbkRzcElkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChtYWluRHNwSWR4ID4gMSkge1xyXG5cclxuICAgICAgbGV0IHRhc2s6IFRhc2sgPSB0aGlzLkxvZ2ljYWxTdHVkaW9QYXJlbnRUYXNrO1xyXG5cclxuICAgICAgd2hpbGUgKHRhc2sgIT0gbnVsbCkge1xyXG4gICAgICAgIG1haW5Ec3BJZHggLT0gdGFzay5fZm9ybXMuQ291bnQ7XHJcbiAgICAgICAgdGFzayA9IHRhc2suTG9naWNhbFN0dWRpb1BhcmVudFRhc2s7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWFpbkRzcElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0IEFuY2VzdG9yIHRhc2sgKG9uIHJ1bnRpbWUgdHJlZSkgb2YgdGhlIHNlbmQgdGFzayBkZWZpbml0aW9uIGlkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJmaW5kVGFza0RlZmluaXRpb25JZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRBbmNlc3RvclRhc2tCeVRhc2tEZWZpbml0aW9uSWQoZmluZFRhc2tEZWZpbml0aW9uSWQ6IFRhc2tEZWZpbml0aW9uSWQpOiBUYXNrIHtcclxuICAgIGxldCBjdXJyZW50VGFzazogVGFzayA9IHRoaXM7XHJcblxyXG4gICAgLy8gRml4ZWQgYnVnICM6MTcyOTU5XHJcbiAgICAvLyBpZiB0aGUgZmluZFRhc2tEZWZpbml0aW9uSWQgaXMgbWFpbiBwcm9ncmFtIChjYW4gYmUgb2YgY29tcG9uZW50KSB3ZSB3aWxsIG5vdCBmb3VuZCBpdCBpbiB0aGUgX3BhcmVudFRhc2tcclxuICAgIC8vIHNvIHdlIHdpbGwgdGFrZSB0aGUgdGFzayBmcm9tIHRoZSBNR0RhdGFUYWJsZVxyXG4gICAgaWYgKGZpbmRUYXNrRGVmaW5pdGlvbklkLklzTWFpblByb2dyYW0oKSlcclxuICAgICAgcmV0dXJuIDxUYXNrPkd1aURhdGFDb2xsZWN0aW9uLk1HRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgodGhpcy5Db250ZXh0SUQsIGZpbmRUYXNrRGVmaW5pdGlvbklkLkN0bEluZGV4KTtcclxuXHJcbiAgICB3aGlsZSAoY3VycmVudFRhc2sgIT0gbnVsbCkge1xyXG4gICAgICBpZiAoY3VycmVudFRhc2suVGFza0RlZmluaXRpb25JZC5FcXVhbHMoZmluZFRhc2tEZWZpbml0aW9uSWQpKVxyXG4gICAgICAgIHJldHVybiBjdXJyZW50VGFzaztcclxuXHJcbiAgICAgIGN1cnJlbnRUYXNrID0gY3VycmVudFRhc2suX3BhcmVudFRhc2s7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBTZXREYXRhQ29udHJvbFZhbHVlc1JlZmVyZW5jZShjb250cm9sSWQ6IG51bWJlciwgZGNWYWx1ZXNJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sQmFzZSA9IHN1cGVyLmdldEZvcm0oKS5nZXRDdHJsKGNvbnRyb2xJZCk7XHJcbiAgICBjdHJsLnNldERjVmFsSWQoZGNWYWx1ZXNJZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRpc3BsYXkgdGVzdCBvbiBzdGF0dXMgYmFyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0ZXh0XCI+PC9wYXJhbT5cclxuICBEaXNwbGF5TWVzc2FnZVRvU3RhdHVzQmFyKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gUWNyICM3OTgzMTEuIGlmIHNlcnZlciBzaWRlIGhhZCBNUCBkb2luZyB2ZXJpZnkgdG8gcGFuZSBhbmQgTVAgaGFzIG5vIGZvcm1cclxuICAgIC8vIHdlIHdpbGwgZ2V0IGFuIGV4Y2VwdGlvbi4gc28gaW4gY2FzZSBvZiBubyBmb3JtLCBnZXQgaXQgZnJvbSBsYXN0IGZvY3VzZWQgdGFzay5cclxuICAgIGxldCB0YXNrVG9WZXJpZnlPbjogVGFzayA9IDxUYXNrPiB0aGlzLkdldENvbnRleHRUYXNrKCk7XHJcbiAgICBpZiAodGFza1RvVmVyaWZ5T24uZ2V0Rm9ybSgpID09IG51bGwpXHJcbiAgICAgIHRhc2tUb1ZlcmlmeU9uID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG5cclxuICAgIHRhc2tUb1ZlcmlmeU9uLldyaXRlVG9NZXNzYWdlUGFuZSh0ZXh0KTtcclxuICB9XHJcblxyXG5cclxuICBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcigpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLmdldEZvcm0oKSAhPSBudWxsKVxyXG4gICAgICBpc1RhYmxlV2l0aEFic29sdXRlc1Njcm9sbGJhciA9ICg8TWdGb3JtPnRoaXMuZ2V0Rm9ybSgpKS5pc1RhYmxlV2l0aEFic29sdXRlU2Nyb2xsYmFyKCk7XHJcblxyXG4gICAgcmV0dXJuIGlzVGFibGVXaXRoQWJzb2x1dGVzU2Nyb2xsYmFyO1xyXG4gIH1cclxuXHJcbiAgR2V0VGFza0RldGFpbHMoKTogc3RyaW5nIHtcclxuICAgIGxldCBuYW1lcyA9ICAodGhpcy5nZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX05BTUUpKS5HZXRDb21wdXRlZFZhbHVlKCk7XHJcbiAgICBsZXQgdGFzazogVGFzayA9IHRoaXM7XHJcbiAgICB3aGlsZSAodGFzay5QYXJlbnRUYXNrICE9PSBudWxsICYmICF0YXNrLlBhcmVudFRhc2suaXNNYWluUHJvZygpKSB7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50YXNrLlBhcmVudFRhc2s7XHJcbiAgICAgIG5hbWVzID0gICh0YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfTkFNRSkpLkdldENvbXB1dGVkVmFsdWUoKSArIFwiLlwiICsgbmFtZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5hbWVzO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcGFyc2VzIHRoZSB0YXNrVVJMIHRhZ1xyXG4gIC8vLyBldmVyeSB0YXNrVVJMIHRhZyBpcyByZXBsYWNlZCBieSB0aGUgZGF0YSBvZiB0aGUgeG1sIGlzbGFuZCBpdCByZWZlcnMgdG88L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIFByb2Nlc3NUYXNrVVJMKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHhtbERhdGE6IHN0cmluZyA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1MZGF0YSgpO1xyXG4gICAgbGV0IGVuZFRhc2tVcmxJZHg6IG51bWJlciA9IHhtbERhdGEuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIERlYnVnLkFzc2VydChlbmRUYXNrVXJsSWR4ICE9PSAtMSAmJiBlbmRUYXNrVXJsSWR4IDwgeG1sRGF0YS5sZW5ndGgpO1xyXG5cclxuICAgIC8vIGV4dHJhY3QgdGhlIHRhc2sgdXJsIGFuZCB0aGUgcmVmIGxpc3RcclxuICAgIGxldCB0YWc6IHN0cmluZyA9IFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZFRhc2tVcmxJZHgpO1xyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMKSArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCk7XHJcblxyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRUYXNrVXJsSWR4KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgIGxldCB0YXNrQ2FjaGVVUkw6IHN0cmluZyA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbSgxKTtcclxuICAgIGxldCByZWZMaXN0U3RyOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oMyk7XHJcblxyXG4gICAgbGV0IHRhc2tDb250ZW50T3JpZ2luYWw6IHN0cmluZyA9IFwiXCI7IC8vIGRhdGEgb2YgdGhlIHRhc2sgcmVhZCBmcm9tIHRhc2tDYWNoZVVSTFxyXG5cclxuICAgIGlmKHRhc2tDYWNoZVVSTC50cmltKCkgIT0gXCJcIikge1xyXG4gICAgICAvLyBicmluZyB0aGUgZGF0YVxyXG5cclxuICAgICAgaWYodGFza0NhY2hlVVJMLnN0YXJ0c1dpdGgoXCIuL1wiKSlcclxuICAgICAgIHRhc2tDYWNoZVVSTD0gTlN0cmluZy5SZXBsYWNlKHRhc2tDYWNoZVVSTCwgJy4vJywgQ2xpZW50TWFuYWdlci5HZXRBc3NldHNVUkwoKSArICcvY2FjaGUvJyk7XHJcblxyXG4gICAgICB0YXNrQ29udGVudE9yaWdpbmFsID0gYXdhaXQgVGFzay5Db21tYW5kc1Byb2Nlc3Nvci5HZXRDb250ZW50KHRhc2tDYWNoZVVSTCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJlZml4IHRoZSBvcmlnaW5hbCBkYXRhIHRpbGwgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IDx0YXNrVVJMPlxyXG4gICAgbGV0IHRhc2tDb250ZW50RmluYWw6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih4bWxEYXRhLnN1YnN0cigwLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLmdldEN1cnJJbmRleCgpIC0gKENvbnN0SW50ZXJmYWNlLk1HX1RBR19UQVNLVVJMLmxlbmd0aCArIDEpKSwgdGFza0NvbnRlbnRPcmlnaW5hbC5sZW5ndGgpO1xyXG4gICAgLy8gdGhlIG51bWJlciBvZiB0b2tlbnMgaW4gcmVmTGlzdCBhbmQgdGhlIG51bWJlciBvZiBsb2NhdGlvbiBpbiB0aGUgeG1sIHRvIGJlIHJlcGxhY2VkIChpLmUuIHRoZSBwbGFjZXMgd2l0aCBbOikgc2hvdWxkIGJlIGVxdWFsXHJcbiAgICBsZXQgcmVmbGlzdDogTGlzdDxzdHJpbmc+ID0gdGhpcy5nZXRSZWZsaXN0KHJlZkxpc3RTdHIsICc7JywgdHJ1ZSwgLTEpO1xyXG4gICAgbGV0IHJlZkxpc3RJZHggPSAwO1xyXG5cclxuICAgIGxldCBjdXJySWR4OiBudW1iZXIgPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiKTtcclxuICAgIGxldCBwcmV2SWR4OiBudW1iZXIgPSAwO1xyXG4gICAgd2hpbGUgKGN1cnJJZHggIT09IC0xKSB7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgsIGN1cnJJZHggLSBwcmV2SWR4KSk7XHJcbiAgICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHJlZmxpc3QuZ2V0X0l0ZW0ocmVmTGlzdElkeCsrKSk7XHJcbiAgICAgIGN1cnJJZHggKz0gMjtcclxuICAgICAgcHJldklkeCA9IGN1cnJJZHg7XHJcbiAgICAgIGN1cnJJZHggPSB0YXNrQ29udGVudE9yaWdpbmFsLmluZGV4T2YoXCJbOlwiLCBwcmV2SWR4KTtcclxuICAgIH1cclxuICAgIHRhc2tDb250ZW50RmluYWwuQXBwZW5kKHRhc2tDb250ZW50T3JpZ2luYWwuc3Vic3RyKHByZXZJZHgpKTtcclxuXHJcbiAgICAvLyBzdWZmaXggdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHhtbCBmcm9tIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgPC90YXNrVVJMPlxyXG4gICAgdGFza0NvbnRlbnRGaW5hbC5BcHBlbmQoeG1sRGF0YS5zdWJzdHIoeG1sRGF0YS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIGVuZFRhc2tVcmxJZHggKyAxKSArIDEpKTtcclxuICAgIHhtbERhdGEgPSB0YXNrQ29udGVudEZpbmFsLlRvU3RyaW5nKCk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJ7MH0gLS0tLS0tLT4gezF9XCIsIHRhc2tDYWNoZVVSTCwgeG1sRGF0YSkpO1xyXG5cclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YSh4bWxEYXRhKTtcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0Q3VyckluZGV4KFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuZ2V0Q3VyckluZGV4KCkgLSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1RBU0tVUkwubGVuZ3RoICsgMSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBwYXJzZXMgdGhlIGRhdGEgYWNvcmRpbmcgdG8gdGhlIGRlbGltZXRlciBhbmQgdGhlIHJlZmxpc3QgZGVsaW1ldGVycyBsb2dpYzwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZWxpbVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidHJ1bmNcIj5pZiB0cnVlIHRydWNhdGUgZmlyc3QgJ1xcXFwnIChpbiB1c2UgZm9yIGlzbGFuZCBkYXRhIHBhcnNpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1heFRva2Vuc1wiPmlmIC0xIGFsbCB0b2tlbnMgYXZpYWxhYmxlIGVsc2UgdGhlIG51bWJlciBvZiB0b2tlbnMgdG8gc2VhcmNoPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkYXRhXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRSZWZsaXN0KGRhdGE6IHN0cmluZywgZGVsaW06IHN0cmluZywgdHJ1bmM6IGJvb2xlYW4sIG1heFRva2VuczogbnVtYmVyKTogTGlzdDxzdHJpbmc+IHtcclxuICAgIGxldCBjdXJyU3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgIGxldCBsaXN0OiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcbiAgICBsZXQgdG9rZW5zQ250OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNpbmNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYWx3YXlzICc7JyB3ZSBzdGFydCBmcm9tIDFcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjdXJyOiBzdHJpbmcgPSBkYXRhLmNoYXJBdChpKTtcclxuXHJcbiAgICAgIGlmIChjdXJyICE9PSAnXFxcXCcgJiYgY3VyciAhPT0gZGVsaW0pXHJcbiAgICAgICAgY3VyclN0ci5BcHBlbmQoY3Vycik7XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09IGRlbGltKSB7XHJcbiAgICAgICAgbGlzdC5wdXNoKGN1cnJTdHIuVG9TdHJpbmcoKSk7XHJcbiAgICAgICAgY3VyclN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcbiAgICAgICAgdG9rZW5zQ250Kys7XHJcblxyXG4gICAgICAgIGlmICh0b2tlbnNDbnQgPT09IG1heFRva2VucylcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGN1cnIgPT09ICdcXFxcJykge1xyXG4gICAgICAgIC8vIHRoZSBmb3JtYXQgJ1xcXFxkZWxpbWl0ZXInIGlzIGFsd2F5cyB0cnVuY2F0ZWRcclxuICAgICAgICBpZiAoIXRydW5jICYmIGRhdGEuY2hhckF0KGkgKyAxKSAhPT0gZGVsaW0pXHJcbiAgICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcblxyXG4gICAgICAgIGkrKztcclxuICAgICAgICBjdXJyU3RyLkFwcGVuZChkYXRhLmNoYXJBdChpKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBhcHBlbmQgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcmVmIGxpc3RcclxuICAgIGxpc3QucHVzaChjdXJyU3RyLlRvU3RyaW5nKCkpO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGFuZCBzZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGNvbnRyb2wuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgU3RhcnRQcm9ncmFtKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuLCBtb3ZlVG9GaXJzdENvbnRyb2w6IGJvb2xlYW4pOiBQcm9taXNlPFRhc2s+IHtcclxuICAgIGxldCBvcmdTdG9wRXhlY3V0aW9uOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ6IFRhc2sgPSBudWxsO1xyXG4gICAgbGV0IGFsbG93RXZlbnRzOiBFdmVudHNBbGxvd2VkVHlwZSA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldEFsbG93RXZlbnRzKCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhFdmVudHNBbGxvd2VkVHlwZS5BTEwpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiU3RhcnQgXFxcInN0YXJ0UHJvZ1xcXCJcIik7XHJcbiAgICBUYXNrLlN0YXJ0UHJvZ0xldmVsKys7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTsgLy8gUUNSICM3Njk3MzQgLSBub3RoaW5nIGNhbiBzdG9wIGEgdGFzayBmcm9tIHN0YXJ0aW5nIHVwLlxyXG5cclxuICAgIC8vIEZpeGVkIGJ1ZyAjMjgzNjQ3IGV4ZWN1dGUgY29tcG9uZW50cyBtYWluIHByb2dyYW1zIC0gIGluIHRoZSBzZXJ2ZXIgd2UgZXhlY3V0ZSB0aGUgc2FtZSBzZWUgaW5pLmNwcCBtZXRob2QgZXhlY3V0ZV9tYWluX3Byb2dzKClcclxuICAgIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCA9IGF3YWl0IHRoaXMuRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sKTtcclxuXHJcbiAgICAvLyBleGVjdXRlIGludGVybmFsIG1haW4gcHJvZ3JhbXNcclxuICAgIGxldCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWY6IFJlZlBhcmFtPFRhc2s+ID0gbmV3IFJlZlBhcmFtKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCk7XHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFza1JlZjogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBhd2FpdCBUYXNrLkV4ZWN1dGVNYWluUHJvZ3JhbSgwLCBjYWxsQnlEZXN0U3ViRm9ybSwgbW92ZVRvRmlyc3RDb250cm9sLCBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2tSZWYsIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZSk7XHJcbiAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQgPSBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRSZWYudmFsdWU7XHJcblxyXG4gICAgaWYgKCFUYXNrLl9pZGxlVGltZXJTdGFydGVkKSB7XHJcbiAgICAgIEdVSU1hbmFnZXIuSW5zdGFuY2Uuc3RhcnRUaW1lcihBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLCBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRJZGxlVGltZSgwKSwgdHJ1ZSk7XHJcbiAgICAgIFRhc2suX2lkbGVUaW1lclN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHRoaXMuT3BlbkZvcm1zKGNhbGxCeURlc3RTdWJGb3JtKTtcclxuICAgIGF3YWl0IHRoaXMuRG9GaXJzdFJlY29yZEN5Y2xlKCk7XHJcbiAgICBhd2FpdCB0aGlzLk1vdmVUb0ZpcnN0Q29udHJvbHMoY2FsbEJ5RGVzdFN1YkZvcm0pO1xyXG5cclxuXHJcbiAgICAvLyBIYW5kbGUgdGhlIGV2ZW50cyBvbmx5IHdoZW4gYWxsIHRoZSB0YXNrcyBhbmQgdGhlaXIgZm9ybXMgYXJlIG9wZW5lZC5cclxuICAgIGlmIChUYXNrLlN0YXJ0UHJvZ0xldmVsID09PSAxKSB7XHJcbiAgICAgIGxldCByZXNldEFsbG93RXZlbnRzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGxldCBjYW5FeGVjdXRlRXZlbnRzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIHNldCB0aGUgd2l0aGluIG5vbiBpbnRlcmFjdGl2ZSBzaW5jZSB0aGUgaGFuZGxlRXZlbnRzIG1pZ2h0IHRyeSB0byBleGVjdXRlIGFuIGV2ZW50XHJcbiAgICAgIC8vIHRoYXQgd2FzIHJhaXNlZCBpbiB0aGUgMXN0IHJlYyBwcmVmIChhZGRlZCBpbiBtb3ZlVG9GaXJzdGNvbnRyb2xzKS5cclxuICAgICAgaWYgKG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCAhPT0gbnVsbCAmJiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNTdGFydGVkKCkpIHtcclxuICAgICAgICByZXNldEFsbG93RXZlbnRzID0gdHJ1ZTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXROb25JbnRlcmFjdGl2ZUFsbG93RXZlbnRzKGF3YWl0IG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZC5pc0FsbG93RXZlbnRzKCkpO1xyXG5cclxuICAgICAgICAvLyBub24gaW50ZXJhY3RpdmUgdGFzayB3aXRoIGFsbG93IGV2ZW50cyA9IE5PIGlzIGFib3V0IHRvIHJ1bi5cclxuICAgICAgICAvLyBkb24ndCB0cnkgdG8gZXhlY3V0ZSB0aGUgZXZlbnRzIGJlZm9yZSBpdCBzdGFydHMgYmVjYXVzZSB0aGV5IHdpbGwgYmUgbG9zdC4gKCMxMzg0OTMpXHJcbiAgICAgICAgY2FuRXhlY3V0ZUV2ZW50cyA9IGF3YWl0ICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQuaXNBbGxvd0V2ZW50cygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiB0aGUgaXQgaXMgYSBzdWJmb3JtIHdpdGggdmlzaWJpbGl0eSBleHByZXNzaW9uIGV2YWx1YXRlZCB0byBUUlVFLFxyXG4gICAgICAvLyBzbyBhZnRlciByZXR1cm4gZnJvbSB0aGUgc2VydmVyIGRvIG5vdCBleGVjdXRlIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZS5cclxuICAgICAgLy8gVGhlc2UgZXZlbnRzIHdpbGwgYmUgZXhlY3V0ZWQgZnJvbSB0aGUgJ3N0YXJ0UHJvZycgb2YgdGhlIHBhcmVudCB0YXNrLlxyXG4gICAgICBpZiAoTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpICE9PSBudWxsICYmIGNhbkV4ZWN1dGVFdmVudHMpIHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wdXNoTmV3RXhlY1N0YWNrcygpO1xyXG4gICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUV2ZW50cyhBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0Q3Vyck1HRGF0YSgpLCAwKTtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc3RvcmUuIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4gaXQgd2lsbCBiZSBzZXQgYWdhaW4gb25jZSBpbiB0aGUgY29ycmVjdCBldmVudHNMb29wLlxyXG4gICAgICBpZiAocmVzZXRBbGxvd0V2ZW50cylcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRBbGxvd0V2ZW50cyhhbGxvd0V2ZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgVGFzay5TdGFydFByb2dMZXZlbC0tO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiRW5kIFxcXCJzdGFydFByb2dcXFwiXCIpO1xyXG5cclxuICAgIC8vIElmIG9yaWdpbmFsbHkgd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIHN0b3AgZXZlbnRzIGV4ZWN1dGlvbiwgdGhlbiByZXN0b3JlIHRoaXNcclxuICAgIGlmIChvcmdTdG9wRXhlY3V0aW9uICYmICFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbiAmJiAhQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKG9yZ1N0b3BFeGVjdXRpb24pO1xyXG5cclxuICAgIHJldHVybiBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBleGVjdXRlIGNvbXBvbmVudCdzIG1haW4gcHJvZ3JhbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY2FsbEJ5RGVzdFN1YkZvcm1cIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm1vdmVUb0ZpcnN0Q29udHJvbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSBub24gaW50ZXJhY3RpdmUgdGFzayBpZiBhbnkgdGhhdCBleGVjdXRlZDwvcmV0dXJucz5cclxuICBzdGF0aWMgYXN5bmMgRXhlY3V0ZUNvbXBvbmVudE1haW5Qcm9ncmFtcyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuKTogUHJvbWlzZTxUYXNrPiB7IC8vIGdvIHdpdGggU3RhcnRQcm9ncmFtXHJcbiAgICBsZXQgY3VycmVudE5vbkludGVyYWN0aXZlVGFzazogUmVmUGFyYW08VGFzaz4gPSBuZXcgUmVmUGFyYW0obnVsbCk7XHJcbiAgICBsZXQgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBSZWZQYXJhbTxUYXNrPiA9IG5ldyBSZWZQYXJhbShudWxsKTtcclxuXHJcbiAgICBsZXQgbWF4Q3RsSWR4OiBudW1iZXIgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKDApLmdldE1heEN0bElkeCgpO1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbWF4Q3RsSWR4OyBpID0gaSArIDEpIHtcclxuICAgICAgbGV0IGNvbXBvbmVudE1haW5Qcm9ncmFtOiBUYXNrID0gPFRhc2s+QWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIGkpO1xyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudE1haW5Qcm9ncmFtICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IFRhc2suRXhlY3V0ZU1haW5Qcm9ncmFtKGksIGNhbGxCeURlc3RTdWJGb3JtLCBtb3ZlVG9GaXJzdENvbnRyb2wsIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2ssIG5vbkludGVyYWN0aXZlVGFza0FscmVhZHlFeGVjdXRlZCwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZXhlY3V0ZSBtYWluIHByb2dyYW0gb2YgQ3RsSW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkN0bEluZGV4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjYWxsQnlEZXN0U3ViRm9ybVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibW92ZVRvRmlyc3RDb250cm9sXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWRcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIEV4ZWN1dGVNYWluUHJvZ3JhbShDdGxJbmRleDogbnVtYmVyLCBjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbiwgbW92ZVRvRmlyc3RDb250cm9sOiBib29sZWFuLCBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrOiBSZWZQYXJhbTxUYXNrPiwgbm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkOiBSZWZQYXJhbTxUYXNrPiwgbWdEYXRhVGFibGU6IElNR0RhdGFDb2xsZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWFpblByb2dyYW1UYXNrOiBUYXNrID0gPFRhc2s+bWdEYXRhVGFibGUuR2V0TWFpblByb2dCeUN0bElkeCgtMSwgQ3RsSW5kZXgpO1xyXG5cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiICBDbGllbnRNYW5hZ2VyLnN0YXJ0UHJvZzogY3RsSWR4PXswfSwgdGFzaz17MX1cIiwgQ3RsSW5kZXgsIG1haW5Qcm9ncmFtVGFzaykpO1xyXG5cclxuICAgIGN1cnJlbnROb25JbnRlcmFjdGl2ZVRhc2sudmFsdWUgPSAgPFRhc2s+KGF3YWl0IG1haW5Qcm9ncmFtVGFzay5TdGFydChtb3ZlVG9GaXJzdENvbnRyb2wsIGNhbGxCeURlc3RTdWJGb3JtKSk7XHJcbiAgICBpZiAobm9uSW50ZXJhY3RpdmVUYXNrQWxyZWFkeUV4ZWN1dGVkLnZhbHVlID09PSBudWxsKVxyXG4gICAgICBub25JbnRlcmFjdGl2ZVRhc2tBbHJlYWR5RXhlY3V0ZWQudmFsdWUgPSBjdXJyZW50Tm9uSW50ZXJhY3RpdmVUYXNrLnZhbHVlO1xyXG4gICAgZWxzZSBpZiAoY3VycmVudE5vbkludGVyYWN0aXZlVGFzay52YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UsIFwibW9yZSB0aGFuIDEgbm9uIGludGVyYWN0aXZlIHRhc2tzIGluIHN0YXJ0UHJvZ1wiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gT3BlbiBhbGwgdGhlIGZvcm0gdGhhdCBhcmUgcGVuZGluZyBpbiBDcmVhdGVkRm9ybXMgdmVjdG9yLiA8L3N1bW1hcnk+XHJcbiAgc3RhdGljIGFzeW5jIE9wZW5Gb3JtcyhjYWxsQnlEZXN0U3ViRm9ybTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGNyZWF0ZWRGb3JtczogQ3JlYXRlZEZvcm1WZWN0b3IgPSBNZ0Zvcm0uQ3JlYXRlZEZvcm1zO1xyXG5cclxuICAgIGlmIChjcmVhdGVkRm9ybXMuQ291bnQoKSA+IDApIHtcclxuICAgICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICAgIHdoaWxlIChpIDwgY3JlYXRlZEZvcm1zLkNvdW50KCkpIHtcclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSBjcmVhdGVkRm9ybXMuZ2V0KGkpO1xyXG4gICAgICAgIGxldCBjYW5PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIE9wZW4gYSBzdWJmb3JtIG9ubHkgaWYgaXRzIGNvbnRhaW5lciBmb3JtIGlzIE9wZW5lZC5cclxuICAgICAgICAvLyBpc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpIGRvZXNuJ3QgZ28gd2VsbCBmb3Igc3ViZm9ybXMgKFFDUiAjOTE5MTE5KS5cclxuICAgICAgICBpZiAobWdGb3JtLmlzU3ViRm9ybSgpKSB7XHJcbiAgICAgICAgICBsZXQgb3BlbmVkOiBib29sZWFuID0gKDxNZ0Zvcm1CYXNlPm1nRm9ybS5nZXRTdWJGb3JtQ3RybCgpLmdldEZvcm0oKSkuT3BlbmVkO1xyXG4gICAgICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgICAgICBjYW5PcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoKDxUYXNrPm1nRm9ybS5nZXRUYXNrKCkpLmlzQ3VycmVudFN0YXJ0UHJvZ0xldmVsKCkpIHtcclxuICAgICAgICAgICAgY2FuT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FuT3Blbikge1xyXG4gICAgICAgICAgTWFuYWdlci5PcGVuRm9ybShtZ0Zvcm0pO1xyXG4gICAgICAgICAgYXdhaXQgTWFuYWdlci5Eb0ZpcnN0UmVmcmVzaFRhYmxlKG1nRm9ybSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWdGb3JtLk9wZW5lZCkge1xyXG5cclxuICAgICAgICAgIGNyZWF0ZWRGb3Jtcy5yZW1vdmUobWdGb3JtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IEdvZXMgb3ZlciBmb3JtcyBpcyBjcmVhdGVkRm9ybVZlYyBhbmQgcGVyZm9ybXMgbW92ZSB0byBmaXJzdCByZWNvcmQgY3ljbGUgY29udHJvbDwvc3VtbWFyeT5cclxuICBzdGF0aWMgYXN5bmMgRG9GaXJzdFJlY29yZEN5Y2xlKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0U2l6ZSgpOyBpKyspIHtcclxuICAgICAgbGV0IG1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShpKTtcclxuICAgICAgaWYgKG1nZCA9PT0gbnVsbCB8fCBtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBtZ2QuZ2V0VGFza3NDb3VudCgpOyBqKyspIHtcclxuICAgICAgICBsZXQgdGFzazogVGFzayA9IG1nZC5nZXRUYXNrKGopO1xyXG5cclxuICAgICAgICBpZiAodGFzayAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IG1nRm9ybTogTWdGb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAgICAgICBpZiAobWdGb3JtICE9PSBudWxsICYmIHRhc2suaXNDdXJyZW50U3RhcnRQcm9nTGV2ZWwoKSAmJiAhbWdGb3JtLklnbm9yZUZpcnN0UmVjb3JkQ3ljbGUpIHtcclxuICAgICAgICAgICAgbWdGb3JtLklnbm9yZUZpcnN0UmVjb3JkQ3ljbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBhd2FpdCB0YXNrLmRvRmlyc3RSZWNvcmRDeWNsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBGb3IgZXZlcnkgbWdkYXRhIHBlcmZvcm0gbW92ZSB0byBmaXJzdCBjb250cm9sIHRvIHRoZSBmb3JtXHJcbiAgLy8vIHRoYXQgd2UgbWFya2VkIGJlZm9yZSB3aXRoIE1vdmVUb0ZpcnN0Q29udHJvbCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBNb3ZlVG9GaXJzdENvbnRyb2xzKGNhbGxCeURlc3RTdWJGb3JtOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRTaXplKCk7IGkrKykge1xyXG4gICAgICBsZXQgbWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKGkpO1xyXG5cclxuICAgICAgaWYgKG1nZCA9PT0gbnVsbCB8fCBtZ2QuSXNBYm9ydGluZylcclxuICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGxldCB0YXNrc0NvdW50OiBudW1iZXIgPSBtZ2QuZ2V0VGFza3NDb3VudCgpO1xyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdGFza3NDb3VudDsgaisrKSB7XHJcbiAgICAgICAgbGV0IHRhc2s6IFRhc2sgPSBtZ2QuZ2V0VGFzayhqKTtcclxuICAgICAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRhc2suZ2V0Rm9ybSgpO1xyXG5cclxuICAgICAgICBpZiAodGFzay5pc0N1cnJlbnRTdGFydFByb2dMZXZlbCgpICYmIG1nRm9ybSAhPT0gbnVsbCAmJiBtZ0Zvcm0uTW92ZWRUb0ZpcnN0Q29udHJvbCkge1xyXG4gICAgICAgICAgbWdGb3JtLk1vdmVkVG9GaXJzdENvbnRyb2wgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghY2FsbEJ5RGVzdFN1YkZvcm0pXHJcbiAgICAgICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuSGFuZGxlTm9uUGFya2FibGVDb250cm9scyh0YXNrKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl19
|