subagent-cli 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2177) hide show
  1. package/dist/sa +0 -0
  2. package/package.json +2 -8
  3. package/_entry.ts +0 -2
  4. package/bunfig.toml +0 -2
  5. package/src/QueryEngine.ts +0 -1295
  6. package/src/Task.ts +0 -125
  7. package/src/Tool.ts +0 -792
  8. package/src/_stubs/bun-bundle.ts +0 -6
  9. package/src/assistant/AssistantSessionChooser.ts +0 -2
  10. package/src/assistant/gate.ts +0 -2
  11. package/src/assistant/index.ts +0 -2
  12. package/src/assistant/sessionDiscovery.ts +0 -1
  13. package/src/assistant/sessionHistory.ts +0 -87
  14. package/src/bootstrap/state.ts +0 -1762
  15. package/src/bridge/bridgeApi.ts +0 -539
  16. package/src/bridge/bridgeConfig.ts +0 -48
  17. package/src/bridge/bridgeDebug.ts +0 -135
  18. package/src/bridge/bridgeEnabled.ts +0 -202
  19. package/src/bridge/bridgeMain.ts +0 -2999
  20. package/src/bridge/bridgeMessaging.ts +0 -461
  21. package/src/bridge/bridgePermissionCallbacks.ts +0 -43
  22. package/src/bridge/bridgePointer.ts +0 -210
  23. package/src/bridge/bridgeStatusUtil.ts +0 -163
  24. package/src/bridge/bridgeUI.ts +0 -530
  25. package/src/bridge/capacityWake.ts +0 -56
  26. package/src/bridge/codeSessionApi.ts +0 -168
  27. package/src/bridge/createSession.ts +0 -384
  28. package/src/bridge/debugUtils.ts +0 -141
  29. package/src/bridge/envLessBridgeConfig.ts +0 -165
  30. package/src/bridge/flushGate.ts +0 -71
  31. package/src/bridge/inboundAttachments.ts +0 -175
  32. package/src/bridge/inboundMessages.ts +0 -80
  33. package/src/bridge/initReplBridge.ts +0 -569
  34. package/src/bridge/jwtUtils.ts +0 -256
  35. package/src/bridge/peerSessions.ts +0 -2
  36. package/src/bridge/pollConfig.ts +0 -110
  37. package/src/bridge/pollConfigDefaults.ts +0 -82
  38. package/src/bridge/remoteBridgeCore.ts +0 -1008
  39. package/src/bridge/replBridge.ts +0 -2406
  40. package/src/bridge/replBridgeHandle.ts +0 -36
  41. package/src/bridge/replBridgeTransport.ts +0 -370
  42. package/src/bridge/sessionIdCompat.ts +0 -57
  43. package/src/bridge/sessionRunner.ts +0 -550
  44. package/src/bridge/trustedDevice.ts +0 -210
  45. package/src/bridge/types.ts +0 -262
  46. package/src/bridge/webhookSanitizer.ts +0 -2
  47. package/src/bridge/workSecret.ts +0 -127
  48. package/src/buddy/CompanionSprite.tsx +0 -371
  49. package/src/buddy/companion.ts +0 -133
  50. package/src/buddy/prompt.ts +0 -36
  51. package/src/buddy/sprites.ts +0 -514
  52. package/src/buddy/types.ts +0 -148
  53. package/src/buddy/useBuddyNotification.tsx +0 -98
  54. package/src/cli/bg.ts +0 -2
  55. package/src/cli/exit.ts +0 -31
  56. package/src/cli/handlers/agents.ts +0 -70
  57. package/src/cli/handlers/ant.ts +0 -2
  58. package/src/cli/handlers/auth.ts +0 -330
  59. package/src/cli/handlers/autoMode.ts +0 -170
  60. package/src/cli/handlers/mcp.tsx +0 -362
  61. package/src/cli/handlers/plugins.ts +0 -878
  62. package/src/cli/handlers/templateJobs.ts +0 -2
  63. package/src/cli/handlers/util.tsx +0 -110
  64. package/src/cli/ndjsonSafeStringify.ts +0 -32
  65. package/src/cli/print.ts +0 -5594
  66. package/src/cli/remoteIO.ts +0 -255
  67. package/src/cli/rollback.ts +0 -3
  68. package/src/cli/structuredIO.ts +0 -859
  69. package/src/cli/transports/HybridTransport.ts +0 -282
  70. package/src/cli/transports/SSETransport.ts +0 -711
  71. package/src/cli/transports/SerialBatchEventUploader.ts +0 -275
  72. package/src/cli/transports/Transport.ts +0 -1
  73. package/src/cli/transports/WebSocketTransport.ts +0 -800
  74. package/src/cli/transports/WorkerStateUploader.ts +0 -131
  75. package/src/cli/transports/ccrClient.ts +0 -998
  76. package/src/cli/transports/transportUtils.ts +0 -45
  77. package/src/cli/up.ts +0 -3
  78. package/src/cli/update.ts +0 -422
  79. package/src/commands/add-dir/add-dir.tsx +0 -126
  80. package/src/commands/add-dir/index.ts +0 -11
  81. package/src/commands/add-dir/validation.ts +0 -110
  82. package/src/commands/advisor.ts +0 -109
  83. package/src/commands/agents/agents.tsx +0 -12
  84. package/src/commands/agents/index.ts +0 -10
  85. package/src/commands/agents-platform/index.ts +0 -1
  86. package/src/commands/ant-trace/index.js +0 -1
  87. package/src/commands/assistant/assistant.ts +0 -2
  88. package/src/commands/assistant/index.ts +0 -1
  89. package/src/commands/autofix-pr/index.js +0 -1
  90. package/src/commands/backfill-sessions/index.js +0 -1
  91. package/src/commands/branch/branch.ts +0 -296
  92. package/src/commands/branch/index.ts +0 -14
  93. package/src/commands/break-cache/index.js +0 -1
  94. package/src/commands/bridge/bridge.tsx +0 -509
  95. package/src/commands/bridge/index.ts +0 -26
  96. package/src/commands/bridge-kick.ts +0 -200
  97. package/src/commands/brief.ts +0 -130
  98. package/src/commands/btw/btw.tsx +0 -243
  99. package/src/commands/btw/index.ts +0 -13
  100. package/src/commands/buddy/index.ts +0 -2
  101. package/src/commands/bughunter/index.js +0 -1
  102. package/src/commands/chrome/chrome.tsx +0 -285
  103. package/src/commands/chrome/index.ts +0 -13
  104. package/src/commands/clear/caches.ts +0 -144
  105. package/src/commands/clear/clear.ts +0 -7
  106. package/src/commands/clear/conversation.ts +0 -251
  107. package/src/commands/clear/index.ts +0 -19
  108. package/src/commands/color/color.ts +0 -93
  109. package/src/commands/color/index.ts +0 -16
  110. package/src/commands/commit-push-pr.ts +0 -158
  111. package/src/commands/commit.ts +0 -92
  112. package/src/commands/compact/compact.ts +0 -287
  113. package/src/commands/compact/index.ts +0 -15
  114. package/src/commands/config/config.tsx +0 -7
  115. package/src/commands/config/index.ts +0 -11
  116. package/src/commands/context/context-noninteractive.ts +0 -325
  117. package/src/commands/context/context.tsx +0 -64
  118. package/src/commands/context/index.ts +0 -24
  119. package/src/commands/copy/copy.tsx +0 -371
  120. package/src/commands/copy/index.ts +0 -15
  121. package/src/commands/cost/cost.ts +0 -24
  122. package/src/commands/cost/index.ts +0 -23
  123. package/src/commands/createMovedToPluginCommand.ts +0 -65
  124. package/src/commands/ctx_viz/index.js +0 -1
  125. package/src/commands/debug-tool-call/index.js +0 -1
  126. package/src/commands/desktop/desktop.tsx +0 -9
  127. package/src/commands/desktop/index.ts +0 -26
  128. package/src/commands/diff/diff.tsx +0 -9
  129. package/src/commands/diff/index.ts +0 -8
  130. package/src/commands/doctor/doctor.tsx +0 -7
  131. package/src/commands/doctor/index.ts +0 -12
  132. package/src/commands/effort/effort.tsx +0 -183
  133. package/src/commands/effort/index.ts +0 -13
  134. package/src/commands/env/index.js +0 -1
  135. package/src/commands/exit/exit.tsx +0 -33
  136. package/src/commands/exit/index.ts +0 -12
  137. package/src/commands/export/export.tsx +0 -91
  138. package/src/commands/export/index.ts +0 -11
  139. package/src/commands/extra-usage/extra-usage-core.ts +0 -118
  140. package/src/commands/extra-usage/extra-usage-noninteractive.ts +0 -16
  141. package/src/commands/extra-usage/extra-usage.tsx +0 -17
  142. package/src/commands/extra-usage/index.ts +0 -31
  143. package/src/commands/fast/fast.tsx +0 -269
  144. package/src/commands/fast/index.ts +0 -26
  145. package/src/commands/feedback/feedback.tsx +0 -25
  146. package/src/commands/feedback/index.ts +0 -26
  147. package/src/commands/files/files.ts +0 -19
  148. package/src/commands/files/index.ts +0 -12
  149. package/src/commands/force-snip.ts +0 -1
  150. package/src/commands/fork/index.ts +0 -2
  151. package/src/commands/good-claude/index.js +0 -1
  152. package/src/commands/heapdump/heapdump.ts +0 -17
  153. package/src/commands/heapdump/index.ts +0 -12
  154. package/src/commands/help/help.tsx +0 -11
  155. package/src/commands/help/index.ts +0 -10
  156. package/src/commands/hooks/hooks.tsx +0 -13
  157. package/src/commands/hooks/index.ts +0 -11
  158. package/src/commands/ide/ide.tsx +0 -646
  159. package/src/commands/ide/index.ts +0 -11
  160. package/src/commands/init-verifiers.ts +0 -262
  161. package/src/commands/init.ts +0 -256
  162. package/src/commands/insights.ts +0 -3200
  163. package/src/commands/install-github-app/ApiKeyStep.tsx +0 -231
  164. package/src/commands/install-github-app/CheckExistingSecretStep.tsx +0 -190
  165. package/src/commands/install-github-app/CheckGitHubStep.tsx +0 -15
  166. package/src/commands/install-github-app/ChooseRepoStep.tsx +0 -211
  167. package/src/commands/install-github-app/CreatingStep.tsx +0 -65
  168. package/src/commands/install-github-app/ErrorStep.tsx +0 -85
  169. package/src/commands/install-github-app/ExistingWorkflowStep.tsx +0 -103
  170. package/src/commands/install-github-app/InstallAppStep.tsx +0 -94
  171. package/src/commands/install-github-app/OAuthFlowStep.tsx +0 -276
  172. package/src/commands/install-github-app/SuccessStep.tsx +0 -96
  173. package/src/commands/install-github-app/WarningsStep.tsx +0 -73
  174. package/src/commands/install-github-app/index.ts +0 -13
  175. package/src/commands/install-github-app/install-github-app.tsx +0 -587
  176. package/src/commands/install-github-app/setupGitHubActions.ts +0 -325
  177. package/src/commands/install-github-app/types.ts +0 -3
  178. package/src/commands/install-slack-app/index.ts +0 -12
  179. package/src/commands/install-slack-app/install-slack-app.ts +0 -30
  180. package/src/commands/install.tsx +0 -300
  181. package/src/commands/issue/index.js +0 -1
  182. package/src/commands/keybindings/index.ts +0 -13
  183. package/src/commands/keybindings/keybindings.ts +0 -53
  184. package/src/commands/login/index.ts +0 -14
  185. package/src/commands/login/login.tsx +0 -104
  186. package/src/commands/logout/index.ts +0 -10
  187. package/src/commands/logout/logout.tsx +0 -82
  188. package/src/commands/mcp/addCommand.ts +0 -280
  189. package/src/commands/mcp/index.ts +0 -12
  190. package/src/commands/mcp/mcp.tsx +0 -85
  191. package/src/commands/mcp/xaaIdpCommand.ts +0 -266
  192. package/src/commands/memory/index.ts +0 -10
  193. package/src/commands/memory/memory.tsx +0 -90
  194. package/src/commands/mobile/index.ts +0 -11
  195. package/src/commands/mobile/mobile.tsx +0 -274
  196. package/src/commands/mock-limits/index.js +0 -1
  197. package/src/commands/model/index.ts +0 -16
  198. package/src/commands/model/model.tsx +0 -297
  199. package/src/commands/oauth-refresh/index.js +0 -1
  200. package/src/commands/onboarding/index.js +0 -1
  201. package/src/commands/output-style/index.ts +0 -11
  202. package/src/commands/output-style/output-style.tsx +0 -7
  203. package/src/commands/passes/index.ts +0 -22
  204. package/src/commands/passes/passes.tsx +0 -24
  205. package/src/commands/peers/index.ts +0 -2
  206. package/src/commands/perf-issue/index.js +0 -1
  207. package/src/commands/permissions/index.ts +0 -11
  208. package/src/commands/permissions/permissions.tsx +0 -10
  209. package/src/commands/plan/index.ts +0 -11
  210. package/src/commands/plan/plan.tsx +0 -122
  211. package/src/commands/plugin/AddMarketplace.tsx +0 -162
  212. package/src/commands/plugin/BrowseMarketplace.tsx +0 -802
  213. package/src/commands/plugin/DiscoverPlugins.tsx +0 -781
  214. package/src/commands/plugin/ManageMarketplaces.tsx +0 -838
  215. package/src/commands/plugin/ManagePlugins.tsx +0 -2215
  216. package/src/commands/plugin/PluginErrors.tsx +0 -124
  217. package/src/commands/plugin/PluginOptionsDialog.tsx +0 -357
  218. package/src/commands/plugin/PluginOptionsFlow.tsx +0 -135
  219. package/src/commands/plugin/PluginSettings.tsx +0 -1072
  220. package/src/commands/plugin/PluginTrustWarning.tsx +0 -32
  221. package/src/commands/plugin/UnifiedInstalledCell.tsx +0 -565
  222. package/src/commands/plugin/ValidatePlugin.tsx +0 -98
  223. package/src/commands/plugin/index.tsx +0 -11
  224. package/src/commands/plugin/parseArgs.ts +0 -103
  225. package/src/commands/plugin/plugin.tsx +0 -7
  226. package/src/commands/plugin/pluginDetailsHelpers.tsx +0 -117
  227. package/src/commands/plugin/types.ts +0 -2
  228. package/src/commands/plugin/unifiedTypes.ts +0 -4
  229. package/src/commands/plugin/usePagination.ts +0 -171
  230. package/src/commands/pr_comments/index.ts +0 -50
  231. package/src/commands/privacy-settings/index.ts +0 -14
  232. package/src/commands/privacy-settings/privacy-settings.tsx +0 -58
  233. package/src/commands/proactive.ts +0 -1
  234. package/src/commands/rate-limit-options/index.ts +0 -19
  235. package/src/commands/rate-limit-options/rate-limit-options.tsx +0 -210
  236. package/src/commands/release-notes/index.ts +0 -11
  237. package/src/commands/release-notes/release-notes.ts +0 -50
  238. package/src/commands/reload-plugins/index.ts +0 -18
  239. package/src/commands/reload-plugins/reload-plugins.ts +0 -61
  240. package/src/commands/remote-env/index.ts +0 -15
  241. package/src/commands/remote-env/remote-env.tsx +0 -7
  242. package/src/commands/remote-setup/api.ts +0 -182
  243. package/src/commands/remote-setup/index.ts +0 -20
  244. package/src/commands/remote-setup/remote-setup.tsx +0 -187
  245. package/src/commands/remoteControlServer/index.ts +0 -1
  246. package/src/commands/rename/generateSessionName.ts +0 -67
  247. package/src/commands/rename/index.ts +0 -12
  248. package/src/commands/rename/rename.ts +0 -87
  249. package/src/commands/reset-limits/index.js +0 -4
  250. package/src/commands/resume/index.ts +0 -12
  251. package/src/commands/resume/resume.tsx +0 -275
  252. package/src/commands/review/UltrareviewOverageDialog.tsx +0 -96
  253. package/src/commands/review/reviewRemote.ts +0 -316
  254. package/src/commands/review/ultrareviewCommand.tsx +0 -58
  255. package/src/commands/review/ultrareviewEnabled.ts +0 -14
  256. package/src/commands/review.ts +0 -57
  257. package/src/commands/rewind/index.ts +0 -13
  258. package/src/commands/rewind/rewind.ts +0 -13
  259. package/src/commands/sandbox-toggle/index.ts +0 -50
  260. package/src/commands/sandbox-toggle/sandbox-toggle.tsx +0 -83
  261. package/src/commands/security-review.ts +0 -243
  262. package/src/commands/session/index.ts +0 -16
  263. package/src/commands/session/session.tsx +0 -140
  264. package/src/commands/share/index.js +0 -1
  265. package/src/commands/skills/index.ts +0 -10
  266. package/src/commands/skills/skills.tsx +0 -8
  267. package/src/commands/stats/index.ts +0 -10
  268. package/src/commands/stats/stats.tsx +0 -7
  269. package/src/commands/status/index.ts +0 -12
  270. package/src/commands/status/status.tsx +0 -8
  271. package/src/commands/statusline.tsx +0 -24
  272. package/src/commands/stickers/index.ts +0 -11
  273. package/src/commands/stickers/stickers.ts +0 -16
  274. package/src/commands/subscribe-pr.ts +0 -1
  275. package/src/commands/summary/index.js +0 -1
  276. package/src/commands/tag/index.ts +0 -12
  277. package/src/commands/tag/tag.tsx +0 -215
  278. package/src/commands/tasks/index.ts +0 -11
  279. package/src/commands/tasks/tasks.tsx +0 -8
  280. package/src/commands/teleport/index.js +0 -1
  281. package/src/commands/terminalSetup/index.ts +0 -23
  282. package/src/commands/terminalSetup/terminalSetup.tsx +0 -531
  283. package/src/commands/theme/index.ts +0 -10
  284. package/src/commands/theme/theme.tsx +0 -57
  285. package/src/commands/thinkback/index.ts +0 -13
  286. package/src/commands/thinkback/thinkback.tsx +0 -554
  287. package/src/commands/thinkback-play/index.ts +0 -17
  288. package/src/commands/thinkback-play/thinkback-play.ts +0 -43
  289. package/src/commands/torch.ts +0 -1
  290. package/src/commands/ultraplan.tsx +0 -471
  291. package/src/commands/upgrade/index.ts +0 -16
  292. package/src/commands/upgrade/upgrade.tsx +0 -38
  293. package/src/commands/usage/index.ts +0 -9
  294. package/src/commands/usage/usage.tsx +0 -7
  295. package/src/commands/version.ts +0 -22
  296. package/src/commands/vim/index.ts +0 -11
  297. package/src/commands/vim/vim.ts +0 -38
  298. package/src/commands/voice/index.ts +0 -20
  299. package/src/commands/voice/voice.ts +0 -150
  300. package/src/commands/workflows/index.ts +0 -2
  301. package/src/commands.ts +0 -754
  302. package/src/components/AgentProgressLine.tsx +0 -136
  303. package/src/components/App.tsx +0 -56
  304. package/src/components/ApproveApiKey.tsx +0 -123
  305. package/src/components/AutoModeOptInDialog.tsx +0 -142
  306. package/src/components/AutoUpdater.tsx +0 -198
  307. package/src/components/AutoUpdaterWrapper.tsx +0 -91
  308. package/src/components/AwsAuthStatusBox.tsx +0 -82
  309. package/src/components/BaseTextInput.tsx +0 -136
  310. package/src/components/BashModeProgress.tsx +0 -56
  311. package/src/components/BridgeDialog.tsx +0 -401
  312. package/src/components/BypassPermissionsModeDialog.tsx +0 -87
  313. package/src/components/ChannelDowngradeDialog.tsx +0 -102
  314. package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +0 -78
  315. package/src/components/ClaudeInChromeOnboarding.tsx +0 -121
  316. package/src/components/ClaudeMdExternalIncludesDialog.tsx +0 -137
  317. package/src/components/ClickableImageRef.tsx +0 -73
  318. package/src/components/CompactSummary.tsx +0 -118
  319. package/src/components/ConfigurableShortcutHint.tsx +0 -57
  320. package/src/components/ConsoleOAuthFlow.tsx +0 -631
  321. package/src/components/ContextSuggestions.tsx +0 -47
  322. package/src/components/ContextVisualization.tsx +0 -489
  323. package/src/components/CoordinatorAgentStatus.tsx +0 -273
  324. package/src/components/CostThresholdDialog.tsx +0 -50
  325. package/src/components/CtrlOToExpand.tsx +0 -51
  326. package/src/components/CustomSelect/SelectMulti.tsx +0 -213
  327. package/src/components/CustomSelect/index.ts +0 -3
  328. package/src/components/CustomSelect/option-map.ts +0 -50
  329. package/src/components/CustomSelect/select-input-option.tsx +0 -488
  330. package/src/components/CustomSelect/select-option.tsx +0 -68
  331. package/src/components/CustomSelect/select.tsx +0 -690
  332. package/src/components/CustomSelect/use-multi-select-state.ts +0 -414
  333. package/src/components/CustomSelect/use-select-input.ts +0 -287
  334. package/src/components/CustomSelect/use-select-navigation.ts +0 -653
  335. package/src/components/CustomSelect/use-select-state.ts +0 -157
  336. package/src/components/DesktopHandoff.tsx +0 -193
  337. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +0 -171
  338. package/src/components/DevBar.tsx +0 -49
  339. package/src/components/DevChannelsDialog.tsx +0 -105
  340. package/src/components/DiagnosticsDisplay.tsx +0 -95
  341. package/src/components/EffortCallout.tsx +0 -265
  342. package/src/components/EffortIndicator.ts +0 -42
  343. package/src/components/ExitFlow.tsx +0 -48
  344. package/src/components/ExportDialog.tsx +0 -128
  345. package/src/components/FallbackToolUseErrorMessage.tsx +0 -116
  346. package/src/components/FallbackToolUseRejectedMessage.tsx +0 -16
  347. package/src/components/FastIcon.tsx +0 -46
  348. package/src/components/Feedback.tsx +0 -592
  349. package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +0 -174
  350. package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +0 -108
  351. package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +0 -88
  352. package/src/components/FeedbackSurvey/submitTranscriptShare.ts +0 -112
  353. package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +0 -82
  354. package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +0 -296
  355. package/src/components/FeedbackSurvey/useFrustrationDetection.ts +0 -2
  356. package/src/components/FeedbackSurvey/useMemorySurvey.tsx +0 -213
  357. package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +0 -206
  358. package/src/components/FeedbackSurvey/useSurveyState.tsx +0 -100
  359. package/src/components/FeedbackSurvey/utils.ts +0 -2
  360. package/src/components/FileEditToolDiff.tsx +0 -181
  361. package/src/components/FileEditToolUpdatedMessage.tsx +0 -124
  362. package/src/components/FileEditToolUseRejectedMessage.tsx +0 -170
  363. package/src/components/FilePathLink.tsx +0 -43
  364. package/src/components/FullscreenLayout.tsx +0 -637
  365. package/src/components/GlobalSearchDialog.tsx +0 -343
  366. package/src/components/HelpV2/Commands.tsx +0 -82
  367. package/src/components/HelpV2/General.tsx +0 -23
  368. package/src/components/HelpV2/HelpV2.tsx +0 -184
  369. package/src/components/HighlightedCode/Fallback.tsx +0 -193
  370. package/src/components/HighlightedCode.tsx +0 -190
  371. package/src/components/HistorySearchDialog.tsx +0 -118
  372. package/src/components/IdeAutoConnectDialog.tsx +0 -154
  373. package/src/components/IdeOnboardingDialog.tsx +0 -167
  374. package/src/components/IdeStatusIndicator.tsx +0 -58
  375. package/src/components/IdleReturnDialog.tsx +0 -118
  376. package/src/components/InterruptedByUser.tsx +0 -15
  377. package/src/components/InvalidConfigDialog.tsx +0 -156
  378. package/src/components/InvalidSettingsDialog.tsx +0 -89
  379. package/src/components/KeybindingWarnings.tsx +0 -55
  380. package/src/components/LanguagePicker.tsx +0 -86
  381. package/src/components/LogSelector.tsx +0 -1575
  382. package/src/components/LogoV2/AnimatedAsterisk.tsx +0 -50
  383. package/src/components/LogoV2/AnimatedClawd.tsx +0 -124
  384. package/src/components/LogoV2/ChannelsNotice.tsx +0 -266
  385. package/src/components/LogoV2/Clawd.tsx +0 -25
  386. package/src/components/LogoV2/CondensedLogo.tsx +0 -161
  387. package/src/components/LogoV2/EmergencyTip.tsx +0 -58
  388. package/src/components/LogoV2/Feed.tsx +0 -112
  389. package/src/components/LogoV2/FeedColumn.tsx +0 -59
  390. package/src/components/LogoV2/GuestPassesUpsell.tsx +0 -70
  391. package/src/components/LogoV2/LogoV2.tsx +0 -543
  392. package/src/components/LogoV2/Opus1mMergeNotice.tsx +0 -55
  393. package/src/components/LogoV2/OverageCreditUpsell.tsx +0 -166
  394. package/src/components/LogoV2/VoiceModeNotice.tsx +0 -68
  395. package/src/components/LogoV2/WelcomeV2.tsx +0 -433
  396. package/src/components/LogoV2/feedConfigs.tsx +0 -92
  397. package/src/components/LspRecommendation/LspRecommendationMenu.tsx +0 -88
  398. package/src/components/MCPServerApprovalDialog.tsx +0 -115
  399. package/src/components/MCPServerDesktopImportDialog.tsx +0 -203
  400. package/src/components/MCPServerDialogCopy.tsx +0 -15
  401. package/src/components/MCPServerMultiselectDialog.tsx +0 -133
  402. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +0 -149
  403. package/src/components/ManagedSettingsSecurityDialog/utils.ts +0 -144
  404. package/src/components/Markdown.tsx +0 -236
  405. package/src/components/MarkdownTable.tsx +0 -322
  406. package/src/components/MemoryUsageIndicator.tsx +0 -37
  407. package/src/components/Message.tsx +0 -627
  408. package/src/components/MessageModel.tsx +0 -43
  409. package/src/components/MessageResponse.tsx +0 -78
  410. package/src/components/MessageRow.tsx +0 -383
  411. package/src/components/MessageSelector.tsx +0 -831
  412. package/src/components/MessageTimestamp.tsx +0 -63
  413. package/src/components/Messages.tsx +0 -834
  414. package/src/components/ModelPicker.tsx +0 -448
  415. package/src/components/NativeAutoUpdater.tsx +0 -193
  416. package/src/components/NotebookEditToolUseRejectedMessage.tsx +0 -92
  417. package/src/components/OffscreenFreeze.tsx +0 -44
  418. package/src/components/Onboarding.tsx +0 -244
  419. package/src/components/OutputStylePicker.tsx +0 -112
  420. package/src/components/PackageManagerAutoUpdater.tsx +0 -104
  421. package/src/components/Passes/Passes.tsx +0 -184
  422. package/src/components/PrBadge.tsx +0 -97
  423. package/src/components/PressEnterToContinue.tsx +0 -15
  424. package/src/components/PromptInput/HistorySearchInput.tsx +0 -51
  425. package/src/components/PromptInput/IssueFlagBanner.tsx +0 -12
  426. package/src/components/PromptInput/Notifications.tsx +0 -332
  427. package/src/components/PromptInput/PromptInput.tsx +0 -2339
  428. package/src/components/PromptInput/PromptInputFooter.tsx +0 -191
  429. package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +0 -517
  430. package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +0 -293
  431. package/src/components/PromptInput/PromptInputHelpMenu.tsx +0 -358
  432. package/src/components/PromptInput/PromptInputModeIndicator.tsx +0 -93
  433. package/src/components/PromptInput/PromptInputQueuedCommands.tsx +0 -117
  434. package/src/components/PromptInput/PromptInputStashNotice.tsx +0 -25
  435. package/src/components/PromptInput/SandboxPromptFooterHint.tsx +0 -64
  436. package/src/components/PromptInput/ShimmeredInput.tsx +0 -143
  437. package/src/components/PromptInput/VoiceIndicator.tsx +0 -137
  438. package/src/components/PromptInput/inputModes.ts +0 -33
  439. package/src/components/PromptInput/inputPaste.ts +0 -90
  440. package/src/components/PromptInput/useMaybeTruncateInput.ts +0 -58
  441. package/src/components/PromptInput/usePromptInputPlaceholder.ts +0 -76
  442. package/src/components/PromptInput/useShowFastIconHint.ts +0 -31
  443. package/src/components/PromptInput/useSwarmBanner.ts +0 -155
  444. package/src/components/PromptInput/utils.ts +0 -60
  445. package/src/components/QuickOpenDialog.tsx +0 -244
  446. package/src/components/RemoteCallout.tsx +0 -76
  447. package/src/components/RemoteEnvironmentDialog.tsx +0 -340
  448. package/src/components/ResumeTask.tsx +0 -268
  449. package/src/components/SandboxViolationExpandedView.tsx +0 -99
  450. package/src/components/ScrollKeybindingHandler.tsx +0 -1012
  451. package/src/components/SearchBox.tsx +0 -72
  452. package/src/components/SentryErrorBoundary.ts +0 -28
  453. package/src/components/SessionBackgroundHint.tsx +0 -108
  454. package/src/components/SessionPreview.tsx +0 -194
  455. package/src/components/Settings/Config.tsx +0 -1822
  456. package/src/components/Settings/Settings.tsx +0 -137
  457. package/src/components/Settings/Status.tsx +0 -241
  458. package/src/components/Settings/Usage.tsx +0 -377
  459. package/src/components/ShowInIDEPrompt.tsx +0 -170
  460. package/src/components/SkillImprovementSurvey.tsx +0 -152
  461. package/src/components/Spinner/FlashingChar.tsx +0 -61
  462. package/src/components/Spinner/GlimmerMessage.tsx +0 -328
  463. package/src/components/Spinner/ShimmerChar.tsx +0 -36
  464. package/src/components/Spinner/SpinnerAnimationRow.tsx +0 -265
  465. package/src/components/Spinner/SpinnerGlyph.tsx +0 -80
  466. package/src/components/Spinner/TeammateSpinnerLine.tsx +0 -233
  467. package/src/components/Spinner/TeammateSpinnerTree.tsx +0 -272
  468. package/src/components/Spinner/index.ts +0 -10
  469. package/src/components/Spinner/teammateSelectHint.ts +0 -1
  470. package/src/components/Spinner/types.ts +0 -2
  471. package/src/components/Spinner/useShimmerAnimation.ts +0 -31
  472. package/src/components/Spinner/useStalledAnimation.ts +0 -75
  473. package/src/components/Spinner/utils.ts +0 -84
  474. package/src/components/Spinner.tsx +0 -562
  475. package/src/components/Stats.tsx +0 -1228
  476. package/src/components/StatusLine.tsx +0 -324
  477. package/src/components/StatusNotices.tsx +0 -55
  478. package/src/components/StructuredDiff/Fallback.tsx +0 -487
  479. package/src/components/StructuredDiff/colorDiff.ts +0 -37
  480. package/src/components/StructuredDiff.tsx +0 -190
  481. package/src/components/StructuredDiffList.tsx +0 -30
  482. package/src/components/TagTabs.tsx +0 -139
  483. package/src/components/TaskListV2.tsx +0 -378
  484. package/src/components/TeammateViewHeader.tsx +0 -82
  485. package/src/components/TeleportError.tsx +0 -189
  486. package/src/components/TeleportProgress.tsx +0 -140
  487. package/src/components/TeleportRepoMismatchDialog.tsx +0 -104
  488. package/src/components/TeleportResumeWrapper.tsx +0 -167
  489. package/src/components/TeleportStash.tsx +0 -116
  490. package/src/components/TextInput.tsx +0 -124
  491. package/src/components/ThemePicker.tsx +0 -333
  492. package/src/components/ThinkingToggle.tsx +0 -153
  493. package/src/components/TokenWarning.tsx +0 -179
  494. package/src/components/ToolUseLoader.tsx +0 -42
  495. package/src/components/TrustDialog/TrustDialog.tsx +0 -290
  496. package/src/components/TrustDialog/utils.ts +0 -245
  497. package/src/components/ValidationErrorsList.tsx +0 -148
  498. package/src/components/VimTextInput.tsx +0 -140
  499. package/src/components/VirtualMessageList.tsx +0 -1082
  500. package/src/components/WorkflowMultiselectDialog.tsx +0 -128
  501. package/src/components/WorktreeExitDialog.tsx +0 -231
  502. package/src/components/agents/AgentDetail.tsx +0 -220
  503. package/src/components/agents/AgentEditor.tsx +0 -178
  504. package/src/components/agents/AgentNavigationFooter.tsx +0 -26
  505. package/src/components/agents/AgentsList.tsx +0 -440
  506. package/src/components/agents/AgentsMenu.tsx +0 -800
  507. package/src/components/agents/ColorPicker.tsx +0 -112
  508. package/src/components/agents/ModelSelector.tsx +0 -68
  509. package/src/components/agents/SnapshotUpdateDialog.ts +0 -2
  510. package/src/components/agents/ToolSelector.tsx +0 -562
  511. package/src/components/agents/agentFileUtils.ts +0 -272
  512. package/src/components/agents/generateAgent.ts +0 -197
  513. package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +0 -97
  514. package/src/components/agents/new-agent-creation/types.ts +0 -1
  515. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +0 -84
  516. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +0 -378
  517. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +0 -74
  518. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +0 -123
  519. package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +0 -143
  520. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +0 -80
  521. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +0 -113
  522. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +0 -80
  523. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +0 -52
  524. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +0 -128
  525. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +0 -61
  526. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +0 -103
  527. package/src/components/agents/types.ts +0 -27
  528. package/src/components/agents/utils.ts +0 -18
  529. package/src/components/agents/validateAgent.ts +0 -109
  530. package/src/components/design-system/Byline.tsx +0 -77
  531. package/src/components/design-system/Dialog.tsx +0 -138
  532. package/src/components/design-system/Divider.tsx +0 -149
  533. package/src/components/design-system/FuzzyPicker.tsx +0 -312
  534. package/src/components/design-system/KeyboardShortcutHint.tsx +0 -81
  535. package/src/components/design-system/ListItem.tsx +0 -244
  536. package/src/components/design-system/LoadingState.tsx +0 -94
  537. package/src/components/design-system/Pane.tsx +0 -77
  538. package/src/components/design-system/ProgressBar.tsx +0 -86
  539. package/src/components/design-system/Ratchet.tsx +0 -80
  540. package/src/components/design-system/StatusIcon.tsx +0 -95
  541. package/src/components/design-system/Tabs.tsx +0 -340
  542. package/src/components/design-system/ThemeProvider.tsx +0 -170
  543. package/src/components/design-system/ThemedBox.tsx +0 -156
  544. package/src/components/design-system/ThemedText.tsx +0 -124
  545. package/src/components/design-system/color.ts +0 -30
  546. package/src/components/diff/DiffDetailView.tsx +0 -281
  547. package/src/components/diff/DiffDialog.tsx +0 -383
  548. package/src/components/diff/DiffFileList.tsx +0 -292
  549. package/src/components/grove/Grove.tsx +0 -463
  550. package/src/components/hooks/HooksConfigMenu.tsx +0 -578
  551. package/src/components/hooks/PromptDialog.tsx +0 -90
  552. package/src/components/hooks/SelectEventMode.tsx +0 -127
  553. package/src/components/hooks/SelectHookMode.tsx +0 -112
  554. package/src/components/hooks/SelectMatcherMode.tsx +0 -144
  555. package/src/components/hooks/ViewHookMode.tsx +0 -199
  556. package/src/components/mcp/CapabilitiesSection.tsx +0 -61
  557. package/src/components/mcp/ElicitationDialog.tsx +0 -1169
  558. package/src/components/mcp/MCPAgentServerMenu.tsx +0 -183
  559. package/src/components/mcp/MCPListPanel.tsx +0 -504
  560. package/src/components/mcp/MCPReconnect.tsx +0 -167
  561. package/src/components/mcp/MCPRemoteServerMenu.tsx +0 -649
  562. package/src/components/mcp/MCPSettings.tsx +0 -398
  563. package/src/components/mcp/MCPStdioServerMenu.tsx +0 -177
  564. package/src/components/mcp/MCPToolDetailView.tsx +0 -212
  565. package/src/components/mcp/MCPToolListView.tsx +0 -141
  566. package/src/components/mcp/McpParsingWarnings.tsx +0 -213
  567. package/src/components/mcp/index.ts +0 -9
  568. package/src/components/mcp/types.ts +0 -7
  569. package/src/components/mcp/utils/reconnectHelpers.tsx +0 -49
  570. package/src/components/memory/MemoryFileSelector.tsx +0 -438
  571. package/src/components/memory/MemoryUpdateNotification.tsx +0 -45
  572. package/src/components/messageActions.tsx +0 -450
  573. package/src/components/messages/AdvisorMessage.tsx +0 -158
  574. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -31
  575. package/src/components/messages/AssistantTextMessage.tsx +0 -270
  576. package/src/components/messages/AssistantThinkingMessage.tsx +0 -86
  577. package/src/components/messages/AssistantToolUseMessage.tsx +0 -368
  578. package/src/components/messages/AttachmentMessage.tsx +0 -536
  579. package/src/components/messages/CollapsedReadSearchContent.tsx +0 -484
  580. package/src/components/messages/CompactBoundaryMessage.tsx +0 -18
  581. package/src/components/messages/GroupedToolUseContent.tsx +0 -58
  582. package/src/components/messages/HighlightedThinkingText.tsx +0 -162
  583. package/src/components/messages/HookProgressMessage.tsx +0 -116
  584. package/src/components/messages/PlanApprovalMessage.tsx +0 -222
  585. package/src/components/messages/RateLimitMessage.tsx +0 -161
  586. package/src/components/messages/ShutdownMessage.tsx +0 -132
  587. package/src/components/messages/SnipBoundaryMessage.ts +0 -2
  588. package/src/components/messages/SystemAPIErrorMessage.tsx +0 -141
  589. package/src/components/messages/SystemTextMessage.tsx +0 -827
  590. package/src/components/messages/TaskAssignmentMessage.tsx +0 -76
  591. package/src/components/messages/UserAgentNotificationMessage.tsx +0 -83
  592. package/src/components/messages/UserBashInputMessage.tsx +0 -58
  593. package/src/components/messages/UserBashOutputMessage.tsx +0 -54
  594. package/src/components/messages/UserChannelMessage.tsx +0 -137
  595. package/src/components/messages/UserCommandMessage.tsx +0 -108
  596. package/src/components/messages/UserCrossSessionMessage.ts +0 -2
  597. package/src/components/messages/UserForkBoilerplateMessage.ts +0 -2
  598. package/src/components/messages/UserGitHubWebhookMessage.ts +0 -2
  599. package/src/components/messages/UserImageMessage.tsx +0 -59
  600. package/src/components/messages/UserLocalCommandOutputMessage.tsx +0 -167
  601. package/src/components/messages/UserMemoryInputMessage.tsx +0 -75
  602. package/src/components/messages/UserPlanMessage.tsx +0 -42
  603. package/src/components/messages/UserPromptMessage.tsx +0 -80
  604. package/src/components/messages/UserResourceUpdateMessage.tsx +0 -121
  605. package/src/components/messages/UserTeammateMessage.tsx +0 -206
  606. package/src/components/messages/UserTextMessage.tsx +0 -275
  607. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +0 -31
  608. package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +0 -16
  609. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -16
  610. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -103
  611. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -95
  612. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -106
  613. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -104
  614. package/src/components/messages/UserToolResultMessage/utils.tsx +0 -44
  615. package/src/components/messages/nullRenderingAttachments.ts +0 -70
  616. package/src/components/messages/teamMemCollapsed.tsx +0 -140
  617. package/src/components/messages/teamMemSaved.ts +0 -19
  618. package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +0 -645
  619. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +0 -229
  620. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +0 -328
  621. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +0 -178
  622. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +0 -465
  623. package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +0 -144
  624. package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +0 -179
  625. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -482
  626. package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +0 -147
  627. package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +0 -441
  628. package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +0 -122
  629. package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +0 -768
  630. package/src/components/permissions/FallbackPermissionRequest.tsx +0 -333
  631. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
  632. package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +0 -204
  633. package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +0 -42
  634. package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +0 -177
  635. package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +0 -212
  636. package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +0 -185
  637. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -161
  638. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -89
  639. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -115
  640. package/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +0 -2
  641. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +0 -166
  642. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +0 -235
  643. package/src/components/permissions/PermissionDecisionDebugInfo.tsx +0 -460
  644. package/src/components/permissions/PermissionDialog.tsx +0 -72
  645. package/src/components/permissions/PermissionExplanation.tsx +0 -272
  646. package/src/components/permissions/PermissionPrompt.tsx +0 -336
  647. package/src/components/permissions/PermissionRequest.tsx +0 -217
  648. package/src/components/permissions/PermissionRequestTitle.tsx +0 -66
  649. package/src/components/permissions/PermissionRuleExplanation.tsx +0 -121
  650. package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +0 -235
  651. package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +0 -91
  652. package/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +0 -2
  653. package/src/components/permissions/SandboxPermissionRequest.tsx +0 -163
  654. package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +0 -230
  655. package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +0 -369
  656. package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +0 -258
  657. package/src/components/permissions/WorkerBadge.tsx +0 -49
  658. package/src/components/permissions/WorkerPendingPermission.tsx +0 -105
  659. package/src/components/permissions/hooks.ts +0 -209
  660. package/src/components/permissions/rules/AddPermissionRules.tsx +0 -180
  661. package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +0 -340
  662. package/src/components/permissions/rules/PermissionRuleDescription.tsx +0 -76
  663. package/src/components/permissions/rules/PermissionRuleInput.tsx +0 -138
  664. package/src/components/permissions/rules/PermissionRuleList.tsx +0 -1179
  665. package/src/components/permissions/rules/RecentDenialsTab.tsx +0 -207
  666. package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +0 -110
  667. package/src/components/permissions/rules/WorkspaceTab.tsx +0 -150
  668. package/src/components/permissions/shellPermissionHelpers.tsx +0 -164
  669. package/src/components/permissions/useShellPermissionFeedback.ts +0 -148
  670. package/src/components/permissions/utils.ts +0 -25
  671. package/src/components/sandbox/SandboxConfigTab.tsx +0 -45
  672. package/src/components/sandbox/SandboxDependenciesTab.tsx +0 -120
  673. package/src/components/sandbox/SandboxDoctorSection.tsx +0 -46
  674. package/src/components/sandbox/SandboxOverridesTab.tsx +0 -193
  675. package/src/components/sandbox/SandboxSettings.tsx +0 -296
  676. package/src/components/shell/ExpandShellOutputContext.tsx +0 -36
  677. package/src/components/shell/OutputLine.tsx +0 -118
  678. package/src/components/shell/ShellProgressMessage.tsx +0 -150
  679. package/src/components/shell/ShellTimeDisplay.tsx +0 -74
  680. package/src/components/skills/SkillsMenu.tsx +0 -237
  681. package/src/components/tasks/AsyncAgentDetailDialog.tsx +0 -229
  682. package/src/components/tasks/BackgroundTask.tsx +0 -345
  683. package/src/components/tasks/BackgroundTaskStatus.tsx +0 -429
  684. package/src/components/tasks/BackgroundTasksDialog.tsx +0 -652
  685. package/src/components/tasks/DreamDetailDialog.tsx +0 -251
  686. package/src/components/tasks/InProcessTeammateDetailDialog.tsx +0 -266
  687. package/src/components/tasks/MonitorMcpDetailDialog.ts +0 -2
  688. package/src/components/tasks/RemoteSessionDetailDialog.tsx +0 -904
  689. package/src/components/tasks/RemoteSessionProgress.tsx +0 -243
  690. package/src/components/tasks/ShellDetailDialog.tsx +0 -404
  691. package/src/components/tasks/ShellProgress.tsx +0 -87
  692. package/src/components/tasks/WorkflowDetailDialog.ts +0 -2
  693. package/src/components/tasks/renderToolActivity.tsx +0 -33
  694. package/src/components/tasks/taskStatusUtils.tsx +0 -107
  695. package/src/components/teams/TeamStatus.tsx +0 -80
  696. package/src/components/teams/TeamsDialog.tsx +0 -715
  697. package/src/components/ui/OrderedList.tsx +0 -71
  698. package/src/components/ui/OrderedListItem.tsx +0 -45
  699. package/src/components/ui/TreeSelect.tsx +0 -397
  700. package/src/components/ui/option.ts +0 -4
  701. package/src/components/wizard/WizardDialogLayout.tsx +0 -65
  702. package/src/components/wizard/WizardNavigationFooter.tsx +0 -24
  703. package/src/components/wizard/WizardProvider.tsx +0 -213
  704. package/src/components/wizard/index.ts +0 -9
  705. package/src/components/wizard/types.ts +0 -3
  706. package/src/components/wizard/useWizard.ts +0 -13
  707. package/src/constants/apiLimits.ts +0 -94
  708. package/src/constants/betas.ts +0 -52
  709. package/src/constants/common.ts +0 -33
  710. package/src/constants/cyberRiskInstruction.ts +0 -24
  711. package/src/constants/errorIds.ts +0 -15
  712. package/src/constants/figures.ts +0 -45
  713. package/src/constants/files.ts +0 -156
  714. package/src/constants/github-app.ts +0 -144
  715. package/src/constants/keys.ts +0 -11
  716. package/src/constants/messages.ts +0 -1
  717. package/src/constants/oauth.ts +0 -234
  718. package/src/constants/outputStyles.ts +0 -216
  719. package/src/constants/product.ts +0 -76
  720. package/src/constants/prompts.ts +0 -915
  721. package/src/constants/querySource.ts +0 -1
  722. package/src/constants/spinnerVerbs.ts +0 -204
  723. package/src/constants/system.ts +0 -95
  724. package/src/constants/systemPromptSections.ts +0 -68
  725. package/src/constants/toolLimits.ts +0 -56
  726. package/src/constants/tools.ts +0 -112
  727. package/src/constants/turnCompletionVerbs.ts +0 -12
  728. package/src/constants/xml.ts +0 -86
  729. package/src/context/QueuedMessageContext.tsx +0 -63
  730. package/src/context/fpsMetrics.tsx +0 -30
  731. package/src/context/mailbox.tsx +0 -38
  732. package/src/context/modalContext.tsx +0 -58
  733. package/src/context/notifications.tsx +0 -240
  734. package/src/context/overlayContext.tsx +0 -151
  735. package/src/context/promptOverlayContext.tsx +0 -125
  736. package/src/context/stats.tsx +0 -220
  737. package/src/context/voice.tsx +0 -88
  738. package/src/context.ts +0 -189
  739. package/src/coordinator/coordinatorMode.ts +0 -369
  740. package/src/coordinator/workerAgent.ts +0 -2
  741. package/src/cost-tracker.ts +0 -323
  742. package/src/costHook.ts +0 -22
  743. package/src/daemon/main.ts +0 -2
  744. package/src/daemon/workerRegistry.ts +0 -2
  745. package/src/dialogLaunchers.tsx +0 -133
  746. package/src/engine/CostMapper.ts +0 -57
  747. package/src/engine/MessageMapper.ts +0 -276
  748. package/src/engine/ModelResolver.ts +0 -153
  749. package/src/engine/PermissionBridge.ts +0 -114
  750. package/src/engine/PiAgentAdapter.ts +0 -299
  751. package/src/engine/SubagentTools.ts +0 -92
  752. package/src/engine/ToolAdapter.ts +0 -122
  753. package/src/engine/engine-backup/CostMapper.ts +0 -57
  754. package/src/engine/engine-backup/MessageMapper.ts +0 -276
  755. package/src/engine/engine-backup/ModelResolver.ts +0 -153
  756. package/src/engine/engine-backup/PermissionBridge.ts +0 -114
  757. package/src/engine/engine-backup/PiAgentAdapter.ts +0 -299
  758. package/src/engine/engine-backup/SubagentTools.ts +0 -92
  759. package/src/engine/engine-backup/ToolAdapter.ts +0 -122
  760. package/src/engine/engine-backup/index.ts +0 -14
  761. package/src/engine/engine-backup/piQueryBridge.ts +0 -396
  762. package/src/engine/index.ts +0 -14
  763. package/src/engine/piQueryBridge.ts +0 -396
  764. package/src/entrypoints/agentSdkTypes.ts +0 -443
  765. package/src/entrypoints/cli.tsx +0 -303
  766. package/src/entrypoints/init.ts +0 -340
  767. package/src/entrypoints/mcp.ts +0 -196
  768. package/src/entrypoints/sandboxTypes.ts +0 -156
  769. package/src/entrypoints/sdk/controlSchemas.ts +0 -663
  770. package/src/entrypoints/sdk/controlTypes.ts +0 -12
  771. package/src/entrypoints/sdk/coreSchemas.ts +0 -1889
  772. package/src/entrypoints/sdk/coreTypes.generated.ts +0 -1
  773. package/src/entrypoints/sdk/coreTypes.ts +0 -62
  774. package/src/entrypoints/sdk/runtimeTypes.ts +0 -18
  775. package/src/entrypoints/sdk/sdkUtilityTypes.ts +0 -1
  776. package/src/entrypoints/sdk/settingsTypes.generated.ts +0 -1
  777. package/src/entrypoints/sdk/toolTypes.ts +0 -2
  778. package/src/environment-runner/main.ts +0 -2
  779. package/src/history.ts +0 -464
  780. package/src/hooks/fileSuggestions.ts +0 -811
  781. package/src/hooks/notifs/useAntOrgWarningNotification.ts +0 -2
  782. package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +0 -56
  783. package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +0 -60
  784. package/src/hooks/notifs/useDeprecationWarningNotification.tsx +0 -44
  785. package/src/hooks/notifs/useFastModeNotification.tsx +0 -162
  786. package/src/hooks/notifs/useIDEStatusIndicator.tsx +0 -186
  787. package/src/hooks/notifs/useInstallMessages.tsx +0 -26
  788. package/src/hooks/notifs/useLspInitializationNotification.tsx +0 -143
  789. package/src/hooks/notifs/useMcpConnectivityStatus.tsx +0 -88
  790. package/src/hooks/notifs/useModelMigrationNotifications.tsx +0 -52
  791. package/src/hooks/notifs/useNpmDeprecationNotification.tsx +0 -25
  792. package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +0 -83
  793. package/src/hooks/notifs/usePluginInstallationStatus.tsx +0 -128
  794. package/src/hooks/notifs/useRateLimitWarningNotification.tsx +0 -114
  795. package/src/hooks/notifs/useSettingsErrors.tsx +0 -69
  796. package/src/hooks/notifs/useStartupNotification.ts +0 -41
  797. package/src/hooks/notifs/useTeammateShutdownNotification.ts +0 -78
  798. package/src/hooks/renderPlaceholder.ts +0 -51
  799. package/src/hooks/toolPermission/PermissionContext.ts +0 -388
  800. package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +0 -65
  801. package/src/hooks/toolPermission/handlers/interactiveHandler.ts +0 -536
  802. package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +0 -159
  803. package/src/hooks/toolPermission/permissionLogging.ts +0 -238
  804. package/src/hooks/unifiedSuggestions.ts +0 -202
  805. package/src/hooks/useAfterFirstRender.ts +0 -17
  806. package/src/hooks/useApiKeyVerification.ts +0 -84
  807. package/src/hooks/useArrowKeyHistory.tsx +0 -229
  808. package/src/hooks/useAssistantHistory.ts +0 -250
  809. package/src/hooks/useAwaySummary.ts +0 -125
  810. package/src/hooks/useBackgroundTaskNavigation.ts +0 -251
  811. package/src/hooks/useBlink.ts +0 -34
  812. package/src/hooks/useCanUseTool.tsx +0 -204
  813. package/src/hooks/useCancelRequest.ts +0 -276
  814. package/src/hooks/useChromeExtensionNotification.tsx +0 -50
  815. package/src/hooks/useClaudeCodeHintRecommendation.tsx +0 -129
  816. package/src/hooks/useClipboardImageHint.ts +0 -77
  817. package/src/hooks/useCommandKeybindings.tsx +0 -108
  818. package/src/hooks/useCommandQueue.ts +0 -15
  819. package/src/hooks/useCopyOnSelect.ts +0 -98
  820. package/src/hooks/useDeferredHookMessages.ts +0 -46
  821. package/src/hooks/useDiffData.ts +0 -110
  822. package/src/hooks/useDiffInIDE.ts +0 -379
  823. package/src/hooks/useDirectConnect.ts +0 -229
  824. package/src/hooks/useDoublePress.ts +0 -62
  825. package/src/hooks/useDynamicConfig.ts +0 -22
  826. package/src/hooks/useElapsedTime.ts +0 -37
  827. package/src/hooks/useExitOnCtrlCD.ts +0 -95
  828. package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +0 -24
  829. package/src/hooks/useFileHistorySnapshotInit.ts +0 -25
  830. package/src/hooks/useGlobalKeybindings.tsx +0 -249
  831. package/src/hooks/useHistorySearch.ts +0 -303
  832. package/src/hooks/useIDEIntegration.tsx +0 -70
  833. package/src/hooks/useIdeAtMentioned.ts +0 -76
  834. package/src/hooks/useIdeConnectionStatus.ts +0 -33
  835. package/src/hooks/useIdeLogging.ts +0 -41
  836. package/src/hooks/useIdeSelection.ts +0 -150
  837. package/src/hooks/useInboxPoller.ts +0 -969
  838. package/src/hooks/useInputBuffer.ts +0 -132
  839. package/src/hooks/useIssueFlagBanner.ts +0 -133
  840. package/src/hooks/useLogMessages.ts +0 -119
  841. package/src/hooks/useLspPluginRecommendation.tsx +0 -194
  842. package/src/hooks/useMailboxBridge.ts +0 -21
  843. package/src/hooks/useMainLoopModel.ts +0 -34
  844. package/src/hooks/useManagePlugins.ts +0 -304
  845. package/src/hooks/useMemoryUsage.ts +0 -39
  846. package/src/hooks/useMergedClients.ts +0 -23
  847. package/src/hooks/useMergedCommands.ts +0 -15
  848. package/src/hooks/useMergedTools.ts +0 -44
  849. package/src/hooks/useMinDisplayTime.ts +0 -35
  850. package/src/hooks/useNotifyAfterTimeout.ts +0 -65
  851. package/src/hooks/useOfficialMarketplaceNotification.tsx +0 -48
  852. package/src/hooks/usePasteHandler.ts +0 -285
  853. package/src/hooks/usePluginRecommendationBase.tsx +0 -105
  854. package/src/hooks/usePrStatus.ts +0 -106
  855. package/src/hooks/usePromptSuggestion.ts +0 -177
  856. package/src/hooks/usePromptsFromClaudeInChrome.tsx +0 -71
  857. package/src/hooks/useQueueProcessor.ts +0 -68
  858. package/src/hooks/useRemoteSession.ts +0 -605
  859. package/src/hooks/useReplBridge.tsx +0 -723
  860. package/src/hooks/useSSHSession.ts +0 -241
  861. package/src/hooks/useScheduledTasks.ts +0 -139
  862. package/src/hooks/useSearchInput.ts +0 -364
  863. package/src/hooks/useSessionBackgrounding.ts +0 -158
  864. package/src/hooks/useSettings.ts +0 -17
  865. package/src/hooks/useSettingsChange.ts +0 -25
  866. package/src/hooks/useSkillImprovementSurvey.ts +0 -105
  867. package/src/hooks/useSkillsChange.ts +0 -62
  868. package/src/hooks/useSwarmInitialization.ts +0 -81
  869. package/src/hooks/useSwarmPermissionPoller.ts +0 -330
  870. package/src/hooks/useTaskListWatcher.ts +0 -221
  871. package/src/hooks/useTasksV2.ts +0 -250
  872. package/src/hooks/useTeammateViewAutoExit.ts +0 -63
  873. package/src/hooks/useTeleportResume.tsx +0 -85
  874. package/src/hooks/useTerminalSize.ts +0 -15
  875. package/src/hooks/useTextInput.ts +0 -529
  876. package/src/hooks/useTimeout.ts +0 -14
  877. package/src/hooks/useTurnDiffs.ts +0 -213
  878. package/src/hooks/useTypeahead.tsx +0 -1385
  879. package/src/hooks/useUpdateNotification.ts +0 -34
  880. package/src/hooks/useVimInput.ts +0 -316
  881. package/src/hooks/useVirtualScroll.ts +0 -721
  882. package/src/hooks/useVoice.ts +0 -1144
  883. package/src/hooks/useVoiceEnabled.ts +0 -25
  884. package/src/hooks/useVoiceIntegration.tsx +0 -677
  885. package/src/hunter.ts +0 -1
  886. package/src/ink/Ansi.tsx +0 -292
  887. package/src/ink/bidi.ts +0 -139
  888. package/src/ink/clearTerminal.ts +0 -74
  889. package/src/ink/colorize.ts +0 -231
  890. package/src/ink/components/AlternateScreen.tsx +0 -80
  891. package/src/ink/components/App.tsx +0 -658
  892. package/src/ink/components/AppContext.ts +0 -21
  893. package/src/ink/components/Box.tsx +0 -214
  894. package/src/ink/components/Button.tsx +0 -192
  895. package/src/ink/components/ClockContext.tsx +0 -112
  896. package/src/ink/components/CursorDeclarationContext.ts +0 -32
  897. package/src/ink/components/ErrorOverview.tsx +0 -109
  898. package/src/ink/components/Link.tsx +0 -42
  899. package/src/ink/components/Newline.tsx +0 -39
  900. package/src/ink/components/NoSelect.tsx +0 -68
  901. package/src/ink/components/RawAnsi.tsx +0 -57
  902. package/src/ink/components/ScrollBox.tsx +0 -237
  903. package/src/ink/components/Spacer.tsx +0 -20
  904. package/src/ink/components/StdinContext.ts +0 -49
  905. package/src/ink/components/TerminalFocusContext.tsx +0 -52
  906. package/src/ink/components/TerminalSizeContext.tsx +0 -7
  907. package/src/ink/components/Text.tsx +0 -254
  908. package/src/ink/constants.ts +0 -2
  909. package/src/ink/cursor.ts +0 -1
  910. package/src/ink/devtools.ts +0 -2
  911. package/src/ink/dom.ts +0 -484
  912. package/src/ink/events/click-event.ts +0 -38
  913. package/src/ink/events/dispatcher.ts +0 -233
  914. package/src/ink/events/emitter.ts +0 -39
  915. package/src/ink/events/event-handlers.ts +0 -73
  916. package/src/ink/events/event.ts +0 -11
  917. package/src/ink/events/focus-event.ts +0 -21
  918. package/src/ink/events/input-event.ts +0 -205
  919. package/src/ink/events/keyboard-event.ts +0 -51
  920. package/src/ink/events/paste-event.ts +0 -1
  921. package/src/ink/events/resize-event.ts +0 -1
  922. package/src/ink/events/terminal-event.ts +0 -107
  923. package/src/ink/events/terminal-focus-event.ts +0 -19
  924. package/src/ink/focus.ts +0 -181
  925. package/src/ink/frame.ts +0 -124
  926. package/src/ink/get-max-width.ts +0 -27
  927. package/src/ink/global.d.ts +0 -1
  928. package/src/ink/hit-test.ts +0 -130
  929. package/src/ink/hooks/use-animation-frame.ts +0 -57
  930. package/src/ink/hooks/use-app.ts +0 -8
  931. package/src/ink/hooks/use-declared-cursor.ts +0 -73
  932. package/src/ink/hooks/use-input.ts +0 -92
  933. package/src/ink/hooks/use-interval.ts +0 -67
  934. package/src/ink/hooks/use-search-highlight.ts +0 -53
  935. package/src/ink/hooks/use-selection.ts +0 -104
  936. package/src/ink/hooks/use-stdin.ts +0 -8
  937. package/src/ink/hooks/use-tab-status.ts +0 -72
  938. package/src/ink/hooks/use-terminal-focus.ts +0 -16
  939. package/src/ink/hooks/use-terminal-title.ts +0 -31
  940. package/src/ink/hooks/use-terminal-viewport.ts +0 -96
  941. package/src/ink/ink.tsx +0 -1723
  942. package/src/ink/instances.ts +0 -10
  943. package/src/ink/layout/engine.ts +0 -6
  944. package/src/ink/layout/geometry.ts +0 -97
  945. package/src/ink/layout/node.ts +0 -152
  946. package/src/ink/layout/yoga.ts +0 -308
  947. package/src/ink/line-width-cache.ts +0 -24
  948. package/src/ink/log-update.ts +0 -773
  949. package/src/ink/measure-element.ts +0 -23
  950. package/src/ink/measure-text.ts +0 -47
  951. package/src/ink/node-cache.ts +0 -54
  952. package/src/ink/optimizer.ts +0 -93
  953. package/src/ink/output.ts +0 -797
  954. package/src/ink/parse-keypress.ts +0 -801
  955. package/src/ink/reconciler.ts +0 -512
  956. package/src/ink/render-border.ts +0 -231
  957. package/src/ink/render-node-to-output.ts +0 -1462
  958. package/src/ink/render-to-screen.ts +0 -231
  959. package/src/ink/renderer.ts +0 -178
  960. package/src/ink/root.ts +0 -184
  961. package/src/ink/screen.ts +0 -1486
  962. package/src/ink/searchHighlight.ts +0 -93
  963. package/src/ink/selection.ts +0 -917
  964. package/src/ink/squash-text-nodes.ts +0 -92
  965. package/src/ink/stringWidth.ts +0 -222
  966. package/src/ink/styles.ts +0 -771
  967. package/src/ink/supports-hyperlinks.ts +0 -57
  968. package/src/ink/tabstops.ts +0 -46
  969. package/src/ink/terminal-focus-state.ts +0 -47
  970. package/src/ink/terminal-querier.ts +0 -212
  971. package/src/ink/terminal.ts +0 -248
  972. package/src/ink/termio/ansi.ts +0 -75
  973. package/src/ink/termio/csi.ts +0 -319
  974. package/src/ink/termio/dec.ts +0 -60
  975. package/src/ink/termio/esc.ts +0 -67
  976. package/src/ink/termio/osc.ts +0 -493
  977. package/src/ink/termio/parser.ts +0 -394
  978. package/src/ink/termio/sgr.ts +0 -308
  979. package/src/ink/termio/tokenize.ts +0 -319
  980. package/src/ink/termio/types.ts +0 -236
  981. package/src/ink/termio.ts +0 -42
  982. package/src/ink/useTerminalNotification.ts +0 -126
  983. package/src/ink/warn.ts +0 -9
  984. package/src/ink/widest-line.ts +0 -19
  985. package/src/ink/wrap-text.ts +0 -74
  986. package/src/ink/wrapAnsi.ts +0 -20
  987. package/src/ink.ts +0 -85
  988. package/src/interactiveHelpers.tsx +0 -366
  989. package/src/jobs/classifier.ts +0 -2
  990. package/src/keybindings/KeybindingContext.tsx +0 -243
  991. package/src/keybindings/KeybindingProviderSetup.tsx +0 -308
  992. package/src/keybindings/defaultBindings.ts +0 -340
  993. package/src/keybindings/loadUserBindings.ts +0 -472
  994. package/src/keybindings/match.ts +0 -120
  995. package/src/keybindings/parser.ts +0 -203
  996. package/src/keybindings/reservedShortcuts.ts +0 -127
  997. package/src/keybindings/resolver.ts +0 -244
  998. package/src/keybindings/schema.ts +0 -236
  999. package/src/keybindings/shortcutFormat.ts +0 -63
  1000. package/src/keybindings/template.ts +0 -52
  1001. package/src/keybindings/types.ts +0 -3
  1002. package/src/keybindings/useKeybinding.ts +0 -196
  1003. package/src/keybindings/useShortcutDisplay.ts +0 -59
  1004. package/src/keybindings/validate.ts +0 -498
  1005. package/src/main.tsx +0 -4684
  1006. package/src/memdir/findRelevantMemories.ts +0 -141
  1007. package/src/memdir/memdir.ts +0 -507
  1008. package/src/memdir/memoryAge.ts +0 -53
  1009. package/src/memdir/memoryScan.ts +0 -94
  1010. package/src/memdir/memoryShapeTelemetry.ts +0 -2
  1011. package/src/memdir/memoryTypes.ts +0 -271
  1012. package/src/memdir/paths.ts +0 -278
  1013. package/src/memdir/teamMemPaths.ts +0 -292
  1014. package/src/memdir/teamMemPrompts.ts +0 -100
  1015. package/src/migrations/migrateAutoUpdatesToSettings.ts +0 -61
  1016. package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +0 -40
  1017. package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +0 -118
  1018. package/src/migrations/migrateFennecToOpus.ts +0 -45
  1019. package/src/migrations/migrateLegacyOpusToCurrent.ts +0 -57
  1020. package/src/migrations/migrateOpusToOpus1m.ts +0 -43
  1021. package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +0 -22
  1022. package/src/migrations/migrateSonnet1mToSonnet45.ts +0 -48
  1023. package/src/migrations/migrateSonnet45ToSonnet46.ts +0 -67
  1024. package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +0 -51
  1025. package/src/migrations/resetProToOpusDefault.ts +0 -51
  1026. package/src/moreright/useMoreRight.tsx +0 -26
  1027. package/src/native-ts/color-diff/index.ts +0 -1001
  1028. package/src/native-ts/file-index/index.ts +0 -370
  1029. package/src/native-ts/yoga-layout/enums.ts +0 -134
  1030. package/src/native-ts/yoga-layout/index.ts +0 -2578
  1031. package/src/outputStyles/loadOutputStylesDir.ts +0 -98
  1032. package/src/plugins/builtinPlugins.ts +0 -159
  1033. package/src/plugins/bundled/index.ts +0 -23
  1034. package/src/proactive/index.ts +0 -1
  1035. package/src/proactive/useProactive.ts +0 -1
  1036. package/src/projectOnboardingState.ts +0 -83
  1037. package/src/query/config.ts +0 -46
  1038. package/src/query/deps.ts +0 -33
  1039. package/src/query/stopHooks.ts +0 -473
  1040. package/src/query/tokenBudget.ts +0 -93
  1041. package/src/query/transitions.ts +0 -2
  1042. package/src/query.ts +0 -1729
  1043. package/src/remote/RemoteSessionManager.ts +0 -343
  1044. package/src/remote/SessionsWebSocket.ts +0 -404
  1045. package/src/remote/remotePermissionBridge.ts +0 -78
  1046. package/src/remote/sdkMessageAdapter.ts +0 -302
  1047. package/src/replLauncher.tsx +0 -23
  1048. package/src/schemas/hooks.ts +0 -222
  1049. package/src/screens/Doctor.tsx +0 -575
  1050. package/src/screens/REPL.tsx +0 -5006
  1051. package/src/screens/ResumeConversation.tsx +0 -399
  1052. package/src/self-hosted-runner/main.ts +0 -2
  1053. package/src/server/backends/dangerousBackend.ts +0 -2
  1054. package/src/server/connectHeadless.ts +0 -2
  1055. package/src/server/createDirectConnectSession.ts +0 -88
  1056. package/src/server/directConnectManager.ts +0 -213
  1057. package/src/server/lockfile.ts +0 -2
  1058. package/src/server/parseConnectUrl.ts +0 -2
  1059. package/src/server/server.ts +0 -2
  1060. package/src/server/serverBanner.ts +0 -2
  1061. package/src/server/serverLog.ts +0 -2
  1062. package/src/server/sessionManager.ts +0 -2
  1063. package/src/server/types.ts +0 -57
  1064. package/src/services/AgentSummary/agentSummary.ts +0 -179
  1065. package/src/services/MagicDocs/magicDocs.ts +0 -254
  1066. package/src/services/MagicDocs/prompts.ts +0 -127
  1067. package/src/services/PromptSuggestion/promptSuggestion.ts +0 -523
  1068. package/src/services/PromptSuggestion/speculation.ts +0 -991
  1069. package/src/services/SessionMemory/prompts.ts +0 -324
  1070. package/src/services/SessionMemory/sessionMemory.ts +0 -495
  1071. package/src/services/SessionMemory/sessionMemoryUtils.ts +0 -207
  1072. package/src/services/analytics/config.ts +0 -38
  1073. package/src/services/analytics/datadog.ts +0 -307
  1074. package/src/services/analytics/firstPartyEventLogger.ts +0 -449
  1075. package/src/services/analytics/firstPartyEventLoggingExporter.ts +0 -806
  1076. package/src/services/analytics/growthbook.ts +0 -1155
  1077. package/src/services/analytics/index.ts +0 -173
  1078. package/src/services/analytics/metadata.ts +0 -973
  1079. package/src/services/analytics/sink.ts +0 -114
  1080. package/src/services/analytics/sinkKillswitch.ts +0 -25
  1081. package/src/services/api/adminRequests.ts +0 -119
  1082. package/src/services/api/bootstrap.ts +0 -141
  1083. package/src/services/api/claude.ts +0 -3419
  1084. package/src/services/api/client.ts +0 -389
  1085. package/src/services/api/dumpPrompts.ts +0 -226
  1086. package/src/services/api/emptyUsage.ts +0 -22
  1087. package/src/services/api/errorUtils.ts +0 -260
  1088. package/src/services/api/errors.ts +0 -1205
  1089. package/src/services/api/filesApi.ts +0 -748
  1090. package/src/services/api/firstTokenDate.ts +0 -60
  1091. package/src/services/api/grove.ts +0 -357
  1092. package/src/services/api/logging.ts +0 -788
  1093. package/src/services/api/metricsOptOut.ts +0 -159
  1094. package/src/services/api/overageCreditGrant.ts +0 -137
  1095. package/src/services/api/promptCacheBreakDetection.ts +0 -727
  1096. package/src/services/api/referral.ts +0 -281
  1097. package/src/services/api/sessionIngress.ts +0 -514
  1098. package/src/services/api/ultrareviewQuota.ts +0 -38
  1099. package/src/services/api/usage.ts +0 -63
  1100. package/src/services/api/withRetry.ts +0 -818
  1101. package/src/services/autoDream/autoDream.ts +0 -324
  1102. package/src/services/autoDream/config.ts +0 -21
  1103. package/src/services/autoDream/consolidationLock.ts +0 -140
  1104. package/src/services/autoDream/consolidationPrompt.ts +0 -65
  1105. package/src/services/autoDream/dream.ts +0 -1
  1106. package/src/services/awaySummary.ts +0 -74
  1107. package/src/services/claudeAiLimits.ts +0 -515
  1108. package/src/services/claudeAiLimitsHook.ts +0 -23
  1109. package/src/services/compact/apiMicrocompact.ts +0 -153
  1110. package/src/services/compact/autoCompact.ts +0 -351
  1111. package/src/services/compact/cachedMCConfig.ts +0 -2
  1112. package/src/services/compact/cachedMicrocompact.ts +0 -2
  1113. package/src/services/compact/compact.ts +0 -1705
  1114. package/src/services/compact/compactWarningHook.ts +0 -16
  1115. package/src/services/compact/compactWarningState.ts +0 -18
  1116. package/src/services/compact/grouping.ts +0 -63
  1117. package/src/services/compact/microCompact.ts +0 -530
  1118. package/src/services/compact/postCompactCleanup.ts +0 -77
  1119. package/src/services/compact/prompt.ts +0 -374
  1120. package/src/services/compact/reactiveCompact.ts +0 -2
  1121. package/src/services/compact/sessionMemoryCompact.ts +0 -630
  1122. package/src/services/compact/snipCompact.ts +0 -1
  1123. package/src/services/compact/snipProjection.ts +0 -2
  1124. package/src/services/compact/timeBasedMCConfig.ts +0 -43
  1125. package/src/services/contextCollapse/index.ts +0 -2
  1126. package/src/services/contextCollapse/operations.ts +0 -2
  1127. package/src/services/contextCollapse/persist.ts +0 -2
  1128. package/src/services/diagnosticTracking.ts +0 -397
  1129. package/src/services/extractMemories/extractMemories.ts +0 -615
  1130. package/src/services/extractMemories/prompts.ts +0 -154
  1131. package/src/services/internalLogging.ts +0 -90
  1132. package/src/services/lsp/LSPClient.ts +0 -447
  1133. package/src/services/lsp/LSPDiagnosticRegistry.ts +0 -386
  1134. package/src/services/lsp/LSPServerInstance.ts +0 -511
  1135. package/src/services/lsp/LSPServerManager.ts +0 -420
  1136. package/src/services/lsp/config.ts +0 -79
  1137. package/src/services/lsp/manager.ts +0 -289
  1138. package/src/services/lsp/passiveFeedback.ts +0 -328
  1139. package/src/services/lsp/types.ts +0 -3
  1140. package/src/services/mcp/InProcessTransport.ts +0 -63
  1141. package/src/services/mcp/MCPConnectionManager.tsx +0 -73
  1142. package/src/services/mcp/SdkControlTransport.ts +0 -136
  1143. package/src/services/mcp/auth.ts +0 -2465
  1144. package/src/services/mcp/channelAllowlist.ts +0 -76
  1145. package/src/services/mcp/channelNotification.ts +0 -316
  1146. package/src/services/mcp/channelPermissions.ts +0 -240
  1147. package/src/services/mcp/claudeai.ts +0 -164
  1148. package/src/services/mcp/client.ts +0 -3348
  1149. package/src/services/mcp/config.ts +0 -1578
  1150. package/src/services/mcp/elicitationHandler.ts +0 -313
  1151. package/src/services/mcp/envExpansion.ts +0 -38
  1152. package/src/services/mcp/headersHelper.ts +0 -138
  1153. package/src/services/mcp/mcpStringUtils.ts +0 -106
  1154. package/src/services/mcp/normalization.ts +0 -23
  1155. package/src/services/mcp/oauthPort.ts +0 -78
  1156. package/src/services/mcp/officialRegistry.ts +0 -72
  1157. package/src/services/mcp/types.ts +0 -258
  1158. package/src/services/mcp/useManageMCPConnections.ts +0 -1141
  1159. package/src/services/mcp/utils.ts +0 -575
  1160. package/src/services/mcp/vscodeSdkMcp.ts +0 -112
  1161. package/src/services/mcp/xaa.ts +0 -511
  1162. package/src/services/mcp/xaaIdpLogin.ts +0 -487
  1163. package/src/services/mcpServerApproval.tsx +0 -41
  1164. package/src/services/mockRateLimits.ts +0 -882
  1165. package/src/services/notifier.ts +0 -156
  1166. package/src/services/oauth/auth-code-listener.ts +0 -211
  1167. package/src/services/oauth/client.ts +0 -566
  1168. package/src/services/oauth/crypto.ts +0 -23
  1169. package/src/services/oauth/getOauthProfile.ts +0 -53
  1170. package/src/services/oauth/index.ts +0 -198
  1171. package/src/services/oauth/types.ts +0 -7
  1172. package/src/services/plugins/PluginInstallationManager.ts +0 -184
  1173. package/src/services/plugins/pluginCliCommands.ts +0 -344
  1174. package/src/services/plugins/pluginOperations.ts +0 -1088
  1175. package/src/services/policyLimits/index.ts +0 -663
  1176. package/src/services/policyLimits/types.ts +0 -27
  1177. package/src/services/preventSleep.ts +0 -165
  1178. package/src/services/rateLimitMessages.ts +0 -344
  1179. package/src/services/rateLimitMocking.ts +0 -144
  1180. package/src/services/remoteManagedSettings/index.ts +0 -638
  1181. package/src/services/remoteManagedSettings/securityCheck.tsx +0 -74
  1182. package/src/services/remoteManagedSettings/syncCache.ts +0 -112
  1183. package/src/services/remoteManagedSettings/syncCacheState.ts +0 -96
  1184. package/src/services/remoteManagedSettings/types.ts +0 -31
  1185. package/src/services/sessionTranscript/sessionTranscript.ts +0 -2
  1186. package/src/services/settingsSync/index.ts +0 -581
  1187. package/src/services/settingsSync/types.ts +0 -67
  1188. package/src/services/skillSearch/featureCheck.ts +0 -2
  1189. package/src/services/skillSearch/localSearch.ts +0 -2
  1190. package/src/services/skillSearch/prefetch.ts +0 -2
  1191. package/src/services/skillSearch/remoteSkillLoader.ts +0 -2
  1192. package/src/services/skillSearch/remoteSkillState.ts +0 -2
  1193. package/src/services/skillSearch/signals.ts +0 -1
  1194. package/src/services/skillSearch/telemetry.ts +0 -2
  1195. package/src/services/teamMemorySync/index.ts +0 -1256
  1196. package/src/services/teamMemorySync/secretScanner.ts +0 -324
  1197. package/src/services/teamMemorySync/teamMemSecretGuard.ts +0 -44
  1198. package/src/services/teamMemorySync/types.ts +0 -156
  1199. package/src/services/teamMemorySync/watcher.ts +0 -387
  1200. package/src/services/tips/tipHistory.ts +0 -17
  1201. package/src/services/tips/tipRegistry.ts +0 -686
  1202. package/src/services/tips/tipScheduler.ts +0 -58
  1203. package/src/services/tips/types.ts +0 -5
  1204. package/src/services/tokenEstimation.ts +0 -495
  1205. package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +0 -112
  1206. package/src/services/tools/StreamingToolExecutor.ts +0 -530
  1207. package/src/services/tools/toolExecution.ts +0 -1745
  1208. package/src/services/tools/toolHooks.ts +0 -650
  1209. package/src/services/tools/toolOrchestration.ts +0 -188
  1210. package/src/services/vcr.ts +0 -406
  1211. package/src/services/voice.ts +0 -525
  1212. package/src/services/voiceKeyterms.ts +0 -106
  1213. package/src/services/voiceStreamSTT.ts +0 -544
  1214. package/src/setup.ts +0 -477
  1215. package/src/shims/bun-bundle.ts +0 -18
  1216. package/src/shims/macro.ts +0 -12
  1217. package/src/skills/bundled/batch.ts +0 -124
  1218. package/src/skills/bundled/claude-api/SKILL.md +0 -1
  1219. package/src/skills/bundled/claude-api/SKILL.md.ts +0 -1
  1220. package/src/skills/bundled/claude-api/csharp/claude-api.md +0 -1
  1221. package/src/skills/bundled/claude-api/csharp/claude-api.md.ts +0 -1
  1222. package/src/skills/bundled/claude-api/curl/examples.md +0 -1
  1223. package/src/skills/bundled/claude-api/curl/examples.md.ts +0 -1
  1224. package/src/skills/bundled/claude-api/go/claude-api.md +0 -1
  1225. package/src/skills/bundled/claude-api/go/claude-api.md.ts +0 -1
  1226. package/src/skills/bundled/claude-api/java/claude-api.md +0 -1
  1227. package/src/skills/bundled/claude-api/java/claude-api.md.ts +0 -1
  1228. package/src/skills/bundled/claude-api/php/claude-api.md +0 -1
  1229. package/src/skills/bundled/claude-api/php/claude-api.md.ts +0 -1
  1230. package/src/skills/bundled/claude-api/python/agent-sdk/README.md +0 -1
  1231. package/src/skills/bundled/claude-api/python/agent-sdk/README.md.ts +0 -1
  1232. package/src/skills/bundled/claude-api/python/agent-sdk/patterns.md +0 -1
  1233. package/src/skills/bundled/claude-api/python/agent-sdk/patterns.md.ts +0 -1
  1234. package/src/skills/bundled/claude-api/python/claude-api/README.md +0 -1
  1235. package/src/skills/bundled/claude-api/python/claude-api/README.md.ts +0 -1
  1236. package/src/skills/bundled/claude-api/python/claude-api/batches.md +0 -1
  1237. package/src/skills/bundled/claude-api/python/claude-api/batches.md.ts +0 -1
  1238. package/src/skills/bundled/claude-api/python/claude-api/files-api.md +0 -1
  1239. package/src/skills/bundled/claude-api/python/claude-api/files-api.md.ts +0 -1
  1240. package/src/skills/bundled/claude-api/python/claude-api/streaming.md +0 -1
  1241. package/src/skills/bundled/claude-api/python/claude-api/streaming.md.ts +0 -1
  1242. package/src/skills/bundled/claude-api/python/claude-api/tool-use.md +0 -1
  1243. package/src/skills/bundled/claude-api/python/claude-api/tool-use.md.ts +0 -1
  1244. package/src/skills/bundled/claude-api/ruby/claude-api.md +0 -1
  1245. package/src/skills/bundled/claude-api/ruby/claude-api.md.ts +0 -1
  1246. package/src/skills/bundled/claude-api/shared/error-codes.md +0 -1
  1247. package/src/skills/bundled/claude-api/shared/error-codes.md.ts +0 -1
  1248. package/src/skills/bundled/claude-api/shared/live-sources.md +0 -1
  1249. package/src/skills/bundled/claude-api/shared/live-sources.md.ts +0 -1
  1250. package/src/skills/bundled/claude-api/shared/models.md +0 -1
  1251. package/src/skills/bundled/claude-api/shared/models.md.ts +0 -1
  1252. package/src/skills/bundled/claude-api/shared/prompt-caching.md +0 -1
  1253. package/src/skills/bundled/claude-api/shared/prompt-caching.md.ts +0 -1
  1254. package/src/skills/bundled/claude-api/shared/tool-use-concepts.md +0 -1
  1255. package/src/skills/bundled/claude-api/shared/tool-use-concepts.md.ts +0 -1
  1256. package/src/skills/bundled/claude-api/typescript/agent-sdk/README.md +0 -1
  1257. package/src/skills/bundled/claude-api/typescript/agent-sdk/README.md.ts +0 -1
  1258. package/src/skills/bundled/claude-api/typescript/agent-sdk/patterns.md +0 -1
  1259. package/src/skills/bundled/claude-api/typescript/agent-sdk/patterns.md.ts +0 -1
  1260. package/src/skills/bundled/claude-api/typescript/claude-api/README.md +0 -1
  1261. package/src/skills/bundled/claude-api/typescript/claude-api/README.md.ts +0 -1
  1262. package/src/skills/bundled/claude-api/typescript/claude-api/batches.md +0 -1
  1263. package/src/skills/bundled/claude-api/typescript/claude-api/batches.md.ts +0 -1
  1264. package/src/skills/bundled/claude-api/typescript/claude-api/files-api.md +0 -1
  1265. package/src/skills/bundled/claude-api/typescript/claude-api/files-api.md.ts +0 -1
  1266. package/src/skills/bundled/claude-api/typescript/claude-api/streaming.md +0 -1
  1267. package/src/skills/bundled/claude-api/typescript/claude-api/streaming.md.ts +0 -1
  1268. package/src/skills/bundled/claude-api/typescript/claude-api/tool-use.md +0 -1
  1269. package/src/skills/bundled/claude-api/typescript/claude-api/tool-use.md.ts +0 -1
  1270. package/src/skills/bundled/claudeApi.ts +0 -196
  1271. package/src/skills/bundled/claudeApiContent.ts +0 -75
  1272. package/src/skills/bundled/claudeInChrome.ts +0 -34
  1273. package/src/skills/bundled/debug.ts +0 -103
  1274. package/src/skills/bundled/dream.ts +0 -1
  1275. package/src/skills/bundled/hunter.ts +0 -1
  1276. package/src/skills/bundled/index.ts +0 -79
  1277. package/src/skills/bundled/keybindings.ts +0 -339
  1278. package/src/skills/bundled/loop.ts +0 -92
  1279. package/src/skills/bundled/loremIpsum.ts +0 -282
  1280. package/src/skills/bundled/remember.ts +0 -82
  1281. package/src/skills/bundled/runSkillGenerator.ts +0 -1
  1282. package/src/skills/bundled/scheduleRemoteAgents.ts +0 -447
  1283. package/src/skills/bundled/simplify.ts +0 -69
  1284. package/src/skills/bundled/skillify.ts +0 -197
  1285. package/src/skills/bundled/stuck.ts +0 -79
  1286. package/src/skills/bundled/updateConfig.ts +0 -475
  1287. package/src/skills/bundled/verify/SKILL.md +0 -1
  1288. package/src/skills/bundled/verify/SKILL.md.ts +0 -1
  1289. package/src/skills/bundled/verify/examples/cli.md +0 -1
  1290. package/src/skills/bundled/verify/examples/cli.md.ts +0 -1
  1291. package/src/skills/bundled/verify/examples/server.md +0 -1
  1292. package/src/skills/bundled/verify/examples/server.md.ts +0 -1
  1293. package/src/skills/bundled/verify.ts +0 -30
  1294. package/src/skills/bundled/verifyContent.ts +0 -13
  1295. package/src/skills/bundledSkills.ts +0 -220
  1296. package/src/skills/loadSkillsDir.ts +0 -1086
  1297. package/src/skills/mcpSkillBuilders.ts +0 -44
  1298. package/src/skills/mcpSkills.ts +0 -2
  1299. package/src/ssh/SSHSessionManager.ts +0 -1
  1300. package/src/ssh/createSSHSession.ts +0 -1
  1301. package/src/state/AppState.tsx +0 -200
  1302. package/src/state/AppStateStore.ts +0 -569
  1303. package/src/state/onChangeAppState.ts +0 -171
  1304. package/src/state/selectors.ts +0 -76
  1305. package/src/state/store.ts +0 -34
  1306. package/src/state/teammateViewHelpers.ts +0 -141
  1307. package/src/tasks/DreamTask/DreamTask.ts +0 -157
  1308. package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +0 -126
  1309. package/src/tasks/InProcessTeammateTask/types.ts +0 -121
  1310. package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +0 -683
  1311. package/src/tasks/LocalMainSessionTask.ts +0 -479
  1312. package/src/tasks/LocalShellTask/LocalShellTask.tsx +0 -523
  1313. package/src/tasks/LocalShellTask/guards.ts +0 -41
  1314. package/src/tasks/LocalShellTask/killShellTasks.ts +0 -76
  1315. package/src/tasks/LocalWorkflowTask/LocalWorkflowTask.ts +0 -1
  1316. package/src/tasks/MonitorMcpTask/MonitorMcpTask.ts +0 -1
  1317. package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +0 -856
  1318. package/src/tasks/pillLabel.ts +0 -82
  1319. package/src/tasks/stopTask.ts +0 -100
  1320. package/src/tasks/types.ts +0 -46
  1321. package/src/tasks.ts +0 -39
  1322. package/src/tools/AgentTool/AgentTool.tsx +0 -1398
  1323. package/src/tools/AgentTool/UI.tsx +0 -872
  1324. package/src/tools/AgentTool/agentColorManager.ts +0 -66
  1325. package/src/tools/AgentTool/agentDisplay.ts +0 -104
  1326. package/src/tools/AgentTool/agentMemory.ts +0 -177
  1327. package/src/tools/AgentTool/agentMemorySnapshot.ts +0 -197
  1328. package/src/tools/AgentTool/agentToolUtils.ts +0 -686
  1329. package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +0 -205
  1330. package/src/tools/AgentTool/built-in/exploreAgent.ts +0 -87
  1331. package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +0 -34
  1332. package/src/tools/AgentTool/built-in/planAgent.ts +0 -92
  1333. package/src/tools/AgentTool/built-in/statuslineSetup.ts +0 -144
  1334. package/src/tools/AgentTool/built-in/verificationAgent.ts +0 -152
  1335. package/src/tools/AgentTool/built-in/warpGrepAgent.ts +0 -67
  1336. package/src/tools/AgentTool/builtInAgents.ts +0 -73
  1337. package/src/tools/AgentTool/constants.ts +0 -12
  1338. package/src/tools/AgentTool/forkSubagent.ts +0 -210
  1339. package/src/tools/AgentTool/loadAgentsDir.ts +0 -755
  1340. package/src/tools/AgentTool/prompt.ts +0 -288
  1341. package/src/tools/AgentTool/resumeAgent.ts +0 -265
  1342. package/src/tools/AgentTool/runAgent.ts +0 -973
  1343. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +0 -266
  1344. package/src/tools/AskUserQuestionTool/prompt.ts +0 -44
  1345. package/src/tools/BashTool/BashTool.tsx +0 -1144
  1346. package/src/tools/BashTool/BashToolResultMessage.tsx +0 -191
  1347. package/src/tools/BashTool/UI.tsx +0 -185
  1348. package/src/tools/BashTool/bashCommandHelpers.ts +0 -265
  1349. package/src/tools/BashTool/bashPermissions.ts +0 -2621
  1350. package/src/tools/BashTool/bashSecurity.ts +0 -2592
  1351. package/src/tools/BashTool/commandSemantics.ts +0 -140
  1352. package/src/tools/BashTool/commentLabel.ts +0 -13
  1353. package/src/tools/BashTool/destructiveCommandWarning.ts +0 -102
  1354. package/src/tools/BashTool/modeValidation.ts +0 -115
  1355. package/src/tools/BashTool/pathValidation.ts +0 -1303
  1356. package/src/tools/BashTool/prompt.ts +0 -369
  1357. package/src/tools/BashTool/readOnlyValidation.ts +0 -1990
  1358. package/src/tools/BashTool/sedEditParser.ts +0 -322
  1359. package/src/tools/BashTool/sedValidation.ts +0 -684
  1360. package/src/tools/BashTool/shouldUseSandbox.ts +0 -153
  1361. package/src/tools/BashTool/toolName.ts +0 -2
  1362. package/src/tools/BashTool/utils.ts +0 -223
  1363. package/src/tools/BriefTool/BriefTool.ts +0 -204
  1364. package/src/tools/BriefTool/UI.tsx +0 -101
  1365. package/src/tools/BriefTool/attachments.ts +0 -110
  1366. package/src/tools/BriefTool/prompt.ts +0 -22
  1367. package/src/tools/BriefTool/upload.ts +0 -174
  1368. package/src/tools/ConfigTool/ConfigTool.ts +0 -467
  1369. package/src/tools/ConfigTool/UI.tsx +0 -38
  1370. package/src/tools/ConfigTool/constants.ts +0 -1
  1371. package/src/tools/ConfigTool/prompt.ts +0 -93
  1372. package/src/tools/ConfigTool/supportedSettings.ts +0 -211
  1373. package/src/tools/CtxInspectTool/CtxInspectTool.ts +0 -1
  1374. package/src/tools/DiscoverSkillsTool/prompt.ts +0 -2
  1375. package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +0 -126
  1376. package/src/tools/EnterPlanModeTool/UI.tsx +0 -33
  1377. package/src/tools/EnterPlanModeTool/constants.ts +0 -1
  1378. package/src/tools/EnterPlanModeTool/prompt.ts +0 -170
  1379. package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +0 -127
  1380. package/src/tools/EnterWorktreeTool/UI.tsx +0 -20
  1381. package/src/tools/EnterWorktreeTool/constants.ts +0 -1
  1382. package/src/tools/EnterWorktreeTool/prompt.ts +0 -30
  1383. package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +0 -493
  1384. package/src/tools/ExitPlanModeTool/UI.tsx +0 -82
  1385. package/src/tools/ExitPlanModeTool/constants.ts +0 -2
  1386. package/src/tools/ExitPlanModeTool/prompt.ts +0 -29
  1387. package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +0 -329
  1388. package/src/tools/ExitWorktreeTool/UI.tsx +0 -25
  1389. package/src/tools/ExitWorktreeTool/constants.ts +0 -1
  1390. package/src/tools/ExitWorktreeTool/prompt.ts +0 -32
  1391. package/src/tools/FileEditTool/FileEditTool.ts +0 -625
  1392. package/src/tools/FileEditTool/UI.tsx +0 -289
  1393. package/src/tools/FileEditTool/constants.ts +0 -11
  1394. package/src/tools/FileEditTool/prompt.ts +0 -28
  1395. package/src/tools/FileEditTool/types.ts +0 -85
  1396. package/src/tools/FileEditTool/utils.ts +0 -775
  1397. package/src/tools/FileReadTool/FileReadTool.ts +0 -1183
  1398. package/src/tools/FileReadTool/UI.tsx +0 -185
  1399. package/src/tools/FileReadTool/imageProcessor.ts +0 -94
  1400. package/src/tools/FileReadTool/limits.ts +0 -92
  1401. package/src/tools/FileReadTool/prompt.ts +0 -49
  1402. package/src/tools/FileWriteTool/FileWriteTool.ts +0 -434
  1403. package/src/tools/FileWriteTool/UI.tsx +0 -405
  1404. package/src/tools/FileWriteTool/prompt.ts +0 -18
  1405. package/src/tools/GlobTool/GlobTool.ts +0 -198
  1406. package/src/tools/GlobTool/UI.tsx +0 -63
  1407. package/src/tools/GlobTool/prompt.ts +0 -7
  1408. package/src/tools/GrepTool/GrepTool.ts +0 -577
  1409. package/src/tools/GrepTool/UI.tsx +0 -201
  1410. package/src/tools/GrepTool/prompt.ts +0 -18
  1411. package/src/tools/LSPTool/LSPTool.ts +0 -860
  1412. package/src/tools/LSPTool/UI.tsx +0 -228
  1413. package/src/tools/LSPTool/formatters.ts +0 -592
  1414. package/src/tools/LSPTool/prompt.ts +0 -21
  1415. package/src/tools/LSPTool/schemas.ts +0 -215
  1416. package/src/tools/LSPTool/symbolContext.ts +0 -90
  1417. package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +0 -123
  1418. package/src/tools/ListMcpResourcesTool/UI.tsx +0 -29
  1419. package/src/tools/ListMcpResourcesTool/prompt.ts +0 -20
  1420. package/src/tools/ListPeersTool/ListPeersTool.ts +0 -1
  1421. package/src/tools/MCPTool/MCPTool.ts +0 -77
  1422. package/src/tools/MCPTool/UI.tsx +0 -403
  1423. package/src/tools/MCPTool/classifyForCollapse.ts +0 -604
  1424. package/src/tools/MCPTool/prompt.ts +0 -3
  1425. package/src/tools/McpAuthTool/McpAuthTool.ts +0 -215
  1426. package/src/tools/MonitorTool/MonitorTool.ts +0 -2
  1427. package/src/tools/NotebookEditTool/NotebookEditTool.ts +0 -490
  1428. package/src/tools/NotebookEditTool/UI.tsx +0 -93
  1429. package/src/tools/NotebookEditTool/constants.ts +0 -2
  1430. package/src/tools/NotebookEditTool/prompt.ts +0 -3
  1431. package/src/tools/OverflowTestTool/OverflowTestTool.ts +0 -2
  1432. package/src/tools/PowerShellTool/PowerShellTool.tsx +0 -1001
  1433. package/src/tools/PowerShellTool/UI.tsx +0 -131
  1434. package/src/tools/PowerShellTool/clmTypes.ts +0 -211
  1435. package/src/tools/PowerShellTool/commandSemantics.ts +0 -142
  1436. package/src/tools/PowerShellTool/commonParameters.ts +0 -30
  1437. package/src/tools/PowerShellTool/destructiveCommandWarning.ts +0 -109
  1438. package/src/tools/PowerShellTool/gitSafety.ts +0 -176
  1439. package/src/tools/PowerShellTool/modeValidation.ts +0 -404
  1440. package/src/tools/PowerShellTool/pathValidation.ts +0 -2049
  1441. package/src/tools/PowerShellTool/powershellPermissions.ts +0 -1648
  1442. package/src/tools/PowerShellTool/powershellSecurity.ts +0 -1090
  1443. package/src/tools/PowerShellTool/prompt.ts +0 -145
  1444. package/src/tools/PowerShellTool/readOnlyValidation.ts +0 -1823
  1445. package/src/tools/PowerShellTool/toolName.ts +0 -2
  1446. package/src/tools/PushNotificationTool/PushNotificationTool.ts +0 -1
  1447. package/src/tools/REPLTool/REPLTool.ts +0 -1
  1448. package/src/tools/REPLTool/constants.ts +0 -46
  1449. package/src/tools/REPLTool/primitiveTools.ts +0 -39
  1450. package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +0 -158
  1451. package/src/tools/ReadMcpResourceTool/UI.tsx +0 -37
  1452. package/src/tools/ReadMcpResourceTool/prompt.ts +0 -16
  1453. package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +0 -161
  1454. package/src/tools/RemoteTriggerTool/UI.tsx +0 -17
  1455. package/src/tools/RemoteTriggerTool/prompt.ts +0 -15
  1456. package/src/tools/ReviewArtifactTool/ReviewArtifactTool.ts +0 -2
  1457. package/src/tools/ScheduleCronTool/CronCreateTool.ts +0 -157
  1458. package/src/tools/ScheduleCronTool/CronDeleteTool.ts +0 -95
  1459. package/src/tools/ScheduleCronTool/CronListTool.ts +0 -97
  1460. package/src/tools/ScheduleCronTool/UI.tsx +0 -60
  1461. package/src/tools/ScheduleCronTool/prompt.ts +0 -135
  1462. package/src/tools/SendMessageTool/SendMessageTool.ts +0 -917
  1463. package/src/tools/SendMessageTool/UI.tsx +0 -31
  1464. package/src/tools/SendMessageTool/constants.ts +0 -1
  1465. package/src/tools/SendMessageTool/prompt.ts +0 -49
  1466. package/src/tools/SendUserFileTool/SendUserFileTool.ts +0 -1
  1467. package/src/tools/SendUserFileTool/prompt.ts +0 -2
  1468. package/src/tools/SkillTool/SkillTool.ts +0 -1108
  1469. package/src/tools/SkillTool/UI.tsx +0 -128
  1470. package/src/tools/SkillTool/constants.ts +0 -1
  1471. package/src/tools/SkillTool/prompt.ts +0 -241
  1472. package/src/tools/SleepTool/SleepTool.ts +0 -1
  1473. package/src/tools/SleepTool/prompt.ts +0 -17
  1474. package/src/tools/SnipTool/SnipTool.ts +0 -1
  1475. package/src/tools/SnipTool/prompt.ts +0 -2
  1476. package/src/tools/SubscribePRTool/SubscribePRTool.ts +0 -1
  1477. package/src/tools/SuggestBackgroundPRTool/SuggestBackgroundPRTool.ts +0 -1
  1478. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +0 -163
  1479. package/src/tools/TaskCreateTool/TaskCreateTool.ts +0 -138
  1480. package/src/tools/TaskCreateTool/constants.ts +0 -1
  1481. package/src/tools/TaskCreateTool/prompt.ts +0 -56
  1482. package/src/tools/TaskGetTool/TaskGetTool.ts +0 -128
  1483. package/src/tools/TaskGetTool/constants.ts +0 -1
  1484. package/src/tools/TaskGetTool/prompt.ts +0 -24
  1485. package/src/tools/TaskListTool/TaskListTool.ts +0 -116
  1486. package/src/tools/TaskListTool/constants.ts +0 -1
  1487. package/src/tools/TaskListTool/prompt.ts +0 -49
  1488. package/src/tools/TaskOutputTool/TaskOutputTool.tsx +0 -584
  1489. package/src/tools/TaskOutputTool/constants.ts +0 -1
  1490. package/src/tools/TaskStopTool/TaskStopTool.ts +0 -131
  1491. package/src/tools/TaskStopTool/UI.tsx +0 -41
  1492. package/src/tools/TaskStopTool/prompt.ts +0 -8
  1493. package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +0 -406
  1494. package/src/tools/TaskUpdateTool/constants.ts +0 -1
  1495. package/src/tools/TaskUpdateTool/prompt.ts +0 -77
  1496. package/src/tools/TeamCreateTool/TeamCreateTool.ts +0 -240
  1497. package/src/tools/TeamCreateTool/UI.tsx +0 -6
  1498. package/src/tools/TeamCreateTool/constants.ts +0 -1
  1499. package/src/tools/TeamCreateTool/prompt.ts +0 -113
  1500. package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +0 -139
  1501. package/src/tools/TeamDeleteTool/UI.tsx +0 -20
  1502. package/src/tools/TeamDeleteTool/constants.ts +0 -1
  1503. package/src/tools/TeamDeleteTool/prompt.ts +0 -16
  1504. package/src/tools/TerminalCaptureTool/TerminalCaptureTool.ts +0 -1
  1505. package/src/tools/TerminalCaptureTool/prompt.ts +0 -2
  1506. package/src/tools/TodoWriteTool/TodoWriteTool.ts +0 -115
  1507. package/src/tools/TodoWriteTool/constants.ts +0 -1
  1508. package/src/tools/TodoWriteTool/prompt.ts +0 -184
  1509. package/src/tools/ToolSearchTool/ToolSearchTool.ts +0 -471
  1510. package/src/tools/ToolSearchTool/constants.ts +0 -1
  1511. package/src/tools/ToolSearchTool/prompt.ts +0 -121
  1512. package/src/tools/TungstenTool/TungstenLiveMonitor.ts +0 -3
  1513. package/src/tools/TungstenTool/TungstenLiveMonitor.tsx +0 -6
  1514. package/src/tools/TungstenTool/TungstenTool.ts +0 -26
  1515. package/src/tools/VerifyPlanExecutionTool/VerifyPlanExecutionTool.ts +0 -1
  1516. package/src/tools/VerifyPlanExecutionTool/constants.ts +0 -2
  1517. package/src/tools/WarpGrepTool/WarpGrepTool.ts +0 -106
  1518. package/src/tools/WebBrowserTool/WebBrowserPanel.ts +0 -2
  1519. package/src/tools/WebBrowserTool/WebBrowserTool.ts +0 -1
  1520. package/src/tools/WebFetchTool/UI.tsx +0 -72
  1521. package/src/tools/WebFetchTool/WebFetchTool.ts +0 -318
  1522. package/src/tools/WebFetchTool/preapproved.ts +0 -166
  1523. package/src/tools/WebFetchTool/prompt.ts +0 -46
  1524. package/src/tools/WebFetchTool/utils.ts +0 -530
  1525. package/src/tools/WebSearchTool/UI.tsx +0 -101
  1526. package/src/tools/WebSearchTool/WebSearchTool.ts +0 -435
  1527. package/src/tools/WebSearchTool/prompt.ts +0 -34
  1528. package/src/tools/WorkflowTool/WorkflowPermissionRequest.ts +0 -2
  1529. package/src/tools/WorkflowTool/WorkflowTool.ts +0 -2
  1530. package/src/tools/WorkflowTool/bundled/index.ts +0 -1
  1531. package/src/tools/WorkflowTool/constants.ts +0 -1
  1532. package/src/tools/WorkflowTool/createWorkflowCommand.ts +0 -2
  1533. package/src/tools/shared/gitOperationTracking.ts +0 -277
  1534. package/src/tools/shared/spawnMultiAgent.ts +0 -1093
  1535. package/src/tools/testing/TestingPermissionTool.tsx +0 -74
  1536. package/src/tools/utils.ts +0 -40
  1537. package/src/tools.ts +0 -394
  1538. package/src/types/command.ts +0 -216
  1539. package/src/types/connectorText.ts +0 -3
  1540. package/src/types/declarations/bun-globals.d.ts +0 -19
  1541. package/src/types/declarations/external-modules.d.ts +0 -120
  1542. package/src/types/declarations/react-compiler.d.ts +0 -3
  1543. package/src/types/fileSuggestion.ts +0 -1
  1544. package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +0 -865
  1545. package/src/types/generated/events_mono/common/v1/auth.ts +0 -100
  1546. package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +0 -223
  1547. package/src/types/generated/google/protobuf/timestamp.ts +0 -187
  1548. package/src/types/hooks.ts +0 -290
  1549. package/src/types/ids.ts +0 -44
  1550. package/src/types/logs.ts +0 -330
  1551. package/src/types/message.ts +0 -40
  1552. package/src/types/messageQueueTypes.ts +0 -2
  1553. package/src/types/notebook.ts +0 -7
  1554. package/src/types/permissions.ts +0 -441
  1555. package/src/types/plugin.ts +0 -363
  1556. package/src/types/statusLine.ts +0 -1
  1557. package/src/types/textInputTypes.ts +0 -387
  1558. package/src/types/tools.ts +0 -11
  1559. package/src/types/utils.ts +0 -2
  1560. package/src/upstreamproxy/relay.ts +0 -455
  1561. package/src/upstreamproxy/upstreamproxy.ts +0 -285
  1562. package/src/utils/CircularBuffer.ts +0 -84
  1563. package/src/utils/Cursor.ts +0 -1530
  1564. package/src/utils/QueryGuard.ts +0 -121
  1565. package/src/utils/Shell.ts +0 -474
  1566. package/src/utils/ShellCommand.ts +0 -465
  1567. package/src/utils/abortController.ts +0 -99
  1568. package/src/utils/activityManager.ts +0 -164
  1569. package/src/utils/advisor.ts +0 -145
  1570. package/src/utils/agentContext.ts +0 -178
  1571. package/src/utils/agentId.ts +0 -99
  1572. package/src/utils/agentSwarmsEnabled.ts +0 -44
  1573. package/src/utils/agenticSessionSearch.ts +0 -307
  1574. package/src/utils/analyzeContext.ts +0 -1382
  1575. package/src/utils/ansiToPng.ts +0 -334
  1576. package/src/utils/ansiToSvg.ts +0 -272
  1577. package/src/utils/api.ts +0 -718
  1578. package/src/utils/apiPreconnect.ts +0 -71
  1579. package/src/utils/appleTerminalBackup.ts +0 -124
  1580. package/src/utils/argumentSubstitution.ts +0 -145
  1581. package/src/utils/array.ts +0 -13
  1582. package/src/utils/asciicast.ts +0 -239
  1583. package/src/utils/attachments.ts +0 -3997
  1584. package/src/utils/attribution.ts +0 -393
  1585. package/src/utils/attributionHooks.ts +0 -2
  1586. package/src/utils/attributionTrailer.ts +0 -2
  1587. package/src/utils/auth.ts +0 -2002
  1588. package/src/utils/authFileDescriptor.ts +0 -196
  1589. package/src/utils/authPortable.ts +0 -19
  1590. package/src/utils/autoModeDenials.ts +0 -26
  1591. package/src/utils/autoRunIssue.tsx +0 -122
  1592. package/src/utils/autoUpdater.ts +0 -561
  1593. package/src/utils/aws.ts +0 -74
  1594. package/src/utils/awsAuthStatusManager.ts +0 -81
  1595. package/src/utils/background/remote/preconditions.ts +0 -235
  1596. package/src/utils/background/remote/remoteSession.ts +0 -98
  1597. package/src/utils/backgroundHousekeeping.ts +0 -94
  1598. package/src/utils/bash/ParsedCommand.ts +0 -318
  1599. package/src/utils/bash/ShellSnapshot.ts +0 -582
  1600. package/src/utils/bash/ast.ts +0 -2679
  1601. package/src/utils/bash/bashParser.ts +0 -4436
  1602. package/src/utils/bash/bashPipeCommand.ts +0 -294
  1603. package/src/utils/bash/commands.ts +0 -1339
  1604. package/src/utils/bash/heredoc.ts +0 -733
  1605. package/src/utils/bash/parser.ts +0 -230
  1606. package/src/utils/bash/prefix.ts +0 -204
  1607. package/src/utils/bash/registry.ts +0 -53
  1608. package/src/utils/bash/shellCompletion.ts +0 -259
  1609. package/src/utils/bash/shellPrefix.ts +0 -28
  1610. package/src/utils/bash/shellQuote.ts +0 -304
  1611. package/src/utils/bash/shellQuoting.ts +0 -128
  1612. package/src/utils/bash/specs/alias.ts +0 -14
  1613. package/src/utils/bash/specs/index.ts +0 -18
  1614. package/src/utils/bash/specs/nohup.ts +0 -13
  1615. package/src/utils/bash/specs/pyright.ts +0 -91
  1616. package/src/utils/bash/specs/sleep.ts +0 -13
  1617. package/src/utils/bash/specs/srun.ts +0 -31
  1618. package/src/utils/bash/specs/time.ts +0 -13
  1619. package/src/utils/bash/specs/timeout.ts +0 -20
  1620. package/src/utils/bash/treeSitterAnalysis.ts +0 -506
  1621. package/src/utils/betas.ts +0 -434
  1622. package/src/utils/billing.ts +0 -78
  1623. package/src/utils/binaryCheck.ts +0 -53
  1624. package/src/utils/browser.ts +0 -68
  1625. package/src/utils/bufferedWriter.ts +0 -100
  1626. package/src/utils/bundledMode.ts +0 -22
  1627. package/src/utils/caCerts.ts +0 -115
  1628. package/src/utils/caCertsConfig.ts +0 -88
  1629. package/src/utils/cachePaths.ts +0 -38
  1630. package/src/utils/ccshareResume.ts +0 -2
  1631. package/src/utils/classifierApprovals.ts +0 -88
  1632. package/src/utils/classifierApprovalsHook.ts +0 -17
  1633. package/src/utils/claudeCodeHints.ts +0 -193
  1634. package/src/utils/claudeDesktop.ts +0 -152
  1635. package/src/utils/claudeInChrome/chromeNativeHost.ts +0 -527
  1636. package/src/utils/claudeInChrome/common.ts +0 -540
  1637. package/src/utils/claudeInChrome/mcpServer.ts +0 -293
  1638. package/src/utils/claudeInChrome/prompt.ts +0 -83
  1639. package/src/utils/claudeInChrome/setup.ts +0 -400
  1640. package/src/utils/claudeInChrome/setupPortable.ts +0 -233
  1641. package/src/utils/claudeInChrome/toolRendering.tsx +0 -262
  1642. package/src/utils/claudemd.ts +0 -1479
  1643. package/src/utils/cleanup.ts +0 -602
  1644. package/src/utils/cleanupRegistry.ts +0 -25
  1645. package/src/utils/cliArgs.ts +0 -60
  1646. package/src/utils/cliHighlight.ts +0 -54
  1647. package/src/utils/codeIndexing.ts +0 -206
  1648. package/src/utils/collapseBackgroundBashNotifications.ts +0 -84
  1649. package/src/utils/collapseHookSummaries.ts +0 -59
  1650. package/src/utils/collapseReadSearch.ts +0 -1109
  1651. package/src/utils/collapseTeammateShutdowns.ts +0 -55
  1652. package/src/utils/combinedAbortSignal.ts +0 -47
  1653. package/src/utils/commandLifecycle.ts +0 -21
  1654. package/src/utils/commitAttribution.ts +0 -961
  1655. package/src/utils/completionCache.ts +0 -166
  1656. package/src/utils/computerUse/appNames.ts +0 -196
  1657. package/src/utils/computerUse/cleanup.ts +0 -86
  1658. package/src/utils/computerUse/common.ts +0 -61
  1659. package/src/utils/computerUse/computerUseLock.ts +0 -215
  1660. package/src/utils/computerUse/drainRunLoop.ts +0 -79
  1661. package/src/utils/computerUse/escHotkey.ts +0 -54
  1662. package/src/utils/computerUse/executor.ts +0 -658
  1663. package/src/utils/computerUse/gates.ts +0 -72
  1664. package/src/utils/computerUse/hostAdapter.ts +0 -69
  1665. package/src/utils/computerUse/inputLoader.ts +0 -30
  1666. package/src/utils/computerUse/mcpServer.ts +0 -106
  1667. package/src/utils/computerUse/setup.ts +0 -53
  1668. package/src/utils/computerUse/swiftLoader.ts +0 -23
  1669. package/src/utils/computerUse/toolRendering.tsx +0 -125
  1670. package/src/utils/computerUse/wrapper.tsx +0 -336
  1671. package/src/utils/concurrentSessions.ts +0 -204
  1672. package/src/utils/config.ts +0 -1817
  1673. package/src/utils/configConstants.ts +0 -21
  1674. package/src/utils/contentArray.ts +0 -51
  1675. package/src/utils/context.ts +0 -221
  1676. package/src/utils/contextAnalysis.ts +0 -272
  1677. package/src/utils/contextSuggestions.ts +0 -235
  1678. package/src/utils/controlMessageCompat.ts +0 -32
  1679. package/src/utils/conversationRecovery.ts +0 -597
  1680. package/src/utils/cron.ts +0 -308
  1681. package/src/utils/cronJitterConfig.ts +0 -75
  1682. package/src/utils/cronScheduler.ts +0 -565
  1683. package/src/utils/cronTasks.ts +0 -458
  1684. package/src/utils/cronTasksLock.ts +0 -195
  1685. package/src/utils/crossProjectResume.ts +0 -75
  1686. package/src/utils/crypto.ts +0 -13
  1687. package/src/utils/cwd.ts +0 -32
  1688. package/src/utils/debug.ts +0 -268
  1689. package/src/utils/debugFilter.ts +0 -157
  1690. package/src/utils/deepLink/banner.ts +0 -123
  1691. package/src/utils/deepLink/parseDeepLink.ts +0 -170
  1692. package/src/utils/deepLink/protocolHandler.ts +0 -136
  1693. package/src/utils/deepLink/registerProtocol.ts +0 -348
  1694. package/src/utils/deepLink/terminalLauncher.ts +0 -557
  1695. package/src/utils/deepLink/terminalPreference.ts +0 -54
  1696. package/src/utils/desktopDeepLink.ts +0 -236
  1697. package/src/utils/detectRepository.ts +0 -178
  1698. package/src/utils/diagLogs.ts +0 -94
  1699. package/src/utils/diff.ts +0 -177
  1700. package/src/utils/directMemberMessage.ts +0 -69
  1701. package/src/utils/displayTags.ts +0 -51
  1702. package/src/utils/doctorContextWarnings.ts +0 -265
  1703. package/src/utils/doctorDiagnostic.ts +0 -625
  1704. package/src/utils/dxt/helpers.ts +0 -88
  1705. package/src/utils/dxt/zip.ts +0 -226
  1706. package/src/utils/earlyInput.ts +0 -191
  1707. package/src/utils/editor.ts +0 -183
  1708. package/src/utils/effort.ts +0 -329
  1709. package/src/utils/embeddedTools.ts +0 -29
  1710. package/src/utils/env.ts +0 -347
  1711. package/src/utils/envDynamic.ts +0 -151
  1712. package/src/utils/envUtils.ts +0 -183
  1713. package/src/utils/envValidation.ts +0 -38
  1714. package/src/utils/errorLogSink.ts +0 -235
  1715. package/src/utils/errors.ts +0 -238
  1716. package/src/utils/eventLoopStallDetector.ts +0 -2
  1717. package/src/utils/exampleCommands.ts +0 -184
  1718. package/src/utils/execFileNoThrow.ts +0 -150
  1719. package/src/utils/execFileNoThrowPortable.ts +0 -89
  1720. package/src/utils/execSyncWrapper.ts +0 -38
  1721. package/src/utils/exportRenderer.tsx +0 -98
  1722. package/src/utils/extraUsage.ts +0 -23
  1723. package/src/utils/fastMode.ts +0 -532
  1724. package/src/utils/file.ts +0 -584
  1725. package/src/utils/fileHistory.ts +0 -1115
  1726. package/src/utils/fileOperationAnalytics.ts +0 -71
  1727. package/src/utils/filePersistence/filePersistence.ts +0 -287
  1728. package/src/utils/filePersistence/outputsScanner.ts +0 -126
  1729. package/src/utils/filePersistence/types.ts +0 -33
  1730. package/src/utils/fileRead.ts +0 -102
  1731. package/src/utils/fileReadCache.ts +0 -96
  1732. package/src/utils/fileStateCache.ts +0 -142
  1733. package/src/utils/findExecutable.ts +0 -17
  1734. package/src/utils/fingerprint.ts +0 -76
  1735. package/src/utils/forkedAgent.ts +0 -689
  1736. package/src/utils/format.ts +0 -308
  1737. package/src/utils/formatBriefTimestamp.ts +0 -81
  1738. package/src/utils/fpsTracker.ts +0 -47
  1739. package/src/utils/frontmatterParser.ts +0 -370
  1740. package/src/utils/fsOperations.ts +0 -770
  1741. package/src/utils/fullscreen.ts +0 -202
  1742. package/src/utils/generatedFiles.ts +0 -136
  1743. package/src/utils/generators.ts +0 -88
  1744. package/src/utils/genericProcessUtils.ts +0 -184
  1745. package/src/utils/getWorktreePaths.ts +0 -70
  1746. package/src/utils/getWorktreePathsPortable.ts +0 -27
  1747. package/src/utils/ghPrStatus.ts +0 -106
  1748. package/src/utils/git/gitConfigParser.ts +0 -277
  1749. package/src/utils/git/gitFilesystem.ts +0 -699
  1750. package/src/utils/git/gitignore.ts +0 -99
  1751. package/src/utils/git.ts +0 -926
  1752. package/src/utils/gitDiff.ts +0 -532
  1753. package/src/utils/gitSettings.ts +0 -18
  1754. package/src/utils/github/ghAuthStatus.ts +0 -29
  1755. package/src/utils/githubRepoPathMapping.ts +0 -162
  1756. package/src/utils/glob.ts +0 -130
  1757. package/src/utils/gracefulShutdown.ts +0 -529
  1758. package/src/utils/groupToolUses.ts +0 -182
  1759. package/src/utils/handlePromptSubmit.ts +0 -610
  1760. package/src/utils/hash.ts +0 -46
  1761. package/src/utils/headlessProfiler.ts +0 -178
  1762. package/src/utils/heapDumpService.ts +0 -303
  1763. package/src/utils/heatmap.ts +0 -198
  1764. package/src/utils/highlightMatch.tsx +0 -28
  1765. package/src/utils/hooks/AsyncHookRegistry.ts +0 -309
  1766. package/src/utils/hooks/apiQueryHookHelper.ts +0 -141
  1767. package/src/utils/hooks/execAgentHook.ts +0 -339
  1768. package/src/utils/hooks/execHttpHook.ts +0 -242
  1769. package/src/utils/hooks/execPromptHook.ts +0 -211
  1770. package/src/utils/hooks/fileChangedWatcher.ts +0 -191
  1771. package/src/utils/hooks/hookEvents.ts +0 -192
  1772. package/src/utils/hooks/hookHelpers.ts +0 -83
  1773. package/src/utils/hooks/hooksConfigManager.ts +0 -400
  1774. package/src/utils/hooks/hooksConfigSnapshot.ts +0 -133
  1775. package/src/utils/hooks/hooksSettings.ts +0 -271
  1776. package/src/utils/hooks/postSamplingHooks.ts +0 -70
  1777. package/src/utils/hooks/registerFrontmatterHooks.ts +0 -67
  1778. package/src/utils/hooks/registerSkillHooks.ts +0 -64
  1779. package/src/utils/hooks/sessionHooks.ts +0 -447
  1780. package/src/utils/hooks/skillImprovement.ts +0 -267
  1781. package/src/utils/hooks/ssrfGuard.ts +0 -294
  1782. package/src/utils/hooks.ts +0 -5022
  1783. package/src/utils/horizontalScroll.ts +0 -137
  1784. package/src/utils/http.ts +0 -136
  1785. package/src/utils/hyperlink.ts +0 -39
  1786. package/src/utils/iTermBackup.ts +0 -73
  1787. package/src/utils/ide.ts +0 -1494
  1788. package/src/utils/idePathConversion.ts +0 -90
  1789. package/src/utils/idleTimeout.ts +0 -53
  1790. package/src/utils/imagePaste.ts +0 -416
  1791. package/src/utils/imageResizer.ts +0 -880
  1792. package/src/utils/imageStore.ts +0 -167
  1793. package/src/utils/imageValidation.ts +0 -104
  1794. package/src/utils/immediateCommand.ts +0 -15
  1795. package/src/utils/inProcessTeammateHelpers.ts +0 -102
  1796. package/src/utils/ink.ts +0 -26
  1797. package/src/utils/intl.ts +0 -94
  1798. package/src/utils/jetbrains.ts +0 -191
  1799. package/src/utils/json.ts +0 -277
  1800. package/src/utils/jsonRead.ts +0 -16
  1801. package/src/utils/keyboardShortcuts.ts +0 -14
  1802. package/src/utils/lazySchema.ts +0 -8
  1803. package/src/utils/listSessionsImpl.ts +0 -454
  1804. package/src/utils/localInstaller.ts +0 -162
  1805. package/src/utils/lockfile.ts +0 -43
  1806. package/src/utils/log.ts +0 -362
  1807. package/src/utils/logoV2Utils.ts +0 -350
  1808. package/src/utils/mailbox.ts +0 -73
  1809. package/src/utils/managedEnv.ts +0 -199
  1810. package/src/utils/managedEnvConstants.ts +0 -191
  1811. package/src/utils/markdown.ts +0 -381
  1812. package/src/utils/markdownConfigLoader.ts +0 -600
  1813. package/src/utils/mcp/dateTimeParser.ts +0 -121
  1814. package/src/utils/mcp/elicitationValidation.ts +0 -336
  1815. package/src/utils/mcpInstructionsDelta.ts +0 -130
  1816. package/src/utils/mcpOutputStorage.ts +0 -189
  1817. package/src/utils/mcpValidation.ts +0 -208
  1818. package/src/utils/mcpWebSocketTransport.ts +0 -200
  1819. package/src/utils/memoize.ts +0 -269
  1820. package/src/utils/memory/types.ts +0 -12
  1821. package/src/utils/memory/versions.ts +0 -8
  1822. package/src/utils/memoryFileDetection.ts +0 -289
  1823. package/src/utils/messagePredicates.ts +0 -8
  1824. package/src/utils/messageQueueManager.ts +0 -547
  1825. package/src/utils/messages/mappers.ts +0 -290
  1826. package/src/utils/messages/systemInit.ts +0 -96
  1827. package/src/utils/messages.ts +0 -5512
  1828. package/src/utils/model/agent.ts +0 -157
  1829. package/src/utils/model/aliases.ts +0 -25
  1830. package/src/utils/model/antModels.ts +0 -64
  1831. package/src/utils/model/bedrock.ts +0 -265
  1832. package/src/utils/model/check1mAccess.ts +0 -72
  1833. package/src/utils/model/configs.ts +0 -118
  1834. package/src/utils/model/contextWindowUpgradeCheck.ts +0 -47
  1835. package/src/utils/model/deprecation.ts +0 -101
  1836. package/src/utils/model/model.ts +0 -618
  1837. package/src/utils/model/modelAllowlist.ts +0 -170
  1838. package/src/utils/model/modelCapabilities.ts +0 -118
  1839. package/src/utils/model/modelOptions.ts +0 -540
  1840. package/src/utils/model/modelStrings.ts +0 -166
  1841. package/src/utils/model/modelSupportOverrides.ts +0 -50
  1842. package/src/utils/model/providers.ts +0 -40
  1843. package/src/utils/model/validateModel.ts +0 -159
  1844. package/src/utils/modelCost.ts +0 -231
  1845. package/src/utils/modifiers.ts +0 -41
  1846. package/src/utils/mtls.ts +0 -179
  1847. package/src/utils/nativeInstaller/download.ts +0 -523
  1848. package/src/utils/nativeInstaller/index.ts +0 -18
  1849. package/src/utils/nativeInstaller/installer.ts +0 -1708
  1850. package/src/utils/nativeInstaller/packageManagers.ts +0 -336
  1851. package/src/utils/nativeInstaller/pidLock.ts +0 -433
  1852. package/src/utils/notebook.ts +0 -224
  1853. package/src/utils/objectGroupBy.ts +0 -18
  1854. package/src/utils/pasteStore.ts +0 -104
  1855. package/src/utils/path.ts +0 -155
  1856. package/src/utils/pdf.ts +0 -300
  1857. package/src/utils/pdfUtils.ts +0 -70
  1858. package/src/utils/peerAddress.ts +0 -21
  1859. package/src/utils/permissions/PermissionMode.ts +0 -141
  1860. package/src/utils/permissions/PermissionPromptToolResultSchema.ts +0 -127
  1861. package/src/utils/permissions/PermissionResult.ts +0 -35
  1862. package/src/utils/permissions/PermissionRule.ts +0 -40
  1863. package/src/utils/permissions/PermissionUpdate.ts +0 -389
  1864. package/src/utils/permissions/PermissionUpdateSchema.ts +0 -78
  1865. package/src/utils/permissions/autoModeState.ts +0 -39
  1866. package/src/utils/permissions/bashClassifier.ts +0 -61
  1867. package/src/utils/permissions/bypassPermissionsKillswitch.ts +0 -155
  1868. package/src/utils/permissions/classifierDecision.ts +0 -98
  1869. package/src/utils/permissions/classifierShared.ts +0 -39
  1870. package/src/utils/permissions/dangerousPatterns.ts +0 -80
  1871. package/src/utils/permissions/denialTracking.ts +0 -45
  1872. package/src/utils/permissions/filesystem.ts +0 -1777
  1873. package/src/utils/permissions/getNextPermissionMode.ts +0 -101
  1874. package/src/utils/permissions/pathValidation.ts +0 -485
  1875. package/src/utils/permissions/permissionExplainer.ts +0 -250
  1876. package/src/utils/permissions/permissionRuleParser.ts +0 -198
  1877. package/src/utils/permissions/permissionSetup.ts +0 -1532
  1878. package/src/utils/permissions/permissions.ts +0 -1486
  1879. package/src/utils/permissions/permissionsLoader.ts +0 -296
  1880. package/src/utils/permissions/shadowedRuleDetection.ts +0 -234
  1881. package/src/utils/permissions/shellRuleMatching.ts +0 -228
  1882. package/src/utils/permissions/yolo-classifier-prompts/auto_mode_system_prompt.txt +0 -1
  1883. package/src/utils/permissions/yolo-classifier-prompts/permissions_anthropic.txt +0 -1
  1884. package/src/utils/permissions/yolo-classifier-prompts/permissions_external.txt +0 -1
  1885. package/src/utils/permissions/yoloClassifier.ts +0 -1495
  1886. package/src/utils/planModeV2.ts +0 -95
  1887. package/src/utils/plans.ts +0 -397
  1888. package/src/utils/platform.ts +0 -150
  1889. package/src/utils/plugins/addDirPluginSettings.ts +0 -71
  1890. package/src/utils/plugins/cacheUtils.ts +0 -196
  1891. package/src/utils/plugins/dependencyResolver.ts +0 -305
  1892. package/src/utils/plugins/fetchTelemetry.ts +0 -135
  1893. package/src/utils/plugins/gitAvailability.ts +0 -69
  1894. package/src/utils/plugins/headlessPluginInstall.ts +0 -174
  1895. package/src/utils/plugins/hintRecommendation.ts +0 -164
  1896. package/src/utils/plugins/installCounts.ts +0 -292
  1897. package/src/utils/plugins/installedPluginsManager.ts +0 -1268
  1898. package/src/utils/plugins/loadPluginAgents.ts +0 -348
  1899. package/src/utils/plugins/loadPluginCommands.ts +0 -946
  1900. package/src/utils/plugins/loadPluginHooks.ts +0 -287
  1901. package/src/utils/plugins/loadPluginOutputStyles.ts +0 -178
  1902. package/src/utils/plugins/lspPluginIntegration.ts +0 -387
  1903. package/src/utils/plugins/lspRecommendation.ts +0 -374
  1904. package/src/utils/plugins/managedPlugins.ts +0 -27
  1905. package/src/utils/plugins/marketplaceHelpers.ts +0 -592
  1906. package/src/utils/plugins/marketplaceManager.ts +0 -2643
  1907. package/src/utils/plugins/mcpPluginIntegration.ts +0 -634
  1908. package/src/utils/plugins/mcpbHandler.ts +0 -968
  1909. package/src/utils/plugins/officialMarketplace.ts +0 -25
  1910. package/src/utils/plugins/officialMarketplaceGcs.ts +0 -216
  1911. package/src/utils/plugins/officialMarketplaceStartupCheck.ts +0 -439
  1912. package/src/utils/plugins/orphanedPluginFilter.ts +0 -114
  1913. package/src/utils/plugins/parseMarketplaceInput.ts +0 -162
  1914. package/src/utils/plugins/performStartupChecks.tsx +0 -70
  1915. package/src/utils/plugins/pluginAutoupdate.ts +0 -284
  1916. package/src/utils/plugins/pluginBlocklist.ts +0 -127
  1917. package/src/utils/plugins/pluginDirectories.ts +0 -178
  1918. package/src/utils/plugins/pluginFlagging.ts +0 -208
  1919. package/src/utils/plugins/pluginIdentifier.ts +0 -123
  1920. package/src/utils/plugins/pluginInstallationHelpers.ts +0 -595
  1921. package/src/utils/plugins/pluginLoader.ts +0 -3302
  1922. package/src/utils/plugins/pluginOptionsStorage.ts +0 -400
  1923. package/src/utils/plugins/pluginPolicy.ts +0 -20
  1924. package/src/utils/plugins/pluginStartupCheck.ts +0 -341
  1925. package/src/utils/plugins/pluginVersioning.ts +0 -157
  1926. package/src/utils/plugins/reconciler.ts +0 -265
  1927. package/src/utils/plugins/refresh.ts +0 -215
  1928. package/src/utils/plugins/schemas.ts +0 -1681
  1929. package/src/utils/plugins/validatePlugin.ts +0 -903
  1930. package/src/utils/plugins/walkPluginMarkdown.ts +0 -69
  1931. package/src/utils/plugins/zipCache.ts +0 -406
  1932. package/src/utils/plugins/zipCacheAdapters.ts +0 -164
  1933. package/src/utils/postCommitAttribution.ts +0 -2
  1934. package/src/utils/powershell/dangerousCmdlets.ts +0 -185
  1935. package/src/utils/powershell/parser.ts +0 -1804
  1936. package/src/utils/powershell/staticPrefix.ts +0 -316
  1937. package/src/utils/preflightChecks.tsx +0 -151
  1938. package/src/utils/privacyLevel.ts +0 -55
  1939. package/src/utils/process.ts +0 -68
  1940. package/src/utils/processUserInput/processBashCommand.tsx +0 -140
  1941. package/src/utils/processUserInput/processSlashCommand.tsx +0 -922
  1942. package/src/utils/processUserInput/processTextPrompt.ts +0 -100
  1943. package/src/utils/processUserInput/processUserInput.ts +0 -605
  1944. package/src/utils/profilerBase.ts +0 -46
  1945. package/src/utils/promptCategory.ts +0 -49
  1946. package/src/utils/promptEditor.ts +0 -188
  1947. package/src/utils/promptShellExecution.ts +0 -183
  1948. package/src/utils/protectedNamespace.ts +0 -2
  1949. package/src/utils/proxy.ts +0 -426
  1950. package/src/utils/queryContext.ts +0 -179
  1951. package/src/utils/queryHelpers.ts +0 -552
  1952. package/src/utils/queryProfiler.ts +0 -301
  1953. package/src/utils/queueProcessor.ts +0 -95
  1954. package/src/utils/readEditContext.ts +0 -227
  1955. package/src/utils/readFileInRange.ts +0 -383
  1956. package/src/utils/releaseNotes.ts +0 -360
  1957. package/src/utils/renderOptions.ts +0 -77
  1958. package/src/utils/ripgrep.ts +0 -679
  1959. package/src/utils/sandbox/sandbox-adapter.ts +0 -985
  1960. package/src/utils/sandbox/sandbox-ui-utils.ts +0 -12
  1961. package/src/utils/sanitization.ts +0 -91
  1962. package/src/utils/screenshotClipboard.ts +0 -121
  1963. package/src/utils/sdkEventQueue.ts +0 -134
  1964. package/src/utils/sdkHeapDumpMonitor.ts +0 -2
  1965. package/src/utils/secureStorage/fallbackStorage.ts +0 -70
  1966. package/src/utils/secureStorage/index.ts +0 -17
  1967. package/src/utils/secureStorage/keychainPrefetch.ts +0 -116
  1968. package/src/utils/secureStorage/macOsKeychainHelpers.ts +0 -111
  1969. package/src/utils/secureStorage/macOsKeychainStorage.ts +0 -231
  1970. package/src/utils/secureStorage/plainTextStorage.ts +0 -84
  1971. package/src/utils/secureStorage/types.ts +0 -2
  1972. package/src/utils/semanticBoolean.ts +0 -29
  1973. package/src/utils/semanticNumber.ts +0 -36
  1974. package/src/utils/semver.ts +0 -59
  1975. package/src/utils/sequential.ts +0 -56
  1976. package/src/utils/sessionActivity.ts +0 -133
  1977. package/src/utils/sessionDataUploader.ts +0 -2
  1978. package/src/utils/sessionEnvVars.ts +0 -22
  1979. package/src/utils/sessionEnvironment.ts +0 -166
  1980. package/src/utils/sessionFileAccessHooks.ts +0 -250
  1981. package/src/utils/sessionIngressAuth.ts +0 -140
  1982. package/src/utils/sessionRestore.ts +0 -551
  1983. package/src/utils/sessionStart.ts +0 -232
  1984. package/src/utils/sessionState.ts +0 -150
  1985. package/src/utils/sessionStorage.ts +0 -5105
  1986. package/src/utils/sessionStoragePortable.ts +0 -793
  1987. package/src/utils/sessionTitle.ts +0 -129
  1988. package/src/utils/sessionUrl.ts +0 -64
  1989. package/src/utils/set.ts +0 -53
  1990. package/src/utils/settings/allErrors.ts +0 -32
  1991. package/src/utils/settings/applySettingsChange.ts +0 -92
  1992. package/src/utils/settings/changeDetector.ts +0 -488
  1993. package/src/utils/settings/constants.ts +0 -202
  1994. package/src/utils/settings/internalWrites.ts +0 -37
  1995. package/src/utils/settings/managedPath.ts +0 -34
  1996. package/src/utils/settings/mdm/constants.ts +0 -81
  1997. package/src/utils/settings/mdm/rawRead.ts +0 -130
  1998. package/src/utils/settings/mdm/settings.ts +0 -316
  1999. package/src/utils/settings/permissionValidation.ts +0 -262
  2000. package/src/utils/settings/pluginOnlyPolicy.ts +0 -60
  2001. package/src/utils/settings/schemaOutput.ts +0 -8
  2002. package/src/utils/settings/settings.ts +0 -1015
  2003. package/src/utils/settings/settingsCache.ts +0 -80
  2004. package/src/utils/settings/toolValidationConfig.ts +0 -103
  2005. package/src/utils/settings/types.ts +0 -1148
  2006. package/src/utils/settings/validateEditTool.ts +0 -45
  2007. package/src/utils/settings/validation.ts +0 -265
  2008. package/src/utils/settings/validationTips.ts +0 -164
  2009. package/src/utils/shell/bashProvider.ts +0 -255
  2010. package/src/utils/shell/outputLimits.ts +0 -14
  2011. package/src/utils/shell/powershellDetection.ts +0 -107
  2012. package/src/utils/shell/powershellProvider.ts +0 -123
  2013. package/src/utils/shell/prefix.ts +0 -367
  2014. package/src/utils/shell/readOnlyCommandValidation.ts +0 -1893
  2015. package/src/utils/shell/resolveDefaultShell.ts +0 -14
  2016. package/src/utils/shell/shellProvider.ts +0 -33
  2017. package/src/utils/shell/shellToolUtils.ts +0 -22
  2018. package/src/utils/shell/specPrefix.ts +0 -241
  2019. package/src/utils/shellConfig.ts +0 -167
  2020. package/src/utils/sideQuery.ts +0 -222
  2021. package/src/utils/sideQuestion.ts +0 -155
  2022. package/src/utils/signal.ts +0 -43
  2023. package/src/utils/sinks.ts +0 -16
  2024. package/src/utils/skills/skillChangeDetector.ts +0 -311
  2025. package/src/utils/slashCommandParsing.ts +0 -60
  2026. package/src/utils/sleep.ts +0 -84
  2027. package/src/utils/sliceAnsi.ts +0 -91
  2028. package/src/utils/slowOperations.ts +0 -286
  2029. package/src/utils/standaloneAgent.ts +0 -23
  2030. package/src/utils/startupProfiler.ts +0 -194
  2031. package/src/utils/staticRender.tsx +0 -116
  2032. package/src/utils/stats.ts +0 -1061
  2033. package/src/utils/statsCache.ts +0 -434
  2034. package/src/utils/status.tsx +0 -362
  2035. package/src/utils/statusNoticeDefinitions.tsx +0 -198
  2036. package/src/utils/statusNoticeHelpers.ts +0 -20
  2037. package/src/utils/stream.ts +0 -76
  2038. package/src/utils/streamJsonStdoutGuard.ts +0 -123
  2039. package/src/utils/streamlinedTransform.ts +0 -201
  2040. package/src/utils/stringUtils.ts +0 -235
  2041. package/src/utils/subprocessEnv.ts +0 -99
  2042. package/src/utils/suggestions/commandSuggestions.ts +0 -567
  2043. package/src/utils/suggestions/directoryCompletion.ts +0 -263
  2044. package/src/utils/suggestions/shellHistoryCompletion.ts +0 -119
  2045. package/src/utils/suggestions/skillUsageTracking.ts +0 -55
  2046. package/src/utils/suggestions/slackChannelSuggestions.ts +0 -209
  2047. package/src/utils/swarm/It2SetupPrompt.tsx +0 -380
  2048. package/src/utils/swarm/backends/ITermBackend.ts +0 -370
  2049. package/src/utils/swarm/backends/InProcessBackend.ts +0 -339
  2050. package/src/utils/swarm/backends/PaneBackendExecutor.ts +0 -354
  2051. package/src/utils/swarm/backends/TmuxBackend.ts +0 -764
  2052. package/src/utils/swarm/backends/detection.ts +0 -128
  2053. package/src/utils/swarm/backends/it2Setup.ts +0 -245
  2054. package/src/utils/swarm/backends/registry.ts +0 -464
  2055. package/src/utils/swarm/backends/teammateModeSnapshot.ts +0 -87
  2056. package/src/utils/swarm/backends/types.ts +0 -311
  2057. package/src/utils/swarm/constants.ts +0 -33
  2058. package/src/utils/swarm/inProcessRunner.ts +0 -1552
  2059. package/src/utils/swarm/leaderPermissionBridge.ts +0 -54
  2060. package/src/utils/swarm/permissionSync.ts +0 -928
  2061. package/src/utils/swarm/reconnection.ts +0 -119
  2062. package/src/utils/swarm/spawnInProcess.ts +0 -328
  2063. package/src/utils/swarm/spawnUtils.ts +0 -146
  2064. package/src/utils/swarm/teamHelpers.ts +0 -683
  2065. package/src/utils/swarm/teammateInit.ts +0 -129
  2066. package/src/utils/swarm/teammateLayoutManager.ts +0 -107
  2067. package/src/utils/swarm/teammateModel.ts +0 -10
  2068. package/src/utils/swarm/teammatePromptAddendum.ts +0 -18
  2069. package/src/utils/systemDirectories.ts +0 -74
  2070. package/src/utils/systemPrompt.ts +0 -123
  2071. package/src/utils/systemPromptType.ts +0 -14
  2072. package/src/utils/systemTheme.ts +0 -119
  2073. package/src/utils/systemThemeWatcher.ts +0 -2
  2074. package/src/utils/taggedId.ts +0 -54
  2075. package/src/utils/task/TaskOutput.ts +0 -390
  2076. package/src/utils/task/diskOutput.ts +0 -451
  2077. package/src/utils/task/framework.ts +0 -308
  2078. package/src/utils/task/outputFormatting.ts +0 -38
  2079. package/src/utils/task/sdkProgress.ts +0 -36
  2080. package/src/utils/taskSummary.ts +0 -2
  2081. package/src/utils/tasks.ts +0 -862
  2082. package/src/utils/teamDiscovery.ts +0 -81
  2083. package/src/utils/teamMemoryOps.ts +0 -88
  2084. package/src/utils/teammate.ts +0 -292
  2085. package/src/utils/teammateContext.ts +0 -96
  2086. package/src/utils/teammateMailbox.ts +0 -1183
  2087. package/src/utils/telemetry/betaSessionTracing.ts +0 -491
  2088. package/src/utils/telemetry/bigqueryExporter.ts +0 -252
  2089. package/src/utils/telemetry/events.ts +0 -75
  2090. package/src/utils/telemetry/instrumentation.ts +0 -825
  2091. package/src/utils/telemetry/logger.ts +0 -26
  2092. package/src/utils/telemetry/perfettoTracing.ts +0 -1120
  2093. package/src/utils/telemetry/pluginTelemetry.ts +0 -289
  2094. package/src/utils/telemetry/sessionTracing.ts +0 -927
  2095. package/src/utils/telemetry/skillLoadedEvent.ts +0 -39
  2096. package/src/utils/telemetryAttributes.ts +0 -71
  2097. package/src/utils/teleport/api.ts +0 -466
  2098. package/src/utils/teleport/environmentSelection.ts +0 -77
  2099. package/src/utils/teleport/environments.ts +0 -120
  2100. package/src/utils/teleport/gitBundle.ts +0 -292
  2101. package/src/utils/teleport.tsx +0 -1226
  2102. package/src/utils/tempfile.ts +0 -31
  2103. package/src/utils/terminal.ts +0 -131
  2104. package/src/utils/terminalPanel.ts +0 -191
  2105. package/src/utils/textHighlighting.ts +0 -166
  2106. package/src/utils/theme.ts +0 -639
  2107. package/src/utils/thinking.ts +0 -162
  2108. package/src/utils/timeouts.ts +0 -39
  2109. package/src/utils/tmuxSocket.ts +0 -427
  2110. package/src/utils/todo/types.ts +0 -18
  2111. package/src/utils/tokenBudget.ts +0 -73
  2112. package/src/utils/tokens.ts +0 -261
  2113. package/src/utils/toolErrors.ts +0 -132
  2114. package/src/utils/toolPool.ts +0 -79
  2115. package/src/utils/toolResultStorage.ts +0 -1040
  2116. package/src/utils/toolSchemaCache.ts +0 -26
  2117. package/src/utils/toolSearch.ts +0 -756
  2118. package/src/utils/transcriptSearch.ts +0 -202
  2119. package/src/utils/treeify.ts +0 -170
  2120. package/src/utils/truncate.ts +0 -179
  2121. package/src/utils/udsClient.ts +0 -2
  2122. package/src/utils/udsMessaging.ts +0 -2
  2123. package/src/utils/ultraplan/ccrSession.ts +0 -349
  2124. package/src/utils/ultraplan/keyword.ts +0 -127
  2125. package/src/utils/ultraplan/prompt.txt +0 -1
  2126. package/src/utils/unaryLogging.ts +0 -39
  2127. package/src/utils/undercover.ts +0 -89
  2128. package/src/utils/user.ts +0 -194
  2129. package/src/utils/userAgent.ts +0 -10
  2130. package/src/utils/userPromptKeywords.ts +0 -27
  2131. package/src/utils/uuid.ts +0 -27
  2132. package/src/utils/warningHandler.ts +0 -121
  2133. package/src/utils/which.ts +0 -82
  2134. package/src/utils/windowsPaths.ts +0 -173
  2135. package/src/utils/withResolvers.ts +0 -13
  2136. package/src/utils/words.ts +0 -800
  2137. package/src/utils/workloadContext.ts +0 -57
  2138. package/src/utils/worktree.ts +0 -1519
  2139. package/src/utils/worktreeModeEnabled.ts +0 -11
  2140. package/src/utils/xdg.ts +0 -65
  2141. package/src/utils/xml.ts +0 -16
  2142. package/src/utils/yaml.ts +0 -15
  2143. package/src/utils/zodToJsonSchema.ts +0 -23
  2144. package/src/vim/motions.ts +0 -82
  2145. package/src/vim/operators.ts +0 -556
  2146. package/src/vim/textObjects.ts +0 -186
  2147. package/src/vim/transitions.ts +0 -490
  2148. package/src/vim/types.ts +0 -199
  2149. package/src/voice/voiceModeEnabled.ts +0 -54
  2150. package/stubs/@ant/claude-for-chrome-mcp/index.js +0 -1
  2151. package/stubs/@ant/claude-for-chrome-mcp/index.ts +0 -4
  2152. package/stubs/@ant/claude-for-chrome-mcp/package.json +0 -6
  2153. package/stubs/@ant/computer-use-input/index.js +0 -2
  2154. package/stubs/@ant/computer-use-input/index.ts +0 -3
  2155. package/stubs/@ant/computer-use-input/package.json +0 -6
  2156. package/stubs/@ant/computer-use-mcp/index.js +0 -1
  2157. package/stubs/@ant/computer-use-mcp/index.ts +0 -1
  2158. package/stubs/@ant/computer-use-mcp/package.json +0 -11
  2159. package/stubs/@ant/computer-use-mcp/sentinelApps.js +0 -3
  2160. package/stubs/@ant/computer-use-mcp/sentinelApps.ts +0 -3
  2161. package/stubs/@ant/computer-use-mcp/types.js +0 -2
  2162. package/stubs/@ant/computer-use-mcp/types.ts +0 -6
  2163. package/stubs/@ant/computer-use-swift/index.js +0 -2
  2164. package/stubs/@ant/computer-use-swift/index.ts +0 -2
  2165. package/stubs/@ant/computer-use-swift/package.json +0 -6
  2166. package/stubs/@anthropic-ai/claude-agent-sdk/index.js +0 -2
  2167. package/stubs/@anthropic-ai/claude-agent-sdk/index.ts +0 -2
  2168. package/stubs/@anthropic-ai/claude-agent-sdk/package.json +0 -6
  2169. package/stubs/@anthropic-ai/mcpb/index.js +0 -2
  2170. package/stubs/@anthropic-ai/mcpb/index.ts +0 -3
  2171. package/stubs/@anthropic-ai/mcpb/package.json +0 -6
  2172. package/stubs/@anthropic-ai/sandbox-runtime/index.js +0 -4
  2173. package/stubs/@anthropic-ai/sandbox-runtime/index.ts +0 -49
  2174. package/stubs/@anthropic-ai/sandbox-runtime/package.json +0 -6
  2175. package/stubs/globals.ts +0 -11
  2176. package/stubs/macro.d.ts +0 -9
  2177. package/tsconfig.json +0 -28
@@ -1,1398 +0,0 @@
1
- import { feature } from 'src/_stubs/bun-bundle.js';
2
- import * as React from 'react';
3
- import { buildTool, type ToolDef, toolMatchesName } from 'src/Tool.js';
4
- import type { Message as MessageType, NormalizedUserMessage } from 'src/types/message.js';
5
- import { getQuerySourceForAgent } from 'src/utils/promptCategory.js';
6
- import { z } from 'zod/v4';
7
- import { clearInvokedSkillsForAgent, getSdkAgentProgressSummariesEnabled } from '../../bootstrap/state.js';
8
- import { enhanceSystemPromptWithEnvDetails, getSystemPrompt } from '../../constants/prompts.js';
9
- import { isCoordinatorMode } from '../../coordinator/coordinatorMode.js';
10
- import { startAgentSummarization } from '../../services/AgentSummary/agentSummary.js';
11
- import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js';
12
- import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from '../../services/analytics/index.js';
13
- import { clearDumpState } from '../../services/api/dumpPrompts.js';
14
- import { completeAgentTask as completeAsyncAgent, createActivityDescriptionResolver, createProgressTracker, enqueueAgentNotification, failAgentTask as failAsyncAgent, getProgressUpdate, getTokenCountFromTracker, isLocalAgentTask, killAsyncAgent, registerAgentForeground, registerAsyncAgent, unregisterAgentForeground, updateAgentProgress as updateAsyncAgentProgress, updateProgressFromMessage } from '../../tasks/LocalAgentTask/LocalAgentTask.js';
15
- import { checkRemoteAgentEligibility, formatPreconditionError, getRemoteTaskSessionUrl, registerRemoteAgentTask } from '../../tasks/RemoteAgentTask/RemoteAgentTask.js';
16
- import { assembleToolPool } from '../../tools.js';
17
- import { asAgentId } from '../../types/ids.js';
18
- import { runWithAgentContext } from '../../utils/agentContext.js';
19
- import { isAgentSwarmsEnabled } from '../../utils/agentSwarmsEnabled.js';
20
- import { getCwd, runWithCwdOverride } from '../../utils/cwd.js';
21
- import { logForDebugging } from '../../utils/debug.js';
22
- import { isEnvTruthy } from '../../utils/envUtils.js';
23
- import { AbortError, errorMessage, toError } from '../../utils/errors.js';
24
- import type { CacheSafeParams } from '../../utils/forkedAgent.js';
25
- import { lazySchema } from '../../utils/lazySchema.js';
26
- import { createUserMessage, extractTextContent, isSyntheticMessage, normalizeMessages } from '../../utils/messages.js';
27
- import { getAgentModel } from '../../utils/model/agent.js';
28
- import { permissionModeSchema } from '../../utils/permissions/PermissionMode.js';
29
- import type { PermissionResult } from '../../utils/permissions/PermissionResult.js';
30
- import { filterDeniedAgents, getDenyRuleForAgent } from '../../utils/permissions/permissions.js';
31
- import { enqueueSdkEvent } from '../../utils/sdkEventQueue.js';
32
- import { writeAgentMetadata } from '../../utils/sessionStorage.js';
33
- import { sleep } from '../../utils/sleep.js';
34
- import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js';
35
- import { asSystemPrompt } from '../../utils/systemPromptType.js';
36
- import { getTaskOutputPath } from '../../utils/task/diskOutput.js';
37
- import { getParentSessionId, isTeammate } from '../../utils/teammate.js';
38
- import { isInProcessTeammate } from '../../utils/teammateContext.js';
39
- import { teleportToRemote } from '../../utils/teleport.js';
40
- import { getAssistantMessageContentLength } from '../../utils/tokens.js';
41
- import { createAgentId } from '../../utils/uuid.js';
42
- import { createAgentWorktree, hasWorktreeChanges, removeAgentWorktree } from '../../utils/worktree.js';
43
- import { BASH_TOOL_NAME } from '../BashTool/toolName.js';
44
- import { BackgroundHint } from '../BashTool/UI.js';
45
- import { FILE_READ_TOOL_NAME } from '../FileReadTool/prompt.js';
46
- import { spawnTeammate } from '../shared/spawnMultiAgent.js';
47
- import { setAgentColor } from './agentColorManager.js';
48
- import { agentToolResultSchema, classifyHandoffIfNeeded, emitTaskProgress, extractPartialResult, finalizeAgentTool, getLastToolUseName, runAsyncAgentLifecycle } from './agentToolUtils.js';
49
- import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js';
50
- import { AGENT_TOOL_NAME, LEGACY_AGENT_TOOL_NAME, ONE_SHOT_BUILTIN_AGENT_TYPES } from './constants.js';
51
- import { buildForkedMessages, buildWorktreeNotice, FORK_AGENT, isForkSubagentEnabled, isInForkChild } from './forkSubagent.js';
52
- import type { AgentDefinition } from './loadAgentsDir.js';
53
- import { filterAgentsByMcpRequirements, hasRequiredMcpServers, isBuiltInAgent } from './loadAgentsDir.js';
54
- import { getPrompt } from './prompt.js';
55
- import { runAgent } from './runAgent.js';
56
- import { renderGroupedAgentToolUse, renderToolResultMessage, renderToolUseErrorMessage, renderToolUseMessage, renderToolUseProgressMessage, renderToolUseRejectedMessage, renderToolUseTag, userFacingName, userFacingNameBackgroundColor } from './UI.js';
57
-
58
- /* eslint-disable @typescript-eslint/no-require-imports */
59
- const proactiveModule = feature('PROACTIVE') || feature('KAIROS') ? require('../../proactive/index.js') as typeof import('../../proactive/index.js') : null;
60
- /* eslint-enable @typescript-eslint/no-require-imports */
61
-
62
- // Progress display constants (for showing background hint)
63
- const PROGRESS_THRESHOLD_MS = 2000; // Show background hint after 2 seconds
64
-
65
- // Check if background tasks are disabled at module load time
66
- const isBackgroundTasksDisabled =
67
- // eslint-disable-next-line custom-rules/no-process-env-top-level -- Intentional: schema must be defined at module load
68
- isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_BACKGROUND_TASKS);
69
-
70
- // Auto-background agent tasks after this many ms (0 = disabled)
71
- // Enabled by env var OR GrowthBook gate (checked lazily since GB may not be ready at module load)
72
- function getAutoBackgroundMs(): number {
73
- if (isEnvTruthy(process.env.CLAUDE_AUTO_BACKGROUND_TASKS) || getFeatureValue_CACHED_MAY_BE_STALE('tengu_auto_background_agents', false)) {
74
- return 120_000;
75
- }
76
- return 0;
77
- }
78
-
79
- // Multi-agent type constants are defined inline inside gated blocks to enable dead code elimination
80
-
81
- // Base input schema without multi-agent parameters
82
- const baseInputSchema = lazySchema(() => z.object({
83
- description: z.string().describe('A short (3-5 word) description of the task'),
84
- prompt: z.string().describe('The task for the agent to perform'),
85
- subagent_type: z.string().optional().describe('The type of specialized agent to use for this task'),
86
- model: z.enum(['sonnet', 'opus', 'haiku']).optional().describe("Optional model override for this agent. Takes precedence over the agent definition's model frontmatter. If omitted, uses the agent definition's model, or inherits from the parent."),
87
- run_in_background: z.boolean().optional().describe('Set to true to run this agent in the background. You will be notified when it completes.')
88
- }));
89
-
90
- // Full schema combining base + multi-agent params + isolation
91
- const fullInputSchema = lazySchema(() => {
92
- // Multi-agent parameters
93
- const multiAgentInputSchema = z.object({
94
- name: z.string().optional().describe('Name for the spawned agent. Makes it addressable via SendMessage({to: name}) while running.'),
95
- team_name: z.string().optional().describe('Team name for spawning. Uses current team context if omitted.'),
96
- mode: permissionModeSchema().optional().describe('Permission mode for spawned teammate (e.g., "plan" to require plan approval).')
97
- });
98
- return baseInputSchema().merge(multiAgentInputSchema).extend({
99
- isolation: ("external" === 'ant' ? z.enum(['worktree', 'remote']) : z.enum(['worktree'])).optional().describe("external" === 'ant' ? 'Isolation mode. "worktree" creates a temporary git worktree so the agent works on an isolated copy of the repo. "remote" launches the agent in a remote CCR environment (always runs in background).' : 'Isolation mode. "worktree" creates a temporary git worktree so the agent works on an isolated copy of the repo.'),
100
- cwd: z.string().optional().describe('Absolute path to run the agent in. Overrides the working directory for all filesystem and shell operations within this agent. Mutually exclusive with isolation: "worktree".')
101
- });
102
- });
103
-
104
- // Strip optional fields from the schema when the backing feature is off so
105
- // the model never sees them. Done via .omit() rather than conditional spread
106
- // inside .extend() because the spread-ternary breaks Zod's type inference
107
- // (field type collapses to `unknown`). The ternary return produces a union
108
- // type, but call() destructures via the explicit AgentToolInput type below
109
- // which always includes all optional fields.
110
- export const inputSchema = lazySchema(() => {
111
- const schema = feature('KAIROS') ? fullInputSchema() : fullInputSchema().omit({
112
- cwd: true
113
- });
114
-
115
- // GrowthBook-in-lazySchema is acceptable here (unlike subagent_type, which
116
- // was removed in 906da6c723): the divergence window is one-session-per-
117
- // gate-flip via _CACHED_MAY_BE_STALE disk read, and worst case is either
118
- // "schema shows a no-op param" (gate flips on mid-session: param ignored
119
- // by forceAsync) or "schema hides a param that would've worked" (gate
120
- // flips off mid-session: everything still runs async via memoized
121
- // forceAsync). No Zod rejection, no crash — unlike required→optional.
122
- return isBackgroundTasksDisabled || isForkSubagentEnabled() ? schema.omit({
123
- run_in_background: true
124
- }) : schema;
125
- });
126
- type InputSchema = ReturnType<typeof inputSchema>;
127
-
128
- // Explicit type widens the schema inference to always include all optional
129
- // fields even when .omit() strips them for gating (cwd, run_in_background).
130
- // subagent_type is optional; call() defaults it to general-purpose when the
131
- // fork gate is off, or routes to the fork path when the gate is on.
132
- type AgentToolInput = z.infer<ReturnType<typeof baseInputSchema>> & {
133
- name?: string;
134
- team_name?: string;
135
- mode?: z.infer<ReturnType<typeof permissionModeSchema>>;
136
- isolation?: 'worktree' | 'remote';
137
- cwd?: string;
138
- };
139
-
140
- // Output schema - multi-agent spawned schema added dynamically at runtime when enabled
141
- export const outputSchema = lazySchema(() => {
142
- const syncOutputSchema = agentToolResultSchema().extend({
143
- status: z.literal('completed'),
144
- prompt: z.string()
145
- });
146
- const asyncOutputSchema = z.object({
147
- status: z.literal('async_launched'),
148
- agentId: z.string().describe('The ID of the async agent'),
149
- description: z.string().describe('The description of the task'),
150
- prompt: z.string().describe('The prompt for the agent'),
151
- outputFile: z.string().describe('Path to the output file for checking agent progress'),
152
- canReadOutputFile: z.boolean().optional().describe('Whether the calling agent has Read/Bash tools to check progress')
153
- });
154
- return z.union([syncOutputSchema, asyncOutputSchema]);
155
- });
156
- type OutputSchema = ReturnType<typeof outputSchema>;
157
- type Output = z.input<OutputSchema>;
158
-
159
- // Private type for teammate spawn results - excluded from exported schema for dead code elimination
160
- // The 'teammate_spawned' status string is only included when ENABLE_AGENT_SWARMS is true
161
- type TeammateSpawnedOutput = {
162
- status: 'teammate_spawned';
163
- prompt: string;
164
- teammate_id: string;
165
- agent_id: string;
166
- agent_type?: string;
167
- model?: string;
168
- name: string;
169
- color?: string;
170
- tmux_session_name: string;
171
- tmux_window_name: string;
172
- tmux_pane_id: string;
173
- team_name?: string;
174
- is_splitpane?: boolean;
175
- plan_mode_required?: boolean;
176
- };
177
-
178
- // Combined output type including both public and internal types
179
- // Note: TeammateSpawnedOutput type is fine - TypeScript types are erased at compile time
180
- // Private type for remote-launched results — excluded from exported schema
181
- // like TeammateSpawnedOutput for dead code elimination purposes. Exported
182
- // for UI.tsx to do proper discriminated-union narrowing instead of ad-hoc casts.
183
- export type RemoteLaunchedOutput = {
184
- status: 'remote_launched';
185
- taskId: string;
186
- sessionUrl: string;
187
- description: string;
188
- prompt: string;
189
- outputFile: string;
190
- };
191
- type InternalOutput = Output | TeammateSpawnedOutput | RemoteLaunchedOutput;
192
- import type { AgentToolProgress, ShellProgress } from '../../types/tools.js';
193
- // AgentTool forwards both its own progress events and shell progress
194
- // events from the sub-agent so the SDK receives tool_progress updates during bash/powershell runs.
195
- export type Progress = AgentToolProgress | ShellProgress;
196
- export const AgentTool = buildTool({
197
- async prompt({
198
- agents,
199
- tools,
200
- getToolPermissionContext,
201
- allowedAgentTypes
202
- }) {
203
- const toolPermissionContext = await getToolPermissionContext();
204
-
205
- // Get MCP servers that have tools available
206
- const mcpServersWithTools: string[] = [];
207
- for (const tool of tools) {
208
- if (tool.name?.startsWith('mcp__')) {
209
- const parts = tool.name.split('__');
210
- const serverName = parts[1];
211
- if (serverName && !mcpServersWithTools.includes(serverName)) {
212
- mcpServersWithTools.push(serverName);
213
- }
214
- }
215
- }
216
-
217
- // Filter agents: first by MCP requirements, then by permission rules
218
- const agentsWithMcpRequirementsMet = filterAgentsByMcpRequirements(agents, mcpServersWithTools);
219
- const filteredAgents = filterDeniedAgents(agentsWithMcpRequirementsMet, toolPermissionContext, AGENT_TOOL_NAME);
220
-
221
- // Use inline env check instead of coordinatorModule to avoid circular
222
- // dependency issues during test module loading.
223
- const isCoordinator = feature('COORDINATOR_MODE') ? isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE) : false;
224
- return await getPrompt(filteredAgents, isCoordinator, allowedAgentTypes);
225
- },
226
- name: AGENT_TOOL_NAME,
227
- searchHint: 'delegate work to a subagent',
228
- aliases: [LEGACY_AGENT_TOOL_NAME],
229
- maxResultSizeChars: 100_000,
230
- async description() {
231
- return 'Launch a new agent';
232
- },
233
- get inputSchema(): InputSchema {
234
- return inputSchema();
235
- },
236
- get outputSchema(): OutputSchema {
237
- return outputSchema();
238
- },
239
- async call({
240
- prompt,
241
- subagent_type,
242
- description,
243
- model: modelParam,
244
- run_in_background,
245
- name,
246
- team_name,
247
- mode: spawnMode,
248
- isolation,
249
- cwd
250
- }: AgentToolInput, toolUseContext, canUseTool, assistantMessage, onProgress?) {
251
- const startTime = Date.now();
252
- const model = isCoordinatorMode() ? undefined : modelParam;
253
-
254
- // Get app state for permission mode and agent filtering
255
- const appState = toolUseContext.getAppState();
256
- const permissionMode = appState.toolPermissionContext.mode;
257
- // In-process teammates get a no-op setAppState; setAppStateForTasks
258
- // reaches the root store so task registration/progress/kill stay visible.
259
- const rootSetAppState = toolUseContext.setAppStateForTasks ?? toolUseContext.setAppState;
260
-
261
- // Check if user is trying to use agent teams without access
262
- if (team_name && !isAgentSwarmsEnabled()) {
263
- throw new Error('Agent Teams is not yet available on your plan.');
264
- }
265
-
266
- // Teammates (in-process or tmux) passing `name` would trigger spawnTeammate()
267
- // below, but TeamFile.members is a flat array with one leadAgentId — nested
268
- // teammates land in the roster with no provenance and confuse the lead.
269
- const teamName = resolveTeamName({
270
- team_name
271
- }, appState);
272
- if (isTeammate() && teamName && name) {
273
- throw new Error('Teammates cannot spawn other teammates — the team roster is flat. To spawn a subagent instead, omit the `name` parameter.');
274
- }
275
- // In-process teammates cannot spawn background agents (their lifecycle is
276
- // tied to the leader's process). Tmux teammates are separate processes and
277
- // can manage their own background agents.
278
- if (isInProcessTeammate() && teamName && run_in_background === true) {
279
- throw new Error('In-process teammates cannot spawn background agents. Use run_in_background=false for synchronous subagents.');
280
- }
281
-
282
- // Check if this is a multi-agent spawn request
283
- // Spawn is triggered when team_name is set (from param or context) and name is provided
284
- if (teamName && name) {
285
- // Set agent definition color for grouped UI display before spawning
286
- const agentDef = subagent_type ? toolUseContext.options.agentDefinitions.activeAgents.find(a => a.agentType === subagent_type) : undefined;
287
- if (agentDef?.color) {
288
- setAgentColor(subagent_type!, agentDef.color);
289
- }
290
- const result = await spawnTeammate({
291
- name,
292
- prompt,
293
- description,
294
- team_name: teamName,
295
- use_splitpane: true,
296
- plan_mode_required: spawnMode === 'plan',
297
- model: model ?? agentDef?.model,
298
- agent_type: subagent_type,
299
- invokingRequestId: assistantMessage?.requestId
300
- }, toolUseContext);
301
-
302
- // Type assertion uses TeammateSpawnedOutput (defined above) instead of any.
303
- // This type is excluded from the exported outputSchema for dead code elimination.
304
- // Cast through unknown because TeammateSpawnedOutput is intentionally
305
- // not part of the exported Output union (for dead code elimination purposes).
306
- const spawnResult: TeammateSpawnedOutput = {
307
- status: 'teammate_spawned' as const,
308
- prompt,
309
- ...result.data
310
- };
311
- return {
312
- data: spawnResult
313
- } as unknown as {
314
- data: Output;
315
- };
316
- }
317
-
318
- // Fork subagent experiment routing:
319
- // - subagent_type set: use it (explicit wins)
320
- // - subagent_type omitted, gate on: fork path (undefined)
321
- // - subagent_type omitted, gate off: default general-purpose
322
- const effectiveType = subagent_type ?? (isForkSubagentEnabled() ? undefined : GENERAL_PURPOSE_AGENT.agentType);
323
- const isForkPath = effectiveType === undefined;
324
- let selectedAgent: AgentDefinition;
325
- if (isForkPath) {
326
- // Recursive fork guard: fork children keep the Agent tool in their
327
- // pool for cache-identical tool defs, so reject fork attempts at call
328
- // time. Primary check is querySource (compaction-resistant — set on
329
- // context.options at spawn time, survives autocompact's message
330
- // rewrite). Message-scan fallback catches any path where querySource
331
- // wasn't threaded.
332
- if (toolUseContext.options.querySource === `agent:builtin:${FORK_AGENT.agentType}` || isInForkChild(toolUseContext.messages)) {
333
- throw new Error('Fork is not available inside a forked worker. Complete your task directly using your tools.');
334
- }
335
- selectedAgent = FORK_AGENT;
336
- } else {
337
- // Filter agents to exclude those denied via Agent(AgentName) syntax
338
- const allAgents = toolUseContext.options.agentDefinitions.activeAgents;
339
- const {
340
- allowedAgentTypes
341
- } = toolUseContext.options.agentDefinitions;
342
- const agents = filterDeniedAgents(
343
- // When allowedAgentTypes is set (from Agent(x,y) tool spec), restrict to those types
344
- allowedAgentTypes ? allAgents.filter(a => allowedAgentTypes.includes(a.agentType)) : allAgents, appState.toolPermissionContext, AGENT_TOOL_NAME);
345
- const found = agents.find(agent => agent.agentType === effectiveType);
346
- if (!found) {
347
- // Check if the agent exists but is denied by permission rules
348
- const agentExistsButDenied = allAgents.find(agent => agent.agentType === effectiveType);
349
- if (agentExistsButDenied) {
350
- const denyRule = getDenyRuleForAgent(appState.toolPermissionContext, AGENT_TOOL_NAME, effectiveType);
351
- throw new Error(`Agent type '${effectiveType}' has been denied by permission rule '${AGENT_TOOL_NAME}(${effectiveType})' from ${denyRule?.source ?? 'settings'}.`);
352
- }
353
- throw new Error(`Agent type '${effectiveType}' not found. Available agents: ${agents.map(a => a.agentType).join(', ')}`);
354
- }
355
- selectedAgent = found;
356
- }
357
-
358
- // Same lifecycle constraint as the run_in_background guard above, but for
359
- // agent definitions that force background via `background: true`. Checked
360
- // here because selectedAgent is only now resolved.
361
- if (isInProcessTeammate() && teamName && selectedAgent.background === true) {
362
- throw new Error(`In-process teammates cannot spawn background agents. Agent '${selectedAgent.agentType}' has background: true in its definition.`);
363
- }
364
-
365
- // Capture for type narrowing — `let selectedAgent` prevents TS from
366
- // narrowing property types across the if-else assignment above.
367
- const requiredMcpServers = selectedAgent.requiredMcpServers;
368
-
369
- // Check if required MCP servers have tools available
370
- // A server that's connected but not authenticated won't have any tools
371
- if (requiredMcpServers?.length) {
372
- // If any required servers are still pending (connecting), wait for them
373
- // before checking tool availability. This avoids a race condition where
374
- // the agent is invoked before MCP servers finish connecting.
375
- const hasPendingRequiredServers = appState.mcp.clients.some(c => c.type === 'pending' && requiredMcpServers.some(pattern => c.name.toLowerCase().includes(pattern.toLowerCase())));
376
- let currentAppState = appState;
377
- if (hasPendingRequiredServers) {
378
- const MAX_WAIT_MS = 30_000;
379
- const POLL_INTERVAL_MS = 500;
380
- const deadline = Date.now() + MAX_WAIT_MS;
381
- while (Date.now() < deadline) {
382
- await sleep(POLL_INTERVAL_MS);
383
- currentAppState = toolUseContext.getAppState();
384
-
385
- // Early exit: if any required server has already failed, no point
386
- // waiting for other pending servers — the check will fail regardless.
387
- const hasFailedRequiredServer = currentAppState.mcp.clients.some(c => c.type === 'failed' && requiredMcpServers.some(pattern => c.name.toLowerCase().includes(pattern.toLowerCase())));
388
- if (hasFailedRequiredServer) break;
389
- const stillPending = currentAppState.mcp.clients.some(c => c.type === 'pending' && requiredMcpServers.some(pattern => c.name.toLowerCase().includes(pattern.toLowerCase())));
390
- if (!stillPending) break;
391
- }
392
- }
393
-
394
- // Get servers that actually have tools (meaning they're connected AND authenticated)
395
- const serversWithTools: string[] = [];
396
- for (const tool of currentAppState.mcp.tools) {
397
- if (tool.name?.startsWith('mcp__')) {
398
- // Extract server name from tool name (format: mcp__serverName__toolName)
399
- const parts = tool.name.split('__');
400
- const serverName = parts[1];
401
- if (serverName && !serversWithTools.includes(serverName)) {
402
- serversWithTools.push(serverName);
403
- }
404
- }
405
- }
406
- if (!hasRequiredMcpServers(selectedAgent, serversWithTools)) {
407
- const missing = requiredMcpServers.filter(pattern => !serversWithTools.some(server => server.toLowerCase().includes(pattern.toLowerCase())));
408
- throw new Error(`Agent '${selectedAgent.agentType}' requires MCP servers matching: ${missing.join(', ')}. ` + `MCP servers with tools: ${serversWithTools.length > 0 ? serversWithTools.join(', ') : 'none'}. ` + `Use /mcp to configure and authenticate the required MCP servers.`);
409
- }
410
- }
411
-
412
- // Initialize the color for this agent if it has a predefined one
413
- if (selectedAgent.color) {
414
- setAgentColor(selectedAgent.agentType, selectedAgent.color);
415
- }
416
-
417
- // Resolve agent params for logging (these are already resolved in runAgent)
418
- const resolvedAgentModel = getAgentModel(selectedAgent.model, toolUseContext.options.mainLoopModel, isForkPath ? undefined : model, permissionMode);
419
- logEvent('tengu_agent_tool_selected', {
420
- agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
421
- model: resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
422
- source: selectedAgent.source as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
423
- color: selectedAgent.color as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
424
- is_built_in_agent: isBuiltInAgent(selectedAgent),
425
- is_resume: false,
426
- is_async: (run_in_background === true || selectedAgent.background === true) && !isBackgroundTasksDisabled,
427
- is_fork: isForkPath
428
- });
429
-
430
- // Resolve effective isolation mode (explicit param overrides agent def)
431
- const effectiveIsolation = isolation ?? selectedAgent.isolation;
432
-
433
- // Remote isolation: delegate to CCR. Gated ant-only — the guard enables
434
- // dead code elimination of the entire block for external builds.
435
- if ("external" === 'ant' && effectiveIsolation === 'remote') {
436
- const eligibility = await checkRemoteAgentEligibility();
437
- if (!eligibility.eligible) {
438
- const reasons = eligibility.errors.map(formatPreconditionError).join('\n');
439
- throw new Error(`Cannot launch remote agent:\n${reasons}`);
440
- }
441
- let bundleFailHint: string | undefined;
442
- const session = await teleportToRemote({
443
- initialMessage: prompt,
444
- description,
445
- signal: toolUseContext.abortController.signal,
446
- onBundleFail: msg => {
447
- bundleFailHint = msg;
448
- }
449
- });
450
- if (!session) {
451
- throw new Error(bundleFailHint ?? 'Failed to create remote session');
452
- }
453
- const {
454
- taskId,
455
- sessionId
456
- } = registerRemoteAgentTask({
457
- remoteTaskType: 'remote-agent',
458
- session: {
459
- id: session.id,
460
- title: session.title || description
461
- },
462
- command: prompt,
463
- context: toolUseContext,
464
- toolUseId: toolUseContext.toolUseId
465
- });
466
- logEvent('tengu_agent_tool_remote_launched', {
467
- agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
468
- });
469
- const remoteResult: RemoteLaunchedOutput = {
470
- status: 'remote_launched',
471
- taskId,
472
- sessionUrl: getRemoteTaskSessionUrl(sessionId),
473
- description,
474
- prompt,
475
- outputFile: getTaskOutputPath(taskId)
476
- };
477
- return {
478
- data: remoteResult
479
- } as unknown as {
480
- data: Output;
481
- };
482
- }
483
- // System prompt + prompt messages: branch on fork path.
484
- //
485
- // Fork path: child inherits the PARENT's system prompt (not FORK_AGENT's)
486
- // for cache-identical API request prefixes. Prompt messages are built via
487
- // buildForkedMessages() which clones the parent's full assistant message
488
- // (all tool_use blocks) + placeholder tool_results + per-child directive.
489
- //
490
- // Normal path: build the selected agent's own system prompt with env
491
- // details, and use a simple user message for the prompt.
492
- let enhancedSystemPrompt: string[] | undefined;
493
- let forkParentSystemPrompt: ReturnType<typeof buildEffectiveSystemPrompt> | undefined;
494
- let promptMessages: MessageType[];
495
- if (isForkPath) {
496
- if (toolUseContext.renderedSystemPrompt) {
497
- forkParentSystemPrompt = toolUseContext.renderedSystemPrompt;
498
- } else {
499
- // Fallback: recompute. May diverge from parent's cached bytes if
500
- // GrowthBook state changed between parent turn-start and fork spawn.
501
- const mainThreadAgentDefinition = appState.agent ? appState.agentDefinitions.activeAgents.find(a => a.agentType === appState.agent) : undefined;
502
- const additionalWorkingDirectories = Array.from(appState.toolPermissionContext.additionalWorkingDirectories.keys());
503
- const defaultSystemPrompt = await getSystemPrompt(toolUseContext.options.tools, toolUseContext.options.mainLoopModel, additionalWorkingDirectories, toolUseContext.options.mcpClients);
504
- forkParentSystemPrompt = buildEffectiveSystemPrompt({
505
- mainThreadAgentDefinition,
506
- toolUseContext,
507
- customSystemPrompt: toolUseContext.options.customSystemPrompt,
508
- defaultSystemPrompt,
509
- appendSystemPrompt: toolUseContext.options.appendSystemPrompt
510
- });
511
- }
512
- promptMessages = buildForkedMessages(prompt, assistantMessage);
513
- } else {
514
- try {
515
- const additionalWorkingDirectories = Array.from(appState.toolPermissionContext.additionalWorkingDirectories.keys());
516
-
517
- // All agents have getSystemPrompt - pass toolUseContext to all
518
- const agentPrompt = selectedAgent.getSystemPrompt({
519
- toolUseContext
520
- });
521
-
522
- // Log agent memory loaded event for subagents
523
- if (selectedAgent.memory) {
524
- logEvent('tengu_agent_memory_loaded', {
525
- ...("external" === 'ant' && {
526
- agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
527
- }),
528
- scope: selectedAgent.memory as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
529
- source: 'subagent' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
530
- });
531
- }
532
-
533
- // Apply environment details enhancement
534
- enhancedSystemPrompt = await enhanceSystemPromptWithEnvDetails([agentPrompt], resolvedAgentModel, additionalWorkingDirectories);
535
- } catch (error) {
536
- logForDebugging(`Failed to get system prompt for agent ${selectedAgent.agentType}: ${errorMessage(error)}`);
537
- }
538
- promptMessages = [createUserMessage({
539
- content: prompt
540
- })];
541
- }
542
- const metadata = {
543
- prompt,
544
- resolvedAgentModel,
545
- isBuiltInAgent: isBuiltInAgent(selectedAgent),
546
- startTime,
547
- agentType: selectedAgent.agentType,
548
- isAsync: (run_in_background === true || selectedAgent.background === true) && !isBackgroundTasksDisabled
549
- };
550
-
551
- // Use inline env check instead of coordinatorModule to avoid circular
552
- // dependency issues during test module loading.
553
- const isCoordinator = feature('COORDINATOR_MODE') ? isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE) : false;
554
-
555
- // Fork subagent experiment: force ALL spawns async for a unified
556
- // <task-notification> interaction model (not just fork spawns — all of them).
557
- const forceAsync = isForkSubagentEnabled();
558
-
559
- // Assistant mode: force all agents async. Synchronous subagents hold the
560
- // main loop's turn open until they complete — the daemon's inputQueue
561
- // backs up, and the first overdue cron catch-up on spawn becomes N
562
- // serial subagent turns blocking all user input. Same gate as
563
- // executeForkedSlashCommand's fire-and-forget path; the
564
- // <task-notification> re-entry there is handled by the else branch
565
- // below (registerAsyncAgentTask + notifyOnCompletion).
566
- const assistantForceAsync = feature('KAIROS') ? appState.kairosEnabled : false;
567
- const shouldRunAsync = (run_in_background === true || selectedAgent.background === true || isCoordinator || forceAsync || assistantForceAsync || (proactiveModule?.isProactiveActive() ?? false)) && !isBackgroundTasksDisabled;
568
- // Assemble the worker's tool pool independently of the parent's.
569
- // Workers always get their tools from assembleToolPool with their own
570
- // permission mode, so they aren't affected by the parent's tool
571
- // restrictions. This is computed here so that runAgent doesn't need to
572
- // import from tools.ts (which would create a circular dependency).
573
- const workerPermissionContext = {
574
- ...appState.toolPermissionContext,
575
- mode: selectedAgent.permissionMode ?? 'acceptEdits'
576
- };
577
- const workerTools = assembleToolPool(workerPermissionContext, appState.mcp.tools);
578
-
579
- // Create a stable agent ID early so it can be used for worktree slug
580
- const earlyAgentId = createAgentId();
581
-
582
- // Set up worktree isolation if requested
583
- let worktreeInfo: {
584
- worktreePath: string;
585
- worktreeBranch?: string;
586
- headCommit?: string;
587
- gitRoot?: string;
588
- hookBased?: boolean;
589
- } | null = null;
590
- if (effectiveIsolation === 'worktree') {
591
- const slug = `agent-${earlyAgentId.slice(0, 8)}`;
592
- worktreeInfo = await createAgentWorktree(slug);
593
- }
594
-
595
- // Fork + worktree: inject a notice telling the child to translate paths
596
- // and re-read potentially stale files. Appended after the fork directive
597
- // so it appears as the most recent guidance the child sees.
598
- if (isForkPath && worktreeInfo) {
599
- promptMessages.push(createUserMessage({
600
- content: buildWorktreeNotice(getCwd(), worktreeInfo.worktreePath)
601
- }));
602
- }
603
- const runAgentParams: Parameters<typeof runAgent>[0] = {
604
- agentDefinition: selectedAgent,
605
- promptMessages,
606
- toolUseContext,
607
- canUseTool,
608
- isAsync: shouldRunAsync,
609
- querySource: toolUseContext.options.querySource ?? getQuerySourceForAgent(selectedAgent.agentType, isBuiltInAgent(selectedAgent)),
610
- model: isForkPath ? undefined : model,
611
- // Fork path: pass parent's system prompt AND parent's exact tool
612
- // array (cache-identical prefix). workerTools is rebuilt under
613
- // permissionMode 'bubble' which differs from the parent's mode, so
614
- // its tool-def serialization diverges and breaks cache at the first
615
- // differing tool. useExactTools also inherits the parent's
616
- // thinkingConfig and isNonInteractiveSession (see runAgent.ts).
617
- //
618
- // Normal path: when a cwd override is in effect (worktree isolation
619
- // or explicit cwd), skip the pre-built system prompt so runAgent's
620
- // buildAgentSystemPrompt() runs inside wrapWithCwd where getCwd()
621
- // returns the override path.
622
- override: isForkPath ? {
623
- systemPrompt: forkParentSystemPrompt
624
- } : enhancedSystemPrompt && !worktreeInfo && !cwd ? {
625
- systemPrompt: asSystemPrompt(enhancedSystemPrompt)
626
- } : undefined,
627
- availableTools: isForkPath ? toolUseContext.options.tools : workerTools,
628
- // Pass parent conversation when the fork-subagent path needs full
629
- // context. useExactTools inherits thinkingConfig (runAgent.ts:624).
630
- forkContextMessages: isForkPath ? toolUseContext.messages : undefined,
631
- ...(isForkPath && {
632
- useExactTools: true
633
- }),
634
- worktreePath: worktreeInfo?.worktreePath,
635
- description
636
- };
637
-
638
- // Helper to wrap execution with a cwd override: explicit cwd arg (KAIROS)
639
- // takes precedence over worktree isolation path.
640
- const cwdOverridePath = cwd ?? worktreeInfo?.worktreePath;
641
- const wrapWithCwd = <T,>(fn: () => T): T => cwdOverridePath ? runWithCwdOverride(cwdOverridePath, fn) : fn();
642
-
643
- // Helper to clean up worktree after agent completes
644
- const cleanupWorktreeIfNeeded = async (): Promise<{
645
- worktreePath?: string;
646
- worktreeBranch?: string;
647
- }> => {
648
- if (!worktreeInfo) return {};
649
- const {
650
- worktreePath,
651
- worktreeBranch,
652
- headCommit,
653
- gitRoot,
654
- hookBased
655
- } = worktreeInfo;
656
- // Null out to make idempotent — guards against double-call if code
657
- // between cleanup and end of try throws into catch
658
- worktreeInfo = null;
659
- if (hookBased) {
660
- // Hook-based worktrees are always kept since we can't detect VCS changes
661
- logForDebugging(`Hook-based agent worktree kept at: ${worktreePath}`);
662
- return {
663
- worktreePath
664
- };
665
- }
666
- if (headCommit) {
667
- const changed = await hasWorktreeChanges(worktreePath, headCommit);
668
- if (!changed) {
669
- await removeAgentWorktree(worktreePath, worktreeBranch, gitRoot);
670
- // Clear worktreePath from metadata so resume doesn't try to use
671
- // a deleted directory. Fire-and-forget to match runAgent's
672
- // writeAgentMetadata handling.
673
- void writeAgentMetadata(asAgentId(earlyAgentId), {
674
- agentType: selectedAgent.agentType,
675
- description
676
- }).catch(_err => logForDebugging(`Failed to clear worktree metadata: ${_err}`));
677
- return {};
678
- }
679
- }
680
- logForDebugging(`Agent worktree has changes, keeping: ${worktreePath}`);
681
- return {
682
- worktreePath,
683
- worktreeBranch
684
- };
685
- };
686
- if (shouldRunAsync) {
687
- const asyncAgentId = earlyAgentId;
688
- const agentBackgroundTask = registerAsyncAgent({
689
- agentId: asyncAgentId,
690
- description,
691
- prompt,
692
- selectedAgent,
693
- setAppState: rootSetAppState,
694
- // Don't link to parent's abort controller -- background agents should
695
- // survive when the user presses ESC to cancel the main thread.
696
- // They are killed explicitly via chat:killAgents.
697
- toolUseId: toolUseContext.toolUseId
698
- });
699
-
700
- // Register name → agentId for SendMessage routing. Post-registerAsyncAgent
701
- // so we don't leave a stale entry if spawn fails. Sync agents skipped —
702
- // coordinator is blocked, so SendMessage routing doesn't apply.
703
- if (name) {
704
- rootSetAppState(prev => {
705
- const next = new Map(prev.agentNameRegistry);
706
- next.set(name, asAgentId(asyncAgentId));
707
- return {
708
- ...prev,
709
- agentNameRegistry: next
710
- };
711
- });
712
- }
713
-
714
- // Wrap async agent execution in agent context for analytics attribution
715
- const asyncAgentContext = {
716
- agentId: asyncAgentId,
717
- // For subagents from teammates: use team lead's session
718
- // For subagents from main REPL: undefined (no parent session)
719
- parentSessionId: getParentSessionId(),
720
- agentType: 'subagent' as const,
721
- subagentName: selectedAgent.agentType,
722
- isBuiltIn: isBuiltInAgent(selectedAgent),
723
- invokingRequestId: assistantMessage?.requestId,
724
- invocationKind: 'spawn' as const,
725
- invocationEmitted: false
726
- };
727
-
728
- // Workload propagation: handlePromptSubmit wraps the entire turn in
729
- // runWithWorkload (AsyncLocalStorage). ALS context is captured at
730
- // invocation time — when this `void` fires — and survives every await
731
- // inside. No capture/restore needed; the detached closure sees the
732
- // parent turn's workload automatically, isolated from its finally.
733
- void runWithAgentContext(asyncAgentContext, () => wrapWithCwd(() => runAsyncAgentLifecycle({
734
- taskId: agentBackgroundTask.agentId,
735
- abortController: agentBackgroundTask.abortController!,
736
- makeStream: onCacheSafeParams => runAgent({
737
- ...runAgentParams,
738
- override: {
739
- ...runAgentParams.override,
740
- agentId: asAgentId(agentBackgroundTask.agentId),
741
- abortController: agentBackgroundTask.abortController!
742
- },
743
- onCacheSafeParams
744
- }),
745
- metadata,
746
- description,
747
- toolUseContext,
748
- rootSetAppState,
749
- agentIdForCleanup: asyncAgentId,
750
- enableSummarization: isCoordinator || isForkSubagentEnabled() || getSdkAgentProgressSummariesEnabled(),
751
- getWorktreeResult: cleanupWorktreeIfNeeded
752
- })));
753
- const canReadOutputFile = toolUseContext.options.tools.some(t => toolMatchesName(t, FILE_READ_TOOL_NAME) || toolMatchesName(t, BASH_TOOL_NAME));
754
- return {
755
- data: {
756
- isAsync: true as const,
757
- status: 'async_launched' as const,
758
- agentId: agentBackgroundTask.agentId,
759
- description: description,
760
- prompt: prompt,
761
- outputFile: getTaskOutputPath(agentBackgroundTask.agentId),
762
- canReadOutputFile
763
- }
764
- };
765
- } else {
766
- // Create an explicit agentId for sync agents
767
- const syncAgentId = asAgentId(earlyAgentId);
768
-
769
- // Set up agent context for sync execution (for analytics attribution)
770
- const syncAgentContext = {
771
- agentId: syncAgentId,
772
- // For subagents from teammates: use team lead's session
773
- // For subagents from main REPL: undefined (no parent session)
774
- parentSessionId: getParentSessionId(),
775
- agentType: 'subagent' as const,
776
- subagentName: selectedAgent.agentType,
777
- isBuiltIn: isBuiltInAgent(selectedAgent),
778
- invokingRequestId: assistantMessage?.requestId,
779
- invocationKind: 'spawn' as const,
780
- invocationEmitted: false
781
- };
782
-
783
- // Wrap entire sync agent execution in context for analytics attribution
784
- // and optionally in a worktree cwd override for filesystem isolation
785
- return runWithAgentContext(syncAgentContext, () => wrapWithCwd(async () => {
786
- const agentMessages: MessageType[] = [];
787
- const agentStartTime = Date.now();
788
- const syncTracker = createProgressTracker();
789
- const syncResolveActivity = createActivityDescriptionResolver(toolUseContext.options.tools);
790
-
791
- // Yield initial progress message to carry metadata (prompt)
792
- if (promptMessages.length > 0) {
793
- const normalizedPromptMessages = normalizeMessages(promptMessages);
794
- const normalizedFirstMessage = normalizedPromptMessages.find((m): m is NormalizedUserMessage => m.type === 'user');
795
- if (normalizedFirstMessage && normalizedFirstMessage.type === 'user' && onProgress) {
796
- onProgress({
797
- toolUseID: `agent_${assistantMessage.message.id}`,
798
- data: {
799
- message: normalizedFirstMessage,
800
- type: 'agent_progress',
801
- prompt,
802
- agentId: syncAgentId
803
- }
804
- });
805
- }
806
- }
807
-
808
- // Register as foreground task immediately so it can be backgrounded at any time
809
- // Skip registration if background tasks are disabled
810
- let foregroundTaskId: string | undefined;
811
- // Create the background race promise once outside the loop — otherwise
812
- // each iteration adds a new .then() reaction to the same pending
813
- // promise, accumulating callbacks for the lifetime of the agent.
814
- let backgroundPromise: Promise<{
815
- type: 'background';
816
- }> | undefined;
817
- let cancelAutoBackground: (() => void) | undefined;
818
- if (!isBackgroundTasksDisabled) {
819
- const registration = registerAgentForeground({
820
- agentId: syncAgentId,
821
- description,
822
- prompt,
823
- selectedAgent,
824
- setAppState: rootSetAppState,
825
- toolUseId: toolUseContext.toolUseId,
826
- autoBackgroundMs: getAutoBackgroundMs() || undefined
827
- });
828
- foregroundTaskId = registration.taskId;
829
- backgroundPromise = registration.backgroundSignal.then(() => ({
830
- type: 'background' as const
831
- }));
832
- cancelAutoBackground = registration.cancelAutoBackground;
833
- }
834
-
835
- // Track if we've shown the background hint UI
836
- let backgroundHintShown = false;
837
- // Track if the agent was backgrounded (cleanup handled by backgrounded finally)
838
- let wasBackgrounded = false;
839
- // Per-scope stop function — NOT shared with the backgrounded closure.
840
- // idempotent: startAgentSummarization's stop() checks `stopped` flag.
841
- let stopForegroundSummarization: (() => void) | undefined;
842
- // const capture for sound type narrowing inside the callback below
843
- const summaryTaskId = foregroundTaskId;
844
-
845
- // Get async iterator for the agent
846
- const agentIterator = runAgent({
847
- ...runAgentParams,
848
- override: {
849
- ...runAgentParams.override,
850
- agentId: syncAgentId
851
- },
852
- onCacheSafeParams: summaryTaskId && getSdkAgentProgressSummariesEnabled() ? (params: CacheSafeParams) => {
853
- const {
854
- stop
855
- } = startAgentSummarization(summaryTaskId, syncAgentId, params, rootSetAppState);
856
- stopForegroundSummarization = stop;
857
- } : undefined
858
- })[Symbol.asyncIterator]();
859
-
860
- // Track if an error occurred during iteration
861
- let syncAgentError: Error | undefined;
862
- let wasAborted = false;
863
- let worktreeResult: {
864
- worktreePath?: string;
865
- worktreeBranch?: string;
866
- } = {};
867
- try {
868
- while (true) {
869
- const elapsed = Date.now() - agentStartTime;
870
-
871
- // Show background hint after threshold (but task is already registered)
872
- // Skip if background tasks are disabled
873
- if (!isBackgroundTasksDisabled && !backgroundHintShown && elapsed >= PROGRESS_THRESHOLD_MS && toolUseContext.setToolJSX) {
874
- backgroundHintShown = true;
875
- toolUseContext.setToolJSX({
876
- jsx: <BackgroundHint />,
877
- shouldHidePromptInput: false,
878
- shouldContinueAnimation: true,
879
- showSpinner: true
880
- });
881
- }
882
-
883
- // Race between next message and background signal
884
- // If background tasks are disabled, just await the next message directly
885
- const nextMessagePromise = agentIterator.next();
886
- const raceResult = backgroundPromise ? await Promise.race([nextMessagePromise.then(r => ({
887
- type: 'message' as const,
888
- result: r
889
- })), backgroundPromise]) : {
890
- type: 'message' as const,
891
- result: await nextMessagePromise
892
- };
893
-
894
- // Check if we were backgrounded via backgroundAll()
895
- // foregroundTaskId is guaranteed to be defined if raceResult.type is 'background'
896
- // because backgroundPromise is only defined when foregroundTaskId is defined
897
- if (raceResult.type === 'background' && foregroundTaskId) {
898
- const appState = toolUseContext.getAppState();
899
- const task = appState.tasks[foregroundTaskId];
900
- if (isLocalAgentTask(task) && task.isBackgrounded) {
901
- // Capture the taskId for use in the async callback
902
- const backgroundedTaskId = foregroundTaskId;
903
- wasBackgrounded = true;
904
- // Stop foreground summarization; the backgrounded closure
905
- // below owns its own independent stop function.
906
- stopForegroundSummarization?.();
907
-
908
- // Workload: inherited via ALS at `void` invocation time,
909
- // same as the async-from-start path above.
910
- // Continue agent in background and return async result
911
- void runWithAgentContext(syncAgentContext, async () => {
912
- let stopBackgroundedSummarization: (() => void) | undefined;
913
- try {
914
- // Clean up the foreground iterator so its finally block runs
915
- // (releases MCP connections, session hooks, prompt cache tracking, etc.)
916
- // Timeout prevents blocking if MCP server cleanup hangs.
917
- // .catch() prevents unhandled rejection if timeout wins the race.
918
- await Promise.race([agentIterator.return(undefined).catch(() => {}), sleep(1000)]);
919
- // Initialize progress tracking from existing messages
920
- const tracker = createProgressTracker();
921
- const resolveActivity2 = createActivityDescriptionResolver(toolUseContext.options.tools);
922
- for (const existingMsg of agentMessages) {
923
- updateProgressFromMessage(tracker, existingMsg, resolveActivity2, toolUseContext.options.tools);
924
- }
925
- for await (const msg of runAgent({
926
- ...runAgentParams,
927
- isAsync: true,
928
- // Agent is now running in background
929
- override: {
930
- ...runAgentParams.override,
931
- agentId: asAgentId(backgroundedTaskId),
932
- abortController: task.abortController
933
- },
934
- onCacheSafeParams: getSdkAgentProgressSummariesEnabled() ? (params: CacheSafeParams) => {
935
- const {
936
- stop
937
- } = startAgentSummarization(backgroundedTaskId, asAgentId(backgroundedTaskId), params, rootSetAppState);
938
- stopBackgroundedSummarization = stop;
939
- } : undefined
940
- })) {
941
- agentMessages.push(msg);
942
-
943
- // Track progress for backgrounded agents
944
- updateProgressFromMessage(tracker, msg, resolveActivity2, toolUseContext.options.tools);
945
- updateAsyncAgentProgress(backgroundedTaskId, getProgressUpdate(tracker), rootSetAppState);
946
- const lastToolName = getLastToolUseName(msg);
947
- if (lastToolName) {
948
- emitTaskProgress(tracker, backgroundedTaskId, toolUseContext.toolUseId, description, startTime, lastToolName);
949
- }
950
- }
951
- const agentResult = finalizeAgentTool(agentMessages, backgroundedTaskId, metadata);
952
-
953
- // Mark task completed FIRST so TaskOutput(block=true)
954
- // unblocks immediately. classifyHandoffIfNeeded and
955
- // cleanupWorktreeIfNeeded can hang — they must not gate
956
- // the status transition (gh-20236).
957
- completeAsyncAgent(agentResult, rootSetAppState);
958
-
959
- // Extract text from agent result content for the notification
960
- let finalMessage = extractTextContent(agentResult.content, '\n');
961
- if (feature('TRANSCRIPT_CLASSIFIER')) {
962
- const backgroundedAppState = toolUseContext.getAppState();
963
- const handoffWarning = await classifyHandoffIfNeeded({
964
- agentMessages,
965
- tools: toolUseContext.options.tools,
966
- toolPermissionContext: backgroundedAppState.toolPermissionContext,
967
- abortSignal: task.abortController!.signal,
968
- subagentType: selectedAgent.agentType,
969
- totalToolUseCount: agentResult.totalToolUseCount
970
- });
971
- if (handoffWarning) {
972
- finalMessage = `${handoffWarning}\n\n${finalMessage}`;
973
- }
974
- }
975
-
976
- // Clean up worktree before notification so we can include it
977
- const worktreeResult = await cleanupWorktreeIfNeeded();
978
- enqueueAgentNotification({
979
- taskId: backgroundedTaskId,
980
- description,
981
- status: 'completed',
982
- setAppState: rootSetAppState,
983
- finalMessage,
984
- usage: {
985
- totalTokens: getTokenCountFromTracker(tracker),
986
- toolUses: agentResult.totalToolUseCount,
987
- durationMs: agentResult.totalDurationMs
988
- },
989
- toolUseId: toolUseContext.toolUseId,
990
- ...worktreeResult
991
- });
992
- } catch (error) {
993
- if (error instanceof AbortError) {
994
- // Transition status BEFORE worktree cleanup so
995
- // TaskOutput unblocks even if git hangs (gh-20236).
996
- killAsyncAgent(backgroundedTaskId, rootSetAppState);
997
- logEvent('tengu_agent_tool_terminated', {
998
- agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
999
- model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1000
- duration_ms: Date.now() - metadata.startTime,
1001
- is_async: true,
1002
- is_built_in_agent: metadata.isBuiltInAgent,
1003
- reason: 'user_cancel_background' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
1004
- });
1005
- const worktreeResult = await cleanupWorktreeIfNeeded();
1006
- const partialResult = extractPartialResult(agentMessages);
1007
- enqueueAgentNotification({
1008
- taskId: backgroundedTaskId,
1009
- description,
1010
- status: 'killed',
1011
- setAppState: rootSetAppState,
1012
- toolUseId: toolUseContext.toolUseId,
1013
- finalMessage: partialResult,
1014
- ...worktreeResult
1015
- });
1016
- return;
1017
- }
1018
- const errMsg = errorMessage(error);
1019
- failAsyncAgent(backgroundedTaskId, errMsg, rootSetAppState);
1020
- const worktreeResult = await cleanupWorktreeIfNeeded();
1021
- enqueueAgentNotification({
1022
- taskId: backgroundedTaskId,
1023
- description,
1024
- status: 'failed',
1025
- error: errMsg,
1026
- setAppState: rootSetAppState,
1027
- toolUseId: toolUseContext.toolUseId,
1028
- ...worktreeResult
1029
- });
1030
- } finally {
1031
- stopBackgroundedSummarization?.();
1032
- clearInvokedSkillsForAgent(syncAgentId);
1033
- clearDumpState(syncAgentId);
1034
- // Note: worktree cleanup is done before enqueueAgentNotification
1035
- // in both try and catch paths so we can include worktree info
1036
- }
1037
- });
1038
-
1039
- // Return async_launched result immediately
1040
- const canReadOutputFile = toolUseContext.options.tools.some(t => toolMatchesName(t, FILE_READ_TOOL_NAME) || toolMatchesName(t, BASH_TOOL_NAME));
1041
- return {
1042
- data: {
1043
- isAsync: true as const,
1044
- status: 'async_launched' as const,
1045
- agentId: backgroundedTaskId,
1046
- description: description,
1047
- prompt: prompt,
1048
- outputFile: getTaskOutputPath(backgroundedTaskId),
1049
- canReadOutputFile
1050
- }
1051
- };
1052
- }
1053
- }
1054
-
1055
- // Process the message from the race result
1056
- if (raceResult.type !== 'message') {
1057
- // This shouldn't happen - background case handled above
1058
- continue;
1059
- }
1060
- const {
1061
- result
1062
- } = raceResult;
1063
- if (result.done) break;
1064
- const message = result.value;
1065
- agentMessages.push(message);
1066
-
1067
- // Emit task_progress for the VS Code subagent panel
1068
- updateProgressFromMessage(syncTracker, message, syncResolveActivity, toolUseContext.options.tools);
1069
- if (foregroundTaskId) {
1070
- const lastToolName = getLastToolUseName(message);
1071
- if (lastToolName) {
1072
- emitTaskProgress(syncTracker, foregroundTaskId, toolUseContext.toolUseId, description, agentStartTime, lastToolName);
1073
- // Keep AppState task.progress in sync when SDK summaries are
1074
- // enabled, so updateAgentSummary reads correct token/tool counts
1075
- // instead of zeros.
1076
- if (getSdkAgentProgressSummariesEnabled()) {
1077
- updateAsyncAgentProgress(foregroundTaskId, getProgressUpdate(syncTracker), rootSetAppState);
1078
- }
1079
- }
1080
- }
1081
-
1082
- // Forward bash_progress events from sub-agent to parent so the SDK
1083
- // receives tool_progress events just as it does for the main agent.
1084
- if (message.type === 'progress' && (message.data.type === 'bash_progress' || message.data.type === 'powershell_progress') && onProgress) {
1085
- onProgress({
1086
- toolUseID: message.toolUseID,
1087
- data: message.data
1088
- });
1089
- }
1090
- if (message.type !== 'assistant' && message.type !== 'user') {
1091
- continue;
1092
- }
1093
-
1094
- // Increment token count in spinner for assistant messages
1095
- // Subagent streaming events are filtered out in runAgent.ts, so we
1096
- // need to count tokens from completed messages here
1097
- if (message.type === 'assistant') {
1098
- const contentLength = getAssistantMessageContentLength(message);
1099
- if (contentLength > 0) {
1100
- toolUseContext.setResponseLength(len => len + contentLength);
1101
- }
1102
- }
1103
- const normalizedNew = normalizeMessages([message]);
1104
- for (const m of normalizedNew) {
1105
- for (const content of m.message.content) {
1106
- if (content.type !== 'tool_use' && content.type !== 'tool_result') {
1107
- continue;
1108
- }
1109
-
1110
- // Forward progress updates
1111
- if (onProgress) {
1112
- onProgress({
1113
- toolUseID: `agent_${assistantMessage.message.id}`,
1114
- data: {
1115
- message: m,
1116
- type: 'agent_progress',
1117
- // prompt only needed on first progress message (UI.tsx:624
1118
- // reads progressMessages[0]). Omit here to avoid duplication.
1119
- prompt: '',
1120
- agentId: syncAgentId
1121
- }
1122
- });
1123
- }
1124
- }
1125
- }
1126
- }
1127
- } catch (error) {
1128
- // Handle errors from the sync agent loop
1129
- // AbortError should be re-thrown for proper interruption handling
1130
- if (error instanceof AbortError) {
1131
- wasAborted = true;
1132
- logEvent('tengu_agent_tool_terminated', {
1133
- agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1134
- model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1135
- duration_ms: Date.now() - metadata.startTime,
1136
- is_async: false,
1137
- is_built_in_agent: metadata.isBuiltInAgent,
1138
- reason: 'user_cancel_sync' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
1139
- });
1140
- throw error;
1141
- }
1142
-
1143
- // Log the error for debugging
1144
- logForDebugging(`Sync agent error: ${errorMessage(error)}`, {
1145
- level: 'error'
1146
- });
1147
-
1148
- // Store the error to handle after cleanup
1149
- syncAgentError = toError(error);
1150
- } finally {
1151
- // Clear the background hint UI
1152
- if (toolUseContext.setToolJSX) {
1153
- toolUseContext.setToolJSX(null);
1154
- }
1155
-
1156
- // Stop foreground summarization. Idempotent — if already stopped at
1157
- // the backgrounding transition, this is a no-op. The backgrounded
1158
- // closure owns a separate stop function (stopBackgroundedSummarization).
1159
- stopForegroundSummarization?.();
1160
-
1161
- // Unregister foreground task if agent completed without being backgrounded
1162
- if (foregroundTaskId) {
1163
- unregisterAgentForeground(foregroundTaskId, rootSetAppState);
1164
- // Notify SDK consumers (e.g. VS Code subagent panel) that this
1165
- // foreground agent is done. Goes through drainSdkEvents() — does
1166
- // NOT trigger the print.ts XML task_notification parser or the LLM loop.
1167
- if (!wasBackgrounded) {
1168
- const progress = getProgressUpdate(syncTracker);
1169
- enqueueSdkEvent({
1170
- type: 'system',
1171
- subtype: 'task_notification',
1172
- task_id: foregroundTaskId,
1173
- tool_use_id: toolUseContext.toolUseId,
1174
- status: syncAgentError ? 'failed' : wasAborted ? 'stopped' : 'completed',
1175
- output_file: '',
1176
- summary: description,
1177
- usage: {
1178
- total_tokens: progress.tokenCount,
1179
- tool_uses: progress.toolUseCount,
1180
- duration_ms: Date.now() - agentStartTime
1181
- }
1182
- });
1183
- }
1184
- }
1185
-
1186
- // Clean up scoped skills so they don't accumulate in the global map
1187
- clearInvokedSkillsForAgent(syncAgentId);
1188
-
1189
- // Clean up dumpState entry for this agent to prevent unbounded growth
1190
- // Skip if backgrounded — the backgrounded agent's finally handles cleanup
1191
- if (!wasBackgrounded) {
1192
- clearDumpState(syncAgentId);
1193
- }
1194
-
1195
- // Cancel auto-background timer if agent completed before it fired
1196
- cancelAutoBackground?.();
1197
-
1198
- // Clean up worktree if applicable (in finally to handle abort/error paths)
1199
- // Skip if backgrounded — the background continuation is still running in it
1200
- if (!wasBackgrounded) {
1201
- worktreeResult = await cleanupWorktreeIfNeeded();
1202
- }
1203
- }
1204
-
1205
- // Re-throw abort errors
1206
- // TODO: Find a cleaner way to express this
1207
- const lastMessage = agentMessages.findLast(_ => _.type !== 'system' && _.type !== 'progress');
1208
- if (lastMessage && isSyntheticMessage(lastMessage)) {
1209
- logEvent('tengu_agent_tool_terminated', {
1210
- agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1211
- model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1212
- duration_ms: Date.now() - metadata.startTime,
1213
- is_async: false,
1214
- is_built_in_agent: metadata.isBuiltInAgent,
1215
- reason: 'user_cancel_sync' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
1216
- });
1217
- throw new AbortError();
1218
- }
1219
-
1220
- // If an error occurred during iteration, try to return a result with
1221
- // whatever messages we have. If we have no assistant messages,
1222
- // re-throw the error so it's properly handled by the tool framework.
1223
- if (syncAgentError) {
1224
- // Check if we have any assistant messages to return
1225
- const hasAssistantMessages = agentMessages.some(msg => msg.type === 'assistant');
1226
- if (!hasAssistantMessages) {
1227
- // No messages collected, re-throw the error
1228
- throw syncAgentError;
1229
- }
1230
-
1231
- // We have some messages, try to finalize and return them
1232
- // This allows the parent agent to see partial progress even after an error
1233
- logForDebugging(`Sync agent recovering from error with ${agentMessages.length} messages`);
1234
- }
1235
- const agentResult = finalizeAgentTool(agentMessages, syncAgentId, metadata);
1236
- if (feature('TRANSCRIPT_CLASSIFIER')) {
1237
- const currentAppState = toolUseContext.getAppState();
1238
- const handoffWarning = await classifyHandoffIfNeeded({
1239
- agentMessages,
1240
- tools: toolUseContext.options.tools,
1241
- toolPermissionContext: currentAppState.toolPermissionContext,
1242
- abortSignal: toolUseContext.abortController.signal,
1243
- subagentType: selectedAgent.agentType,
1244
- totalToolUseCount: agentResult.totalToolUseCount
1245
- });
1246
- if (handoffWarning) {
1247
- agentResult.content = [{
1248
- type: 'text' as const,
1249
- text: handoffWarning
1250
- }, ...agentResult.content];
1251
- }
1252
- }
1253
- return {
1254
- data: {
1255
- status: 'completed' as const,
1256
- prompt,
1257
- ...agentResult,
1258
- ...worktreeResult
1259
- }
1260
- };
1261
- }));
1262
- }
1263
- },
1264
- isReadOnly() {
1265
- return true; // delegates permission checks to its underlying tools
1266
- },
1267
- toAutoClassifierInput(input) {
1268
- const i = input as AgentToolInput;
1269
- const tags = [i.subagent_type, i.mode ? `mode=${i.mode}` : undefined].filter((t): t is string => t !== undefined);
1270
- const prefix = tags.length > 0 ? `(${tags.join(', ')}): ` : ': ';
1271
- return `${prefix}${i.prompt}`;
1272
- },
1273
- isConcurrencySafe() {
1274
- return true;
1275
- },
1276
- userFacingName,
1277
- userFacingNameBackgroundColor,
1278
- getActivityDescription(input) {
1279
- return input?.description ?? 'Running task';
1280
- },
1281
- async checkPermissions(input, context): Promise<PermissionResult> {
1282
- const appState = context.getAppState();
1283
-
1284
- // Only route through auto mode classifier when in auto mode
1285
- // In all other modes, auto-approve sub-agent generation
1286
- // Note: "external" === 'ant' guard enables dead code elimination for external builds
1287
- if ("external" === 'ant' && appState.toolPermissionContext.mode === 'auto') {
1288
- return {
1289
- behavior: 'passthrough',
1290
- message: 'Agent tool requires permission to spawn sub-agents.'
1291
- };
1292
- }
1293
- return {
1294
- behavior: 'allow',
1295
- updatedInput: input
1296
- };
1297
- },
1298
- mapToolResultToToolResultBlockParam(data, toolUseID) {
1299
- // Multi-agent spawn result
1300
- const internalData = data as InternalOutput;
1301
- if (typeof internalData === 'object' && internalData !== null && 'status' in internalData && internalData.status === 'teammate_spawned') {
1302
- const spawnData = internalData as TeammateSpawnedOutput;
1303
- return {
1304
- tool_use_id: toolUseID,
1305
- type: 'tool_result',
1306
- content: [{
1307
- type: 'text',
1308
- text: `Spawned successfully.
1309
- agent_id: ${spawnData.teammate_id}
1310
- name: ${spawnData.name}
1311
- team_name: ${spawnData.team_name}
1312
- The agent is now running and will receive instructions via mailbox.`
1313
- }]
1314
- };
1315
- }
1316
- if ('status' in internalData && internalData.status === 'remote_launched') {
1317
- const r = internalData;
1318
- return {
1319
- tool_use_id: toolUseID,
1320
- type: 'tool_result',
1321
- content: [{
1322
- type: 'text',
1323
- text: `Remote agent launched in CCR.\ntaskId: ${r.taskId}\nsession_url: ${r.sessionUrl}\noutput_file: ${r.outputFile}\nThe agent is running remotely. You will be notified automatically when it completes.\nBriefly tell the user what you launched and end your response.`
1324
- }]
1325
- };
1326
- }
1327
- if (data.status === 'async_launched') {
1328
- const prefix = `Async agent launched successfully.\nagentId: ${data.agentId} (internal ID - do not mention to user. Use SendMessage with to: '${data.agentId}' to continue this agent.)\nThe agent is working in the background. You will be notified automatically when it completes.`;
1329
- const instructions = data.canReadOutputFile ? `Do not duplicate this agent's work — avoid working with the same files or topics it is using. Work on non-overlapping tasks, or briefly tell the user what you launched and end your response.\noutput_file: ${data.outputFile}\nIf asked, you can check progress before completion by using ${FILE_READ_TOOL_NAME} or ${BASH_TOOL_NAME} tail on the output file.` : `Briefly tell the user what you launched and end your response. Do not generate any other text — agent results will arrive in a subsequent message.`;
1330
- const text = `${prefix}\n${instructions}`;
1331
- return {
1332
- tool_use_id: toolUseID,
1333
- type: 'tool_result',
1334
- content: [{
1335
- type: 'text',
1336
- text
1337
- }]
1338
- };
1339
- }
1340
- if (data.status === 'completed') {
1341
- const worktreeData = data as Record<string, unknown>;
1342
- const worktreeInfoText = worktreeData.worktreePath ? `\nworktreePath: ${worktreeData.worktreePath}\nworktreeBranch: ${worktreeData.worktreeBranch}` : '';
1343
- // If the subagent completes with no content, the tool_result is just the
1344
- // agentId/usage trailer below — a metadata-only block at the prompt tail.
1345
- // Some models read that as "nothing to act on" and end their turn
1346
- // immediately. Say so explicitly so the parent has something to react to.
1347
- const contentOrMarker = data.content.length > 0 ? data.content : [{
1348
- type: 'text' as const,
1349
- text: '(Subagent completed but returned no output.)'
1350
- }];
1351
- // One-shot built-ins (Explore, Plan) are never continued via SendMessage
1352
- // — the agentId hint and <usage> block are dead weight (~135 chars ×
1353
- // 34M Explore runs/week ≈ 1-2 Gtok/week). Telemetry doesn't parse this
1354
- // block (it uses logEvent in finalizeAgentTool), so dropping is safe.
1355
- // agentType is optional for resume compat — missing means show trailer.
1356
- if (data.agentType && ONE_SHOT_BUILTIN_AGENT_TYPES.has(data.agentType) && !worktreeInfoText) {
1357
- return {
1358
- tool_use_id: toolUseID,
1359
- type: 'tool_result',
1360
- content: contentOrMarker
1361
- };
1362
- }
1363
- return {
1364
- tool_use_id: toolUseID,
1365
- type: 'tool_result',
1366
- content: [...contentOrMarker, {
1367
- type: 'text',
1368
- text: `agentId: ${data.agentId} (use SendMessage with to: '${data.agentId}' to continue this agent)${worktreeInfoText}
1369
- <usage>total_tokens: ${data.totalTokens}
1370
- tool_uses: ${data.totalToolUseCount}
1371
- duration_ms: ${data.totalDurationMs}</usage>`
1372
- }]
1373
- };
1374
- }
1375
- data satisfies never;
1376
- throw new Error(`Unexpected agent tool result status: ${(data as {
1377
- status: string;
1378
- }).status}`);
1379
- },
1380
- renderToolResultMessage,
1381
- renderToolUseMessage,
1382
- renderToolUseTag,
1383
- renderToolUseProgressMessage,
1384
- renderToolUseRejectedMessage,
1385
- renderToolUseErrorMessage,
1386
- renderGroupedToolUse: renderGroupedAgentToolUse
1387
- } satisfies ToolDef<InputSchema, Output, Progress>);
1388
- function resolveTeamName(input: {
1389
- team_name?: string;
1390
- }, appState: {
1391
- teamContext?: {
1392
- teamName: string;
1393
- };
1394
- }): string | undefined {
1395
- if (!isAgentSwarmsEnabled()) return undefined;
1396
- return input.team_name || appState.teamContext?.teamName;
1397
- }
1398
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJidWlsZFRvb2wiLCJUb29sRGVmIiwidG9vbE1hdGNoZXNOYW1lIiwiTWVzc2FnZSIsIk1lc3NhZ2VUeXBlIiwiTm9ybWFsaXplZFVzZXJNZXNzYWdlIiwiZ2V0UXVlcnlTb3VyY2VGb3JBZ2VudCIsInoiLCJjbGVhckludm9rZWRTa2lsbHNGb3JBZ2VudCIsImdldFNka0FnZW50UHJvZ3Jlc3NTdW1tYXJpZXNFbmFibGVkIiwiZW5oYW5jZVN5c3RlbVByb21wdFdpdGhFbnZEZXRhaWxzIiwiZ2V0U3lzdGVtUHJvbXB0IiwiaXNDb29yZGluYXRvck1vZGUiLCJzdGFydEFnZW50U3VtbWFyaXphdGlvbiIsImdldEZlYXR1cmVWYWx1ZV9DQUNIRURfTUFZX0JFX1NUQUxFIiwiQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyIsImxvZ0V2ZW50IiwiY2xlYXJEdW1wU3RhdGUiLCJjb21wbGV0ZUFnZW50VGFzayIsImNvbXBsZXRlQXN5bmNBZ2VudCIsImNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25SZXNvbHZlciIsImNyZWF0ZVByb2dyZXNzVHJhY2tlciIsImVucXVldWVBZ2VudE5vdGlmaWNhdGlvbiIsImZhaWxBZ2VudFRhc2siLCJmYWlsQXN5bmNBZ2VudCIsImdldFByb2dyZXNzVXBkYXRlIiwiZ2V0VG9rZW5Db3VudEZyb21UcmFja2VyIiwiaXNMb2NhbEFnZW50VGFzayIsImtpbGxBc3luY0FnZW50IiwicmVnaXN0ZXJBZ2VudEZvcmVncm91bmQiLCJyZWdpc3RlckFzeW5jQWdlbnQiLCJ1bnJlZ2lzdGVyQWdlbnRGb3JlZ3JvdW5kIiwidXBkYXRlQWdlbnRQcm9ncmVzcyIsInVwZGF0ZUFzeW5jQWdlbnRQcm9ncmVzcyIsInVwZGF0ZVByb2dyZXNzRnJvbU1lc3NhZ2UiLCJjaGVja1JlbW90ZUFnZW50RWxpZ2liaWxpdHkiLCJmb3JtYXRQcmVjb25kaXRpb25FcnJvciIsImdldFJlbW90ZVRhc2tTZXNzaW9uVXJsIiwicmVnaXN0ZXJSZW1vdGVBZ2VudFRhc2siLCJhc3NlbWJsZVRvb2xQb29sIiwiYXNBZ2VudElkIiwicnVuV2l0aEFnZW50Q29udGV4dCIsImlzQWdlbnRTd2FybXNFbmFibGVkIiwiZ2V0Q3dkIiwicnVuV2l0aEN3ZE92ZXJyaWRlIiwibG9nRm9yRGVidWdnaW5nIiwiaXNFbnZUcnV0aHkiLCJBYm9ydEVycm9yIiwiZXJyb3JNZXNzYWdlIiwidG9FcnJvciIsIkNhY2hlU2FmZVBhcmFtcyIsImxhenlTY2hlbWEiLCJjcmVhdGVVc2VyTWVzc2FnZSIsImV4dHJhY3RUZXh0Q29udGVudCIsImlzU3ludGhldGljTWVzc2FnZSIsIm5vcm1hbGl6ZU1lc3NhZ2VzIiwiZ2V0QWdlbnRNb2RlbCIsInBlcm1pc3Npb25Nb2RlU2NoZW1hIiwiUGVybWlzc2lvblJlc3VsdCIsImZpbHRlckRlbmllZEFnZW50cyIsImdldERlbnlSdWxlRm9yQWdlbnQiLCJlbnF1ZXVlU2RrRXZlbnQiLCJ3cml0ZUFnZW50TWV0YWRhdGEiLCJzbGVlcCIsImJ1aWxkRWZmZWN0aXZlU3lzdGVtUHJvbXB0IiwiYXNTeXN0ZW1Qcm9tcHQiLCJnZXRUYXNrT3V0cHV0UGF0aCIsImdldFBhcmVudFNlc3Npb25JZCIsImlzVGVhbW1hdGUiLCJpc0luUHJvY2Vzc1RlYW1tYXRlIiwidGVsZXBvcnRUb1JlbW90ZSIsImdldEFzc2lzdGFudE1lc3NhZ2VDb250ZW50TGVuZ3RoIiwiY3JlYXRlQWdlbnRJZCIsImNyZWF0ZUFnZW50V29ya3RyZWUiLCJoYXNXb3JrdHJlZUNoYW5nZXMiLCJyZW1vdmVBZ2VudFdvcmt0cmVlIiwiQkFTSF9UT09MX05BTUUiLCJCYWNrZ3JvdW5kSGludCIsIkZJTEVfUkVBRF9UT09MX05BTUUiLCJzcGF3blRlYW1tYXRlIiwic2V0QWdlbnRDb2xvciIsImFnZW50VG9vbFJlc3VsdFNjaGVtYSIsImNsYXNzaWZ5SGFuZG9mZklmTmVlZGVkIiwiZW1pdFRhc2tQcm9ncmVzcyIsImV4dHJhY3RQYXJ0aWFsUmVzdWx0IiwiZmluYWxpemVBZ2VudFRvb2wiLCJnZXRMYXN0VG9vbFVzZU5hbWUiLCJydW5Bc3luY0FnZW50TGlmZWN5Y2xlIiwiR0VORVJBTF9QVVJQT1NFX0FHRU5UIiwiQUdFTlRfVE9PTF9OQU1FIiwiTEVHQUNZX0FHRU5UX1RPT0xfTkFNRSIsIk9ORV9TSE9UX0JVSUxUSU5fQUdFTlRfVFlQRVMiLCJidWlsZEZvcmtlZE1lc3NhZ2VzIiwiYnVpbGRXb3JrdHJlZU5vdGljZSIsIkZPUktfQUdFTlQiLCJpc0ZvcmtTdWJhZ2VudEVuYWJsZWQiLCJpc0luRm9ya0NoaWxkIiwiQWdlbnREZWZpbml0aW9uIiwiZmlsdGVyQWdlbnRzQnlNY3BSZXF1aXJlbWVudHMiLCJoYXNSZXF1aXJlZE1jcFNlcnZlcnMiLCJpc0J1aWx0SW5BZ2VudCIsImdldFByb21wdCIsInJ1bkFnZW50IiwicmVuZGVyR3JvdXBlZEFnZW50VG9vbFVzZSIsInJlbmRlclRvb2xSZXN1bHRNZXNzYWdlIiwicmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSIsInJlbmRlclRvb2xVc2VNZXNzYWdlIiwicmVuZGVyVG9vbFVzZVByb2dyZXNzTWVzc2FnZSIsInJlbmRlclRvb2xVc2VSZWplY3RlZE1lc3NhZ2UiLCJyZW5kZXJUb29sVXNlVGFnIiwidXNlckZhY2luZ05hbWUiLCJ1c2VyRmFjaW5nTmFtZUJhY2tncm91bmRDb2xvciIsInByb2FjdGl2ZU1vZHVsZSIsInJlcXVpcmUiLCJQUk9HUkVTU19USFJFU0hPTERfTVMiLCJpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkIiwicHJvY2VzcyIsImVudiIsIkNMQVVERV9DT0RFX0RJU0FCTEVfQkFDS0dST1VORF9UQVNLUyIsImdldEF1dG9CYWNrZ3JvdW5kTXMiLCJDTEFVREVfQVVUT19CQUNLR1JPVU5EX1RBU0tTIiwiYmFzZUlucHV0U2NoZW1hIiwib2JqZWN0IiwiZGVzY3JpcHRpb24iLCJzdHJpbmciLCJkZXNjcmliZSIsInByb21wdCIsInN1YmFnZW50X3R5cGUiLCJvcHRpb25hbCIsIm1vZGVsIiwiZW51bSIsInJ1bl9pbl9iYWNrZ3JvdW5kIiwiYm9vbGVhbiIsImZ1bGxJbnB1dFNjaGVtYSIsIm11bHRpQWdlbnRJbnB1dFNjaGVtYSIsIm5hbWUiLCJ0ZWFtX25hbWUiLCJtb2RlIiwibWVyZ2UiLCJleHRlbmQiLCJpc29sYXRpb24iLCJjd2QiLCJpbnB1dFNjaGVtYSIsInNjaGVtYSIsIm9taXQiLCJJbnB1dFNjaGVtYSIsIlJldHVyblR5cGUiLCJBZ2VudFRvb2xJbnB1dCIsImluZmVyIiwib3V0cHV0U2NoZW1hIiwic3luY091dHB1dFNjaGVtYSIsInN0YXR1cyIsImxpdGVyYWwiLCJhc3luY091dHB1dFNjaGVtYSIsImFnZW50SWQiLCJvdXRwdXRGaWxlIiwiY2FuUmVhZE91dHB1dEZpbGUiLCJ1bmlvbiIsIk91dHB1dFNjaGVtYSIsIk91dHB1dCIsImlucHV0IiwiVGVhbW1hdGVTcGF3bmVkT3V0cHV0IiwidGVhbW1hdGVfaWQiLCJhZ2VudF9pZCIsImFnZW50X3R5cGUiLCJjb2xvciIsInRtdXhfc2Vzc2lvbl9uYW1lIiwidG11eF93aW5kb3dfbmFtZSIsInRtdXhfcGFuZV9pZCIsImlzX3NwbGl0cGFuZSIsInBsYW5fbW9kZV9yZXF1aXJlZCIsIlJlbW90ZUxhdW5jaGVkT3V0cHV0IiwidGFza0lkIiwic2Vzc2lvblVybCIsIkludGVybmFsT3V0cHV0IiwiQWdlbnRUb29sUHJvZ3Jlc3MiLCJTaGVsbFByb2dyZXNzIiwiUHJvZ3Jlc3MiLCJBZ2VudFRvb2wiLCJhZ2VudHMiLCJ0b29scyIsImdldFRvb2xQZXJtaXNzaW9uQ29udGV4dCIsImFsbG93ZWRBZ2VudFR5cGVzIiwidG9vbFBlcm1pc3Npb25Db250ZXh0IiwibWNwU2VydmVyc1dpdGhUb29scyIsInRvb2wiLCJzdGFydHNXaXRoIiwicGFydHMiLCJzcGxpdCIsInNlcnZlck5hbWUiLCJpbmNsdWRlcyIsInB1c2giLCJhZ2VudHNXaXRoTWNwUmVxdWlyZW1lbnRzTWV0IiwiZmlsdGVyZWRBZ2VudHMiLCJpc0Nvb3JkaW5hdG9yIiwiQ0xBVURFX0NPREVfQ09PUkRJTkFUT1JfTU9ERSIsInNlYXJjaEhpbnQiLCJhbGlhc2VzIiwibWF4UmVzdWx0U2l6ZUNoYXJzIiwiY2FsbCIsIm1vZGVsUGFyYW0iLCJzcGF3bk1vZGUiLCJ0b29sVXNlQ29udGV4dCIsImNhblVzZVRvb2wiLCJhc3Npc3RhbnRNZXNzYWdlIiwib25Qcm9ncmVzcyIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJ1bmRlZmluZWQiLCJhcHBTdGF0ZSIsImdldEFwcFN0YXRlIiwicGVybWlzc2lvbk1vZGUiLCJyb290U2V0QXBwU3RhdGUiLCJzZXRBcHBTdGF0ZUZvclRhc2tzIiwic2V0QXBwU3RhdGUiLCJFcnJvciIsInRlYW1OYW1lIiwicmVzb2x2ZVRlYW1OYW1lIiwiYWdlbnREZWYiLCJvcHRpb25zIiwiYWdlbnREZWZpbml0aW9ucyIsImFjdGl2ZUFnZW50cyIsImZpbmQiLCJhIiwiYWdlbnRUeXBlIiwicmVzdWx0IiwidXNlX3NwbGl0cGFuZSIsImludm9raW5nUmVxdWVzdElkIiwicmVxdWVzdElkIiwic3Bhd25SZXN1bHQiLCJjb25zdCIsImRhdGEiLCJlZmZlY3RpdmVUeXBlIiwiaXNGb3JrUGF0aCIsInNlbGVjdGVkQWdlbnQiLCJxdWVyeVNvdXJjZSIsIm1lc3NhZ2VzIiwiYWxsQWdlbnRzIiwiZmlsdGVyIiwiZm91bmQiLCJhZ2VudCIsImFnZW50RXhpc3RzQnV0RGVuaWVkIiwiZGVueVJ1bGUiLCJzb3VyY2UiLCJtYXAiLCJqb2luIiwiYmFja2dyb3VuZCIsInJlcXVpcmVkTWNwU2VydmVycyIsImxlbmd0aCIsImhhc1BlbmRpbmdSZXF1aXJlZFNlcnZlcnMiLCJtY3AiLCJjbGllbnRzIiwic29tZSIsImMiLCJ0eXBlIiwicGF0dGVybiIsInRvTG93ZXJDYXNlIiwiY3VycmVudEFwcFN0YXRlIiwiTUFYX1dBSVRfTVMiLCJQT0xMX0lOVEVSVkFMX01TIiwiZGVhZGxpbmUiLCJoYXNGYWlsZWRSZXF1aXJlZFNlcnZlciIsInN0aWxsUGVuZGluZyIsInNlcnZlcnNXaXRoVG9vbHMiLCJtaXNzaW5nIiwic2VydmVyIiwicmVzb2x2ZWRBZ2VudE1vZGVsIiwibWFpbkxvb3BNb2RlbCIsImlzX2J1aWx0X2luX2FnZW50IiwiaXNfcmVzdW1lIiwiaXNfYXN5bmMiLCJpc19mb3JrIiwiZWZmZWN0aXZlSXNvbGF0aW9uIiwiZWxpZ2liaWxpdHkiLCJlbGlnaWJsZSIsInJlYXNvbnMiLCJlcnJvcnMiLCJidW5kbGVGYWlsSGludCIsInNlc3Npb24iLCJpbml0aWFsTWVzc2FnZSIsInNpZ25hbCIsImFib3J0Q29udHJvbGxlciIsIm9uQnVuZGxlRmFpbCIsIm1zZyIsInNlc3Npb25JZCIsInJlbW90ZVRhc2tUeXBlIiwiaWQiLCJ0aXRsZSIsImNvbW1hbmQiLCJjb250ZXh0IiwidG9vbFVzZUlkIiwicmVtb3RlUmVzdWx0IiwiZW5oYW5jZWRTeXN0ZW1Qcm9tcHQiLCJmb3JrUGFyZW50U3lzdGVtUHJvbXB0IiwicHJvbXB0TWVzc2FnZXMiLCJyZW5kZXJlZFN5c3RlbVByb21wdCIsIm1haW5UaHJlYWRBZ2VudERlZmluaXRpb24iLCJhZGRpdGlvbmFsV29ya2luZ0RpcmVjdG9yaWVzIiwiQXJyYXkiLCJmcm9tIiwia2V5cyIsImRlZmF1bHRTeXN0ZW1Qcm9tcHQiLCJtY3BDbGllbnRzIiwiY3VzdG9tU3lzdGVtUHJvbXB0IiwiYXBwZW5kU3lzdGVtUHJvbXB0IiwiYWdlbnRQcm9tcHQiLCJtZW1vcnkiLCJzY29wZSIsImVycm9yIiwiY29udGVudCIsIm1ldGFkYXRhIiwiaXNBc3luYyIsImZvcmNlQXN5bmMiLCJhc3Npc3RhbnRGb3JjZUFzeW5jIiwia2Fpcm9zRW5hYmxlZCIsInNob3VsZFJ1bkFzeW5jIiwiaXNQcm9hY3RpdmVBY3RpdmUiLCJ3b3JrZXJQZXJtaXNzaW9uQ29udGV4dCIsIndvcmtlclRvb2xzIiwiZWFybHlBZ2VudElkIiwid29ya3RyZWVJbmZvIiwid29ya3RyZWVQYXRoIiwid29ya3RyZWVCcmFuY2giLCJoZWFkQ29tbWl0IiwiZ2l0Um9vdCIsImhvb2tCYXNlZCIsInNsdWciLCJzbGljZSIsInJ1bkFnZW50UGFyYW1zIiwiUGFyYW1ldGVycyIsImFnZW50RGVmaW5pdGlvbiIsIm92ZXJyaWRlIiwic3lzdGVtUHJvbXB0IiwiYXZhaWxhYmxlVG9vbHMiLCJmb3JrQ29udGV4dE1lc3NhZ2VzIiwidXNlRXhhY3RUb29scyIsImN3ZE92ZXJyaWRlUGF0aCIsIndyYXBXaXRoQ3dkIiwiZm4iLCJUIiwiY2xlYW51cFdvcmt0cmVlSWZOZWVkZWQiLCJQcm9taXNlIiwiY2hhbmdlZCIsImNhdGNoIiwiX2VyciIsImFzeW5jQWdlbnRJZCIsImFnZW50QmFja2dyb3VuZFRhc2siLCJwcmV2IiwibmV4dCIsIk1hcCIsImFnZW50TmFtZVJlZ2lzdHJ5Iiwic2V0IiwiYXN5bmNBZ2VudENvbnRleHQiLCJwYXJlbnRTZXNzaW9uSWQiLCJzdWJhZ2VudE5hbWUiLCJpc0J1aWx0SW4iLCJpbnZvY2F0aW9uS2luZCIsImludm9jYXRpb25FbWl0dGVkIiwibWFrZVN0cmVhbSIsIm9uQ2FjaGVTYWZlUGFyYW1zIiwiYWdlbnRJZEZvckNsZWFudXAiLCJlbmFibGVTdW1tYXJpemF0aW9uIiwiZ2V0V29ya3RyZWVSZXN1bHQiLCJ0Iiwic3luY0FnZW50SWQiLCJzeW5jQWdlbnRDb250ZXh0IiwiYWdlbnRNZXNzYWdlcyIsImFnZW50U3RhcnRUaW1lIiwic3luY1RyYWNrZXIiLCJzeW5jUmVzb2x2ZUFjdGl2aXR5Iiwibm9ybWFsaXplZFByb21wdE1lc3NhZ2VzIiwibm9ybWFsaXplZEZpcnN0TWVzc2FnZSIsIm0iLCJ0b29sVXNlSUQiLCJtZXNzYWdlIiwiZm9yZWdyb3VuZFRhc2tJZCIsImJhY2tncm91bmRQcm9taXNlIiwiY2FuY2VsQXV0b0JhY2tncm91bmQiLCJyZWdpc3RyYXRpb24iLCJhdXRvQmFja2dyb3VuZE1zIiwiYmFja2dyb3VuZFNpZ25hbCIsInRoZW4iLCJiYWNrZ3JvdW5kSGludFNob3duIiwid2FzQmFja2dyb3VuZGVkIiwic3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uIiwic3VtbWFyeVRhc2tJZCIsImFnZW50SXRlcmF0b3IiLCJwYXJhbXMiLCJzdG9wIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInN5bmNBZ2VudEVycm9yIiwid2FzQWJvcnRlZCIsIndvcmt0cmVlUmVzdWx0IiwiZWxhcHNlZCIsInNldFRvb2xKU1giLCJqc3giLCJzaG91bGRIaWRlUHJvbXB0SW5wdXQiLCJzaG91bGRDb250aW51ZUFuaW1hdGlvbiIsInNob3dTcGlubmVyIiwibmV4dE1lc3NhZ2VQcm9taXNlIiwicmFjZVJlc3VsdCIsInJhY2UiLCJyIiwidGFzayIsInRhc2tzIiwiaXNCYWNrZ3JvdW5kZWQiLCJiYWNrZ3JvdW5kZWRUYXNrSWQiLCJzdG9wQmFja2dyb3VuZGVkU3VtbWFyaXphdGlvbiIsInJldHVybiIsInRyYWNrZXIiLCJyZXNvbHZlQWN0aXZpdHkyIiwiZXhpc3RpbmdNc2ciLCJsYXN0VG9vbE5hbWUiLCJhZ2VudFJlc3VsdCIsImZpbmFsTWVzc2FnZSIsImJhY2tncm91bmRlZEFwcFN0YXRlIiwiaGFuZG9mZldhcm5pbmciLCJhYm9ydFNpZ25hbCIsInN1YmFnZW50VHlwZSIsInRvdGFsVG9vbFVzZUNvdW50IiwidXNhZ2UiLCJ0b3RhbFRva2VucyIsInRvb2xVc2VzIiwiZHVyYXRpb25NcyIsInRvdGFsRHVyYXRpb25NcyIsImR1cmF0aW9uX21zIiwicmVhc29uIiwicGFydGlhbFJlc3VsdCIsImVyck1zZyIsImRvbmUiLCJ2YWx1ZSIsImNvbnRlbnRMZW5ndGgiLCJzZXRSZXNwb25zZUxlbmd0aCIsImxlbiIsIm5vcm1hbGl6ZWROZXciLCJsZXZlbCIsInByb2dyZXNzIiwic3VidHlwZSIsInRhc2tfaWQiLCJ0b29sX3VzZV9pZCIsIm91dHB1dF9maWxlIiwic3VtbWFyeSIsInRvdGFsX3Rva2VucyIsInRva2VuQ291bnQiLCJ0b29sX3VzZXMiLCJ0b29sVXNlQ291bnQiLCJsYXN0TWVzc2FnZSIsImZpbmRMYXN0IiwiXyIsImhhc0Fzc2lzdGFudE1lc3NhZ2VzIiwidGV4dCIsImlzUmVhZE9ubHkiLCJ0b0F1dG9DbGFzc2lmaWVySW5wdXQiLCJpIiwidGFncyIsInByZWZpeCIsImlzQ29uY3VycmVuY3lTYWZlIiwiZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbiIsImNoZWNrUGVybWlzc2lvbnMiLCJiZWhhdmlvciIsInVwZGF0ZWRJbnB1dCIsIm1hcFRvb2xSZXN1bHRUb1Rvb2xSZXN1bHRCbG9ja1BhcmFtIiwiaW50ZXJuYWxEYXRhIiwic3Bhd25EYXRhIiwiaW5zdHJ1Y3Rpb25zIiwid29ya3RyZWVEYXRhIiwiUmVjb3JkIiwid29ya3RyZWVJbmZvVGV4dCIsImNvbnRlbnRPck1hcmtlciIsImhhcyIsInJlbmRlckdyb3VwZWRUb29sVXNlIiwidGVhbUNvbnRleHQiXSwic291cmNlcyI6WyJBZ2VudFRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZlYXR1cmUgfSBmcm9tICdidW46YnVuZGxlJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBidWlsZFRvb2wsIHR5cGUgVG9vbERlZiwgdG9vbE1hdGNoZXNOYW1lIH0gZnJvbSAnc3JjL1Rvb2wuanMnXG5pbXBvcnQgdHlwZSB7XG4gIE1lc3NhZ2UgYXMgTWVzc2FnZVR5cGUsXG4gIE5vcm1hbGl6ZWRVc2VyTWVzc2FnZSxcbn0gZnJvbSAnc3JjL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQgeyBnZXRRdWVyeVNvdXJjZUZvckFnZW50IH0gZnJvbSAnc3JjL3V0aWxzL3Byb21wdENhdGVnb3J5LmpzJ1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZC92NCdcbmltcG9ydCB7XG4gIGNsZWFySW52b2tlZFNraWxsc0ZvckFnZW50LFxuICBnZXRTZGtBZ2VudFByb2dyZXNzU3VtbWFyaWVzRW5hYmxlZCxcbn0gZnJvbSAnLi4vLi4vYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHtcbiAgZW5oYW5jZVN5c3RlbVByb21wdFdpdGhFbnZEZXRhaWxzLFxuICBnZXRTeXN0ZW1Qcm9tcHQsXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cy9wcm9tcHRzLmpzJ1xuaW1wb3J0IHsgaXNDb29yZGluYXRvck1vZGUgfSBmcm9tICcuLi8uLi9jb29yZGluYXRvci9jb29yZGluYXRvck1vZGUuanMnXG5pbXBvcnQgeyBzdGFydEFnZW50U3VtbWFyaXphdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0FnZW50U3VtbWFyeS9hZ2VudFN1bW1hcnkuanMnXG5pbXBvcnQgeyBnZXRGZWF0dXJlVmFsdWVfQ0FDSEVEX01BWV9CRV9TVEFMRSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9ncm93dGhib29rLmpzJ1xuaW1wb3J0IHtcbiAgdHlwZSBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICBsb2dFdmVudCxcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzL2luZGV4LmpzJ1xuaW1wb3J0IHsgY2xlYXJEdW1wU3RhdGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGkvZHVtcFByb21wdHMuanMnXG5pbXBvcnQge1xuICBjb21wbGV0ZUFnZW50VGFzayBhcyBjb21wbGV0ZUFzeW5jQWdlbnQsXG4gIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25SZXNvbHZlcixcbiAgY3JlYXRlUHJvZ3Jlc3NUcmFja2VyLFxuICBlbnF1ZXVlQWdlbnROb3RpZmljYXRpb24sXG4gIGZhaWxBZ2VudFRhc2sgYXMgZmFpbEFzeW5jQWdlbnQsXG4gIGdldFByb2dyZXNzVXBkYXRlLFxuICBnZXRUb2tlbkNvdW50RnJvbVRyYWNrZXIsXG4gIGlzTG9jYWxBZ2VudFRhc2ssXG4gIGtpbGxBc3luY0FnZW50LFxuICByZWdpc3RlckFnZW50Rm9yZWdyb3VuZCxcbiAgcmVnaXN0ZXJBc3luY0FnZW50LFxuICB1bnJlZ2lzdGVyQWdlbnRGb3JlZ3JvdW5kLFxuICB1cGRhdGVBZ2VudFByb2dyZXNzIGFzIHVwZGF0ZUFzeW5jQWdlbnRQcm9ncmVzcyxcbiAgdXBkYXRlUHJvZ3Jlc3NGcm9tTWVzc2FnZSxcbn0gZnJvbSAnLi4vLi4vdGFza3MvTG9jYWxBZ2VudFRhc2svTG9jYWxBZ2VudFRhc2suanMnXG5pbXBvcnQge1xuICBjaGVja1JlbW90ZUFnZW50RWxpZ2liaWxpdHksXG4gIGZvcm1hdFByZWNvbmRpdGlvbkVycm9yLFxuICBnZXRSZW1vdGVUYXNrU2Vzc2lvblVybCxcbiAgcmVnaXN0ZXJSZW1vdGVBZ2VudFRhc2ssXG59IGZyb20gJy4uLy4uL3Rhc2tzL1JlbW90ZUFnZW50VGFzay9SZW1vdGVBZ2VudFRhc2suanMnXG5pbXBvcnQgeyBhc3NlbWJsZVRvb2xQb29sIH0gZnJvbSAnLi4vLi4vdG9vbHMuanMnXG5pbXBvcnQgeyBhc0FnZW50SWQgfSBmcm9tICcuLi8uLi90eXBlcy9pZHMuanMnXG5pbXBvcnQgeyBydW5XaXRoQWdlbnRDb250ZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvYWdlbnRDb250ZXh0LmpzJ1xuaW1wb3J0IHsgaXNBZ2VudFN3YXJtc0VuYWJsZWQgfSBmcm9tICcuLi8uLi91dGlscy9hZ2VudFN3YXJtc0VuYWJsZWQuanMnXG5pbXBvcnQgeyBnZXRDd2QsIHJ1bldpdGhDd2RPdmVycmlkZSB9IGZyb20gJy4uLy4uL3V0aWxzL2N3ZC5qcydcbmltcG9ydCB7IGxvZ0ZvckRlYnVnZ2luZyB9IGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnLmpzJ1xuaW1wb3J0IHsgaXNFbnZUcnV0aHkgfSBmcm9tICcuLi8uLi91dGlscy9lbnZVdGlscy5qcydcbmltcG9ydCB7IEFib3J0RXJyb3IsIGVycm9yTWVzc2FnZSwgdG9FcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL2Vycm9ycy5qcydcbmltcG9ydCB0eXBlIHsgQ2FjaGVTYWZlUGFyYW1zIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ya2VkQWdlbnQuanMnXG5pbXBvcnQgeyBsYXp5U2NoZW1hIH0gZnJvbSAnLi4vLi4vdXRpbHMvbGF6eVNjaGVtYS5qcydcbmltcG9ydCB7XG4gIGNyZWF0ZVVzZXJNZXNzYWdlLFxuICBleHRyYWN0VGV4dENvbnRlbnQsXG4gIGlzU3ludGhldGljTWVzc2FnZSxcbiAgbm9ybWFsaXplTWVzc2FnZXMsXG59IGZyb20gJy4uLy4uL3V0aWxzL21lc3NhZ2VzLmpzJ1xuaW1wb3J0IHsgZ2V0QWdlbnRNb2RlbCB9IGZyb20gJy4uLy4uL3V0aWxzL21vZGVsL2FnZW50LmpzJ1xuaW1wb3J0IHsgcGVybWlzc2lvbk1vZGVTY2hlbWEgfSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uTW9kZS5qcydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvblJlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25SZXN1bHQuanMnXG5pbXBvcnQge1xuICBmaWx0ZXJEZW5pZWRBZ2VudHMsXG4gIGdldERlbnlSdWxlRm9yQWdlbnQsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLmpzJ1xuaW1wb3J0IHsgZW5xdWV1ZVNka0V2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvc2RrRXZlbnRRdWV1ZS5qcydcbmltcG9ydCB7IHdyaXRlQWdlbnRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL3V0aWxzL3Nlc3Npb25TdG9yYWdlLmpzJ1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi8uLi91dGlscy9zbGVlcC5qcydcbmltcG9ydCB7IGJ1aWxkRWZmZWN0aXZlU3lzdGVtUHJvbXB0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3lzdGVtUHJvbXB0LmpzJ1xuaW1wb3J0IHsgYXNTeXN0ZW1Qcm9tcHQgfSBmcm9tICcuLi8uLi91dGlscy9zeXN0ZW1Qcm9tcHRUeXBlLmpzJ1xuaW1wb3J0IHsgZ2V0VGFza091dHB1dFBhdGggfSBmcm9tICcuLi8uLi91dGlscy90YXNrL2Rpc2tPdXRwdXQuanMnXG5pbXBvcnQgeyBnZXRQYXJlbnRTZXNzaW9uSWQsIGlzVGVhbW1hdGUgfSBmcm9tICcuLi8uLi91dGlscy90ZWFtbWF0ZS5qcydcbmltcG9ydCB7IGlzSW5Qcm9jZXNzVGVhbW1hdGUgfSBmcm9tICcuLi8uLi91dGlscy90ZWFtbWF0ZUNvbnRleHQuanMnXG5pbXBvcnQgeyB0ZWxlcG9ydFRvUmVtb3RlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGVsZXBvcnQuanMnXG5pbXBvcnQgeyBnZXRBc3Npc3RhbnRNZXNzYWdlQ29udGVudExlbmd0aCB9IGZyb20gJy4uLy4uL3V0aWxzL3Rva2Vucy5qcydcbmltcG9ydCB7IGNyZWF0ZUFnZW50SWQgfSBmcm9tICcuLi8uLi91dGlscy91dWlkLmpzJ1xuaW1wb3J0IHtcbiAgY3JlYXRlQWdlbnRXb3JrdHJlZSxcbiAgaGFzV29ya3RyZWVDaGFuZ2VzLFxuICByZW1vdmVBZ2VudFdvcmt0cmVlLFxufSBmcm9tICcuLi8uLi91dGlscy93b3JrdHJlZS5qcydcbmltcG9ydCB7IEJBU0hfVE9PTF9OQU1FIH0gZnJvbSAnLi4vQmFzaFRvb2wvdG9vbE5hbWUuanMnXG5pbXBvcnQgeyBCYWNrZ3JvdW5kSGludCB9IGZyb20gJy4uL0Jhc2hUb29sL1VJLmpzJ1xuaW1wb3J0IHsgRklMRV9SRUFEX1RPT0xfTkFNRSB9IGZyb20gJy4uL0ZpbGVSZWFkVG9vbC9wcm9tcHQuanMnXG5pbXBvcnQgeyBzcGF3blRlYW1tYXRlIH0gZnJvbSAnLi4vc2hhcmVkL3NwYXduTXVsdGlBZ2VudC5qcydcbmltcG9ydCB7IHNldEFnZW50Q29sb3IgfSBmcm9tICcuL2FnZW50Q29sb3JNYW5hZ2VyLmpzJ1xuaW1wb3J0IHtcbiAgYWdlbnRUb29sUmVzdWx0U2NoZW1hLFxuICBjbGFzc2lmeUhhbmRvZmZJZk5lZWRlZCxcbiAgZW1pdFRhc2tQcm9ncmVzcyxcbiAgZXh0cmFjdFBhcnRpYWxSZXN1bHQsXG4gIGZpbmFsaXplQWdlbnRUb29sLFxuICBnZXRMYXN0VG9vbFVzZU5hbWUsXG4gIHJ1bkFzeW5jQWdlbnRMaWZlY3ljbGUsXG59IGZyb20gJy4vYWdlbnRUb29sVXRpbHMuanMnXG5pbXBvcnQgeyBHRU5FUkFMX1BVUlBPU0VfQUdFTlQgfSBmcm9tICcuL2J1aWx0LWluL2dlbmVyYWxQdXJwb3NlQWdlbnQuanMnXG5pbXBvcnQge1xuICBBR0VOVF9UT09MX05BTUUsXG4gIExFR0FDWV9BR0VOVF9UT09MX05BTUUsXG4gIE9ORV9TSE9UX0JVSUxUSU5fQUdFTlRfVFlQRVMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHtcbiAgYnVpbGRGb3JrZWRNZXNzYWdlcyxcbiAgYnVpbGRXb3JrdHJlZU5vdGljZSxcbiAgRk9SS19BR0VOVCxcbiAgaXNGb3JrU3ViYWdlbnRFbmFibGVkLFxuICBpc0luRm9ya0NoaWxkLFxufSBmcm9tICcuL2ZvcmtTdWJhZ2VudC5qcydcbmltcG9ydCB0eXBlIHsgQWdlbnREZWZpbml0aW9uIH0gZnJvbSAnLi9sb2FkQWdlbnRzRGlyLmpzJ1xuaW1wb3J0IHtcbiAgZmlsdGVyQWdlbnRzQnlNY3BSZXF1aXJlbWVudHMsXG4gIGhhc1JlcXVpcmVkTWNwU2VydmVycyxcbiAgaXNCdWlsdEluQWdlbnQsXG59IGZyb20gJy4vbG9hZEFnZW50c0Rpci5qcydcbmltcG9ydCB7IGdldFByb21wdCB9IGZyb20gJy4vcHJvbXB0LmpzJ1xuaW1wb3J0IHsgcnVuQWdlbnQgfSBmcm9tICcuL3J1bkFnZW50LmpzJ1xuaW1wb3J0IHtcbiAgcmVuZGVyR3JvdXBlZEFnZW50VG9vbFVzZSxcbiAgcmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlUmVqZWN0ZWRNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlVGFnLFxuICB1c2VyRmFjaW5nTmFtZSxcbiAgdXNlckZhY2luZ05hbWVCYWNrZ3JvdW5kQ29sb3IsXG59IGZyb20gJy4vVUkuanMnXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmNvbnN0IHByb2FjdGl2ZU1vZHVsZSA9XG4gIGZlYXR1cmUoJ1BST0FDVElWRScpIHx8IGZlYXR1cmUoJ0tBSVJPUycpXG4gICAgPyAocmVxdWlyZSgnLi4vLi4vcHJvYWN0aXZlL2luZGV4LmpzJykgYXMgdHlwZW9mIGltcG9ydCgnLi4vLi4vcHJvYWN0aXZlL2luZGV4LmpzJykpXG4gICAgOiBudWxsXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cblxuLy8gUHJvZ3Jlc3MgZGlzcGxheSBjb25zdGFudHMgKGZvciBzaG93aW5nIGJhY2tncm91bmQgaGludClcbmNvbnN0IFBST0dSRVNTX1RIUkVTSE9MRF9NUyA9IDIwMDAgLy8gU2hvdyBiYWNrZ3JvdW5kIGhpbnQgYWZ0ZXIgMiBzZWNvbmRzXG5cbi8vIENoZWNrIGlmIGJhY2tncm91bmQgdGFza3MgYXJlIGRpc2FibGVkIGF0IG1vZHVsZSBsb2FkIHRpbWVcbmNvbnN0IGlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY3VzdG9tLXJ1bGVzL25vLXByb2Nlc3MtZW52LXRvcC1sZXZlbCAtLSBJbnRlbnRpb25hbDogc2NoZW1hIG11c3QgYmUgZGVmaW5lZCBhdCBtb2R1bGUgbG9hZFxuICBpc0VudlRydXRoeShwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9ESVNBQkxFX0JBQ0tHUk9VTkRfVEFTS1MpXG5cbi8vIEF1dG8tYmFja2dyb3VuZCBhZ2VudCB0YXNrcyBhZnRlciB0aGlzIG1hbnkgbXMgKDAgPSBkaXNhYmxlZClcbi8vIEVuYWJsZWQgYnkgZW52IHZhciBPUiBHcm93dGhCb29rIGdhdGUgKGNoZWNrZWQgbGF6aWx5IHNpbmNlIEdCIG1heSBub3QgYmUgcmVhZHkgYXQgbW9kdWxlIGxvYWQpXG5mdW5jdGlvbiBnZXRBdXRvQmFja2dyb3VuZE1zKCk6IG51bWJlciB7XG4gIGlmIChcbiAgICBpc0VudlRydXRoeShwcm9jZXNzLmVudi5DTEFVREVfQVVUT19CQUNLR1JPVU5EX1RBU0tTKSB8fFxuICAgIGdldEZlYXR1cmVWYWx1ZV9DQUNIRURfTUFZX0JFX1NUQUxFKCd0ZW5ndV9hdXRvX2JhY2tncm91bmRfYWdlbnRzJywgZmFsc2UpXG4gICkge1xuICAgIHJldHVybiAxMjBfMDAwXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuLy8gTXVsdGktYWdlbnQgdHlwZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW5saW5lIGluc2lkZSBnYXRlZCBibG9ja3MgdG8gZW5hYmxlIGRlYWQgY29kZSBlbGltaW5hdGlvblxuXG4vLyBCYXNlIGlucHV0IHNjaGVtYSB3aXRob3V0IG11bHRpLWFnZW50IHBhcmFtZXRlcnNcbmNvbnN0IGJhc2VJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGRlc2NyaXB0aW9uOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5kZXNjcmliZSgnQSBzaG9ydCAoMy01IHdvcmQpIGRlc2NyaXB0aW9uIG9mIHRoZSB0YXNrJyksXG4gICAgcHJvbXB0OiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgdGFzayBmb3IgdGhlIGFnZW50IHRvIHBlcmZvcm0nKSxcbiAgICBzdWJhZ2VudF90eXBlOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoJ1RoZSB0eXBlIG9mIHNwZWNpYWxpemVkIGFnZW50IHRvIHVzZSBmb3IgdGhpcyB0YXNrJyksXG4gICAgbW9kZWw6IHpcbiAgICAgIC5lbnVtKFsnc29ubmV0JywgJ29wdXMnLCAnaGFpa3UnXSlcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIFwiT3B0aW9uYWwgbW9kZWwgb3ZlcnJpZGUgZm9yIHRoaXMgYWdlbnQuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgYWdlbnQgZGVmaW5pdGlvbidzIG1vZGVsIGZyb250bWF0dGVyLiBJZiBvbWl0dGVkLCB1c2VzIHRoZSBhZ2VudCBkZWZpbml0aW9uJ3MgbW9kZWwsIG9yIGluaGVyaXRzIGZyb20gdGhlIHBhcmVudC5cIixcbiAgICAgICksXG4gICAgcnVuX2luX2JhY2tncm91bmQ6IHpcbiAgICAgIC5ib29sZWFuKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdTZXQgdG8gdHJ1ZSB0byBydW4gdGhpcyBhZ2VudCBpbiB0aGUgYmFja2dyb3VuZC4gWW91IHdpbGwgYmUgbm90aWZpZWQgd2hlbiBpdCBjb21wbGV0ZXMuJyxcbiAgICAgICksXG4gIH0pLFxuKVxuXG4vLyBGdWxsIHNjaGVtYSBjb21iaW5pbmcgYmFzZSArIG11bHRpLWFnZW50IHBhcmFtcyArIGlzb2xhdGlvblxuY29uc3QgZnVsbElucHV0U2NoZW1hID0gbGF6eVNjaGVtYSgoKSA9PiB7XG4gIC8vIE11bHRpLWFnZW50IHBhcmFtZXRlcnNcbiAgY29uc3QgbXVsdGlBZ2VudElucHV0U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ05hbWUgZm9yIHRoZSBzcGF3bmVkIGFnZW50LiBNYWtlcyBpdCBhZGRyZXNzYWJsZSB2aWEgU2VuZE1lc3NhZ2Uoe3RvOiBuYW1lfSkgd2hpbGUgcnVubmluZy4nLFxuICAgICAgKSxcbiAgICB0ZWFtX25hbWU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RlYW0gbmFtZSBmb3Igc3Bhd25pbmcuIFVzZXMgY3VycmVudCB0ZWFtIGNvbnRleHQgaWYgb21pdHRlZC4nLFxuICAgICAgKSxcbiAgICBtb2RlOiBwZXJtaXNzaW9uTW9kZVNjaGVtYSgpXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAnUGVybWlzc2lvbiBtb2RlIGZvciBzcGF3bmVkIHRlYW1tYXRlIChlLmcuLCBcInBsYW5cIiB0byByZXF1aXJlIHBsYW4gYXBwcm92YWwpLicsXG4gICAgICApLFxuICB9KVxuXG4gIHJldHVybiBiYXNlSW5wdXRTY2hlbWEoKVxuICAgIC5tZXJnZShtdWx0aUFnZW50SW5wdXRTY2hlbWEpXG4gICAgLmV4dGVuZCh7XG4gICAgICBpc29sYXRpb246IChcImV4dGVybmFsXCIgPT09ICdhbnQnXG4gICAgICAgID8gei5lbnVtKFsnd29ya3RyZWUnLCAncmVtb3RlJ10pXG4gICAgICAgIDogei5lbnVtKFsnd29ya3RyZWUnXSlcbiAgICAgIClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCdcbiAgICAgICAgICAgID8gJ0lzb2xhdGlvbiBtb2RlLiBcIndvcmt0cmVlXCIgY3JlYXRlcyBhIHRlbXBvcmFyeSBnaXQgd29ya3RyZWUgc28gdGhlIGFnZW50IHdvcmtzIG9uIGFuIGlzb2xhdGVkIGNvcHkgb2YgdGhlIHJlcG8uIFwicmVtb3RlXCIgbGF1bmNoZXMgdGhlIGFnZW50IGluIGEgcmVtb3RlIENDUiBlbnZpcm9ubWVudCAoYWx3YXlzIHJ1bnMgaW4gYmFja2dyb3VuZCkuJ1xuICAgICAgICAgICAgOiAnSXNvbGF0aW9uIG1vZGUuIFwid29ya3RyZWVcIiBjcmVhdGVzIGEgdGVtcG9yYXJ5IGdpdCB3b3JrdHJlZSBzbyB0aGUgYWdlbnQgd29ya3Mgb24gYW4gaXNvbGF0ZWQgY29weSBvZiB0aGUgcmVwby4nLFxuICAgICAgICApLFxuICAgICAgY3dkOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ0Fic29sdXRlIHBhdGggdG8gcnVuIHRoZSBhZ2VudCBpbi4gT3ZlcnJpZGVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgYWxsIGZpbGVzeXN0ZW0gYW5kIHNoZWxsIG9wZXJhdGlvbnMgd2l0aGluIHRoaXMgYWdlbnQuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGlzb2xhdGlvbjogXCJ3b3JrdHJlZVwiLicsXG4gICAgICAgICksXG4gICAgfSlcbn0pXG5cbi8vIFN0cmlwIG9wdGlvbmFsIGZpZWxkcyBmcm9tIHRoZSBzY2hlbWEgd2hlbiB0aGUgYmFja2luZyBmZWF0dXJlIGlzIG9mZiBzb1xuLy8gdGhlIG1vZGVsIG5ldmVyIHNlZXMgdGhlbS4gRG9uZSB2aWEgLm9taXQoKSByYXRoZXIgdGhhbiBjb25kaXRpb25hbCBzcHJlYWRcbi8vIGluc2lkZSAuZXh0ZW5kKCkgYmVjYXVzZSB0aGUgc3ByZWFkLXRlcm5hcnkgYnJlYWtzIFpvZCdzIHR5cGUgaW5mZXJlbmNlXG4vLyAoZmllbGQgdHlwZSBjb2xsYXBzZXMgdG8gYHVua25vd25gKS4gVGhlIHRlcm5hcnkgcmV0dXJuIHByb2R1Y2VzIGEgdW5pb25cbi8vIHR5cGUsIGJ1dCBjYWxsKCkgZGVzdHJ1Y3R1cmVzIHZpYSB0aGUgZXhwbGljaXQgQWdlbnRUb29sSW5wdXQgdHlwZSBiZWxvd1xuLy8gd2hpY2ggYWx3YXlzIGluY2x1ZGVzIGFsbCBvcHRpb25hbCBmaWVsZHMuXG5leHBvcnQgY29uc3QgaW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+IHtcbiAgY29uc3Qgc2NoZW1hID0gZmVhdHVyZSgnS0FJUk9TJylcbiAgICA/IGZ1bGxJbnB1dFNjaGVtYSgpXG4gICAgOiBmdWxsSW5wdXRTY2hlbWEoKS5vbWl0KHsgY3dkOiB0cnVlIH0pXG5cbiAgLy8gR3Jvd3RoQm9vay1pbi1sYXp5U2NoZW1hIGlzIGFjY2VwdGFibGUgaGVyZSAodW5saWtlIHN1YmFnZW50X3R5cGUsIHdoaWNoXG4gIC8vIHdhcyByZW1vdmVkIGluIDkwNmRhNmM3MjMpOiB0aGUgZGl2ZXJnZW5jZSB3aW5kb3cgaXMgb25lLXNlc3Npb24tcGVyLVxuICAvLyBnYXRlLWZsaXAgdmlhIF9DQUNIRURfTUFZX0JFX1NUQUxFIGRpc2sgcmVhZCwgYW5kIHdvcnN0IGNhc2UgaXMgZWl0aGVyXG4gIC8vIFwic2NoZW1hIHNob3dzIGEgbm8tb3AgcGFyYW1cIiAoZ2F0ZSBmbGlwcyBvbiBtaWQtc2Vzc2lvbjogcGFyYW0gaWdub3JlZFxuICAvLyBieSBmb3JjZUFzeW5jKSBvciBcInNjaGVtYSBoaWRlcyBhIHBhcmFtIHRoYXQgd291bGQndmUgd29ya2VkXCIgKGdhdGVcbiAgLy8gZmxpcHMgb2ZmIG1pZC1zZXNzaW9uOiBldmVyeXRoaW5nIHN0aWxsIHJ1bnMgYXN5bmMgdmlhIG1lbW9pemVkXG4gIC8vIGZvcmNlQXN5bmMpLiBObyBab2QgcmVqZWN0aW9uLCBubyBjcmFzaCDigJQgdW5saWtlIHJlcXVpcmVk4oaSb3B0aW9uYWwuXG4gIHJldHVybiBpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkIHx8IGlzRm9ya1N1YmFnZW50RW5hYmxlZCgpXG4gICAgPyBzY2hlbWEub21pdCh7IHJ1bl9pbl9iYWNrZ3JvdW5kOiB0cnVlIH0pXG4gICAgOiBzY2hlbWFcbn0pXG50eXBlIElucHV0U2NoZW1hID0gUmV0dXJuVHlwZTx0eXBlb2YgaW5wdXRTY2hlbWE+XG5cbi8vIEV4cGxpY2l0IHR5cGUgd2lkZW5zIHRoZSBzY2hlbWEgaW5mZXJlbmNlIHRvIGFsd2F5cyBpbmNsdWRlIGFsbCBvcHRpb25hbFxuLy8gZmllbGRzIGV2ZW4gd2hlbiAub21pdCgpIHN0cmlwcyB0aGVtIGZvciBnYXRpbmcgKGN3ZCwgcnVuX2luX2JhY2tncm91bmQpLlxuLy8gc3ViYWdlbnRfdHlwZSBpcyBvcHRpb25hbDsgY2FsbCgpIGRlZmF1bHRzIGl0IHRvIGdlbmVyYWwtcHVycG9zZSB3aGVuIHRoZVxuLy8gZm9yayBnYXRlIGlzIG9mZiwgb3Igcm91dGVzIHRvIHRoZSBmb3JrIHBhdGggd2hlbiB0aGUgZ2F0ZSBpcyBvbi5cbnR5cGUgQWdlbnRUb29sSW5wdXQgPSB6LmluZmVyPFJldHVyblR5cGU8dHlwZW9mIGJhc2VJbnB1dFNjaGVtYT4+ICYge1xuICBuYW1lPzogc3RyaW5nXG4gIHRlYW1fbmFtZT86IHN0cmluZ1xuICBtb2RlPzogei5pbmZlcjxSZXR1cm5UeXBlPHR5cGVvZiBwZXJtaXNzaW9uTW9kZVNjaGVtYT4+XG4gIGlzb2xhdGlvbj86ICd3b3JrdHJlZScgfCAncmVtb3RlJ1xuICBjd2Q/OiBzdHJpbmdcbn1cblxuLy8gT3V0cHV0IHNjaGVtYSAtIG11bHRpLWFnZW50IHNwYXduZWQgc2NoZW1hIGFkZGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUgd2hlbiBlbmFibGVkXG5leHBvcnQgY29uc3Qgb3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYSgoKSA9PiB7XG4gIGNvbnN0IHN5bmNPdXRwdXRTY2hlbWEgPSBhZ2VudFRvb2xSZXN1bHRTY2hlbWEoKS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKCdjb21wbGV0ZWQnKSxcbiAgICBwcm9tcHQ6IHouc3RyaW5nKCksXG4gIH0pXG5cbiAgY29uc3QgYXN5bmNPdXRwdXRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoJ2FzeW5jX2xhdW5jaGVkJyksXG4gICAgYWdlbnRJZDogei5zdHJpbmcoKS5kZXNjcmliZSgnVGhlIElEIG9mIHRoZSBhc3luYyBhZ2VudCcpLFxuICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2snKSxcbiAgICBwcm9tcHQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ1RoZSBwcm9tcHQgZm9yIHRoZSBhZ2VudCcpLFxuICAgIG91dHB1dEZpbGU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLmRlc2NyaWJlKCdQYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSBmb3IgY2hlY2tpbmcgYWdlbnQgcHJvZ3Jlc3MnKSxcbiAgICBjYW5SZWFkT3V0cHV0RmlsZTogelxuICAgICAgLmJvb2xlYW4oKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1doZXRoZXIgdGhlIGNhbGxpbmcgYWdlbnQgaGFzIFJlYWQvQmFzaCB0b29scyB0byBjaGVjayBwcm9ncmVzcycsXG4gICAgICApLFxuICB9KVxuXG4gIHJldHVybiB6LnVuaW9uKFtzeW5jT3V0cHV0U2NoZW1hLCBhc3luY091dHB1dFNjaGVtYV0pXG59KVxudHlwZSBPdXRwdXRTY2hlbWEgPSBSZXR1cm5UeXBlPHR5cGVvZiBvdXRwdXRTY2hlbWE+XG50eXBlIE91dHB1dCA9IHouaW5wdXQ8T3V0cHV0U2NoZW1hPlxuXG4vLyBQcml2YXRlIHR5cGUgZm9yIHRlYW1tYXRlIHNwYXduIHJlc3VsdHMgLSBleGNsdWRlZCBmcm9tIGV4cG9ydGVkIHNjaGVtYSBmb3IgZGVhZCBjb2RlIGVsaW1pbmF0aW9uXG4vLyBUaGUgJ3RlYW1tYXRlX3NwYXduZWQnIHN0YXR1cyBzdHJpbmcgaXMgb25seSBpbmNsdWRlZCB3aGVuIEVOQUJMRV9BR0VOVF9TV0FSTVMgaXMgdHJ1ZVxudHlwZSBUZWFtbWF0ZVNwYXduZWRPdXRwdXQgPSB7XG4gIHN0YXR1czogJ3RlYW1tYXRlX3NwYXduZWQnXG4gIHByb21wdDogc3RyaW5nXG4gIHRlYW1tYXRlX2lkOiBzdHJpbmdcbiAgYWdlbnRfaWQ6IHN0cmluZ1xuICBhZ2VudF90eXBlPzogc3RyaW5nXG4gIG1vZGVsPzogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjb2xvcj86IHN0cmluZ1xuICB0bXV4X3Nlc3Npb25fbmFtZTogc3RyaW5nXG4gIHRtdXhfd2luZG93X25hbWU6IHN0cmluZ1xuICB0bXV4X3BhbmVfaWQ6IHN0cmluZ1xuICB0ZWFtX25hbWU/OiBzdHJpbmdcbiAgaXNfc3BsaXRwYW5lPzogYm9vbGVhblxuICBwbGFuX21vZGVfcmVxdWlyZWQ/OiBib29sZWFuXG59XG5cbi8vIENvbWJpbmVkIG91dHB1dCB0eXBlIGluY2x1ZGluZyBib3RoIHB1YmxpYyBhbmQgaW50ZXJuYWwgdHlwZXNcbi8vIE5vdGU6IFRlYW1tYXRlU3Bhd25lZE91dHB1dCB0eXBlIGlzIGZpbmUgLSBUeXBlU2NyaXB0IHR5cGVzIGFyZSBlcmFzZWQgYXQgY29tcGlsZSB0aW1lXG4vLyBQcml2YXRlIHR5cGUgZm9yIHJlbW90ZS1sYXVuY2hlZCByZXN1bHRzIOKAlCBleGNsdWRlZCBmcm9tIGV4cG9ydGVkIHNjaGVtYVxuLy8gbGlrZSBUZWFtbWF0ZVNwYXduZWRPdXRwdXQgZm9yIGRlYWQgY29kZSBlbGltaW5hdGlvbiBwdXJwb3Nlcy4gRXhwb3J0ZWRcbi8vIGZvciBVSS50c3ggdG8gZG8gcHJvcGVyIGRpc2NyaW1pbmF0ZWQtdW5pb24gbmFycm93aW5nIGluc3RlYWQgb2YgYWQtaG9jIGNhc3RzLlxuZXhwb3J0IHR5cGUgUmVtb3RlTGF1bmNoZWRPdXRwdXQgPSB7XG4gIHN0YXR1czogJ3JlbW90ZV9sYXVuY2hlZCdcbiAgdGFza0lkOiBzdHJpbmdcbiAgc2Vzc2lvblVybDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgcHJvbXB0OiBzdHJpbmdcbiAgb3V0cHV0RmlsZTogc3RyaW5nXG59XG5cbnR5cGUgSW50ZXJuYWxPdXRwdXQgPSBPdXRwdXQgfCBUZWFtbWF0ZVNwYXduZWRPdXRwdXQgfCBSZW1vdGVMYXVuY2hlZE91dHB1dFxuXG5pbXBvcnQgdHlwZSB7IEFnZW50VG9vbFByb2dyZXNzLCBTaGVsbFByb2dyZXNzIH0gZnJvbSAnLi4vLi4vdHlwZXMvdG9vbHMuanMnXG4vLyBBZ2VudFRvb2wgZm9yd2FyZHMgYm90aCBpdHMgb3duIHByb2dyZXNzIGV2ZW50cyBhbmQgc2hlbGwgcHJvZ3Jlc3Ncbi8vIGV2ZW50cyBmcm9tIHRoZSBzdWItYWdlbnQgc28gdGhlIFNESyByZWNlaXZlcyB0b29sX3Byb2dyZXNzIHVwZGF0ZXMgZHVyaW5nIGJhc2gvcG93ZXJzaGVsbCBydW5zLlxuZXhwb3J0IHR5cGUgUHJvZ3Jlc3MgPSBBZ2VudFRvb2xQcm9ncmVzcyB8IFNoZWxsUHJvZ3Jlc3NcblxuZXhwb3J0IGNvbnN0IEFnZW50VG9vbCA9IGJ1aWxkVG9vbCh7XG4gIGFzeW5jIHByb21wdCh7IGFnZW50cywgdG9vbHMsIGdldFRvb2xQZXJtaXNzaW9uQ29udGV4dCwgYWxsb3dlZEFnZW50VHlwZXMgfSkge1xuICAgIGNvbnN0IHRvb2xQZXJtaXNzaW9uQ29udGV4dCA9IGF3YWl0IGdldFRvb2xQZXJtaXNzaW9uQ29udGV4dCgpXG5cbiAgICAvLyBHZXQgTUNQIHNlcnZlcnMgdGhhdCBoYXZlIHRvb2xzIGF2YWlsYWJsZVxuICAgIGNvbnN0IG1jcFNlcnZlcnNXaXRoVG9vbHM6IHN0cmluZ1tdID0gW11cbiAgICBmb3IgKGNvbnN0IHRvb2wgb2YgdG9vbHMpIHtcbiAgICAgIGlmICh0b29sLm5hbWU/LnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB0b29sLm5hbWUuc3BsaXQoJ19fJylcbiAgICAgICAgY29uc3Qgc2VydmVyTmFtZSA9IHBhcnRzWzFdXG4gICAgICAgIGlmIChzZXJ2ZXJOYW1lICYmICFtY3BTZXJ2ZXJzV2l0aFRvb2xzLmluY2x1ZGVzKHNlcnZlck5hbWUpKSB7XG4gICAgICAgICAgbWNwU2VydmVyc1dpdGhUb29scy5wdXNoKHNlcnZlck5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYWdlbnRzOiBmaXJzdCBieSBNQ1AgcmVxdWlyZW1lbnRzLCB0aGVuIGJ5IHBlcm1pc3Npb24gcnVsZXNcbiAgICBjb25zdCBhZ2VudHNXaXRoTWNwUmVxdWlyZW1lbnRzTWV0ID0gZmlsdGVyQWdlbnRzQnlNY3BSZXF1aXJlbWVudHMoXG4gICAgICBhZ2VudHMsXG4gICAgICBtY3BTZXJ2ZXJzV2l0aFRvb2xzLFxuICAgIClcbiAgICBjb25zdCBmaWx0ZXJlZEFnZW50cyA9IGZpbHRlckRlbmllZEFnZW50cyhcbiAgICAgIGFnZW50c1dpdGhNY3BSZXF1aXJlbWVudHNNZXQsXG4gICAgICB0b29sUGVybWlzc2lvbkNvbnRleHQsXG4gICAgICBBR0VOVF9UT09MX05BTUUsXG4gICAgKVxuXG4gICAgLy8gVXNlIGlubGluZSBlbnYgY2hlY2sgaW5zdGVhZCBvZiBjb29yZGluYXRvck1vZHVsZSB0byBhdm9pZCBjaXJjdWxhclxuICAgIC8vIGRlcGVuZGVuY3kgaXNzdWVzIGR1cmluZyB0ZXN0IG1vZHVsZSBsb2FkaW5nLlxuICAgIGNvbnN0IGlzQ29vcmRpbmF0b3IgPSBmZWF0dXJlKCdDT09SRElOQVRPUl9NT0RFJylcbiAgICAgID8gaXNFbnZUcnV0aHkocHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfQ09PUkRJTkFUT1JfTU9ERSlcbiAgICAgIDogZmFsc2VcbiAgICByZXR1cm4gYXdhaXQgZ2V0UHJvbXB0KGZpbHRlcmVkQWdlbnRzLCBpc0Nvb3JkaW5hdG9yLCBhbGxvd2VkQWdlbnRUeXBlcylcbiAgfSxcbiAgbmFtZTogQUdFTlRfVE9PTF9OQU1FLFxuICBzZWFyY2hIaW50OiAnZGVsZWdhdGUgd29yayB0byBhIHN1YmFnZW50JyxcbiAgYWxpYXNlczogW0xFR0FDWV9BR0VOVF9UT09MX05BTUVdLFxuICBtYXhSZXN1bHRTaXplQ2hhcnM6IDEwMF8wMDAsXG4gIGFzeW5jIGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiAnTGF1bmNoIGEgbmV3IGFnZW50J1xuICB9LFxuICBnZXQgaW5wdXRTY2hlbWEoKTogSW5wdXRTY2hlbWEge1xuICAgIHJldHVybiBpbnB1dFNjaGVtYSgpXG4gIH0sXG4gIGdldCBvdXRwdXRTY2hlbWEoKTogT3V0cHV0U2NoZW1hIHtcbiAgICByZXR1cm4gb3V0cHV0U2NoZW1hKClcbiAgfSxcbiAgYXN5bmMgY2FsbChcbiAgICB7XG4gICAgICBwcm9tcHQsXG4gICAgICBzdWJhZ2VudF90eXBlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBtb2RlbDogbW9kZWxQYXJhbSxcbiAgICAgIHJ1bl9pbl9iYWNrZ3JvdW5kLFxuICAgICAgbmFtZSxcbiAgICAgIHRlYW1fbmFtZSxcbiAgICAgIG1vZGU6IHNwYXduTW9kZSxcbiAgICAgIGlzb2xhdGlvbixcbiAgICAgIGN3ZCxcbiAgICB9OiBBZ2VudFRvb2xJbnB1dCxcbiAgICB0b29sVXNlQ29udGV4dCxcbiAgICBjYW5Vc2VUb29sLFxuICAgIGFzc2lzdGFudE1lc3NhZ2UsXG4gICAgb25Qcm9ncmVzcz8sXG4gICkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBtb2RlbCA9IGlzQ29vcmRpbmF0b3JNb2RlKCkgPyB1bmRlZmluZWQgOiBtb2RlbFBhcmFtXG5cbiAgICAvLyBHZXQgYXBwIHN0YXRlIGZvciBwZXJtaXNzaW9uIG1vZGUgYW5kIGFnZW50IGZpbHRlcmluZ1xuICAgIGNvbnN0IGFwcFN0YXRlID0gdG9vbFVzZUNvbnRleHQuZ2V0QXBwU3RhdGUoKVxuICAgIGNvbnN0IHBlcm1pc3Npb25Nb2RlID0gYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0Lm1vZGVcbiAgICAvLyBJbi1wcm9jZXNzIHRlYW1tYXRlcyBnZXQgYSBuby1vcCBzZXRBcHBTdGF0ZTsgc2V0QXBwU3RhdGVGb3JUYXNrc1xuICAgIC8vIHJlYWNoZXMgdGhlIHJvb3Qgc3RvcmUgc28gdGFzayByZWdpc3RyYXRpb24vcHJvZ3Jlc3Mva2lsbCBzdGF5IHZpc2libGUuXG4gICAgY29uc3Qgcm9vdFNldEFwcFN0YXRlID1cbiAgICAgIHRvb2xVc2VDb250ZXh0LnNldEFwcFN0YXRlRm9yVGFza3MgPz8gdG9vbFVzZUNvbnRleHQuc2V0QXBwU3RhdGVcblxuICAgIC8vIENoZWNrIGlmIHVzZXIgaXMgdHJ5aW5nIHRvIHVzZSBhZ2VudCB0ZWFtcyB3aXRob3V0IGFjY2Vzc1xuICAgIGlmICh0ZWFtX25hbWUgJiYgIWlzQWdlbnRTd2FybXNFbmFibGVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWdlbnQgVGVhbXMgaXMgbm90IHlldCBhdmFpbGFibGUgb24geW91ciBwbGFuLicpXG4gICAgfVxuXG4gICAgLy8gVGVhbW1hdGVzIChpbi1wcm9jZXNzIG9yIHRtdXgpIHBhc3NpbmcgYG5hbWVgIHdvdWxkIHRyaWdnZXIgc3Bhd25UZWFtbWF0ZSgpXG4gICAgLy8gYmVsb3csIGJ1dCBUZWFtRmlsZS5tZW1iZXJzIGlzIGEgZmxhdCBhcnJheSB3aXRoIG9uZSBsZWFkQWdlbnRJZCDigJQgbmVzdGVkXG4gICAgLy8gdGVhbW1hdGVzIGxhbmQgaW4gdGhlIHJvc3RlciB3aXRoIG5vIHByb3ZlbmFuY2UgYW5kIGNvbmZ1c2UgdGhlIGxlYWQuXG4gICAgY29uc3QgdGVhbU5hbWUgPSByZXNvbHZlVGVhbU5hbWUoeyB0ZWFtX25hbWUgfSwgYXBwU3RhdGUpXG4gICAgaWYgKGlzVGVhbW1hdGUoKSAmJiB0ZWFtTmFtZSAmJiBuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUZWFtbWF0ZXMgY2Fubm90IHNwYXduIG90aGVyIHRlYW1tYXRlcyDigJQgdGhlIHRlYW0gcm9zdGVyIGlzIGZsYXQuIFRvIHNwYXduIGEgc3ViYWdlbnQgaW5zdGVhZCwgb21pdCB0aGUgYG5hbWVgIHBhcmFtZXRlci4nLFxuICAgICAgKVxuICAgIH1cbiAgICAvLyBJbi1wcm9jZXNzIHRlYW1tYXRlcyBjYW5ub3Qgc3Bhd24gYmFja2dyb3VuZCBhZ2VudHMgKHRoZWlyIGxpZmVjeWNsZSBpc1xuICAgIC8vIHRpZWQgdG8gdGhlIGxlYWRlcidzIHByb2Nlc3MpLiBUbXV4IHRlYW1tYXRlcyBhcmUgc2VwYXJhdGUgcHJvY2Vzc2VzIGFuZFxuICAgIC8vIGNhbiBtYW5hZ2UgdGhlaXIgb3duIGJhY2tncm91bmQgYWdlbnRzLlxuICAgIGlmIChpc0luUHJvY2Vzc1RlYW1tYXRlKCkgJiYgdGVhbU5hbWUgJiYgcnVuX2luX2JhY2tncm91bmQgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0luLXByb2Nlc3MgdGVhbW1hdGVzIGNhbm5vdCBzcGF3biBiYWNrZ3JvdW5kIGFnZW50cy4gVXNlIHJ1bl9pbl9iYWNrZ3JvdW5kPWZhbHNlIGZvciBzeW5jaHJvbm91cyBzdWJhZ2VudHMuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbXVsdGktYWdlbnQgc3Bhd24gcmVxdWVzdFxuICAgIC8vIFNwYXduIGlzIHRyaWdnZXJlZCB3aGVuIHRlYW1fbmFtZSBpcyBzZXQgKGZyb20gcGFyYW0gb3IgY29udGV4dCkgYW5kIG5hbWUgaXMgcHJvdmlkZWRcbiAgICBpZiAodGVhbU5hbWUgJiYgbmFtZSkge1xuICAgICAgLy8gU2V0IGFnZW50IGRlZmluaXRpb24gY29sb3IgZm9yIGdyb3VwZWQgVUkgZGlzcGxheSBiZWZvcmUgc3Bhd25pbmdcbiAgICAgIGNvbnN0IGFnZW50RGVmID0gc3ViYWdlbnRfdHlwZVxuICAgICAgICA/IHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMuYWdlbnREZWZpbml0aW9ucy5hY3RpdmVBZ2VudHMuZmluZChcbiAgICAgICAgICAgIGEgPT4gYS5hZ2VudFR5cGUgPT09IHN1YmFnZW50X3R5cGUsXG4gICAgICAgICAgKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgaWYgKGFnZW50RGVmPy5jb2xvcikge1xuICAgICAgICBzZXRBZ2VudENvbG9yKHN1YmFnZW50X3R5cGUhLCBhZ2VudERlZi5jb2xvcilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduVGVhbW1hdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICB0ZWFtX25hbWU6IHRlYW1OYW1lLFxuICAgICAgICAgIHVzZV9zcGxpdHBhbmU6IHRydWUsXG4gICAgICAgICAgcGxhbl9tb2RlX3JlcXVpcmVkOiBzcGF3bk1vZGUgPT09ICdwbGFuJyxcbiAgICAgICAgICBtb2RlbDogbW9kZWwgPz8gYWdlbnREZWY/Lm1vZGVsLFxuICAgICAgICAgIGFnZW50X3R5cGU6IHN1YmFnZW50X3R5cGUsXG4gICAgICAgICAgaW52b2tpbmdSZXF1ZXN0SWQ6IGFzc2lzdGFudE1lc3NhZ2U/LnJlcXVlc3RJZCxcbiAgICAgICAgfSxcbiAgICAgICAgdG9vbFVzZUNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIC8vIFR5cGUgYXNzZXJ0aW9uIHVzZXMgVGVhbW1hdGVTcGF3bmVkT3V0cHV0IChkZWZpbmVkIGFib3ZlKSBpbnN0ZWFkIG9mIGFueS5cbiAgICAgIC8vIFRoaXMgdHlwZSBpcyBleGNsdWRlZCBmcm9tIHRoZSBleHBvcnRlZCBvdXRwdXRTY2hlbWEgZm9yIGRlYWQgY29kZSBlbGltaW5hdGlvbi5cbiAgICAgIC8vIENhc3QgdGhyb3VnaCB1bmtub3duIGJlY2F1c2UgVGVhbW1hdGVTcGF3bmVkT3V0cHV0IGlzIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBwYXJ0IG9mIHRoZSBleHBvcnRlZCBPdXRwdXQgdW5pb24gKGZvciBkZWFkIGNvZGUgZWxpbWluYXRpb24gcHVycG9zZXMpLlxuICAgICAgY29uc3Qgc3Bhd25SZXN1bHQ6IFRlYW1tYXRlU3Bhd25lZE91dHB1dCA9IHtcbiAgICAgICAgc3RhdHVzOiAndGVhbW1hdGVfc3Bhd25lZCcgYXMgY29uc3QsXG4gICAgICAgIHByb21wdCxcbiAgICAgICAgLi4ucmVzdWx0LmRhdGEsXG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhOiBzcGF3blJlc3VsdCB9IGFzIHVua25vd24gYXMgeyBkYXRhOiBPdXRwdXQgfVxuICAgIH1cblxuICAgIC8vIEZvcmsgc3ViYWdlbnQgZXhwZXJpbWVudCByb3V0aW5nOlxuICAgIC8vIC0gc3ViYWdlbnRfdHlwZSBzZXQ6IHVzZSBpdCAoZXhwbGljaXQgd2lucylcbiAgICAvLyAtIHN1YmFnZW50X3R5cGUgb21pdHRlZCwgZ2F0ZSBvbjogZm9yayBwYXRoICh1bmRlZmluZWQpXG4gICAgLy8gLSBzdWJhZ2VudF90eXBlIG9taXR0ZWQsIGdhdGUgb2ZmOiBkZWZhdWx0IGdlbmVyYWwtcHVycG9zZVxuICAgIGNvbnN0IGVmZmVjdGl2ZVR5cGUgPVxuICAgICAgc3ViYWdlbnRfdHlwZSA/P1xuICAgICAgKGlzRm9ya1N1YmFnZW50RW5hYmxlZCgpID8gdW5kZWZpbmVkIDogR0VORVJBTF9QVVJQT1NFX0FHRU5ULmFnZW50VHlwZSlcbiAgICBjb25zdCBpc0ZvcmtQYXRoID0gZWZmZWN0aXZlVHlwZSA9PT0gdW5kZWZpbmVkXG5cbiAgICBsZXQgc2VsZWN0ZWRBZ2VudDogQWdlbnREZWZpbml0aW9uXG4gICAgaWYgKGlzRm9ya1BhdGgpIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZSBmb3JrIGd1YXJkOiBmb3JrIGNoaWxkcmVuIGtlZXAgdGhlIEFnZW50IHRvb2wgaW4gdGhlaXJcbiAgICAgIC8vIHBvb2wgZm9yIGNhY2hlLWlkZW50aWNhbCB0b29sIGRlZnMsIHNvIHJlamVjdCBmb3JrIGF0dGVtcHRzIGF0IGNhbGxcbiAgICAgIC8vIHRpbWUuIFByaW1hcnkgY2hlY2sgaXMgcXVlcnlTb3VyY2UgKGNvbXBhY3Rpb24tcmVzaXN0YW50IOKAlCBzZXQgb25cbiAgICAgIC8vIGNvbnRleHQub3B0aW9ucyBhdCBzcGF3biB0aW1lLCBzdXJ2aXZlcyBhdXRvY29tcGFjdCdzIG1lc3NhZ2VcbiAgICAgIC8vIHJld3JpdGUpLiBNZXNzYWdlLXNjYW4gZmFsbGJhY2sgY2F0Y2hlcyBhbnkgcGF0aCB3aGVyZSBxdWVyeVNvdXJjZVxuICAgICAgLy8gd2Fzbid0IHRocmVhZGVkLlxuICAgICAgaWYgKFxuICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLnF1ZXJ5U291cmNlID09PVxuICAgICAgICAgIGBhZ2VudDpidWlsdGluOiR7Rk9SS19BR0VOVC5hZ2VudFR5cGV9YCB8fFxuICAgICAgICBpc0luRm9ya0NoaWxkKHRvb2xVc2VDb250ZXh0Lm1lc3NhZ2VzKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRm9yayBpcyBub3QgYXZhaWxhYmxlIGluc2lkZSBhIGZvcmtlZCB3b3JrZXIuIENvbXBsZXRlIHlvdXIgdGFzayBkaXJlY3RseSB1c2luZyB5b3VyIHRvb2xzLicsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkQWdlbnQgPSBGT1JLX0FHRU5UXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbHRlciBhZ2VudHMgdG8gZXhjbHVkZSB0aG9zZSBkZW5pZWQgdmlhIEFnZW50KEFnZW50TmFtZSkgc3ludGF4XG4gICAgICBjb25zdCBhbGxBZ2VudHMgPSB0b29sVXNlQ29udGV4dC5vcHRpb25zLmFnZW50RGVmaW5pdGlvbnMuYWN0aXZlQWdlbnRzXG4gICAgICBjb25zdCB7IGFsbG93ZWRBZ2VudFR5cGVzIH0gPSB0b29sVXNlQ29udGV4dC5vcHRpb25zLmFnZW50RGVmaW5pdGlvbnNcbiAgICAgIGNvbnN0IGFnZW50cyA9IGZpbHRlckRlbmllZEFnZW50cyhcbiAgICAgICAgLy8gV2hlbiBhbGxvd2VkQWdlbnRUeXBlcyBpcyBzZXQgKGZyb20gQWdlbnQoeCx5KSB0b29sIHNwZWMpLCByZXN0cmljdCB0byB0aG9zZSB0eXBlc1xuICAgICAgICBhbGxvd2VkQWdlbnRUeXBlc1xuICAgICAgICAgID8gYWxsQWdlbnRzLmZpbHRlcihhID0+IGFsbG93ZWRBZ2VudFR5cGVzLmluY2x1ZGVzKGEuYWdlbnRUeXBlKSlcbiAgICAgICAgICA6IGFsbEFnZW50cyxcbiAgICAgICAgYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LFxuICAgICAgICBBR0VOVF9UT09MX05BTUUsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGZvdW5kID0gYWdlbnRzLmZpbmQoYWdlbnQgPT4gYWdlbnQuYWdlbnRUeXBlID09PSBlZmZlY3RpdmVUeXBlKVxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQgZXhpc3RzIGJ1dCBpcyBkZW5pZWQgYnkgcGVybWlzc2lvbiBydWxlc1xuICAgICAgICBjb25zdCBhZ2VudEV4aXN0c0J1dERlbmllZCA9IGFsbEFnZW50cy5maW5kKFxuICAgICAgICAgIGFnZW50ID0+IGFnZW50LmFnZW50VHlwZSA9PT0gZWZmZWN0aXZlVHlwZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoYWdlbnRFeGlzdHNCdXREZW5pZWQpIHtcbiAgICAgICAgICBjb25zdCBkZW55UnVsZSA9IGdldERlbnlSdWxlRm9yQWdlbnQoXG4gICAgICAgICAgICBhcHBTdGF0ZS50b29sUGVybWlzc2lvbkNvbnRleHQsXG4gICAgICAgICAgICBBR0VOVF9UT09MX05BTUUsXG4gICAgICAgICAgICBlZmZlY3RpdmVUeXBlLFxuICAgICAgICAgIClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgdHlwZSAnJHtlZmZlY3RpdmVUeXBlfScgaGFzIGJlZW4gZGVuaWVkIGJ5IHBlcm1pc3Npb24gcnVsZSAnJHtBR0VOVF9UT09MX05BTUV9KCR7ZWZmZWN0aXZlVHlwZX0pJyBmcm9tICR7ZGVueVJ1bGU/LnNvdXJjZSA/PyAnc2V0dGluZ3MnfS5gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFnZW50IHR5cGUgJyR7ZWZmZWN0aXZlVHlwZX0nIG5vdCBmb3VuZC4gQXZhaWxhYmxlIGFnZW50czogJHthZ2VudHNcbiAgICAgICAgICAgIC5tYXAoYSA9PiBhLmFnZW50VHlwZSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkQWdlbnQgPSBmb3VuZFxuICAgIH1cblxuICAgIC8vIFNhbWUgbGlmZWN5Y2xlIGNvbnN0cmFpbnQgYXMgdGhlIHJ1bl9pbl9iYWNrZ3JvdW5kIGd1YXJkIGFib3ZlLCBidXQgZm9yXG4gICAgLy8gYWdlbnQgZGVmaW5pdGlvbnMgdGhhdCBmb3JjZSBiYWNrZ3JvdW5kIHZpYSBgYmFja2dyb3VuZDogdHJ1ZWAuIENoZWNrZWRcbiAgICAvLyBoZXJlIGJlY2F1c2Ugc2VsZWN0ZWRBZ2VudCBpcyBvbmx5IG5vdyByZXNvbHZlZC5cbiAgICBpZiAoXG4gICAgICBpc0luUHJvY2Vzc1RlYW1tYXRlKCkgJiZcbiAgICAgIHRlYW1OYW1lICYmXG4gICAgICBzZWxlY3RlZEFnZW50LmJhY2tncm91bmQgPT09IHRydWVcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluLXByb2Nlc3MgdGVhbW1hdGVzIGNhbm5vdCBzcGF3biBiYWNrZ3JvdW5kIGFnZW50cy4gQWdlbnQgJyR7c2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGV9JyBoYXMgYmFja2dyb3VuZDogdHJ1ZSBpbiBpdHMgZGVmaW5pdGlvbi5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIENhcHR1cmUgZm9yIHR5cGUgbmFycm93aW5nIOKAlCBgbGV0IHNlbGVjdGVkQWdlbnRgIHByZXZlbnRzIFRTIGZyb21cbiAgICAvLyBuYXJyb3dpbmcgcHJvcGVydHkgdHlwZXMgYWNyb3NzIHRoZSBpZi1lbHNlIGFzc2lnbm1lbnQgYWJvdmUuXG4gICAgY29uc3QgcmVxdWlyZWRNY3BTZXJ2ZXJzID0gc2VsZWN0ZWRBZ2VudC5yZXF1aXJlZE1jcFNlcnZlcnNcblxuICAgIC8vIENoZWNrIGlmIHJlcXVpcmVkIE1DUCBzZXJ2ZXJzIGhhdmUgdG9vbHMgYXZhaWxhYmxlXG4gICAgLy8gQSBzZXJ2ZXIgdGhhdCdzIGNvbm5lY3RlZCBidXQgbm90IGF1dGhlbnRpY2F0ZWQgd29uJ3QgaGF2ZSBhbnkgdG9vbHNcbiAgICBpZiAocmVxdWlyZWRNY3BTZXJ2ZXJzPy5sZW5ndGgpIHtcbiAgICAgIC8vIElmIGFueSByZXF1aXJlZCBzZXJ2ZXJzIGFyZSBzdGlsbCBwZW5kaW5nIChjb25uZWN0aW5nKSwgd2FpdCBmb3IgdGhlbVxuICAgICAgLy8gYmVmb3JlIGNoZWNraW5nIHRvb2wgYXZhaWxhYmlsaXR5LiBUaGlzIGF2b2lkcyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlXG4gICAgICAvLyB0aGUgYWdlbnQgaXMgaW52b2tlZCBiZWZvcmUgTUNQIHNlcnZlcnMgZmluaXNoIGNvbm5lY3RpbmcuXG4gICAgICBjb25zdCBoYXNQZW5kaW5nUmVxdWlyZWRTZXJ2ZXJzID0gYXBwU3RhdGUubWNwLmNsaWVudHMuc29tZShcbiAgICAgICAgYyA9PlxuICAgICAgICAgIGMudHlwZSA9PT0gJ3BlbmRpbmcnICYmXG4gICAgICAgICAgcmVxdWlyZWRNY3BTZXJ2ZXJzLnNvbWUocGF0dGVybiA9PlxuICAgICAgICAgICAgYy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGF0dGVybi50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICApLFxuICAgICAgKVxuXG4gICAgICBsZXQgY3VycmVudEFwcFN0YXRlID0gYXBwU3RhdGVcbiAgICAgIGlmIChoYXNQZW5kaW5nUmVxdWlyZWRTZXJ2ZXJzKSB7XG4gICAgICAgIGNvbnN0IE1BWF9XQUlUX01TID0gMzBfMDAwXG4gICAgICAgIGNvbnN0IFBPTExfSU5URVJWQUxfTVMgPSA1MDBcbiAgICAgICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTUFYX1dBSVRfTVNcblxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICAgICBjdXJyZW50QXBwU3RhdGUgPSB0b29sVXNlQ29udGV4dC5nZXRBcHBTdGF0ZSgpXG5cbiAgICAgICAgICAvLyBFYXJseSBleGl0OiBpZiBhbnkgcmVxdWlyZWQgc2VydmVyIGhhcyBhbHJlYWR5IGZhaWxlZCwgbm8gcG9pbnRcbiAgICAgICAgICAvLyB3YWl0aW5nIGZvciBvdGhlciBwZW5kaW5nIHNlcnZlcnMg4oCUIHRoZSBjaGVjayB3aWxsIGZhaWwgcmVnYXJkbGVzcy5cbiAgICAgICAgICBjb25zdCBoYXNGYWlsZWRSZXF1aXJlZFNlcnZlciA9IGN1cnJlbnRBcHBTdGF0ZS5tY3AuY2xpZW50cy5zb21lKFxuICAgICAgICAgICAgYyA9PlxuICAgICAgICAgICAgICBjLnR5cGUgPT09ICdmYWlsZWQnICYmXG4gICAgICAgICAgICAgIHJlcXVpcmVkTWNwU2VydmVycy5zb21lKHBhdHRlcm4gPT5cbiAgICAgICAgICAgICAgICBjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXR0ZXJuLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoaGFzRmFpbGVkUmVxdWlyZWRTZXJ2ZXIpIGJyZWFrXG5cbiAgICAgICAgICBjb25zdCBzdGlsbFBlbmRpbmcgPSBjdXJyZW50QXBwU3RhdGUubWNwLmNsaWVudHMuc29tZShcbiAgICAgICAgICAgIGMgPT5cbiAgICAgICAgICAgICAgYy50eXBlID09PSAncGVuZGluZycgJiZcbiAgICAgICAgICAgICAgcmVxdWlyZWRNY3BTZXJ2ZXJzLnNvbWUocGF0dGVybiA9PlxuICAgICAgICAgICAgICAgIGMubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhdHRlcm4udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKVxuICAgICAgICAgIGlmICghc3RpbGxQZW5kaW5nKSBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBzZXJ2ZXJzIHRoYXQgYWN0dWFsbHkgaGF2ZSB0b29scyAobWVhbmluZyB0aGV5J3JlIGNvbm5lY3RlZCBBTkQgYXV0aGVudGljYXRlZClcbiAgICAgIGNvbnN0IHNlcnZlcnNXaXRoVG9vbHM6IHN0cmluZ1tdID0gW11cbiAgICAgIGZvciAoY29uc3QgdG9vbCBvZiBjdXJyZW50QXBwU3RhdGUubWNwLnRvb2xzKSB7XG4gICAgICAgIGlmICh0b29sLm5hbWU/LnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IHNlcnZlciBuYW1lIGZyb20gdG9vbCBuYW1lIChmb3JtYXQ6IG1jcF9fc2VydmVyTmFtZV9fdG9vbE5hbWUpXG4gICAgICAgICAgY29uc3QgcGFydHMgPSB0b29sLm5hbWUuc3BsaXQoJ19fJylcbiAgICAgICAgICBjb25zdCBzZXJ2ZXJOYW1lID0gcGFydHNbMV1cbiAgICAgICAgICBpZiAoc2VydmVyTmFtZSAmJiAhc2VydmVyc1dpdGhUb29scy5pbmNsdWRlcyhzZXJ2ZXJOYW1lKSkge1xuICAgICAgICAgICAgc2VydmVyc1dpdGhUb29scy5wdXNoKHNlcnZlck5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFzUmVxdWlyZWRNY3BTZXJ2ZXJzKHNlbGVjdGVkQWdlbnQsIHNlcnZlcnNXaXRoVG9vbHMpKSB7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZE1jcFNlcnZlcnMuZmlsdGVyKFxuICAgICAgICAgIHBhdHRlcm4gPT5cbiAgICAgICAgICAgICFzZXJ2ZXJzV2l0aFRvb2xzLnNvbWUoc2VydmVyID0+XG4gICAgICAgICAgICAgIHNlcnZlci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhdHRlcm4udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWdlbnQgJyR7c2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGV9JyByZXF1aXJlcyBNQ1Agc2VydmVycyBtYXRjaGluZzogJHttaXNzaW5nLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgICAgIGBNQ1Agc2VydmVycyB3aXRoIHRvb2xzOiAke3NlcnZlcnNXaXRoVG9vbHMubGVuZ3RoID4gMCA/IHNlcnZlcnNXaXRoVG9vbHMuam9pbignLCAnKSA6ICdub25lJ30uIGAgK1xuICAgICAgICAgICAgYFVzZSAvbWNwIHRvIGNvbmZpZ3VyZSBhbmQgYXV0aGVudGljYXRlIHRoZSByZXF1aXJlZCBNQ1Agc2VydmVycy5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29sb3IgZm9yIHRoaXMgYWdlbnQgaWYgaXQgaGFzIGEgcHJlZGVmaW5lZCBvbmVcbiAgICBpZiAoc2VsZWN0ZWRBZ2VudC5jb2xvcikge1xuICAgICAgc2V0QWdlbnRDb2xvcihzZWxlY3RlZEFnZW50LmFnZW50VHlwZSwgc2VsZWN0ZWRBZ2VudC5jb2xvcilcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGFnZW50IHBhcmFtcyBmb3IgbG9nZ2luZyAodGhlc2UgYXJlIGFscmVhZHkgcmVzb2x2ZWQgaW4gcnVuQWdlbnQpXG4gICAgY29uc3QgcmVzb2x2ZWRBZ2VudE1vZGVsID0gZ2V0QWdlbnRNb2RlbChcbiAgICAgIHNlbGVjdGVkQWdlbnQubW9kZWwsXG4gICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLm1haW5Mb29wTW9kZWwsXG4gICAgICBpc0ZvcmtQYXRoID8gdW5kZWZpbmVkIDogbW9kZWwsXG4gICAgICBwZXJtaXNzaW9uTW9kZSxcbiAgICApXG5cbiAgICBsb2dFdmVudCgndGVuZ3VfYWdlbnRfdG9vbF9zZWxlY3RlZCcsIHtcbiAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgIHNlbGVjdGVkQWdlbnQuYWdlbnRUeXBlIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICBtb2RlbDpcbiAgICAgICAgcmVzb2x2ZWRBZ2VudE1vZGVsIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICBzb3VyY2U6XG4gICAgICAgIHNlbGVjdGVkQWdlbnQuc291cmNlIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICBjb2xvcjpcbiAgICAgICAgc2VsZWN0ZWRBZ2VudC5jb2xvciBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgaXNfYnVpbHRfaW5fYWdlbnQ6IGlzQnVpbHRJbkFnZW50KHNlbGVjdGVkQWdlbnQpLFxuICAgICAgaXNfcmVzdW1lOiBmYWxzZSxcbiAgICAgIGlzX2FzeW5jOlxuICAgICAgICAocnVuX2luX2JhY2tncm91bmQgPT09IHRydWUgfHwgc2VsZWN0ZWRBZ2VudC5iYWNrZ3JvdW5kID09PSB0cnVlKSAmJlxuICAgICAgICAhaXNCYWNrZ3JvdW5kVGFza3NEaXNhYmxlZCxcbiAgICAgIGlzX2Zvcms6IGlzRm9ya1BhdGgsXG4gICAgfSlcblxuICAgIC8vIFJlc29sdmUgZWZmZWN0aXZlIGlzb2xhdGlvbiBtb2RlIChleHBsaWNpdCBwYXJhbSBvdmVycmlkZXMgYWdlbnQgZGVmKVxuICAgIGNvbnN0IGVmZmVjdGl2ZUlzb2xhdGlvbiA9IGlzb2xhdGlvbiA/PyBzZWxlY3RlZEFnZW50Lmlzb2xhdGlvblxuXG4gICAgLy8gUmVtb3RlIGlzb2xhdGlvbjogZGVsZWdhdGUgdG8gQ0NSLiBHYXRlZCBhbnQtb25seSDigJQgdGhlIGd1YXJkIGVuYWJsZXNcbiAgICAvLyBkZWFkIGNvZGUgZWxpbWluYXRpb24gb2YgdGhlIGVudGlyZSBibG9jayBmb3IgZXh0ZXJuYWwgYnVpbGRzLlxuICAgIGlmIChcImV4dGVybmFsXCIgPT09ICdhbnQnICYmIGVmZmVjdGl2ZUlzb2xhdGlvbiA9PT0gJ3JlbW90ZScpIHtcbiAgICAgIGNvbnN0IGVsaWdpYmlsaXR5ID0gYXdhaXQgY2hlY2tSZW1vdGVBZ2VudEVsaWdpYmlsaXR5KClcbiAgICAgIGlmICghZWxpZ2liaWxpdHkuZWxpZ2libGUpIHtcbiAgICAgICAgY29uc3QgcmVhc29ucyA9IGVsaWdpYmlsaXR5LmVycm9yc1xuICAgICAgICAgIC5tYXAoZm9ybWF0UHJlY29uZGl0aW9uRXJyb3IpXG4gICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGxhdW5jaCByZW1vdGUgYWdlbnQ6XFxuJHtyZWFzb25zfWApXG4gICAgICB9XG5cbiAgICAgIGxldCBidW5kbGVGYWlsSGludDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGVsZXBvcnRUb1JlbW90ZSh7XG4gICAgICAgIGluaXRpYWxNZXNzYWdlOiBwcm9tcHQsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBzaWduYWw6IHRvb2xVc2VDb250ZXh0LmFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG9uQnVuZGxlRmFpbDogbXNnID0+IHtcbiAgICAgICAgICBidW5kbGVGYWlsSGludCA9IG1zZ1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYnVuZGxlRmFpbEhpbnQgPz8gJ0ZhaWxlZCB0byBjcmVhdGUgcmVtb3RlIHNlc3Npb24nKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRhc2tJZCwgc2Vzc2lvbklkIH0gPSByZWdpc3RlclJlbW90ZUFnZW50VGFzayh7XG4gICAgICAgIHJlbW90ZVRhc2tUeXBlOiAncmVtb3RlLWFnZW50JyxcbiAgICAgICAgc2Vzc2lvbjogeyBpZDogc2Vzc2lvbi5pZCwgdGl0bGU6IHNlc3Npb24udGl0bGUgfHwgZGVzY3JpcHRpb24gfSxcbiAgICAgICAgY29tbWFuZDogcHJvbXB0LFxuICAgICAgICBjb250ZXh0OiB0b29sVXNlQ29udGV4dCxcbiAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICB9KVxuXG4gICAgICBsb2dFdmVudCgndGVuZ3VfYWdlbnRfdG9vbF9yZW1vdGVfbGF1bmNoZWQnLCB7XG4gICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHJlbW90ZVJlc3VsdDogUmVtb3RlTGF1bmNoZWRPdXRwdXQgPSB7XG4gICAgICAgIHN0YXR1czogJ3JlbW90ZV9sYXVuY2hlZCcsXG4gICAgICAgIHRhc2tJZCxcbiAgICAgICAgc2Vzc2lvblVybDogZ2V0UmVtb3RlVGFza1Nlc3Npb25Vcmwoc2Vzc2lvbklkKSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIHByb21wdCxcbiAgICAgICAgb3V0cHV0RmlsZTogZ2V0VGFza091dHB1dFBhdGgodGFza0lkKSxcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IHJlbW90ZVJlc3VsdCB9IGFzIHVua25vd24gYXMgeyBkYXRhOiBPdXRwdXQgfVxuICAgIH1cbiAgICAvLyBTeXN0ZW0gcHJvbXB0ICsgcHJvbXB0IG1lc3NhZ2VzOiBicmFuY2ggb24gZm9yayBwYXRoLlxuICAgIC8vXG4gICAgLy8gRm9yayBwYXRoOiBjaGlsZCBpbmhlcml0cyB0aGUgUEFSRU5UJ3Mgc3lzdGVtIHByb21wdCAobm90IEZPUktfQUdFTlQncylcbiAgICAvLyBmb3IgY2FjaGUtaWRlbnRpY2FsIEFQSSByZXF1ZXN0IHByZWZpeGVzLiBQcm9tcHQgbWVzc2FnZXMgYXJlIGJ1aWx0IHZpYVxuICAgIC8vIGJ1aWxkRm9ya2VkTWVzc2FnZXMoKSB3aGljaCBjbG9uZXMgdGhlIHBhcmVudCdzIGZ1bGwgYXNzaXN0YW50IG1lc3NhZ2VcbiAgICAvLyAoYWxsIHRvb2xfdXNlIGJsb2NrcykgKyBwbGFjZWhvbGRlciB0b29sX3Jlc3VsdHMgKyBwZXItY2hpbGQgZGlyZWN0aXZlLlxuICAgIC8vXG4gICAgLy8gTm9ybWFsIHBhdGg6IGJ1aWxkIHRoZSBzZWxlY3RlZCBhZ2VudCdzIG93biBzeXN0ZW0gcHJvbXB0IHdpdGggZW52XG4gICAgLy8gZGV0YWlscywgYW5kIHVzZSBhIHNpbXBsZSB1c2VyIG1lc3NhZ2UgZm9yIHRoZSBwcm9tcHQuXG4gICAgbGV0IGVuaGFuY2VkU3lzdGVtUHJvbXB0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICAgIGxldCBmb3JrUGFyZW50U3lzdGVtUHJvbXB0OlxuICAgICAgfCBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEVmZmVjdGl2ZVN5c3RlbVByb21wdD5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgbGV0IHByb21wdE1lc3NhZ2VzOiBNZXNzYWdlVHlwZVtdXG5cbiAgICBpZiAoaXNGb3JrUGF0aCkge1xuICAgICAgaWYgKHRvb2xVc2VDb250ZXh0LnJlbmRlcmVkU3lzdGVtUHJvbXB0KSB7XG4gICAgICAgIGZvcmtQYXJlbnRTeXN0ZW1Qcm9tcHQgPSB0b29sVXNlQ29udGV4dC5yZW5kZXJlZFN5c3RlbVByb21wdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IHJlY29tcHV0ZS4gTWF5IGRpdmVyZ2UgZnJvbSBwYXJlbnQncyBjYWNoZWQgYnl0ZXMgaWZcbiAgICAgICAgLy8gR3Jvd3RoQm9vayBzdGF0ZSBjaGFuZ2VkIGJldHdlZW4gcGFyZW50IHR1cm4tc3RhcnQgYW5kIGZvcmsgc3Bhd24uXG4gICAgICAgIGNvbnN0IG1haW5UaHJlYWRBZ2VudERlZmluaXRpb24gPSBhcHBTdGF0ZS5hZ2VudFxuICAgICAgICAgID8gYXBwU3RhdGUuYWdlbnREZWZpbml0aW9ucy5hY3RpdmVBZ2VudHMuZmluZChcbiAgICAgICAgICAgICAgYSA9PiBhLmFnZW50VHlwZSA9PT0gYXBwU3RhdGUuYWdlbnQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFdvcmtpbmdEaXJlY3RvcmllcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LmFkZGl0aW9uYWxXb3JraW5nRGlyZWN0b3JpZXMua2V5cygpLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTeXN0ZW1Qcm9tcHQgPSBhd2FpdCBnZXRTeXN0ZW1Qcm9tcHQoXG4gICAgICAgICAgdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLm1haW5Mb29wTW9kZWwsXG4gICAgICAgICAgYWRkaXRpb25hbFdvcmtpbmdEaXJlY3RvcmllcyxcbiAgICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLm1jcENsaWVudHMsXG4gICAgICAgIClcbiAgICAgICAgZm9ya1BhcmVudFN5c3RlbVByb21wdCA9IGJ1aWxkRWZmZWN0aXZlU3lzdGVtUHJvbXB0KHtcbiAgICAgICAgICBtYWluVGhyZWFkQWdlbnREZWZpbml0aW9uLFxuICAgICAgICAgIHRvb2xVc2VDb250ZXh0LFxuICAgICAgICAgIGN1c3RvbVN5c3RlbVByb21wdDogdG9vbFVzZUNvbnRleHQub3B0aW9ucy5jdXN0b21TeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgZGVmYXVsdFN5c3RlbVByb21wdCxcbiAgICAgICAgICBhcHBlbmRTeXN0ZW1Qcm9tcHQ6IHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMuYXBwZW5kU3lzdGVtUHJvbXB0LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcHJvbXB0TWVzc2FnZXMgPSBidWlsZEZvcmtlZE1lc3NhZ2VzKHByb21wdCwgYXNzaXN0YW50TWVzc2FnZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFdvcmtpbmdEaXJlY3RvcmllcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LmFkZGl0aW9uYWxXb3JraW5nRGlyZWN0b3JpZXMua2V5cygpLFxuICAgICAgICApXG5cbiAgICAgICAgLy8gQWxsIGFnZW50cyBoYXZlIGdldFN5c3RlbVByb21wdCAtIHBhc3MgdG9vbFVzZUNvbnRleHQgdG8gYWxsXG4gICAgICAgIGNvbnN0IGFnZW50UHJvbXB0ID0gc2VsZWN0ZWRBZ2VudC5nZXRTeXN0ZW1Qcm9tcHQoeyB0b29sVXNlQ29udGV4dCB9KVxuXG4gICAgICAgIC8vIExvZyBhZ2VudCBtZW1vcnkgbG9hZGVkIGV2ZW50IGZvciBzdWJhZ2VudHNcbiAgICAgICAgaWYgKHNlbGVjdGVkQWdlbnQubWVtb3J5KSB7XG4gICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2FnZW50X21lbW9yeV9sb2FkZWQnLCB7XG4gICAgICAgICAgICAuLi4oXCJleHRlcm5hbFwiID09PSAnYW50JyAmJiB7XG4gICAgICAgICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2NvcGU6XG4gICAgICAgICAgICAgIHNlbGVjdGVkQWdlbnQubWVtb3J5IGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICBzb3VyY2U6XG4gICAgICAgICAgICAgICdzdWJhZ2VudCcgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZW52aXJvbm1lbnQgZGV0YWlscyBlbmhhbmNlbWVudFxuICAgICAgICBlbmhhbmNlZFN5c3RlbVByb21wdCA9IGF3YWl0IGVuaGFuY2VTeXN0ZW1Qcm9tcHRXaXRoRW52RGV0YWlscyhcbiAgICAgICAgICBbYWdlbnRQcm9tcHRdLFxuICAgICAgICAgIHJlc29sdmVkQWdlbnRNb2RlbCxcbiAgICAgICAgICBhZGRpdGlvbmFsV29ya2luZ0RpcmVjdG9yaWVzLFxuICAgICAgICApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dGb3JEZWJ1Z2dpbmcoXG4gICAgICAgICAgYEZhaWxlZCB0byBnZXQgc3lzdGVtIHByb21wdCBmb3IgYWdlbnQgJHtzZWxlY3RlZEFnZW50LmFnZW50VHlwZX06ICR7ZXJyb3JNZXNzYWdlKGVycm9yKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBwcm9tcHRNZXNzYWdlcyA9IFtjcmVhdGVVc2VyTWVzc2FnZSh7IGNvbnRlbnQ6IHByb21wdCB9KV1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICAgIHByb21wdCxcbiAgICAgIHJlc29sdmVkQWdlbnRNb2RlbCxcbiAgICAgIGlzQnVpbHRJbkFnZW50OiBpc0J1aWx0SW5BZ2VudChzZWxlY3RlZEFnZW50KSxcbiAgICAgIHN0YXJ0VGltZSxcbiAgICAgIGFnZW50VHlwZTogc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUsXG4gICAgICBpc0FzeW5jOlxuICAgICAgICAocnVuX2luX2JhY2tncm91bmQgPT09IHRydWUgfHwgc2VsZWN0ZWRBZ2VudC5iYWNrZ3JvdW5kID09PSB0cnVlKSAmJlxuICAgICAgICAhaXNCYWNrZ3JvdW5kVGFza3NEaXNhYmxlZCxcbiAgICB9XG5cbiAgICAvLyBVc2UgaW5saW5lIGVudiBjaGVjayBpbnN0ZWFkIG9mIGNvb3JkaW5hdG9yTW9kdWxlIHRvIGF2b2lkIGNpcmN1bGFyXG4gICAgLy8gZGVwZW5kZW5jeSBpc3N1ZXMgZHVyaW5nIHRlc3QgbW9kdWxlIGxvYWRpbmcuXG4gICAgY29uc3QgaXNDb29yZGluYXRvciA9IGZlYXR1cmUoJ0NPT1JESU5BVE9SX01PREUnKVxuICAgICAgPyBpc0VudlRydXRoeShwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9DT09SRElOQVRPUl9NT0RFKVxuICAgICAgOiBmYWxzZVxuXG4gICAgLy8gRm9yayBzdWJhZ2VudCBleHBlcmltZW50OiBmb3JjZSBBTEwgc3Bhd25zIGFzeW5jIGZvciBhIHVuaWZpZWRcbiAgICAvLyA8dGFzay1ub3RpZmljYXRpb24+IGludGVyYWN0aW9uIG1vZGVsIChub3QganVzdCBmb3JrIHNwYXducyDigJQgYWxsIG9mIHRoZW0pLlxuICAgIGNvbnN0IGZvcmNlQXN5bmMgPSBpc0ZvcmtTdWJhZ2VudEVuYWJsZWQoKVxuXG4gICAgLy8gQXNzaXN0YW50IG1vZGU6IGZvcmNlIGFsbCBhZ2VudHMgYXN5bmMuIFN5bmNocm9ub3VzIHN1YmFnZW50cyBob2xkIHRoZVxuICAgIC8vIG1haW4gbG9vcCdzIHR1cm4gb3BlbiB1bnRpbCB0aGV5IGNvbXBsZXRlIOKAlCB0aGUgZGFlbW9uJ3MgaW5wdXRRdWV1ZVxuICAgIC8vIGJhY2tzIHVwLCBhbmQgdGhlIGZpcnN0IG92ZXJkdWUgY3JvbiBjYXRjaC11cCBvbiBzcGF3biBiZWNvbWVzIE5cbiAgICAvLyBzZXJpYWwgc3ViYWdlbnQgdHVybnMgYmxvY2tpbmcgYWxsIHVzZXIgaW5wdXQuIFNhbWUgZ2F0ZSBhc1xuICAgIC8vIGV4ZWN1dGVGb3JrZWRTbGFzaENvbW1hbmQncyBmaXJlLWFuZC1mb3JnZXQgcGF0aDsgdGhlXG4gICAgLy8gPHRhc2stbm90aWZpY2F0aW9uPiByZS1lbnRyeSB0aGVyZSBpcyBoYW5kbGVkIGJ5IHRoZSBlbHNlIGJyYW5jaFxuICAgIC8vIGJlbG93IChyZWdpc3RlckFzeW5jQWdlbnRUYXNrICsgbm90aWZ5T25Db21wbGV0aW9uKS5cbiAgICBjb25zdCBhc3Npc3RhbnRGb3JjZUFzeW5jID0gZmVhdHVyZSgnS0FJUk9TJylcbiAgICAgID8gYXBwU3RhdGUua2Fpcm9zRW5hYmxlZFxuICAgICAgOiBmYWxzZVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuQXN5bmMgPVxuICAgICAgKHJ1bl9pbl9iYWNrZ3JvdW5kID09PSB0cnVlIHx8XG4gICAgICAgIHNlbGVjdGVkQWdlbnQuYmFja2dyb3VuZCA9PT0gdHJ1ZSB8fFxuICAgICAgICBpc0Nvb3JkaW5hdG9yIHx8XG4gICAgICAgIGZvcmNlQXN5bmMgfHxcbiAgICAgICAgYXNzaXN0YW50Rm9yY2VBc3luYyB8fFxuICAgICAgICAocHJvYWN0aXZlTW9kdWxlPy5pc1Byb2FjdGl2ZUFjdGl2ZSgpID8/IGZhbHNlKSkgJiZcbiAgICAgICFpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkXG4gICAgLy8gQXNzZW1ibGUgdGhlIHdvcmtlcidzIHRvb2wgcG9vbCBpbmRlcGVuZGVudGx5IG9mIHRoZSBwYXJlbnQncy5cbiAgICAvLyBXb3JrZXJzIGFsd2F5cyBnZXQgdGhlaXIgdG9vbHMgZnJvbSBhc3NlbWJsZVRvb2xQb29sIHdpdGggdGhlaXIgb3duXG4gICAgLy8gcGVybWlzc2lvbiBtb2RlLCBzbyB0aGV5IGFyZW4ndCBhZmZlY3RlZCBieSB0aGUgcGFyZW50J3MgdG9vbFxuICAgIC8vIHJlc3RyaWN0aW9ucy4gVGhpcyBpcyBjb21wdXRlZCBoZXJlIHNvIHRoYXQgcnVuQWdlbnQgZG9lc24ndCBuZWVkIHRvXG4gICAgLy8gaW1wb3J0IGZyb20gdG9vbHMudHMgKHdoaWNoIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kpLlxuICAgIGNvbnN0IHdvcmtlclBlcm1pc3Npb25Db250ZXh0ID0ge1xuICAgICAgLi4uYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LFxuICAgICAgbW9kZTogc2VsZWN0ZWRBZ2VudC5wZXJtaXNzaW9uTW9kZSA/PyAnYWNjZXB0RWRpdHMnLFxuICAgIH1cbiAgICBjb25zdCB3b3JrZXJUb29scyA9IGFzc2VtYmxlVG9vbFBvb2woXG4gICAgICB3b3JrZXJQZXJtaXNzaW9uQ29udGV4dCxcbiAgICAgIGFwcFN0YXRlLm1jcC50b29scyxcbiAgICApXG5cbiAgICAvLyBDcmVhdGUgYSBzdGFibGUgYWdlbnQgSUQgZWFybHkgc28gaXQgY2FuIGJlIHVzZWQgZm9yIHdvcmt0cmVlIHNsdWdcbiAgICBjb25zdCBlYXJseUFnZW50SWQgPSBjcmVhdGVBZ2VudElkKClcblxuICAgIC8vIFNldCB1cCB3b3JrdHJlZSBpc29sYXRpb24gaWYgcmVxdWVzdGVkXG4gICAgbGV0IHdvcmt0cmVlSW5mbzoge1xuICAgICAgd29ya3RyZWVQYXRoOiBzdHJpbmdcbiAgICAgIHdvcmt0cmVlQnJhbmNoPzogc3RyaW5nXG4gICAgICBoZWFkQ29tbWl0Pzogc3RyaW5nXG4gICAgICBnaXRSb290Pzogc3RyaW5nXG4gICAgICBob29rQmFzZWQ/OiBib29sZWFuXG4gICAgfSB8IG51bGwgPSBudWxsXG5cbiAgICBpZiAoZWZmZWN0aXZlSXNvbGF0aW9uID09PSAnd29ya3RyZWUnKSB7XG4gICAgICBjb25zdCBzbHVnID0gYGFnZW50LSR7ZWFybHlBZ2VudElkLnNsaWNlKDAsIDgpfWBcbiAgICAgIHdvcmt0cmVlSW5mbyA9IGF3YWl0IGNyZWF0ZUFnZW50V29ya3RyZWUoc2x1ZylcbiAgICB9XG5cbiAgICAvLyBGb3JrICsgd29ya3RyZWU6IGluamVjdCBhIG5vdGljZSB0ZWxsaW5nIHRoZSBjaGlsZCB0byB0cmFuc2xhdGUgcGF0aHNcbiAgICAvLyBhbmQgcmUtcmVhZCBwb3RlbnRpYWxseSBzdGFsZSBmaWxlcy4gQXBwZW5kZWQgYWZ0ZXIgdGhlIGZvcmsgZGlyZWN0aXZlXG4gICAgLy8gc28gaXQgYXBwZWFycyBhcyB0aGUgbW9zdCByZWNlbnQgZ3VpZGFuY2UgdGhlIGNoaWxkIHNlZXMuXG4gICAgaWYgKGlzRm9ya1BhdGggJiYgd29ya3RyZWVJbmZvKSB7XG4gICAgICBwcm9tcHRNZXNzYWdlcy5wdXNoKFxuICAgICAgICBjcmVhdGVVc2VyTWVzc2FnZSh7XG4gICAgICAgICAgY29udGVudDogYnVpbGRXb3JrdHJlZU5vdGljZShnZXRDd2QoKSwgd29ya3RyZWVJbmZvLndvcmt0cmVlUGF0aCksXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHJ1bkFnZW50UGFyYW1zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5BZ2VudD5bMF0gPSB7XG4gICAgICBhZ2VudERlZmluaXRpb246IHNlbGVjdGVkQWdlbnQsXG4gICAgICBwcm9tcHRNZXNzYWdlcyxcbiAgICAgIHRvb2xVc2VDb250ZXh0LFxuICAgICAgY2FuVXNlVG9vbCxcbiAgICAgIGlzQXN5bmM6IHNob3VsZFJ1bkFzeW5jLFxuICAgICAgcXVlcnlTb3VyY2U6XG4gICAgICAgIHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMucXVlcnlTb3VyY2UgPz9cbiAgICAgICAgZ2V0UXVlcnlTb3VyY2VGb3JBZ2VudChcbiAgICAgICAgICBzZWxlY3RlZEFnZW50LmFnZW50VHlwZSxcbiAgICAgICAgICBpc0J1aWx0SW5BZ2VudChzZWxlY3RlZEFnZW50KSxcbiAgICAgICAgKSxcbiAgICAgIG1vZGVsOiBpc0ZvcmtQYXRoID8gdW5kZWZpbmVkIDogbW9kZWwsXG4gICAgICAvLyBGb3JrIHBhdGg6IHBhc3MgcGFyZW50J3Mgc3lzdGVtIHByb21wdCBBTkQgcGFyZW50J3MgZXhhY3QgdG9vbFxuICAgICAgLy8gYXJyYXkgKGNhY2hlLWlkZW50aWNhbCBwcmVmaXgpLiB3b3JrZXJUb29scyBpcyByZWJ1aWx0IHVuZGVyXG4gICAgICAvLyBwZXJtaXNzaW9uTW9kZSAnYnViYmxlJyB3aGljaCBkaWZmZXJzIGZyb20gdGhlIHBhcmVudCdzIG1vZGUsIHNvXG4gICAgICAvLyBpdHMgdG9vbC1kZWYgc2VyaWFsaXphdGlvbiBkaXZlcmdlcyBhbmQgYnJlYWtzIGNhY2hlIGF0IHRoZSBmaXJzdFxuICAgICAgLy8gZGlmZmVyaW5nIHRvb2wuIHVzZUV4YWN0VG9vbHMgYWxzbyBpbmhlcml0cyB0aGUgcGFyZW50J3NcbiAgICAgIC8vIHRoaW5raW5nQ29uZmlnIGFuZCBpc05vbkludGVyYWN0aXZlU2Vzc2lvbiAoc2VlIHJ1bkFnZW50LnRzKS5cbiAgICAgIC8vXG4gICAgICAvLyBOb3JtYWwgcGF0aDogd2hlbiBhIGN3ZCBvdmVycmlkZSBpcyBpbiBlZmZlY3QgKHdvcmt0cmVlIGlzb2xhdGlvblxuICAgICAgLy8gb3IgZXhwbGljaXQgY3dkKSwgc2tpcCB0aGUgcHJlLWJ1aWx0IHN5c3RlbSBwcm9tcHQgc28gcnVuQWdlbnQnc1xuICAgICAgLy8gYnVpbGRBZ2VudFN5c3RlbVByb21wdCgpIHJ1bnMgaW5zaWRlIHdyYXBXaXRoQ3dkIHdoZXJlIGdldEN3ZCgpXG4gICAgICAvLyByZXR1cm5zIHRoZSBvdmVycmlkZSBwYXRoLlxuICAgICAgb3ZlcnJpZGU6IGlzRm9ya1BhdGhcbiAgICAgICAgPyB7IHN5c3RlbVByb21wdDogZm9ya1BhcmVudFN5c3RlbVByb21wdCB9XG4gICAgICAgIDogZW5oYW5jZWRTeXN0ZW1Qcm9tcHQgJiYgIXdvcmt0cmVlSW5mbyAmJiAhY3dkXG4gICAgICAgICAgPyB7IHN5c3RlbVByb21wdDogYXNTeXN0ZW1Qcm9tcHQoZW5oYW5jZWRTeXN0ZW1Qcm9tcHQpIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGF2YWlsYWJsZVRvb2xzOiBpc0ZvcmtQYXRoID8gdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyA6IHdvcmtlclRvb2xzLFxuICAgICAgLy8gUGFzcyBwYXJlbnQgY29udmVyc2F0aW9uIHdoZW4gdGhlIGZvcmstc3ViYWdlbnQgcGF0aCBuZWVkcyBmdWxsXG4gICAgICAvLyBjb250ZXh0LiB1c2VFeGFjdFRvb2xzIGluaGVyaXRzIHRoaW5raW5nQ29uZmlnIChydW5BZ2VudC50czo2MjQpLlxuICAgICAgZm9ya0NvbnRleHRNZXNzYWdlczogaXNGb3JrUGF0aCA/IHRvb2xVc2VDb250ZXh0Lm1lc3NhZ2VzIDogdW5kZWZpbmVkLFxuICAgICAgLi4uKGlzRm9ya1BhdGggJiYgeyB1c2VFeGFjdFRvb2xzOiB0cnVlIH0pLFxuICAgICAgd29ya3RyZWVQYXRoOiB3b3JrdHJlZUluZm8/Lndvcmt0cmVlUGF0aCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgIH1cblxuICAgIC8vIEhlbHBlciB0byB3cmFwIGV4ZWN1dGlvbiB3aXRoIGEgY3dkIG92ZXJyaWRlOiBleHBsaWNpdCBjd2QgYXJnIChLQUlST1MpXG4gICAgLy8gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdvcmt0cmVlIGlzb2xhdGlvbiBwYXRoLlxuICAgIGNvbnN0IGN3ZE92ZXJyaWRlUGF0aCA9IGN3ZCA/PyB3b3JrdHJlZUluZm8/Lndvcmt0cmVlUGF0aFxuICAgIGNvbnN0IHdyYXBXaXRoQ3dkID0gPFQsPihmbjogKCkgPT4gVCk6IFQgPT5cbiAgICAgIGN3ZE92ZXJyaWRlUGF0aCA/IHJ1bldpdGhDd2RPdmVycmlkZShjd2RPdmVycmlkZVBhdGgsIGZuKSA6IGZuKClcblxuICAgIC8vIEhlbHBlciB0byBjbGVhbiB1cCB3b3JrdHJlZSBhZnRlciBhZ2VudCBjb21wbGV0ZXNcbiAgICBjb25zdCBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCA9IGFzeW5jICgpOiBQcm9taXNlPHtcbiAgICAgIHdvcmt0cmVlUGF0aD86IHN0cmluZ1xuICAgICAgd29ya3RyZWVCcmFuY2g/OiBzdHJpbmdcbiAgICB9PiA9PiB7XG4gICAgICBpZiAoIXdvcmt0cmVlSW5mbykgcmV0dXJuIHt9XG4gICAgICBjb25zdCB7IHdvcmt0cmVlUGF0aCwgd29ya3RyZWVCcmFuY2gsIGhlYWRDb21taXQsIGdpdFJvb3QsIGhvb2tCYXNlZCB9ID1cbiAgICAgICAgd29ya3RyZWVJbmZvXG4gICAgICAvLyBOdWxsIG91dCB0byBtYWtlIGlkZW1wb3RlbnQg4oCUIGd1YXJkcyBhZ2FpbnN0IGRvdWJsZS1jYWxsIGlmIGNvZGVcbiAgICAgIC8vIGJldHdlZW4gY2xlYW51cCBhbmQgZW5kIG9mIHRyeSB0aHJvd3MgaW50byBjYXRjaFxuICAgICAgd29ya3RyZWVJbmZvID0gbnVsbFxuICAgICAgaWYgKGhvb2tCYXNlZCkge1xuICAgICAgICAvLyBIb29rLWJhc2VkIHdvcmt0cmVlcyBhcmUgYWx3YXlzIGtlcHQgc2luY2Ugd2UgY2FuJ3QgZGV0ZWN0IFZDUyBjaGFuZ2VzXG4gICAgICAgIGxvZ0ZvckRlYnVnZ2luZyhgSG9vay1iYXNlZCBhZ2VudCB3b3JrdHJlZSBrZXB0IGF0OiAke3dvcmt0cmVlUGF0aH1gKVxuICAgICAgICByZXR1cm4geyB3b3JrdHJlZVBhdGggfVxuICAgICAgfVxuICAgICAgaWYgKGhlYWRDb21taXQpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IGF3YWl0IGhhc1dvcmt0cmVlQ2hhbmdlcyh3b3JrdHJlZVBhdGgsIGhlYWRDb21taXQpXG4gICAgICAgIGlmICghY2hhbmdlZCkge1xuICAgICAgICAgIGF3YWl0IHJlbW92ZUFnZW50V29ya3RyZWUod29ya3RyZWVQYXRoLCB3b3JrdHJlZUJyYW5jaCwgZ2l0Um9vdClcbiAgICAgICAgICAvLyBDbGVhciB3b3JrdHJlZVBhdGggZnJvbSBtZXRhZGF0YSBzbyByZXN1bWUgZG9lc24ndCB0cnkgdG8gdXNlXG4gICAgICAgICAgLy8gYSBkZWxldGVkIGRpcmVjdG9yeS4gRmlyZS1hbmQtZm9yZ2V0IHRvIG1hdGNoIHJ1bkFnZW50J3NcbiAgICAgICAgICAvLyB3cml0ZUFnZW50TWV0YWRhdGEgaGFuZGxpbmcuXG4gICAgICAgICAgdm9pZCB3cml0ZUFnZW50TWV0YWRhdGEoYXNBZ2VudElkKGVhcmx5QWdlbnRJZCksIHtcbiAgICAgICAgICAgIGFnZW50VHlwZTogc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICB9KS5jYXRjaChfZXJyID0+XG4gICAgICAgICAgICBsb2dGb3JEZWJ1Z2dpbmcoYEZhaWxlZCB0byBjbGVhciB3b3JrdHJlZSBtZXRhZGF0YTogJHtfZXJyfWApLFxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nRm9yRGVidWdnaW5nKGBBZ2VudCB3b3JrdHJlZSBoYXMgY2hhbmdlcywga2VlcGluZzogJHt3b3JrdHJlZVBhdGh9YClcbiAgICAgIHJldHVybiB7IHdvcmt0cmVlUGF0aCwgd29ya3RyZWVCcmFuY2ggfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRSdW5Bc3luYykge1xuICAgICAgY29uc3QgYXN5bmNBZ2VudElkID0gZWFybHlBZ2VudElkXG4gICAgICBjb25zdCBhZ2VudEJhY2tncm91bmRUYXNrID0gcmVnaXN0ZXJBc3luY0FnZW50KHtcbiAgICAgICAgYWdlbnRJZDogYXN5bmNBZ2VudElkLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgcHJvbXB0LFxuICAgICAgICBzZWxlY3RlZEFnZW50LFxuICAgICAgICBzZXRBcHBTdGF0ZTogcm9vdFNldEFwcFN0YXRlLFxuICAgICAgICAvLyBEb24ndCBsaW5rIHRvIHBhcmVudCdzIGFib3J0IGNvbnRyb2xsZXIgLS0gYmFja2dyb3VuZCBhZ2VudHMgc2hvdWxkXG4gICAgICAgIC8vIHN1cnZpdmUgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEVTQyB0byBjYW5jZWwgdGhlIG1haW4gdGhyZWFkLlxuICAgICAgICAvLyBUaGV5IGFyZSBraWxsZWQgZXhwbGljaXRseSB2aWEgY2hhdDpraWxsQWdlbnRzLlxuICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VDb250ZXh0LnRvb2xVc2VJZCxcbiAgICAgIH0pXG5cbiAgICAgIC8vIFJlZ2lzdGVyIG5hbWUg4oaSIGFnZW50SWQgZm9yIFNlbmRNZXNzYWdlIHJvdXRpbmcuIFBvc3QtcmVnaXN0ZXJBc3luY0FnZW50XG4gICAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhIHN0YWxlIGVudHJ5IGlmIHNwYXduIGZhaWxzLiBTeW5jIGFnZW50cyBza2lwcGVkIOKAlFxuICAgICAgLy8gY29vcmRpbmF0b3IgaXMgYmxvY2tlZCwgc28gU2VuZE1lc3NhZ2Ugcm91dGluZyBkb2Vzbid0IGFwcGx5LlxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcm9vdFNldEFwcFN0YXRlKHByZXYgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHByZXYuYWdlbnROYW1lUmVnaXN0cnkpXG4gICAgICAgICAgbmV4dC5zZXQobmFtZSwgYXNBZ2VudElkKGFzeW5jQWdlbnRJZCkpXG4gICAgICAgICAgcmV0dXJuIHsgLi4ucHJldiwgYWdlbnROYW1lUmVnaXN0cnk6IG5leHQgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBXcmFwIGFzeW5jIGFnZW50IGV4ZWN1dGlvbiBpbiBhZ2VudCBjb250ZXh0IGZvciBhbmFseXRpY3MgYXR0cmlidXRpb25cbiAgICAgIGNvbnN0IGFzeW5jQWdlbnRDb250ZXh0ID0ge1xuICAgICAgICBhZ2VudElkOiBhc3luY0FnZW50SWQsXG4gICAgICAgIC8vIEZvciBzdWJhZ2VudHMgZnJvbSB0ZWFtbWF0ZXM6IHVzZSB0ZWFtIGxlYWQncyBzZXNzaW9uXG4gICAgICAgIC8vIEZvciBzdWJhZ2VudHMgZnJvbSBtYWluIFJFUEw6IHVuZGVmaW5lZCAobm8gcGFyZW50IHNlc3Npb24pXG4gICAgICAgIHBhcmVudFNlc3Npb25JZDogZ2V0UGFyZW50U2Vzc2lvbklkKCksXG4gICAgICAgIGFnZW50VHlwZTogJ3N1YmFnZW50JyBhcyBjb25zdCxcbiAgICAgICAgc3ViYWdlbnROYW1lOiBzZWxlY3RlZEFnZW50LmFnZW50VHlwZSxcbiAgICAgICAgaXNCdWlsdEluOiBpc0J1aWx0SW5BZ2VudChzZWxlY3RlZEFnZW50KSxcbiAgICAgICAgaW52b2tpbmdSZXF1ZXN0SWQ6IGFzc2lzdGFudE1lc3NhZ2U/LnJlcXVlc3RJZCxcbiAgICAgICAgaW52b2NhdGlvbktpbmQ6ICdzcGF3bicgYXMgY29uc3QsXG4gICAgICAgIGludm9jYXRpb25FbWl0dGVkOiBmYWxzZSxcbiAgICAgIH1cblxuICAgICAgLy8gV29ya2xvYWQgcHJvcGFnYXRpb246IGhhbmRsZVByb21wdFN1Ym1pdCB3cmFwcyB0aGUgZW50aXJlIHR1cm4gaW5cbiAgICAgIC8vIHJ1bldpdGhXb3JrbG9hZCAoQXN5bmNMb2NhbFN0b3JhZ2UpLiBBTFMgY29udGV4dCBpcyBjYXB0dXJlZCBhdFxuICAgICAgLy8gaW52b2NhdGlvbiB0aW1lIOKAlCB3aGVuIHRoaXMgYHZvaWRgIGZpcmVzIOKAlCBhbmQgc3Vydml2ZXMgZXZlcnkgYXdhaXRcbiAgICAgIC8vIGluc2lkZS4gTm8gY2FwdHVyZS9yZXN0b3JlIG5lZWRlZDsgdGhlIGRldGFjaGVkIGNsb3N1cmUgc2VlcyB0aGVcbiAgICAgIC8vIHBhcmVudCB0dXJuJ3Mgd29ya2xvYWQgYXV0b21hdGljYWxseSwgaXNvbGF0ZWQgZnJvbSBpdHMgZmluYWxseS5cbiAgICAgIHZvaWQgcnVuV2l0aEFnZW50Q29udGV4dChhc3luY0FnZW50Q29udGV4dCwgKCkgPT5cbiAgICAgICAgd3JhcFdpdGhDd2QoKCkgPT5cbiAgICAgICAgICBydW5Bc3luY0FnZW50TGlmZWN5Y2xlKHtcbiAgICAgICAgICAgIHRhc2tJZDogYWdlbnRCYWNrZ3JvdW5kVGFzay5hZ2VudElkLFxuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyOiBhZ2VudEJhY2tncm91bmRUYXNrLmFib3J0Q29udHJvbGxlciEsXG4gICAgICAgICAgICBtYWtlU3RyZWFtOiBvbkNhY2hlU2FmZVBhcmFtcyA9PlxuICAgICAgICAgICAgICBydW5BZ2VudCh7XG4gICAgICAgICAgICAgICAgLi4ucnVuQWdlbnRQYXJhbXMsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnJ1bkFnZW50UGFyYW1zLm92ZXJyaWRlLFxuICAgICAgICAgICAgICAgICAgYWdlbnRJZDogYXNBZ2VudElkKGFnZW50QmFja2dyb3VuZFRhc2suYWdlbnRJZCksXG4gICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXI6IGFnZW50QmFja2dyb3VuZFRhc2suYWJvcnRDb250cm9sbGVyISxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uQ2FjaGVTYWZlUGFyYW1zLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0b29sVXNlQ29udGV4dCxcbiAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgIGFnZW50SWRGb3JDbGVhbnVwOiBhc3luY0FnZW50SWQsXG4gICAgICAgICAgICBlbmFibGVTdW1tYXJpemF0aW9uOlxuICAgICAgICAgICAgICBpc0Nvb3JkaW5hdG9yIHx8XG4gICAgICAgICAgICAgIGlzRm9ya1N1YmFnZW50RW5hYmxlZCgpIHx8XG4gICAgICAgICAgICAgIGdldFNka0FnZW50UHJvZ3Jlc3NTdW1tYXJpZXNFbmFibGVkKCksXG4gICAgICAgICAgICBnZXRXb3JrdHJlZVJlc3VsdDogY2xlYW51cFdvcmt0cmVlSWZOZWVkZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGNhblJlYWRPdXRwdXRGaWxlID0gdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scy5zb21lKFxuICAgICAgICB0ID0+XG4gICAgICAgICAgdG9vbE1hdGNoZXNOYW1lKHQsIEZJTEVfUkVBRF9UT09MX05BTUUpIHx8XG4gICAgICAgICAgdG9vbE1hdGNoZXNOYW1lKHQsIEJBU0hfVE9PTF9OQU1FKSxcbiAgICAgIClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpc0FzeW5jOiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgIHN0YXR1czogJ2FzeW5jX2xhdW5jaGVkJyBhcyBjb25zdCxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudEJhY2tncm91bmRUYXNrLmFnZW50SWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByb21wdDogcHJvbXB0LFxuICAgICAgICAgIG91dHB1dEZpbGU6IGdldFRhc2tPdXRwdXRQYXRoKGFnZW50QmFja2dyb3VuZFRhc2suYWdlbnRJZCksXG4gICAgICAgICAgY2FuUmVhZE91dHB1dEZpbGUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhbiBleHBsaWNpdCBhZ2VudElkIGZvciBzeW5jIGFnZW50c1xuICAgICAgY29uc3Qgc3luY0FnZW50SWQgPSBhc0FnZW50SWQoZWFybHlBZ2VudElkKVxuXG4gICAgICAvLyBTZXQgdXAgYWdlbnQgY29udGV4dCBmb3Igc3luYyBleGVjdXRpb24gKGZvciBhbmFseXRpY3MgYXR0cmlidXRpb24pXG4gICAgICBjb25zdCBzeW5jQWdlbnRDb250ZXh0ID0ge1xuICAgICAgICBhZ2VudElkOiBzeW5jQWdlbnRJZCxcbiAgICAgICAgLy8gRm9yIHN1YmFnZW50cyBmcm9tIHRlYW1tYXRlczogdXNlIHRlYW0gbGVhZCdzIHNlc3Npb25cbiAgICAgICAgLy8gRm9yIHN1YmFnZW50cyBmcm9tIG1haW4gUkVQTDogdW5kZWZpbmVkIChubyBwYXJlbnQgc2Vzc2lvbilcbiAgICAgICAgcGFyZW50U2Vzc2lvbklkOiBnZXRQYXJlbnRTZXNzaW9uSWQoKSxcbiAgICAgICAgYWdlbnRUeXBlOiAnc3ViYWdlbnQnIGFzIGNvbnN0LFxuICAgICAgICBzdWJhZ2VudE5hbWU6IHNlbGVjdGVkQWdlbnQuYWdlbnRUeXBlLFxuICAgICAgICBpc0J1aWx0SW46IGlzQnVpbHRJbkFnZW50KHNlbGVjdGVkQWdlbnQpLFxuICAgICAgICBpbnZva2luZ1JlcXVlc3RJZDogYXNzaXN0YW50TWVzc2FnZT8ucmVxdWVzdElkLFxuICAgICAgICBpbnZvY2F0aW9uS2luZDogJ3NwYXduJyBhcyBjb25zdCxcbiAgICAgICAgaW52b2NhdGlvbkVtaXR0ZWQ6IGZhbHNlLFxuICAgICAgfVxuXG4gICAgICAvLyBXcmFwIGVudGlyZSBzeW5jIGFnZW50IGV4ZWN1dGlvbiBpbiBjb250ZXh0IGZvciBhbmFseXRpY3MgYXR0cmlidXRpb25cbiAgICAgIC8vIGFuZCBvcHRpb25hbGx5IGluIGEgd29ya3RyZWUgY3dkIG92ZXJyaWRlIGZvciBmaWxlc3lzdGVtIGlzb2xhdGlvblxuICAgICAgcmV0dXJuIHJ1bldpdGhBZ2VudENvbnRleHQoc3luY0FnZW50Q29udGV4dCwgKCkgPT5cbiAgICAgICAgd3JhcFdpdGhDd2QoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFnZW50TWVzc2FnZXM6IE1lc3NhZ2VUeXBlW10gPSBbXVxuICAgICAgICAgIGNvbnN0IGFnZW50U3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgIGNvbnN0IHN5bmNUcmFja2VyID0gY3JlYXRlUHJvZ3Jlc3NUcmFja2VyKClcbiAgICAgICAgICBjb25zdCBzeW5jUmVzb2x2ZUFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvblJlc29sdmVyKFxuICAgICAgICAgICAgdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBZaWVsZCBpbml0aWFsIHByb2dyZXNzIG1lc3NhZ2UgdG8gY2FycnkgbWV0YWRhdGEgKHByb21wdClcbiAgICAgICAgICBpZiAocHJvbXB0TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFByb21wdE1lc3NhZ2VzID0gbm9ybWFsaXplTWVzc2FnZXMocHJvbXB0TWVzc2FnZXMpXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRmlyc3RNZXNzYWdlID0gbm9ybWFsaXplZFByb21wdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAgICAgICAgIChtKTogbSBpcyBOb3JtYWxpemVkVXNlck1lc3NhZ2UgPT4gbS50eXBlID09PSAndXNlcicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRGaXJzdE1lc3NhZ2UgJiZcbiAgICAgICAgICAgICAgbm9ybWFsaXplZEZpcnN0TWVzc2FnZS50eXBlID09PSAndXNlcicgJiZcbiAgICAgICAgICAgICAgb25Qcm9ncmVzc1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG9uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICAgIHRvb2xVc2VJRDogYGFnZW50XyR7YXNzaXN0YW50TWVzc2FnZS5tZXNzYWdlLmlkfWAsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbm9ybWFsaXplZEZpcnN0TWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdhZ2VudF9wcm9ncmVzcycsXG4gICAgICAgICAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgICAgICAgICBhZ2VudElkOiBzeW5jQWdlbnRJZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlZ2lzdGVyIGFzIGZvcmVncm91bmQgdGFzayBpbW1lZGlhdGVseSBzbyBpdCBjYW4gYmUgYmFja2dyb3VuZGVkIGF0IGFueSB0aW1lXG4gICAgICAgICAgLy8gU2tpcCByZWdpc3RyYXRpb24gaWYgYmFja2dyb3VuZCB0YXNrcyBhcmUgZGlzYWJsZWRcbiAgICAgICAgICBsZXQgZm9yZWdyb3VuZFRhc2tJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBiYWNrZ3JvdW5kIHJhY2UgcHJvbWlzZSBvbmNlIG91dHNpZGUgdGhlIGxvb3Ag4oCUIG90aGVyd2lzZVxuICAgICAgICAgIC8vIGVhY2ggaXRlcmF0aW9uIGFkZHMgYSBuZXcgLnRoZW4oKSByZWFjdGlvbiB0byB0aGUgc2FtZSBwZW5kaW5nXG4gICAgICAgICAgLy8gcHJvbWlzZSwgYWNjdW11bGF0aW5nIGNhbGxiYWNrcyBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhZ2VudC5cbiAgICAgICAgICBsZXQgYmFja2dyb3VuZFByb21pc2U6IFByb21pc2U8eyB0eXBlOiAnYmFja2dyb3VuZCcgfT4gfCB1bmRlZmluZWRcbiAgICAgICAgICBsZXQgY2FuY2VsQXV0b0JhY2tncm91bmQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICAgIGlmICghaXNCYWNrZ3JvdW5kVGFza3NEaXNhYmxlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJBZ2VudEZvcmVncm91bmQoe1xuICAgICAgICAgICAgICBhZ2VudElkOiBzeW5jQWdlbnRJZCxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRBZ2VudCxcbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgIGF1dG9CYWNrZ3JvdW5kTXM6IGdldEF1dG9CYWNrZ3JvdW5kTXMoKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZm9yZWdyb3VuZFRhc2tJZCA9IHJlZ2lzdHJhdGlvbi50YXNrSWRcbiAgICAgICAgICAgIGJhY2tncm91bmRQcm9taXNlID0gcmVnaXN0cmF0aW9uLmJhY2tncm91bmRTaWduYWwudGhlbigoKSA9PiAoe1xuICAgICAgICAgICAgICB0eXBlOiAnYmFja2dyb3VuZCcgYXMgY29uc3QsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIGNhbmNlbEF1dG9CYWNrZ3JvdW5kID0gcmVnaXN0cmF0aW9uLmNhbmNlbEF1dG9CYWNrZ3JvdW5kXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVHJhY2sgaWYgd2UndmUgc2hvd24gdGhlIGJhY2tncm91bmQgaGludCBVSVxuICAgICAgICAgIGxldCBiYWNrZ3JvdW5kSGludFNob3duID0gZmFsc2VcbiAgICAgICAgICAvLyBUcmFjayBpZiB0aGUgYWdlbnQgd2FzIGJhY2tncm91bmRlZCAoY2xlYW51cCBoYW5kbGVkIGJ5IGJhY2tncm91bmRlZCBmaW5hbGx5KVxuICAgICAgICAgIGxldCB3YXNCYWNrZ3JvdW5kZWQgPSBmYWxzZVxuICAgICAgICAgIC8vIFBlci1zY29wZSBzdG9wIGZ1bmN0aW9uIOKAlCBOT1Qgc2hhcmVkIHdpdGggdGhlIGJhY2tncm91bmRlZCBjbG9zdXJlLlxuICAgICAgICAgIC8vIGlkZW1wb3RlbnQ6IHN0YXJ0QWdlbnRTdW1tYXJpemF0aW9uJ3Mgc3RvcCgpIGNoZWNrcyBgc3RvcHBlZGAgZmxhZy5cbiAgICAgICAgICBsZXQgc3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgICAgICAgICAvLyBjb25zdCBjYXB0dXJlIGZvciBzb3VuZCB0eXBlIG5hcnJvd2luZyBpbnNpZGUgdGhlIGNhbGxiYWNrIGJlbG93XG4gICAgICAgICAgY29uc3Qgc3VtbWFyeVRhc2tJZCA9IGZvcmVncm91bmRUYXNrSWRcblxuICAgICAgICAgIC8vIEdldCBhc3luYyBpdGVyYXRvciBmb3IgdGhlIGFnZW50XG4gICAgICAgICAgY29uc3QgYWdlbnRJdGVyYXRvciA9IHJ1bkFnZW50KHtcbiAgICAgICAgICAgIC4uLnJ1bkFnZW50UGFyYW1zLFxuICAgICAgICAgICAgb3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgLi4ucnVuQWdlbnRQYXJhbXMub3ZlcnJpZGUsXG4gICAgICAgICAgICAgIGFnZW50SWQ6IHN5bmNBZ2VudElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2FjaGVTYWZlUGFyYW1zOlxuICAgICAgICAgICAgICBzdW1tYXJ5VGFza0lkICYmIGdldFNka0FnZW50UHJvZ3Jlc3NTdW1tYXJpZXNFbmFibGVkKClcbiAgICAgICAgICAgICAgICA/IChwYXJhbXM6IENhY2hlU2FmZVBhcmFtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHN0b3AgfSA9IHN0YXJ0QWdlbnRTdW1tYXJpemF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUYXNrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3luY0FnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBzdG9wRm9yZWdyb3VuZFN1bW1hcml6YXRpb24gPSBzdG9wXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcblxuICAgICAgICAgIC8vIFRyYWNrIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBpdGVyYXRpb25cbiAgICAgICAgICBsZXQgc3luY0FnZW50RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkXG4gICAgICAgICAgbGV0IHdhc0Fib3J0ZWQgPSBmYWxzZVxuICAgICAgICAgIGxldCB3b3JrdHJlZVJlc3VsdDoge1xuICAgICAgICAgICAgd29ya3RyZWVQYXRoPzogc3RyaW5nXG4gICAgICAgICAgICB3b3JrdHJlZUJyYW5jaD86IHN0cmluZ1xuICAgICAgICAgIH0gPSB7fVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gYWdlbnRTdGFydFRpbWVcblxuICAgICAgICAgICAgICAvLyBTaG93IGJhY2tncm91bmQgaGludCBhZnRlciB0aHJlc2hvbGQgKGJ1dCB0YXNrIGlzIGFscmVhZHkgcmVnaXN0ZXJlZClcbiAgICAgICAgICAgICAgLy8gU2tpcCBpZiBiYWNrZ3JvdW5kIHRhc2tzIGFyZSBkaXNhYmxlZFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAhYmFja2dyb3VuZEhpbnRTaG93biAmJlxuICAgICAgICAgICAgICAgIGVsYXBzZWQgPj0gUFJPR1JFU1NfVEhSRVNIT0xEX01TICYmXG4gICAgICAgICAgICAgICAgdG9vbFVzZUNvbnRleHQuc2V0VG9vbEpTWFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGludFNob3duID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0LnNldFRvb2xKU1goe1xuICAgICAgICAgICAgICAgICAganN4OiA8QmFja2dyb3VuZEhpbnQgLz4sXG4gICAgICAgICAgICAgICAgICBzaG91bGRIaWRlUHJvbXB0SW5wdXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgc2hvdWxkQ29udGludWVBbmltYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICBzaG93U3Bpbm5lcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmFjZSBiZXR3ZWVuIG5leHQgbWVzc2FnZSBhbmQgYmFja2dyb3VuZCBzaWduYWxcbiAgICAgICAgICAgICAgLy8gSWYgYmFja2dyb3VuZCB0YXNrcyBhcmUgZGlzYWJsZWQsIGp1c3QgYXdhaXQgdGhlIG5leHQgbWVzc2FnZSBkaXJlY3RseVxuICAgICAgICAgICAgICBjb25zdCBuZXh0TWVzc2FnZVByb21pc2UgPSBhZ2VudEl0ZXJhdG9yLm5leHQoKVxuICAgICAgICAgICAgICBjb25zdCByYWNlUmVzdWx0ID0gYmFja2dyb3VuZFByb21pc2VcbiAgICAgICAgICAgICAgICA/IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIG5leHRNZXNzYWdlUHJvbWlzZS50aGVuKHIgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWVzc2FnZScgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQcm9taXNlLFxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21lc3NhZ2UnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG5leHRNZXNzYWdlUHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSB3ZXJlIGJhY2tncm91bmRlZCB2aWEgYmFja2dyb3VuZEFsbCgpXG4gICAgICAgICAgICAgIC8vIGZvcmVncm91bmRUYXNrSWQgaXMgZ3VhcmFudGVlZCB0byBiZSBkZWZpbmVkIGlmIHJhY2VSZXN1bHQudHlwZSBpcyAnYmFja2dyb3VuZCdcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSBiYWNrZ3JvdW5kUHJvbWlzZSBpcyBvbmx5IGRlZmluZWQgd2hlbiBmb3JlZ3JvdW5kVGFza0lkIGlzIGRlZmluZWRcbiAgICAgICAgICAgICAgaWYgKHJhY2VSZXN1bHQudHlwZSA9PT0gJ2JhY2tncm91bmQnICYmIGZvcmVncm91bmRUYXNrSWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IHRvb2xVc2VDb250ZXh0LmdldEFwcFN0YXRlKClcbiAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gYXBwU3RhdGUudGFza3NbZm9yZWdyb3VuZFRhc2tJZF1cbiAgICAgICAgICAgICAgICBpZiAoaXNMb2NhbEFnZW50VGFzayh0YXNrKSAmJiB0YXNrLmlzQmFja2dyb3VuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIHRoZSB0YXNrSWQgZm9yIHVzZSBpbiB0aGUgYXN5bmMgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRlZFRhc2tJZCA9IGZvcmVncm91bmRUYXNrSWRcbiAgICAgICAgICAgICAgICAgIHdhc0JhY2tncm91bmRlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0b3AgZm9yZWdyb3VuZCBzdW1tYXJpemF0aW9uOyB0aGUgYmFja2dyb3VuZGVkIGNsb3N1cmVcbiAgICAgICAgICAgICAgICAgIC8vIGJlbG93IG93bnMgaXRzIG93biBpbmRlcGVuZGVudCBzdG9wIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgICAgc3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uPy4oKVxuXG4gICAgICAgICAgICAgICAgICAvLyBXb3JrbG9hZDogaW5oZXJpdGVkIHZpYSBBTFMgYXQgYHZvaWRgIGludm9jYXRpb24gdGltZSxcbiAgICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgdGhlIGFzeW5jLWZyb20tc3RhcnQgcGF0aCBhYm92ZS5cbiAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGFnZW50IGluIGJhY2tncm91bmQgYW5kIHJldHVybiBhc3luYyByZXN1bHRcbiAgICAgICAgICAgICAgICAgIHZvaWQgcnVuV2l0aEFnZW50Q29udGV4dChzeW5jQWdlbnRDb250ZXh0LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdG9wQmFja2dyb3VuZGVkU3VtbWFyaXphdGlvbjogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGZvcmVncm91bmQgaXRlcmF0b3Igc28gaXRzIGZpbmFsbHkgYmxvY2sgcnVuc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChyZWxlYXNlcyBNQ1AgY29ubmVjdGlvbnMsIHNlc3Npb24gaG9va3MsIHByb21wdCBjYWNoZSB0cmFja2luZywgZXRjLilcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaW1lb3V0IHByZXZlbnRzIGJsb2NraW5nIGlmIE1DUCBzZXJ2ZXIgY2xlYW51cCBoYW5ncy5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAuY2F0Y2goKSBwcmV2ZW50cyB1bmhhbmRsZWQgcmVqZWN0aW9uIGlmIHRpbWVvdXQgd2lucyB0aGUgcmFjZS5cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRJdGVyYXRvci5yZXR1cm4odW5kZWZpbmVkKS5jYXRjaCgoKSA9PiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxMDAwKSxcbiAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcHJvZ3Jlc3MgdHJhY2tpbmcgZnJvbSBleGlzdGluZyBtZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNrZXIgPSBjcmVhdGVQcm9ncmVzc1RyYWNrZXIoKVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVBY3Rpdml0eTIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvblJlc29sdmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLnRvb2xzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXhpc3RpbmdNc2cgb2YgYWdlbnRNZXNzYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NGcm9tTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdNc2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBY3Rpdml0eTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMudG9vbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbXNnIG9mIHJ1bkFnZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJ1bkFnZW50UGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBc3luYzogdHJ1ZSwgLy8gQWdlbnQgaXMgbm93IHJ1bm5pbmcgaW4gYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucnVuQWdlbnRQYXJhbXMub3ZlcnJpZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50SWQ6IGFzQWdlbnRJZChiYWNrZ3JvdW5kZWRUYXNrSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXI6IHRhc2suYWJvcnRDb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FjaGVTYWZlUGFyYW1zOiBnZXRTZGtBZ2VudFByb2dyZXNzU3VtbWFyaWVzRW5hYmxlZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gKHBhcmFtczogQ2FjaGVTYWZlUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHN0b3AgfSA9IHN0YXJ0QWdlbnRTdW1tYXJpemF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kZWRUYXNrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzQWdlbnRJZChiYWNrZ3JvdW5kZWRUYXNrSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCYWNrZ3JvdW5kZWRTdW1tYXJpemF0aW9uID0gc3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50TWVzc2FnZXMucHVzaChtc2cpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHByb2dyZXNzIGZvciBiYWNrZ3JvdW5kZWQgYWdlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9ncmVzc0Zyb21NZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBY3Rpdml0eTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMudG9vbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBc3luY0FnZW50UHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvZ3Jlc3NVcGRhdGUodHJhY2tlciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdFRvb2xOYW1lID0gZ2V0TGFzdFRvb2xVc2VOYW1lKG1zZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VG9vbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdFRhc2tQcm9ncmVzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RUb29sTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZ2VudFJlc3VsdCA9IGZpbmFsaXplQWdlbnRUb29sKFxuICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGFzayBjb21wbGV0ZWQgRklSU1Qgc28gVGFza091dHB1dChibG9jaz10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYmxvY2tzIGltbWVkaWF0ZWx5LiBjbGFzc2lmeUhhbmRvZmZJZk5lZWRlZCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCBjYW4gaGFuZyDigJQgdGhleSBtdXN0IG5vdCBnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXR1cyB0cmFuc2l0aW9uIChnaC0yMDIzNikuXG4gICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVBc3luY0FnZW50KGFnZW50UmVzdWx0LCByb290U2V0QXBwU3RhdGUpXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRleHQgZnJvbSBhZ2VudCByZXN1bHQgY29udGVudCBmb3IgdGhlIG5vdGlmaWNhdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbE1lc3NhZ2UgPSBleHRyYWN0VGV4dENvbnRlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBhZ2VudFJlc3VsdC5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicsXG4gICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUoJ1RSQU5TQ1JJUFRfQ0xBU1NJRklFUicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kZWRBcHBTdGF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0LmdldEFwcFN0YXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRvZmZXYXJuaW5nID0gYXdhaXQgY2xhc3NpZnlIYW5kb2ZmSWZOZWVkZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VudE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sczogdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFBlcm1pc3Npb25Db250ZXh0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZEFwcFN0YXRlLnRvb2xQZXJtaXNzaW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IHRhc2suYWJvcnRDb250cm9sbGVyIS5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmFnZW50VHlwZTogc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVG9vbFVzZUNvdW50OiBhZ2VudFJlc3VsdC50b3RhbFRvb2xVc2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZG9mZldhcm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxNZXNzYWdlID0gYCR7aGFuZG9mZldhcm5pbmd9XFxuXFxuJHtmaW5hbE1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHdvcmt0cmVlIGJlZm9yZSBub3RpZmljYXRpb24gc28gd2UgY2FuIGluY2x1ZGUgaXRcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrdHJlZVJlc3VsdCA9IGF3YWl0IGNsZWFudXBXb3JrdHJlZUlmTmVlZGVkKClcblxuICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVBZ2VudE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrSWQ6IGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlOiByb290U2V0QXBwU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRva2VuczogZ2V0VG9rZW5Db3VudEZyb21UcmFja2VyKHRyYWNrZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlczogYWdlbnRSZXN1bHQudG90YWxUb29sVXNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGFnZW50UmVzdWx0LnRvdGFsRHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VDb250ZXh0LnRvb2xVc2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLndvcmt0cmVlUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWJvcnRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBzdGF0dXMgQkVGT1JFIHdvcmt0cmVlIGNsZWFudXAgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2tPdXRwdXQgdW5ibG9ja3MgZXZlbiBpZiBnaXQgaGFuZ3MgKGdoLTIwMjM2KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxBc3luY0FnZW50KGJhY2tncm91bmRlZFRhc2tJZCwgcm9vdFNldEFwcFN0YXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2FnZW50X3Rvb2xfdGVybWluYXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRfdHlwZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucmVzb2x2ZWRBZ2VudE1vZGVsIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX21zOiBEYXRlLm5vdygpIC0gbWV0YWRhdGEuc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc19hc3luYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYnVpbHRfaW5fYWdlbnQ6IG1ldGFkYXRhLmlzQnVpbHRJbkFnZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJfY2FuY2VsX2JhY2tncm91bmQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya3RyZWVSZXN1bHQgPSBhd2FpdCBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aWFsUmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFBhcnRpYWxSZXN1bHQoYWdlbnRNZXNzYWdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVBZ2VudE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tJZDogYmFja2dyb3VuZGVkVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAna2lsbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsTWVzc2FnZTogcGFydGlhbFJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ud29ya3RyZWVSZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICBmYWlsQXN5bmNBZ2VudChcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya3RyZWVSZXN1bHQgPSBhd2FpdCBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCgpXG4gICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZUFnZW50Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tJZDogYmFja2dyb3VuZGVkVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyck1zZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlOiByb290U2V0QXBwU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VDb250ZXh0LnRvb2xVc2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLndvcmt0cmVlUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RvcEJhY2tncm91bmRlZFN1bW1hcml6YXRpb24/LigpXG4gICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnZva2VkU2tpbGxzRm9yQWdlbnQoc3luY0FnZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgY2xlYXJEdW1wU3RhdGUoc3luY0FnZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd29ya3RyZWUgY2xlYW51cCBpcyBkb25lIGJlZm9yZSBlbnF1ZXVlQWdlbnROb3RpZmljYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBib3RoIHRyeSBhbmQgY2F0Y2ggcGF0aHMgc28gd2UgY2FuIGluY2x1ZGUgd29ya3RyZWUgaW5mb1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYXN5bmNfbGF1bmNoZWQgcmVzdWx0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYW5SZWFkT3V0cHV0RmlsZSA9IHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMudG9vbHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgdCA9PlxuICAgICAgICAgICAgICAgICAgICAgIHRvb2xNYXRjaGVzTmFtZSh0LCBGSUxFX1JFQURfVE9PTF9OQU1FKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHRvb2xNYXRjaGVzTmFtZSh0LCBCQVNIX1RPT0xfTkFNRSksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXNBc3luYzogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdhc3luY19sYXVuY2hlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgYWdlbnRJZDogYmFja2dyb3VuZGVkVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlOiBnZXRUYXNrT3V0cHV0UGF0aChiYWNrZ3JvdW5kZWRUYXNrSWQpLFxuICAgICAgICAgICAgICAgICAgICAgIGNhblJlYWRPdXRwdXRGaWxlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcmFjZSByZXN1bHRcbiAgICAgICAgICAgICAgaWYgKHJhY2VSZXN1bHQudHlwZSAhPT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIC0gYmFja2dyb3VuZCBjYXNlIGhhbmRsZWQgYWJvdmVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByYWNlUmVzdWx0XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgYnJlYWtcbiAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3VsdC52YWx1ZVxuXG4gICAgICAgICAgICAgIGFnZW50TWVzc2FnZXMucHVzaChtZXNzYWdlKVxuXG4gICAgICAgICAgICAgIC8vIEVtaXQgdGFza19wcm9ncmVzcyBmb3IgdGhlIFZTIENvZGUgc3ViYWdlbnQgcGFuZWxcbiAgICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NGcm9tTWVzc2FnZShcbiAgICAgICAgICAgICAgICBzeW5jVHJhY2tlcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIHN5bmNSZXNvbHZlQWN0aXZpdHksXG4gICAgICAgICAgICAgICAgdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAoZm9yZWdyb3VuZFRhc2tJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RUb29sTmFtZSA9IGdldExhc3RUb29sVXNlTmFtZShtZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChsYXN0VG9vbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIGVtaXRUYXNrUHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgICAgIHN5bmNUcmFja2VyLFxuICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLy8gS2VlcCBBcHBTdGF0ZSB0YXNrLnByb2dyZXNzIGluIHN5bmMgd2hlbiBTREsgc3VtbWFyaWVzIGFyZVxuICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgc28gdXBkYXRlQWdlbnRTdW1tYXJ5IHJlYWRzIGNvcnJlY3QgdG9rZW4vdG9vbCBjb3VudHNcbiAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgemVyb3MuXG4gICAgICAgICAgICAgICAgICBpZiAoZ2V0U2RrQWdlbnRQcm9ncmVzc1N1bW1hcmllc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVBc3luY0FnZW50UHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgZm9yZWdyb3VuZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9ncmVzc1VwZGF0ZShzeW5jVHJhY2tlciksXG4gICAgICAgICAgICAgICAgICAgICAgcm9vdFNldEFwcFN0YXRlLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gRm9yd2FyZCBiYXNoX3Byb2dyZXNzIGV2ZW50cyBmcm9tIHN1Yi1hZ2VudCB0byBwYXJlbnQgc28gdGhlIFNES1xuICAgICAgICAgICAgICAvLyByZWNlaXZlcyB0b29sX3Byb2dyZXNzIGV2ZW50cyBqdXN0IGFzIGl0IGRvZXMgZm9yIHRoZSBtYWluIGFnZW50LlxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID09PSAncHJvZ3Jlc3MnICYmXG4gICAgICAgICAgICAgICAgKG1lc3NhZ2UuZGF0YS50eXBlID09PSAnYmFzaF9wcm9ncmVzcycgfHxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS50eXBlID09PSAncG93ZXJzaGVsbF9wcm9ncmVzcycpICYmXG4gICAgICAgICAgICAgICAgb25Qcm9ncmVzc1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgICAgIHRvb2xVc2VJRDogbWVzc2FnZS50b29sVXNlSUQsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBtZXNzYWdlLmRhdGEsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UudHlwZSAhPT0gJ3VzZXInKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEluY3JlbWVudCB0b2tlbiBjb3VudCBpbiBzcGlubmVyIGZvciBhc3Npc3RhbnQgbWVzc2FnZXNcbiAgICAgICAgICAgICAgLy8gU3ViYWdlbnQgc3RyZWFtaW5nIGV2ZW50cyBhcmUgZmlsdGVyZWQgb3V0IGluIHJ1bkFnZW50LnRzLCBzbyB3ZVxuICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNvdW50IHRva2VucyBmcm9tIGNvbXBsZXRlZCBtZXNzYWdlcyBoZXJlXG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGdldEFzc2lzdGFudE1lc3NhZ2VDb250ZW50TGVuZ3RoKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC5zZXRSZXNwb25zZUxlbmd0aChsZW4gPT4gbGVuICsgY29udGVudExlbmd0aClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkTmV3ID0gbm9ybWFsaXplTWVzc2FnZXMoW21lc3NhZ2VdKVxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2Ygbm9ybWFsaXplZE5ldykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udGVudCBvZiBtLm1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnR5cGUgIT09ICd0b29sX3VzZScgJiZcbiAgICAgICAgICAgICAgICAgICAgY29udGVudC50eXBlICE9PSAndG9vbF9yZXN1bHQnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gRm9yd2FyZCBwcm9ncmVzcyB1cGRhdGVzXG4gICAgICAgICAgICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlSUQ6IGBhZ2VudF8ke2Fzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZH1gLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYWdlbnRfcHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvbXB0IG9ubHkgbmVlZGVkIG9uIGZpcnN0IHByb2dyZXNzIG1lc3NhZ2UgKFVJLnRzeDo2MjRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWRzIHByb2dyZXNzTWVzc2FnZXNbMF0pLiBPbWl0IGhlcmUgdG8gYXZvaWQgZHVwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRJZDogc3luY0FnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBmcm9tIHRoZSBzeW5jIGFnZW50IGxvb3BcbiAgICAgICAgICAgIC8vIEFib3J0RXJyb3Igc2hvdWxkIGJlIHJlLXRocm93biBmb3IgcHJvcGVyIGludGVycnVwdGlvbiBoYW5kbGluZ1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWJvcnRFcnJvcikge1xuICAgICAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZVxuICAgICAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfYWdlbnRfdG9vbF90ZXJtaW5hdGVkJywge1xuICAgICAgICAgICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgICAgICBtb2RlbDpcbiAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlc29sdmVkQWdlbnRNb2RlbCBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uX21zOiBEYXRlLm5vdygpIC0gbWV0YWRhdGEuc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIGlzX2FzeW5jOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc19idWlsdF9pbl9hZ2VudDogbWV0YWRhdGEuaXNCdWlsdEluQWdlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAgICAgJ3VzZXJfY2FuY2VsX3N5bmMnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgZm9yIGRlYnVnZ2luZ1xuICAgICAgICAgICAgbG9nRm9yRGVidWdnaW5nKGBTeW5jIGFnZW50IGVycm9yOiAke2Vycm9yTWVzc2FnZShlcnJvcil9YCwge1xuICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBlcnJvciB0byBoYW5kbGUgYWZ0ZXIgY2xlYW51cFxuICAgICAgICAgICAgc3luY0FnZW50RXJyb3IgPSB0b0Vycm9yKGVycm9yKVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgYmFja2dyb3VuZCBoaW50IFVJXG4gICAgICAgICAgICBpZiAodG9vbFVzZUNvbnRleHQuc2V0VG9vbEpTWCkge1xuICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC5zZXRUb29sSlNYKG51bGwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0b3AgZm9yZWdyb3VuZCBzdW1tYXJpemF0aW9uLiBJZGVtcG90ZW50IOKAlCBpZiBhbHJlYWR5IHN0b3BwZWQgYXRcbiAgICAgICAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kaW5nIHRyYW5zaXRpb24sIHRoaXMgaXMgYSBuby1vcC4gVGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgLy8gY2xvc3VyZSBvd25zIGEgc2VwYXJhdGUgc3RvcCBmdW5jdGlvbiAoc3RvcEJhY2tncm91bmRlZFN1bW1hcml6YXRpb24pLlxuICAgICAgICAgICAgc3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uPy4oKVxuXG4gICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGZvcmVncm91bmQgdGFzayBpZiBhZ2VudCBjb21wbGV0ZWQgd2l0aG91dCBiZWluZyBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgIGlmIChmb3JlZ3JvdW5kVGFza0lkKSB7XG4gICAgICAgICAgICAgIHVucmVnaXN0ZXJBZ2VudEZvcmVncm91bmQoZm9yZWdyb3VuZFRhc2tJZCwgcm9vdFNldEFwcFN0YXRlKVxuICAgICAgICAgICAgICAvLyBOb3RpZnkgU0RLIGNvbnN1bWVycyAoZS5nLiBWUyBDb2RlIHN1YmFnZW50IHBhbmVsKSB0aGF0IHRoaXNcbiAgICAgICAgICAgICAgLy8gZm9yZWdyb3VuZCBhZ2VudCBpcyBkb25lLiBHb2VzIHRocm91Z2ggZHJhaW5TZGtFdmVudHMoKSDigJQgZG9lc1xuICAgICAgICAgICAgICAvLyBOT1QgdHJpZ2dlciB0aGUgcHJpbnQudHMgWE1MIHRhc2tfbm90aWZpY2F0aW9uIHBhcnNlciBvciB0aGUgTExNIGxvb3AuXG4gICAgICAgICAgICAgIGlmICghd2FzQmFja2dyb3VuZGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBnZXRQcm9ncmVzc1VwZGF0ZShzeW5jVHJhY2tlcilcbiAgICAgICAgICAgICAgICBlbnF1ZXVlU2RrRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N5c3RlbScsXG4gICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndGFza19ub3RpZmljYXRpb24nLFxuICAgICAgICAgICAgICAgICAgdGFza19pZDogZm9yZWdyb3VuZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xfdXNlX2lkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IHN5bmNBZ2VudEVycm9yXG4gICAgICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgOiB3YXNBYm9ydGVkXG4gICAgICAgICAgICAgICAgICAgICAgPyAnc3RvcHBlZCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGU6ICcnLFxuICAgICAgICAgICAgICAgICAgc3VtbWFyeTogZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbF90b2tlbnM6IHByb2dyZXNzLnRva2VuQ291bnQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xfdXNlczogcHJvZ3Jlc3MudG9vbFVzZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9tczogRGF0ZS5ub3coKSAtIGFnZW50U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHNjb3BlZCBza2lsbHMgc28gdGhleSBkb24ndCBhY2N1bXVsYXRlIGluIHRoZSBnbG9iYWwgbWFwXG4gICAgICAgICAgICBjbGVhckludm9rZWRTa2lsbHNGb3JBZ2VudChzeW5jQWdlbnRJZClcblxuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZHVtcFN0YXRlIGVudHJ5IGZvciB0aGlzIGFnZW50IHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBiYWNrZ3JvdW5kZWQg4oCUIHRoZSBiYWNrZ3JvdW5kZWQgYWdlbnQncyBmaW5hbGx5IGhhbmRsZXMgY2xlYW51cFxuICAgICAgICAgICAgaWYgKCF3YXNCYWNrZ3JvdW5kZWQpIHtcbiAgICAgICAgICAgICAgY2xlYXJEdW1wU3RhdGUoc3luY0FnZW50SWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhbmNlbCBhdXRvLWJhY2tncm91bmQgdGltZXIgaWYgYWdlbnQgY29tcGxldGVkIGJlZm9yZSBpdCBmaXJlZFxuICAgICAgICAgICAgY2FuY2VsQXV0b0JhY2tncm91bmQ/LigpXG5cbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHdvcmt0cmVlIGlmIGFwcGxpY2FibGUgKGluIGZpbmFsbHkgdG8gaGFuZGxlIGFib3J0L2Vycm9yIHBhdGhzKVxuICAgICAgICAgICAgLy8gU2tpcCBpZiBiYWNrZ3JvdW5kZWQg4oCUIHRoZSBiYWNrZ3JvdW5kIGNvbnRpbnVhdGlvbiBpcyBzdGlsbCBydW5uaW5nIGluIGl0XG4gICAgICAgICAgICBpZiAoIXdhc0JhY2tncm91bmRlZCkge1xuICAgICAgICAgICAgICB3b3JrdHJlZVJlc3VsdCA9IGF3YWl0IGNsZWFudXBXb3JrdHJlZUlmTmVlZGVkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZS10aHJvdyBhYm9ydCBlcnJvcnNcbiAgICAgICAgICAvLyBUT0RPOiBGaW5kIGEgY2xlYW5lciB3YXkgdG8gZXhwcmVzcyB0aGlzXG4gICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBhZ2VudE1lc3NhZ2VzLmZpbmRMYXN0KFxuICAgICAgICAgICAgXyA9PiBfLnR5cGUgIT09ICdzeXN0ZW0nICYmIF8udHlwZSAhPT0gJ3Byb2dyZXNzJyxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKGxhc3RNZXNzYWdlICYmIGlzU3ludGhldGljTWVzc2FnZShsYXN0TWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9hZ2VudF90b29sX3Rlcm1pbmF0ZWQnLCB7XG4gICAgICAgICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEuYWdlbnRUeXBlIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgIG1vZGVsOlxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlc29sdmVkQWdlbnRNb2RlbCBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgICAgICBkdXJhdGlvbl9tczogRGF0ZS5ub3coKSAtIG1ldGFkYXRhLnN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgaXNfYXN5bmM6IGZhbHNlLFxuICAgICAgICAgICAgICBpc19idWlsdF9pbl9hZ2VudDogbWV0YWRhdGEuaXNCdWlsdEluQWdlbnQsXG4gICAgICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICAgICAndXNlcl9jYW5jZWxfc3luYycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGl0ZXJhdGlvbiwgdHJ5IHRvIHJldHVybiBhIHJlc3VsdCB3aXRoXG4gICAgICAgICAgLy8gd2hhdGV2ZXIgbWVzc2FnZXMgd2UgaGF2ZS4gSWYgd2UgaGF2ZSBubyBhc3Npc3RhbnQgbWVzc2FnZXMsXG4gICAgICAgICAgLy8gcmUtdGhyb3cgdGhlIGVycm9yIHNvIGl0J3MgcHJvcGVybHkgaGFuZGxlZCBieSB0aGUgdG9vbCBmcmFtZXdvcmsuXG4gICAgICAgICAgaWYgKHN5bmNBZ2VudEVycm9yKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFueSBhc3Npc3RhbnQgbWVzc2FnZXMgdG8gcmV0dXJuXG4gICAgICAgICAgICBjb25zdCBoYXNBc3Npc3RhbnRNZXNzYWdlcyA9IGFnZW50TWVzc2FnZXMuc29tZShcbiAgICAgICAgICAgICAgbXNnID0+IG1zZy50eXBlID09PSAnYXNzaXN0YW50JyxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKCFoYXNBc3Npc3RhbnRNZXNzYWdlcykge1xuICAgICAgICAgICAgICAvLyBObyBtZXNzYWdlcyBjb2xsZWN0ZWQsIHJlLXRocm93IHRoZSBlcnJvclxuICAgICAgICAgICAgICB0aHJvdyBzeW5jQWdlbnRFcnJvclxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWUgbWVzc2FnZXMsIHRyeSB0byBmaW5hbGl6ZSBhbmQgcmV0dXJuIHRoZW1cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBwYXJlbnQgYWdlbnQgdG8gc2VlIHBhcnRpYWwgcHJvZ3Jlc3MgZXZlbiBhZnRlciBhbiBlcnJvclxuICAgICAgICAgICAgbG9nRm9yRGVidWdnaW5nKFxuICAgICAgICAgICAgICBgU3luYyBhZ2VudCByZWNvdmVyaW5nIGZyb20gZXJyb3Igd2l0aCAke2FnZW50TWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlc2AsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYWdlbnRSZXN1bHQgPSBmaW5hbGl6ZUFnZW50VG9vbChcbiAgICAgICAgICAgIGFnZW50TWVzc2FnZXMsXG4gICAgICAgICAgICBzeW5jQWdlbnRJZCxcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGlmIChmZWF0dXJlKCdUUkFOU0NSSVBUX0NMQVNTSUZJRVInKSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEFwcFN0YXRlID0gdG9vbFVzZUNvbnRleHQuZ2V0QXBwU3RhdGUoKVxuICAgICAgICAgICAgY29uc3QgaGFuZG9mZldhcm5pbmcgPSBhd2FpdCBjbGFzc2lmeUhhbmRvZmZJZk5lZWRlZCh7XG4gICAgICAgICAgICAgIGFnZW50TWVzc2FnZXMsXG4gICAgICAgICAgICAgIHRvb2xzOiB0b29sVXNlQ29udGV4dC5vcHRpb25zLnRvb2xzLFxuICAgICAgICAgICAgICB0b29sUGVybWlzc2lvbkNvbnRleHQ6IGN1cnJlbnRBcHBTdGF0ZS50b29sUGVybWlzc2lvbkNvbnRleHQsXG4gICAgICAgICAgICAgIGFib3J0U2lnbmFsOiB0b29sVXNlQ29udGV4dC5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBzdWJhZ2VudFR5cGU6IHNlbGVjdGVkQWdlbnQuYWdlbnRUeXBlLFxuICAgICAgICAgICAgICB0b3RhbFRvb2xVc2VDb3VudDogYWdlbnRSZXN1bHQudG90YWxUb29sVXNlQ291bnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKGhhbmRvZmZXYXJuaW5nKSB7XG4gICAgICAgICAgICAgIGFnZW50UmVzdWx0LmNvbnRlbnQgPSBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAndGV4dCcgYXMgY29uc3QsIHRleHQ6IGhhbmRvZmZXYXJuaW5nIH0sXG4gICAgICAgICAgICAgICAgLi4uYWdlbnRSZXN1bHQuY29udGVudCxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICAgICAgLi4uYWdlbnRSZXN1bHQsXG4gICAgICAgICAgICAgIC4uLndvcmt0cmVlUmVzdWx0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cbiAgfSxcbiAgaXNSZWFkT25seSgpIHtcbiAgICByZXR1cm4gdHJ1ZSAvLyBkZWxlZ2F0ZXMgcGVybWlzc2lvbiBjaGVja3MgdG8gaXRzIHVuZGVybHlpbmcgdG9vbHNcbiAgfSxcbiAgdG9BdXRvQ2xhc3NpZmllcklucHV0KGlucHV0KSB7XG4gICAgY29uc3QgaSA9IGlucHV0IGFzIEFnZW50VG9vbElucHV0XG4gICAgY29uc3QgdGFncyA9IFtcbiAgICAgIGkuc3ViYWdlbnRfdHlwZSxcbiAgICAgIGkubW9kZSA/IGBtb2RlPSR7aS5tb2RlfWAgOiB1bmRlZmluZWQsXG4gICAgXS5maWx0ZXIoKHQpOiB0IGlzIHN0cmluZyA9PiB0ICE9PSB1bmRlZmluZWQpXG4gICAgY29uc3QgcHJlZml4ID0gdGFncy5sZW5ndGggPiAwID8gYCgke3RhZ3Muam9pbignLCAnKX0pOiBgIDogJzogJ1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtpLnByb21wdH1gXG4gIH0sXG4gIGlzQ29uY3VycmVuY3lTYWZlKCkge1xuICAgIHJldHVybiB0cnVlXG4gIH0sXG4gIHVzZXJGYWNpbmdOYW1lLFxuICB1c2VyRmFjaW5nTmFtZUJhY2tncm91bmRDb2xvcixcbiAgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbihpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dD8uZGVzY3JpcHRpb24gPz8gJ1J1bm5pbmcgdGFzaydcbiAgfSxcbiAgYXN5bmMgY2hlY2tQZXJtaXNzaW9ucyhpbnB1dCwgY29udGV4dCk6IFByb21pc2U8UGVybWlzc2lvblJlc3VsdD4ge1xuICAgIGNvbnN0IGFwcFN0YXRlID0gY29udGV4dC5nZXRBcHBTdGF0ZSgpXG5cbiAgICAvLyBPbmx5IHJvdXRlIHRocm91Z2ggYXV0byBtb2RlIGNsYXNzaWZpZXIgd2hlbiBpbiBhdXRvIG1vZGVcbiAgICAvLyBJbiBhbGwgb3RoZXIgbW9kZXMsIGF1dG8tYXBwcm92ZSBzdWItYWdlbnQgZ2VuZXJhdGlvblxuICAgIC8vIE5vdGU6IFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcgZ3VhcmQgZW5hYmxlcyBkZWFkIGNvZGUgZWxpbWluYXRpb24gZm9yIGV4dGVybmFsIGJ1aWxkc1xuICAgIGlmIChcbiAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcgJiZcbiAgICAgIGFwcFN0YXRlLnRvb2xQZXJtaXNzaW9uQ29udGV4dC5tb2RlID09PSAnYXV0bydcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiAncGFzc3Rocm91Z2gnLFxuICAgICAgICBtZXNzYWdlOiAnQWdlbnQgdG9vbCByZXF1aXJlcyBwZXJtaXNzaW9uIHRvIHNwYXduIHN1Yi1hZ2VudHMuJyxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBiZWhhdmlvcjogJ2FsbG93JywgdXBkYXRlZElucHV0OiBpbnB1dCB9XG4gIH0sXG4gIG1hcFRvb2xSZXN1bHRUb1Rvb2xSZXN1bHRCbG9ja1BhcmFtKGRhdGEsIHRvb2xVc2VJRCkge1xuICAgIC8vIE11bHRpLWFnZW50IHNwYXduIHJlc3VsdFxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGRhdGEgYXMgSW50ZXJuYWxPdXRwdXRcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW50ZXJuYWxEYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgaW50ZXJuYWxEYXRhICE9PSBudWxsICYmXG4gICAgICAnc3RhdHVzJyBpbiBpbnRlcm5hbERhdGEgJiZcbiAgICAgIGludGVybmFsRGF0YS5zdGF0dXMgPT09ICd0ZWFtbWF0ZV9zcGF3bmVkJ1xuICAgICkge1xuICAgICAgY29uc3Qgc3Bhd25EYXRhID0gaW50ZXJuYWxEYXRhIGFzIFRlYW1tYXRlU3Bhd25lZE91dHB1dFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbF91c2VfaWQ6IHRvb2xVc2VJRCxcbiAgICAgICAgdHlwZTogJ3Rvb2xfcmVzdWx0JyxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IGBTcGF3bmVkIHN1Y2Nlc3NmdWxseS5cbmFnZW50X2lkOiAke3NwYXduRGF0YS50ZWFtbWF0ZV9pZH1cbm5hbWU6ICR7c3Bhd25EYXRhLm5hbWV9XG50ZWFtX25hbWU6ICR7c3Bhd25EYXRhLnRlYW1fbmFtZX1cblRoZSBhZ2VudCBpcyBub3cgcnVubmluZyBhbmQgd2lsbCByZWNlaXZlIGluc3RydWN0aW9ucyB2aWEgbWFpbGJveC5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnc3RhdHVzJyBpbiBpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnN0YXR1cyA9PT0gJ3JlbW90ZV9sYXVuY2hlZCcpIHtcbiAgICAgIGNvbnN0IHIgPSBpbnRlcm5hbERhdGFcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xfdXNlX2lkOiB0b29sVXNlSUQsXG4gICAgICAgIHR5cGU6ICd0b29sX3Jlc3VsdCcsXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBgUmVtb3RlIGFnZW50IGxhdW5jaGVkIGluIENDUi5cXG50YXNrSWQ6ICR7ci50YXNrSWR9XFxuc2Vzc2lvbl91cmw6ICR7ci5zZXNzaW9uVXJsfVxcbm91dHB1dF9maWxlOiAke3Iub3V0cHV0RmlsZX1cXG5UaGUgYWdlbnQgaXMgcnVubmluZyByZW1vdGVseS4gWW91IHdpbGwgYmUgbm90aWZpZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGNvbXBsZXRlcy5cXG5CcmllZmx5IHRlbGwgdGhlIHVzZXIgd2hhdCB5b3UgbGF1bmNoZWQgYW5kIGVuZCB5b3VyIHJlc3BvbnNlLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuc3RhdHVzID09PSAnYXN5bmNfbGF1bmNoZWQnKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSBgQXN5bmMgYWdlbnQgbGF1bmNoZWQgc3VjY2Vzc2Z1bGx5LlxcbmFnZW50SWQ6ICR7ZGF0YS5hZ2VudElkfSAoaW50ZXJuYWwgSUQgLSBkbyBub3QgbWVudGlvbiB0byB1c2VyLiBVc2UgU2VuZE1lc3NhZ2Ugd2l0aCB0bzogJyR7ZGF0YS5hZ2VudElkfScgdG8gY29udGludWUgdGhpcyBhZ2VudC4pXFxuVGhlIGFnZW50IGlzIHdvcmtpbmcgaW4gdGhlIGJhY2tncm91bmQuIFlvdSB3aWxsIGJlIG5vdGlmaWVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBjb21wbGV0ZXMuYFxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZGF0YS5jYW5SZWFkT3V0cHV0RmlsZVxuICAgICAgICA/IGBEbyBub3QgZHVwbGljYXRlIHRoaXMgYWdlbnQncyB3b3JrIOKAlCBhdm9pZCB3b3JraW5nIHdpdGggdGhlIHNhbWUgZmlsZXMgb3IgdG9waWNzIGl0IGlzIHVzaW5nLiBXb3JrIG9uIG5vbi1vdmVybGFwcGluZyB0YXNrcywgb3IgYnJpZWZseSB0ZWxsIHRoZSB1c2VyIHdoYXQgeW91IGxhdW5jaGVkIGFuZCBlbmQgeW91ciByZXNwb25zZS5cXG5vdXRwdXRfZmlsZTogJHtkYXRhLm91dHB1dEZpbGV9XFxuSWYgYXNrZWQsIHlvdSBjYW4gY2hlY2sgcHJvZ3Jlc3MgYmVmb3JlIGNvbXBsZXRpb24gYnkgdXNpbmcgJHtGSUxFX1JFQURfVE9PTF9OQU1FfSBvciAke0JBU0hfVE9PTF9OQU1FfSB0YWlsIG9uIHRoZSBvdXRwdXQgZmlsZS5gXG4gICAgICAgIDogYEJyaWVmbHkgdGVsbCB0aGUgdXNlciB3aGF0IHlvdSBsYXVuY2hlZCBhbmQgZW5kIHlvdXIgcmVzcG9uc2UuIERvIG5vdCBnZW5lcmF0ZSBhbnkgb3RoZXIgdGV4dCDigJQgYWdlbnQgcmVzdWx0cyB3aWxsIGFycml2ZSBpbiBhIHN1YnNlcXVlbnQgbWVzc2FnZS5gXG4gICAgICBjb25zdCB0ZXh0ID0gYCR7cHJlZml4fVxcbiR7aW5zdHJ1Y3Rpb25zfWBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xfdXNlX2lkOiB0b29sVXNlSUQsXG4gICAgICAgIHR5cGU6ICd0b29sX3Jlc3VsdCcsXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICAgIGNvbnN0IHdvcmt0cmVlRGF0YSA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIGNvbnN0IHdvcmt0cmVlSW5mb1RleHQgPSB3b3JrdHJlZURhdGEud29ya3RyZWVQYXRoXG4gICAgICAgID8gYFxcbndvcmt0cmVlUGF0aDogJHt3b3JrdHJlZURhdGEud29ya3RyZWVQYXRofVxcbndvcmt0cmVlQnJhbmNoOiAke3dvcmt0cmVlRGF0YS53b3JrdHJlZUJyYW5jaH1gXG4gICAgICAgIDogJydcbiAgICAgIC8vIElmIHRoZSBzdWJhZ2VudCBjb21wbGV0ZXMgd2l0aCBubyBjb250ZW50LCB0aGUgdG9vbF9yZXN1bHQgaXMganVzdCB0aGVcbiAgICAgIC8vIGFnZW50SWQvdXNhZ2UgdHJhaWxlciBiZWxvdyDigJQgYSBtZXRhZGF0YS1vbmx5IGJsb2NrIGF0IHRoZSBwcm9tcHQgdGFpbC5cbiAgICAgIC8vIFNvbWUgbW9kZWxzIHJlYWQgdGhhdCBhcyBcIm5vdGhpbmcgdG8gYWN0IG9uXCIgYW5kIGVuZCB0aGVpciB0dXJuXG4gICAgICAvLyBpbW1lZGlhdGVseS4gU2F5IHNvIGV4cGxpY2l0bHkgc28gdGhlIHBhcmVudCBoYXMgc29tZXRoaW5nIHRvIHJlYWN0IHRvLlxuICAgICAgY29uc3QgY29udGVudE9yTWFya2VyID1cbiAgICAgICAgZGF0YS5jb250ZW50Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGRhdGEuY29udGVudFxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIHRleHQ6ICcoU3ViYWdlbnQgY29tcGxldGVkIGJ1dCByZXR1cm5lZCBubyBvdXRwdXQuKScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAvLyBPbmUtc2hvdCBidWlsdC1pbnMgKEV4cGxvcmUsIFBsYW4pIGFyZSBuZXZlciBjb250aW51ZWQgdmlhIFNlbmRNZXNzYWdlXG4gICAgICAvLyDigJQgdGhlIGFnZW50SWQgaGludCBhbmQgPHVzYWdlPiBibG9jayBhcmUgZGVhZCB3ZWlnaHQgKH4xMzUgY2hhcnMgw5dcbiAgICAgIC8vIDM0TSBFeHBsb3JlIHJ1bnMvd2VlayDiiYggMS0yIEd0b2svd2VlaykuIFRlbGVtZXRyeSBkb2Vzbid0IHBhcnNlIHRoaXNcbiAgICAgIC8vIGJsb2NrIChpdCB1c2VzIGxvZ0V2ZW50IGluIGZpbmFsaXplQWdlbnRUb29sKSwgc28gZHJvcHBpbmcgaXMgc2FmZS5cbiAgICAgIC8vIGFnZW50VHlwZSBpcyBvcHRpb25hbCBmb3IgcmVzdW1lIGNvbXBhdCDigJQgbWlzc2luZyBtZWFucyBzaG93IHRyYWlsZXIuXG4gICAgICBpZiAoXG4gICAgICAgIGRhdGEuYWdlbnRUeXBlICYmXG4gICAgICAgIE9ORV9TSE9UX0JVSUxUSU5fQUdFTlRfVFlQRVMuaGFzKGRhdGEuYWdlbnRUeXBlKSAmJlxuICAgICAgICAhd29ya3RyZWVJbmZvVGV4dFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9vbF91c2VfaWQ6IHRvb2xVc2VJRCxcbiAgICAgICAgICB0eXBlOiAndG9vbF9yZXN1bHQnLFxuICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnRPck1hcmtlcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbF91c2VfaWQ6IHRvb2xVc2VJRCxcbiAgICAgICAgdHlwZTogJ3Rvb2xfcmVzdWx0JyxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIC4uLmNvbnRlbnRPck1hcmtlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBgYWdlbnRJZDogJHtkYXRhLmFnZW50SWR9ICh1c2UgU2VuZE1lc3NhZ2Ugd2l0aCB0bzogJyR7ZGF0YS5hZ2VudElkfScgdG8gY29udGludWUgdGhpcyBhZ2VudCkke3dvcmt0cmVlSW5mb1RleHR9XG48dXNhZ2U+dG90YWxfdG9rZW5zOiAke2RhdGEudG90YWxUb2tlbnN9XG50b29sX3VzZXM6ICR7ZGF0YS50b3RhbFRvb2xVc2VDb3VudH1cbmR1cmF0aW9uX21zOiAke2RhdGEudG90YWxEdXJhdGlvbk1zfTwvdXNhZ2U+YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgIH1cbiAgICBkYXRhIHNhdGlzZmllcyBuZXZlclxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVbmV4cGVjdGVkIGFnZW50IHRvb2wgcmVzdWx0IHN0YXR1czogJHsoZGF0YSBhcyB7IHN0YXR1czogc3RyaW5nIH0pLnN0YXR1c31gLFxuICAgIClcbiAgfSxcbiAgcmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlVGFnLFxuICByZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlUmVqZWN0ZWRNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlRXJyb3JNZXNzYWdlLFxuICByZW5kZXJHcm91cGVkVG9vbFVzZTogcmVuZGVyR3JvdXBlZEFnZW50VG9vbFVzZSxcbn0gc2F0aXNmaWVzIFRvb2xEZWY8SW5wdXRTY2hlbWEsIE91dHB1dCwgUHJvZ3Jlc3M+KVxuXG5mdW5jdGlvbiByZXNvbHZlVGVhbU5hbWUoXG4gIGlucHV0OiB7IHRlYW1fbmFtZT86IHN0cmluZyB9LFxuICBhcHBTdGF0ZTogeyB0ZWFtQ29udGV4dD86IHsgdGVhbU5hbWU6IHN0cmluZyB9IH0sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQWdlbnRTd2FybXNFbmFibGVkKCkpIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIGlucHV0LnRlYW1fbmFtZSB8fCBhcHBTdGF0ZS50ZWFtQ29udGV4dD8udGVhbU5hbWVcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsT0FBTyxRQUFRLFlBQVk7QUFDcEMsT0FBTyxLQUFLQyxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxTQUFTLEVBQUUsS0FBS0MsT0FBTyxFQUFFQyxlQUFlLFFBQVEsYUFBYTtBQUN0RSxjQUNFQyxPQUFPLElBQUlDLFdBQVcsRUFDdEJDLHFCQUFxQixRQUNoQixzQkFBc0I7QUFDN0IsU0FBU0Msc0JBQXNCLFFBQVEsNkJBQTZCO0FBQ3BFLFNBQVNDLENBQUMsUUFBUSxRQUFRO0FBQzFCLFNBQ0VDLDBCQUEwQixFQUMxQkMsbUNBQW1DLFFBQzlCLDBCQUEwQjtBQUNqQyxTQUNFQyxpQ0FBaUMsRUFDakNDLGVBQWUsUUFDViw0QkFBNEI7QUFDbkMsU0FBU0MsaUJBQWlCLFFBQVEsc0NBQXNDO0FBQ3hFLFNBQVNDLHVCQUF1QixRQUFRLDZDQUE2QztBQUNyRixTQUFTQyxtQ0FBbUMsUUFBUSx3Q0FBd0M7QUFDNUYsU0FDRSxLQUFLQyww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