@magic-xpa/engine 4.800.0-dev480.94 → 4.801.0-dev000.0

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