clawdbot 2026.1.4-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 (550) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +297 -0
  5. package/dist/agents/agent-paths.js +17 -0
  6. package/dist/agents/bash-process-registry.js +126 -0
  7. package/dist/agents/bash-tools.js +837 -0
  8. package/dist/agents/clawdbot-tools.js +30 -0
  9. package/dist/agents/clawdis-tools.js +27 -0
  10. package/dist/agents/context.js +34 -0
  11. package/dist/agents/defaults.js +6 -0
  12. package/dist/agents/model-auth.js +112 -0
  13. package/dist/agents/model-catalog.js +55 -0
  14. package/dist/agents/model-fallback.js +191 -0
  15. package/dist/agents/model-scan.js +263 -0
  16. package/dist/agents/model-selection.js +116 -0
  17. package/dist/agents/models-config.js +49 -0
  18. package/dist/agents/pi-embedded-helpers.js +74 -0
  19. package/dist/agents/pi-embedded-runner.js +407 -0
  20. package/dist/agents/pi-embedded-subscribe.js +568 -0
  21. package/dist/agents/pi-embedded-utils.js +20 -0
  22. package/dist/agents/pi-embedded.js +1 -0
  23. package/dist/agents/pi-oauth.js +88 -0
  24. package/dist/agents/pi-tools.js +433 -0
  25. package/dist/agents/sandbox-paths.js +68 -0
  26. package/dist/agents/sandbox.js +644 -0
  27. package/dist/agents/shell-utils.js +53 -0
  28. package/dist/agents/skills-install.js +244 -0
  29. package/dist/agents/skills-status.js +157 -0
  30. package/dist/agents/skills.js +470 -0
  31. package/dist/agents/steerable-agent-loop.js +338 -0
  32. package/dist/agents/steerable-provider-transport.js +48 -0
  33. package/dist/agents/system-prompt.js +104 -0
  34. package/dist/agents/tool-display.js +162 -0
  35. package/dist/agents/tool-images.js +138 -0
  36. package/dist/agents/tools/browser-tool.js +339 -0
  37. package/dist/agents/tools/canvas-tool.js +193 -0
  38. package/dist/agents/tools/common.js +88 -0
  39. package/dist/agents/tools/cron-tool.js +124 -0
  40. package/dist/agents/tools/discord-actions-guild.js +186 -0
  41. package/dist/agents/tools/discord-actions-messaging.js +285 -0
  42. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  43. package/dist/agents/tools/discord-actions.js +56 -0
  44. package/dist/agents/tools/discord-schema.js +199 -0
  45. package/dist/agents/tools/discord-tool.js +16 -0
  46. package/dist/agents/tools/gateway-tool.js +46 -0
  47. package/dist/agents/tools/gateway.js +27 -0
  48. package/dist/agents/tools/image-tool.js +132 -0
  49. package/dist/agents/tools/nodes-tool.js +413 -0
  50. package/dist/agents/tools/nodes-utils.js +92 -0
  51. package/dist/agents/tools/sessions-helpers.js +88 -0
  52. package/dist/agents/tools/sessions-history-tool.js +53 -0
  53. package/dist/agents/tools/sessions-list-tool.js +143 -0
  54. package/dist/agents/tools/sessions-send-helpers.js +100 -0
  55. package/dist/agents/tools/sessions-send-tool.js +347 -0
  56. package/dist/agents/tools/slack-actions.js +129 -0
  57. package/dist/agents/tools/slack-schema.js +59 -0
  58. package/dist/agents/tools/slack-tool.js +16 -0
  59. package/dist/agents/usage.js +39 -0
  60. package/dist/agents/workspace.js +241 -0
  61. package/dist/auto-reply/chunk.js +76 -0
  62. package/dist/auto-reply/envelope.js +38 -0
  63. package/dist/auto-reply/group-activation.js +20 -0
  64. package/dist/auto-reply/heartbeat.js +57 -0
  65. package/dist/auto-reply/model.js +14 -0
  66. package/dist/auto-reply/reply/abort.js +14 -0
  67. package/dist/auto-reply/reply/agent-runner.js +371 -0
  68. package/dist/auto-reply/reply/block-streaming.js +34 -0
  69. package/dist/auto-reply/reply/body.js +29 -0
  70. package/dist/auto-reply/reply/commands.js +207 -0
  71. package/dist/auto-reply/reply/directive-handling.js +361 -0
  72. package/dist/auto-reply/reply/directives.js +47 -0
  73. package/dist/auto-reply/reply/followup-runner.js +149 -0
  74. package/dist/auto-reply/reply/groups.js +91 -0
  75. package/dist/auto-reply/reply/mentions.js +38 -0
  76. package/dist/auto-reply/reply/model-selection.js +114 -0
  77. package/dist/auto-reply/reply/queue.js +399 -0
  78. package/dist/auto-reply/reply/reply-tags.js +26 -0
  79. package/dist/auto-reply/reply/session-updates.js +87 -0
  80. package/dist/auto-reply/reply/session.js +160 -0
  81. package/dist/auto-reply/reply/typing.js +75 -0
  82. package/dist/auto-reply/reply.js +535 -0
  83. package/dist/auto-reply/send-policy.js +28 -0
  84. package/dist/auto-reply/status.js +158 -0
  85. package/dist/auto-reply/templating.js +9 -0
  86. package/dist/auto-reply/thinking.js +49 -0
  87. package/dist/auto-reply/tokens.js +2 -0
  88. package/dist/auto-reply/tool-meta.js +74 -0
  89. package/dist/auto-reply/transcription.js +57 -0
  90. package/dist/auto-reply/types.js +1 -0
  91. package/dist/browser/bridge-server.js +37 -0
  92. package/dist/browser/cdp.js +382 -0
  93. package/dist/browser/chrome.js +432 -0
  94. package/dist/browser/client-actions-core.js +67 -0
  95. package/dist/browser/client-actions-observe.js +24 -0
  96. package/dist/browser/client-actions-types.js +1 -0
  97. package/dist/browser/client-actions.js +3 -0
  98. package/dist/browser/client-fetch.js +43 -0
  99. package/dist/browser/client.js +105 -0
  100. package/dist/browser/config.js +140 -0
  101. package/dist/browser/constants.js +4 -0
  102. package/dist/browser/profiles-service.js +122 -0
  103. package/dist/browser/profiles.js +85 -0
  104. package/dist/browser/pw-ai.js +2 -0
  105. package/dist/browser/pw-session.js +144 -0
  106. package/dist/browser/pw-tools-core.js +363 -0
  107. package/dist/browser/routes/agent.js +535 -0
  108. package/dist/browser/routes/basic.js +155 -0
  109. package/dist/browser/routes/index.js +8 -0
  110. package/dist/browser/routes/tabs.js +105 -0
  111. package/dist/browser/routes/utils.js +62 -0
  112. package/dist/browser/screenshot.js +40 -0
  113. package/dist/browser/server-context.js +377 -0
  114. package/dist/browser/server.js +81 -0
  115. package/dist/browser/target-id.js +18 -0
  116. package/dist/browser/trash.js +21 -0
  117. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  118. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  119. package/dist/canvas-host/a2ui/index.html +246 -0
  120. package/dist/canvas-host/a2ui.js +187 -0
  121. package/dist/canvas-host/server.js +382 -0
  122. package/dist/cli/browser-cli-actions-input.js +459 -0
  123. package/dist/cli/browser-cli-actions-observe.js +56 -0
  124. package/dist/cli/browser-cli-examples.js +31 -0
  125. package/dist/cli/browser-cli-inspect.js +97 -0
  126. package/dist/cli/browser-cli-manage.js +286 -0
  127. package/dist/cli/browser-cli-shared.js +1 -0
  128. package/dist/cli/browser-cli.js +26 -0
  129. package/dist/cli/canvas-cli.js +416 -0
  130. package/dist/cli/cron-cli.js +454 -0
  131. package/dist/cli/deps.js +17 -0
  132. package/dist/cli/dns-cli.js +180 -0
  133. package/dist/cli/gateway-cli.js +489 -0
  134. package/dist/cli/gateway-rpc.js +20 -0
  135. package/dist/cli/hooks-cli.js +135 -0
  136. package/dist/cli/models-cli.js +248 -0
  137. package/dist/cli/nodes-camera.js +57 -0
  138. package/dist/cli/nodes-canvas.js +26 -0
  139. package/dist/cli/nodes-cli.js +946 -0
  140. package/dist/cli/nodes-screen.js +37 -0
  141. package/dist/cli/parse-duration.js +20 -0
  142. package/dist/cli/ports.js +97 -0
  143. package/dist/cli/program.js +406 -0
  144. package/dist/cli/prompt.js +19 -0
  145. package/dist/cli/tui-cli.js +35 -0
  146. package/dist/cli/wait.js +8 -0
  147. package/dist/commands/agent.js +645 -0
  148. package/dist/commands/antigravity-oauth.js +327 -0
  149. package/dist/commands/configure.js +480 -0
  150. package/dist/commands/doctor.js +484 -0
  151. package/dist/commands/health.js +108 -0
  152. package/dist/commands/models/aliases.js +64 -0
  153. package/dist/commands/models/fallbacks.js +99 -0
  154. package/dist/commands/models/image-fallbacks.js +99 -0
  155. package/dist/commands/models/list.js +323 -0
  156. package/dist/commands/models/scan.js +266 -0
  157. package/dist/commands/models/set-image.js +23 -0
  158. package/dist/commands/models/set.js +23 -0
  159. package/dist/commands/models/shared.js +72 -0
  160. package/dist/commands/models.js +7 -0
  161. package/dist/commands/onboard-auth.js +70 -0
  162. package/dist/commands/onboard-helpers.js +295 -0
  163. package/dist/commands/onboard-interactive.js +17 -0
  164. package/dist/commands/onboard-non-interactive.js +202 -0
  165. package/dist/commands/onboard-providers.js +634 -0
  166. package/dist/commands/onboard-remote.js +120 -0
  167. package/dist/commands/onboard-skills.js +148 -0
  168. package/dist/commands/onboard-types.js +1 -0
  169. package/dist/commands/onboard.js +12 -0
  170. package/dist/commands/send.js +124 -0
  171. package/dist/commands/sessions.js +212 -0
  172. package/dist/commands/setup.js +58 -0
  173. package/dist/commands/signal-install.js +135 -0
  174. package/dist/commands/status.js +207 -0
  175. package/dist/commands/update.js +16 -0
  176. package/dist/config/config.js +6 -0
  177. package/dist/config/defaults.js +61 -0
  178. package/dist/config/io.js +147 -0
  179. package/dist/config/legacy-migrate.js +13 -0
  180. package/dist/config/legacy.js +159 -0
  181. package/dist/config/paths.js +71 -0
  182. package/dist/config/schema.js +150 -0
  183. package/dist/config/sessions.js +282 -0
  184. package/dist/config/talk.js +31 -0
  185. package/dist/config/types.js +1 -0
  186. package/dist/config/validation.js +29 -0
  187. package/dist/config/zod-schema.js +831 -0
  188. package/dist/control-ui/assets/index-BFID3yAA.css +1 -0
  189. package/dist/control-ui/assets/index-CE_axlTS.js +2235 -0
  190. package/dist/control-ui/assets/index-CE_axlTS.js.map +1 -0
  191. package/dist/control-ui/index.html +15 -0
  192. package/dist/cron/isolated-agent.js +499 -0
  193. package/dist/cron/run-log.js +72 -0
  194. package/dist/cron/schedule.js +24 -0
  195. package/dist/cron/service.js +471 -0
  196. package/dist/cron/store.js +43 -0
  197. package/dist/cron/types.js +1 -0
  198. package/dist/daemon/constants.js +10 -0
  199. package/dist/daemon/launchd.js +276 -0
  200. package/dist/daemon/legacy.js +63 -0
  201. package/dist/daemon/program-args.js +76 -0
  202. package/dist/daemon/schtasks.js +257 -0
  203. package/dist/daemon/service.js +60 -0
  204. package/dist/daemon/systemd.js +266 -0
  205. package/dist/discord/index.js +2 -0
  206. package/dist/discord/monitor.js +1188 -0
  207. package/dist/discord/probe.js +54 -0
  208. package/dist/discord/send.js +577 -0
  209. package/dist/discord/token.js +8 -0
  210. package/dist/gateway/auth.js +121 -0
  211. package/dist/gateway/call.js +94 -0
  212. package/dist/gateway/chat-attachments.js +41 -0
  213. package/dist/gateway/client.js +180 -0
  214. package/dist/gateway/config-reload.js +274 -0
  215. package/dist/gateway/control-ui.js +184 -0
  216. package/dist/gateway/hooks-mapping.js +282 -0
  217. package/dist/gateway/hooks.js +168 -0
  218. package/dist/gateway/net.js +29 -0
  219. package/dist/gateway/protocol/index.js +61 -0
  220. package/dist/gateway/protocol/schema.js +560 -0
  221. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  222. package/dist/gateway/server-bridge.js +1013 -0
  223. package/dist/gateway/server-browser.js +12 -0
  224. package/dist/gateway/server-chat.js +159 -0
  225. package/dist/gateway/server-constants.js +8 -0
  226. package/dist/gateway/server-discovery.js +62 -0
  227. package/dist/gateway/server-http.js +165 -0
  228. package/dist/gateway/server-methods/agent-job.js +125 -0
  229. package/dist/gateway/server-methods/agent.js +250 -0
  230. package/dist/gateway/server-methods/chat.js +200 -0
  231. package/dist/gateway/server-methods/config.js +50 -0
  232. package/dist/gateway/server-methods/connect.js +6 -0
  233. package/dist/gateway/server-methods/cron.js +83 -0
  234. package/dist/gateway/server-methods/health.js +28 -0
  235. package/dist/gateway/server-methods/models.js +16 -0
  236. package/dist/gateway/server-methods/nodes.js +294 -0
  237. package/dist/gateway/server-methods/providers.js +217 -0
  238. package/dist/gateway/server-methods/send.js +166 -0
  239. package/dist/gateway/server-methods/sessions.js +305 -0
  240. package/dist/gateway/server-methods/skills.js +83 -0
  241. package/dist/gateway/server-methods/system.js +118 -0
  242. package/dist/gateway/server-methods/talk.js +22 -0
  243. package/dist/gateway/server-methods/types.js +1 -0
  244. package/dist/gateway/server-methods/voicewake.js +30 -0
  245. package/dist/gateway/server-methods/web.js +58 -0
  246. package/dist/gateway/server-methods/wizard.js +100 -0
  247. package/dist/gateway/server-methods.js +53 -0
  248. package/dist/gateway/server-providers.js +644 -0
  249. package/dist/gateway/server-shared.js +1 -0
  250. package/dist/gateway/server-utils.js +35 -0
  251. package/dist/gateway/server.js +1437 -0
  252. package/dist/gateway/session-utils.js +216 -0
  253. package/dist/gateway/ws-log.js +349 -0
  254. package/dist/gateway/ws-logging.js +8 -0
  255. package/dist/globals.js +41 -0
  256. package/dist/hooks/gmail-ops.js +236 -0
  257. package/dist/hooks/gmail-setup-utils.js +278 -0
  258. package/dist/hooks/gmail-watcher.js +175 -0
  259. package/dist/hooks/gmail.js +177 -0
  260. package/dist/imessage/client.js +165 -0
  261. package/dist/imessage/index.js +3 -0
  262. package/dist/imessage/monitor.js +272 -0
  263. package/dist/imessage/probe.js +26 -0
  264. package/dist/imessage/send.js +83 -0
  265. package/dist/imessage/targets.js +176 -0
  266. package/dist/index.js +50 -0
  267. package/dist/infra/agent-events.js +46 -0
  268. package/dist/infra/binaries.js +9 -0
  269. package/dist/infra/bonjour-discovery.js +163 -0
  270. package/dist/infra/bonjour.js +200 -0
  271. package/dist/infra/bridge/server.js +562 -0
  272. package/dist/infra/canvas-host-url.js +54 -0
  273. package/dist/infra/env.js +8 -0
  274. package/dist/infra/errors.js +28 -0
  275. package/dist/infra/gateway-lock.js +8 -0
  276. package/dist/infra/heartbeat-events.js +21 -0
  277. package/dist/infra/heartbeat-runner.js +453 -0
  278. package/dist/infra/heartbeat-wake.js +61 -0
  279. package/dist/infra/is-main.js +37 -0
  280. package/dist/infra/machine-name.js +40 -0
  281. package/dist/infra/node-pairing.js +211 -0
  282. package/dist/infra/pam.js +42 -0
  283. package/dist/infra/path-env.js +92 -0
  284. package/dist/infra/ports.js +87 -0
  285. package/dist/infra/provider-summary.js +80 -0
  286. package/dist/infra/restart.js +29 -0
  287. package/dist/infra/retry.js +16 -0
  288. package/dist/infra/runtime-guard.js +59 -0
  289. package/dist/infra/system-events.js +44 -0
  290. package/dist/infra/system-presence.js +216 -0
  291. package/dist/infra/tailnet.js +46 -0
  292. package/dist/infra/tailscale.js +149 -0
  293. package/dist/infra/voicewake.js +77 -0
  294. package/dist/infra/widearea-dns.js +123 -0
  295. package/dist/infra/ws.js +13 -0
  296. package/dist/logger.js +52 -0
  297. package/dist/logging.js +490 -0
  298. package/dist/macos/gateway-daemon.js +141 -0
  299. package/dist/macos/relay.js +46 -0
  300. package/dist/media/constants.js +33 -0
  301. package/dist/media/host.js +42 -0
  302. package/dist/media/image-ops.js +121 -0
  303. package/dist/media/mime.js +115 -0
  304. package/dist/media/parse.js +81 -0
  305. package/dist/media/server.js +64 -0
  306. package/dist/media/store.js +139 -0
  307. package/dist/process/command-queue.js +97 -0
  308. package/dist/process/exec.js +75 -0
  309. package/dist/protocol.schema.json +2918 -0
  310. package/dist/provider-web.js +8 -0
  311. package/dist/providers/web/index.js +2 -0
  312. package/dist/runtime.js +8 -0
  313. package/dist/sessions/send-policy.js +68 -0
  314. package/dist/signal/client.js +134 -0
  315. package/dist/signal/daemon.js +69 -0
  316. package/dist/signal/index.js +3 -0
  317. package/dist/signal/monitor.js +336 -0
  318. package/dist/signal/probe.js +46 -0
  319. package/dist/signal/send.js +91 -0
  320. package/dist/slack/actions.js +97 -0
  321. package/dist/slack/index.js +5 -0
  322. package/dist/slack/monitor.js +1029 -0
  323. package/dist/slack/probe.js +47 -0
  324. package/dist/slack/send.js +131 -0
  325. package/dist/slack/token.js +10 -0
  326. package/dist/telegram/bot.js +394 -0
  327. package/dist/telegram/download.js +34 -0
  328. package/dist/telegram/index.js +4 -0
  329. package/dist/telegram/monitor.js +47 -0
  330. package/dist/telegram/probe.js +63 -0
  331. package/dist/telegram/proxy.js +9 -0
  332. package/dist/telegram/send.js +138 -0
  333. package/dist/telegram/token.js +30 -0
  334. package/dist/telegram/webhook-set.js +12 -0
  335. package/dist/telegram/webhook.js +56 -0
  336. package/dist/tui/commands.js +74 -0
  337. package/dist/tui/components/assistant-message.js +16 -0
  338. package/dist/tui/components/chat-log.js +92 -0
  339. package/dist/tui/components/custom-editor.js +53 -0
  340. package/dist/tui/components/selectors.js +8 -0
  341. package/dist/tui/components/tool-execution.js +111 -0
  342. package/dist/tui/components/user-message.js +17 -0
  343. package/dist/tui/gateway-chat.js +140 -0
  344. package/dist/tui/layout.js +41 -0
  345. package/dist/tui/message-list.js +57 -0
  346. package/dist/tui/theme/theme.js +80 -0
  347. package/dist/tui/theme.js +25 -0
  348. package/dist/tui/tui.js +708 -0
  349. package/dist/utils.js +133 -0
  350. package/dist/version.js +18 -0
  351. package/dist/web/active-listener.js +7 -0
  352. package/dist/web/auto-reply.js +1203 -0
  353. package/dist/web/inbound.js +481 -0
  354. package/dist/web/login-qr.js +204 -0
  355. package/dist/web/login.js +59 -0
  356. package/dist/web/media.js +148 -0
  357. package/dist/web/outbound.js +67 -0
  358. package/dist/web/qr-image.js +97 -0
  359. package/dist/web/reconnect.js +60 -0
  360. package/dist/web/reply-heartbeat-wake.js +61 -0
  361. package/dist/web/session.js +346 -0
  362. package/dist/wizard/clack-prompter.js +56 -0
  363. package/dist/wizard/onboarding.js +452 -0
  364. package/dist/wizard/prompts.js +6 -0
  365. package/dist/wizard/session.js +203 -0
  366. package/docs/AGENTS.default.md +116 -0
  367. package/docs/CNAME +1 -0
  368. package/docs/RELEASING.md +64 -0
  369. package/docs/_config.yml +51 -0
  370. package/docs/_layouts/default.html +145 -0
  371. package/docs/agent-send.md +21 -0
  372. package/docs/agent.md +104 -0
  373. package/docs/android/connect.md +131 -0
  374. package/docs/architecture.md +89 -0
  375. package/docs/assets/markdown.css +130 -0
  376. package/docs/assets/pixel-lobster.svg +60 -0
  377. package/docs/assets/terminal.css +497 -0
  378. package/docs/assets/theme.js +55 -0
  379. package/docs/audio.md +50 -0
  380. package/docs/background-process.md +74 -0
  381. package/docs/bash.md +32 -0
  382. package/docs/bonjour.md +159 -0
  383. package/docs/browser.md +289 -0
  384. package/docs/camera.md +152 -0
  385. package/docs/clawd.md +199 -0
  386. package/docs/clawdbot-mac.md +104 -0
  387. package/docs/configuration.md +1177 -0
  388. package/docs/control-api.md +49 -0
  389. package/docs/control-ui.md +83 -0
  390. package/docs/cron.md +374 -0
  391. package/docs/dashboard.md +17 -0
  392. package/docs/device-models.md +46 -0
  393. package/docs/discord.md +293 -0
  394. package/docs/discovery.md +112 -0
  395. package/docs/docker.md +251 -0
  396. package/docs/docs.json +86 -0
  397. package/docs/doctor.md +47 -0
  398. package/docs/elevated.md +31 -0
  399. package/docs/faq.md +640 -0
  400. package/docs/gateway/pairing.md +109 -0
  401. package/docs/gateway-lock.md +28 -0
  402. package/docs/gateway.md +174 -0
  403. package/docs/gmail-pubsub.md +191 -0
  404. package/docs/grammy.md +27 -0
  405. package/docs/group-messages.md +71 -0
  406. package/docs/groups.md +78 -0
  407. package/docs/health.md +28 -0
  408. package/docs/heartbeat.md +64 -0
  409. package/docs/images.md +52 -0
  410. package/docs/imessage.md +63 -0
  411. package/docs/index.md +182 -0
  412. package/docs/ios/connect.md +177 -0
  413. package/docs/ios/spec.md +236 -0
  414. package/docs/location-command.md +95 -0
  415. package/docs/logging.md +99 -0
  416. package/docs/lore.md +131 -0
  417. package/docs/mac/bun.md +133 -0
  418. package/docs/mac/canvas.md +161 -0
  419. package/docs/mac/child-process.md +72 -0
  420. package/docs/mac/dev-setup.md +81 -0
  421. package/docs/mac/health.md +28 -0
  422. package/docs/mac/icon.md +26 -0
  423. package/docs/mac/logging.md +51 -0
  424. package/docs/mac/menu-bar.md +69 -0
  425. package/docs/mac/peekaboo.md +170 -0
  426. package/docs/mac/permissions.md +40 -0
  427. package/docs/mac/release.md +76 -0
  428. package/docs/mac/remote.md +57 -0
  429. package/docs/mac/signing.md +41 -0
  430. package/docs/mac/skills.md +27 -0
  431. package/docs/mac/voice-overlay.md +52 -0
  432. package/docs/mac/voicewake.md +56 -0
  433. package/docs/mac/webchat.md +27 -0
  434. package/docs/mac/xpc.md +40 -0
  435. package/docs/models.md +90 -0
  436. package/docs/nix.md +49 -0
  437. package/docs/nodes.md +157 -0
  438. package/docs/onboarding-config-protocol.md +29 -0
  439. package/docs/onboarding.md +185 -0
  440. package/docs/presence.md +133 -0
  441. package/docs/queue.md +78 -0
  442. package/docs/refactor/browser-control-simplification.md +58 -0
  443. package/docs/refactor/canvas-a2ui.md +93 -0
  444. package/docs/refactor/cli-unification.md +64 -0
  445. package/docs/refactor/gateway-client.md +31 -0
  446. package/docs/refactor/gateway.md +99 -0
  447. package/docs/refactor/new-arch.md +171 -0
  448. package/docs/refactor/tui.md +26 -0
  449. package/docs/refactor/web-gateway-troubleshooting.md +37 -0
  450. package/docs/refactor/webagent-session.md +46 -0
  451. package/docs/remote-gateway-readme.md +148 -0
  452. package/docs/remote.md +66 -0
  453. package/docs/research/memory.md +227 -0
  454. package/docs/rpc.md +35 -0
  455. package/docs/security.md +168 -0
  456. package/docs/session-tool.md +119 -0
  457. package/docs/session.md +84 -0
  458. package/docs/sessions.md +8 -0
  459. package/docs/setup.md +118 -0
  460. package/docs/signal.md +113 -0
  461. package/docs/skills-config.md +58 -0
  462. package/docs/skills.md +149 -0
  463. package/docs/slack.md +158 -0
  464. package/docs/surface.md +20 -0
  465. package/docs/tailscale.md +71 -0
  466. package/docs/talk.md +79 -0
  467. package/docs/telegram.md +90 -0
  468. package/docs/templates/AGENTS.md +126 -0
  469. package/docs/templates/BOOTSTRAP.md +53 -0
  470. package/docs/templates/IDENTITY.md +17 -0
  471. package/docs/templates/SOUL.md +41 -0
  472. package/docs/templates/TOOLS.md +41 -0
  473. package/docs/templates/USER.md +22 -0
  474. package/docs/test.md +35 -0
  475. package/docs/thinking.md +46 -0
  476. package/docs/tools.md +248 -0
  477. package/docs/troubleshooting.md +227 -0
  478. package/docs/tui.md +69 -0
  479. package/docs/typebox.md +42 -0
  480. package/docs/voicewake.md +61 -0
  481. package/docs/web.md +115 -0
  482. package/docs/webchat.md +34 -0
  483. package/docs/webhook.md +132 -0
  484. package/docs/whatsapp-clawd.jpg +0 -0
  485. package/docs/whatsapp.md +142 -0
  486. package/docs/wizard.md +158 -0
  487. package/package.json +186 -0
  488. package/skills/apple-notes/SKILL.md +50 -0
  489. package/skills/apple-reminders/SKILL.md +67 -0
  490. package/skills/bear-notes/SKILL.md +79 -0
  491. package/skills/bird/SKILL.md +25 -0
  492. package/skills/blogwatcher/SKILL.md +46 -0
  493. package/skills/blucli/SKILL.md +27 -0
  494. package/skills/brave-search/SKILL.md +30 -0
  495. package/skills/brave-search/scripts/content.mjs +53 -0
  496. package/skills/brave-search/scripts/search.mjs +79 -0
  497. package/skills/camsnap/SKILL.md +25 -0
  498. package/skills/clawdhub/SKILL.md +53 -0
  499. package/skills/coding-agent/SKILL.md +275 -0
  500. package/skills/discord/SKILL.md +369 -0
  501. package/skills/eightctl/SKILL.md +29 -0
  502. package/skills/food-order/SKILL.md +41 -0
  503. package/skills/gemini/SKILL.md +23 -0
  504. package/skills/gifgrep/SKILL.md +47 -0
  505. package/skills/github/SKILL.md +47 -0
  506. package/skills/gog/SKILL.md +36 -0
  507. package/skills/goplaces/SKILL.md +30 -0
  508. package/skills/imsg/SKILL.md +25 -0
  509. package/skills/local-places/SERVER_README.md +101 -0
  510. package/skills/local-places/SKILL.md +91 -0
  511. package/skills/local-places/pyproject.toml +27 -0
  512. package/skills/local-places/src/local_places/__init__.py +2 -0
  513. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  514. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  515. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  516. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  517. package/skills/local-places/src/local_places/google_places.py +314 -0
  518. package/skills/local-places/src/local_places/main.py +65 -0
  519. package/skills/local-places/src/local_places/schemas.py +107 -0
  520. package/skills/mcporter/SKILL.md +38 -0
  521. package/skills/nano-banana-pro/SKILL.md +29 -0
  522. package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
  523. package/skills/nano-pdf/SKILL.md +20 -0
  524. package/skills/notion/SKILL.md +156 -0
  525. package/skills/obsidian/SKILL.md +55 -0
  526. package/skills/openai-image-gen/SKILL.md +31 -0
  527. package/skills/openai-image-gen/scripts/gen.py +173 -0
  528. package/skills/openai-whisper/SKILL.md +19 -0
  529. package/skills/openai-whisper-api/SKILL.md +43 -0
  530. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  531. package/skills/openhue/SKILL.md +30 -0
  532. package/skills/oracle/SKILL.md +105 -0
  533. package/skills/ordercli/SKILL.md +47 -0
  534. package/skills/peekaboo/SKILL.md +153 -0
  535. package/skills/qmd/SKILL.md +26 -0
  536. package/skills/sag/SKILL.md +62 -0
  537. package/skills/slack/SKILL.md +143 -0
  538. package/skills/songsee/SKILL.md +29 -0
  539. package/skills/sonoscli/SKILL.md +26 -0
  540. package/skills/spotify-player/SKILL.md +34 -0
  541. package/skills/summarize/SKILL.md +49 -0
  542. package/skills/things-mac/SKILL.md +61 -0
  543. package/skills/tmux/SKILL.md +121 -0
  544. package/skills/tmux/scripts/find-sessions.sh +112 -0
  545. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  546. package/skills/trello/SKILL.md +84 -0
  547. package/skills/video-frames/SKILL.md +29 -0
  548. package/skills/video-frames/scripts/frame.sh +81 -0
  549. package/skills/wacli/SKILL.md +42 -0
  550. package/skills/weather/SKILL.md +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CE_axlTS.js","sources":["../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/lit-html.js","../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../../../ui/src/ui/uuid.ts","../../../ui/src/ui/gateway.ts","../../../ui/src/ui/storage.ts","../../../ui/src/ui/navigation.ts","../../../ui/src/ui/tool-display.ts","../../../ui/src/ui/views/chat.ts","../../../ui/src/ui/views/config-form.ts","../../../ui/src/ui/views/config.ts","../../../ui/src/ui/format.ts","../../../ui/src/ui/views/connections.ts","../../../ui/src/ui/presenter.ts","../../../ui/src/ui/views/cron.ts","../../../ui/src/ui/views/debug.ts","../../../ui/src/ui/views/instances.ts","../../../ui/src/ui/views/nodes.ts","../../../ui/src/ui/views/overview.ts","../../../ui/src/ui/views/sessions.ts","../../../ui/src/ui/views/skills.ts","../../../ui/src/ui/ui-types.ts","../../../ui/src/ui/controllers/connections.ts","../../../ui/src/ui/controllers/presence.ts","../../../ui/src/ui/controllers/sessions.ts","../../../ui/src/ui/controllers/skills.ts","../../../ui/src/ui/controllers/nodes.ts","../../../ui/src/ui/controllers/chat.ts","../../../ui/src/ui/controllers/config.ts","../../../ui/src/ui/controllers/cron.ts","../../../ui/src/ui/controllers/debug.ts","../../../ui/src/ui/app-render.ts","../../../ui/src/ui/theme.ts","../../../ui/src/ui/theme-transition.ts","../../../ui/src/ui/app.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","export type CryptoLike = {\n randomUUID?: (() => string) | undefined;\n getRandomValues?: ((array: Uint8Array) => Uint8Array) | undefined;\n};\n\nfunction uuidFromBytes(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1\n\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(\n 16,\n 20,\n )}-${hex.slice(20)}`;\n}\n\nfunction weakRandomBytes(): Uint8Array {\n const bytes = new Uint8Array(16);\n const now = Date.now();\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);\n bytes[0] ^= now & 0xff;\n bytes[1] ^= (now >>> 8) & 0xff;\n bytes[2] ^= (now >>> 16) & 0xff;\n bytes[3] ^= (now >>> 24) & 0xff;\n return bytes;\n}\n\nexport function generateUUID(cryptoLike: CryptoLike | null = globalThis.crypto): string {\n if (cryptoLike && typeof cryptoLike.randomUUID === \"function\") return cryptoLike.randomUUID();\n\n if (cryptoLike && typeof cryptoLike.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n cryptoLike.getRandomValues(bytes);\n return uuidFromBytes(bytes);\n }\n\n return uuidFromBytes(weakRandomBytes());\n}\n\n","import { generateUUID } from \"./uuid\";\n\nexport type GatewayEventFrame = {\n type: \"event\";\n event: string;\n payload?: unknown;\n seq?: number;\n stateVersion?: { presence: number; health: number };\n};\n\nexport type GatewayResponseFrame = {\n type: \"res\";\n id: string;\n ok: boolean;\n payload?: unknown;\n error?: { code: string; message: string; details?: unknown };\n};\n\nexport type GatewayHelloOk = {\n type: \"hello-ok\";\n protocol: number;\n features?: { methods?: string[]; events?: string[] };\n snapshot?: unknown;\n policy?: { tickIntervalMs?: number };\n};\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (err: unknown) => void;\n};\n\nexport type GatewayBrowserClientOptions = {\n url: string;\n token?: string;\n password?: string;\n clientName?: string;\n clientVersion?: string;\n platform?: string;\n mode?: string;\n instanceId?: string;\n onHello?: (hello: GatewayHelloOk) => void;\n onEvent?: (evt: GatewayEventFrame) => void;\n onClose?: (info: { code: number; reason: string }) => void;\n onGap?: (info: { expected: number; received: number }) => void;\n};\n\nexport class GatewayBrowserClient {\n private ws: WebSocket | null = null;\n private pending = new Map<string, Pending>();\n private closed = false;\n private lastSeq: number | null = null;\n private backoffMs = 800;\n\n constructor(private opts: GatewayBrowserClientOptions) {}\n\n start() {\n this.closed = false;\n this.connect();\n }\n\n stop() {\n this.closed = true;\n this.ws?.close();\n this.ws = null;\n this.flushPending(new Error(\"gateway client stopped\"));\n }\n\n get connected() {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private connect() {\n if (this.closed) return;\n this.ws = new WebSocket(this.opts.url);\n this.ws.onopen = () => this.sendConnect();\n this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? \"\"));\n this.ws.onclose = (ev) => {\n const reason = String(ev.reason ?? \"\");\n this.ws = null;\n this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));\n this.opts.onClose?.({ code: ev.code, reason });\n this.scheduleReconnect();\n };\n this.ws.onerror = () => {\n // ignored; close handler will fire\n };\n }\n\n private scheduleReconnect() {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);\n window.setTimeout(() => this.connect(), delay);\n }\n\n private flushPending(err: Error) {\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n\n private sendConnect() {\n const auth =\n this.opts.token || this.opts.password\n ? {\n token: this.opts.token,\n password: this.opts.password,\n }\n : undefined;\n const params = {\n minProtocol: 2,\n maxProtocol: 2,\n client: {\n name: this.opts.clientName ?? \"clawdbot-control-ui\",\n version: this.opts.clientVersion ?? \"dev\",\n platform: this.opts.platform ?? navigator.platform ?? \"web\",\n mode: this.opts.mode ?? \"webchat\",\n instanceId: this.opts.instanceId,\n },\n caps: [],\n auth,\n userAgent: navigator.userAgent,\n locale: navigator.language,\n };\n\n void this.request<GatewayHelloOk>(\"connect\", params)\n .then((hello) => {\n this.backoffMs = 800;\n this.opts.onHello?.(hello);\n })\n .catch(() => {\n this.ws?.close(1008, \"connect failed\");\n });\n }\n\n private handleMessage(raw: string) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n\n const frame = parsed as { type?: unknown };\n if (frame.type === \"event\") {\n const evt = parsed as GatewayEventFrame;\n const seq = typeof evt.seq === \"number\" ? evt.seq : null;\n if (seq !== null) {\n if (this.lastSeq !== null && seq > this.lastSeq + 1) {\n this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });\n }\n this.lastSeq = seq;\n }\n this.opts.onEvent?.(evt);\n return;\n }\n\n if (frame.type === \"res\") {\n const res = parsed as GatewayResponseFrame;\n const pending = this.pending.get(res.id);\n if (!pending) return;\n this.pending.delete(res.id);\n if (res.ok) pending.resolve(res.payload);\n else pending.reject(new Error(res.error?.message ?? \"request failed\"));\n return;\n }\n }\n\n request<T = unknown>(method: string, params?: unknown): Promise<T> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error(\"gateway not connected\"));\n }\n const id = generateUUID();\n const frame = { type: \"req\", id, method, params };\n const p = new Promise<T>((resolve, reject) => {\n this.pending.set(id, { resolve: (v) => resolve(v as T), reject });\n });\n this.ws.send(JSON.stringify(frame));\n return p;\n }\n}\n","const KEY = \"clawdbot.control.settings.v1\";\n\nimport type { ThemeMode } from \"./theme\";\n\nexport type UiSettings = {\n gatewayUrl: string;\n token: string;\n sessionKey: string;\n theme: ThemeMode;\n};\n\nexport function loadSettings(): UiSettings {\n const defaultUrl = (() => {\n const proto = location.protocol === \"https:\" ? \"wss\" : \"ws\";\n return `${proto}://${location.host}`;\n })();\n\n const defaults: UiSettings = {\n gatewayUrl: defaultUrl,\n token: \"\",\n sessionKey: \"main\",\n theme: \"system\",\n };\n\n try {\n const raw = localStorage.getItem(KEY);\n if (!raw) return defaults;\n const parsed = JSON.parse(raw) as Partial<UiSettings>;\n return {\n gatewayUrl:\n typeof parsed.gatewayUrl === \"string\" && parsed.gatewayUrl.trim()\n ? parsed.gatewayUrl.trim()\n : defaults.gatewayUrl,\n token: typeof parsed.token === \"string\" ? parsed.token : defaults.token,\n sessionKey:\n typeof parsed.sessionKey === \"string\" && parsed.sessionKey.trim()\n ? parsed.sessionKey.trim()\n : defaults.sessionKey,\n theme:\n parsed.theme === \"light\" ||\n parsed.theme === \"dark\" ||\n parsed.theme === \"system\"\n ? parsed.theme\n : defaults.theme,\n };\n } catch {\n return defaults;\n }\n}\n\nexport function saveSettings(next: UiSettings) {\n localStorage.setItem(KEY, JSON.stringify(next));\n}\n","export const TAB_GROUPS = [\n { label: \"Chat\", tabs: [\"chat\"] },\n {\n label: \"Control\",\n tabs: [\"overview\", \"connections\", \"instances\", \"sessions\", \"cron\"],\n },\n { label: \"Agent\", tabs: [\"skills\", \"nodes\"] },\n { label: \"Settings\", tabs: [\"config\", \"debug\"] },\n] as const;\n\nexport type Tab =\n | \"overview\"\n | \"connections\"\n | \"instances\"\n | \"sessions\"\n | \"cron\"\n | \"skills\"\n | \"nodes\"\n | \"chat\"\n | \"config\"\n | \"debug\";\n\nconst TAB_PATHS: Record<Tab, string> = {\n overview: \"/overview\",\n connections: \"/connections\",\n instances: \"/instances\",\n sessions: \"/sessions\",\n cron: \"/cron\",\n skills: \"/skills\",\n nodes: \"/nodes\",\n chat: \"/chat\",\n config: \"/config\",\n debug: \"/debug\",\n};\n\nconst PATH_TO_TAB = new Map(\n Object.entries(TAB_PATHS).map(([tab, path]) => [path, tab as Tab]),\n);\n\nexport function normalizeBasePath(basePath: string): string {\n if (!basePath) return \"\";\n let base = basePath.trim();\n if (!base.startsWith(\"/\")) base = `/${base}`;\n if (base === \"/\") return \"\";\n if (base.endsWith(\"/\")) base = base.slice(0, -1);\n return base;\n}\n\nexport function normalizePath(path: string): string {\n if (!path) return \"/\";\n let normalized = path.trim();\n if (!normalized.startsWith(\"/\")) normalized = `/${normalized}`;\n if (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nexport function pathForTab(tab: Tab, basePath = \"\"): string {\n const base = normalizeBasePath(basePath);\n const path = TAB_PATHS[tab];\n return base ? `${base}${path}` : path;\n}\n\nexport function tabFromPath(pathname: string, basePath = \"\"): Tab | null {\n const base = normalizeBasePath(basePath);\n let path = pathname || \"/\";\n if (base) {\n if (path === base) {\n path = \"/\";\n } else if (path.startsWith(`${base}/`)) {\n path = path.slice(base.length);\n }\n }\n let normalized = normalizePath(path).toLowerCase();\n if (normalized.endsWith(\"/index.html\")) normalized = \"/\";\n if (normalized === \"/\") return \"chat\";\n return PATH_TO_TAB.get(normalized) ?? null;\n}\n\nexport function inferBasePathFromPathname(pathname: string): string {\n let normalized = normalizePath(pathname);\n if (normalized.endsWith(\"/index.html\")) {\n normalized = normalizePath(normalized.slice(0, -\"/index.html\".length));\n }\n if (normalized === \"/\") return \"\";\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.length === 0) return \"\";\n for (let i = 0; i < segments.length; i++) {\n const candidate = `/${segments.slice(i).join(\"/\")}`.toLowerCase();\n if (PATH_TO_TAB.has(candidate)) {\n const prefix = segments.slice(0, i);\n return prefix.length ? `/${prefix.join(\"/\")}` : \"\";\n }\n }\n return `/${segments.join(\"/\")}`;\n}\n\nexport function titleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Overview\";\n case \"connections\":\n return \"Connections\";\n case \"instances\":\n return \"Instances\";\n case \"sessions\":\n return \"Sessions\";\n case \"cron\":\n return \"Cron Jobs\";\n case \"skills\":\n return \"Skills\";\n case \"nodes\":\n return \"Nodes\";\n case \"chat\":\n return \"Chat\";\n case \"config\":\n return \"Config\";\n case \"debug\":\n return \"Debug\";\n default:\n return \"Control\";\n }\n}\n\nexport function subtitleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Gateway status, entry points, and a fast health read.\";\n case \"connections\":\n return \"Link providers and keep transport settings in sync.\";\n case \"instances\":\n return \"Presence beacons from connected clients and nodes.\";\n case \"sessions\":\n return \"Inspect active sessions and adjust per-session defaults.\";\n case \"cron\":\n return \"Schedule wakeups and recurring agent runs.\";\n case \"skills\":\n return \"Manage skill availability and API key injection.\";\n case \"nodes\":\n return \"Paired devices, capabilities, and command exposure.\";\n case \"chat\":\n return \"Direct gateway chat session for quick interventions.\";\n case \"config\":\n return \"Edit ~/.clawdbot/clawdbot.json safely.\";\n case \"debug\":\n return \"Gateway snapshots, events, and manual RPC calls.\";\n default:\n return \"\";\n }\n}\n","import rawConfig from \"./tool-display.json\";\n\ntype ToolDisplayActionSpec = {\n label?: string;\n detailKeys?: string[];\n};\n\ntype ToolDisplaySpec = {\n emoji?: string;\n title?: string;\n label?: string;\n detailKeys?: string[];\n actions?: Record<string, ToolDisplayActionSpec>;\n};\n\ntype ToolDisplayConfig = {\n version?: number;\n fallback?: ToolDisplaySpec;\n tools?: Record<string, ToolDisplaySpec>;\n};\n\nexport type ToolDisplay = {\n name: string;\n emoji: string;\n title: string;\n label: string;\n verb?: string;\n detail?: string;\n};\n\nconst TOOL_DISPLAY_CONFIG = rawConfig as ToolDisplayConfig;\nconst FALLBACK = TOOL_DISPLAY_CONFIG.fallback ?? { emoji: \"🧩\" };\nconst TOOL_MAP = TOOL_DISPLAY_CONFIG.tools ?? {};\n\nfunction normalizeToolName(name?: string): string {\n return (name ?? \"tool\").trim();\n}\n\nfunction defaultTitle(name: string): string {\n const cleaned = name.replace(/_/g, \" \").trim();\n if (!cleaned) return \"Tool\";\n return cleaned\n .split(/\\s+/)\n .map((part) =>\n part.length <= 2 && part.toUpperCase() === part\n ? part\n : `${part.at(0)?.toUpperCase() ?? \"\"}${part.slice(1)}`,\n )\n .join(\" \");\n}\n\nfunction normalizeVerb(value?: string): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/_/g, \" \");\n}\n\nfunction coerceDisplayValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n const firstLine = trimmed.split(/\\r?\\n/)[0]?.trim() ?? \"\";\n if (!firstLine) return undefined;\n return firstLine.length > 160 ? `${firstLine.slice(0, 157)}…` : firstLine;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n const values = value\n .map((item) => coerceDisplayValue(item))\n .filter((item): item is string => Boolean(item));\n if (values.length === 0) return undefined;\n const preview = values.slice(0, 3).join(\", \");\n return values.length > 3 ? `${preview}…` : preview;\n }\n return undefined;\n}\n\nfunction lookupValueByPath(args: unknown, path: string): unknown {\n if (!args || typeof args !== \"object\") return undefined;\n let current: unknown = args;\n for (const segment of path.split(\".\")) {\n if (!segment) return undefined;\n if (!current || typeof current !== \"object\") return undefined;\n const record = current as Record<string, unknown>;\n current = record[segment];\n }\n return current;\n}\n\nfunction resolveDetailFromKeys(args: unknown, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = lookupValueByPath(args, key);\n const display = coerceDisplayValue(value);\n if (display) return display;\n }\n return undefined;\n}\n\nfunction resolveReadDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n if (!path) return undefined;\n const offset = typeof record.offset === \"number\" ? record.offset : undefined;\n const limit = typeof record.limit === \"number\" ? record.limit : undefined;\n if (offset !== undefined && limit !== undefined) {\n return `${path}:${offset}-${offset + limit}`;\n }\n return path;\n}\n\nfunction resolveWriteDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n return path;\n}\n\nfunction resolveActionSpec(\n spec: ToolDisplaySpec | undefined,\n action: string | undefined,\n): ToolDisplayActionSpec | undefined {\n if (!spec || !action) return undefined;\n return spec.actions?.[action] ?? undefined;\n}\n\nexport function resolveToolDisplay(params: {\n name?: string;\n args?: unknown;\n meta?: string;\n}): ToolDisplay {\n const name = normalizeToolName(params.name);\n const key = name.toLowerCase();\n const spec = TOOL_MAP[key];\n const emoji = spec?.emoji ?? FALLBACK.emoji ?? \"🧩\";\n const title = spec?.title ?? defaultTitle(name);\n const label = spec?.label ?? name;\n const actionRaw =\n params.args && typeof params.args === \"object\"\n ? ((params.args as Record<string, unknown>).action as string | undefined)\n : undefined;\n const action = typeof actionRaw === \"string\" ? actionRaw.trim() : undefined;\n const actionSpec = resolveActionSpec(spec, action);\n const verb = normalizeVerb(actionSpec?.label ?? action);\n\n let detail: string | undefined;\n if (key === \"read\") detail = resolveReadDetail(params.args);\n if (!detail && (key === \"write\" || key === \"edit\" || key === \"attach\")) {\n detail = resolveWriteDetail(params.args);\n }\n\n const detailKeys =\n actionSpec?.detailKeys ?? spec?.detailKeys ?? FALLBACK.detailKeys ?? [];\n if (!detail && detailKeys.length > 0) {\n detail = resolveDetailFromKeys(params.args, detailKeys);\n }\n\n if (!detail && params.meta) {\n detail = params.meta;\n }\n\n if (detail) {\n detail = shortenHomeInString(detail);\n }\n\n return {\n name,\n emoji,\n title,\n label,\n verb,\n detail,\n };\n}\n\nexport function formatToolDetail(display: ToolDisplay): string | undefined {\n const parts: string[] = [];\n if (display.verb) parts.push(display.verb);\n if (display.detail) parts.push(display.detail);\n if (parts.length === 0) return undefined;\n return parts.join(\" · \");\n}\n\nexport function formatToolSummary(display: ToolDisplay): string {\n const detail = formatToolDetail(display);\n return detail\n ? `${display.emoji} ${display.label}: ${detail}`\n : `${display.emoji} ${display.label}`;\n}\n\nfunction shortenHomeInString(input: string): string {\n if (!input) return input;\n return input\n .replace(/\\/Users\\/[^/]+/g, \"~\")\n .replace(/\\/home\\/[^/]+/g, \"~\");\n}\n","import { html, nothing } from \"lit\";\n\nimport type { SessionsListResult } from \"../types\";\nimport { resolveToolDisplay, formatToolDetail } from \"../tool-display\";\n\nexport type ChatProps = {\n sessionKey: string;\n onSessionKeyChange: (next: string) => void;\n thinkingLevel: string | null;\n loading: boolean;\n sending: boolean;\n messages: unknown[];\n stream: string | null;\n draft: string;\n connected: boolean;\n canSend: boolean;\n disabledReason: string | null;\n sessions: SessionsListResult | null;\n onRefresh: () => void;\n onDraftChange: (next: string) => void;\n onSend: () => void;\n};\n\nexport function renderChat(props: ChatProps) {\n const canInteract = props.connected;\n const canCompose = props.canSend && !props.sending;\n const sessionOptions = resolveSessionOptions(props.sessionKey, props.sessions);\n const composePlaceholder = (() => {\n if (!props.connected) return \"Connect to the gateway to start chatting…\";\n if (!props.canSend) return \"Connect an iOS/Android node to enable Web Chat + Talk…\";\n return \"Message (⌘↩ to send)\";\n })();\n\n return html`\n <section class=\"card chat\">\n <div class=\"chat-header\">\n <div class=\"chat-header__left\">\n <label class=\"field chat-session\">\n <span>Session Key</span>\n <select\n .value=${props.sessionKey}\n ?disabled=${!canInteract}\n @change=${(e: Event) =>\n props.onSessionKeyChange((e.target as HTMLSelectElement).value)}\n >\n ${sessionOptions.map(\n (entry) =>\n html`<option value=${entry.key}>\n ${entry.displayName ?? entry.key}\n </option>`,\n )}\n </select>\n </label>\n <button\n class=\"btn\"\n ?disabled=${props.loading || !canInteract}\n @click=${props.onRefresh}\n >\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"chat-header__right\">\n <div class=\"muted\">Thinking: ${props.thinkingLevel ?? \"inherit\"}</div>\n </div>\n </div>\n\n ${props.disabledReason\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.disabledReason}\n </div>`\n : nothing}\n\n <div class=\"chat-thread\" role=\"log\" aria-live=\"polite\">\n ${props.loading ? html`<div class=\"muted\">Loading chat…</div>` : nothing}\n ${props.messages.map((m) => renderMessage(m))}\n ${props.stream\n ? renderMessage(\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: props.stream }],\n timestamp: Date.now(),\n },\n { streaming: true },\n )\n : nothing}\n </div>\n\n <div class=\"chat-compose\">\n <label class=\"field chat-compose__field\">\n <span>Message</span>\n <textarea\n .value=${props.draft}\n ?disabled=${!props.canSend}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key !== \"Enter\") return;\n if (!e.metaKey && !e.ctrlKey) return;\n e.preventDefault();\n if (canCompose) props.onSend();\n }}\n @input=${(e: Event) =>\n props.onDraftChange((e.target as HTMLTextAreaElement).value)}\n placeholder=${composePlaceholder}\n ></textarea>\n </label>\n <div class=\"row chat-compose__actions\">\n <button\n class=\"btn primary\"\n ?disabled=${!props.canSend || props.sending}\n @click=${props.onSend}\n >\n ${props.sending ? \"Sending…\" : \"Send\"}\n </button>\n </div>\n </div>\n </section>\n `;\n}\n\ntype SessionOption = {\n key: string;\n updatedAt?: number | null;\n displayName?: string;\n};\n\nfunction resolveSessionOptions(\n currentKey: string,\n sessions: SessionsListResult | null,\n) {\n const now = Date.now();\n const cutoff = now - 24 * 60 * 60 * 1000;\n const entries = Array.isArray(sessions?.sessions) ? sessions?.sessions ?? [] : [];\n const sorted = [...entries].sort(\n (a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0),\n );\n const recent: SessionOption[] = [];\n const seen = new Set<string>();\n for (const entry of sorted) {\n if (seen.has(entry.key)) continue;\n seen.add(entry.key);\n if ((entry.updatedAt ?? 0) < cutoff) continue;\n recent.push(entry);\n }\n\n const result: SessionOption[] = [];\n const included = new Set<string>();\n const mainKey = \"main\";\n const mainEntry = sorted.find((entry) => entry.key === mainKey);\n if (mainEntry) {\n result.push(mainEntry);\n included.add(mainKey);\n } else if (currentKey === mainKey) {\n result.push({ key: mainKey, updatedAt: null });\n included.add(mainKey);\n }\n\n for (const entry of recent) {\n if (included.has(entry.key)) continue;\n result.push(entry);\n included.add(entry.key);\n }\n\n if (!included.has(currentKey)) {\n result.push({ key: currentKey, updatedAt: null });\n }\n\n return result;\n}\n\nfunction renderMessage(message: unknown, opts?: { streaming?: boolean }) {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n const toolCards = extractToolCards(message);\n const hasToolCards = toolCards.length > 0;\n const isToolResult = isToolResultMessage(message);\n const extractedText = extractText(message);\n const contentText = typeof m.content === \"string\" ? m.content : null;\n const fallback = hasToolCards ? null : JSON.stringify(message, null, 2);\n const text = !isToolResult\n ? extractedText?.trim()\n ? extractedText\n : contentText?.trim()\n ? contentText\n : fallback\n : null;\n\n const timestamp =\n typeof m.timestamp === \"number\" ? new Date(m.timestamp).toLocaleTimeString() : \"\";\n const klass = role === \"assistant\" ? \"assistant\" : role === \"user\" ? \"user\" : \"other\";\n const who = role === \"assistant\" ? \"Assistant\" : role === \"user\" ? \"You\" : role;\n return html`\n <div class=\"chat-line ${klass}\">\n <div class=\"chat-msg\">\n <div class=\"chat-bubble ${opts?.streaming ? \"streaming\" : \"\"}\">\n ${text ? html`<div class=\"chat-text\">${text}</div>` : nothing}\n ${toolCards.map((card) => renderToolCard(card))}\n </div>\n <div class=\"chat-stamp mono\">\n ${who}${timestamp ? html` · ${timestamp}` : nothing}\n </div>\n </div>\n </div>\n `;\n}\n\nfunction extractText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (typeof m.text === \"string\") return m.text;\n return null;\n}\n\ntype ToolCard = {\n kind: \"call\" | \"result\";\n name: string;\n args?: unknown;\n text?: string;\n};\n\nfunction extractToolCards(message: unknown): ToolCard[] {\n const m = message as Record<string, unknown>;\n const content = normalizeContent(m.content);\n const cards: ToolCard[] = [];\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n const isToolCall =\n [\"toolcall\", \"tool_call\", \"tooluse\", \"tool_use\"].includes(kind) ||\n (typeof item.name === \"string\" && item.arguments != null);\n if (isToolCall) {\n cards.push({\n kind: \"call\",\n name: (item.name as string) ?? \"tool\",\n args: coerceArgs(item.arguments ?? item.args),\n });\n }\n }\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n if (kind !== \"toolresult\" && kind !== \"tool_result\") continue;\n const text = extractToolText(item);\n const name = typeof item.name === \"string\" ? item.name : \"tool\";\n cards.push({ kind: \"result\", name, text });\n }\n\n if (isToolResultMessage(message) && !cards.some((card) => card.kind === \"result\")) {\n const name =\n (typeof m.toolName === \"string\" && m.toolName) ||\n (typeof m.tool_name === \"string\" && m.tool_name) ||\n \"tool\";\n const text = extractText(message) ?? undefined;\n cards.push({ kind: \"result\", name, text });\n }\n\n return cards;\n}\n\nfunction renderToolCard(card: ToolCard) {\n const display = resolveToolDisplay({ name: card.name, args: card.args });\n const detail = formatToolDetail(display);\n return html`\n <div class=\"chat-tool-card\">\n <div class=\"chat-tool-card__title\">${display.emoji} ${display.label}</div>\n ${detail\n ? html`<div class=\"chat-tool-card__detail\">${detail}</div>`\n : nothing}\n ${card.text\n ? html`<div class=\"chat-tool-card__output\">${card.text}</div>`\n : nothing}\n </div>\n `;\n}\n\nfunction normalizeContent(content: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(content)) return [];\n return content.filter(Boolean) as Array<Record<string, unknown>>;\n}\n\nfunction coerceArgs(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n if (!trimmed) return value;\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return value;\n try {\n return JSON.parse(trimmed);\n } catch {\n return value;\n }\n}\n\nfunction extractToolText(item: Record<string, unknown>): string | undefined {\n if (typeof item.text === \"string\") return item.text;\n if (typeof item.content === \"string\") return item.content;\n return undefined;\n}\n\nfunction isToolResultMessage(message: unknown): boolean {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role.toLowerCase() : \"\";\n return role === \"toolresult\" || role === \"tool_result\";\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHint, ConfigUiHints } from \"../types\";\n\nexport type ConfigFormProps = {\n schema: unknown | null;\n uiHints: ConfigUiHints;\n value: Record<string, unknown> | null;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n};\n\ntype JsonSchema = {\n type?: string | string[];\n title?: string;\n description?: string;\n properties?: Record<string, JsonSchema>;\n items?: JsonSchema | JsonSchema[];\n enum?: unknown[];\n default?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n};\n\nexport function renderConfigForm(props: ConfigFormProps) {\n if (!props.schema) {\n return html`<div class=\"muted\">Schema unavailable.</div>`;\n }\n const schema = props.schema as JsonSchema;\n const value = props.value ?? {};\n if (schemaType(schema) !== \"object\" || !schema.properties) {\n return html`<div class=\"callout danger\">Unsupported schema. Use Raw.</div>`;\n }\n const entries = Object.entries(schema.properties);\n const sorted = entries.sort((a, b) => {\n const orderA = hintForPath([a[0]], props.uiHints)?.order ?? 0;\n const orderB = hintForPath([b[0]], props.uiHints)?.order ?? 0;\n if (orderA !== orderB) return orderA - orderB;\n return a[0].localeCompare(b[0]);\n });\n\n return html`\n <div class=\"config-form\">\n ${sorted.map(([key, node]) =>\n renderNode({\n schema: node,\n value: (value as Record<string, unknown>)[key],\n path: [key],\n hints: props.uiHints,\n onPatch: props.onPatch,\n }),\n )}\n </div>\n `;\n}\n\nfunction renderNode(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}) {\n const { schema, value, path, hints, onPatch } = params;\n const type = schemaType(schema);\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n\n if (schema.anyOf || schema.oneOf || schema.allOf) {\n return html`<div class=\"callout danger\">\n ${label}: unsupported schema node. Use Raw.\n </div>`;\n }\n\n if (type === \"object\") {\n const props = schema.properties ?? {};\n const entries = Object.entries(props);\n if (entries.length === 0) return nothing;\n return html`\n <fieldset class=\"field-group\">\n <legend>${label}</legend>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n ${entries.map(([key, node]) =>\n renderNode({\n schema: node,\n value: value && typeof value === \"object\" ? (value as any)[key] : undefined,\n path: [...path, key],\n hints,\n onPatch,\n }),\n )}\n </fieldset>\n `;\n }\n\n if (type === \"array\") {\n const itemSchema = Array.isArray(schema.items)\n ? schema.items[0]\n : schema.items;\n const arr = Array.isArray(value) ? value : [];\n return html`\n <div class=\"field\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <span>${label}</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [...arr, defaultValue(itemSchema)];\n onPatch(path, next);\n }}\n >\n Add\n </button>\n </div>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n ${arr.map((entry, index) =>\n html`<div class=\"array-item\">\n ${itemSchema\n ? renderNode({\n schema: itemSchema,\n value: entry,\n path: [...path, index],\n hints,\n onPatch,\n })\n : nothing}\n <button\n class=\"btn danger\"\n @click=${() => {\n const next = arr.slice();\n next.splice(index, 1);\n onPatch(path, next);\n }}\n >\n Remove\n </button>\n </div>`,\n )}\n </div>\n `;\n }\n\n if (schema.enum) {\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <select\n .value=${value == null ? \"\" : String(value)}\n @change=${(e: Event) =>\n onPatch(path, (e.target as HTMLSelectElement).value)}\n >\n ${schema.enum.map(\n (opt) => html`<option value=${String(opt)}>${String(opt)}</option>`,\n )}\n </select>\n </label>\n `;\n }\n\n if (type === \"boolean\") {\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <input\n type=\"checkbox\"\n .checked=${Boolean(value)}\n @change=${(e: Event) =>\n onPatch(path, (e.target as HTMLInputElement).checked)}\n />\n </label>\n `;\n }\n\n if (type === \"number\" || type === \"integer\") {\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <input\n type=\"number\"\n .value=${value == null ? \"\" : String(value)}\n @input=${(e: Event) => {\n const raw = (e.target as HTMLInputElement).value;\n const parsed = raw === \"\" ? undefined : Number(raw);\n onPatch(path, parsed);\n }}\n />\n </label>\n `;\n }\n\n if (type === \"string\") {\n const isSensitive = hint?.sensitive ?? isSensitivePath(path);\n const placeholder = hint?.placeholder ?? (isSensitive ? \"••••\" : \"\");\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <input\n type=${isSensitive ? \"password\" : \"text\"}\n placeholder=${placeholder}\n .value=${value == null ? \"\" : String(value)}\n @input=${(e: Event) =>\n onPatch(path, (e.target as HTMLInputElement).value)}\n />\n </label>\n `;\n }\n\n return html`<div class=\"field\">\n <span>${label}</span>\n <div class=\"muted\">Unsupported type. Use Raw.</div>\n </div>`;\n}\n\nfunction schemaType(schema: JsonSchema): string | undefined {\n if (!schema) return undefined;\n if (Array.isArray(schema.type)) {\n const filtered = schema.type.filter((t) => t !== \"null\");\n return filtered[0] ?? schema.type[0];\n }\n return schema.type;\n}\n\nfunction defaultValue(schema?: JsonSchema): unknown {\n if (!schema) return \"\";\n if (schema.default !== undefined) return schema.default;\n const type = schemaType(schema);\n switch (type) {\n case \"object\":\n return {};\n case \"array\":\n return [];\n case \"boolean\":\n return false;\n case \"number\":\n case \"integer\":\n return 0;\n case \"string\":\n return \"\";\n default:\n return \"\";\n }\n}\n\nfunction hintForPath(path: Array<string | number>, hints: ConfigUiHints) {\n const key = pathKey(path);\n return hints[key];\n}\n\nfunction pathKey(path: Array<string | number>): string {\n return path.filter((segment) => typeof segment === \"string\").join(\".\");\n}\n\nfunction humanize(raw: string) {\n return raw\n .replace(/_/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/\\s+/g, \" \")\n .replace(/^./, (m) => m.toUpperCase());\n}\n\nfunction isSensitivePath(path: Array<string | number>): boolean {\n const key = pathKey(path).toLowerCase();\n return (\n key.includes(\"token\") ||\n key.includes(\"password\") ||\n key.includes(\"secret\") ||\n key.includes(\"apikey\") ||\n key.endsWith(\"key\")\n );\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport { renderConfigForm } from \"./config-form\";\n\nexport type ConfigProps = {\n raw: string;\n valid: boolean | null;\n issues: unknown[];\n loading: boolean;\n saving: boolean;\n connected: boolean;\n schema: unknown | null;\n schemaLoading: boolean;\n uiHints: ConfigUiHints;\n formMode: \"form\" | \"raw\";\n formValue: Record<string, unknown> | null;\n onRawChange: (next: string) => void;\n onFormModeChange: (mode: \"form\" | \"raw\") => void;\n onFormPatch: (path: Array<string | number>, value: unknown) => void;\n onReload: () => void;\n onSave: () => void;\n};\n\nexport function renderConfig(props: ConfigProps) {\n const validity =\n props.valid == null ? \"unknown\" : props.valid ? \"valid\" : \"invalid\";\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div class=\"row\">\n <div class=\"card-title\">Config</div>\n <span class=\"pill\">${validity}</span>\n </div>\n <div class=\"row\">\n <div class=\"toggle-group\">\n <button\n class=\"btn ${props.formMode === \"form\" ? \"primary\" : \"\"}\"\n ?disabled=${props.schemaLoading || !props.schema}\n @click=${() => props.onFormModeChange(\"form\")}\n >\n Form\n </button>\n <button\n class=\"btn ${props.formMode === \"raw\" ? \"primary\" : \"\"}\"\n @click=${() => props.onFormModeChange(\"raw\")}\n >\n Raw\n </button>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onReload}>\n ${props.loading ? \"Loading…\" : \"Reload\"}\n </button>\n <button\n class=\"btn primary\"\n ?disabled=${props.saving || !props.connected}\n @click=${props.onSave}\n >\n ${props.saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n\n <div class=\"muted\" style=\"margin-top: 10px;\">\n Writes to <span class=\"mono\">~/.clawdbot/clawdbot.json</span>. Some changes\n require a gateway restart.\n </div>\n\n ${props.formMode === \"form\"\n ? html`<div style=\"margin-top: 12px;\">\n ${props.schemaLoading\n ? html`<div class=\"muted\">Loading schema…</div>`\n : renderConfigForm({\n schema: props.schema,\n uiHints: props.uiHints,\n value: props.formValue,\n onPatch: props.onFormPatch,\n })}\n </div>`\n : html`<label class=\"field\" style=\"margin-top: 12px;\">\n <span>Raw JSON5</span>\n <textarea\n .value=${props.raw}\n @input=${(e: Event) =>\n props.onRawChange((e.target as HTMLTextAreaElement).value)}\n ></textarea>\n </label>`}\n\n ${props.issues.length > 0\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n <pre class=\"code-block\">${JSON.stringify(props.issues, null, 2)}</pre>\n </div>`\n : nothing}\n </section>\n `;\n}\n","export function formatMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n return new Date(ms).toLocaleString();\n}\n\nexport function formatAgo(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n const diff = Date.now() - ms;\n if (diff < 0) return \"just now\";\n const sec = Math.round(diff / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n return `${day}d ago`;\n}\n\nexport function formatDurationMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n if (ms < 1000) return `${ms}ms`;\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h`;\n const day = Math.round(hr / 24);\n return `${day}d`;\n}\n\nexport function formatList(values?: Array<string | null | undefined>): string {\n if (!values || values.length === 0) return \"none\";\n return values.filter((v): v is string => Boolean(v && v.trim())).join(\", \");\n}\n\nexport function clampText(value: string, max = 120): string {\n if (value.length <= max) return value;\n return `${value.slice(0, Math.max(0, max - 1))}…`;\n}\n\nexport function toNumber(value: string, fallback: number): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function parseList(input: string): string[] {\n return input\n .split(/[,\\n]/)\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { ProvidersStatusSnapshot } from \"../types\";\nimport type {\n DiscordActionForm,\n DiscordForm,\n IMessageForm,\n SlackActionForm,\n SlackForm,\n SignalForm,\n TelegramForm,\n} from \"../ui-types\";\n\nconst discordActionOptions = [\n { key: \"reactions\", label: \"Reactions\" },\n { key: \"stickers\", label: \"Stickers\" },\n { key: \"polls\", label: \"Polls\" },\n { key: \"permissions\", label: \"Permissions\" },\n { key: \"messages\", label: \"Messages\" },\n { key: \"threads\", label: \"Threads\" },\n { key: \"pins\", label: \"Pins\" },\n { key: \"search\", label: \"Search\" },\n { key: \"memberInfo\", label: \"Member info\" },\n { key: \"roleInfo\", label: \"Role info\" },\n { key: \"channelInfo\", label: \"Channel info\" },\n { key: \"voiceStatus\", label: \"Voice status\" },\n { key: \"events\", label: \"Events\" },\n { key: \"roles\", label: \"Role changes\" },\n { key: \"moderation\", label: \"Moderation\" },\n] satisfies Array<{ key: keyof DiscordActionForm; label: string }>;\n\nconst slackActionOptions = [\n { key: \"reactions\", label: \"Reactions\" },\n { key: \"messages\", label: \"Messages\" },\n { key: \"pins\", label: \"Pins\" },\n { key: \"memberInfo\", label: \"Member info\" },\n { key: \"emojiList\", label: \"Emoji list\" },\n] satisfies Array<{ key: keyof SlackActionForm; label: string }>;\n\nexport type ConnectionsProps = {\n connected: boolean;\n loading: boolean;\n snapshot: ProvidersStatusSnapshot | null;\n lastError: string | null;\n lastSuccessAt: number | null;\n whatsappMessage: string | null;\n whatsappQrDataUrl: string | null;\n whatsappConnected: boolean | null;\n whatsappBusy: boolean;\n telegramForm: TelegramForm;\n telegramTokenLocked: boolean;\n telegramSaving: boolean;\n telegramStatus: string | null;\n discordForm: DiscordForm;\n discordTokenLocked: boolean;\n discordSaving: boolean;\n discordStatus: string | null;\n slackForm: SlackForm;\n slackTokenLocked: boolean;\n slackAppTokenLocked: boolean;\n slackSaving: boolean;\n slackStatus: string | null;\n signalForm: SignalForm;\n signalSaving: boolean;\n signalStatus: string | null;\n imessageForm: IMessageForm;\n imessageSaving: boolean;\n imessageStatus: string | null;\n onRefresh: (probe: boolean) => void;\n onWhatsAppStart: (force: boolean) => void;\n onWhatsAppWait: () => void;\n onWhatsAppLogout: () => void;\n onTelegramChange: (patch: Partial<TelegramForm>) => void;\n onTelegramSave: () => void;\n onDiscordChange: (patch: Partial<DiscordForm>) => void;\n onDiscordSave: () => void;\n onSlackChange: (patch: Partial<SlackForm>) => void;\n onSlackSave: () => void;\n onSignalChange: (patch: Partial<SignalForm>) => void;\n onSignalSave: () => void;\n onIMessageChange: (patch: Partial<IMessageForm>) => void;\n onIMessageSave: () => void;\n};\n\nexport function renderConnections(props: ConnectionsProps) {\n const whatsapp = props.snapshot?.whatsapp;\n const telegram = props.snapshot?.telegram;\n const discord = props.snapshot?.discord ?? null;\n const slack = props.snapshot?.slack ?? null;\n const signal = props.snapshot?.signal ?? null;\n const imessage = props.snapshot?.imessage ?? null;\n const providerOrder: ProviderKey[] = [\n \"whatsapp\",\n \"telegram\",\n \"discord\",\n \"slack\",\n \"signal\",\n \"imessage\",\n ];\n const orderedProviders = providerOrder\n .map((key, index) => ({\n key,\n enabled: providerEnabled(key, props),\n order: index,\n }))\n .sort((a, b) => {\n if (a.enabled !== b.enabled) return a.enabled ? -1 : 1;\n return a.order - b.order;\n });\n\n return html`\n <section class=\"grid grid-cols-2\">\n ${orderedProviders.map((provider) =>\n renderProvider(provider.key, props, {\n whatsapp,\n telegram,\n discord,\n slack,\n signal,\n imessage,\n }),\n )}\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Connection health</div>\n <div class=\"card-sub\">Provider status snapshots from the gateway.</div>\n </div>\n <div class=\"muted\">${props.lastSuccessAt ? formatAgo(props.lastSuccessAt) : \"n/a\"}</div>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n <pre class=\"code-block\" style=\"margin-top: 12px;\">\n${props.snapshot ? JSON.stringify(props.snapshot, null, 2) : \"No snapshot yet.\"}\n </pre>\n </section>\n `;\n}\n\nfunction formatDuration(ms?: number | null) {\n if (!ms && ms !== 0) return \"n/a\";\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n return `${hr}h`;\n}\n\ntype ProviderKey =\n | \"whatsapp\"\n | \"telegram\"\n | \"discord\"\n | \"slack\"\n | \"signal\"\n | \"imessage\";\n\nfunction providerEnabled(key: ProviderKey, props: ConnectionsProps) {\n const snapshot = props.snapshot;\n if (!snapshot) return false;\n switch (key) {\n case \"whatsapp\":\n return (\n snapshot.whatsapp.configured ||\n snapshot.whatsapp.linked ||\n snapshot.whatsapp.running\n );\n case \"telegram\":\n return snapshot.telegram.configured || snapshot.telegram.running;\n case \"discord\":\n return Boolean(snapshot.discord?.configured || snapshot.discord?.running);\n case \"slack\":\n return Boolean(snapshot.slack?.configured || snapshot.slack?.running);\n case \"signal\":\n return Boolean(snapshot.signal?.configured || snapshot.signal?.running);\n case \"imessage\":\n return Boolean(snapshot.imessage?.configured || snapshot.imessage?.running);\n default:\n return false;\n }\n}\n\nfunction renderProvider(\n key: ProviderKey,\n props: ConnectionsProps,\n data: {\n whatsapp?: ProvidersStatusSnapshot[\"whatsapp\"];\n telegram?: ProvidersStatusSnapshot[\"telegram\"];\n discord?: ProvidersStatusSnapshot[\"discord\"] | null;\n slack?: ProvidersStatusSnapshot[\"slack\"] | null;\n signal?: ProvidersStatusSnapshot[\"signal\"] | null;\n imessage?: ProvidersStatusSnapshot[\"imessage\"] | null;\n },\n) {\n switch (key) {\n case \"whatsapp\": {\n const whatsapp = data.whatsapp;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">WhatsApp</div>\n <div class=\"card-sub\">Link WhatsApp Web and monitor connection health.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${whatsapp?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Linked</span>\n <span>${whatsapp?.linked ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${whatsapp?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Connected</span>\n <span>${whatsapp?.connected ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Last connect</span>\n <span>\n ${whatsapp?.lastConnectedAt\n ? formatAgo(whatsapp.lastConnectedAt)\n : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Last message</span>\n <span>\n ${whatsapp?.lastMessageAt ? formatAgo(whatsapp.lastMessageAt) : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Auth age</span>\n <span>\n ${whatsapp?.authAgeMs != null ? formatDuration(whatsapp.authAgeMs) : \"n/a\"}\n </span>\n </div>\n </div>\n\n ${whatsapp?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${whatsapp.lastError}\n </div>`\n : nothing}\n\n ${props.whatsappMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.whatsappMessage}\n </div>`\n : nothing}\n\n ${props.whatsappQrDataUrl\n ? html`<div class=\"qr-wrap\">\n <img src=${props.whatsappQrDataUrl} alt=\"WhatsApp QR\" />\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px; flex-wrap: wrap;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(false)}\n >\n ${props.whatsappBusy ? \"Working…\" : \"Show QR\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(true)}\n >\n Relink\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppWait()}\n >\n Wait for scan\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppLogout()}\n >\n Logout\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Refresh\n </button>\n </div>\n </div>\n `;\n }\n case \"telegram\": {\n const telegram = data.telegram;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Telegram</div>\n <div class=\"card-sub\">Bot token and delivery options.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${telegram?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${telegram?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Mode</span>\n <span>${telegram?.mode ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${telegram?.lastStartAt ? formatAgo(telegram.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${telegram?.lastProbeAt ? formatAgo(telegram.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${telegram?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${telegram.lastError}\n </div>`\n : nothing}\n\n ${telegram?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${telegram.probe.ok ? \"ok\" : \"failed\"} ·\n ${telegram.probe.status ?? \"\"}\n ${telegram.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Bot token</span>\n <input\n type=\"password\"\n .value=${props.telegramForm.token}\n ?disabled=${props.telegramTokenLocked}\n @input=${(e: Event) =>\n props.onTelegramChange({\n token: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Require mention in groups</span>\n <select\n .value=${props.telegramForm.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onTelegramChange({\n requireMention: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Allow from</span>\n <input\n .value=${props.telegramForm.allowFrom}\n @input=${(e: Event) =>\n props.onTelegramChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"123456789, @team\"\n />\n </label>\n <label class=\"field\">\n <span>Proxy</span>\n <input\n .value=${props.telegramForm.proxy}\n @input=${(e: Event) =>\n props.onTelegramChange({\n proxy: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"socks5://localhost:9050\"\n />\n </label>\n <label class=\"field\">\n <span>Webhook URL</span>\n <input\n .value=${props.telegramForm.webhookUrl}\n @input=${(e: Event) =>\n props.onTelegramChange({\n webhookUrl: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"https://example.com/telegram-webhook\"\n />\n </label>\n <label class=\"field\">\n <span>Webhook secret</span>\n <input\n .value=${props.telegramForm.webhookSecret}\n @input=${(e: Event) =>\n props.onTelegramChange({\n webhookSecret: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"secret\"\n />\n </label>\n <label class=\"field\">\n <span>Webhook path</span>\n <input\n .value=${props.telegramForm.webhookPath}\n @input=${(e: Event) =>\n props.onTelegramChange({\n webhookPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"/telegram-webhook\"\n />\n </label>\n </div>\n\n ${props.telegramTokenLocked\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n TELEGRAM_BOT_TOKEN is set in the environment. Config edits will not override it.\n </div>`\n : nothing}\n\n ${props.telegramStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.telegramStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.telegramSaving}\n @click=${() => props.onTelegramSave()}\n >\n ${props.telegramSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"discord\": {\n const discord = data.discord;\n const botName = discord?.probe?.bot?.username;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Discord</div>\n <div class=\"card-sub\">Bot connection and probe status.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${discord?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${discord?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Bot</span>\n <span>${botName ? `@${botName}` : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${discord?.lastStartAt ? formatAgo(discord.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${discord?.lastProbeAt ? formatAgo(discord.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${discord?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${discord.lastError}\n </div>`\n : nothing}\n\n ${discord?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${discord.probe.ok ? \"ok\" : \"failed\"} ·\n ${discord.probe.status ?? \"\"}\n ${discord.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.discordForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Bot token</span>\n <input\n type=\"password\"\n .value=${props.discordForm.token}\n ?disabled=${props.discordTokenLocked}\n @input=${(e: Event) =>\n props.onDiscordChange({\n token: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Allow DMs from</span>\n <input\n .value=${props.discordForm.allowFrom}\n @input=${(e: Event) =>\n props.onDiscordChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"123456789, username#1234\"\n />\n </label>\n <label class=\"field\">\n <span>DMs enabled</span>\n <select\n .value=${props.discordForm.dmEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n dmEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Group DMs</span>\n <select\n .value=${props.discordForm.groupEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n groupEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Group channels</span>\n <input\n .value=${props.discordForm.groupChannels}\n @input=${(e: Event) =>\n props.onDiscordChange({\n groupChannels: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"channelId1, channelId2\"\n />\n </label>\n <label class=\"field\">\n <span>Media max MB</span>\n <input\n .value=${props.discordForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onDiscordChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"8\"\n />\n </label>\n <label class=\"field\">\n <span>History limit</span>\n <input\n .value=${props.discordForm.historyLimit}\n @input=${(e: Event) =>\n props.onDiscordChange({\n historyLimit: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"20\"\n />\n </label>\n <label class=\"field\">\n <span>Text chunk limit</span>\n <input\n .value=${props.discordForm.textChunkLimit}\n @input=${(e: Event) =>\n props.onDiscordChange({\n textChunkLimit: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"2000\"\n />\n </label>\n <label class=\"field\">\n <span>Reply to mode</span>\n <select\n .value=${props.discordForm.replyToMode}\n @change=${(e: Event) =>\n props.onDiscordChange({\n replyToMode: (e.target as HTMLSelectElement).value as\n | \"off\"\n | \"first\"\n | \"all\",\n })}\n >\n <option value=\"off\">Off</option>\n <option value=\"first\">First</option>\n <option value=\"all\">All</option>\n </select>\n </label>\n <div class=\"field full\">\n <span>Guilds</span>\n <div class=\"card-sub\">\n Add each guild (id or slug) and optional channel rules. Empty channel\n entries still allow that channel.\n </div>\n <div class=\"list\">\n ${props.discordForm.guilds.map(\n (guild, guildIndex) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"form-grid\">\n <label class=\"field\">\n <span>Guild id / slug</span>\n <input\n .value=${guild.key}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n key: (e.target as HTMLInputElement).value,\n };\n props.onDiscordChange({ guilds: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Slug</span>\n <input\n .value=${guild.slug}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n slug: (e.target as HTMLInputElement).value,\n };\n props.onDiscordChange({ guilds: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Require mention</span>\n <select\n .value=${guild.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n requireMention:\n (e.target as HTMLSelectElement).value === \"yes\",\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Reaction notifications</span>\n <select\n .value=${guild.reactionNotifications}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n reactionNotifications: (e.target as HTMLSelectElement)\n .value as \"off\" | \"own\" | \"all\" | \"allowlist\",\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"off\">Off</option>\n <option value=\"own\">Own</option>\n <option value=\"all\">All</option>\n <option value=\"allowlist\">Allowlist</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Users allowlist</span>\n <input\n .value=${guild.users}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n users: (e.target as HTMLInputElement).value,\n };\n props.onDiscordChange({ guilds: next });\n }}\n placeholder=\"123456789, username#1234\"\n />\n </label>\n </div>\n ${guild.channels.length\n ? html`\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n ${guild.channels.map(\n (channel, channelIndex) => html`\n <label class=\"field\">\n <span>Channel id / slug</span>\n <input\n .value=${channel.key}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels[channelIndex] = {\n ...channels[channelIndex],\n key: (e.target as HTMLInputElement).value,\n };\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Allow</span>\n <select\n .value=${channel.allow ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels[channelIndex] = {\n ...channels[channelIndex],\n allow:\n (e.target as HTMLSelectElement).value ===\n \"yes\",\n };\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Require mention</span>\n <select\n .value=${channel.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels[channelIndex] = {\n ...channels[channelIndex],\n requireMention:\n (e.target as HTMLSelectElement).value ===\n \"yes\",\n };\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>&nbsp;</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [\n ...props.discordForm.guilds,\n ];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels.splice(channelIndex, 1);\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n Remove\n </button>\n </label>\n `,\n )}\n </div>\n `\n : nothing}\n </div>\n <div class=\"list-meta\">\n <span>Channels</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n { key: \"\", allow: true, requireMention: false },\n ];\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n Add channel\n </button>\n <button\n class=\"btn danger\"\n @click=${() => {\n const next = [...props.discordForm.guilds];\n next.splice(guildIndex, 1);\n props.onDiscordChange({ guilds: next });\n }}\n >\n Remove guild\n </button>\n </div>\n </div>\n `,\n )}\n </div>\n <button\n class=\"btn\"\n style=\"margin-top: 8px;\"\n @click=${() =>\n props.onDiscordChange({\n guilds: [\n ...props.discordForm.guilds,\n {\n key: \"\",\n slug: \"\",\n requireMention: false,\n reactionNotifications: \"own\",\n users: \"\",\n channels: [],\n },\n ],\n })}\n >\n Add guild\n </button>\n </div>\n <label class=\"field\">\n <span>Slash command</span>\n <select\n .value=${props.discordForm.slashEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n slashEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Slash name</span>\n <input\n .value=${props.discordForm.slashName}\n @input=${(e: Event) =>\n props.onDiscordChange({\n slashName: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"clawd\"\n />\n </label>\n <label class=\"field\">\n <span>Slash session prefix</span>\n <input\n .value=${props.discordForm.slashSessionPrefix}\n @input=${(e: Event) =>\n props.onDiscordChange({\n slashSessionPrefix: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"discord:slash\"\n />\n </label>\n <label class=\"field\">\n <span>Slash ephemeral</span>\n <select\n .value=${props.discordForm.slashEphemeral ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n slashEphemeral: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n </div>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Tool actions</div>\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n ${discordActionOptions.map(\n (action) => html`<label class=\"field\">\n <span>${action.label}</span>\n <select\n .value=${props.discordForm.actions[action.key] ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n actions: {\n ...props.discordForm.actions,\n [action.key]: (e.target as HTMLSelectElement).value === \"yes\",\n },\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>`,\n )}\n </div>\n\n ${props.discordTokenLocked\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n DISCORD_BOT_TOKEN is set in the environment. Config edits will not override it.\n </div>`\n : nothing}\n\n ${props.discordStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.discordStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.discordSaving}\n @click=${() => props.onDiscordSave()}\n >\n ${props.discordSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"slack\": {\n const slack = data.slack;\n const botName = slack?.probe?.bot?.name;\n const teamName = slack?.probe?.team?.name;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Slack</div>\n <div class=\"card-sub\">Socket mode status and bot details.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${slack?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${slack?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Bot</span>\n <span>${botName ? botName : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Team</span>\n <span>${teamName ? teamName : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${slack?.lastStartAt ? formatAgo(slack.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${slack?.lastProbeAt ? formatAgo(slack.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${slack?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${slack.lastError}\n </div>`\n : nothing}\n\n ${slack?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${slack.probe.ok ? \"ok\" : \"failed\"} ·\n ${slack.probe.status ?? \"\"}\n ${slack.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.slackForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Bot token</span>\n <input\n type=\"password\"\n .value=${props.slackForm.botToken}\n ?disabled=${props.slackTokenLocked}\n @input=${(e: Event) =>\n props.onSlackChange({\n botToken: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>App token</span>\n <input\n type=\"password\"\n .value=${props.slackForm.appToken}\n ?disabled=${props.slackAppTokenLocked}\n @input=${(e: Event) =>\n props.onSlackChange({\n appToken: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>DMs enabled</span>\n <select\n .value=${props.slackForm.dmEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n dmEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Allow DMs from</span>\n <input\n .value=${props.slackForm.allowFrom}\n @input=${(e: Event) =>\n props.onSlackChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"U123, U456, *\"\n />\n </label>\n <label class=\"field\">\n <span>Group DMs enabled</span>\n <select\n .value=${props.slackForm.groupEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n groupEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Group DM channels</span>\n <input\n .value=${props.slackForm.groupChannels}\n @input=${(e: Event) =>\n props.onSlackChange({\n groupChannels: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"G123, #team\"\n />\n </label>\n <label class=\"field\">\n <span>Reaction notifications</span>\n <select\n .value=${props.slackForm.reactionNotifications}\n @change=${(e: Event) =>\n props.onSlackChange({\n reactionNotifications: (e.target as HTMLSelectElement)\n .value as \"off\" | \"own\" | \"all\" | \"allowlist\",\n })}\n >\n <option value=\"off\">Off</option>\n <option value=\"own\">Own</option>\n <option value=\"all\">All</option>\n <option value=\"allowlist\">Allowlist</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Reaction allowlist</span>\n <input\n .value=${props.slackForm.reactionAllowlist}\n @input=${(e: Event) =>\n props.onSlackChange({\n reactionAllowlist: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"U123, U456\"\n />\n </label>\n <label class=\"field\">\n <span>Text chunk limit</span>\n <input\n .value=${props.slackForm.textChunkLimit}\n @input=${(e: Event) =>\n props.onSlackChange({\n textChunkLimit: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"4000\"\n />\n </label>\n <label class=\"field\">\n <span>Media max (MB)</span>\n <input\n .value=${props.slackForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onSlackChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"20\"\n />\n </label>\n </div>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Slash command</div>\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n <label class=\"field\">\n <span>Slash enabled</span>\n <select\n .value=${props.slackForm.slashEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n slashEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Slash name</span>\n <input\n .value=${props.slackForm.slashName}\n @input=${(e: Event) =>\n props.onSlackChange({\n slashName: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"clawd\"\n />\n </label>\n <label class=\"field\">\n <span>Slash session prefix</span>\n <input\n .value=${props.slackForm.slashSessionPrefix}\n @input=${(e: Event) =>\n props.onSlackChange({\n slashSessionPrefix: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"slack:slash\"\n />\n </label>\n <label class=\"field\">\n <span>Slash ephemeral</span>\n <select\n .value=${props.slackForm.slashEphemeral ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n slashEphemeral: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n </div>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Channels</div>\n <div class=\"card-sub\">\n Add channel ids or #names and optionally require mentions.\n </div>\n <div class=\"list\">\n ${props.slackForm.channels.map(\n (channel, channelIndex) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"form-grid\">\n <label class=\"field\">\n <span>Channel id / name</span>\n <input\n .value=${channel.key}\n @input=${(e: Event) => {\n const next = [...props.slackForm.channels];\n next[channelIndex] = {\n ...next[channelIndex],\n key: (e.target as HTMLInputElement).value,\n };\n props.onSlackChange({ channels: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Allow</span>\n <select\n .value=${channel.allow ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.slackForm.channels];\n next[channelIndex] = {\n ...next[channelIndex],\n allow:\n (e.target as HTMLSelectElement).value === \"yes\",\n };\n props.onSlackChange({ channels: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Require mention</span>\n <select\n .value=${channel.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.slackForm.channels];\n next[channelIndex] = {\n ...next[channelIndex],\n requireMention:\n (e.target as HTMLSelectElement).value === \"yes\",\n };\n props.onSlackChange({ channels: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>&nbsp;</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [...props.slackForm.channels];\n next.splice(channelIndex, 1);\n props.onSlackChange({ channels: next });\n }}\n >\n Remove\n </button>\n </label>\n </div>\n </div>\n </div>\n `,\n )}\n </div>\n <button\n class=\"btn\"\n style=\"margin-top: 8px;\"\n @click=${() =>\n props.onSlackChange({\n channels: [\n ...props.slackForm.channels,\n { key: \"\", allow: true, requireMention: false },\n ],\n })}\n >\n Add channel\n </button>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Tool actions</div>\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n ${slackActionOptions.map(\n (action) => html`<label class=\"field\">\n <span>${action.label}</span>\n <select\n .value=${props.slackForm.actions[action.key] ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n actions: {\n ...props.slackForm.actions,\n [action.key]: (e.target as HTMLSelectElement).value === \"yes\",\n },\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>`,\n )}\n </div>\n\n ${props.slackTokenLocked || props.slackAppTokenLocked\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.slackTokenLocked ? \"SLACK_BOT_TOKEN \" : \"\"}\n ${props.slackAppTokenLocked ? \"SLACK_APP_TOKEN \" : \"\"}\n is set in the environment. Config edits will not override it.\n </div>`\n : nothing}\n\n ${props.slackStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.slackStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.slackSaving}\n @click=${() => props.onSlackSave()}\n >\n ${props.slackSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"signal\": {\n const signal = data.signal;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Signal</div>\n <div class=\"card-sub\">REST daemon status and probe details.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${signal?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${signal?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Base URL</span>\n <span>${signal?.baseUrl ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${signal?.lastStartAt ? formatAgo(signal.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${signal?.lastProbeAt ? formatAgo(signal.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${signal?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${signal.lastError}\n </div>`\n : nothing}\n\n ${signal?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${signal.probe.ok ? \"ok\" : \"failed\"} ·\n ${signal.probe.status ?? \"\"}\n ${signal.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.signalForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Account</span>\n <input\n .value=${props.signalForm.account}\n @input=${(e: Event) =>\n props.onSignalChange({\n account: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"+15551234567\"\n />\n </label>\n <label class=\"field\">\n <span>HTTP URL</span>\n <input\n .value=${props.signalForm.httpUrl}\n @input=${(e: Event) =>\n props.onSignalChange({\n httpUrl: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"http://127.0.0.1:8080\"\n />\n </label>\n <label class=\"field\">\n <span>HTTP host</span>\n <input\n .value=${props.signalForm.httpHost}\n @input=${(e: Event) =>\n props.onSignalChange({\n httpHost: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"127.0.0.1\"\n />\n </label>\n <label class=\"field\">\n <span>HTTP port</span>\n <input\n .value=${props.signalForm.httpPort}\n @input=${(e: Event) =>\n props.onSignalChange({\n httpPort: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"8080\"\n />\n </label>\n <label class=\"field\">\n <span>CLI path</span>\n <input\n .value=${props.signalForm.cliPath}\n @input=${(e: Event) =>\n props.onSignalChange({\n cliPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"signal-cli\"\n />\n </label>\n <label class=\"field\">\n <span>Auto start</span>\n <select\n .value=${props.signalForm.autoStart ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n autoStart: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Receive mode</span>\n <select\n .value=${props.signalForm.receiveMode}\n @change=${(e: Event) =>\n props.onSignalChange({\n receiveMode: (e.target as HTMLSelectElement).value as\n | \"on-start\"\n | \"manual\"\n | \"\",\n })}\n >\n <option value=\"\">Default</option>\n <option value=\"on-start\">on-start</option>\n <option value=\"manual\">manual</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Ignore attachments</span>\n <select\n .value=${props.signalForm.ignoreAttachments ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n ignoreAttachments:\n (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Ignore stories</span>\n <select\n .value=${props.signalForm.ignoreStories ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n ignoreStories: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Send read receipts</span>\n <select\n .value=${props.signalForm.sendReadReceipts ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n sendReadReceipts:\n (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Allow from</span>\n <input\n .value=${props.signalForm.allowFrom}\n @input=${(e: Event) =>\n props.onSignalChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"12345, +1555\"\n />\n </label>\n <label class=\"field\">\n <span>Media max MB</span>\n <input\n .value=${props.signalForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onSignalChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"8\"\n />\n </label>\n </div>\n\n ${props.signalStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.signalStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.signalSaving}\n @click=${() => props.onSignalSave()}\n >\n ${props.signalSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"imessage\": {\n const imessage = data.imessage;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">iMessage</div>\n <div class=\"card-sub\">imsg CLI and database availability.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${imessage?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${imessage?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">CLI</span>\n <span>${imessage?.cliPath ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">DB</span>\n <span>${imessage?.dbPath ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>\n ${imessage?.lastStartAt ? formatAgo(imessage.lastStartAt) : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>\n ${imessage?.lastProbeAt ? formatAgo(imessage.lastProbeAt) : \"n/a\"}\n </span>\n </div>\n </div>\n\n ${imessage?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${imessage.lastError}\n </div>`\n : nothing}\n\n ${imessage?.probe && !imessage.probe.ok\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe failed · ${imessage.probe.error ?? \"unknown error\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.imessageForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onIMessageChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>CLI path</span>\n <input\n .value=${props.imessageForm.cliPath}\n @input=${(e: Event) =>\n props.onIMessageChange({\n cliPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"imsg\"\n />\n </label>\n <label class=\"field\">\n <span>DB path</span>\n <input\n .value=${props.imessageForm.dbPath}\n @input=${(e: Event) =>\n props.onIMessageChange({\n dbPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"~/Library/Messages/chat.db\"\n />\n </label>\n <label class=\"field\">\n <span>Service</span>\n <select\n .value=${props.imessageForm.service}\n @change=${(e: Event) =>\n props.onIMessageChange({\n service: (e.target as HTMLSelectElement).value as\n | \"auto\"\n | \"imessage\"\n | \"sms\",\n })}\n >\n <option value=\"auto\">Auto</option>\n <option value=\"imessage\">iMessage</option>\n <option value=\"sms\">SMS</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Region</span>\n <input\n .value=${props.imessageForm.region}\n @input=${(e: Event) =>\n props.onIMessageChange({\n region: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"US\"\n />\n </label>\n <label class=\"field\">\n <span>Allow from</span>\n <input\n .value=${props.imessageForm.allowFrom}\n @input=${(e: Event) =>\n props.onIMessageChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"chat_id:101, +1555\"\n />\n </label>\n <label class=\"field\">\n <span>Include attachments</span>\n <select\n .value=${props.imessageForm.includeAttachments ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onIMessageChange({\n includeAttachments:\n (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Media max MB</span>\n <input\n .value=${props.imessageForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onIMessageChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"16\"\n />\n </label>\n </div>\n\n ${props.imessageStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.imessageStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.imessageSaving}\n @click=${() => props.onIMessageSave()}\n >\n ${props.imessageSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n default:\n return nothing;\n }\n}\n","import { formatAgo, formatDurationMs, formatMs } from \"./format\";\nimport type { CronJob, GatewaySessionRow, PresenceEntry } from \"./types\";\n\nexport function formatPresenceSummary(entry: PresenceEntry): string {\n const host = entry.host ?? \"unknown\";\n const ip = entry.ip ? `(${entry.ip})` : \"\";\n const mode = entry.mode ?? \"\";\n const version = entry.version ?? \"\";\n return `${host} ${ip} ${mode} ${version}`.trim();\n}\n\nexport function formatPresenceAge(entry: PresenceEntry): string {\n const ts = entry.ts ?? null;\n return ts ? formatAgo(ts) : \"n/a\";\n}\n\nexport function formatNextRun(ms?: number | null) {\n if (!ms) return \"n/a\";\n return `${formatMs(ms)} (${formatAgo(ms)})`;\n}\n\nexport function formatSessionTokens(row: GatewaySessionRow) {\n if (row.totalTokens == null) return \"n/a\";\n const total = row.totalTokens ?? 0;\n const ctx = row.contextTokens ?? 0;\n return ctx ? `${total} / ${ctx}` : String(total);\n}\n\nexport function formatEventPayload(payload: unknown): string {\n if (payload == null) return \"\";\n try {\n return JSON.stringify(payload, null, 2);\n } catch {\n return String(payload);\n }\n}\n\nexport function formatCronState(job: CronJob) {\n const state = job.state ?? {};\n const next = state.nextRunAtMs ? formatMs(state.nextRunAtMs) : \"n/a\";\n const last = state.lastRunAtMs ? formatMs(state.lastRunAtMs) : \"n/a\";\n const status = state.lastStatus ?? \"n/a\";\n return `${status} · next ${next} · last ${last}`;\n}\n\nexport function formatCronSchedule(job: CronJob) {\n const s = job.schedule;\n if (s.kind === \"at\") return `At ${formatMs(s.atMs)}`;\n if (s.kind === \"every\") return `Every ${formatDurationMs(s.everyMs)}`;\n return `Cron ${s.expr}${s.tz ? ` (${s.tz})` : \"\"}`;\n}\n\nexport function formatCronPayload(job: CronJob) {\n const p = job.payload;\n if (p.kind === \"systemEvent\") return `System: ${p.text}`;\n return `Agent: ${p.message}`;\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatMs } from \"../format\";\nimport {\n formatCronPayload,\n formatCronSchedule,\n formatCronState,\n formatNextRun,\n} from \"../presenter\";\nimport type { CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronProps = {\n loading: boolean;\n status: CronStatus | null;\n jobs: CronJob[];\n error: string | null;\n busy: boolean;\n form: CronFormState;\n runsJobId: string | null;\n runs: CronRunLogEntry[];\n onFormChange: (patch: Partial<CronFormState>) => void;\n onRefresh: () => void;\n onAdd: () => void;\n onToggle: (job: CronJob, enabled: boolean) => void;\n onRun: (job: CronJob) => void;\n onRemove: (job: CronJob) => void;\n onLoadRuns: (jobId: string) => void;\n};\n\nexport function renderCron(props: CronProps) {\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"card-title\">Scheduler</div>\n <div class=\"card-sub\">Gateway-owned cron scheduler status.</div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">Enabled</div>\n <div class=\"stat-value\">\n ${props.status\n ? props.status.enabled\n ? \"Yes\"\n : \"No\"\n : \"n/a\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Jobs</div>\n <div class=\"stat-value\">${props.status?.jobCount ?? \"n/a\"}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Next wake</div>\n <div class=\"stat-value\">${formatNextRun(props.status?.nextWakeAtMs ?? null)}</div>\n </div>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n ${props.error ? html`<span class=\"muted\">${props.error}</span>` : nothing}\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">New Job</div>\n <div class=\"card-sub\">Create a scheduled wakeup or agent run.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Name</span>\n <input\n .value=${props.form.name}\n @input=${(e: Event) =>\n props.onFormChange({ name: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>Description</span>\n <input\n .value=${props.form.description}\n @input=${(e: Event) =>\n props.onFormChange({ description: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Enabled</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.enabled}\n @change=${(e: Event) =>\n props.onFormChange({ enabled: (e.target as HTMLInputElement).checked })}\n />\n </label>\n <label class=\"field\">\n <span>Schedule</span>\n <select\n .value=${props.form.scheduleKind}\n @change=${(e: Event) =>\n props.onFormChange({\n scheduleKind: (e.target as HTMLSelectElement).value as CronFormState[\"scheduleKind\"],\n })}\n >\n <option value=\"every\">Every</option>\n <option value=\"at\">At</option>\n <option value=\"cron\">Cron</option>\n </select>\n </label>\n </div>\n ${renderScheduleFields(props)}\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Session</span>\n <select\n .value=${props.form.sessionTarget}\n @change=${(e: Event) =>\n props.onFormChange({\n sessionTarget: (e.target as HTMLSelectElement).value as CronFormState[\"sessionTarget\"],\n })}\n >\n <option value=\"main\">Main</option>\n <option value=\"isolated\">Isolated</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Wake mode</span>\n <select\n .value=${props.form.wakeMode}\n @change=${(e: Event) =>\n props.onFormChange({\n wakeMode: (e.target as HTMLSelectElement).value as CronFormState[\"wakeMode\"],\n })}\n >\n <option value=\"next-heartbeat\">Next heartbeat</option>\n <option value=\"now\">Now</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Payload</span>\n <select\n .value=${props.form.payloadKind}\n @change=${(e: Event) =>\n props.onFormChange({\n payloadKind: (e.target as HTMLSelectElement).value as CronFormState[\"payloadKind\"],\n })}\n >\n <option value=\"systemEvent\">System event</option>\n <option value=\"agentTurn\">Agent turn</option>\n </select>\n </label>\n </div>\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>${props.form.payloadKind === \"systemEvent\" ? \"System text\" : \"Agent message\"}</span>\n <textarea\n .value=${props.form.payloadText}\n @input=${(e: Event) =>\n props.onFormChange({\n payloadText: (e.target as HTMLTextAreaElement).value,\n })}\n rows=\"4\"\n ></textarea>\n </label>\n ${props.form.payloadKind === \"agentTurn\"\n ? html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field checkbox\">\n <span>Deliver</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.deliver}\n @change=${(e: Event) =>\n props.onFormChange({\n deliver: (e.target as HTMLInputElement).checked,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Channel</span>\n <select\n .value=${props.form.channel}\n @change=${(e: Event) =>\n props.onFormChange({\n channel: (e.target as HTMLSelectElement).value as CronFormState[\"channel\"],\n })}\n >\n <option value=\"last\">Last</option>\n <option value=\"whatsapp\">WhatsApp</option>\n <option value=\"telegram\">Telegram</option>\n </select>\n </label>\n <label class=\"field\">\n <span>To</span>\n <input\n .value=${props.form.to}\n @input=${(e: Event) =>\n props.onFormChange({ to: (e.target as HTMLInputElement).value })}\n placeholder=\"+1555… or chat id\"\n />\n </label>\n <label class=\"field\">\n <span>Timeout (seconds)</span>\n <input\n .value=${props.form.timeoutSeconds}\n @input=${(e: Event) =>\n props.onFormChange({\n timeoutSeconds: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n ${props.form.sessionTarget === \"isolated\"\n ? html`\n <label class=\"field\">\n <span>Post to main prefix</span>\n <input\n .value=${props.form.postToMainPrefix}\n @input=${(e: Event) =>\n props.onFormChange({\n postToMainPrefix: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `\n : nothing}\n </div>\n `\n : nothing}\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn primary\" ?disabled=${props.busy} @click=${props.onAdd}>\n ${props.busy ? \"Saving…\" : \"Add job\"}\n </button>\n </div>\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Jobs</div>\n <div class=\"card-sub\">All scheduled jobs stored in the gateway.</div>\n ${props.jobs.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">No jobs yet.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.jobs.map((job) => renderJob(job, props))}\n </div>\n `}\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Run history</div>\n <div class=\"card-sub\">Latest runs for ${props.runsJobId ?? \"(select a job)\"}.</div>\n ${props.runs.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">No runs yet.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.runs.map((entry) => renderRun(entry))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderScheduleFields(props: CronProps) {\n const form = props.form;\n if (form.scheduleKind === \"at\") {\n return html`\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>Run at</span>\n <input\n type=\"datetime-local\"\n .value=${form.scheduleAt}\n @input=${(e: Event) =>\n props.onFormChange({\n scheduleAt: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `;\n }\n if (form.scheduleKind === \"every\") {\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Every</span>\n <input\n .value=${form.everyAmount}\n @input=${(e: Event) =>\n props.onFormChange({\n everyAmount: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Unit</span>\n <select\n .value=${form.everyUnit}\n @change=${(e: Event) =>\n props.onFormChange({\n everyUnit: (e.target as HTMLSelectElement).value as CronFormState[\"everyUnit\"],\n })}\n >\n <option value=\"minutes\">Minutes</option>\n <option value=\"hours\">Hours</option>\n <option value=\"days\">Days</option>\n </select>\n </label>\n </div>\n `;\n }\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Expression</span>\n <input\n .value=${form.cronExpr}\n @input=${(e: Event) =>\n props.onFormChange({ cronExpr: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>Timezone (optional)</span>\n <input\n .value=${form.cronTz}\n @input=${(e: Event) =>\n props.onFormChange({ cronTz: (e.target as HTMLInputElement).value })}\n />\n </label>\n </div>\n `;\n}\n\nfunction renderJob(job: CronJob, props: CronProps) {\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${job.name}</div>\n <div class=\"list-sub\">${formatCronSchedule(job)}</div>\n <div class=\"muted\">${formatCronPayload(job)}</div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${job.enabled ? \"enabled\" : \"disabled\"}</span>\n <span class=\"chip\">${job.sessionTarget}</span>\n <span class=\"chip\">${job.wakeMode}</span>\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatCronState(job)}</div>\n <div class=\"row\" style=\"justify-content: flex-end; margin-top: 8px;\">\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${() => props.onToggle(job, !job.enabled)}\n >\n ${job.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <button class=\"btn\" ?disabled=${props.busy} @click=${() => props.onRun(job)}>\n Run\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${() => props.onLoadRuns(job.id)}\n >\n Runs\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.busy}\n @click=${() => props.onRemove(job)}\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderRun(entry: CronRunLogEntry) {\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.status}</div>\n <div class=\"list-sub\">${entry.summary ?? \"\"}</div>\n </div>\n <div class=\"list-meta\">\n <div>${formatMs(entry.ts)}</div>\n <div class=\"muted\">${entry.durationMs ?? 0}ms</div>\n ${entry.error ? html`<div class=\"muted\">${entry.error}</div>` : nothing}\n </div>\n </div>\n `;\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatEventPayload } from \"../presenter\";\n\ntype EventLogEntry = {\n ts: number;\n event: string;\n payload?: unknown;\n};\n\nexport type DebugProps = {\n loading: boolean;\n status: Record<string, unknown> | null;\n health: Record<string, unknown> | null;\n models: unknown[];\n heartbeat: unknown;\n eventLog: EventLogEntry[];\n callMethod: string;\n callParams: string;\n callResult: string | null;\n callError: string | null;\n onCallMethodChange: (next: string) => void;\n onCallParamsChange: (next: string) => void;\n onRefresh: () => void;\n onCall: () => void;\n};\n\nexport function renderDebug(props: DebugProps) {\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Snapshots</div>\n <div class=\"card-sub\">Status, health, and heartbeat data.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"stack\" style=\"margin-top: 12px;\">\n <div>\n <div class=\"muted\">Status</div>\n <pre class=\"code-block\">${JSON.stringify(props.status ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Health</div>\n <pre class=\"code-block\">${JSON.stringify(props.health ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Last heartbeat</div>\n <pre class=\"code-block\">${JSON.stringify(props.heartbeat ?? {}, null, 2)}</pre>\n </div>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">Manual RPC</div>\n <div class=\"card-sub\">Send a raw gateway method with JSON params.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Method</span>\n <input\n .value=${props.callMethod}\n @input=${(e: Event) =>\n props.onCallMethodChange((e.target as HTMLInputElement).value)}\n placeholder=\"system-presence\"\n />\n </label>\n <label class=\"field\">\n <span>Params (JSON)</span>\n <textarea\n .value=${props.callParams}\n @input=${(e: Event) =>\n props.onCallParamsChange((e.target as HTMLTextAreaElement).value)}\n rows=\"6\"\n ></textarea>\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn primary\" @click=${props.onCall}>Call</button>\n </div>\n ${props.callError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.callError}\n </div>`\n : nothing}\n ${props.callResult\n ? html`<pre class=\"code-block\" style=\"margin-top: 12px;\">${props.callResult}</pre>`\n : nothing}\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Models</div>\n <div class=\"card-sub\">Catalog from models.list.</div>\n <pre class=\"code-block\" style=\"margin-top: 12px;\">${JSON.stringify(\n props.models ?? [],\n null,\n 2,\n )}</pre>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Event Log</div>\n <div class=\"card-sub\">Latest gateway events.</div>\n ${props.eventLog.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">No events yet.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.eventLog.map(\n (evt) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${evt.event}</div>\n <div class=\"list-sub\">${new Date(evt.ts).toLocaleTimeString()}</div>\n </div>\n <div class=\"list-meta\">\n <pre class=\"code-block\">${formatEventPayload(evt.payload)}</pre>\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </section>\n `;\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatPresenceAge, formatPresenceSummary } from \"../presenter\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type InstancesProps = {\n loading: boolean;\n entries: PresenceEntry[];\n lastError: string | null;\n statusMessage: string | null;\n onRefresh: () => void;\n};\n\nexport function renderInstances(props: InstancesProps) {\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Connected Instances</div>\n <div class=\"card-sub\">Presence beacons from the gateway and clients.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n ${props.statusMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.statusMessage}\n </div>`\n : nothing}\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.entries.length === 0\n ? html`<div class=\"muted\">No instances reported yet.</div>`\n : props.entries.map((entry) => renderEntry(entry))}\n </div>\n </section>\n `;\n}\n\nfunction renderEntry(entry: PresenceEntry) {\n const lastInput =\n entry.lastInputSeconds != null\n ? `${entry.lastInputSeconds}s ago`\n : \"n/a\";\n const mode = entry.mode ?? \"unknown\";\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.host ?? \"unknown host\"}</div>\n <div class=\"list-sub\">${formatPresenceSummary(entry)}</div>\n <div class=\"chip-row\">\n <span class=\"chip\">${mode}</span>\n ${entry.platform ? html`<span class=\"chip\">${entry.platform}</span>` : nothing}\n ${entry.deviceFamily\n ? html`<span class=\"chip\">${entry.deviceFamily}</span>`\n : nothing}\n ${entry.modelIdentifier\n ? html`<span class=\"chip\">${entry.modelIdentifier}</span>`\n : nothing}\n ${entry.version ? html`<span class=\"chip\">${entry.version}</span>` : nothing}\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatPresenceAge(entry)}</div>\n <div class=\"muted\">Last input ${lastInput}</div>\n <div class=\"muted\">Reason ${entry.reason ?? \"\"}</div>\n </div>\n </div>\n `;\n}\n","import { html } from \"lit\";\n\nexport type NodesProps = {\n loading: boolean;\n nodes: Array<Record<string, unknown>>;\n onRefresh: () => void;\n};\n\nexport function renderNodes(props: NodesProps) {\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Nodes</div>\n <div class=\"card-sub\">Paired devices and live connections.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.nodes.length === 0\n ? html`<div class=\"muted\">No nodes found.</div>`\n : props.nodes.map((n) => renderNode(n))}\n </div>\n </section>\n `;\n}\n\nfunction renderNode(node: Record<string, unknown>) {\n const connected = Boolean(node.connected);\n const paired = Boolean(node.paired);\n const title =\n (typeof node.displayName === \"string\" && node.displayName.trim()) ||\n (typeof node.nodeId === \"string\" ? node.nodeId : \"unknown\");\n const caps = Array.isArray(node.caps) ? (node.caps as unknown[]) : [];\n const commands = Array.isArray(node.commands) ? (node.commands as unknown[]) : [];\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${title}</div>\n <div class=\"list-sub\">\n ${typeof node.nodeId === \"string\" ? node.nodeId : \"\"}\n ${typeof node.remoteIp === \"string\" ? ` · ${node.remoteIp}` : \"\"}\n ${typeof node.version === \"string\" ? ` · ${node.version}` : \"\"}\n </div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${paired ? \"paired\" : \"unpaired\"}</span>\n <span class=\"chip ${connected ? \"chip-ok\" : \"chip-warn\"}\">\n ${connected ? \"connected\" : \"offline\"}\n </span>\n ${caps.slice(0, 12).map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n ${commands\n .slice(0, 8)\n .map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n </div>\n </div>\n </div>\n `;\n}\n\n","import { html } from \"lit\";\n\nimport type { GatewayHelloOk } from \"../gateway\";\nimport { formatAgo, formatDurationMs } from \"../format\";\nimport { formatNextRun } from \"../presenter\";\nimport type { UiSettings } from \"../storage\";\n\nexport type OverviewProps = {\n connected: boolean;\n hello: GatewayHelloOk | null;\n settings: UiSettings;\n password: string;\n lastError: string | null;\n presenceCount: number;\n sessionsCount: number | null;\n cronEnabled: boolean | null;\n cronNext: number | null;\n lastProvidersRefresh: number | null;\n onSettingsChange: (next: UiSettings) => void;\n onPasswordChange: (next: string) => void;\n onSessionKeyChange: (next: string) => void;\n onRefresh: () => void;\n};\n\nexport function renderOverview(props: OverviewProps) {\n const snapshot = props.hello?.snapshot as\n | { uptimeMs?: number; policy?: { tickIntervalMs?: number } }\n | undefined;\n const uptime = snapshot?.uptimeMs ? formatDurationMs(snapshot.uptimeMs) : \"n/a\";\n const tick = snapshot?.policy?.tickIntervalMs\n ? `${snapshot.policy.tickIntervalMs}ms`\n : \"n/a\";\n\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"card-title\">Gateway Access</div>\n <div class=\"card-sub\">Where the dashboard connects and how it authenticates.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>WebSocket URL</span>\n <input\n .value=${props.settings.gatewayUrl}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, gatewayUrl: v });\n }}\n placeholder=\"ws://100.x.y.z:18789\"\n />\n </label>\n <label class=\"field\">\n <span>Gateway Token</span>\n <input\n .value=${props.settings.token}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, token: v });\n }}\n placeholder=\"CLAWDBOT_GATEWAY_TOKEN\"\n />\n </label>\n <label class=\"field\">\n <span>Password (not stored)</span>\n <input\n type=\"password\"\n .value=${props.password}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onPasswordChange(v);\n }}\n placeholder=\"system or shared password\"\n />\n </label>\n <label class=\"field\">\n <span>Default Session Key</span>\n <input\n .value=${props.settings.sessionKey}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSessionKeyChange(v);\n }}\n />\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn\" @click=${() => props.onRefresh()}>Refresh</button>\n <span class=\"muted\">Reconnect to apply changes.</span>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">Snapshot</div>\n <div class=\"card-sub\">Latest gateway handshake information.</div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">Status</div>\n <div class=\"stat-value ${props.connected ? \"ok\" : \"warn\"}\">\n ${props.connected ? \"Connected\" : \"Disconnected\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Uptime</div>\n <div class=\"stat-value\">${uptime}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Tick Interval</div>\n <div class=\"stat-value\">${tick}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Last Providers Refresh</div>\n <div class=\"stat-value\">\n ${props.lastProvidersRefresh\n ? formatAgo(props.lastProvidersRefresh)\n : \"n/a\"}\n </div>\n </div>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 14px;\">\n ${props.lastError}\n </div>`\n : html`<div class=\"callout\" style=\"margin-top: 14px;\">\n Use Connections to link WhatsApp, Telegram, Discord, Signal, or iMessage.\n </div>`}\n </div>\n </section>\n\n <section class=\"grid grid-cols-3\" style=\"margin-top: 18px;\">\n <div class=\"card stat-card\">\n <div class=\"stat-label\">Instances</div>\n <div class=\"stat-value\">${props.presenceCount}</div>\n <div class=\"muted\">Presence beacons in the last 5 minutes.</div>\n </div>\n <div class=\"card stat-card\">\n <div class=\"stat-label\">Sessions</div>\n <div class=\"stat-value\">${props.sessionsCount ?? \"n/a\"}</div>\n <div class=\"muted\">Recent session keys tracked by the gateway.</div>\n </div>\n <div class=\"card stat-card\">\n <div class=\"stat-label\">Cron</div>\n <div class=\"stat-value\">\n ${props.cronEnabled == null\n ? \"n/a\"\n : props.cronEnabled\n ? \"Enabled\"\n : \"Disabled\"}\n </div>\n <div class=\"muted\">Next wake ${formatNextRun(props.cronNext)}</div>\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Notes</div>\n <div class=\"card-sub\">Quick reminders for remote control setups.</div>\n <div class=\"note-grid\" style=\"margin-top: 14px;\">\n <div>\n <div class=\"note-title\">Tailscale serve</div>\n <div class=\"muted\">\n Prefer serve mode to keep the gateway on loopback with tailnet auth.\n </div>\n </div>\n <div>\n <div class=\"note-title\">Session hygiene</div>\n <div class=\"muted\">Use /new or sessions.patch to reset context.</div>\n </div>\n <div>\n <div class=\"note-title\">Cron reminders</div>\n <div class=\"muted\">Use isolated sessions for recurring runs.</div>\n </div>\n </div>\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport { formatSessionTokens } from \"../presenter\";\nimport type { GatewaySessionRow, SessionsListResult } from \"../types\";\n\nexport type SessionsProps = {\n loading: boolean;\n result: SessionsListResult | null;\n error: string | null;\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n onFiltersChange: (next: {\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n }) => void;\n onRefresh: () => void;\n onPatch: (\n key: string,\n patch: { thinkingLevel?: string | null; verboseLevel?: string | null },\n ) => void;\n};\n\nconst THINK_LEVELS = [\"\", \"off\", \"minimal\", \"low\", \"medium\", \"high\"] as const;\nconst VERBOSE_LEVELS = [\"\", \"off\", \"on\"] as const;\n\nexport function renderSessions(props: SessionsProps) {\n const rows = props.result?.sessions ?? [];\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Sessions</div>\n <div class=\"card-sub\">Active session keys and per-session overrides.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\">\n <span>Active within (minutes)</span>\n <input\n .value=${props.activeMinutes}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: (e.target as HTMLInputElement).value,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Limit</span>\n <input\n .value=${props.limit}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: (e.target as HTMLInputElement).value,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Include global</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeGlobal}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: (e.target as HTMLInputElement).checked,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Include unknown</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeUnknown}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: (e.target as HTMLInputElement).checked,\n })}\n />\n </label>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"muted\" style=\"margin-top: 12px;\">\n ${props.result ? `Store: ${props.result.path}` : \"\"}\n </div>\n\n <div class=\"table\" style=\"margin-top: 16px;\">\n <div class=\"table-head\">\n <div>Key</div>\n <div>Kind</div>\n <div>Updated</div>\n <div>Tokens</div>\n <div>Thinking</div>\n <div>Verbose</div>\n </div>\n ${rows.length === 0\n ? html`<div class=\"muted\">No sessions found.</div>`\n : rows.map((row) => renderRow(row, props.onPatch))}\n </div>\n </section>\n `;\n}\n\nfunction renderRow(row: GatewaySessionRow, onPatch: SessionsProps[\"onPatch\"]) {\n const updated = row.updatedAt ? formatAgo(row.updatedAt) : \"n/a\";\n const thinking = row.thinkingLevel ?? \"\";\n const verbose = row.verboseLevel ?? \"\";\n return html`\n <div class=\"table-row\">\n <div class=\"mono\">${row.displayName ?? row.key}</div>\n <div>${row.kind}</div>\n <div>${updated}</div>\n <div>${formatSessionTokens(row)}</div>\n <div>\n <select\n .value=${thinking}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { thinkingLevel: value || null });\n }}\n >\n ${THINK_LEVELS.map((level) =>\n html`<option value=${level}>${level || \"inherit\"}</option>`,\n )}\n </select>\n </div>\n <div>\n <select\n .value=${verbose}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { verboseLevel: value || null });\n }}\n >\n ${VERBOSE_LEVELS.map((level) =>\n html`<option value=${level}>${level || \"inherit\"}</option>`,\n )}\n </select>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { clampText } from \"../format\";\nimport type { SkillStatusEntry, SkillStatusReport } from \"../types\";\n\nexport type SkillsProps = {\n loading: boolean;\n report: SkillStatusReport | null;\n error: string | null;\n filter: string;\n edits: Record<string, string>;\n busyKey: string | null;\n onFilterChange: (next: string) => void;\n onRefresh: () => void;\n onToggle: (skillKey: string, enabled: boolean) => void;\n onEdit: (skillKey: string, value: string) => void;\n onSaveKey: (skillKey: string) => void;\n onInstall: (name: string, installId: string) => void;\n};\n\nexport function renderSkills(props: SkillsProps) {\n const skills = props.report?.skills ?? [];\n const filter = props.filter.trim().toLowerCase();\n const filtered = filter\n ? skills.filter((skill) =>\n [skill.name, skill.description, skill.source]\n .join(\" \")\n .toLowerCase()\n .includes(filter),\n )\n : skills;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Skills</div>\n <div class=\"card-sub\">Bundled, managed, and workspace skills.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"flex: 1;\">\n <span>Filter</span>\n <input\n .value=${props.filter}\n @input=${(e: Event) =>\n props.onFilterChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search skills\"\n />\n </label>\n <div class=\"muted\">${filtered.length} shown</div>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 16px;\">No skills found.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${filtered.map((skill) => renderSkill(skill, props))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderSkill(skill: SkillStatusEntry, props: SkillsProps) {\n const busy = props.busyKey === skill.skillKey || props.busyKey === skill.name;\n const apiKey = props.edits[skill.skillKey] ?? \"\";\n const missing = [\n ...skill.missing.bins.map((b) => `bin:${b}`),\n ...skill.missing.env.map((e) => `env:${e}`),\n ...skill.missing.config.map((c) => `config:${c}`),\n ...skill.missing.os.map((o) => `os:${o}`),\n ];\n const reasons: string[] = [];\n if (skill.disabled) reasons.push(\"disabled\");\n if (skill.blockedByAllowlist) reasons.push(\"blocked by allowlist\");\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">\n ${skill.emoji ? `${skill.emoji} ` : \"\"}${skill.name}\n </div>\n <div class=\"list-sub\">${clampText(skill.description, 140)}</div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${skill.source}</span>\n <span class=\"chip ${skill.eligible ? \"chip-ok\" : \"chip-warn\"}\">\n ${skill.eligible ? \"eligible\" : \"blocked\"}\n </span>\n ${skill.disabled ? html`<span class=\"chip chip-warn\">disabled</span>` : nothing}\n </div>\n ${missing.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Missing: ${missing.join(\", \")}\n </div>\n `\n : nothing}\n ${reasons.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Reason: ${reasons.join(\", \")}\n </div>\n `\n : nothing}\n </div>\n <div class=\"list-meta\">\n <div class=\"row\" style=\"justify-content: flex-end; flex-wrap: wrap;\">\n <button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() => props.onToggle(skill.skillKey, skill.disabled)}\n >\n ${skill.disabled ? \"Enable\" : \"Disable\"}\n </button>\n ${skill.install.length > 0\n ? html`<button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() => props.onInstall(skill.name, skill.install[0].id)}\n >\n ${skill.install[0].label}\n </button>`\n : nothing}\n </div>\n ${skill.primaryEnv\n ? html`\n <div class=\"field\" style=\"margin-top: 10px;\">\n <span>API key</span>\n <input\n type=\"password\"\n .value=${apiKey}\n @input=${(e: Event) =>\n props.onEdit(skill.skillKey, (e.target as HTMLInputElement).value)}\n />\n </div>\n <button\n class=\"btn primary\"\n style=\"margin-top: 8px;\"\n ?disabled=${busy}\n @click=${() => props.onSaveKey(skill.skillKey)}\n >\n Save key\n </button>\n `\n : nothing}\n </div>\n </div>\n `;\n}\n","export type TelegramForm = {\n token: string;\n requireMention: boolean;\n allowFrom: string;\n proxy: string;\n webhookUrl: string;\n webhookSecret: string;\n webhookPath: string;\n};\n\nexport type DiscordForm = {\n enabled: boolean;\n token: string;\n dmEnabled: boolean;\n allowFrom: string;\n groupEnabled: boolean;\n groupChannels: string;\n mediaMaxMb: string;\n historyLimit: string;\n textChunkLimit: string;\n replyToMode: \"off\" | \"first\" | \"all\";\n guilds: DiscordGuildForm[];\n actions: DiscordActionForm;\n slashEnabled: boolean;\n slashName: string;\n slashSessionPrefix: string;\n slashEphemeral: boolean;\n};\n\nexport type DiscordGuildForm = {\n key: string;\n slug: string;\n requireMention: boolean;\n reactionNotifications: \"off\" | \"own\" | \"all\" | \"allowlist\";\n users: string;\n channels: DiscordGuildChannelForm[];\n};\n\nexport type DiscordGuildChannelForm = {\n key: string;\n allow: boolean;\n requireMention: boolean;\n};\n\nexport type DiscordActionForm = {\n reactions: boolean;\n stickers: boolean;\n polls: boolean;\n permissions: boolean;\n messages: boolean;\n threads: boolean;\n pins: boolean;\n search: boolean;\n memberInfo: boolean;\n roleInfo: boolean;\n channelInfo: boolean;\n voiceStatus: boolean;\n events: boolean;\n roles: boolean;\n moderation: boolean;\n};\n\nexport type SlackChannelForm = {\n key: string;\n allow: boolean;\n requireMention: boolean;\n};\n\nexport type SlackActionForm = {\n reactions: boolean;\n messages: boolean;\n pins: boolean;\n memberInfo: boolean;\n emojiList: boolean;\n};\n\nexport type SlackForm = {\n enabled: boolean;\n botToken: string;\n appToken: string;\n dmEnabled: boolean;\n allowFrom: string;\n groupEnabled: boolean;\n groupChannels: string;\n mediaMaxMb: string;\n textChunkLimit: string;\n reactionNotifications: \"off\" | \"own\" | \"all\" | \"allowlist\";\n reactionAllowlist: string;\n slashEnabled: boolean;\n slashName: string;\n slashSessionPrefix: string;\n slashEphemeral: boolean;\n actions: SlackActionForm;\n channels: SlackChannelForm[];\n};\n\nexport const defaultDiscordActions: DiscordActionForm = {\n reactions: true,\n stickers: true,\n polls: true,\n permissions: true,\n messages: true,\n threads: true,\n pins: true,\n search: true,\n memberInfo: true,\n roleInfo: true,\n channelInfo: true,\n voiceStatus: true,\n events: true,\n roles: false,\n moderation: false,\n};\n\nexport const defaultSlackActions: SlackActionForm = {\n reactions: true,\n messages: true,\n pins: true,\n memberInfo: true,\n emojiList: true,\n};\n\nexport type SignalForm = {\n enabled: boolean;\n account: string;\n httpUrl: string;\n httpHost: string;\n httpPort: string;\n cliPath: string;\n autoStart: boolean;\n receiveMode: \"on-start\" | \"manual\" | \"\";\n ignoreAttachments: boolean;\n ignoreStories: boolean;\n sendReadReceipts: boolean;\n allowFrom: string;\n mediaMaxMb: string;\n};\n\nexport type IMessageForm = {\n enabled: boolean;\n cliPath: string;\n dbPath: string;\n service: \"auto\" | \"imessage\" | \"sms\";\n region: string;\n allowFrom: string;\n includeAttachments: boolean;\n mediaMaxMb: string;\n};\n\nexport type CronFormState = {\n name: string;\n description: string;\n enabled: boolean;\n scheduleKind: \"at\" | \"every\" | \"cron\";\n scheduleAt: string;\n everyAmount: string;\n everyUnit: \"minutes\" | \"hours\" | \"days\";\n cronExpr: string;\n cronTz: string;\n sessionTarget: \"main\" | \"isolated\";\n wakeMode: \"next-heartbeat\" | \"now\";\n payloadKind: \"systemEvent\" | \"agentTurn\";\n payloadText: string;\n deliver: boolean;\n channel: \"last\" | \"whatsapp\" | \"telegram\";\n to: string;\n timeoutSeconds: string;\n postToMainPrefix: string;\n};\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { parseList } from \"../format\";\nimport type { ConfigSnapshot, ProvidersStatusSnapshot } from \"../types\";\nimport {\n defaultDiscordActions,\n defaultSlackActions,\n type DiscordActionForm,\n type DiscordForm,\n type DiscordGuildChannelForm,\n type DiscordGuildForm,\n type IMessageForm,\n type SlackActionForm,\n type SlackForm,\n type SignalForm,\n type TelegramForm,\n} from \"../ui-types\";\n\nexport type ConnectionsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n providersLoading: boolean;\n providersSnapshot: ProvidersStatusSnapshot | null;\n providersError: string | null;\n providersLastSuccess: number | null;\n whatsappLoginMessage: string | null;\n whatsappLoginQrDataUrl: string | null;\n whatsappLoginConnected: boolean | null;\n whatsappBusy: boolean;\n telegramForm: TelegramForm;\n telegramSaving: boolean;\n telegramTokenLocked: boolean;\n telegramConfigStatus: string | null;\n discordForm: DiscordForm;\n discordSaving: boolean;\n discordTokenLocked: boolean;\n discordConfigStatus: string | null;\n slackForm: SlackForm;\n slackSaving: boolean;\n slackTokenLocked: boolean;\n slackAppTokenLocked: boolean;\n slackConfigStatus: string | null;\n signalForm: SignalForm;\n signalSaving: boolean;\n signalConfigStatus: string | null;\n imessageForm: IMessageForm;\n imessageSaving: boolean;\n imessageConfigStatus: string | null;\n configSnapshot: ConfigSnapshot | null;\n};\n\nexport async function loadProviders(state: ConnectionsState, probe: boolean) {\n if (!state.client || !state.connected) return;\n if (state.providersLoading) return;\n state.providersLoading = true;\n state.providersError = null;\n try {\n const res = (await state.client.request(\"providers.status\", {\n probe,\n timeoutMs: 8000,\n })) as ProvidersStatusSnapshot;\n state.providersSnapshot = res;\n state.providersLastSuccess = Date.now();\n state.telegramTokenLocked = res.telegram.tokenSource === \"env\";\n state.discordTokenLocked = res.discord?.tokenSource === \"env\";\n state.slackTokenLocked = res.slack?.botTokenSource === \"env\";\n state.slackAppTokenLocked = res.slack?.appTokenSource === \"env\";\n } catch (err) {\n state.providersError = String(err);\n } finally {\n state.providersLoading = false;\n }\n}\n\nexport async function startWhatsAppLogin(state: ConnectionsState, force: boolean) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.start\", {\n force,\n timeoutMs: 30000,\n })) as { message?: string; qrDataUrl?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginQrDataUrl = res.qrDataUrl ?? null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function waitWhatsAppLogin(state: ConnectionsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.wait\", {\n timeoutMs: 120000,\n })) as { connected?: boolean; message?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginConnected = res.connected ?? null;\n if (res.connected) state.whatsappLoginQrDataUrl = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function logoutWhatsApp(state: ConnectionsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n await state.client.request(\"web.logout\", {});\n state.whatsappLoginMessage = \"Logged out.\";\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport function updateTelegramForm(\n state: ConnectionsState,\n patch: Partial<TelegramForm>,\n) {\n state.telegramForm = { ...state.telegramForm, ...patch };\n}\n\nexport function updateDiscordForm(\n state: ConnectionsState,\n patch: Partial<DiscordForm>,\n) {\n if (patch.actions) {\n state.discordForm = {\n ...state.discordForm,\n ...patch,\n actions: { ...state.discordForm.actions, ...patch.actions },\n };\n return;\n }\n state.discordForm = { ...state.discordForm, ...patch };\n}\n\nexport function updateSlackForm(\n state: ConnectionsState,\n patch: Partial<SlackForm>,\n) {\n if (patch.actions) {\n state.slackForm = {\n ...state.slackForm,\n ...patch,\n actions: { ...state.slackForm.actions, ...patch.actions },\n };\n return;\n }\n state.slackForm = { ...state.slackForm, ...patch };\n}\n\nexport function updateSignalForm(\n state: ConnectionsState,\n patch: Partial<SignalForm>,\n) {\n state.signalForm = { ...state.signalForm, ...patch };\n}\n\nexport function updateIMessageForm(\n state: ConnectionsState,\n patch: Partial<IMessageForm>,\n) {\n state.imessageForm = { ...state.imessageForm, ...patch };\n}\n\nexport async function saveTelegramConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.telegramSaving) return;\n state.telegramSaving = true;\n state.telegramConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const telegram = { ...(config.telegram ?? {}) } as Record<string, unknown>;\n if (!state.telegramTokenLocked) {\n const token = state.telegramForm.token.trim();\n if (token) telegram.botToken = token;\n else delete telegram.botToken;\n }\n const groups =\n telegram.groups && typeof telegram.groups === \"object\"\n ? ({ ...(telegram.groups as Record<string, unknown>) } as Record<\n string,\n unknown\n >)\n : {};\n const defaultGroup =\n groups[\"*\"] && typeof groups[\"*\"] === \"object\"\n ? ({ ...(groups[\"*\"] as Record<string, unknown>) } as Record<\n string,\n unknown\n >)\n : {};\n defaultGroup.requireMention = state.telegramForm.requireMention;\n groups[\"*\"] = defaultGroup;\n telegram.groups = groups;\n delete telegram.requireMention;\n const allowFrom = parseList(state.telegramForm.allowFrom);\n if (allowFrom.length > 0) telegram.allowFrom = allowFrom;\n else delete telegram.allowFrom;\n const proxy = state.telegramForm.proxy.trim();\n if (proxy) telegram.proxy = proxy;\n else delete telegram.proxy;\n const webhookUrl = state.telegramForm.webhookUrl.trim();\n if (webhookUrl) telegram.webhookUrl = webhookUrl;\n else delete telegram.webhookUrl;\n const webhookSecret = state.telegramForm.webhookSecret.trim();\n if (webhookSecret) telegram.webhookSecret = webhookSecret;\n else delete telegram.webhookSecret;\n const webhookPath = state.telegramForm.webhookPath.trim();\n if (webhookPath) telegram.webhookPath = webhookPath;\n else delete telegram.webhookPath;\n\n config.telegram = telegram;\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.telegramConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.telegramConfigStatus = String(err);\n } finally {\n state.telegramSaving = false;\n }\n}\n\nexport async function saveDiscordConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.discordSaving) return;\n state.discordSaving = true;\n state.discordConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const discord = { ...(config.discord ?? {}) } as Record<string, unknown>;\n const form = state.discordForm;\n\n if (form.enabled) {\n delete discord.enabled;\n } else {\n discord.enabled = false;\n }\n\n if (!state.discordTokenLocked) {\n const token = form.token.trim();\n if (token) discord.token = token;\n else delete discord.token;\n }\n\n const allowFrom = parseList(form.allowFrom);\n const groupChannels = parseList(form.groupChannels);\n const dm = { ...(discord.dm ?? {}) } as Record<string, unknown>;\n if (form.dmEnabled) delete dm.enabled;\n else dm.enabled = false;\n if (allowFrom.length > 0) dm.allowFrom = allowFrom;\n else delete dm.allowFrom;\n if (form.groupEnabled) dm.groupEnabled = true;\n else delete dm.groupEnabled;\n if (groupChannels.length > 0) dm.groupChannels = groupChannels;\n else delete dm.groupChannels;\n if (Object.keys(dm).length > 0) discord.dm = dm;\n else delete discord.dm;\n\n const mediaMaxMb = Number(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n discord.mediaMaxMb = mediaMaxMb;\n } else {\n delete discord.mediaMaxMb;\n }\n\n const historyLimitRaw = form.historyLimit.trim();\n if (historyLimitRaw.length === 0) {\n delete discord.historyLimit;\n } else {\n const historyLimit = Number(historyLimitRaw);\n if (Number.isFinite(historyLimit) && historyLimit >= 0) {\n discord.historyLimit = historyLimit;\n } else {\n delete discord.historyLimit;\n }\n }\n\n const chunkLimitRaw = form.textChunkLimit.trim();\n if (chunkLimitRaw.length === 0) {\n delete discord.textChunkLimit;\n } else {\n const chunkLimit = Number(chunkLimitRaw);\n if (Number.isFinite(chunkLimit) && chunkLimit > 0) {\n discord.textChunkLimit = chunkLimit;\n } else {\n delete discord.textChunkLimit;\n }\n }\n\n if (form.replyToMode === \"off\") {\n delete discord.replyToMode;\n } else {\n discord.replyToMode = form.replyToMode;\n }\n\n const guildsForm = Array.isArray(form.guilds) ? form.guilds : [];\n const guilds: Record<string, unknown> = {};\n guildsForm.forEach((guild: DiscordGuildForm) => {\n const key = String(guild.key ?? \"\").trim();\n if (!key) return;\n const entry: Record<string, unknown> = {};\n const slug = String(guild.slug ?? \"\").trim();\n if (slug) entry.slug = slug;\n if (guild.requireMention) entry.requireMention = true;\n if (\n guild.reactionNotifications === \"off\" ||\n guild.reactionNotifications === \"all\" ||\n guild.reactionNotifications === \"own\" ||\n guild.reactionNotifications === \"allowlist\"\n ) {\n entry.reactionNotifications = guild.reactionNotifications;\n }\n const users = parseList(guild.users);\n if (users.length > 0) entry.users = users;\n const channels: Record<string, unknown> = {};\n const channelForms = Array.isArray(guild.channels) ? guild.channels : [];\n channelForms.forEach((channel: DiscordGuildChannelForm) => {\n const channelKey = String(channel.key ?? \"\").trim();\n if (!channelKey) return;\n const channelEntry: Record<string, unknown> = {};\n if (channel.allow === false) channelEntry.allow = false;\n if (channel.requireMention) channelEntry.requireMention = true;\n channels[channelKey] = channelEntry;\n });\n if (Object.keys(channels).length > 0) entry.channels = channels;\n guilds[key] = entry;\n });\n if (Object.keys(guilds).length > 0) discord.guilds = guilds;\n else delete discord.guilds;\n\n const actions: Partial<DiscordActionForm> = {};\n const applyAction = (key: keyof DiscordActionForm) => {\n const value = form.actions[key];\n if (value !== defaultDiscordActions[key]) actions[key] = value;\n };\n applyAction(\"reactions\");\n applyAction(\"stickers\");\n applyAction(\"polls\");\n applyAction(\"permissions\");\n applyAction(\"messages\");\n applyAction(\"threads\");\n applyAction(\"pins\");\n applyAction(\"search\");\n applyAction(\"memberInfo\");\n applyAction(\"roleInfo\");\n applyAction(\"channelInfo\");\n applyAction(\"voiceStatus\");\n applyAction(\"events\");\n applyAction(\"roles\");\n applyAction(\"moderation\");\n if (Object.keys(actions).length > 0) {\n discord.actions = actions;\n } else {\n delete discord.actions;\n }\n\n const slash = { ...(discord.slashCommand ?? {}) } as Record<string, unknown>;\n if (form.slashEnabled) {\n slash.enabled = true;\n } else {\n delete slash.enabled;\n }\n if (form.slashName.trim()) slash.name = form.slashName.trim();\n else delete slash.name;\n if (form.slashSessionPrefix.trim())\n slash.sessionPrefix = form.slashSessionPrefix.trim();\n else delete slash.sessionPrefix;\n if (form.slashEphemeral) {\n delete slash.ephemeral;\n } else {\n slash.ephemeral = false;\n }\n if (Object.keys(slash).length > 0) discord.slashCommand = slash;\n else delete discord.slashCommand;\n\n if (Object.keys(discord).length > 0) {\n config.discord = discord;\n } else {\n delete config.discord;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.discordConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.discordConfigStatus = String(err);\n } finally {\n state.discordSaving = false;\n }\n}\n\nexport async function saveSlackConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.slackSaving) return;\n state.slackSaving = true;\n state.slackConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const slack = { ...(config.slack ?? {}) } as Record<string, unknown>;\n const form = state.slackForm;\n\n if (form.enabled) {\n delete slack.enabled;\n } else {\n slack.enabled = false;\n }\n\n if (!state.slackTokenLocked) {\n const token = form.botToken.trim();\n if (token) slack.botToken = token;\n else delete slack.botToken;\n }\n if (!state.slackAppTokenLocked) {\n const token = form.appToken.trim();\n if (token) slack.appToken = token;\n else delete slack.appToken;\n }\n\n const dm = { ...(slack.dm ?? {}) } as Record<string, unknown>;\n dm.enabled = form.dmEnabled;\n const allowFrom = parseList(form.allowFrom);\n if (allowFrom.length > 0) dm.allowFrom = allowFrom;\n else delete dm.allowFrom;\n if (form.groupEnabled) {\n dm.groupEnabled = true;\n } else {\n delete dm.groupEnabled;\n }\n const groupChannels = parseList(form.groupChannels);\n if (groupChannels.length > 0) dm.groupChannels = groupChannels;\n else delete dm.groupChannels;\n if (Object.keys(dm).length > 0) slack.dm = dm;\n else delete slack.dm;\n\n const mediaMaxMb = Number.parseFloat(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n slack.mediaMaxMb = mediaMaxMb;\n } else {\n delete slack.mediaMaxMb;\n }\n\n const textChunkLimit = Number.parseInt(form.textChunkLimit, 10);\n if (Number.isFinite(textChunkLimit) && textChunkLimit > 0) {\n slack.textChunkLimit = textChunkLimit;\n } else {\n delete slack.textChunkLimit;\n }\n\n if (form.reactionNotifications === \"own\") {\n delete slack.reactionNotifications;\n } else {\n slack.reactionNotifications = form.reactionNotifications;\n }\n const reactionAllowlist = parseList(form.reactionAllowlist);\n if (reactionAllowlist.length > 0) {\n slack.reactionAllowlist = reactionAllowlist;\n } else {\n delete slack.reactionAllowlist;\n }\n\n const slash = { ...(slack.slashCommand ?? {}) } as Record<string, unknown>;\n if (form.slashEnabled) {\n slash.enabled = true;\n } else {\n delete slash.enabled;\n }\n if (form.slashName.trim()) slash.name = form.slashName.trim();\n else delete slash.name;\n if (form.slashSessionPrefix.trim())\n slash.sessionPrefix = form.slashSessionPrefix.trim();\n else delete slash.sessionPrefix;\n if (form.slashEphemeral) {\n delete slash.ephemeral;\n } else {\n slash.ephemeral = false;\n }\n if (Object.keys(slash).length > 0) slack.slashCommand = slash;\n else delete slack.slashCommand;\n\n const actions: Partial<SlackActionForm> = {};\n const applyAction = (key: keyof SlackActionForm) => {\n const value = form.actions[key];\n if (value !== defaultSlackActions[key]) actions[key] = value;\n };\n applyAction(\"reactions\");\n applyAction(\"messages\");\n applyAction(\"pins\");\n applyAction(\"memberInfo\");\n applyAction(\"emojiList\");\n if (Object.keys(actions).length > 0) {\n slack.actions = actions;\n } else {\n delete slack.actions;\n }\n\n const channels = form.channels\n .map((entry): [string, Record<string, unknown>] | null => {\n const key = entry.key.trim();\n if (!key) return null;\n const record: Record<string, unknown> = {\n allow: entry.allow,\n requireMention: entry.requireMention,\n };\n return [key, record];\n })\n .filter((value): value is [string, Record<string, unknown>] => Boolean(value));\n if (channels.length > 0) {\n slack.channels = Object.fromEntries(channels);\n } else {\n delete slack.channels;\n }\n\n if (Object.keys(slack).length > 0) {\n config.slack = slack;\n } else {\n delete config.slack;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.slackConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.slackConfigStatus = String(err);\n } finally {\n state.slackSaving = false;\n }\n}\n\nexport async function saveSignalConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.signalSaving) return;\n state.signalSaving = true;\n state.signalConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const signal = { ...(config.signal ?? {}) } as Record<string, unknown>;\n const form = state.signalForm;\n\n if (form.enabled) {\n delete signal.enabled;\n } else {\n signal.enabled = false;\n }\n\n const account = form.account.trim();\n if (account) signal.account = account;\n else delete signal.account;\n\n const httpUrl = form.httpUrl.trim();\n if (httpUrl) signal.httpUrl = httpUrl;\n else delete signal.httpUrl;\n\n const httpHost = form.httpHost.trim();\n if (httpHost) signal.httpHost = httpHost;\n else delete signal.httpHost;\n\n const httpPort = Number(form.httpPort);\n if (Number.isFinite(httpPort) && httpPort > 0) {\n signal.httpPort = httpPort;\n } else {\n delete signal.httpPort;\n }\n\n const cliPath = form.cliPath.trim();\n if (cliPath) signal.cliPath = cliPath;\n else delete signal.cliPath;\n\n if (form.autoStart) {\n delete signal.autoStart;\n } else {\n signal.autoStart = false;\n }\n\n if (form.receiveMode === \"on-start\" || form.receiveMode === \"manual\") {\n signal.receiveMode = form.receiveMode;\n } else {\n delete signal.receiveMode;\n }\n\n if (form.ignoreAttachments) signal.ignoreAttachments = true;\n else delete signal.ignoreAttachments;\n if (form.ignoreStories) signal.ignoreStories = true;\n else delete signal.ignoreStories;\n if (form.sendReadReceipts) signal.sendReadReceipts = true;\n else delete signal.sendReadReceipts;\n\n const allowFrom = parseList(form.allowFrom);\n if (allowFrom.length > 0) signal.allowFrom = allowFrom;\n else delete signal.allowFrom;\n\n const mediaMaxMb = Number(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n signal.mediaMaxMb = mediaMaxMb;\n } else {\n delete signal.mediaMaxMb;\n }\n\n if (Object.keys(signal).length > 0) {\n config.signal = signal;\n } else {\n delete config.signal;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.signalConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.signalConfigStatus = String(err);\n } finally {\n state.signalSaving = false;\n }\n}\n\nexport async function saveIMessageConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.imessageSaving) return;\n state.imessageSaving = true;\n state.imessageConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const imessage = { ...(config.imessage ?? {}) } as Record<string, unknown>;\n const form = state.imessageForm;\n\n if (form.enabled) {\n delete imessage.enabled;\n } else {\n imessage.enabled = false;\n }\n\n const cliPath = form.cliPath.trim();\n if (cliPath) imessage.cliPath = cliPath;\n else delete imessage.cliPath;\n\n const dbPath = form.dbPath.trim();\n if (dbPath) imessage.dbPath = dbPath;\n else delete imessage.dbPath;\n\n if (form.service === \"auto\") {\n delete imessage.service;\n } else {\n imessage.service = form.service;\n }\n\n const region = form.region.trim();\n if (region) imessage.region = region;\n else delete imessage.region;\n\n const allowFrom = parseList(form.allowFrom);\n if (allowFrom.length > 0) imessage.allowFrom = allowFrom;\n else delete imessage.allowFrom;\n\n if (form.includeAttachments) imessage.includeAttachments = true;\n else delete imessage.includeAttachments;\n\n const mediaMaxMb = Number(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n imessage.mediaMaxMb = mediaMaxMb;\n } else {\n delete imessage.mediaMaxMb;\n }\n\n if (Object.keys(imessage).length > 0) {\n config.imessage = imessage;\n } else {\n delete config.imessage;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.imessageConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.imessageConfigStatus = String(err);\n } finally {\n state.imessageSaving = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type PresenceState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n presenceLoading: boolean;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: string | null;\n};\n\nexport async function loadPresence(state: PresenceState) {\n if (!state.client || !state.connected) return;\n if (state.presenceLoading) return;\n state.presenceLoading = true;\n state.presenceError = null;\n state.presenceStatus = null;\n try {\n const res = (await state.client.request(\"system-presence\", {})) as\n | PresenceEntry[]\n | undefined;\n if (Array.isArray(res)) {\n state.presenceEntries = res;\n state.presenceStatus = res.length === 0 ? \"No instances yet.\" : null;\n } else {\n state.presenceEntries = [];\n state.presenceStatus = \"No presence payload.\";\n }\n } catch (err) {\n state.presenceError = String(err);\n } finally {\n state.presenceLoading = false;\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { toNumber } from \"../format\";\nimport type { SessionsListResult } from \"../types\";\n\nexport type SessionsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionsLoading: boolean;\n sessionsResult: SessionsListResult | null;\n sessionsError: string | null;\n sessionsFilterActive: string;\n sessionsFilterLimit: string;\n sessionsIncludeGlobal: boolean;\n sessionsIncludeUnknown: boolean;\n};\n\nexport async function loadSessions(state: SessionsState) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n const params: Record<string, unknown> = {\n includeGlobal: state.sessionsIncludeGlobal,\n includeUnknown: state.sessionsIncludeUnknown,\n };\n const activeMinutes = toNumber(state.sessionsFilterActive, 0);\n const limit = toNumber(state.sessionsFilterLimit, 0);\n if (activeMinutes > 0) params.activeMinutes = activeMinutes;\n if (limit > 0) params.limit = limit;\n const res = (await state.client.request(\"sessions.list\", params)) as\n | SessionsListResult\n | undefined;\n if (res) state.sessionsResult = res;\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n\nexport async function patchSession(\n state: SessionsState,\n key: string,\n patch: { thinkingLevel?: string | null; verboseLevel?: string | null },\n) {\n if (!state.client || !state.connected) return;\n const params: Record<string, unknown> = { key };\n if (\"thinkingLevel\" in patch) params.thinkingLevel = patch.thinkingLevel;\n if (\"verboseLevel\" in patch) params.verboseLevel = patch.verboseLevel;\n try {\n await state.client.request(\"sessions.patch\", params);\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { SkillStatusReport } from \"../types\";\n\nexport type SkillsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n skillsLoading: boolean;\n skillsReport: SkillStatusReport | null;\n skillsError: string | null;\n skillsBusyKey: string | null;\n skillEdits: Record<string, string>;\n};\n\nexport async function loadSkills(state: SkillsState) {\n if (!state.client || !state.connected) return;\n if (state.skillsLoading) return;\n state.skillsLoading = true;\n state.skillsError = null;\n try {\n const res = (await state.client.request(\"skills.status\", {})) as\n | SkillStatusReport\n | undefined;\n if (res) state.skillsReport = res;\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsLoading = false;\n }\n}\n\nexport function updateSkillEdit(\n state: SkillsState,\n skillKey: string,\n value: string,\n) {\n state.skillEdits = { ...state.skillEdits, [skillKey]: value };\n}\n\nexport async function updateSkillEnabled(\n state: SkillsState,\n skillKey: string,\n enabled: boolean,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n await state.client.request(\"skills.update\", { skillKey, enabled });\n await loadSkills(state);\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function saveSkillApiKey(state: SkillsState, skillKey: string) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const apiKey = state.skillEdits[skillKey] ?? \"\";\n await state.client.request(\"skills.update\", { skillKey, apiKey });\n await loadSkills(state);\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function installSkill(\n state: SkillsState,\n name: string,\n installId: string,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = name;\n state.skillsError = null;\n try {\n await state.client.request(\"skills.install\", {\n name,\n installId,\n timeoutMs: 120000,\n });\n await loadSkills(state);\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type NodesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n nodesLoading: boolean;\n nodes: Array<Record<string, unknown>>;\n lastError: string | null;\n};\n\nexport async function loadNodes(\n state: NodesState,\n opts?: { quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.nodesLoading) return;\n state.nodesLoading = true;\n if (!opts?.quiet) state.lastError = null;\n try {\n const res = (await state.client.request(\"node.list\", {})) as {\n nodes?: Array<Record<string, unknown>>;\n };\n state.nodes = Array.isArray(res.nodes) ? res.nodes : [];\n } catch (err) {\n if (!opts?.quiet) state.lastError = String(err);\n } finally {\n state.nodesLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { generateUUID } from \"../uuid\";\n\nexport type ChatState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatThinkingLevel: string | null;\n chatSending: boolean;\n chatMessage: string;\n chatRunId: string | null;\n chatStream: string | null;\n lastError: string | null;\n};\n\nexport type ChatEventPayload = {\n runId: string;\n sessionKey: string;\n state: \"delta\" | \"final\" | \"aborted\" | \"error\";\n message?: unknown;\n errorMessage?: string;\n};\n\nexport async function loadChatHistory(state: ChatState) {\n if (!state.client || !state.connected) return;\n state.chatLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"chat.history\", {\n sessionKey: state.sessionKey,\n limit: 200,\n })) as { messages?: unknown[]; thinkingLevel?: string | null };\n state.chatMessages = Array.isArray(res.messages) ? res.messages : [];\n state.chatThinkingLevel = res.thinkingLevel ?? null;\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.chatLoading = false;\n }\n}\n\nexport async function sendChat(state: ChatState) {\n if (!state.client || !state.connected) return;\n const msg = state.chatMessage.trim();\n if (!msg) return;\n\n state.chatSending = true;\n state.chatMessage = \"\";\n state.lastError = null;\n const runId = generateUUID();\n state.chatRunId = runId;\n state.chatStream = \"\";\n try {\n await state.client.request(\"chat.send\", {\n sessionKey: state.sessionKey,\n message: msg,\n deliver: false,\n idempotencyKey: runId,\n });\n } catch (err) {\n state.chatRunId = null;\n state.chatStream = null;\n state.chatMessage = msg;\n state.lastError = String(err);\n } finally {\n state.chatSending = false;\n }\n}\n\nexport function handleChatEvent(\n state: ChatState,\n payload?: ChatEventPayload,\n) {\n if (!payload) return null;\n if (payload.sessionKey !== state.sessionKey) return null;\n if (payload.runId && state.chatRunId && payload.runId !== state.chatRunId)\n return null;\n\n if (payload.state === \"delta\") {\n state.chatStream = extractText(payload.message) ?? state.chatStream;\n } else if (payload.state === \"final\") {\n state.chatStream = null;\n state.chatRunId = null;\n } else if (payload.state === \"error\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.lastError = payload.errorMessage ?? \"chat error\";\n }\n return payload.state;\n}\n\nfunction extractText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (typeof m.text === \"string\") return m.text;\n return null;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type {\n ConfigSchemaResponse,\n ConfigSnapshot,\n ConfigUiHints,\n} from \"../types\";\nimport {\n defaultDiscordActions,\n defaultSlackActions,\n type DiscordActionForm,\n type DiscordForm,\n type DiscordGuildChannelForm,\n type DiscordGuildForm,\n type IMessageForm,\n type SlackChannelForm,\n type SlackForm,\n type SignalForm,\n type TelegramForm,\n} from \"../ui-types\";\n\nexport type ConfigState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n configLoading: boolean;\n configRaw: string;\n configValid: boolean | null;\n configIssues: unknown[];\n configSaving: boolean;\n configSnapshot: ConfigSnapshot | null;\n configSchema: unknown | null;\n configSchemaVersion: string | null;\n configSchemaLoading: boolean;\n configUiHints: ConfigUiHints;\n configForm: Record<string, unknown> | null;\n configFormDirty: boolean;\n configFormMode: \"form\" | \"raw\";\n lastError: string | null;\n telegramForm: TelegramForm;\n discordForm: DiscordForm;\n slackForm: SlackForm;\n signalForm: SignalForm;\n imessageForm: IMessageForm;\n telegramConfigStatus: string | null;\n discordConfigStatus: string | null;\n slackConfigStatus: string | null;\n signalConfigStatus: string | null;\n imessageConfigStatus: string | null;\n};\n\nexport async function loadConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n applyConfigSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configLoading = false;\n }\n}\n\nexport async function loadConfigSchema(state: ConfigState) {\n if (!state.client || !state.connected) return;\n if (state.configSchemaLoading) return;\n state.configSchemaLoading = true;\n try {\n const res = (await state.client.request(\n \"config.schema\",\n {},\n )) as ConfigSchemaResponse;\n applyConfigSchema(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSchemaLoading = false;\n }\n}\n\nexport function applyConfigSchema(\n state: ConfigState,\n res: ConfigSchemaResponse,\n) {\n state.configSchema = res.schema ?? null;\n state.configUiHints = res.uiHints ?? {};\n state.configSchemaVersion = res.version ?? null;\n}\n\nexport function applyConfigSnapshot(state: ConfigState, snapshot: ConfigSnapshot) {\n state.configSnapshot = snapshot;\n if (typeof snapshot.raw === \"string\") {\n state.configRaw = snapshot.raw;\n } else if (snapshot.config && typeof snapshot.config === \"object\") {\n state.configRaw = `${JSON.stringify(snapshot.config, null, 2).trimEnd()}\\n`;\n }\n state.configValid = typeof snapshot.valid === \"boolean\" ? snapshot.valid : null;\n state.configIssues = Array.isArray(snapshot.issues) ? snapshot.issues : [];\n\n const config = snapshot.config ?? {};\n const telegram = (config.telegram ?? {}) as Record<string, unknown>;\n const discord = (config.discord ?? {}) as Record<string, unknown>;\n const signal = (config.signal ?? {}) as Record<string, unknown>;\n const imessage = (config.imessage ?? {}) as Record<string, unknown>;\n const toList = (value: unknown) =>\n Array.isArray(value)\n ? value\n .map((v) => String(v ?? \"\").trim())\n .filter((v) => v.length > 0)\n .join(\", \")\n : \"\";\n const telegramGroups =\n telegram.groups && typeof telegram.groups === \"object\"\n ? (telegram.groups as Record<string, unknown>)\n : {};\n const telegramDefaultGroup =\n telegramGroups[\"*\"] && typeof telegramGroups[\"*\"] === \"object\"\n ? (telegramGroups[\"*\"] as Record<string, unknown>)\n : {};\n const allowFrom = Array.isArray(telegram.allowFrom)\n ? toList(telegram.allowFrom)\n : typeof telegram.allowFrom === \"string\"\n ? telegram.allowFrom\n : \"\";\n\n state.telegramForm = {\n token: typeof telegram.botToken === \"string\" ? telegram.botToken : \"\",\n requireMention:\n typeof telegramDefaultGroup.requireMention === \"boolean\"\n ? telegramDefaultGroup.requireMention\n : true,\n allowFrom,\n proxy: typeof telegram.proxy === \"string\" ? telegram.proxy : \"\",\n webhookUrl: typeof telegram.webhookUrl === \"string\" ? telegram.webhookUrl : \"\",\n webhookSecret:\n typeof telegram.webhookSecret === \"string\" ? telegram.webhookSecret : \"\",\n webhookPath: typeof telegram.webhookPath === \"string\" ? telegram.webhookPath : \"\",\n };\n\n const discordDm = (discord.dm ?? {}) as Record<string, unknown>;\n const slash = (discord.slashCommand ?? {}) as Record<string, unknown>;\n const discordActions = (discord.actions ?? {}) as Record<string, unknown>;\n const discordGuilds = discord.guilds;\n const readAction = (key: keyof DiscordActionForm) =>\n typeof discordActions[key] === \"boolean\"\n ? (discordActions[key] as boolean)\n : defaultDiscordActions[key];\n state.discordForm = {\n enabled: typeof discord.enabled === \"boolean\" ? discord.enabled : true,\n token: typeof discord.token === \"string\" ? discord.token : \"\",\n dmEnabled: typeof discordDm.enabled === \"boolean\" ? discordDm.enabled : true,\n allowFrom: toList(discordDm.allowFrom),\n groupEnabled:\n typeof discordDm.groupEnabled === \"boolean\" ? discordDm.groupEnabled : false,\n groupChannels: toList(discordDm.groupChannels),\n mediaMaxMb:\n typeof discord.mediaMaxMb === \"number\" ? String(discord.mediaMaxMb) : \"\",\n historyLimit:\n typeof discord.historyLimit === \"number\" ? String(discord.historyLimit) : \"\",\n textChunkLimit:\n typeof discord.textChunkLimit === \"number\"\n ? String(discord.textChunkLimit)\n : \"\",\n replyToMode:\n discord.replyToMode === \"first\" || discord.replyToMode === \"all\"\n ? discord.replyToMode\n : \"off\",\n guilds: Array.isArray(discordGuilds)\n ? []\n : typeof discordGuilds === \"object\" && discordGuilds\n ? Object.entries(discordGuilds as Record<string, unknown>).map(\n ([key, value]): DiscordGuildForm => {\n const entry =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n const channelsRaw =\n entry.channels && typeof entry.channels === \"object\"\n ? (entry.channels as Record<string, unknown>)\n : {};\n const channels = Object.entries(channelsRaw).map(\n ([channelKey, channelValue]): DiscordGuildChannelForm => {\n const channel =\n channelValue && typeof channelValue === \"object\"\n ? (channelValue as Record<string, unknown>)\n : {};\n return {\n key: channelKey,\n allow:\n typeof channel.allow === \"boolean\" ? channel.allow : true,\n requireMention:\n typeof channel.requireMention === \"boolean\"\n ? channel.requireMention\n : false,\n };\n },\n );\n return {\n key,\n slug: typeof entry.slug === \"string\" ? entry.slug : \"\",\n requireMention:\n typeof entry.requireMention === \"boolean\"\n ? entry.requireMention\n : false,\n reactionNotifications:\n entry.reactionNotifications === \"off\" ||\n entry.reactionNotifications === \"all\" ||\n entry.reactionNotifications === \"own\" ||\n entry.reactionNotifications === \"allowlist\"\n ? entry.reactionNotifications\n : \"own\",\n users: toList(entry.users),\n channels,\n };\n },\n )\n : [],\n actions: {\n reactions: readAction(\"reactions\"),\n stickers: readAction(\"stickers\"),\n polls: readAction(\"polls\"),\n permissions: readAction(\"permissions\"),\n messages: readAction(\"messages\"),\n threads: readAction(\"threads\"),\n pins: readAction(\"pins\"),\n search: readAction(\"search\"),\n memberInfo: readAction(\"memberInfo\"),\n roleInfo: readAction(\"roleInfo\"),\n channelInfo: readAction(\"channelInfo\"),\n voiceStatus: readAction(\"voiceStatus\"),\n events: readAction(\"events\"),\n roles: readAction(\"roles\"),\n moderation: readAction(\"moderation\"),\n },\n slashEnabled: typeof slash.enabled === \"boolean\" ? slash.enabled : false,\n slashName: typeof slash.name === \"string\" ? slash.name : \"\",\n slashSessionPrefix:\n typeof slash.sessionPrefix === \"string\" ? slash.sessionPrefix : \"\",\n slashEphemeral:\n typeof slash.ephemeral === \"boolean\" ? slash.ephemeral : true,\n };\n\n const slackDm = (slack.dm ?? {}) as Record<string, unknown>;\n const slackChannels = slack.channels;\n const slackSlash = (slack.slashCommand ?? {}) as Record<string, unknown>;\n const slackActions =\n (slack.actions ?? {}) as Partial<Record<keyof typeof defaultSlackActions, unknown>>;\n state.slackForm = {\n enabled: typeof slack.enabled === \"boolean\" ? slack.enabled : true,\n botToken: typeof slack.botToken === \"string\" ? slack.botToken : \"\",\n appToken: typeof slack.appToken === \"string\" ? slack.appToken : \"\",\n dmEnabled: typeof slackDm.enabled === \"boolean\" ? slackDm.enabled : true,\n allowFrom: toList(slackDm.allowFrom),\n groupEnabled:\n typeof slackDm.groupEnabled === \"boolean\" ? slackDm.groupEnabled : false,\n groupChannels: toList(slackDm.groupChannels),\n mediaMaxMb:\n typeof slack.mediaMaxMb === \"number\" ? String(slack.mediaMaxMb) : \"\",\n textChunkLimit:\n typeof slack.textChunkLimit === \"number\"\n ? String(slack.textChunkLimit)\n : \"\",\n reactionNotifications:\n slack.reactionNotifications === \"off\" ||\n slack.reactionNotifications === \"all\" ||\n slack.reactionNotifications === \"allowlist\"\n ? slack.reactionNotifications\n : \"own\",\n reactionAllowlist: toList(slack.reactionAllowlist),\n slashEnabled:\n typeof slackSlash.enabled === \"boolean\" ? slackSlash.enabled : false,\n slashName: typeof slackSlash.name === \"string\" ? slackSlash.name : \"\",\n slashSessionPrefix:\n typeof slackSlash.sessionPrefix === \"string\"\n ? slackSlash.sessionPrefix\n : \"\",\n slashEphemeral:\n typeof slackSlash.ephemeral === \"boolean\" ? slackSlash.ephemeral : true,\n actions: {\n ...defaultSlackActions,\n reactions:\n typeof slackActions.reactions === \"boolean\"\n ? slackActions.reactions\n : defaultSlackActions.reactions,\n messages:\n typeof slackActions.messages === \"boolean\"\n ? slackActions.messages\n : defaultSlackActions.messages,\n pins:\n typeof slackActions.pins === \"boolean\"\n ? slackActions.pins\n : defaultSlackActions.pins,\n memberInfo:\n typeof slackActions.memberInfo === \"boolean\"\n ? slackActions.memberInfo\n : defaultSlackActions.memberInfo,\n emojiList:\n typeof slackActions.emojiList === \"boolean\"\n ? slackActions.emojiList\n : defaultSlackActions.emojiList,\n },\n channels: Array.isArray(slackChannels)\n ? []\n : typeof slackChannels === \"object\" && slackChannels\n ? Object.entries(slackChannels as Record<string, unknown>).map(\n ([key, value]): SlackChannelForm => {\n const entry =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n return {\n key,\n allow:\n typeof entry.allow === \"boolean\" ? entry.allow : true,\n requireMention:\n typeof entry.requireMention === \"boolean\"\n ? entry.requireMention\n : false,\n };\n },\n )\n : [],\n };\n\n state.signalForm = {\n enabled: typeof signal.enabled === \"boolean\" ? signal.enabled : true,\n account: typeof signal.account === \"string\" ? signal.account : \"\",\n httpUrl: typeof signal.httpUrl === \"string\" ? signal.httpUrl : \"\",\n httpHost: typeof signal.httpHost === \"string\" ? signal.httpHost : \"\",\n httpPort: typeof signal.httpPort === \"number\" ? String(signal.httpPort) : \"\",\n cliPath: typeof signal.cliPath === \"string\" ? signal.cliPath : \"\",\n autoStart: typeof signal.autoStart === \"boolean\" ? signal.autoStart : true,\n receiveMode:\n signal.receiveMode === \"on-start\" || signal.receiveMode === \"manual\"\n ? signal.receiveMode\n : \"\",\n ignoreAttachments:\n typeof signal.ignoreAttachments === \"boolean\" ? signal.ignoreAttachments : false,\n ignoreStories:\n typeof signal.ignoreStories === \"boolean\" ? signal.ignoreStories : false,\n sendReadReceipts:\n typeof signal.sendReadReceipts === \"boolean\" ? signal.sendReadReceipts : false,\n allowFrom: toList(signal.allowFrom),\n mediaMaxMb:\n typeof signal.mediaMaxMb === \"number\" ? String(signal.mediaMaxMb) : \"\",\n };\n\n state.imessageForm = {\n enabled: typeof imessage.enabled === \"boolean\" ? imessage.enabled : true,\n cliPath: typeof imessage.cliPath === \"string\" ? imessage.cliPath : \"\",\n dbPath: typeof imessage.dbPath === \"string\" ? imessage.dbPath : \"\",\n service:\n imessage.service === \"imessage\" ||\n imessage.service === \"sms\" ||\n imessage.service === \"auto\"\n ? imessage.service\n : \"auto\",\n region: typeof imessage.region === \"string\" ? imessage.region : \"\",\n allowFrom: toList(imessage.allowFrom),\n includeAttachments:\n typeof imessage.includeAttachments === \"boolean\"\n ? imessage.includeAttachments\n : false,\n mediaMaxMb:\n typeof imessage.mediaMaxMb === \"number\" ? String(imessage.mediaMaxMb) : \"\",\n };\n\n const configInvalid = snapshot.valid === false ? \"Config invalid.\" : null;\n state.telegramConfigStatus = configInvalid;\n state.discordConfigStatus = configInvalid;\n state.slackConfigStatus = configInvalid;\n state.signalConfigStatus = configInvalid;\n state.imessageConfigStatus = configInvalid;\n\n if (!state.configFormDirty) {\n state.configForm = cloneConfigObject(snapshot.config ?? {});\n }\n}\n\nexport async function saveConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configSaving = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? `${JSON.stringify(state.configForm, null, 2).trimEnd()}\\n`\n : state.configRaw;\n await state.client.request(\"config.set\", { raw });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSaving = false;\n }\n}\n\nexport function updateConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(state.configForm ?? {});\n setPathValue(base, path, value);\n state.configForm = base;\n state.configFormDirty = true;\n}\n\nexport function removeConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(state.configForm ?? {});\n removePathValue(base, path);\n state.configForm = base;\n state.configFormDirty = true;\n}\n\nfunction cloneConfigObject<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction setPathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n value: unknown,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n const nextKey = path[i + 1];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n if (current[key] == null) {\n current[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n const record = current as Record<string, unknown>;\n if (record[key] == null) {\n record[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = record[key] as Record<string, unknown> | unknown[];\n }\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) {\n current[lastKey] = value;\n }\n return;\n }\n if (typeof current === \"object\" && current != null) {\n (current as Record<string, unknown>)[lastKey] = value;\n }\n}\n\nfunction removePathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n current = (current as Record<string, unknown>)[key] as\n | Record<string, unknown>\n | unknown[];\n }\n if (current == null) return;\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) {\n current.splice(lastKey, 1);\n }\n return;\n }\n if (typeof current === \"object\" && current != null) {\n delete (current as Record<string, unknown>)[lastKey];\n }\n}\n","import { toNumber } from \"../format\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport type { CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n cronLoading: boolean;\n cronJobs: CronJob[];\n cronStatus: CronStatus | null;\n cronError: string | null;\n cronForm: CronFormState;\n cronRunsJobId: string | null;\n cronRuns: CronRunLogEntry[];\n cronBusy: boolean;\n};\n\nexport async function loadCronStatus(state: CronState) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.status\", {})) as CronStatus;\n state.cronStatus = res;\n } catch (err) {\n state.cronError = String(err);\n }\n}\n\nexport async function loadCronJobs(state: CronState) {\n if (!state.client || !state.connected) return;\n if (state.cronLoading) return;\n state.cronLoading = true;\n state.cronError = null;\n try {\n const res = (await state.client.request(\"cron.list\", {\n includeDisabled: true,\n })) as { jobs?: CronJob[] };\n state.cronJobs = Array.isArray(res.jobs) ? res.jobs : [];\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronLoading = false;\n }\n}\n\nexport function buildCronSchedule(form: CronFormState) {\n if (form.scheduleKind === \"at\") {\n const ms = Date.parse(form.scheduleAt);\n if (!Number.isFinite(ms)) throw new Error(\"Invalid run time.\");\n return { kind: \"at\" as const, atMs: ms };\n }\n if (form.scheduleKind === \"every\") {\n const amount = toNumber(form.everyAmount, 0);\n if (amount <= 0) throw new Error(\"Invalid interval amount.\");\n const unit = form.everyUnit;\n const mult = unit === \"minutes\" ? 60_000 : unit === \"hours\" ? 3_600_000 : 86_400_000;\n return { kind: \"every\" as const, everyMs: amount * mult };\n }\n const expr = form.cronExpr.trim();\n if (!expr) throw new Error(\"Cron expression required.\");\n return { kind: \"cron\" as const, expr, tz: form.cronTz.trim() || undefined };\n}\n\nexport function buildCronPayload(form: CronFormState) {\n if (form.payloadKind === \"systemEvent\") {\n const text = form.payloadText.trim();\n if (!text) throw new Error(\"System event text required.\");\n return { kind: \"systemEvent\" as const, text };\n }\n const message = form.payloadText.trim();\n if (!message) throw new Error(\"Agent message required.\");\n const payload: {\n kind: \"agentTurn\";\n message: string;\n deliver?: boolean;\n channel?: \"last\" | \"whatsapp\" | \"telegram\";\n to?: string;\n timeoutSeconds?: number;\n } = { kind: \"agentTurn\", message };\n if (form.deliver) payload.deliver = true;\n if (form.channel) payload.channel = form.channel;\n if (form.to.trim()) payload.to = form.to.trim();\n const timeoutSeconds = toNumber(form.timeoutSeconds, 0);\n if (timeoutSeconds > 0) payload.timeoutSeconds = timeoutSeconds;\n return payload;\n}\n\nexport async function addCronJob(state: CronState) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n const schedule = buildCronSchedule(state.cronForm);\n const payload = buildCronPayload(state.cronForm);\n const job = {\n name: state.cronForm.name.trim(),\n description: state.cronForm.description.trim() || undefined,\n enabled: state.cronForm.enabled,\n schedule,\n sessionTarget: state.cronForm.sessionTarget,\n wakeMode: state.cronForm.wakeMode,\n payload,\n isolation:\n state.cronForm.postToMainPrefix.trim() &&\n state.cronForm.sessionTarget === \"isolated\"\n ? { postToMainPrefix: state.cronForm.postToMainPrefix.trim() }\n : undefined,\n };\n if (!job.name) throw new Error(\"Name required.\");\n await state.client.request(\"cron.add\", job);\n state.cronForm = {\n ...state.cronForm,\n name: \"\",\n description: \"\",\n payloadText: \"\",\n };\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function toggleCronJob(\n state: CronState,\n job: CronJob,\n enabled: boolean,\n) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.update\", { id: job.id, patch: { enabled } });\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function runCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.run\", { id: job.id, mode: \"force\" });\n await loadCronRuns(state, job.id);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function removeCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.remove\", { id: job.id });\n if (state.cronRunsJobId === job.id) {\n state.cronRunsJobId = null;\n state.cronRuns = [];\n }\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function loadCronRuns(state: CronState, jobId: string) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.runs\", {\n id: jobId,\n limit: 50,\n })) as { entries?: CronRunLogEntry[] };\n state.cronRunsJobId = jobId;\n state.cronRuns = Array.isArray(res.entries) ? res.entries : [];\n } catch (err) {\n state.cronError = String(err);\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { HealthSnapshot, StatusSummary } from \"../types\";\n\nexport type DebugState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n debugLoading: boolean;\n debugStatus: StatusSummary | null;\n debugHealth: HealthSnapshot | null;\n debugModels: unknown[];\n debugHeartbeat: unknown | null;\n debugCallMethod: string;\n debugCallParams: string;\n debugCallResult: string | null;\n debugCallError: string | null;\n};\n\nexport async function loadDebug(state: DebugState) {\n if (!state.client || !state.connected) return;\n if (state.debugLoading) return;\n state.debugLoading = true;\n try {\n const [status, health, models, heartbeat] = await Promise.all([\n state.client.request(\"status\", {}),\n state.client.request(\"health\", {}),\n state.client.request(\"models.list\", {}),\n state.client.request(\"last-heartbeat\", {}),\n ]);\n state.debugStatus = status as StatusSummary;\n state.debugHealth = health as HealthSnapshot;\n const modelPayload = models as { models?: unknown[] } | undefined;\n state.debugModels = Array.isArray(modelPayload?.models)\n ? modelPayload?.models\n : [];\n state.debugHeartbeat = heartbeat as unknown;\n } catch (err) {\n state.debugCallError = String(err);\n } finally {\n state.debugLoading = false;\n }\n}\n\nexport async function callDebugMethod(state: DebugState) {\n if (!state.client || !state.connected) return;\n state.debugCallError = null;\n state.debugCallResult = null;\n try {\n const params = state.debugCallParams.trim()\n ? (JSON.parse(state.debugCallParams) as unknown)\n : {};\n const res = await state.client.request(state.debugCallMethod.trim(), params);\n state.debugCallResult = JSON.stringify(res, null, 2);\n } catch (err) {\n state.debugCallError = String(err);\n }\n}\n\n","import { html, nothing } from \"lit\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport {\n TAB_GROUPS,\n pathForTab,\n subtitleForTab,\n titleForTab,\n type Tab,\n} from \"./navigation\";\nimport type { UiSettings } from \"./storage\";\nimport type { ThemeMode } from \"./theme\";\nimport type { ThemeTransitionContext } from \"./theme-transition\";\nimport type {\n ConfigSnapshot,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n PresenceEntry,\n ProvidersStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n} from \"./types\";\nimport type {\n CronFormState,\n DiscordForm,\n IMessageForm,\n SlackForm,\n SignalForm,\n TelegramForm,\n} from \"./ui-types\";\nimport { renderChat } from \"./views/chat\";\nimport { renderConfig } from \"./views/config\";\nimport { renderConnections } from \"./views/connections\";\nimport { renderCron } from \"./views/cron\";\nimport { renderDebug } from \"./views/debug\";\nimport { renderInstances } from \"./views/instances\";\nimport { renderNodes } from \"./views/nodes\";\nimport { renderOverview } from \"./views/overview\";\nimport { renderSessions } from \"./views/sessions\";\nimport { renderSkills } from \"./views/skills\";\nimport {\n loadProviders,\n updateDiscordForm,\n updateIMessageForm,\n updateSlackForm,\n updateSignalForm,\n updateTelegramForm,\n} from \"./controllers/connections\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { loadSessions, patchSession } from \"./controllers/sessions\";\nimport {\n installSkill,\n loadSkills,\n saveSkillApiKey,\n updateSkillEdit,\n updateSkillEnabled,\n} from \"./controllers/skills\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadChatHistory } from \"./controllers/chat\";\nimport { loadConfig, saveConfig, updateConfigFormValue } from \"./controllers/config\";\nimport { loadCronRuns, toggleCronJob, runCronJob, removeCronJob, addCronJob } from \"./controllers/cron\";\nimport { loadDebug, callDebugMethod } from \"./controllers/debug\";\n\nexport type EventLogEntry = {\n ts: number;\n event: string;\n payload?: unknown;\n};\n\nexport type AppViewState = {\n settings: UiSettings;\n password: string;\n tab: Tab;\n basePath: string;\n connected: boolean;\n theme: ThemeMode;\n themeResolved: \"light\" | \"dark\";\n hello: GatewayHelloOk | null;\n lastError: string | null;\n eventLog: EventLogEntry[];\n sessionKey: string;\n chatLoading: boolean;\n chatSending: boolean;\n chatMessage: string;\n chatMessages: unknown[];\n chatToolMessages: unknown[];\n chatStream: string | null;\n chatRunId: string | null;\n chatThinkingLevel: string | null;\n nodesLoading: boolean;\n nodes: Array<Record<string, unknown>>;\n configLoading: boolean;\n configRaw: string;\n configValid: boolean | null;\n configIssues: unknown[];\n configSaving: boolean;\n configSnapshot: ConfigSnapshot | null;\n configSchema: unknown | null;\n configSchemaLoading: boolean;\n configUiHints: Record<string, unknown>;\n configForm: Record<string, unknown> | null;\n configFormMode: \"form\" | \"raw\";\n providersLoading: boolean;\n providersSnapshot: ProvidersStatusSnapshot | null;\n providersError: string | null;\n providersLastSuccess: number | null;\n whatsappLoginMessage: string | null;\n whatsappLoginQrDataUrl: string | null;\n whatsappLoginConnected: boolean | null;\n whatsappBusy: boolean;\n telegramForm: TelegramForm;\n telegramSaving: boolean;\n telegramTokenLocked: boolean;\n telegramConfigStatus: string | null;\n discordForm: DiscordForm;\n discordSaving: boolean;\n discordTokenLocked: boolean;\n discordConfigStatus: string | null;\n slackForm: SlackForm;\n slackSaving: boolean;\n slackTokenLocked: boolean;\n slackAppTokenLocked: boolean;\n slackConfigStatus: string | null;\n signalForm: SignalForm;\n signalSaving: boolean;\n signalConfigStatus: string | null;\n imessageForm: IMessageForm;\n imessageSaving: boolean;\n imessageConfigStatus: string | null;\n presenceLoading: boolean;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: string | null;\n sessionsLoading: boolean;\n sessionsResult: SessionsListResult | null;\n sessionsError: string | null;\n sessionsFilterActive: string;\n sessionsFilterLimit: string;\n sessionsIncludeGlobal: boolean;\n sessionsIncludeUnknown: boolean;\n cronLoading: boolean;\n cronJobs: CronJob[];\n cronStatus: CronStatus | null;\n cronError: string | null;\n cronForm: CronFormState;\n cronRunsJobId: string | null;\n cronRuns: CronRunLogEntry[];\n cronBusy: boolean;\n skillsLoading: boolean;\n skillsReport: SkillStatusReport | null;\n skillsError: string | null;\n skillsFilter: string;\n skillEdits: Record<string, string>;\n skillsBusyKey: string | null;\n debugLoading: boolean;\n debugStatus: StatusSummary | null;\n debugHealth: HealthSnapshot | null;\n debugModels: unknown[];\n debugHeartbeat: unknown | null;\n debugCallMethod: string;\n debugCallParams: string;\n debugCallResult: string | null;\n debugCallError: string | null;\n client: GatewayBrowserClient | null;\n connect: () => void;\n setTab: (tab: Tab) => void;\n setTheme: (theme: ThemeMode, context?: ThemeTransitionContext) => void;\n applySettings: (next: UiSettings) => void;\n loadOverview: () => Promise<void>;\n loadCron: () => Promise<void>;\n handleWhatsAppStart: (force: boolean) => Promise<void>;\n handleWhatsAppWait: () => Promise<void>;\n handleWhatsAppLogout: () => Promise<void>;\n handleTelegramSave: () => Promise<void>;\n handleSendChat: () => Promise<void>;\n resetToolStream: () => void;\n};\n\nexport function renderApp(state: AppViewState) {\n const presenceCount = state.presenceEntries.length;\n const sessionsCount = state.sessionsResult?.count ?? null;\n const cronNext = state.cronStatus?.nextWakeAtMs ?? null;\n const hasConnectedMobileNode = state.nodes.some((n) => {\n if (!Boolean(n.connected)) return false;\n const p = typeof n.platform === \"string\" ? n.platform.trim().toLowerCase() : \"\";\n return p.startsWith(\"ios\") || p.startsWith(\"ipados\") || p.startsWith(\"android\");\n });\n const chatDisabledReason = !state.connected\n ? \"Disconnected from gateway.\"\n : hasConnectedMobileNode\n ? null\n : \"No connected iOS/Android node — Web Chat + Talk are disabled.\";\n\n return html`\n <div class=\"shell\">\n <header class=\"topbar\">\n <div class=\"brand\">\n <div class=\"brand-title\">Clawdbot Control</div>\n <div class=\"brand-sub\">Gateway dashboard</div>\n </div>\n <div class=\"topbar-status\">\n <div class=\"pill\">\n <span class=\"statusDot ${state.connected ? \"ok\" : \"\"}\"></span>\n <span>Health</span>\n <span class=\"mono\">${state.connected ? \"OK\" : \"Offline\"}</span>\n </div>\n ${renderThemeToggle(state)}\n </div>\n </header>\n <aside class=\"nav\">\n ${TAB_GROUPS.map(\n (group) => html`\n <div class=\"nav-group\">\n <div class=\"nav-label\">${group.label}</div>\n ${group.tabs.map((tab) => renderTab(state, tab))}\n </div>\n `,\n )}\n </aside>\n <main class=\"content\">\n <section class=\"content-header\">\n <div>\n <div class=\"page-title\">${titleForTab(state.tab)}</div>\n <div class=\"page-sub\">${subtitleForTab(state.tab)}</div>\n </div>\n <div class=\"page-meta\">\n ${state.lastError\n ? html`<div class=\"pill danger\">${state.lastError}</div>`\n : nothing}\n </div>\n </section>\n\n ${state.tab === \"overview\"\n ? renderOverview({\n connected: state.connected,\n hello: state.hello,\n settings: state.settings,\n password: state.password,\n lastError: state.lastError,\n presenceCount,\n sessionsCount,\n cronEnabled: state.cronStatus?.enabled ?? null,\n cronNext,\n lastProvidersRefresh: state.providersLastSuccess,\n onSettingsChange: (next) => state.applySettings(next),\n onPasswordChange: (next) => (state.password = next),\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.resetToolStream();\n state.applySettings({ ...state.settings, sessionKey: next });\n },\n onRefresh: () => state.loadOverview(),\n })\n : nothing}\n\n ${state.tab === \"connections\"\n ? renderConnections({\n connected: state.connected,\n loading: state.providersLoading,\n snapshot: state.providersSnapshot,\n lastError: state.providersError,\n lastSuccessAt: state.providersLastSuccess,\n whatsappMessage: state.whatsappLoginMessage,\n whatsappQrDataUrl: state.whatsappLoginQrDataUrl,\n whatsappConnected: state.whatsappLoginConnected,\n whatsappBusy: state.whatsappBusy,\n telegramForm: state.telegramForm,\n telegramTokenLocked: state.telegramTokenLocked,\n telegramSaving: state.telegramSaving,\n telegramStatus: state.telegramConfigStatus,\n discordForm: state.discordForm,\n discordTokenLocked: state.discordTokenLocked,\n discordSaving: state.discordSaving,\n discordStatus: state.discordConfigStatus,\n slackForm: state.slackForm,\n slackTokenLocked: state.slackTokenLocked,\n slackAppTokenLocked: state.slackAppTokenLocked,\n slackSaving: state.slackSaving,\n slackStatus: state.slackConfigStatus,\n signalForm: state.signalForm,\n signalSaving: state.signalSaving,\n signalStatus: state.signalConfigStatus,\n imessageForm: state.imessageForm,\n imessageSaving: state.imessageSaving,\n imessageStatus: state.imessageConfigStatus,\n onRefresh: (probe) => loadProviders(state, probe),\n onWhatsAppStart: (force) => state.handleWhatsAppStart(force),\n onWhatsAppWait: () => state.handleWhatsAppWait(),\n onWhatsAppLogout: () => state.handleWhatsAppLogout(),\n onTelegramChange: (patch) => updateTelegramForm(state, patch),\n onTelegramSave: () => state.handleTelegramSave(),\n onDiscordChange: (patch) => updateDiscordForm(state, patch),\n onDiscordSave: () => state.handleDiscordSave(),\n onSlackChange: (patch) => updateSlackForm(state, patch),\n onSlackSave: () => state.handleSlackSave(),\n onSignalChange: (patch) => updateSignalForm(state, patch),\n onSignalSave: () => state.handleSignalSave(),\n onIMessageChange: (patch) => updateIMessageForm(state, patch),\n onIMessageSave: () => state.handleIMessageSave(),\n })\n : nothing}\n\n ${state.tab === \"instances\"\n ? renderInstances({\n loading: state.presenceLoading,\n entries: state.presenceEntries,\n lastError: state.presenceError,\n statusMessage: state.presenceStatus,\n onRefresh: () => loadPresence(state),\n })\n : nothing}\n\n ${state.tab === \"sessions\"\n ? renderSessions({\n loading: state.sessionsLoading,\n result: state.sessionsResult,\n error: state.sessionsError,\n activeMinutes: state.sessionsFilterActive,\n limit: state.sessionsFilterLimit,\n includeGlobal: state.sessionsIncludeGlobal,\n includeUnknown: state.sessionsIncludeUnknown,\n onFiltersChange: (next) => {\n state.sessionsFilterActive = next.activeMinutes;\n state.sessionsFilterLimit = next.limit;\n state.sessionsIncludeGlobal = next.includeGlobal;\n state.sessionsIncludeUnknown = next.includeUnknown;\n },\n onRefresh: () => loadSessions(state),\n onPatch: (key, patch) => patchSession(state, key, patch),\n })\n : nothing}\n\n ${state.tab === \"cron\"\n ? renderCron({\n loading: state.cronLoading,\n status: state.cronStatus,\n jobs: state.cronJobs,\n error: state.cronError,\n busy: state.cronBusy,\n form: state.cronForm,\n runsJobId: state.cronRunsJobId,\n runs: state.cronRuns,\n onFormChange: (patch) => (state.cronForm = { ...state.cronForm, ...patch }),\n onRefresh: () => state.loadCron(),\n onAdd: () => addCronJob(state),\n onToggle: (job, enabled) => toggleCronJob(state, job, enabled),\n onRun: (job) => runCronJob(state, job),\n onRemove: (job) => removeCronJob(state, job),\n onLoadRuns: (jobId) => loadCronRuns(state, jobId),\n })\n : nothing}\n\n ${state.tab === \"skills\"\n ? renderSkills({\n loading: state.skillsLoading,\n report: state.skillsReport,\n error: state.skillsError,\n filter: state.skillsFilter,\n edits: state.skillEdits,\n busyKey: state.skillsBusyKey,\n onFilterChange: (next) => (state.skillsFilter = next),\n onRefresh: () => loadSkills(state),\n onToggle: (key, enabled) => updateSkillEnabled(state, key, enabled),\n onEdit: (key, value) => updateSkillEdit(state, key, value),\n onSaveKey: (key) => saveSkillApiKey(state, key),\n onInstall: (name, installId) => installSkill(state, name, installId),\n })\n : nothing}\n\n ${state.tab === \"nodes\"\n ? renderNodes({\n loading: state.nodesLoading,\n nodes: state.nodes,\n onRefresh: () => loadNodes(state),\n })\n : nothing}\n\n ${state.tab === \"chat\"\n ? renderChat({\n sessionKey: state.sessionKey,\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.chatStream = null;\n state.chatRunId = null;\n state.resetToolStream();\n state.applySettings({ ...state.settings, sessionKey: next });\n void loadChatHistory(state);\n },\n thinkingLevel: state.chatThinkingLevel,\n loading: state.chatLoading,\n sending: state.chatSending,\n messages: [...state.chatMessages, ...state.chatToolMessages],\n stream: state.chatStream,\n draft: state.chatMessage,\n connected: state.connected,\n canSend: state.connected && hasConnectedMobileNode,\n disabledReason: chatDisabledReason,\n sessions: state.sessionsResult,\n onRefresh: () => {\n state.resetToolStream();\n return loadChatHistory(state);\n },\n onDraftChange: (next) => (state.chatMessage = next),\n onSend: () => state.handleSendChat(),\n })\n : nothing}\n\n ${state.tab === \"config\"\n ? renderConfig({\n raw: state.configRaw,\n valid: state.configValid,\n issues: state.configIssues,\n loading: state.configLoading,\n saving: state.configSaving,\n connected: state.connected,\n schema: state.configSchema,\n schemaLoading: state.configSchemaLoading,\n uiHints: state.configUiHints,\n formMode: state.configFormMode,\n formValue: state.configForm,\n onRawChange: (next) => (state.configRaw = next),\n onFormModeChange: (mode) => (state.configFormMode = mode),\n onFormPatch: (path, value) => updateConfigFormValue(state, path, value),\n onReload: () => loadConfig(state),\n onSave: () => saveConfig(state),\n })\n : nothing}\n\n ${state.tab === \"debug\"\n ? renderDebug({\n loading: state.debugLoading,\n status: state.debugStatus,\n health: state.debugHealth,\n models: state.debugModels,\n heartbeat: state.debugHeartbeat,\n eventLog: state.eventLog,\n callMethod: state.debugCallMethod,\n callParams: state.debugCallParams,\n callResult: state.debugCallResult,\n callError: state.debugCallError,\n onCallMethodChange: (next) => (state.debugCallMethod = next),\n onCallParamsChange: (next) => (state.debugCallParams = next),\n onRefresh: () => loadDebug(state),\n onCall: () => callDebugMethod(state),\n })\n : nothing}\n </main>\n </div>\n `;\n}\n\nfunction renderTab(state: AppViewState, tab: Tab) {\n const href = pathForTab(tab, state.basePath);\n return html`\n <a\n href=${href}\n class=\"nav-item ${state.tab === tab ? \"active\" : \"\"}\"\n @click=${(event: MouseEvent) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n ) {\n return;\n }\n event.preventDefault();\n state.setTab(tab);\n }}\n >\n <span>${titleForTab(tab)}</span>\n </a>\n `;\n}\n\nconst THEME_ORDER: ThemeMode[] = [\"system\", \"light\", \"dark\"];\n\nfunction renderThemeToggle(state: AppViewState) {\n const index = Math.max(0, THEME_ORDER.indexOf(state.theme));\n const applyTheme = (next: ThemeMode) => (event: MouseEvent) => {\n const element = event.currentTarget as HTMLElement;\n const context: ThemeTransitionContext = { element };\n if (event.clientX || event.clientY) {\n context.pointerClientX = event.clientX;\n context.pointerClientY = event.clientY;\n }\n state.setTheme(next, context);\n };\n\n return html`\n <div class=\"theme-toggle\" style=\"--theme-index: ${index};\">\n <div class=\"theme-toggle__track\" role=\"group\" aria-label=\"Theme\">\n <span class=\"theme-toggle__indicator\"></span>\n <button\n class=\"theme-toggle__button ${state.theme === \"system\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"system\")}\n aria-pressed=${state.theme === \"system\"}\n aria-label=\"System theme\"\n title=\"System\"\n >\n ${renderMonitorIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"light\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"light\")}\n aria-pressed=${state.theme === \"light\"}\n aria-label=\"Light theme\"\n title=\"Light\"\n >\n ${renderSunIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"dark\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"dark\")}\n aria-pressed=${state.theme === \"dark\"}\n aria-label=\"Dark theme\"\n title=\"Dark\"\n >\n ${renderMoonIcon()}\n </button>\n </div>\n </div>\n `;\n}\n\nfunction renderSunIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\n <path d=\"M12 2v2\"></path>\n <path d=\"M12 20v2\"></path>\n <path d=\"m4.93 4.93 1.41 1.41\"></path>\n <path d=\"m17.66 17.66 1.41 1.41\"></path>\n <path d=\"M2 12h2\"></path>\n <path d=\"M20 12h2\"></path>\n <path d=\"m6.34 17.66-1.41 1.41\"></path>\n <path d=\"m19.07 4.93-1.41 1.41\"></path>\n </svg>\n `;\n}\n\nfunction renderMoonIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\n ></path>\n </svg>\n `;\n}\n\nfunction renderMonitorIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"></rect>\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"></line>\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"></line>\n </svg>\n `;\n}\n","export type ThemeMode = \"system\" | \"light\" | \"dark\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport function getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"dark\";\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function resolveTheme(mode: ThemeMode): ResolvedTheme {\n if (mode === \"system\") return getSystemTheme();\n return mode;\n}\n","import type { ThemeMode } from \"./theme\";\n\nexport type ThemeTransitionContext = {\n element?: HTMLElement | null;\n pointerClientX?: number;\n pointerClientY?: number;\n};\n\nexport type ThemeTransitionOptions = {\n nextTheme: ThemeMode;\n applyTheme: () => void;\n context?: ThemeTransitionContext;\n currentTheme?: ThemeMode | null;\n};\n\ntype DocumentWithViewTransition = Document & {\n startViewTransition?: (callback: () => void) => { finished: Promise<void> };\n};\n\nconst clamp01 = (value: number) => {\n if (Number.isNaN(value)) return 0.5;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n};\n\nconst hasReducedMotionPreference = () => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n};\n\nconst cleanupThemeTransition = (root: HTMLElement) => {\n root.classList.remove(\"theme-transition\");\n root.style.removeProperty(\"--theme-switch-x\");\n root.style.removeProperty(\"--theme-switch-y\");\n};\n\nexport const startThemeTransition = ({\n nextTheme,\n applyTheme,\n context,\n currentTheme,\n}: ThemeTransitionOptions) => {\n if (currentTheme === nextTheme) return;\n\n const documentReference = globalThis.document ?? null;\n if (!documentReference) {\n applyTheme();\n return;\n }\n\n const root = documentReference.documentElement;\n const document_ = documentReference as DocumentWithViewTransition;\n const prefersReducedMotion = hasReducedMotionPreference();\n\n const canUseViewTransition =\n Boolean(document_.startViewTransition) && !prefersReducedMotion;\n\n if (canUseViewTransition) {\n let xPercent = 0.5;\n let yPercent = 0.5;\n\n if (\n context?.pointerClientX !== undefined &&\n context?.pointerClientY !== undefined &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01(context.pointerClientX / window.innerWidth);\n yPercent = clamp01(context.pointerClientY / window.innerHeight);\n } else if (context?.element) {\n const rect = context.element.getBoundingClientRect();\n if (\n rect.width > 0 &&\n rect.height > 0 &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01((rect.left + rect.width / 2) / window.innerWidth);\n yPercent = clamp01((rect.top + rect.height / 2) / window.innerHeight);\n }\n }\n\n root.style.setProperty(\"--theme-switch-x\", `${xPercent * 100}%`);\n root.style.setProperty(\"--theme-switch-y\", `${yPercent * 100}%`);\n root.classList.add(\"theme-transition\");\n\n try {\n const transition = document_.startViewTransition?.(() => {\n applyTheme();\n });\n if (transition?.finished) {\n void transition.finished.finally(() => cleanupThemeTransition(root));\n } else {\n cleanupThemeTransition(root);\n }\n } catch {\n cleanupThemeTransition(root);\n applyTheme();\n }\n return;\n }\n\n applyTheme();\n cleanupThemeTransition(root);\n};\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\n\nimport { GatewayBrowserClient, type GatewayEventFrame, type GatewayHelloOk } from \"./gateway\";\nimport { loadSettings, saveSettings, type UiSettings } from \"./storage\";\nimport { renderApp } from \"./app-render\";\nimport {\n inferBasePathFromPathname,\n normalizeBasePath,\n normalizePath,\n pathForTab,\n tabFromPath,\n type Tab,\n} from \"./navigation\";\nimport {\n resolveTheme,\n type ResolvedTheme,\n type ThemeMode,\n} from \"./theme\";\nimport {\n startThemeTransition,\n type ThemeTransitionContext,\n} from \"./theme-transition\";\nimport type {\n ConfigSnapshot,\n ConfigUiHints,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n PresenceEntry,\n ProvidersStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n} from \"./types\";\nimport {\n defaultDiscordActions,\n defaultSlackActions,\n type CronFormState,\n type DiscordForm,\n type IMessageForm,\n type SlackForm,\n type SignalForm,\n type TelegramForm,\n} from \"./ui-types\";\nimport {\n loadChatHistory,\n sendChat,\n handleChatEvent,\n type ChatEventPayload,\n} from \"./controllers/chat\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport {\n loadConfig,\n loadConfigSchema,\n updateConfigFormValue,\n} from \"./controllers/config\";\nimport {\n loadProviders,\n logoutWhatsApp,\n saveDiscordConfig,\n saveIMessageConfig,\n saveSlackConfig,\n saveSignalConfig,\n saveTelegramConfig,\n startWhatsAppLogin,\n waitWhatsAppLogin,\n} from \"./controllers/connections\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport {\n loadCronJobs,\n loadCronStatus,\n} from \"./controllers/cron\";\nimport {\n loadSkills,\n} from \"./controllers/skills\";\nimport { loadDebug } from \"./controllers/debug\";\n\ntype EventLogEntry = {\n ts: number;\n event: string;\n payload?: unknown;\n};\n\nconst TOOL_STREAM_LIMIT = 50;\n\ntype AgentEventPayload = {\n runId: string;\n seq: number;\n stream: string;\n ts: number;\n sessionKey?: string;\n data: Record<string, unknown>;\n};\n\ntype ToolStreamEntry = {\n toolCallId: string;\n runId: string;\n sessionKey?: string;\n name: string;\n args?: unknown;\n output?: string;\n startedAt: number;\n updatedAt: number;\n message: Record<string, unknown>;\n};\n\nfunction extractToolOutputText(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n if (typeof record.text === \"string\") return record.text;\n const content = record.content;\n if (!Array.isArray(content)) return null;\n const parts = content\n .map((item) => {\n if (!item || typeof item !== \"object\") return null;\n const entry = item as Record<string, unknown>;\n if (entry.type === \"text\" && typeof entry.text === \"string\") return entry.text;\n return null;\n })\n .filter((part): part is string => Boolean(part));\n if (parts.length === 0) return null;\n return parts.join(\"\\n\");\n}\n\nfunction formatToolOutput(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n const contentText = extractToolOutputText(value);\n if (contentText) return contentText;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\ndeclare global {\n interface Window {\n __CLAWDBOT_CONTROL_UI_BASE_PATH__?: string;\n }\n}\n\nconst DEFAULT_CRON_FORM: CronFormState = {\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n scheduleAt: \"\",\n everyAmount: \"30\",\n everyUnit: \"minutes\",\n cronExpr: \"0 7 * * *\",\n cronTz: \"\",\n sessionTarget: \"main\",\n wakeMode: \"next-heartbeat\",\n payloadKind: \"systemEvent\",\n payloadText: \"\",\n deliver: false,\n channel: \"last\",\n to: \"\",\n timeoutSeconds: \"\",\n postToMainPrefix: \"\",\n};\n\n@customElement(\"clawdbot-app\")\nexport class ClawdbotApp extends LitElement {\n @state() settings: UiSettings = loadSettings();\n @state() password = \"\";\n @state() tab: Tab = \"chat\";\n @state() connected = false;\n @state() theme: ThemeMode = this.settings.theme ?? \"system\";\n @state() themeResolved: ResolvedTheme = \"dark\";\n @state() hello: GatewayHelloOk | null = null;\n @state() lastError: string | null = null;\n @state() eventLog: EventLogEntry[] = [];\n\n @state() sessionKey = this.settings.sessionKey;\n @state() chatLoading = false;\n @state() chatSending = false;\n @state() chatMessage = \"\";\n @state() chatMessages: unknown[] = [];\n @state() chatToolMessages: unknown[] = [];\n @state() chatStream: string | null = null;\n @state() chatRunId: string | null = null;\n @state() chatThinkingLevel: string | null = null;\n\n @state() nodesLoading = false;\n @state() nodes: Array<Record<string, unknown>> = [];\n\n @state() configLoading = false;\n @state() configRaw = \"{\\n}\\n\";\n @state() configValid: boolean | null = null;\n @state() configIssues: unknown[] = [];\n @state() configSaving = false;\n @state() configSnapshot: ConfigSnapshot | null = null;\n @state() configSchema: unknown | null = null;\n @state() configSchemaVersion: string | null = null;\n @state() configSchemaLoading = false;\n @state() configUiHints: ConfigUiHints = {};\n @state() configForm: Record<string, unknown> | null = null;\n @state() configFormDirty = false;\n @state() configFormMode: \"form\" | \"raw\" = \"form\";\n\n @state() providersLoading = false;\n @state() providersSnapshot: ProvidersStatusSnapshot | null = null;\n @state() providersError: string | null = null;\n @state() providersLastSuccess: number | null = null;\n @state() whatsappLoginMessage: string | null = null;\n @state() whatsappLoginQrDataUrl: string | null = null;\n @state() whatsappLoginConnected: boolean | null = null;\n @state() whatsappBusy = false;\n @state() telegramForm: TelegramForm = {\n token: \"\",\n requireMention: true,\n allowFrom: \"\",\n proxy: \"\",\n webhookUrl: \"\",\n webhookSecret: \"\",\n webhookPath: \"\",\n };\n @state() telegramSaving = false;\n @state() telegramTokenLocked = false;\n @state() telegramConfigStatus: string | null = null;\n @state() discordForm: DiscordForm = {\n enabled: true,\n token: \"\",\n dmEnabled: true,\n allowFrom: \"\",\n groupEnabled: false,\n groupChannels: \"\",\n mediaMaxMb: \"\",\n historyLimit: \"\",\n textChunkLimit: \"\",\n guilds: [],\n actions: { ...defaultDiscordActions },\n slashEnabled: false,\n slashName: \"\",\n slashSessionPrefix: \"\",\n slashEphemeral: true,\n };\n @state() discordSaving = false;\n @state() discordTokenLocked = false;\n @state() discordConfigStatus: string | null = null;\n @state() slackForm: SlackForm = {\n enabled: true,\n botToken: \"\",\n appToken: \"\",\n dmEnabled: true,\n allowFrom: \"\",\n groupEnabled: false,\n groupChannels: \"\",\n mediaMaxMb: \"\",\n textChunkLimit: \"\",\n reactionNotifications: \"own\",\n reactionAllowlist: \"\",\n slashEnabled: false,\n slashName: \"\",\n slashSessionPrefix: \"\",\n slashEphemeral: true,\n actions: { ...defaultSlackActions },\n channels: [],\n };\n @state() slackSaving = false;\n @state() slackTokenLocked = false;\n @state() slackAppTokenLocked = false;\n @state() slackConfigStatus: string | null = null;\n @state() signalForm: SignalForm = {\n enabled: true,\n account: \"\",\n httpUrl: \"\",\n httpHost: \"\",\n httpPort: \"\",\n cliPath: \"\",\n autoStart: true,\n receiveMode: \"\",\n ignoreAttachments: false,\n ignoreStories: false,\n sendReadReceipts: false,\n allowFrom: \"\",\n mediaMaxMb: \"\",\n };\n @state() signalSaving = false;\n @state() signalConfigStatus: string | null = null;\n @state() imessageForm: IMessageForm = {\n enabled: true,\n cliPath: \"\",\n dbPath: \"\",\n service: \"auto\",\n region: \"\",\n allowFrom: \"\",\n includeAttachments: false,\n mediaMaxMb: \"\",\n };\n @state() imessageSaving = false;\n @state() imessageConfigStatus: string | null = null;\n\n @state() presenceLoading = false;\n @state() presenceEntries: PresenceEntry[] = [];\n @state() presenceError: string | null = null;\n @state() presenceStatus: string | null = null;\n\n @state() sessionsLoading = false;\n @state() sessionsResult: SessionsListResult | null = null;\n @state() sessionsError: string | null = null;\n @state() sessionsFilterActive = \"\";\n @state() sessionsFilterLimit = \"120\";\n @state() sessionsIncludeGlobal = true;\n @state() sessionsIncludeUnknown = false;\n\n @state() cronLoading = false;\n @state() cronJobs: CronJob[] = [];\n @state() cronStatus: CronStatus | null = null;\n @state() cronError: string | null = null;\n @state() cronForm: CronFormState = { ...DEFAULT_CRON_FORM };\n @state() cronRunsJobId: string | null = null;\n @state() cronRuns: CronRunLogEntry[] = [];\n @state() cronBusy = false;\n\n @state() skillsLoading = false;\n @state() skillsReport: SkillStatusReport | null = null;\n @state() skillsError: string | null = null;\n @state() skillsFilter = \"\";\n @state() skillEdits: Record<string, string> = {};\n @state() skillsBusyKey: string | null = null;\n\n @state() debugLoading = false;\n @state() debugStatus: StatusSummary | null = null;\n @state() debugHealth: HealthSnapshot | null = null;\n @state() debugModels: unknown[] = [];\n @state() debugHeartbeat: unknown | null = null;\n @state() debugCallMethod = \"\";\n @state() debugCallParams = \"{}\";\n @state() debugCallResult: string | null = null;\n @state() debugCallError: string | null = null;\n\n client: GatewayBrowserClient | null = null;\n private chatScrollFrame: number | null = null;\n private chatScrollTimeout: number | null = null;\n private nodesPollInterval: number | null = null;\n private toolStreamById = new Map<string, ToolStreamEntry>();\n private toolStreamOrder: string[] = [];\n basePath = \"\";\n private popStateHandler = () => this.onPopState();\n private themeMedia: MediaQueryList | null = null;\n private themeMediaHandler: ((event: MediaQueryListEvent) => void) | null = null;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.basePath = this.inferBasePath();\n this.syncTabWithLocation(true);\n this.syncThemeWithSettings();\n this.attachThemeListener();\n window.addEventListener(\"popstate\", this.popStateHandler);\n this.applySettingsFromUrl();\n this.connect();\n this.startNodesPolling();\n }\n\n disconnectedCallback() {\n window.removeEventListener(\"popstate\", this.popStateHandler);\n this.stopNodesPolling();\n this.detachThemeListener();\n super.disconnectedCallback();\n }\n\n protected updated(changed: Map<PropertyKey, unknown>) {\n if (\n this.tab === \"chat\" &&\n (changed.has(\"chatMessages\") ||\n changed.has(\"chatToolMessages\") ||\n changed.has(\"chatStream\") ||\n changed.has(\"chatLoading\") ||\n changed.has(\"chatMessage\") ||\n changed.has(\"tab\"))\n ) {\n this.scheduleChatScroll();\n }\n }\n\n connect() {\n this.lastError = null;\n this.hello = null;\n this.connected = false;\n\n this.client?.stop();\n this.client = new GatewayBrowserClient({\n url: this.settings.gatewayUrl,\n token: this.settings.token.trim() ? this.settings.token : undefined,\n password: this.password.trim() ? this.password : undefined,\n clientName: \"clawdbot-control-ui\",\n mode: \"webchat\",\n onHello: (hello) => {\n this.connected = true;\n this.hello = hello;\n this.applySnapshot(hello);\n void loadNodes(this, { quiet: true });\n void this.refreshActiveTab();\n },\n onClose: ({ code, reason }) => {\n this.connected = false;\n this.lastError = `disconnected (${code}): ${reason || \"no reason\"}`;\n },\n onEvent: (evt) => this.onEvent(evt),\n onGap: ({ expected, received }) => {\n this.lastError = `event gap detected (expected seq ${expected}, got ${received}); refresh recommended`;\n },\n });\n this.client.start();\n }\n\n private scheduleChatScroll() {\n if (this.chatScrollFrame) cancelAnimationFrame(this.chatScrollFrame);\n if (this.chatScrollTimeout != null) {\n clearTimeout(this.chatScrollTimeout);\n this.chatScrollTimeout = null;\n }\n this.chatScrollFrame = requestAnimationFrame(() => {\n this.chatScrollFrame = null;\n const container = this.querySelector(\".chat-thread\") as HTMLElement | null;\n if (!container) return;\n container.scrollTop = container.scrollHeight;\n this.chatScrollTimeout = window.setTimeout(() => {\n this.chatScrollTimeout = null;\n const latest = this.querySelector(\".chat-thread\") as HTMLElement | null;\n if (!latest) return;\n latest.scrollTop = latest.scrollHeight;\n }, 120);\n });\n }\n\n private startNodesPolling() {\n if (this.nodesPollInterval != null) return;\n this.nodesPollInterval = window.setInterval(\n () => void loadNodes(this, { quiet: true }),\n 5000,\n );\n }\n\n private stopNodesPolling() {\n if (this.nodesPollInterval == null) return;\n clearInterval(this.nodesPollInterval);\n this.nodesPollInterval = null;\n }\n\n private hasConnectedMobileNode() {\n return this.nodes.some((n) => {\n if (!Boolean(n.connected)) return false;\n const p =\n typeof n.platform === \"string\" ? n.platform.trim().toLowerCase() : \"\";\n return (\n p.startsWith(\"ios\") || p.startsWith(\"ipados\") || p.startsWith(\"android\")\n );\n });\n }\n\n resetToolStream() {\n this.toolStreamById.clear();\n this.toolStreamOrder = [];\n this.chatToolMessages = [];\n }\n\n private trimToolStream() {\n if (this.toolStreamOrder.length <= TOOL_STREAM_LIMIT) return;\n const overflow = this.toolStreamOrder.length - TOOL_STREAM_LIMIT;\n const removed = this.toolStreamOrder.splice(0, overflow);\n for (const id of removed) this.toolStreamById.delete(id);\n }\n\n private syncToolStreamMessages() {\n this.chatToolMessages = this.toolStreamOrder\n .map((id) => this.toolStreamById.get(id)?.message)\n .filter((msg): msg is Record<string, unknown> => Boolean(msg));\n }\n\n private buildToolStreamMessage(entry: ToolStreamEntry): Record<string, unknown> {\n const content: Array<Record<string, unknown>> = [];\n content.push({\n type: \"toolcall\",\n name: entry.name,\n arguments: entry.args ?? {},\n });\n if (entry.output) {\n content.push({\n type: \"toolresult\",\n name: entry.name,\n text: entry.output,\n });\n }\n return {\n role: \"assistant\",\n toolCallId: entry.toolCallId,\n runId: entry.runId,\n content,\n timestamp: entry.startedAt,\n };\n }\n\n private handleAgentEvent(payload?: AgentEventPayload) {\n if (!payload || payload.stream !== \"tool\") return;\n const sessionKey =\n typeof payload.sessionKey === \"string\" ? payload.sessionKey : undefined;\n if (sessionKey && sessionKey !== this.sessionKey) return;\n // Fallback: only accept session-less events for the active run.\n if (!sessionKey && this.chatRunId && payload.runId !== this.chatRunId) return;\n\n const data = payload.data ?? {};\n const toolCallId =\n typeof data.toolCallId === \"string\" ? data.toolCallId : \"\";\n if (!toolCallId) return;\n const name = typeof data.name === \"string\" ? data.name : \"tool\";\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n const args = phase === \"start\" ? data.args : undefined;\n const output =\n phase === \"update\"\n ? formatToolOutput(data.partialResult)\n : phase === \"result\"\n ? formatToolOutput(data.result)\n : undefined;\n\n const now = Date.now();\n let entry = this.toolStreamById.get(toolCallId);\n if (!entry) {\n entry = {\n toolCallId,\n runId: payload.runId,\n sessionKey,\n name,\n args,\n output,\n startedAt: typeof payload.ts === \"number\" ? payload.ts : now,\n updatedAt: now,\n message: {},\n };\n this.toolStreamById.set(toolCallId, entry);\n this.toolStreamOrder.push(toolCallId);\n } else {\n entry.name = name;\n if (args !== undefined) entry.args = args;\n if (output !== undefined) entry.output = output;\n entry.updatedAt = now;\n }\n\n entry.message = this.buildToolStreamMessage(entry);\n this.trimToolStream();\n this.syncToolStreamMessages();\n }\n\n private onEvent(evt: GatewayEventFrame) {\n this.eventLog = [\n { ts: Date.now(), event: evt.event, payload: evt.payload },\n ...this.eventLog,\n ].slice(0, 250);\n\n if (evt.event === \"agent\") {\n this.handleAgentEvent(evt.payload as AgentEventPayload | undefined);\n return;\n }\n\n if (evt.event === \"chat\") {\n const payload = evt.payload as ChatEventPayload | undefined;\n const state = handleChatEvent(this, payload);\n if (state === \"final\") void loadChatHistory(this);\n return;\n }\n\n if (evt.event === \"presence\") {\n const payload = evt.payload as { presence?: PresenceEntry[] } | undefined;\n if (payload?.presence && Array.isArray(payload.presence)) {\n this.presenceEntries = payload.presence;\n this.presenceError = null;\n this.presenceStatus = null;\n }\n return;\n }\n\n if (evt.event === \"cron\" && this.tab === \"cron\") {\n void this.loadCron();\n }\n }\n\n private applySnapshot(hello: GatewayHelloOk) {\n const snapshot = hello.snapshot as\n | { presence?: PresenceEntry[]; health?: HealthSnapshot }\n | undefined;\n if (snapshot?.presence && Array.isArray(snapshot.presence)) {\n this.presenceEntries = snapshot.presence;\n }\n if (snapshot?.health) {\n this.debugHealth = snapshot.health;\n }\n }\n\n applySettings(next: UiSettings) {\n this.settings = next;\n saveSettings(next);\n if (next.theme !== this.theme) {\n this.theme = next.theme;\n this.applyResolvedTheme(resolveTheme(next.theme));\n }\n }\n\n private applySettingsFromUrl() {\n if (!window.location.search) return;\n const params = new URLSearchParams(window.location.search);\n const token = params.get(\"token\")?.trim();\n if (!token) return;\n if (!this.settings.token) {\n this.applySettings({ ...this.settings, token });\n }\n params.delete(\"token\");\n const url = new URL(window.location.href);\n url.search = params.toString();\n window.history.replaceState({}, \"\", url.toString());\n }\n\n setTab(next: Tab) {\n if (this.tab !== next) this.tab = next;\n void this.refreshActiveTab();\n this.syncUrlWithTab(next, false);\n }\n\n setTheme(next: ThemeMode, context?: ThemeTransitionContext) {\n const applyTheme = () => {\n this.theme = next;\n this.applySettings({ ...this.settings, theme: next });\n this.applyResolvedTheme(resolveTheme(next));\n };\n startThemeTransition({\n nextTheme: next,\n applyTheme,\n context,\n currentTheme: this.theme,\n });\n }\n\n private async refreshActiveTab() {\n if (this.tab === \"overview\") await this.loadOverview();\n if (this.tab === \"connections\") await this.loadConnections();\n if (this.tab === \"instances\") await loadPresence(this);\n if (this.tab === \"sessions\") await loadSessions(this);\n if (this.tab === \"cron\") await this.loadCron();\n if (this.tab === \"skills\") await loadSkills(this);\n if (this.tab === \"nodes\") await loadNodes(this);\n if (this.tab === \"chat\") {\n await Promise.all([loadChatHistory(this), loadSessions(this)]);\n this.scheduleChatScroll();\n }\n if (this.tab === \"config\") {\n await loadConfigSchema(this);\n await loadConfig(this);\n }\n if (this.tab === \"debug\") await loadDebug(this);\n }\n\n private inferBasePath() {\n if (typeof window === \"undefined\") return \"\";\n const configured = window.__CLAWDBOT_CONTROL_UI_BASE_PATH__;\n if (typeof configured === \"string\" && configured.trim()) {\n return normalizeBasePath(configured);\n }\n return inferBasePathFromPathname(window.location.pathname);\n }\n\n private syncThemeWithSettings() {\n this.theme = this.settings.theme ?? \"system\";\n this.applyResolvedTheme(resolveTheme(this.theme));\n }\n\n private applyResolvedTheme(resolved: ResolvedTheme) {\n this.themeResolved = resolved;\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n root.dataset.theme = resolved;\n root.style.colorScheme = resolved;\n }\n\n private attachThemeListener() {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\")\n return;\n this.themeMedia = window.matchMedia(\"(prefers-color-scheme: dark)\");\n this.themeMediaHandler = (event) => {\n if (this.theme !== \"system\") return;\n this.applyResolvedTheme(event.matches ? \"dark\" : \"light\");\n };\n if (typeof this.themeMedia.addEventListener === \"function\") {\n this.themeMedia.addEventListener(\"change\", this.themeMediaHandler);\n return;\n }\n const legacy = this.themeMedia as MediaQueryList & {\n addListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.addListener(this.themeMediaHandler);\n }\n\n private detachThemeListener() {\n if (!this.themeMedia || !this.themeMediaHandler) return;\n if (typeof this.themeMedia.removeEventListener === \"function\") {\n this.themeMedia.removeEventListener(\"change\", this.themeMediaHandler);\n return;\n }\n const legacy = this.themeMedia as MediaQueryList & {\n removeListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.removeListener(this.themeMediaHandler);\n this.themeMedia = null;\n this.themeMediaHandler = null;\n }\n\n private syncTabWithLocation(replace: boolean) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, this.basePath) ?? \"chat\";\n this.setTabFromRoute(resolved);\n this.syncUrlWithTab(resolved, replace);\n }\n\n private onPopState() {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, this.basePath);\n if (!resolved) return;\n this.setTabFromRoute(resolved);\n }\n\n private setTabFromRoute(next: Tab) {\n if (this.tab !== next) this.tab = next;\n if (this.connected) void this.refreshActiveTab();\n }\n\n private syncUrlWithTab(tab: Tab, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const targetPath = normalizePath(pathForTab(tab, this.basePath));\n const currentPath = normalizePath(window.location.pathname);\n if (currentPath === targetPath) return;\n const url = new URL(window.location.href);\n url.pathname = targetPath;\n if (replace) {\n window.history.replaceState({}, \"\", url.toString());\n } else {\n window.history.pushState({}, \"\", url.toString());\n }\n }\n\n async loadOverview() {\n await Promise.all([\n loadProviders(this, false),\n loadPresence(this),\n loadSessions(this),\n loadCronStatus(this),\n loadDebug(this),\n ]);\n }\n\n private async loadConnections() {\n await Promise.all([loadProviders(this, true), loadConfig(this)]);\n }\n\n async loadCron() {\n await Promise.all([loadCronStatus(this), loadCronJobs(this)]);\n }\n\n async handleSendChat() {\n if (!this.connected || !this.hasConnectedMobileNode()) return;\n await sendChat(this);\n void loadChatHistory(this);\n }\n\n async handleWhatsAppStart(force: boolean) {\n await startWhatsAppLogin(this, force);\n await loadProviders(this, true);\n }\n\n async handleWhatsAppWait() {\n await waitWhatsAppLogin(this);\n await loadProviders(this, true);\n }\n\n async handleWhatsAppLogout() {\n await logoutWhatsApp(this);\n await loadProviders(this, true);\n }\n\n async handleTelegramSave() {\n await saveTelegramConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleDiscordSave() {\n await saveDiscordConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleSlackSave() {\n await saveSlackConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleSignalSave() {\n await saveSignalConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleIMessageSave() {\n await saveIMessageConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n render() {\n return renderApp(this);\n }\n}\n"],"names":["t","e","s","o","n$3","r","n","S","c","i","h","a","l","p","d","u","f","b","y$1","y","v","_","m","g","$","x","E","A","C","P","V","N","I","L","z","H","M","R","k","Z","B","D","uuidFromBytes","bytes","hex","weakRandomBytes","now","generateUUID","cryptoLike","GatewayBrowserClient","opts","ev","reason","delay","err","auth","params","hello","raw","parsed","frame","evt","seq","res","pending","method","id","resolve","reject","KEY","loadSettings","defaults","saveSettings","next","TAB_GROUPS","TAB_PATHS","PATH_TO_TAB","tab","path","normalizeBasePath","basePath","base","normalizePath","normalized","pathForTab","tabFromPath","pathname","inferBasePathFromPathname","segments","candidate","prefix","titleForTab","subtitleForTab","TOOL_DISPLAY_CONFIG","rawConfig","FALLBACK","TOOL_MAP","normalizeToolName","name","defaultTitle","cleaned","part","normalizeVerb","value","trimmed","coerceDisplayValue","firstLine","values","item","preview","lookupValueByPath","args","current","segment","resolveDetailFromKeys","keys","key","display","resolveReadDetail","record","offset","limit","resolveWriteDetail","resolveActionSpec","spec","action","resolveToolDisplay","emoji","title","label","actionRaw","actionSpec","verb","detail","detailKeys","shortenHomeInString","formatToolDetail","parts","input","renderChat","props","canInteract","canCompose","sessionOptions","resolveSessionOptions","composePlaceholder","html","entry","nothing","renderMessage","currentKey","sessions","cutoff","sorted","recent","seen","result","included","mainKey","mainEntry","message","role","toolCards","extractToolCards","hasToolCards","isToolResult","isToolResultMessage","extractedText","extractText","contentText","fallback","text","timestamp","klass","who","card","renderToolCard","content","normalizeContent","cards","kind","coerceArgs","extractToolText","renderConfigForm","schema","schemaType","orderA","hintForPath","orderB","node","renderNode","hints","onPatch","type","hint","humanize","help","entries","itemSchema","arr","defaultValue","index","opt","isSensitive","isSensitivePath","placeholder","pathKey","renderConfig","validity","formatMs","ms","formatAgo","diff","sec","min","hr","formatDurationMs","clampText","max","toNumber","parseList","discordActionOptions","slackActionOptions","renderConnections","whatsapp","telegram","discord","slack","signal","imessage","orderedProviders","providerEnabled","provider","renderProvider","formatDuration","snapshot","data","botName","guild","guildIndex","channel","channelIndex","channels","teamName","formatPresenceSummary","host","ip","mode","version","formatPresenceAge","ts","formatNextRun","formatSessionTokens","row","total","ctx","formatEventPayload","payload","formatCronState","job","state","last","formatCronSchedule","formatCronPayload","renderCron","renderScheduleFields","renderJob","renderRun","form","renderDebug","renderInstances","renderEntry","lastInput","renderNodes","connected","paired","caps","commands","renderOverview","uptime","tick","THINK_LEVELS","VERBOSE_LEVELS","renderSessions","rows","renderRow","updated","thinking","verbose","level","renderSkills","skills","filter","filtered","skill","renderSkill","busy","apiKey","missing","reasons","defaultDiscordActions","defaultSlackActions","loadProviders","probe","startWhatsAppLogin","force","waitWhatsAppLogin","logoutWhatsApp","updateTelegramForm","patch","updateDiscordForm","updateSlackForm","updateSignalForm","updateIMessageForm","saveTelegramConfig","config","token","groups","defaultGroup","allowFrom","proxy","webhookUrl","webhookSecret","webhookPath","saveDiscordConfig","groupChannels","dm","mediaMaxMb","historyLimitRaw","historyLimit","chunkLimitRaw","chunkLimit","guildsForm","guilds","slug","users","channelKey","channelEntry","actions","applyAction","slash","saveSlackConfig","textChunkLimit","reactionAllowlist","saveSignalConfig","account","httpUrl","httpHost","httpPort","cliPath","saveIMessageConfig","dbPath","region","loadPresence","loadSessions","activeMinutes","patchSession","loadSkills","updateSkillEdit","skillKey","updateSkillEnabled","enabled","saveSkillApiKey","installSkill","installId","loadNodes","loadChatHistory","sendChat","msg","runId","handleChatEvent","loadConfig","applyConfigSnapshot","loadConfigSchema","applyConfigSchema","toList","telegramGroups","telegramDefaultGroup","discordDm","discordActions","discordGuilds","readAction","channelsRaw","channelValue","slackDm","slackChannels","slackSlash","slackActions","configInvalid","cloneConfigObject","saveConfig","updateConfigFormValue","setPathValue","obj","nextKey","lastKey","loadCronStatus","loadCronJobs","buildCronSchedule","amount","unit","expr","buildCronPayload","timeoutSeconds","addCronJob","schedule","toggleCronJob","runCronJob","loadCronRuns","removeCronJob","jobId","loadDebug","status","health","models","heartbeat","modelPayload","callDebugMethod","renderApp","presenceCount","sessionsCount","cronNext","hasConnectedMobileNode","chatDisabledReason","renderThemeToggle","group","renderTab","href","event","THEME_ORDER","applyTheme","context","renderMonitorIcon","renderSunIcon","renderMoonIcon","getSystemTheme","resolveTheme","clamp01","hasReducedMotionPreference","cleanupThemeTransition","root","startThemeTransition","nextTheme","currentTheme","documentReference","document_","prefersReducedMotion","xPercent","yPercent","rect","transition","TOOL_STREAM_LIMIT","extractToolOutputText","formatToolOutput","DEFAULT_CRON_FORM","ClawdbotApp","LitElement","changed","code","expected","received","container","latest","overflow","removed","sessionKey","toolCallId","phase","output","url","configured","resolved","replace","targetPath","__decorateClass","customElement"],"mappings":"ssBAKA,MAAMA,GAAE,WAAWC,GAAED,GAAE,aAAsBA,GAAE,WAAX,QAAqBA,GAAE,SAAS,eAAe,uBAAuB,SAAS,WAAW,YAAY,cAAc,UAAUE,GAAE,OAAM,EAAGC,GAAE,IAAI,QAAO,IAAAC,GAAC,KAAO,CAAC,YAAY,EAAEH,EAAEE,EAAE,CAAC,GAAG,KAAK,aAAa,GAAGA,IAAID,GAAE,MAAM,MAAM,mEAAmE,EAAE,KAAK,QAAQ,EAAE,KAAK,EAAED,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAGA,IAAY,IAAT,OAAW,CAAC,MAAMA,EAAW,IAAT,QAAgB,EAAE,SAAN,EAAaA,IAAI,EAAEE,GAAE,IAAI,CAAC,GAAY,IAAT,UAAc,KAAK,EAAE,EAAE,IAAI,eAAe,YAAY,KAAK,OAAO,EAAEF,GAAGE,GAAE,IAAI,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,EAAM,MAACE,GAAEL,GAAG,IAAIM,GAAY,OAAON,GAAjB,SAAmBA,EAAEA,EAAE,GAAG,OAAOE,EAAC,EAAyVK,GAAE,CAACL,EAAEC,IAAI,CAAC,GAAGF,GAAEC,EAAE,mBAAmBC,EAAE,IAAIH,GAAGA,aAAa,cAAcA,EAAEA,EAAE,UAAU,MAAO,WAAUC,KAAKE,EAAE,CAAC,MAAMA,EAAE,SAAS,cAAc,OAAO,EAAEG,EAAEN,GAAE,SAAkBM,IAAT,QAAYH,EAAE,aAAa,QAAQG,CAAC,EAAEH,EAAE,YAAYF,EAAE,QAAQC,EAAE,YAAYC,CAAC,CAAC,CAAC,EAAEK,GAAEP,GAAED,GAAGA,EAAEA,GAAGA,aAAa,eAAe,GAAG,CAAC,IAAIC,EAAE,GAAG,UAAUC,KAAK,EAAE,SAASD,GAAGC,EAAE,QAAQ,OAAOG,GAAEJ,CAAC,CAAC,GAAGD,CAAC,EAAEA,ECApzC,KAAK,CAAC,GAAGS,GAAE,eAAeR,GAAE,yBAAyBS,GAAE,oBAAoBL,GAAE,sBAAsBF,GAAE,eAAeG,EAAC,EAAE,OAAOK,GAAE,WAAWH,GAAEG,GAAE,aAAaC,GAAEJ,GAAEA,GAAE,YAAY,GAAGK,GAAEF,GAAE,+BAA+BG,EAAE,CAACd,EAAEE,IAAIF,EAAEe,GAAE,CAAC,YAAYf,EAAEE,EAAE,CAAC,OAAOA,EAAC,CAAE,KAAK,QAAQF,EAAEA,EAAEY,GAAE,KAAK,MAAM,KAAK,OAAO,KAAK,MAAMZ,EAAQA,GAAN,KAAQA,EAAE,KAAK,UAAUA,CAAC,CAAC,CAAC,OAAOA,CAAC,EAAE,cAAcA,EAAEE,EAAE,CAAC,IAAIO,EAAET,EAAE,OAAOE,EAAC,CAAE,KAAK,QAAQO,EAAST,IAAP,KAAS,MAAM,KAAK,OAAOS,EAAST,IAAP,KAAS,KAAK,OAAOA,CAAC,EAAE,MAAM,KAAK,OAAO,KAAK,MAAM,GAAG,CAACS,EAAE,KAAK,MAAMT,CAAC,CAAC,MAAS,CAACS,EAAE,IAAI,CAAC,CAAC,OAAOA,CAAC,CAAC,EAAEO,GAAE,CAAChB,EAAEE,IAAI,CAACO,GAAET,EAAEE,CAAC,EAAEe,GAAE,CAAC,UAAU,GAAG,KAAK,OAAO,UAAUF,GAAE,QAAQ,GAAG,WAAW,GAAG,WAAWC,EAAC,EAAE,OAAO,WAAW,OAAO,UAAU,EAAEL,GAAE,sBAAsB,IAAI,QAAO,IAAAO,EAAC,cAAgB,WAAW,CAAC,OAAO,eAAe,EAAE,CAAC,KAAK,KAAI,GAAI,KAAK,IAAI,CAAA,GAAI,KAAK,CAAC,CAAC,CAAC,WAAW,oBAAoB,CAAC,OAAO,KAAK,SAAQ,EAAG,KAAK,MAAM,CAAC,GAAG,KAAK,KAAK,KAAI,CAAE,CAAC,CAAC,OAAO,eAAe,EAAE,EAAED,GAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,IAAI,KAAK,KAAI,EAAG,KAAK,UAAU,eAAe,CAAC,KAAK,EAAE,OAAO,OAAO,CAAC,GAAG,QAAQ,IAAI,KAAK,kBAAkB,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,MAAMR,EAAE,OAAM,EAAGC,EAAE,KAAK,sBAAsB,EAAED,EAAE,CAAC,EAAWC,IAAT,QAAYT,GAAE,KAAK,UAAU,EAAES,CAAC,CAAC,CAAC,CAAC,OAAO,sBAAsB,EAAE,EAAED,EAAE,CAAC,KAAK,CAAC,IAAIR,EAAE,IAAII,CAAC,EAAEK,GAAE,KAAK,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,IAAIV,EAAE,CAAC,KAAK,CAAC,EAAEA,CAAC,CAAC,EAAE,MAAM,CAAC,IAAIC,EAAE,IAAIC,EAAE,CAAC,MAAMQ,EAAET,GAAG,KAAK,IAAI,EAAEI,GAAG,KAAK,KAAKH,CAAC,EAAE,KAAK,cAAc,EAAEQ,EAAED,CAAC,CAAC,EAAE,aAAa,GAAG,WAAW,EAAE,CAAC,CAAC,OAAO,mBAAmB,EAAE,CAAC,OAAO,KAAK,kBAAkB,IAAI,CAAC,GAAGQ,EAAC,CAAC,OAAO,MAAM,CAAC,GAAG,KAAK,eAAeH,EAAE,mBAAmB,CAAC,EAAE,OAAO,MAAM,EAAER,GAAE,IAAI,EAAE,EAAE,SAAQ,EAAY,EAAE,IAAX,SAAe,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,kBAAkB,IAAI,IAAI,EAAE,iBAAiB,CAAC,CAAC,OAAO,UAAU,CAAC,GAAG,KAAK,eAAeQ,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,KAAK,UAAU,GAAG,KAAK,KAAI,EAAG,KAAK,eAAeA,EAAE,YAAY,CAAC,EAAE,CAAC,MAAMd,EAAE,KAAK,WAAWE,EAAE,CAAC,GAAGG,GAAEL,CAAC,EAAE,GAAGG,GAAEH,CAAC,CAAC,EAAE,UAAU,KAAKE,EAAE,KAAK,eAAe,EAAEF,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,EAAE,GAAU,IAAP,KAAS,CAAC,MAAM,EAAE,oBAAoB,IAAI,CAAC,EAAE,GAAY,IAAT,OAAW,SAAS,CAACA,EAAE,CAAC,IAAI,EAAE,KAAK,kBAAkB,IAAIA,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,SAAS,CAACA,EAAEE,CAAC,IAAI,KAAK,kBAAkB,CAAC,MAAM,EAAE,KAAK,KAAKF,EAAEE,CAAC,EAAW,IAAT,QAAY,KAAK,KAAK,IAAI,EAAEF,CAAC,CAAC,CAAC,KAAK,cAAc,KAAK,eAAe,KAAK,MAAM,CAAC,CAAC,OAAO,eAAeE,EAAE,CAAC,MAAMO,EAAE,CAAA,EAAG,GAAG,MAAM,QAAQP,CAAC,EAAE,CAAC,MAAMD,EAAE,IAAI,IAAIC,EAAE,KAAK,GAAG,EAAE,QAAO,CAAE,EAAE,UAAUA,KAAKD,EAAEQ,EAAE,QAAQT,GAAEE,CAAC,CAAC,CAAC,MAAeA,IAAT,QAAYO,EAAE,KAAKT,GAAEE,CAAC,CAAC,EAAE,OAAOO,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC,MAAMA,EAAE,EAAE,UAAU,OAAWA,IAAL,GAAO,OAAiB,OAAOA,GAAjB,SAAmBA,EAAY,OAAO,GAAjB,SAAmB,EAAE,YAAW,EAAG,MAAM,CAAC,aAAa,CAAC,MAAK,EAAG,KAAK,KAAK,OAAO,KAAK,gBAAgB,GAAG,KAAK,WAAW,GAAG,KAAK,KAAK,KAAK,KAAK,KAAI,CAAE,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,QAAQ,GAAG,KAAK,eAAe,CAAC,EAAE,KAAK,KAAK,IAAI,IAAI,KAAK,KAAI,EAAG,KAAK,cAAa,EAAG,KAAK,YAAY,GAAG,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,OAAO,IAAI,KAAK,IAAI,CAAC,EAAW,KAAK,aAAd,QAA0B,KAAK,aAAa,EAAE,gBAAa,CAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,KAAK,YAAY,kBAAkB,UAAUA,KAAK,EAAE,KAAI,EAAG,KAAK,eAAeA,CAAC,IAAI,EAAE,IAAIA,EAAE,KAAKA,CAAC,CAAC,EAAE,OAAO,KAAKA,CAAC,GAAG,EAAE,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,YAAY,KAAK,aAAa,KAAK,YAAY,iBAAiB,EAAE,OAAOP,GAAE,EAAE,KAAK,YAAY,aAAa,EAAE,CAAC,CAAC,mBAAmB,CAAC,KAAK,aAAa,KAAK,iBAAgB,EAAG,KAAK,eAAe,EAAE,EAAE,KAAK,MAAM,QAAQ,GAAG,EAAE,gBAAa,CAAI,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,sBAAsB,CAAC,KAAK,MAAM,QAAQ,GAAG,EAAE,mBAAgB,CAAI,CAAC,CAAC,yBAAyB,EAAE,EAAEO,EAAE,CAAC,KAAK,KAAK,EAAEA,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAMA,EAAE,KAAK,YAAY,kBAAkB,IAAI,CAAC,EAAER,EAAE,KAAK,YAAY,KAAK,EAAEQ,CAAC,EAAE,GAAYR,IAAT,QAAiBQ,EAAE,UAAP,GAAe,CAAC,MAAMC,GAAYD,EAAE,WAAW,cAAtB,OAAkCA,EAAE,UAAUM,IAAG,YAAY,EAAEN,EAAE,IAAI,EAAE,KAAK,KAAK,EAAQC,GAAN,KAAQ,KAAK,gBAAgBT,CAAC,EAAE,KAAK,aAAaA,EAAES,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAMD,EAAE,KAAK,YAAYR,EAAEQ,EAAE,KAAK,IAAI,CAAC,EAAE,GAAYR,IAAT,QAAY,KAAK,OAAOA,EAAE,CAAC,MAAMD,EAAES,EAAE,mBAAmBR,CAAC,EAAES,EAAc,OAAOV,EAAE,WAArB,WAA+B,CAAC,cAAcA,EAAE,SAAS,EAAWA,EAAE,WAAW,gBAAtB,OAAoCA,EAAE,UAAUe,GAAE,KAAK,KAAKd,EAAE,MAAMI,EAAEK,EAAE,cAAc,EAAEV,EAAE,IAAI,EAAE,KAAKC,CAAC,EAAEI,GAAG,KAAK,MAAM,IAAIJ,CAAC,GAAGI,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,cAAc,EAAE,EAAEI,EAAER,EAAE,GAAGS,EAAE,CAAC,GAAY,IAAT,OAAW,CAAC,MAAML,EAAE,KAAK,YAAY,GAAQJ,IAAL,KAASS,EAAE,KAAK,CAAC,GAAGD,IAAIJ,EAAE,mBAAmB,CAAC,EAAE,GAAGI,EAAE,YAAYO,IAAGN,EAAE,CAAC,GAAGD,EAAE,YAAYA,EAAE,SAASC,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,aAAaL,EAAE,KAAK,EAAEI,CAAC,CAAC,GAAG,OAAO,KAAK,EAAE,EAAE,EAAEA,CAAC,CAAC,CAAM,KAAK,kBAAV,KAA4B,KAAK,KAAK,KAAK,KAAI,EAAG,CAAC,EAAE,EAAE,EAAE,CAAC,WAAWA,EAAE,QAAQR,EAAE,QAAQS,CAAC,EAAEL,EAAE,CAACI,GAAG,EAAE,KAAK,OAAO,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,EAAEJ,GAAG,GAAG,KAAK,CAAC,CAAC,EAAOK,IAAL,IAAiBL,IAAT,UAAc,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,YAAYI,IAAI,EAAE,QAAQ,KAAK,KAAK,IAAI,EAAE,CAAC,GAAQR,IAAL,IAAQ,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,KAAK,gBAAgB,GAAG,GAAG,CAAC,MAAM,KAAK,IAAI,OAAOD,EAAE,CAAC,QAAQ,OAAOA,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,eAAc,EAAG,OAAa,GAAN,MAAS,MAAM,EAAE,CAAC,KAAK,eAAe,CAAC,gBAAgB,CAAC,OAAO,KAAK,cAAa,CAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,gBAAgB,OAAO,GAAG,CAAC,KAAK,WAAW,CAAC,GAAG,KAAK,aAAa,KAAK,iBAAgB,EAAG,KAAK,KAAK,CAAC,SAAS,CAACA,EAAEE,CAAC,IAAI,KAAK,KAAK,KAAKF,CAAC,EAAEE,EAAE,KAAK,KAAK,MAAM,CAAC,MAAMF,EAAE,KAAK,YAAY,kBAAkB,GAAGA,EAAE,KAAK,EAAE,SAAS,CAACE,EAAEO,CAAC,IAAIT,EAAE,CAAC,KAAK,CAAC,QAAQA,CAAC,EAAES,EAAER,EAAE,KAAKC,CAAC,EAAOF,IAAL,IAAQ,KAAK,KAAK,IAAIE,CAAC,GAAYD,IAAT,QAAY,KAAK,EAAEC,EAAE,OAAOO,EAAER,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,KAAK,KAAK,GAAG,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,GAAG,KAAK,WAAW,CAAC,EAAE,KAAK,MAAM,QAAQD,GAAGA,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,GAAG,KAAK,KAAI,CAAE,OAAOE,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,KAAI,EAAGA,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,QAAQF,GAAGA,EAAE,cAAW,CAAI,EAAE,KAAK,aAAa,KAAK,WAAW,GAAG,KAAK,aAAa,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC,IAAI,gBAAgB,CAAC,OAAO,KAAK,kBAAiB,CAAE,CAAC,mBAAmB,CAAC,OAAO,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQA,GAAG,KAAK,KAAKA,EAAE,KAAKA,CAAC,CAAC,CAAC,EAAE,KAAK,KAAI,CAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,EAACmB,EAAE,cAAc,CAAA,EAAGA,EAAE,kBAAkB,CAAC,KAAK,MAAM,EAAEA,EAAEL,EAAE,mBAAmB,CAAC,EAAE,IAAI,IAAIK,EAAEL,EAAE,WAAW,CAAC,EAAE,IAAI,IAAID,KAAI,CAAC,gBAAgBM,CAAC,CAAC,GAAGR,GAAE,0BAA0B,CAAA,GAAI,KAAK,OAAO,ECA3xL,MAACX,GAAE,WAAWS,GAAET,GAAGA,EAAEE,GAAEF,GAAE,aAAaC,GAAEC,GAAEA,GAAE,aAAa,WAAW,CAAC,WAAWF,GAAGA,CAAC,CAAC,EAAE,OAAOU,GAAE,QAAQP,EAAE,OAAO,KAAK,OAAM,EAAG,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,IAAIG,GAAE,IAAIH,EAAEE,GAAE,IAAIC,EAAC,IAAIM,EAAE,SAASJ,EAAE,IAAII,EAAE,cAAc,EAAE,EAAED,EAAEX,GAAUA,IAAP,MAAoB,OAAOA,GAAjB,UAAgC,OAAOA,GAAnB,WAAqBe,GAAE,MAAM,QAAQD,GAAEd,GAAGe,GAAEf,CAAC,GAAe,OAAOA,IAAI,OAAO,QAAQ,GAAtC,WAAwCgB,GAAE;AAAA,OAAcI,EAAE,sDAAsDC,GAAE,OAAOC,GAAE,KAAKT,EAAE,OAAO,KAAKG,EAAC,qBAAqBA,EAAC,KAAKA,EAAC;AAAA,0BAAsC,GAAG,EAAEO,GAAE,KAAKC,GAAE,KAAKL,GAAE,qCAAqCM,GAAEzB,GAAG,CAACS,KAAK,KAAK,CAAC,WAAWT,EAAE,QAAQS,EAAE,OAAO,CAAC,GAAGQ,EAAEQ,GAAE,CAAC,EAAgBC,EAAE,OAAO,IAAI,cAAc,EAAEC,EAAE,OAAO,IAAI,aAAa,EAAEC,GAAE,IAAI,QAAQC,EAAEjB,EAAE,iBAAiBA,EAAE,GAAG,EAAE,SAASkB,GAAE9B,EAAES,EAAE,CAAC,GAAG,CAACM,GAAEf,CAAC,GAAG,CAACA,EAAE,eAAe,KAAK,EAAE,MAAM,MAAM,gCAAgC,EAAE,OAAgBC,KAAT,OAAWA,GAAE,WAAWQ,CAAC,EAAEA,CAAC,CAAC,MAAMsB,GAAE,CAAC/B,EAAES,IAAI,CAAC,MAAM,EAAET,EAAE,OAAO,EAAEC,EAAE,CAAA,EAAG,IAAIK,EAAEM,EAAMH,IAAJ,EAAM,QAAYA,IAAJ,EAAM,SAAS,GAAGD,EAAEY,EAAE,QAAQX,EAAE,EAAEA,EAAE,EAAEA,IAAI,CAAC,MAAMP,EAAEF,EAAES,CAAC,EAAE,IAAIE,EAAEI,EAAED,EAAE,GAAGE,EAAE,EAAE,KAAKA,EAAEd,EAAE,SAASM,EAAE,UAAUQ,EAAED,EAAEP,EAAE,KAAKN,CAAC,EAASa,IAAP,OAAWC,EAAER,EAAE,UAAUA,IAAIY,EAAUL,EAAE,CAAC,IAAX,MAAaP,EAAEa,GAAWN,EAAE,CAAC,IAAZ,OAAcP,EAAEc,GAAWP,EAAE,CAAC,IAAZ,QAAeI,GAAE,KAAKJ,EAAE,CAAC,CAAC,IAAIT,EAAE,OAAO,KAAKS,EAAE,CAAC,EAAE,GAAG,GAAGP,EAAEK,GAAYE,EAAE,CAAC,IAAZ,SAAgBP,EAAEK,GAAGL,IAAIK,EAAQE,EAAE,CAAC,IAAT,KAAYP,EAAEF,GAAGc,EAAEN,EAAE,IAAaC,EAAE,CAAC,IAAZ,OAAcD,EAAE,IAAIA,EAAEN,EAAE,UAAUO,EAAE,CAAC,EAAE,OAAOJ,EAAEI,EAAE,CAAC,EAAEP,EAAWO,EAAE,CAAC,IAAZ,OAAcF,EAAQE,EAAE,CAAC,IAAT,IAAWS,GAAED,IAAGf,IAAIgB,IAAGhB,IAAIe,GAAEf,EAAEK,EAAEL,IAAIa,IAAGb,IAAIc,GAAEd,EAAEY,GAAGZ,EAAEK,EAAEP,EAAE,QAAQ,MAAMmB,EAAEjB,IAAIK,GAAGb,EAAES,EAAE,CAAC,EAAE,WAAW,IAAI,EAAE,IAAI,GAAGG,GAAGJ,IAAIY,EAAElB,EAAEG,GAAES,GAAG,GAAGb,EAAE,KAAKU,CAAC,EAAET,EAAE,MAAM,EAAEY,CAAC,EAAEJ,GAAER,EAAE,MAAMY,CAAC,EAAEX,EAAEsB,GAAGvB,EAAEC,GAAQW,IAAL,GAAOL,EAAEgB,EAAE,CAAC,MAAM,CAACK,GAAE9B,EAAEY,GAAGZ,EAAE,CAAC,GAAG,QAAYS,IAAJ,EAAM,SAAaA,IAAJ,EAAM,UAAU,GAAG,EAAER,CAAC,CAAC,EAAE,MAAMM,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAWE,CAAC,EAAER,EAAE,CAAC,IAAII,EAAE,KAAK,MAAM,CAAA,EAAG,IAAIO,EAAE,EAAED,EAAE,EAAE,MAAMI,EAAE,EAAE,OAAO,EAAED,EAAE,KAAK,MAAM,CAACE,EAAEI,CAAC,EAAEW,GAAE,EAAEtB,CAAC,EAAE,GAAG,KAAK,GAAGF,EAAE,cAAcS,EAAEf,CAAC,EAAE4B,EAAE,YAAY,KAAK,GAAG,QAAYpB,IAAJ,GAAWA,IAAJ,EAAM,CAAC,MAAMT,EAAE,KAAK,GAAG,QAAQ,WAAWA,EAAE,YAAY,GAAGA,EAAE,UAAU,CAAC,CAAC,MAAaK,EAAEwB,EAAE,SAAQ,KAApB,MAAyBf,EAAE,OAAOC,GAAG,CAAC,GAAOV,EAAE,WAAN,EAAe,CAAC,GAAGA,EAAE,gBAAgB,UAAUL,KAAKK,EAAE,kBAAiB,EAAG,GAAGL,EAAE,SAASU,EAAC,EAAE,CAAC,MAAMD,EAAEW,EAAET,GAAG,EAAET,EAAEG,EAAE,aAAaL,CAAC,EAAE,MAAMG,CAAC,EAAEF,EAAE,eAAe,KAAKQ,CAAC,EAAEK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAMF,EAAE,KAAKX,EAAE,CAAC,EAAE,QAAQC,EAAE,KAAWD,EAAE,CAAC,IAAT,IAAW+B,GAAQ/B,EAAE,CAAC,IAAT,IAAWgC,GAAQhC,EAAE,CAAC,IAAT,IAAWiC,GAAEC,EAAC,CAAC,EAAE9B,EAAE,gBAAgBL,CAAC,CAAC,MAAMA,EAAE,WAAWG,CAAC,IAAIW,EAAE,KAAK,CAAC,KAAK,EAAE,MAAMF,CAAC,CAAC,EAAEP,EAAE,gBAAgBL,CAAC,GAAG,GAAGmB,GAAE,KAAKd,EAAE,OAAO,EAAE,CAAC,MAAML,EAAEK,EAAE,YAAY,MAAMF,CAAC,EAAEM,EAAET,EAAE,OAAO,EAAE,GAAGS,EAAE,EAAE,CAACJ,EAAE,YAAYH,GAAEA,GAAE,YAAY,GAAG,QAAQA,EAAE,EAAEA,EAAEO,EAAEP,IAAIG,EAAE,OAAOL,EAAEE,CAAC,EAAEM,GAAG,EAAEqB,EAAE,WAAWf,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAEF,CAAC,CAAC,EAAEP,EAAE,OAAOL,EAAES,CAAC,EAAED,EAAC,CAAE,CAAC,CAAC,CAAC,SAAaH,EAAE,WAAN,EAAe,GAAGA,EAAE,OAAOC,GAAEQ,EAAE,KAAK,CAAC,KAAK,EAAE,MAAMF,CAAC,CAAC,MAAM,CAAC,IAAIZ,EAAE,GAAG,MAAWA,EAAEK,EAAE,KAAK,QAAQF,EAAEH,EAAE,CAAC,KAA5B,IAAgCc,EAAE,KAAK,CAAC,KAAK,EAAE,MAAMF,CAAC,CAAC,EAAEZ,GAAGG,EAAE,OAAO,CAAC,CAACS,GAAG,CAAC,CAAC,OAAO,cAAc,EAAEH,EAAE,CAAC,MAAMP,EAAEU,EAAE,cAAc,UAAU,EAAE,OAAOV,EAAE,UAAU,EAAEA,CAAC,CAAC,CAAC,SAASkC,EAAEpC,EAAES,EAAE,EAAET,EAAEC,EAAE,CAAC,GAAGQ,IAAIiB,EAAE,OAAOjB,EAAE,IAAIC,EAAWT,IAAT,OAAW,EAAE,OAAOA,CAAC,EAAE,EAAE,KAAK,MAAME,EAAEQ,EAAEF,CAAC,EAAE,OAAOA,EAAE,gBAAgB,OAAOC,GAAG,cAAcP,IAAIO,GAAG,OAAO,EAAE,EAAWP,IAAT,OAAWO,EAAE,QAAQA,EAAE,IAAIP,EAAEH,CAAC,EAAEU,EAAE,KAAKV,EAAE,EAAEC,CAAC,GAAYA,IAAT,QAAY,EAAE,OAAO,CAAA,GAAIA,CAAC,EAAES,EAAE,EAAE,KAAKA,GAAYA,IAAT,SAAaD,EAAE2B,EAAEpC,EAAEU,EAAE,KAAKV,EAAES,EAAE,MAAM,EAAEC,EAAET,CAAC,GAAGQ,CAAC,CAAC,MAAM4B,EAAC,CAAC,YAAY,EAAE5B,EAAE,CAAC,KAAK,KAAK,CAAA,EAAG,KAAK,KAAK,OAAO,KAAK,KAAK,EAAE,KAAK,KAAKA,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQA,CAAC,EAAE,MAAMP,CAAC,EAAE,KAAK,KAAKD,GAAG,GAAG,eAAeW,GAAG,WAAWH,EAAE,EAAE,EAAEoB,EAAE,YAAY5B,EAAE,IAAIS,EAAEmB,EAAE,SAAQ,EAAG1B,EAAE,EAAEG,EAAE,EAAE,EAAEJ,EAAE,CAAC,EAAE,KAAc,IAAT,QAAY,CAAC,GAAGC,IAAI,EAAE,MAAM,CAAC,IAAIM,EAAM,EAAE,OAAN,EAAWA,EAAE,IAAI6B,GAAE5B,EAAEA,EAAE,YAAY,KAAK,CAAC,EAAM,EAAE,OAAN,EAAWD,EAAE,IAAI,EAAE,KAAKC,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,CAAC,EAAM,EAAE,OAAN,IAAaD,EAAE,IAAI8B,GAAE7B,EAAE,KAAK,CAAC,GAAG,KAAK,KAAK,KAAKD,CAAC,EAAE,EAAEP,EAAE,EAAEI,CAAC,CAAC,CAACH,IAAI,GAAG,QAAQO,EAAEmB,EAAE,SAAQ,EAAG1B,IAAI,CAAC,OAAO0B,EAAE,YAAYjB,EAAEX,CAAC,CAAC,EAAE,EAAE,CAAC,IAAIQ,EAAE,EAAE,UAAUP,KAAK,KAAK,KAAcA,IAAT,SAAsBA,EAAE,UAAX,QAAoBA,EAAE,KAAK,EAAEA,EAAEO,CAAC,EAAEA,GAAGP,EAAE,QAAQ,OAAO,GAAGA,EAAE,KAAK,EAAEO,CAAC,CAAC,GAAGA,GAAG,CAAC,CAAC,MAAM6B,EAAC,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,MAAM,KAAK,IAAI,CAAC,YAAY,EAAE7B,EAAEP,EAAED,EAAE,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK0B,EAAE,KAAK,KAAK,OAAO,KAAK,KAAK,EAAE,KAAK,KAAKlB,EAAE,KAAK,KAAKP,EAAE,KAAK,QAAQD,EAAE,KAAK,KAAKA,GAAG,aAAa,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,MAAMQ,EAAE,KAAK,KAAK,OAAgBA,IAAT,QAAiB,GAAG,WAAR,KAAmB,EAAEA,EAAE,YAAY,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,EAAEA,EAAE,KAAK,CAAC,EAAE2B,EAAE,KAAK,EAAE3B,CAAC,EAAEE,EAAE,CAAC,EAAE,IAAIgB,GAAS,GAAN,MAAc,IAAL,IAAQ,KAAK,OAAOA,GAAG,KAAK,KAAI,EAAG,KAAK,KAAKA,GAAG,IAAI,KAAK,MAAM,IAAID,GAAG,KAAK,EAAE,CAAC,EAAW,EAAE,aAAX,OAAsB,KAAK,EAAE,CAAC,EAAW,EAAE,WAAX,OAAoB,KAAK,EAAE,CAAC,EAAEZ,GAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW,aAAa,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,OAAOa,GAAGhB,EAAE,KAAK,IAAI,EAAE,KAAK,KAAK,YAAY,KAAK,EAAE,KAAK,EAAEC,EAAE,eAAe,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAOH,EAAE,WAAWP,CAAC,EAAE,EAAED,EAAY,OAAOC,GAAjB,SAAmB,KAAK,KAAK,CAAC,GAAYA,EAAE,KAAX,SAAgBA,EAAE,GAAGK,EAAE,cAAcuB,GAAE5B,EAAE,EAAEA,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,OAAO,GAAGA,GAAG,GAAG,KAAK,MAAM,OAAOD,EAAE,KAAK,KAAK,EAAEQ,CAAC,MAAM,CAAC,MAAMT,EAAE,IAAIqC,GAAEpC,EAAE,IAAI,EAAEC,EAAEF,EAAE,EAAE,KAAK,OAAO,EAAEA,EAAE,EAAES,CAAC,EAAE,KAAK,EAAEP,CAAC,EAAE,KAAK,KAAKF,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAIS,EAAEmB,GAAE,IAAI,EAAE,OAAO,EAAE,OAAgBnB,IAAT,QAAYmB,GAAE,IAAI,EAAE,QAAQnB,EAAE,IAAIF,EAAE,CAAC,CAAC,EAAEE,CAAC,CAAC,EAAE,EAAE,CAACM,GAAE,KAAK,IAAI,IAAI,KAAK,KAAK,CAAA,EAAG,KAAK,QAAQ,MAAMN,EAAE,KAAK,KAAK,IAAIP,EAAED,EAAE,EAAE,UAAUS,KAAK,EAAET,IAAIQ,EAAE,OAAOA,EAAE,KAAKP,EAAE,IAAIoC,GAAE,KAAK,EAAE9B,EAAC,CAAE,EAAE,KAAK,EAAEA,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,EAAEN,EAAEO,EAAER,CAAC,EAAEC,EAAE,KAAKQ,CAAC,EAAET,IAAIA,EAAEQ,EAAE,SAAS,KAAK,KAAKP,GAAGA,EAAE,KAAK,YAAYD,CAAC,EAAEQ,EAAE,OAAOR,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,YAAY,EAAE,CAAC,IAAI,KAAK,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,MAAMC,EAAEO,GAAE,CAAC,EAAE,YAAYA,GAAE,CAAC,EAAE,OAAM,EAAG,EAAEP,CAAC,CAAC,CAAC,aAAa,EAAE,CAAU,KAAK,OAAd,SAAqB,KAAK,KAAK,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,MAAMiC,EAAC,CAAC,IAAI,SAAS,CAAC,OAAO,KAAK,QAAQ,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,YAAY,EAAE1B,EAAEP,EAAED,EAAES,EAAE,CAAC,KAAK,KAAK,EAAE,KAAK,KAAKiB,EAAE,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE,KAAK,KAAKlB,EAAE,KAAK,KAAKR,EAAE,KAAK,QAAQS,EAAER,EAAE,OAAO,GAAQA,EAAE,CAAC,IAAR,IAAgBA,EAAE,CAAC,IAAR,IAAW,KAAK,KAAK,MAAMA,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,QAAQA,GAAG,KAAK,KAAKyB,CAAC,CAAC,KAAK,EAAElB,EAAE,KAAKP,EAAED,EAAE,CAAC,MAAMS,EAAE,KAAK,QAAQ,IAAIP,EAAE,GAAG,GAAYO,IAAT,OAAW,EAAE0B,EAAE,KAAK,EAAE3B,EAAE,CAAC,EAAEN,EAAE,CAACQ,EAAE,CAAC,GAAG,IAAI,KAAK,MAAM,IAAIe,EAAEvB,IAAI,KAAK,KAAK,OAAO,CAAC,MAAMF,EAAE,EAAE,IAAIK,EAAED,EAAE,IAAI,EAAEK,EAAE,CAAC,EAAEJ,EAAE,EAAEA,EAAEI,EAAE,OAAO,EAAEJ,IAAID,EAAE+B,EAAE,KAAKnC,EAAEC,EAAEI,CAAC,EAAEG,EAAEH,CAAC,EAAED,IAAIqB,IAAIrB,EAAE,KAAK,KAAKC,CAAC,GAAGH,IAAI,CAACQ,EAAEN,CAAC,GAAGA,IAAI,KAAK,KAAKC,CAAC,EAAED,IAAIsB,EAAE,EAAEA,EAAE,IAAIA,IAAI,IAAItB,GAAG,IAAIK,EAAEJ,EAAE,CAAC,GAAG,KAAK,KAAKA,CAAC,EAAED,CAAC,CAACF,GAAG,CAACF,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI0B,EAAE,KAAK,QAAQ,gBAAgB,KAAK,IAAI,EAAE,KAAK,QAAQ,aAAa,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,MAAMK,WAAUG,EAAC,CAAC,aAAa,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,QAAQ,KAAK,IAAI,EAAE,IAAIR,EAAE,OAAO,CAAC,CAAC,CAAC,MAAMM,WAAUE,EAAC,CAAC,aAAa,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,QAAQ,gBAAgB,KAAK,KAAK,CAAC,CAAC,GAAG,IAAIR,CAAC,CAAC,CAAC,CAAC,MAAMO,WAAUC,EAAC,CAAC,YAAY,EAAE1B,EAAEP,EAAED,EAAES,EAAE,CAAC,MAAM,EAAED,EAAEP,EAAED,EAAES,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,KAAK,EAAED,EAAE,KAAK,CAAC,IAAI,EAAE2B,EAAE,KAAK,EAAE3B,EAAE,CAAC,GAAGkB,KAAKD,EAAE,OAAO,MAAMxB,EAAE,KAAK,KAAKD,EAAE,IAAI0B,GAAGzB,IAAIyB,GAAG,EAAE,UAAUzB,EAAE,SAAS,EAAE,OAAOA,EAAE,MAAM,EAAE,UAAUA,EAAE,QAAQQ,EAAE,IAAIiB,IAAIzB,IAAIyB,GAAG1B,GAAGA,GAAG,KAAK,QAAQ,oBAAoB,KAAK,KAAK,KAAKC,CAAC,EAAEQ,GAAG,KAAK,QAAQ,iBAAiB,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,YAAY,EAAE,CAAa,OAAO,KAAK,MAAxB,WAA6B,KAAK,KAAK,KAAK,KAAK,SAAS,MAAM,KAAK,QAAQ,CAAC,EAAE,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM6B,EAAC,CAAC,YAAY,EAAE9B,EAAEP,EAAE,CAAC,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,OAAO,KAAK,KAAKO,EAAE,KAAK,QAAQP,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAACkC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAM,MAAyDI,GAAExC,GAAE,uBAAuBwC,KAAIjC,EAAE+B,EAAC,GAAGtC,GAAE,kBAAkB,CAAA,GAAI,KAAK,OAAO,EAAE,MAAMyC,GAAE,CAACzC,EAAES,EAAE,IAAI,CAAC,MAAMR,EAAE,GAAG,cAAcQ,EAAE,IAAIC,EAAET,EAAE,WAAW,GAAYS,IAAT,OAAW,CAAC,MAAMV,EAAE,GAAG,cAAc,KAAKC,EAAE,WAAWS,EAAE,IAAI4B,GAAE7B,EAAE,aAAaD,EAAC,EAAGR,CAAC,EAAEA,EAAE,OAAO,GAAG,CAAA,CAAE,CAAC,CAAC,OAAOU,EAAE,KAAKV,CAAC,EAAEU,CAAC,ECAh7N,MAAMR,GAAE,WAAW,MAAMO,UAAUT,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,cAAc,CAAC,KAAK,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,iBAAgB,EAAG,OAAO,KAAK,cAAc,eAAe,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,MAAMK,EAAE,KAAK,OAAM,EAAG,KAAK,aAAa,KAAK,cAAc,YAAY,KAAK,aAAa,MAAM,OAAO,CAAC,EAAE,KAAK,KAAKJ,GAAEI,EAAE,KAAK,WAAW,KAAK,aAAa,CAAC,CAAC,mBAAmB,CAAC,MAAM,kBAAiB,EAAG,KAAK,MAAM,aAAa,EAAE,CAAC,CAAC,sBAAsB,CAAC,MAAM,qBAAoB,EAAG,KAAK,MAAM,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAOA,CAAC,CAAC,CAACI,EAAE,cAAc,GAAGA,EAAE,UAAa,GAAGP,GAAE,2BAA2B,CAAC,WAAWO,CAAC,CAAC,EAAE,MAAMN,GAAED,GAAE,0BAA0BC,KAAI,CAAC,WAAWM,CAAC,CAAC,GAAwDP,GAAE,qBAAqB,IAAI,KAAK,OAAO,ECA/xB,MAAMF,GAAEA,GAAG,CAACC,EAAEE,IAAI,CAAUA,WAAEA,EAAE,eAAe,IAAI,CAAC,eAAe,OAAOH,EAAEC,CAAC,CAAC,CAAC,EAAE,eAAe,OAAOD,EAAEC,CAAC,CAAC,ECAxG,MAAME,GAAE,CAAC,UAAU,GAAG,KAAK,OAAO,UAAUF,GAAE,QAAQ,GAAG,WAAWD,EAAC,EAAEK,GAAE,CAACL,EAAEG,GAAEF,EAAEI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,EAAEA,EAAE,IAAIH,EAAE,WAAW,oBAAoB,IAAI,CAAC,EAAE,GAAYA,IAAT,QAAY,WAAW,oBAAoB,IAAI,EAAEA,EAAE,IAAI,GAAG,EAAa,IAAX,YAAgBF,EAAE,OAAO,OAAOA,CAAC,GAAG,QAAQ,IAAIE,EAAE,IAAIG,EAAE,KAAKL,CAAC,EAAe,IAAb,WAAe,CAAC,KAAK,CAAC,KAAKG,CAAC,EAAEE,EAAE,MAAM,CAAC,IAAIA,EAAE,CAAC,MAAMC,EAAEL,EAAE,IAAI,KAAK,IAAI,EAAEA,EAAE,IAAI,KAAK,KAAKI,CAAC,EAAE,KAAK,cAAcF,EAAEG,EAAEN,EAAE,GAAGK,CAAC,CAAC,EAAE,KAAKJ,EAAE,CAAC,OAAgBA,IAAT,QAAY,KAAK,EAAEE,EAAE,OAAOH,EAAEC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,GAAc,IAAX,SAAa,CAAC,KAAK,CAAC,KAAKE,CAAC,EAAEE,EAAE,OAAO,SAASA,EAAE,CAAC,MAAMC,EAAE,KAAKH,CAAC,EAAEF,EAAE,KAAK,KAAKI,CAAC,EAAE,KAAK,cAAcF,EAAEG,EAAEN,EAAE,GAAGK,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,mCAAmC,CAAC,CAAC,EAAE,SAASC,GAAEN,EAAE,CAAC,MAAM,CAACC,EAAEE,IAAc,OAAOA,GAAjB,SAAmBE,GAAEL,EAAEC,EAAEE,CAAC,GAAG,CAACH,EAAEC,EAAEE,IAAI,CAAC,MAAME,EAAEJ,EAAE,eAAeE,CAAC,EAAE,OAAOF,EAAE,YAAY,eAAeE,EAAEH,CAAC,EAAEK,EAAE,OAAO,yBAAyBJ,EAAEE,CAAC,EAAE,MAAM,GAAGH,EAAEC,EAAEE,CAAC,CAAC,CCA5yB,SAASE,EAAEA,EAAE,CAAC,OAAOL,GAAE,CAAC,GAAGK,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC,CAAC,CCAvD,SAASqC,GAAcC,EAA2B,CAChDA,EAAM,CAAC,EAAKA,EAAM,CAAC,EAAI,GAAQ,GAC/BA,EAAM,CAAC,EAAKA,EAAM,CAAC,EAAI,GAAQ,IAE/B,IAAIC,EAAM,GACV,QAASnC,EAAI,EAAGA,EAAIkC,EAAM,OAAQlC,IAChCmC,GAAOD,EAAMlC,CAAC,EAAG,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAG/C,MAAO,GAAGmC,EAAI,MAAM,EAAG,CAAC,CAAC,IAAIA,EAAI,MAAM,EAAG,EAAE,CAAC,IAAIA,EAAI,MAAM,GAAI,EAAE,CAAC,IAAIA,EAAI,MACxE,GACA,EAAA,CACD,IAAIA,EAAI,MAAM,EAAE,CAAC,EACpB,CAEA,SAASC,IAA8B,CACrC,MAAMF,EAAQ,IAAI,WAAW,EAAE,EACzBG,EAAM,KAAK,IAAA,EACjB,QAASrC,EAAI,EAAGA,EAAIkC,EAAM,OAAQlC,IAAKkC,EAAMlC,CAAC,EAAI,KAAK,MAAM,KAAK,OAAA,EAAW,GAAG,EAChF,OAAAkC,EAAM,CAAC,GAAKG,EAAM,IAClBH,EAAM,CAAC,GAAMG,IAAQ,EAAK,IAC1BH,EAAM,CAAC,GAAMG,IAAQ,GAAM,IAC3BH,EAAM,CAAC,GAAMG,IAAQ,GAAM,IACpBH,CACT,CAEO,SAASI,GAAaC,EAAgC,WAAW,OAAgB,CACtF,GAAIA,GAAc,OAAOA,EAAW,YAAe,WAAY,OAAOA,EAAW,WAAA,EAEjF,GAAIA,GAAc,OAAOA,EAAW,iBAAoB,WAAY,CAClE,MAAML,EAAQ,IAAI,WAAW,EAAE,EAC/B,OAAAK,EAAW,gBAAgBL,CAAK,EACzBD,GAAcC,CAAK,CAC5B,CAEA,OAAOD,GAAcG,IAAiB,CACxC,CCKO,MAAMI,EAAqB,CAOhC,YAAoBC,EAAmC,CAAnC,KAAA,KAAAA,EANpB,KAAQ,GAAuB,KAC/B,KAAQ,YAAc,IACtB,KAAQ,OAAS,GACjB,KAAQ,QAAyB,KACjC,KAAQ,UAAY,GAEoC,CAExD,OAAQ,CACN,KAAK,OAAS,GACd,KAAK,QAAA,CACP,CAEA,MAAO,CACL,KAAK,OAAS,GACd,KAAK,IAAI,MAAA,EACT,KAAK,GAAK,KACV,KAAK,aAAa,IAAI,MAAM,wBAAwB,CAAC,CACvD,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,IAAI,aAAe,UAAU,IAC3C,CAEQ,SAAU,CACZ,KAAK,SACT,KAAK,GAAK,IAAI,UAAU,KAAK,KAAK,GAAG,EACrC,KAAK,GAAG,OAAS,IAAM,KAAK,YAAA,EAC5B,KAAK,GAAG,UAAaC,GAAO,KAAK,cAAc,OAAOA,EAAG,MAAQ,EAAE,CAAC,EACpE,KAAK,GAAG,QAAWA,GAAO,CACxB,MAAMC,EAAS,OAAOD,EAAG,QAAU,EAAE,EACrC,KAAK,GAAK,KACV,KAAK,aAAa,IAAI,MAAM,mBAAmBA,EAAG,IAAI,MAAMC,CAAM,EAAE,CAAC,EACrE,KAAK,KAAK,UAAU,CAAE,KAAMD,EAAG,KAAM,OAAAC,EAAQ,EAC7C,KAAK,kBAAA,CACP,EACA,KAAK,GAAG,QAAU,IAAM,CAExB,EACF,CAEQ,mBAAoB,CAC1B,GAAI,KAAK,OAAQ,OACjB,MAAMC,EAAQ,KAAK,UACnB,KAAK,UAAY,KAAK,IAAI,KAAK,UAAY,IAAK,IAAM,EACtD,OAAO,WAAW,IAAM,KAAK,QAAA,EAAWA,CAAK,CAC/C,CAEQ,aAAaC,EAAY,CAC/B,SAAW,CAAA,CAAGzC,CAAC,IAAK,KAAK,QAASA,EAAE,OAAOyC,CAAG,EAC9C,KAAK,QAAQ,MAAA,CACf,CAEQ,aAAc,CACpB,MAAMC,EACJ,KAAK,KAAK,OAAS,KAAK,KAAK,SACzB,CACE,MAAO,KAAK,KAAK,MACjB,SAAU,KAAK,KAAK,QAAA,EAEtB,OACAC,EAAS,CACb,YAAa,EACb,YAAa,EACb,OAAQ,CACN,KAAM,KAAK,KAAK,YAAc,sBAC9B,QAAS,KAAK,KAAK,eAAiB,MACpC,SAAU,KAAK,KAAK,UAAY,UAAU,UAAY,MACtD,KAAM,KAAK,KAAK,MAAQ,UACxB,WAAY,KAAK,KAAK,UAAA,EAExB,KAAM,CAAA,EACN,KAAAD,EACA,UAAW,UAAU,UACrB,OAAQ,UAAU,QAAA,EAGf,KAAK,QAAwB,UAAWC,CAAM,EAChD,KAAMC,GAAU,CACf,KAAK,UAAY,IACjB,KAAK,KAAK,UAAUA,CAAK,CAC3B,CAAC,EACA,MAAM,IAAM,CACX,KAAK,IAAI,MAAM,KAAM,gBAAgB,CACvC,CAAC,CACL,CAEQ,cAAcC,EAAa,CACjC,IAAIC,EACJ,GAAI,CACFA,EAAS,KAAK,MAAMD,CAAG,CACzB,MAAQ,CACN,MACF,CAEA,MAAME,EAAQD,EACd,GAAIC,EAAM,OAAS,QAAS,CAC1B,MAAMC,EAAMF,EACNG,EAAM,OAAOD,EAAI,KAAQ,SAAWA,EAAI,IAAM,KAChDC,IAAQ,OACN,KAAK,UAAY,MAAQA,EAAM,KAAK,QAAU,GAChD,KAAK,KAAK,QAAQ,CAAE,SAAU,KAAK,QAAU,EAAG,SAAUA,EAAK,EAEjE,KAAK,QAAUA,GAEjB,KAAK,KAAK,UAAUD,CAAG,EACvB,MACF,CAEA,GAAID,EAAM,OAAS,MAAO,CACxB,MAAMG,EAAMJ,EACNK,EAAU,KAAK,QAAQ,IAAID,EAAI,EAAE,EACvC,GAAI,CAACC,EAAS,OACd,KAAK,QAAQ,OAAOD,EAAI,EAAE,EACtBA,EAAI,GAAIC,EAAQ,QAAQD,EAAI,OAAO,EAClCC,EAAQ,OAAO,IAAI,MAAMD,EAAI,OAAO,SAAW,gBAAgB,CAAC,EACrE,MACF,CACF,CAEA,QAAqBE,EAAgBT,EAA8B,CACjE,GAAI,CAAC,KAAK,IAAM,KAAK,GAAG,aAAe,UAAU,KAC/C,OAAO,QAAQ,OAAO,IAAI,MAAM,uBAAuB,CAAC,EAE1D,MAAMU,EAAKnB,GAAA,EACLa,EAAQ,CAAE,KAAM,MAAO,GAAAM,EAAI,OAAAD,EAAQ,OAAAT,CAAA,EACnC3C,EAAI,IAAI,QAAW,CAACsD,EAASC,IAAW,CAC5C,KAAK,QAAQ,IAAIF,EAAI,CAAE,QAAU9C,GAAM+C,EAAQ/C,CAAM,EAAG,OAAAgD,CAAA,CAAQ,CAClE,CAAC,EACD,YAAK,GAAG,KAAK,KAAK,UAAUR,CAAK,CAAC,EAC3B/C,CACT,CACF,CCnLA,MAAMwD,GAAM,+BAWL,SAASC,IAA2B,CAMzC,MAAMC,EAAuB,CAC3B,WAJO,GADO,SAAS,WAAa,SAAW,MAAQ,IACxC,MAAM,SAAS,IAAI,GAKlC,MAAO,GACP,WAAY,OACZ,MAAO,QAAA,EAGT,GAAI,CACF,MAAMb,EAAM,aAAa,QAAQW,EAAG,EACpC,GAAI,CAACX,EAAK,OAAOa,EACjB,MAAMZ,EAAS,KAAK,MAAMD,CAAG,EAC7B,MAAO,CACL,WACE,OAAOC,EAAO,YAAe,UAAYA,EAAO,WAAW,KAAA,EACvDA,EAAO,WAAW,KAAA,EAClBY,EAAS,WACf,MAAO,OAAOZ,EAAO,OAAU,SAAWA,EAAO,MAAQY,EAAS,MAClE,WACE,OAAOZ,EAAO,YAAe,UAAYA,EAAO,WAAW,KAAA,EACvDA,EAAO,WAAW,KAAA,EAClBY,EAAS,WACf,MACEZ,EAAO,QAAU,SACjBA,EAAO,QAAU,QACjBA,EAAO,QAAU,SACbA,EAAO,MACPY,EAAS,KAAA,CAEnB,MAAQ,CACN,OAAOA,CACT,CACF,CAEO,SAASC,GAAaC,EAAkB,CAC7C,aAAa,QAAQJ,GAAK,KAAK,UAAUI,CAAI,CAAC,CAChD,CCpDO,MAAMC,GAAa,CACxB,CAAE,MAAO,OAAQ,KAAM,CAAC,MAAM,CAAA,EAC9B,CACE,MAAO,UACP,KAAM,CAAC,WAAY,cAAe,YAAa,WAAY,MAAM,CAAA,EAEnE,CAAE,MAAO,QAAS,KAAM,CAAC,SAAU,OAAO,CAAA,EAC1C,CAAE,MAAO,WAAY,KAAM,CAAC,SAAU,OAAO,CAAA,CAC/C,EAcMC,GAAiC,CACrC,SAAU,YACV,YAAa,eACb,UAAW,aACX,SAAU,YACV,KAAM,QACN,OAAQ,UACR,MAAO,SACP,KAAM,QACN,OAAQ,UACR,MAAO,QACT,EAEMC,GAAc,IAAI,IACtB,OAAO,QAAQD,EAAS,EAAE,IAAI,CAAC,CAACE,EAAKC,CAAI,IAAM,CAACA,EAAMD,CAAU,CAAC,CACnE,EAEO,SAASE,GAAkBC,EAA0B,CAC1D,GAAI,CAACA,EAAU,MAAO,GACtB,IAAIC,EAAOD,EAAS,KAAA,EAEpB,OADKC,EAAK,WAAW,GAAG,IAAGA,EAAO,IAAIA,CAAI,IACtCA,IAAS,IAAY,IACrBA,EAAK,SAAS,GAAG,MAAUA,EAAK,MAAM,EAAG,EAAE,GACxCA,EACT,CAEO,SAASC,EAAcJ,EAAsB,CAClD,GAAI,CAACA,EAAM,MAAO,IAClB,IAAIK,EAAaL,EAAK,KAAA,EACtB,OAAKK,EAAW,WAAW,GAAG,IAAGA,EAAa,IAAIA,CAAU,IACxDA,EAAW,OAAS,GAAKA,EAAW,SAAS,GAAG,IAClDA,EAAaA,EAAW,MAAM,EAAG,EAAE,GAE9BA,CACT,CAEO,SAASC,GAAWP,EAAUG,EAAW,GAAY,CAC1D,MAAMC,EAAOF,GAAkBC,CAAQ,EACjCF,EAAOH,GAAUE,CAAG,EAC1B,OAAOI,EAAO,GAAGA,CAAI,GAAGH,CAAI,GAAKA,CACnC,CAEO,SAASO,GAAYC,EAAkBN,EAAW,GAAgB,CACvE,MAAMC,EAAOF,GAAkBC,CAAQ,EACvC,IAAIF,EAAOQ,GAAY,IACnBL,IACEH,IAASG,EACXH,EAAO,IACEA,EAAK,WAAW,GAAGG,CAAI,GAAG,IACnCH,EAAOA,EAAK,MAAMG,EAAK,MAAM,IAGjC,IAAIE,EAAaD,EAAcJ,CAAI,EAAE,YAAA,EAErC,OADIK,EAAW,SAAS,aAAa,IAAGA,EAAa,KACjDA,IAAe,IAAY,OACxBP,GAAY,IAAIO,CAAU,GAAK,IACxC,CAEO,SAASI,GAA0BD,EAA0B,CAClE,IAAIH,EAAaD,EAAcI,CAAQ,EAIvC,GAHIH,EAAW,SAAS,aAAa,IACnCA,EAAaD,EAAcC,EAAW,MAAM,EAAG,GAAqB,CAAC,GAEnEA,IAAe,IAAK,MAAO,GAC/B,MAAMK,EAAWL,EAAW,MAAM,GAAG,EAAE,OAAO,OAAO,EACrD,GAAIK,EAAS,SAAW,EAAG,MAAO,GAClC,QAAS/E,EAAI,EAAGA,EAAI+E,EAAS,OAAQ/E,IAAK,CACxC,MAAMgF,EAAY,IAAID,EAAS,MAAM/E,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,YAAA,EACpD,GAAImE,GAAY,IAAIa,CAAS,EAAG,CAC9B,MAAMC,EAASF,EAAS,MAAM,EAAG/E,CAAC,EAClC,OAAOiF,EAAO,OAAS,IAAIA,EAAO,KAAK,GAAG,CAAC,GAAK,EAClD,CACF,CACA,MAAO,IAAIF,EAAS,KAAK,GAAG,CAAC,EAC/B,CAEO,SAASG,GAAYd,EAAU,CACpC,OAAQA,EAAA,CACN,IAAK,WACH,MAAO,WACT,IAAK,cACH,MAAO,cACT,IAAK,YACH,MAAO,YACT,IAAK,WACH,MAAO,WACT,IAAK,OACH,MAAO,YACT,IAAK,SACH,MAAO,SACT,IAAK,QACH,MAAO,QACT,IAAK,OACH,MAAO,OACT,IAAK,SACH,MAAO,SACT,IAAK,QACH,MAAO,QACT,QACE,MAAO,SAAA,CAEb,CAEO,SAASe,GAAef,EAAU,CACvC,OAAQA,EAAA,CACN,IAAK,WACH,MAAO,wDACT,IAAK,cACH,MAAO,sDACT,IAAK,YACH,MAAO,qDACT,IAAK,WACH,MAAO,2DACT,IAAK,OACH,MAAO,6CACT,IAAK,SACH,MAAO,mDACT,IAAK,QACH,MAAO,sDACT,IAAK,OACH,MAAO,uDACT,IAAK,SACH,MAAO,yCACT,IAAK,QACH,MAAO,mDACT,QACE,MAAO,EAAA,CAEb,6jLCxHMgB,GAAsBC,GACtBC,GAAWF,GAAoB,UAAY,CAAE,MAAO,IAAA,EACpDG,GAAWH,GAAoB,OAAS,CAAA,EAE9C,SAASI,GAAkBC,EAAuB,CAChD,OAAQA,GAAQ,QAAQ,KAAA,CAC1B,CAEA,SAASC,GAAaD,EAAsB,CAC1C,MAAME,EAAUF,EAAK,QAAQ,KAAM,GAAG,EAAE,KAAA,EACxC,OAAKE,EACEA,EACJ,MAAM,KAAK,EACX,IAAKC,GACJA,EAAK,QAAU,GAAKA,EAAK,YAAA,IAAkBA,EACvCA,EACA,GAAGA,EAAK,GAAG,CAAC,GAAG,YAAA,GAAiB,EAAE,GAAGA,EAAK,MAAM,CAAC,CAAC,EAAA,EAEvD,KAAK,GAAG,EARU,MASvB,CAEA,SAASC,GAAcC,EAAoC,CACzD,MAAMC,EAAUD,GAAO,KAAA,EACvB,GAAKC,EACL,OAAOA,EAAQ,QAAQ,KAAM,GAAG,CAClC,CAEA,SAASC,GAAmBF,EAAoC,CAC9D,GAAIA,GAAU,KACd,IAAI,OAAOA,GAAU,SAAU,CAC7B,MAAMC,EAAUD,EAAM,KAAA,EACtB,GAAI,CAACC,EAAS,OACd,MAAME,EAAYF,EAAQ,MAAM,OAAO,EAAE,CAAC,GAAG,QAAU,GACvD,OAAKE,EACEA,EAAU,OAAS,IAAM,GAAGA,EAAU,MAAM,EAAG,GAAG,CAAC,IAAMA,EADhD,MAElB,CACA,GAAI,OAAOH,GAAU,UAAY,OAAOA,GAAU,UAChD,OAAO,OAAOA,CAAK,EAErB,GAAI,MAAM,QAAQA,CAAK,EAAG,CACxB,MAAMI,EAASJ,EACZ,IAAKK,GAASH,GAAmBG,CAAI,CAAC,EACtC,OAAQA,GAAyB,EAAQA,CAAK,EACjD,GAAID,EAAO,SAAW,EAAG,OACzB,MAAME,EAAUF,EAAO,MAAM,EAAG,CAAC,EAAE,KAAK,IAAI,EAC5C,OAAOA,EAAO,OAAS,EAAI,GAAGE,CAAO,IAAMA,CAC7C,EAEF,CAEA,SAASC,GAAkBC,EAAejC,EAAuB,CAC/D,GAAI,CAACiC,GAAQ,OAAOA,GAAS,SAAU,OACvC,IAAIC,EAAmBD,EACvB,UAAWE,KAAWnC,EAAK,MAAM,GAAG,EAAG,CAErC,GADI,CAACmC,GACD,CAACD,GAAW,OAAOA,GAAY,SAAU,OAE7CA,EADeA,EACEC,CAAO,CAC1B,CACA,OAAOD,CACT,CAEA,SAASE,GAAsBH,EAAeI,EAAoC,CAChF,UAAWC,KAAOD,EAAM,CACtB,MAAMZ,EAAQO,GAAkBC,EAAMK,CAAG,EACnCC,EAAUZ,GAAmBF,CAAK,EACxC,GAAIc,EAAS,OAAOA,CACtB,CAEF,CAEA,SAASC,GAAkBP,EAAmC,CAC5D,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAAU,OACvC,MAAMQ,EAASR,EACTjC,EAAO,OAAOyC,EAAO,MAAS,SAAWA,EAAO,KAAO,OAC7D,GAAI,CAACzC,EAAM,OACX,MAAM0C,EAAS,OAAOD,EAAO,QAAW,SAAWA,EAAO,OAAS,OAC7DE,EAAQ,OAAOF,EAAO,OAAU,SAAWA,EAAO,MAAQ,OAChE,OAAIC,IAAW,QAAaC,IAAU,OAC7B,GAAG3C,CAAI,IAAI0C,CAAM,IAAIA,EAASC,CAAK,GAErC3C,CACT,CAEA,SAAS4C,GAAmBX,EAAmC,CAC7D,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAAU,OACvC,MAAMQ,EAASR,EAEf,OADa,OAAOQ,EAAO,MAAS,SAAWA,EAAO,KAAO,MAE/D,CAEA,SAASI,GACPC,EACAC,EACmC,CACnC,GAAI,GAACD,GAAQ,CAACC,GACd,OAAOD,EAAK,UAAUC,CAAM,GAAK,MACnC,CAEO,SAASC,GAAmBtE,EAInB,CACd,MAAM0C,EAAOD,GAAkBzC,EAAO,IAAI,EACpC4D,EAAMlB,EAAK,YAAA,EACX0B,EAAO5B,GAASoB,CAAG,EACnBW,EAAQH,GAAM,OAAS7B,GAAS,OAAS,KACzCiC,EAAQJ,GAAM,OAASzB,GAAaD,CAAI,EACxC+B,EAAQL,GAAM,OAAS1B,EACvBgC,EACJ1E,EAAO,MAAQ,OAAOA,EAAO,MAAS,SAChCA,EAAO,KAAiC,OAC1C,OACAqE,EAAS,OAAOK,GAAc,SAAWA,EAAU,OAAS,OAC5DC,EAAaR,GAAkBC,EAAMC,CAAM,EAC3CO,EAAO9B,GAAc6B,GAAY,OAASN,CAAM,EAEtD,IAAIQ,EACAjB,IAAQ,SAAQiB,EAASf,GAAkB9D,EAAO,IAAI,GACtD,CAAC6E,IAAWjB,IAAQ,SAAWA,IAAQ,QAAUA,IAAQ,YAC3DiB,EAASX,GAAmBlE,EAAO,IAAI,GAGzC,MAAM8E,EACJH,GAAY,YAAcP,GAAM,YAAc7B,GAAS,YAAc,CAAA,EACvE,MAAI,CAACsC,GAAUC,EAAW,OAAS,IACjCD,EAASnB,GAAsB1D,EAAO,KAAM8E,CAAU,GAGpD,CAACD,GAAU7E,EAAO,OACpB6E,EAAS7E,EAAO,MAGd6E,IACFA,EAASE,GAAoBF,CAAM,GAG9B,CACL,KAAAnC,EACA,MAAA6B,EACA,MAAAC,EACA,MAAAC,EACA,KAAAG,EACA,OAAAC,CAAA,CAEJ,CAEO,SAASG,GAAiBnB,EAA0C,CACzE,MAAMoB,EAAkB,CAAA,EAGxB,GAFIpB,EAAQ,MAAMoB,EAAM,KAAKpB,EAAQ,IAAI,EACrCA,EAAQ,QAAQoB,EAAM,KAAKpB,EAAQ,MAAM,EACzCoB,EAAM,SAAW,EACrB,OAAOA,EAAM,KAAK,KAAK,CACzB,CASA,SAASF,GAAoBG,EAAuB,CAClD,OAAKA,GACEA,EACJ,QAAQ,kBAAmB,GAAG,EAC9B,QAAQ,iBAAkB,GAAG,CAClC,CC/KO,SAASC,GAAWC,EAAkB,CAC3C,MAAMC,EAAcD,EAAM,UACpBE,EAAaF,EAAM,SAAW,CAACA,EAAM,QACrCG,EAAiBC,GAAsBJ,EAAM,WAAYA,EAAM,QAAQ,EACvEK,EACCL,EAAM,UACNA,EAAM,QACJ,uBADoB,yDADE,4CAK/B,OAAOM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,uBAOcN,EAAM,UAAU;AAAA,0BACb,CAACC,CAAW;AAAA,wBACb5I,GACT2I,EAAM,mBAAoB3I,EAAE,OAA6B,KAAK,CAAC;AAAA;AAAA,gBAE/D8I,EAAe,IACdI,GACCD,kBAAqBC,EAAM,GAAG;AAAA,sBAC1BA,EAAM,aAAeA,EAAM,GAAG;AAAA,4BAAA,CAErC;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKSP,EAAM,SAAW,CAACC,CAAW;AAAA,qBAChCD,EAAM,SAAS;AAAA;AAAA,cAEtBA,EAAM,QAAU,WAAa,SAAS;AAAA;AAAA;AAAA;AAAA,yCAIXA,EAAM,eAAiB,SAAS;AAAA;AAAA;AAAA;AAAA,QAIjEA,EAAM,eACJM;AAAAA,cACIN,EAAM,cAAc;AAAA,kBAExBQ,CAAO;AAAA;AAAA;AAAA,UAGPR,EAAM,QAAUM,0CAA+CE,CAAO;AAAA,UACtER,EAAM,SAAS,IAAKtH,GAAM+H,GAAc/H,CAAC,CAAC,CAAC;AAAA,UAC3CsH,EAAM,OACJS,GACE,CACE,KAAM,YACN,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAMT,EAAM,OAAQ,EAC9C,UAAW,KAAK,IAAA,CAAI,EAEtB,CAAE,UAAW,EAAA,CAAK,EAEpBQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAOER,EAAM,KAAK;AAAA,wBACR,CAACA,EAAM,OAAO;AAAA,uBACd3I,GAAqB,CAC3BA,EAAE,MAAQ,UACV,CAACA,EAAE,SAAW,CAACA,EAAE,UACrBA,EAAE,eAAA,EACE6I,KAAkB,OAAA,GACxB,CAAC;AAAA,qBACS7I,GACR2I,EAAM,cAAe3I,EAAE,OAA+B,KAAK,CAAC;AAAA,0BAChDgJ,CAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMpB,CAACL,EAAM,SAAWA,EAAM,OAAO;AAAA,qBAClCA,EAAM,MAAM;AAAA;AAAA,cAEnBA,EAAM,QAAU,WAAa,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,GAMjD,CAQA,SAASI,GACPM,EACAC,EACA,CAEA,MAAMC,EADM,KAAK,IAAA,EACI,KAAU,GAAK,IAE9BC,EAAS,CAAC,GADA,MAAM,QAAQF,GAAU,QAAQ,EAAIA,GAAU,UAAY,CAAA,EAAK,CAAA,CACrD,EAAE,KAC1B,CAAC5I,EAAGM,KAAOA,EAAE,WAAa,IAAMN,EAAE,WAAa,EAAA,EAE3C+I,EAA0B,CAAA,EAC1BC,MAAW,IACjB,UAAWR,KAASM,EACdE,EAAK,IAAIR,EAAM,GAAG,IACtBQ,EAAK,IAAIR,EAAM,GAAG,EACb,GAAAA,EAAM,WAAa,GAAKK,IAC7BE,EAAO,KAAKP,CAAK,GAGnB,MAAMS,EAA0B,CAAA,EAC1BC,MAAe,IACfC,EAAU,OACVC,EAAYN,EAAO,KAAMN,GAAUA,EAAM,MAAQW,CAAO,EAC1DC,GACFH,EAAO,KAAKG,CAAS,EACrBF,EAAS,IAAIC,CAAO,GACXR,IAAeQ,IACxBF,EAAO,KAAK,CAAE,IAAKE,EAAS,UAAW,KAAM,EAC7CD,EAAS,IAAIC,CAAO,GAGtB,UAAWX,KAASO,EACdG,EAAS,IAAIV,EAAM,GAAG,IAC1BS,EAAO,KAAKT,CAAK,EACjBU,EAAS,IAAIV,EAAM,GAAG,GAGxB,OAAKU,EAAS,IAAIP,CAAU,GAC1BM,EAAO,KAAK,CAAE,IAAKN,EAAY,UAAW,KAAM,EAG3CM,CACT,CAEA,SAASP,GAAcW,EAAkB9G,EAAgC,CACvE,MAAM5B,EAAI0I,EACJC,EAAO,OAAO3I,EAAE,MAAS,SAAWA,EAAE,KAAO,UAC7C4I,EAAYC,GAAiBH,CAAO,EACpCI,EAAeF,EAAU,OAAS,EAClCG,EAAeC,GAAoBN,CAAO,EAC1CO,EAAgBC,GAAYR,CAAO,EACnCS,EAAc,OAAOnJ,EAAE,SAAY,SAAWA,EAAE,QAAU,KAC1DoJ,EAAWN,EAAe,KAAO,KAAK,UAAUJ,EAAS,KAAM,CAAC,EAChEW,EAAQN,EAMV,KALAE,GAAe,KAAA,EACbA,EACAE,GAAa,KAAA,EACXA,EACAC,EAGFE,EACJ,OAAOtJ,EAAE,WAAc,SAAW,IAAI,KAAKA,EAAE,SAAS,EAAE,mBAAA,EAAuB,GAC3EuJ,EAAQZ,IAAS,YAAc,YAAcA,IAAS,OAAS,OAAS,QACxEa,EAAMb,IAAS,YAAc,YAAcA,IAAS,OAAS,MAAQA,EAC3E,OAAOf;AAAAA,4BACmB2B,CAAK;AAAA;AAAA,kCAEC3H,GAAM,UAAY,YAAc,EAAE;AAAA,YACxDyH,EAAOzB,2BAA8ByB,CAAI,SAAWvB,CAAO;AAAA,YAC3Dc,EAAU,IAAKa,GAASC,GAAeD,CAAI,CAAC,CAAC;AAAA;AAAA;AAAA,YAG7CD,CAAG,GAAGF,EAAY1B,OAAU0B,CAAS,GAAKxB,CAAO;AAAA;AAAA;AAAA;AAAA,GAK7D,CAEA,SAASoB,GAAYR,EAAiC,CACpD,MAAM1I,EAAI0I,EACJiB,EAAU3J,EAAE,QAClB,GAAI,OAAO2J,GAAY,SAAU,OAAOA,EACxC,GAAI,MAAM,QAAQA,CAAO,EAAG,CAC1B,MAAMxC,EAAQwC,EACX,IAAKpK,GAAM,CACV,MAAM+F,EAAO/F,EACb,OAAI+F,EAAK,OAAS,QAAU,OAAOA,EAAK,MAAS,SAAiBA,EAAK,KAChE,IACT,CAAC,EACA,OAAQxF,GAAmB,OAAOA,GAAM,QAAQ,EACnD,GAAIqH,EAAM,OAAS,EAAG,OAAOA,EAAM,KAAK;AAAA,CAAI,CAC9C,CACA,OAAI,OAAOnH,EAAE,MAAS,SAAiBA,EAAE,KAClC,IACT,CASA,SAAS6I,GAAiBH,EAA8B,CACtD,MAAM1I,EAAI0I,EACJiB,EAAUC,GAAiB5J,EAAE,OAAO,EACpC6J,EAAoB,CAAA,EAE1B,UAAWvE,KAAQqE,EAAS,CAC1B,MAAMG,EAAO,OAAOxE,EAAK,MAAQ,EAAE,EAAE,YAAA,GAEnC,CAAC,WAAY,YAAa,UAAW,UAAU,EAAE,SAASwE,CAAI,GAC7D,OAAOxE,EAAK,MAAS,UAAYA,EAAK,WAAa,OAEpDuE,EAAM,KAAK,CACT,KAAM,OACN,KAAOvE,EAAK,MAAmB,OAC/B,KAAMyE,GAAWzE,EAAK,WAAaA,EAAK,IAAI,CAAA,CAC7C,CAEL,CAEA,UAAWA,KAAQqE,EAAS,CAC1B,MAAMG,EAAO,OAAOxE,EAAK,MAAQ,EAAE,EAAE,YAAA,EACrC,GAAIwE,IAAS,cAAgBA,IAAS,cAAe,SACrD,MAAMT,EAAOW,GAAgB1E,CAAI,EAC3BV,EAAO,OAAOU,EAAK,MAAS,SAAWA,EAAK,KAAO,OACzDuE,EAAM,KAAK,CAAE,KAAM,SAAU,KAAAjF,EAAM,KAAAyE,EAAM,CAC3C,CAEA,GAAIL,GAAoBN,CAAO,GAAK,CAACmB,EAAM,KAAMJ,GAASA,EAAK,OAAS,QAAQ,EAAG,CACjF,MAAM7E,EACH,OAAO5E,EAAE,UAAa,UAAYA,EAAE,UACpC,OAAOA,EAAE,WAAc,UAAYA,EAAE,WACtC,OACIqJ,EAAOH,GAAYR,CAAO,GAAK,OACrCmB,EAAM,KAAK,CAAE,KAAM,SAAU,KAAAjF,EAAM,KAAAyE,EAAM,CAC3C,CAEA,OAAOQ,CACT,CAEA,SAASH,GAAeD,EAAgB,CACtC,MAAM1D,EAAUS,GAAmB,CAAE,KAAMiD,EAAK,KAAM,KAAMA,EAAK,KAAM,EACjE1C,EAASG,GAAiBnB,CAAO,EACvC,OAAO6B;AAAAA;AAAAA,2CAEkC7B,EAAQ,KAAK,IAAIA,EAAQ,KAAK;AAAA,QACjEgB,EACEa,wCAA2Cb,CAAM,SACjDe,CAAO;AAAA,QACT2B,EAAK,KACH7B,wCAA2C6B,EAAK,IAAI,SACpD3B,CAAO;AAAA;AAAA,GAGjB,CAEA,SAAS8B,GAAiBD,EAAkD,CAC1E,OAAK,MAAM,QAAQA,CAAO,EACnBA,EAAQ,OAAO,OAAO,EADO,CAAA,CAEtC,CAEA,SAASI,GAAW9E,EAAyB,CAC3C,GAAI,OAAOA,GAAU,SAAU,OAAOA,EACtC,MAAMC,EAAUD,EAAM,KAAA,EAEtB,GADI,CAACC,GACD,CAACA,EAAQ,WAAW,GAAG,GAAK,CAACA,EAAQ,WAAW,GAAG,EAAG,OAAOD,EACjE,GAAI,CACF,OAAO,KAAK,MAAMC,CAAO,CAC3B,MAAQ,CACN,OAAOD,CACT,CACF,CAEA,SAAS+E,GAAgB1E,EAAmD,CAC1E,GAAI,OAAOA,EAAK,MAAS,gBAAiBA,EAAK,KAC/C,GAAI,OAAOA,EAAK,SAAY,gBAAiBA,EAAK,OAEpD,CAEA,SAAS0D,GAAoBN,EAA2B,CACtD,MAAM1I,EAAI0I,EACJC,EAAO,OAAO3I,EAAE,MAAS,SAAWA,EAAE,KAAK,cAAgB,GACjE,OAAO2I,IAAS,cAAgBA,IAAS,aAC3C,CChSO,SAASsB,GAAiB3C,EAAwB,CACvD,GAAI,CAACA,EAAM,OACT,OAAOM,gDAET,MAAMsC,EAAS5C,EAAM,OACfrC,EAAQqC,EAAM,OAAS,CAAA,EAC7B,GAAI6C,GAAWD,CAAM,IAAM,UAAY,CAACA,EAAO,WAC7C,OAAOtC,kEAGT,MAAMO,EADU,OAAO,QAAQ+B,EAAO,UAAU,EACzB,KAAK,CAAC,EAAGvK,IAAM,CACpC,MAAMyK,EAASC,GAAY,CAAC,EAAE,CAAC,CAAC,EAAG/C,EAAM,OAAO,GAAG,OAAS,EACtDgD,EAASD,GAAY,CAAC1K,EAAE,CAAC,CAAC,EAAG2H,EAAM,OAAO,GAAG,OAAS,EAC5D,OAAI8C,IAAWE,EAAeF,EAASE,EAChC,EAAE,CAAC,EAAE,cAAc3K,EAAE,CAAC,CAAC,CAChC,CAAC,EAED,OAAOiI;AAAAA;AAAAA,QAEDO,EAAO,IAAI,CAAC,CAACrC,EAAKyE,CAAI,IACtBC,GAAW,CACT,OAAQD,EACR,MAAQtF,EAAkCa,CAAG,EAC7C,KAAM,CAACA,CAAG,EACV,MAAOwB,EAAM,QACb,QAASA,EAAM,OAAA,CAChB,CAAA,CACF;AAAA;AAAA,GAGP,CAEA,SAASkD,GAAWtI,EAMjB,CACD,KAAM,CAAE,OAAAgI,EAAQ,MAAAjF,EAAO,KAAAzB,EAAM,MAAAiH,EAAO,QAAAC,GAAYxI,EAC1CyI,EAAOR,GAAWD,CAAM,EACxBU,EAAOP,GAAY7G,EAAMiH,CAAK,EAC9B9D,EAAQiE,GAAM,OAASV,EAAO,OAASW,GAAS,OAAOrH,EAAK,GAAG,EAAE,CAAC,CAAC,EACnEsH,EAAOF,GAAM,MAAQV,EAAO,YAElC,GAAIA,EAAO,OAASA,EAAO,OAASA,EAAO,MACzC,OAAOtC;AAAAA,QACHjB,CAAK;AAAA,YAIX,GAAIgE,IAAS,SAAU,CACrB,MAAMrD,EAAQ4C,EAAO,YAAc,CAAA,EAC7Ba,EAAU,OAAO,QAAQzD,CAAK,EACpC,OAAIyD,EAAQ,SAAW,EAAUjD,EAC1BF;AAAAA;AAAAA,kBAEOjB,CAAK;AAAA,UACbmE,EAAOlD,uBAA0BkD,CAAI,SAAWhD,CAAO;AAAA,UACvDiD,EAAQ,IAAI,CAAC,CAACjF,EAAKyE,CAAI,IACvBC,GAAW,CACT,OAAQD,EACR,MAAOtF,GAAS,OAAOA,GAAU,SAAYA,EAAca,CAAG,EAAI,OAClE,KAAM,CAAC,GAAGtC,EAAMsC,CAAG,EACnB,MAAA2E,EACA,QAAAC,CAAA,CACD,CAAA,CACF;AAAA;AAAA,KAGP,CAEA,GAAIC,IAAS,QAAS,CACpB,MAAMK,EAAa,MAAM,QAAQd,EAAO,KAAK,EACzCA,EAAO,MAAM,CAAC,EACdA,EAAO,MACLe,EAAM,MAAM,QAAQhG,CAAK,EAAIA,EAAQ,CAAA,EAC3C,OAAO2C;AAAAA;AAAAA;AAAAA,kBAGOjB,CAAK;AAAA;AAAA;AAAA,qBAGF,IAAM,CACb,MAAMxD,EAAO,CAAC,GAAG8H,EAAKC,GAAaF,CAAU,CAAC,EAC9CN,EAAQlH,EAAML,CAAI,CACpB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,UAKH2H,EAAOlD,uBAA0BkD,CAAI,SAAWhD,CAAO;AAAA,UACvDmD,EAAI,IAAI,CAACpD,EAAOsD,IAChBvD;AAAAA,cACIoD,EACER,GAAW,CACT,OAAQQ,EACR,MAAOnD,EACP,KAAM,CAAC,GAAGrE,EAAM2H,CAAK,EACrB,MAAAV,EACA,QAAAC,CAAA,CACD,EACD5C,CAAO;AAAA;AAAA;AAAA,uBAGA,IAAM,CACb,MAAM3E,EAAO8H,EAAI,MAAA,EACjB9H,EAAK,OAAOgI,EAAO,CAAC,EACpBT,EAAQlH,EAAML,CAAI,CACpB,CAAC;AAAA;AAAA;AAAA;AAAA,iBAAA,CAKN;AAAA;AAAA,KAGP,CAEA,GAAI+G,EAAO,KACT,OAAOtC;AAAAA;AAAAA,gBAEKjB,CAAK;AAAA,UACXmE,EAAOlD,uBAA0BkD,CAAI,SAAWhD,CAAO;AAAA;AAAA,mBAE9C7C,GAAS,KAAO,GAAK,OAAOA,CAAK,CAAC;AAAA,oBAChCtG,GACT+L,EAAQlH,EAAO7E,EAAE,OAA6B,KAAK,CAAC;AAAA;AAAA,YAEpDuL,EAAO,KAAK,IACXkB,GAAQxD,kBAAqB,OAAOwD,CAAG,CAAC,IAAI,OAAOA,CAAG,CAAC,WAAA,CACzD;AAAA;AAAA;AAAA,MAMT,GAAIT,IAAS,UACX,OAAO/C;AAAAA;AAAAA,gBAEKjB,CAAK;AAAA,UACXmE,EAAOlD,uBAA0BkD,CAAI,SAAWhD,CAAO;AAAA;AAAA;AAAA,qBAG5C,EAAQ7C,CAAM;AAAA,oBACdtG,GACT+L,EAAQlH,EAAO7E,EAAE,OAA4B,OAAO,CAAC;AAAA;AAAA;AAAA,MAM/D,GAAIgM,IAAS,UAAYA,IAAS,UAChC,OAAO/C;AAAAA;AAAAA,gBAEKjB,CAAK;AAAA,UACXmE,EAAOlD,uBAA0BkD,CAAI,SAAWhD,CAAO;AAAA;AAAA;AAAA,mBAG9C7C,GAAS,KAAO,GAAK,OAAOA,CAAK,CAAC;AAAA,mBACjCtG,GAAa,CACrB,MAAMyD,EAAOzD,EAAE,OAA4B,MACrC0D,EAASD,IAAQ,GAAK,OAAY,OAAOA,CAAG,EAClDsI,EAAQlH,EAAMnB,CAAM,CACtB,CAAC;AAAA;AAAA;AAAA,MAMT,GAAIsI,IAAS,SAAU,CACrB,MAAMU,EAAcT,GAAM,WAAaU,GAAgB9H,CAAI,EACrD+H,EAAcX,GAAM,cAAgBS,EAAc,OAAS,IACjE,OAAOzD;AAAAA;AAAAA,gBAEKjB,CAAK;AAAA,UACXmE,EAAOlD,uBAA0BkD,CAAI,SAAWhD,CAAO;AAAA;AAAA,iBAEhDuD,EAAc,WAAa,MAAM;AAAA,wBAC1BE,CAAW;AAAA,mBAChBtG,GAAS,KAAO,GAAK,OAAOA,CAAK,CAAC;AAAA,mBACjCtG,GACR+L,EAAQlH,EAAO7E,EAAE,OAA4B,KAAK,CAAC;AAAA;AAAA;AAAA,KAI7D,CAEA,OAAOiJ;AAAAA,YACGjB,CAAK;AAAA;AAAA,SAGjB,CAEA,SAASwD,GAAWD,EAAwC,CAC1D,GAAKA,EACL,OAAI,MAAM,QAAQA,EAAO,IAAI,EACVA,EAAO,KAAK,OAAQxL,GAAMA,IAAM,MAAM,EACvC,CAAC,GAAKwL,EAAO,KAAK,CAAC,EAE9BA,EAAO,IAChB,CAEA,SAASgB,GAAahB,EAA8B,CAClD,GAAI,CAACA,EAAQ,MAAO,GACpB,GAAIA,EAAO,UAAY,OAAW,OAAOA,EAAO,QAEhD,OADaC,GAAWD,CAAM,EACtB,CACN,IAAK,SACH,MAAO,CAAA,EACT,IAAK,QACH,MAAO,CAAA,EACT,IAAK,UACH,MAAO,GACT,IAAK,SACL,IAAK,UACH,MAAO,GACT,IAAK,SACH,MAAO,GACT,QACE,MAAO,EAAA,CAEb,CAEA,SAASG,GAAY7G,EAA8BiH,EAAsB,CACvE,MAAM3E,EAAM0F,GAAQhI,CAAI,EACxB,OAAOiH,EAAM3E,CAAG,CAClB,CAEA,SAAS0F,GAAQhI,EAAsC,CACrD,OAAOA,EAAK,OAAQmC,GAAY,OAAOA,GAAY,QAAQ,EAAE,KAAK,GAAG,CACvE,CAEA,SAASkF,GAASzI,EAAa,CAC7B,OAAOA,EACJ,QAAQ,KAAM,GAAG,EACjB,QAAQ,qBAAsB,OAAO,EACrC,QAAQ,OAAQ,GAAG,EACnB,QAAQ,KAAOpC,GAAMA,EAAE,aAAa,CACzC,CAEA,SAASsL,GAAgB9H,EAAuC,CAC9D,MAAMsC,EAAM0F,GAAQhI,CAAI,EAAE,YAAA,EAC1B,OACEsC,EAAI,SAAS,OAAO,GACpBA,EAAI,SAAS,UAAU,GACvBA,EAAI,SAAS,QAAQ,GACrBA,EAAI,SAAS,QAAQ,GACrBA,EAAI,SAAS,KAAK,CAEtB,CC1PO,SAAS2F,GAAanE,EAAoB,CAC/C,MAAMoE,EACJpE,EAAM,OAAS,KAAO,UAAYA,EAAM,MAAQ,QAAU,UAC5D,OAAOM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,+BAKsB8D,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKZpE,EAAM,WAAa,OAAS,UAAY,EAAE;AAAA,0BAC3CA,EAAM,eAAiB,CAACA,EAAM,MAAM;AAAA,uBACvC,IAAMA,EAAM,iBAAiB,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKhCA,EAAM,WAAa,MAAQ,UAAY,EAAE;AAAA,uBAC7C,IAAMA,EAAM,iBAAiB,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,0CAKhBA,EAAM,OAAO,WAAWA,EAAM,QAAQ;AAAA,cAClEA,EAAM,QAAU,WAAa,QAAQ;AAAA;AAAA;AAAA;AAAA,wBAI3BA,EAAM,QAAU,CAACA,EAAM,SAAS;AAAA,qBACnCA,EAAM,MAAM;AAAA;AAAA,cAEnBA,EAAM,OAAS,UAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUvCA,EAAM,WAAa,OACjBM;AAAAA,cACIN,EAAM,cACJM,4CACAqC,GAAiB,CACf,OAAQ3C,EAAM,OACd,QAASA,EAAM,QACf,MAAOA,EAAM,UACb,QAASA,EAAM,WAAA,CAChB,CAAC;AAAA,kBAERM;AAAAA;AAAAA;AAAAA,uBAGaN,EAAM,GAAG;AAAA,uBACR3I,GACR2I,EAAM,YAAa3I,EAAE,OAA+B,KAAK,CAAC;AAAA;AAAA,mBAEvD;AAAA;AAAA,QAEX2I,EAAM,OAAO,OAAS,EACpBM;AAAAA,sCAC4B,KAAK,UAAUN,EAAM,OAAQ,KAAM,CAAC,CAAC;AAAA,kBAEjEQ,CAAO;AAAA;AAAA,GAGjB,CC9FO,SAAS6D,EAASC,EAA4B,CACnD,MAAI,CAACA,GAAMA,IAAO,EAAU,MACrB,IAAI,KAAKA,CAAE,EAAE,eAAA,CACtB,CAEO,SAASC,EAAUD,EAA4B,CACpD,GAAI,CAACA,GAAMA,IAAO,EAAG,MAAO,MAC5B,MAAME,EAAO,KAAK,IAAA,EAAQF,EAC1B,GAAIE,EAAO,EAAG,MAAO,WACrB,MAAMC,EAAM,KAAK,MAAMD,EAAO,GAAI,EAClC,GAAIC,EAAM,GAAI,MAAO,GAAGA,CAAG,QAC3B,MAAMC,EAAM,KAAK,MAAMD,EAAM,EAAE,EAC/B,GAAIC,EAAM,GAAI,MAAO,GAAGA,CAAG,QAC3B,MAAMC,EAAK,KAAK,MAAMD,EAAM,EAAE,EAC9B,OAAIC,EAAK,GAAW,GAAGA,CAAE,QAElB,GADK,KAAK,MAAMA,EAAK,EAAE,CACjB,OACf,CAEO,SAASC,GAAiBN,EAA4B,CAC3D,GAAI,CAACA,GAAMA,IAAO,EAAG,MAAO,MAC5B,GAAIA,EAAK,IAAM,MAAO,GAAGA,CAAE,KAC3B,MAAMG,EAAM,KAAK,MAAMH,EAAK,GAAI,EAChC,GAAIG,EAAM,GAAI,MAAO,GAAGA,CAAG,IAC3B,MAAMC,EAAM,KAAK,MAAMD,EAAM,EAAE,EAC/B,GAAIC,EAAM,GAAI,MAAO,GAAGA,CAAG,IAC3B,MAAMC,EAAK,KAAK,MAAMD,EAAM,EAAE,EAC9B,OAAIC,EAAK,GAAW,GAAGA,CAAE,IAElB,GADK,KAAK,MAAMA,EAAK,EAAE,CACjB,GACf,CAOO,SAASE,GAAUlH,EAAemH,EAAM,IAAa,CAC1D,OAAInH,EAAM,QAAUmH,EAAYnH,EACzB,GAAGA,EAAM,MAAM,EAAG,KAAK,IAAI,EAAGmH,EAAM,CAAC,CAAC,CAAC,GAChD,CAEO,SAASC,GAASpH,EAAemE,EAA0B,CAChE,MAAMpK,EAAI,OAAOiG,CAAK,EACtB,OAAO,OAAO,SAASjG,CAAC,EAAIA,EAAIoK,CAClC,CAEO,SAASkD,EAAUlF,EAAyB,CACjD,OAAOA,EACJ,MAAM,OAAO,EACb,IAAKtH,GAAMA,EAAE,KAAA,CAAM,EACnB,OAAQA,GAAMA,EAAE,OAAS,CAAC,CAC/B,CCtCA,MAAMyM,GAAuB,CAC3B,CAAE,IAAK,YAAa,MAAO,WAAA,EAC3B,CAAE,IAAK,WAAY,MAAO,UAAA,EAC1B,CAAE,IAAK,QAAS,MAAO,OAAA,EACvB,CAAE,IAAK,cAAe,MAAO,aAAA,EAC7B,CAAE,IAAK,WAAY,MAAO,UAAA,EAC1B,CAAE,IAAK,UAAW,MAAO,SAAA,EACzB,CAAE,IAAK,OAAQ,MAAO,MAAA,EACtB,CAAE,IAAK,SAAU,MAAO,QAAA,EACxB,CAAE,IAAK,aAAc,MAAO,aAAA,EAC5B,CAAE,IAAK,WAAY,MAAO,WAAA,EAC1B,CAAE,IAAK,cAAe,MAAO,cAAA,EAC7B,CAAE,IAAK,cAAe,MAAO,cAAA,EAC7B,CAAE,IAAK,SAAU,MAAO,QAAA,EACxB,CAAE,IAAK,QAAS,MAAO,cAAA,EACvB,CAAE,IAAK,aAAc,MAAO,YAAA,CAC9B,EAEMC,GAAqB,CACzB,CAAE,IAAK,YAAa,MAAO,WAAA,EAC3B,CAAE,IAAK,WAAY,MAAO,UAAA,EAC1B,CAAE,IAAK,OAAQ,MAAO,MAAA,EACtB,CAAE,IAAK,aAAc,MAAO,aAAA,EAC5B,CAAE,IAAK,YAAa,MAAO,YAAA,CAC7B,EA+CO,SAASC,GAAkBnF,EAAyB,CACzD,MAAMoF,EAAWpF,EAAM,UAAU,SAC3BqF,EAAWrF,EAAM,UAAU,SAC3BsF,EAAUtF,EAAM,UAAU,SAAW,KACrCuF,EAAQvF,EAAM,UAAU,OAAS,KACjCwF,EAASxF,EAAM,UAAU,QAAU,KACnCyF,EAAWzF,EAAM,UAAU,UAAY,KASvC0F,EAR+B,CACnC,WACA,WACA,UACA,QACA,SACA,UAAA,EAGC,IAAI,CAAClH,EAAKqF,KAAW,CACpB,IAAArF,EACA,QAASmH,GAAgBnH,EAAKwB,CAAK,EACnC,MAAO6D,CAAA,EACP,EACD,KAAK,CAAC9L,EAAGM,IACJN,EAAE,UAAYM,EAAE,QAAgBN,EAAE,QAAU,GAAK,EAC9CA,EAAE,MAAQM,EAAE,KACpB,EAEH,OAAOiI;AAAAA;AAAAA,QAEDoF,EAAiB,IAAKE,GACtBC,GAAeD,EAAS,IAAK5F,EAAO,CAClC,SAAAoF,EACA,SAAAC,EACA,QAAAC,EACA,MAAAC,EACA,OAAAC,EACA,SAAAC,CAAA,CACD,CAAA,CACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BASsBzF,EAAM,cAAgBuE,EAAUvE,EAAM,aAAa,EAAI,KAAK;AAAA;AAAA,QAEjFA,EAAM,UACJM;AAAAA,cACIN,EAAM,SAAS;AAAA,kBAEnBQ,CAAO;AAAA;AAAA,EAEfR,EAAM,SAAW,KAAK,UAAUA,EAAM,SAAU,KAAM,CAAC,EAAI,kBAAkB;AAAA;AAAA;AAAA,GAI/E,CAEA,SAAS8F,GAAexB,EAAoB,CAC1C,GAAI,CAACA,GAAMA,IAAO,EAAG,MAAO,MAC5B,MAAMG,EAAM,KAAK,MAAMH,EAAK,GAAI,EAChC,GAAIG,EAAM,GAAI,MAAO,GAAGA,CAAG,IAC3B,MAAMC,EAAM,KAAK,MAAMD,EAAM,EAAE,EAC/B,OAAIC,EAAM,GAAW,GAAGA,CAAG,IAEpB,GADI,KAAK,MAAMA,EAAM,EAAE,CAClB,GACd,CAUA,SAASiB,GAAgBnH,EAAkBwB,EAAyB,CAClE,MAAM+F,EAAW/F,EAAM,SACvB,GAAI,CAAC+F,EAAU,MAAO,GACtB,OAAQvH,EAAA,CACN,IAAK,WACH,OACEuH,EAAS,SAAS,YAClBA,EAAS,SAAS,QAClBA,EAAS,SAAS,QAEtB,IAAK,WACH,OAAOA,EAAS,SAAS,YAAcA,EAAS,SAAS,QAC3D,IAAK,UACH,MAAO,GAAQA,EAAS,SAAS,YAAcA,EAAS,SAAS,SACnE,IAAK,QACH,MAAO,GAAQA,EAAS,OAAO,YAAcA,EAAS,OAAO,SAC/D,IAAK,SACH,MAAO,GAAQA,EAAS,QAAQ,YAAcA,EAAS,QAAQ,SACjE,IAAK,WACH,MAAO,GAAQA,EAAS,UAAU,YAAcA,EAAS,UAAU,SACrE,QACE,MAAO,EAAA,CAEb,CAEA,SAASF,GACPrH,EACAwB,EACAgG,EAQA,CACA,OAAQxH,EAAA,CACN,IAAK,WAAY,CACf,MAAM4G,EAAWY,EAAK,SACtB,OAAO1F;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,sBAQS8E,GAAU,WAAa,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAInCA,GAAU,OAAS,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAI/BA,GAAU,QAAU,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAIhCA,GAAU,UAAY,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKtCA,GAAU,gBACRb,EAAUa,EAAS,eAAe,EAClC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAMPA,GAAU,cAAgBb,EAAUa,EAAS,aAAa,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAMnEA,GAAU,WAAa,KAAOU,GAAeV,EAAS,SAAS,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,YAK9EA,GAAU,UACR9E;AAAAA,kBACI8E,EAAS,SAAS;AAAA,sBAEtB5E,CAAO;AAAA;AAAA,YAETR,EAAM,gBACJM;AAAAA,kBACIN,EAAM,eAAe;AAAA,sBAEzBQ,CAAO;AAAA;AAAA,YAETR,EAAM,kBACJM;AAAAA,2BACaN,EAAM,iBAAiB;AAAA,sBAEpCQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKKR,EAAM,YAAY;AAAA,uBACrB,IAAMA,EAAM,gBAAgB,EAAK,CAAC;AAAA;AAAA,gBAEzCA,EAAM,aAAe,WAAa,SAAS;AAAA;AAAA;AAAA;AAAA,0BAIjCA,EAAM,YAAY;AAAA,uBACrB,IAAMA,EAAM,gBAAgB,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAM9BA,EAAM,YAAY;AAAA,uBACrB,IAAMA,EAAM,eAAA,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAMzBA,EAAM,YAAY;AAAA,uBACrB,IAAMA,EAAM,iBAAA,CAAkB;AAAA;AAAA;AAAA;AAAA,yCAIZ,IAAMA,EAAM,UAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,OAMhE,CACA,IAAK,WAAY,CACf,MAAMqF,EAAWW,EAAK,SACtB,OAAO1F;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,sBAQS+E,GAAU,WAAa,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAInCA,GAAU,QAAU,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAIhCA,GAAU,MAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,sBAIvBA,GAAU,YAAcd,EAAUc,EAAS,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,sBAI/DA,GAAU,YAAcd,EAAUc,EAAS,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,YAIzEA,GAAU,UACR/E;AAAAA,kBACI+E,EAAS,SAAS;AAAA,sBAEtB7E,CAAO;AAAA;AAAA,YAET6E,GAAU,MACR/E;AAAAA,wBACU+E,EAAS,MAAM,GAAK,KAAO,QAAQ;AAAA,kBACzCA,EAAS,MAAM,QAAU,EAAE;AAAA,kBAC3BA,EAAS,MAAM,OAAS,EAAE;AAAA,sBAE9B7E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOIR,EAAM,aAAa,KAAK;AAAA,4BACrBA,EAAM,mBAAmB;AAAA,yBAC3B3I,GACR2I,EAAM,iBAAiB,CACrB,MAAQ3I,EAAE,OAA4B,KAAA,CACvC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMK2I,EAAM,aAAa,eAAiB,MAAQ,IAAI;AAAA,0BAC9C3I,GACT2I,EAAM,iBAAiB,CACrB,eAAiB3I,EAAE,OAA6B,QAAU,KAAA,CAC3D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,aAAa,SAAS;AAAA,yBAC3B3I,GACR2I,EAAM,iBAAiB,CACrB,UAAY3I,EAAE,OAA4B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,KAAK;AAAA,yBACvB3I,GACR2I,EAAM,iBAAiB,CACrB,MAAQ3I,EAAE,OAA4B,KAAA,CACvC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,UAAU;AAAA,yBAC5B3I,GACR2I,EAAM,iBAAiB,CACrB,WAAa3I,EAAE,OAA4B,KAAA,CAC5C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,aAAa;AAAA,yBAC/B3I,GACR2I,EAAM,iBAAiB,CACrB,cAAgB3I,EAAE,OAA4B,KAAA,CAC/C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,WAAW;AAAA,yBAC7B3I,GACR2I,EAAM,iBAAiB,CACrB,YAAc3I,EAAE,OAA4B,KAAA,CAC7C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMR2I,EAAM,oBACJM;AAAAA;AAAAA,sBAGAE,CAAO;AAAA;AAAA,YAETR,EAAM,eACJM;AAAAA,kBACIN,EAAM,cAAc;AAAA,sBAExBQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKKR,EAAM,cAAc;AAAA,uBACvB,IAAMA,EAAM,eAAA,CAAgB;AAAA;AAAA,gBAEnCA,EAAM,eAAiB,UAAY,MAAM;AAAA;AAAA,yCAEhB,IAAMA,EAAM,UAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,OAMhE,CACA,IAAK,UAAW,CACd,MAAMsF,EAAUU,EAAK,QACfC,EAAUX,GAAS,OAAO,KAAK,SACrC,OAAOhF;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,sBAQSgF,GAAS,WAAa,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAIlCA,GAAS,QAAU,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAI/BW,EAAU,IAAIA,CAAO,GAAK,KAAK;AAAA;AAAA;AAAA;AAAA,sBAI/BX,GAAS,YAAcf,EAAUe,EAAQ,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,sBAI7DA,GAAS,YAAcf,EAAUe,EAAQ,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,YAIvEA,GAAS,UACPhF;AAAAA,kBACIgF,EAAQ,SAAS;AAAA,sBAErB9E,CAAO;AAAA;AAAA,YAET8E,GAAS,MACPhF;AAAAA,wBACUgF,EAAQ,MAAM,GAAK,KAAO,QAAQ;AAAA,kBACxCA,EAAQ,MAAM,QAAU,EAAE;AAAA,kBAC1BA,EAAQ,MAAM,OAAS,EAAE;AAAA,sBAE7B9E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMIR,EAAM,YAAY,QAAU,MAAQ,IAAI;AAAA,0BACtC3I,GACT2I,EAAM,gBAAgB,CACpB,QAAU3I,EAAE,OAA6B,QAAU,KAAA,CACpD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAUK2I,EAAM,YAAY,KAAK;AAAA,4BACpBA,EAAM,kBAAkB;AAAA,yBAC1B3I,GACR2I,EAAM,gBAAgB,CACpB,MAAQ3I,EAAE,OAA4B,KAAA,CACvC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMK2I,EAAM,YAAY,SAAS;AAAA,yBAC1B3I,GACR2I,EAAM,gBAAgB,CACpB,UAAY3I,EAAE,OAA4B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,YAAY,UAAY,MAAQ,IAAI;AAAA,0BACxC3I,GACT2I,EAAM,gBAAgB,CACpB,UAAY3I,EAAE,OAA6B,QAAU,KAAA,CACtD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,YAAY,aAAe,MAAQ,IAAI;AAAA,0BAC3C3I,GACT2I,EAAM,gBAAgB,CACpB,aAAe3I,EAAE,OAA6B,QAAU,KAAA,CACzD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,YAAY,aAAa;AAAA,yBAC9B3I,GACR2I,EAAM,gBAAgB,CACpB,cAAgB3I,EAAE,OAA4B,KAAA,CAC/C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,YAAY,UAAU;AAAA,yBAC3B3I,GACR2I,EAAM,gBAAgB,CACpB,WAAa3I,EAAE,OAA4B,KAAA,CAC5C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,YAAY,YAAY;AAAA,yBAC7B3I,GACR2I,EAAM,gBAAgB,CACpB,aAAe3I,EAAE,OAA4B,KAAA,CAC9C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,YAAY,cAAc;AAAA,yBAC/B3I,GACR2I,EAAM,gBAAgB,CACpB,eAAiB3I,EAAE,OAA4B,KAAA,CAChD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,YAAY,WAAW;AAAA,0BAC3B3I,GACT2I,EAAM,gBAAgB,CACpB,YAAc3I,EAAE,OAA6B,KAAA,CAI9C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAcF2I,EAAM,YAAY,OAAO,IACzB,CAACkG,EAAOC,IAAe7F;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,qCAOJ4F,EAAM,GAAG;AAAA,qCACR7O,GAAa,CACrB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACzCnE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,IAAM9O,EAAE,OAA4B,KAAA,EAEtC2I,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAMQqK,EAAM,IAAI;AAAA,qCACT7O,GAAa,CACrB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACzCnE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,KAAO9O,EAAE,OAA4B,KAAA,EAEvC2I,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAMQqK,EAAM,eAAiB,MAAQ,IAAI;AAAA,sCACjC7O,GAAa,CACtB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACzCnE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,eACG9O,EAAE,OAA6B,QAAU,KAAA,EAE9C2I,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCASQqK,EAAM,qBAAqB;AAAA,sCACzB7O,GAAa,CACtB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACzCnE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,sBAAwB9O,EAAE,OACvB,KAAA,EAEL2I,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAWQqK,EAAM,KAAK;AAAA,qCACV7O,GAAa,CACrB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACzCnE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,MAAQ9O,EAAE,OAA4B,KAAA,EAExC2I,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKHqK,EAAM,SAAS,OACb5F;AAAAA;AAAAA,kCAEM4F,EAAM,SAAS,IACf,CAACE,EAASC,IAAiB/F;AAAAA;AAAAA;AAAAA;AAAAA,iDAIZ8F,EAAQ,GAAG;AAAA,iDACV/O,GAAa,CACrB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACnCsG,EAAW,CACf,GAAIzK,EAAKsK,CAAU,EAAE,UAAY,CAAA,CAAC,EAEpCG,EAASD,CAAY,EAAI,CACvB,GAAGC,EAASD,CAAY,EACxB,IAAMhP,EAAE,OAA4B,KAAA,EAEtCwE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,SAAAG,CAAA,EAEFtG,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAMQuK,EAAQ,MAAQ,MAAQ,IAAI;AAAA,kDAC1B/O,GAAa,CACtB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACnCsG,EAAW,CACf,GAAIzK,EAAKsK,CAAU,EAAE,UAAY,CAAA,CAAC,EAEpCG,EAASD,CAAY,EAAI,CACvB,GAAGC,EAASD,CAAY,EACxB,MACGhP,EAAE,OAA6B,QAChC,KAAA,EAEJwE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,SAAAG,CAAA,EAEFtG,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDASQuK,EAAQ,eAAiB,MAAQ,IAAI;AAAA,kDACnC/O,GAAa,CACtB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACnCsG,EAAW,CACf,GAAIzK,EAAKsK,CAAU,EAAE,UAAY,CAAA,CAAC,EAEpCG,EAASD,CAAY,EAAI,CACvB,GAAGC,EAASD,CAAY,EACxB,eACGhP,EAAE,OAA6B,QAChC,KAAA,EAEJwE,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,SAAAG,CAAA,EAEFtG,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAUQ,IAAM,CACb,MAAMA,EAAO,CACX,GAAGmE,EAAM,YAAY,MAAA,EAEjBsG,EAAW,CACf,GAAIzK,EAAKsK,CAAU,EAAE,UAAY,CAAA,CAAC,EAEpCG,EAAS,OAAOD,EAAc,CAAC,EAC/BxK,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,SAAAG,CAAA,EAEFtG,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAA,CAMR;AAAA;AAAA,8BAGL2E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAMA,IAAM,CACb,MAAM3E,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACnCsG,EAAW,CACf,GAAIzK,EAAKsK,CAAU,EAAE,UAAY,CAAA,EACjC,CAAE,IAAK,GAAI,MAAO,GAAM,eAAgB,EAAA,CAAM,EAEhDtK,EAAKsK,CAAU,EAAI,CACjB,GAAGtK,EAAKsK,CAAU,EAClB,SAAAG,CAAA,EAEFtG,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAMQ,IAAM,CACb,MAAMA,EAAO,CAAC,GAAGmE,EAAM,YAAY,MAAM,EACzCnE,EAAK,OAAOsK,EAAY,CAAC,EACzBnG,EAAM,gBAAgB,CAAE,OAAQnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,CAOV;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKQ,IACPmE,EAAM,gBAAgB,CACpB,OAAQ,CACN,GAAGA,EAAM,YAAY,OACrB,CACE,IAAK,GACL,KAAM,GACN,eAAgB,GAChB,sBAAuB,MACvB,MAAO,GACP,SAAU,CAAA,CAAC,CACb,CACF,CACD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAQKA,EAAM,YAAY,aAAe,MAAQ,IAAI;AAAA,0BAC3C3I,GACT2I,EAAM,gBAAgB,CACpB,aAAe3I,EAAE,OAA6B,QAAU,KAAA,CACzD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,YAAY,SAAS;AAAA,yBAC1B3I,GACR2I,EAAM,gBAAgB,CACpB,UAAY3I,EAAE,OAA4B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,YAAY,kBAAkB;AAAA,yBACnC3I,GACR2I,EAAM,gBAAgB,CACpB,mBAAqB3I,EAAE,OAA4B,KAAA,CACpD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,YAAY,eAAiB,MAAQ,IAAI;AAAA,0BAC7C3I,GACT2I,EAAM,gBAAgB,CACpB,eAAiB3I,EAAE,OAA6B,QAAU,KAAA,CAC3D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAUN4N,GAAqB,IACpBhG,GAAWqB;AAAAA,wBACFrB,EAAO,KAAK;AAAA;AAAA,2BAETe,EAAM,YAAY,QAAQf,EAAO,GAAG,EAAI,MAAQ,IAAI;AAAA,4BAClD5H,GACT2I,EAAM,gBAAgB,CACpB,QAAS,CACP,GAAGA,EAAM,YAAY,QACrB,CAACf,EAAO,GAAG,EAAI5H,EAAE,OAA6B,QAAU,KAAA,CAC1D,CACD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,CAMT;AAAA;AAAA;AAAA,YAGD2I,EAAM,mBACJM;AAAAA;AAAAA,sBAGAE,CAAO;AAAA;AAAA,YAETR,EAAM,cACJM;AAAAA,kBACIN,EAAM,aAAa;AAAA,sBAEvBQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKKR,EAAM,aAAa;AAAA,uBACtB,IAAMA,EAAM,cAAA,CAAe;AAAA;AAAA,gBAElCA,EAAM,cAAgB,UAAY,MAAM;AAAA;AAAA,yCAEf,IAAMA,EAAM,UAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,OAMhE,CACA,IAAK,QAAS,CACZ,MAAMuF,EAAQS,EAAK,MACbC,EAAUV,GAAO,OAAO,KAAK,KAC7BgB,EAAWhB,GAAO,OAAO,MAAM,KACrC,OAAOjF;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,sBAQSiF,GAAO,WAAa,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAIhCA,GAAO,QAAU,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAI7BU,GAAoB,KAAK;AAAA;AAAA;AAAA;AAAA,sBAIzBM,GAAsB,KAAK;AAAA;AAAA;AAAA;AAAA,sBAI3BhB,GAAO,YAAchB,EAAUgB,EAAM,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,sBAIzDA,GAAO,YAAchB,EAAUgB,EAAM,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,YAInEA,GAAO,UACLjF;AAAAA,kBACIiF,EAAM,SAAS;AAAA,sBAEnB/E,CAAO;AAAA;AAAA,YAET+E,GAAO,MACLjF;AAAAA,wBACUiF,EAAM,MAAM,GAAK,KAAO,QAAQ;AAAA,kBACtCA,EAAM,MAAM,QAAU,EAAE;AAAA,kBACxBA,EAAM,MAAM,OAAS,EAAE;AAAA,sBAE3B/E,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMIR,EAAM,UAAU,QAAU,MAAQ,IAAI;AAAA,0BACpC3I,GACT2I,EAAM,cAAc,CAClB,QAAU3I,EAAE,OAA6B,QAAU,KAAA,CACpD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAUK2I,EAAM,UAAU,QAAQ;AAAA,4BACrBA,EAAM,gBAAgB;AAAA,yBACxB3I,GACR2I,EAAM,cAAc,CAClB,SAAW3I,EAAE,OAA4B,KAAA,CAC1C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,UAAU,QAAQ;AAAA,4BACrBA,EAAM,mBAAmB;AAAA,yBAC3B3I,GACR2I,EAAM,cAAc,CAClB,SAAW3I,EAAE,OAA4B,KAAA,CAC1C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMK2I,EAAM,UAAU,UAAY,MAAQ,IAAI;AAAA,0BACtC3I,GACT2I,EAAM,cAAc,CAClB,UAAY3I,EAAE,OAA6B,QAAU,KAAA,CACtD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,UAAU,SAAS;AAAA,yBACxB3I,GACR2I,EAAM,cAAc,CAClB,UAAY3I,EAAE,OAA4B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,UAAU,aAAe,MAAQ,IAAI;AAAA,0BACzC3I,GACT2I,EAAM,cAAc,CAClB,aAAe3I,EAAE,OAA6B,QAAU,KAAA,CACzD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,UAAU,aAAa;AAAA,yBAC5B3I,GACR2I,EAAM,cAAc,CAClB,cAAgB3I,EAAE,OAA4B,KAAA,CAC/C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,UAAU,qBAAqB;AAAA,0BACnC3I,GACT2I,EAAM,cAAc,CAClB,sBAAwB3I,EAAE,OACvB,KAAA,CACJ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAWK2I,EAAM,UAAU,iBAAiB;AAAA,yBAChC3I,GACR2I,EAAM,cAAc,CAClB,kBAAoB3I,EAAE,OAA4B,KAAA,CACnD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,UAAU,cAAc;AAAA,yBAC7B3I,GACR2I,EAAM,cAAc,CAClB,eAAiB3I,EAAE,OAA4B,KAAA,CAChD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,UAAU,UAAU;AAAA,yBACzB3I,GACR2I,EAAM,cAAc,CAClB,WAAa3I,EAAE,OAA4B,KAAA,CAC5C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAWK2I,EAAM,UAAU,aAAe,MAAQ,IAAI;AAAA,0BACzC3I,GACT2I,EAAM,cAAc,CAClB,aAAe3I,EAAE,OAA6B,QAAU,KAAA,CACzD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,UAAU,SAAS;AAAA,yBACxB3I,GACR2I,EAAM,cAAc,CAClB,UAAY3I,EAAE,OAA4B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,UAAU,kBAAkB;AAAA,yBACjC3I,GACR2I,EAAM,cAAc,CAClB,mBAAqB3I,EAAE,OAA4B,KAAA,CACpD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,UAAU,eAAiB,MAAQ,IAAI;AAAA,0BAC3C3I,GACT2I,EAAM,cAAc,CAClB,eAAiB3I,EAAE,OAA6B,QAAU,KAAA,CAC3D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAaN2I,EAAM,UAAU,SAAS,IACzB,CAACoG,EAASC,IAAiB/F;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,mCAON8F,EAAQ,GAAG;AAAA,mCACV/O,GAAa,CACrB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,UAAU,QAAQ,EACzCnE,EAAKwK,CAAY,EAAI,CACnB,GAAGxK,EAAKwK,CAAY,EACpB,IAAMhP,EAAE,OAA4B,KAAA,EAEtC2I,EAAM,cAAc,CAAE,SAAUnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAMQuK,EAAQ,MAAQ,MAAQ,IAAI;AAAA,oCAC1B/O,GAAa,CACtB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,UAAU,QAAQ,EACzCnE,EAAKwK,CAAY,EAAI,CACnB,GAAGxK,EAAKwK,CAAY,EACpB,MACGhP,EAAE,OAA6B,QAAU,KAAA,EAE9C2I,EAAM,cAAc,CAAE,SAAUnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCASQuK,EAAQ,eAAiB,MAAQ,IAAI;AAAA,oCACnC/O,GAAa,CACtB,MAAMwE,EAAO,CAAC,GAAGmE,EAAM,UAAU,QAAQ,EACzCnE,EAAKwK,CAAY,EAAI,CACnB,GAAGxK,EAAKwK,CAAY,EACpB,eACGhP,EAAE,OAA6B,QAAU,KAAA,EAE9C2I,EAAM,cAAc,CAAE,SAAUnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAUQ,IAAM,CACb,MAAMA,EAAO,CAAC,GAAGmE,EAAM,UAAU,QAAQ,EACzCnE,EAAK,OAAOwK,EAAc,CAAC,EAC3BrG,EAAM,cAAc,CAAE,SAAUnE,CAAA,CAAM,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,CASd;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKQ,IACPmE,EAAM,cAAc,CAClB,SAAU,CACR,GAAGA,EAAM,UAAU,SACnB,CAAE,IAAK,GAAI,MAAO,GAAM,eAAgB,EAAA,CAAM,CAChD,CACD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAOFkF,GAAmB,IAClBjG,GAAWqB;AAAAA,wBACFrB,EAAO,KAAK;AAAA;AAAA,2BAETe,EAAM,UAAU,QAAQf,EAAO,GAAG,EAAI,MAAQ,IAAI;AAAA,4BAChD5H,GACT2I,EAAM,cAAc,CAClB,QAAS,CACP,GAAGA,EAAM,UAAU,QACnB,CAACf,EAAO,GAAG,EAAI5H,EAAE,OAA6B,QAAU,KAAA,CAC1D,CACD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,CAMT;AAAA;AAAA;AAAA,YAGD2I,EAAM,kBAAoBA,EAAM,oBAC9BM;AAAAA,kBACIN,EAAM,iBAAmB,mBAAqB,EAAE;AAAA,kBAChDA,EAAM,oBAAsB,mBAAqB,EAAE;AAAA;AAAA,sBAGvDQ,CAAO;AAAA;AAAA,YAETR,EAAM,YACJM;AAAAA,kBACIN,EAAM,WAAW;AAAA,sBAErBQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKKR,EAAM,WAAW;AAAA,uBACpB,IAAMA,EAAM,YAAA,CAAa;AAAA;AAAA,gBAEhCA,EAAM,YAAc,UAAY,MAAM;AAAA;AAAA,yCAEb,IAAMA,EAAM,UAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,OAMhE,CACA,IAAK,SAAU,CACb,MAAMwF,EAASQ,EAAK,OACpB,OAAO1F;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,sBAQSkF,GAAQ,WAAa,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAIjCA,GAAQ,QAAU,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAI9BA,GAAQ,SAAW,KAAK;AAAA;AAAA;AAAA;AAAA,sBAIxBA,GAAQ,YAAcjB,EAAUiB,EAAO,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,sBAI3DA,GAAQ,YAAcjB,EAAUiB,EAAO,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA,YAIrEA,GAAQ,UACNlF;AAAAA,kBACIkF,EAAO,SAAS;AAAA,sBAEpBhF,CAAO;AAAA;AAAA,YAETgF,GAAQ,MACNlF;AAAAA,wBACUkF,EAAO,MAAM,GAAK,KAAO,QAAQ;AAAA,kBACvCA,EAAO,MAAM,QAAU,EAAE;AAAA,kBACzBA,EAAO,MAAM,OAAS,EAAE;AAAA,sBAE5BhF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMIR,EAAM,WAAW,QAAU,MAAQ,IAAI;AAAA,0BACrC3I,GACT2I,EAAM,eAAe,CACnB,QAAU3I,EAAE,OAA6B,QAAU,KAAA,CACpD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,WAAW,OAAO;AAAA,yBACvB3I,GACR2I,EAAM,eAAe,CACnB,QAAU3I,EAAE,OAA4B,KAAA,CACzC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,WAAW,OAAO;AAAA,yBACvB3I,GACR2I,EAAM,eAAe,CACnB,QAAU3I,EAAE,OAA4B,KAAA,CACzC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,WAAW,QAAQ;AAAA,yBACxB3I,GACR2I,EAAM,eAAe,CACnB,SAAW3I,EAAE,OAA4B,KAAA,CAC1C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,WAAW,QAAQ;AAAA,yBACxB3I,GACR2I,EAAM,eAAe,CACnB,SAAW3I,EAAE,OAA4B,KAAA,CAC1C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,WAAW,OAAO;AAAA,yBACvB3I,GACR2I,EAAM,eAAe,CACnB,QAAU3I,EAAE,OAA4B,KAAA,CACzC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,WAAW,UAAY,MAAQ,IAAI;AAAA,0BACvC3I,GACT2I,EAAM,eAAe,CACnB,UAAY3I,EAAE,OAA6B,QAAU,KAAA,CACtD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,WAAW,WAAW;AAAA,0BAC1B3I,GACT2I,EAAM,eAAe,CACnB,YAAc3I,EAAE,OAA6B,KAAA,CAI9C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAUK2I,EAAM,WAAW,kBAAoB,MAAQ,IAAI;AAAA,0BAC/C3I,GACT2I,EAAM,eAAe,CACnB,kBACG3I,EAAE,OAA6B,QAAU,KAAA,CAC7C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,WAAW,cAAgB,MAAQ,IAAI;AAAA,0BAC3C3I,GACT2I,EAAM,eAAe,CACnB,cAAgB3I,EAAE,OAA6B,QAAU,KAAA,CAC1D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,WAAW,iBAAmB,MAAQ,IAAI;AAAA,0BAC9C3I,GACT2I,EAAM,eAAe,CACnB,iBACG3I,EAAE,OAA6B,QAAU,KAAA,CAC7C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,WAAW,SAAS;AAAA,yBACzB3I,GACR2I,EAAM,eAAe,CACnB,UAAY3I,EAAE,OAA4B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,WAAW,UAAU;AAAA,yBAC1B3I,GACR2I,EAAM,eAAe,CACnB,WAAa3I,EAAE,OAA4B,KAAA,CAC5C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMR2I,EAAM,aACJM;AAAAA,kBACIN,EAAM,YAAY;AAAA,sBAEtBQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKKR,EAAM,YAAY;AAAA,uBACrB,IAAMA,EAAM,aAAA,CAAc;AAAA;AAAA,gBAEjCA,EAAM,aAAe,UAAY,MAAM;AAAA;AAAA,yCAEd,IAAMA,EAAM,UAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,OAMhE,CACA,IAAK,WAAY,CACf,MAAMyF,EAAWO,EAAK,SACtB,OAAO1F;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,sBAQSmF,GAAU,WAAa,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAInCA,GAAU,QAAU,MAAQ,IAAI;AAAA;AAAA;AAAA;AAAA,sBAIhCA,GAAU,SAAW,KAAK;AAAA;AAAA;AAAA;AAAA,sBAI1BA,GAAU,QAAU,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,kBAK7BA,GAAU,YAAclB,EAAUkB,EAAS,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAM/DA,GAAU,YAAclB,EAAUkB,EAAS,WAAW,EAAI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,YAKrEA,GAAU,UACRnF;AAAAA,kBACImF,EAAS,SAAS;AAAA,sBAEtBjF,CAAO;AAAA;AAAA,YAETiF,GAAU,OAAS,CAACA,EAAS,MAAM,GACjCnF;AAAAA,iCACmBmF,EAAS,MAAM,OAAS,eAAe;AAAA,sBAE1DjF,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMIR,EAAM,aAAa,QAAU,MAAQ,IAAI;AAAA,0BACvC3I,GACT2I,EAAM,iBAAiB,CACrB,QAAU3I,EAAE,OAA6B,QAAU,KAAA,CACpD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,aAAa,OAAO;AAAA,yBACzB3I,GACR2I,EAAM,iBAAiB,CACrB,QAAU3I,EAAE,OAA4B,KAAA,CACzC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,MAAM;AAAA,yBACxB3I,GACR2I,EAAM,iBAAiB,CACrB,OAAS3I,EAAE,OAA4B,KAAA,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,OAAO;AAAA,0BACxB3I,GACT2I,EAAM,iBAAiB,CACrB,QAAU3I,EAAE,OAA6B,KAAA,CAI1C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAUK2I,EAAM,aAAa,MAAM;AAAA,yBACxB3I,GACR2I,EAAM,iBAAiB,CACrB,OAAS3I,EAAE,OAA4B,KAAA,CACxC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,SAAS;AAAA,yBAC3B3I,GACR2I,EAAM,iBAAiB,CACrB,UAAY3I,EAAE,OAA4B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOK2I,EAAM,aAAa,mBAAqB,MAAQ,IAAI;AAAA,0BAClD3I,GACT2I,EAAM,iBAAiB,CACrB,mBACG3I,EAAE,OAA6B,QAAU,KAAA,CAC7C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBASK2I,EAAM,aAAa,UAAU;AAAA,yBAC5B3I,GACR2I,EAAM,iBAAiB,CACrB,WAAa3I,EAAE,OAA4B,KAAA,CAC5C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMR2I,EAAM,eACJM;AAAAA,kBACIN,EAAM,cAAc;AAAA,sBAExBQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKKR,EAAM,cAAc;AAAA,uBACvB,IAAMA,EAAM,eAAA,CAAgB;AAAA;AAAA,gBAEnCA,EAAM,eAAiB,UAAY,MAAM;AAAA;AAAA,yCAEhB,IAAMA,EAAM,UAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,OAMhE,CACA,QACE,OAAOQ,CAAA,CAEb,CCnuDO,SAASgG,GAAsBjG,EAA8B,CAClE,MAAMkG,EAAOlG,EAAM,MAAQ,UACrBmG,EAAKnG,EAAM,GAAK,IAAIA,EAAM,EAAE,IAAM,GAClCoG,EAAOpG,EAAM,MAAQ,GACrBqG,EAAUrG,EAAM,SAAW,GACjC,MAAO,GAAGkG,CAAI,IAAIC,CAAE,IAAIC,CAAI,IAAIC,CAAO,GAAG,KAAA,CAC5C,CAEO,SAASC,GAAkBtG,EAA8B,CAC9D,MAAMuG,EAAKvG,EAAM,IAAM,KACvB,OAAOuG,EAAKvC,EAAUuC,CAAE,EAAI,KAC9B,CAEO,SAASC,GAAczC,EAAoB,CAChD,OAAKA,EACE,GAAGD,EAASC,CAAE,CAAC,KAAKC,EAAUD,CAAE,CAAC,IADxB,KAElB,CAEO,SAAS0C,GAAoBC,EAAwB,CAC1D,GAAIA,EAAI,aAAe,KAAM,MAAO,MACpC,MAAMC,EAAQD,EAAI,aAAe,EAC3BE,EAAMF,EAAI,eAAiB,EACjC,OAAOE,EAAM,GAAGD,CAAK,MAAMC,CAAG,GAAK,OAAOD,CAAK,CACjD,CAEO,SAASE,GAAmBC,EAA0B,CAC3D,GAAIA,GAAW,KAAM,MAAO,GAC5B,GAAI,CACF,OAAO,KAAK,UAAUA,EAAS,KAAM,CAAC,CACxC,MAAQ,CACN,OAAO,OAAOA,CAAO,CACvB,CACF,CAEO,SAASC,GAAgBC,EAAc,CAC5C,MAAMC,EAAQD,EAAI,OAAS,CAAA,EACrB1L,EAAO2L,EAAM,YAAcnD,EAASmD,EAAM,WAAW,EAAI,MACzDC,EAAOD,EAAM,YAAcnD,EAASmD,EAAM,WAAW,EAAI,MAE/D,MAAO,GADQA,EAAM,YAAc,KACnB,WAAW3L,CAAI,WAAW4L,CAAI,EAChD,CAEO,SAASC,GAAmBH,EAAc,CAC/C,MAAMjQ,EAAIiQ,EAAI,SACd,OAAIjQ,EAAE,OAAS,KAAa,MAAM+M,EAAS/M,EAAE,IAAI,CAAC,GAC9CA,EAAE,OAAS,QAAgB,SAASsN,GAAiBtN,EAAE,OAAO,CAAC,GAC5D,QAAQA,EAAE,IAAI,GAAGA,EAAE,GAAK,KAAKA,EAAE,EAAE,IAAM,EAAE,EAClD,CAEO,SAASqQ,GAAkBJ,EAAc,CAC9C,MAAMtP,EAAIsP,EAAI,QACd,OAAItP,EAAE,OAAS,cAAsB,WAAWA,EAAE,IAAI,GAC/C,UAAUA,EAAE,OAAO,EAC5B,CC1BO,SAAS2P,GAAW5H,EAAkB,CAC3C,OAAOM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,gBASON,EAAM,OACJA,EAAM,OAAO,QACX,MACA,KACF,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,sCAKeA,EAAM,QAAQ,UAAY,KAAK;AAAA;AAAA;AAAA;AAAA,sCAI/B+G,GAAc/G,EAAM,QAAQ,cAAgB,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,0CAI7CA,EAAM,OAAO,WAAWA,EAAM,SAAS;AAAA,cACnEA,EAAM,QAAU,cAAgB,SAAS;AAAA;AAAA,YAE3CA,EAAM,MAAQM,wBAA2BN,EAAM,KAAK,UAAYQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAW5DR,EAAM,KAAK,IAAI;AAAA,uBACd3I,GACR2I,EAAM,aAAa,CAAE,KAAO3I,EAAE,OAA4B,MAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAM3D2I,EAAM,KAAK,WAAW;AAAA,uBACrB3I,GACR2I,EAAM,aAAa,CAAE,YAAc3I,EAAE,OAA4B,MAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOhE2I,EAAM,KAAK,OAAO;AAAA,wBAClB3I,GACT2I,EAAM,aAAa,CAAE,QAAU3I,EAAE,OAA4B,QAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMhE2I,EAAM,KAAK,YAAY;AAAA,wBACrB3I,GACT2I,EAAM,aAAa,CACjB,aAAe3I,EAAE,OAA6B,KAAA,CAC/C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAQRwQ,GAAqB7H,CAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKdA,EAAM,KAAK,aAAa;AAAA,wBACtB3I,GACT2I,EAAM,aAAa,CACjB,cAAgB3I,EAAE,OAA6B,KAAA,CAChD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBASK2I,EAAM,KAAK,QAAQ;AAAA,wBACjB3I,GACT2I,EAAM,aAAa,CACjB,SAAW3I,EAAE,OAA6B,KAAA,CAC3C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBASK2I,EAAM,KAAK,WAAW;AAAA,wBACpB3I,GACT2I,EAAM,aAAa,CACjB,YAAc3I,EAAE,OAA6B,KAAA,CAC9C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAQA2I,EAAM,KAAK,cAAgB,cAAgB,cAAgB,eAAe;AAAA;AAAA,qBAEvEA,EAAM,KAAK,WAAW;AAAA,qBACrB3I,GACR2I,EAAM,aAAa,CACjB,YAAc3I,EAAE,OAA+B,KAAA,CAChD,CAAC;AAAA;AAAA;AAAA;AAAA,UAIN2I,EAAM,KAAK,cAAgB,YACzBM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,+BAMmBN,EAAM,KAAK,OAAO;AAAA,8BAClB3I,GACT2I,EAAM,aAAa,CACjB,QAAU3I,EAAE,OAA4B,OAAA,CACzC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAMK2I,EAAM,KAAK,OAAO;AAAA,8BAChB3I,GACT2I,EAAM,aAAa,CACjB,QAAU3I,EAAE,OAA6B,KAAA,CAC1C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAUK2I,EAAM,KAAK,EAAE;AAAA,6BACZ3I,GACR2I,EAAM,aAAa,CAAE,GAAK3I,EAAE,OAA4B,MAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAOzD2I,EAAM,KAAK,cAAc;AAAA,6BACxB3I,GACR2I,EAAM,aAAa,CACjB,eAAiB3I,EAAE,OAA4B,KAAA,CAChD,CAAC;AAAA;AAAA;AAAA,kBAGN2I,EAAM,KAAK,gBAAkB,WAC3BM;AAAAA;AAAAA;AAAAA;AAAAA,mCAIeN,EAAM,KAAK,gBAAgB;AAAA,mCAC1B3I,GACR2I,EAAM,aAAa,CACjB,iBAAmB3I,EAAE,OAA4B,KAAA,CAClD,CAAC;AAAA;AAAA;AAAA,sBAIVmJ,CAAO;AAAA;AAAA,cAGfA,CAAO;AAAA;AAAA,kDAE+BR,EAAM,IAAI,WAAWA,EAAM,KAAK;AAAA,cACpEA,EAAM,KAAO,UAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASxCA,EAAM,KAAK,SAAW,EACpBM,mEACAA;AAAAA;AAAAA,gBAEMN,EAAM,KAAK,IAAKuH,GAAQO,GAAUP,EAAKvH,CAAK,CAAC,CAAC;AAAA;AAAA,WAEnD;AAAA;AAAA;AAAA;AAAA;AAAA,8CAKmCA,EAAM,WAAa,gBAAgB;AAAA,QACzEA,EAAM,KAAK,SAAW,EACpBM,mEACAA;AAAAA;AAAAA,gBAEMN,EAAM,KAAK,IAAKO,GAAUwH,GAAUxH,CAAK,CAAC,CAAC;AAAA;AAAA,WAEhD;AAAA;AAAA,GAGX,CAEA,SAASsH,GAAqB7H,EAAkB,CAC9C,MAAMgI,EAAOhI,EAAM,KACnB,OAAIgI,EAAK,eAAiB,KACjB1H;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,mBAKQ0H,EAAK,UAAU;AAAA,mBACd3Q,GACR2I,EAAM,aAAa,CACjB,WAAa3I,EAAE,OAA4B,KAAA,CAC5C,CAAC;AAAA;AAAA;AAAA,MAKR2Q,EAAK,eAAiB,QACjB1H;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,qBAKU0H,EAAK,WAAW;AAAA,qBACf3Q,GACR2I,EAAM,aAAa,CACjB,YAAc3I,EAAE,OAA4B,KAAA,CAC7C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAMK2Q,EAAK,SAAS;AAAA,sBACZ3Q,GACT2I,EAAM,aAAa,CACjB,UAAY3I,EAAE,OAA6B,KAAA,CAC5C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUPiJ;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,mBAKU0H,EAAK,QAAQ;AAAA,mBACZ3Q,GACR2I,EAAM,aAAa,CAAE,SAAW3I,EAAE,OAA4B,MAAO,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAM/D2Q,EAAK,MAAM;AAAA,mBACV3Q,GACR2I,EAAM,aAAa,CAAE,OAAS3I,EAAE,OAA4B,MAAO,CAAC;AAAA;AAAA;AAAA;AAAA,GAKhF,CAEA,SAASyQ,GAAUP,EAAcvH,EAAkB,CACjD,OAAOM;AAAAA;AAAAA;AAAAA,kCAGyBiH,EAAI,IAAI;AAAA,gCACVG,GAAmBH,CAAG,CAAC;AAAA,6BAC1BI,GAAkBJ,CAAG,CAAC;AAAA;AAAA,+BAEpBA,EAAI,QAAU,UAAY,UAAU;AAAA,+BACpCA,EAAI,aAAa;AAAA,+BACjBA,EAAI,QAAQ;AAAA;AAAA;AAAA;AAAA,eAI5BD,GAAgBC,CAAG,CAAC;AAAA;AAAA;AAAA;AAAA,wBAIXvH,EAAM,IAAI;AAAA,qBACb,IAAMA,EAAM,SAASuH,EAAK,CAACA,EAAI,OAAO,CAAC;AAAA;AAAA,cAE9CA,EAAI,QAAU,UAAY,QAAQ;AAAA;AAAA,0CAENvH,EAAM,IAAI,WAAW,IAAMA,EAAM,MAAMuH,CAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,wBAK7DvH,EAAM,IAAI;AAAA,qBACb,IAAMA,EAAM,WAAWuH,EAAI,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAM3BvH,EAAM,IAAI;AAAA,qBACb,IAAMA,EAAM,SAASuH,CAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQ9C,CAEA,SAASQ,GAAUxH,EAAwB,CACzC,OAAOD;AAAAA;AAAAA;AAAAA,kCAGyBC,EAAM,MAAM;AAAA,gCACdA,EAAM,SAAW,EAAE;AAAA;AAAA;AAAA,eAGpC8D,EAAS9D,EAAM,EAAE,CAAC;AAAA,6BACJA,EAAM,YAAc,CAAC;AAAA,UACxCA,EAAM,MAAQD,uBAA0BC,EAAM,KAAK,SAAWC,CAAO;AAAA;AAAA;AAAA,GAI/E,CCzWO,SAASyH,GAAYjI,EAAmB,CAC7C,OAAOM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,0CAQiCN,EAAM,OAAO,WAAWA,EAAM,SAAS;AAAA,cACnEA,EAAM,QAAU,cAAgB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAMjB,KAAK,UAAUA,EAAM,QAAU,GAAI,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,sCAI3C,KAAK,UAAUA,EAAM,QAAU,GAAI,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,sCAI3C,KAAK,UAAUA,EAAM,WAAa,GAAI,KAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAY7DA,EAAM,UAAU;AAAA,uBACf3I,GACR2I,EAAM,mBAAoB3I,EAAE,OAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOvD2I,EAAM,UAAU;AAAA,uBACf3I,GACR2I,EAAM,mBAAoB3I,EAAE,OAA+B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAMlC2I,EAAM,MAAM;AAAA;AAAA,UAEjDA,EAAM,UACJM;AAAAA,gBACIN,EAAM,SAAS;AAAA,oBAEnBQ,CAAO;AAAA,UACTR,EAAM,WACJM,sDAAyDN,EAAM,UAAU,SACzEQ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAOuC,KAAK,UACvDR,EAAM,QAAU,CAAA,EAChB,KACA,CAAA,CACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMCA,EAAM,SAAS,SAAW,EACxBM,qEACAA;AAAAA;AAAAA,gBAEMN,EAAM,SAAS,IACd/E,GAAQqF;AAAAA;AAAAA;AAAAA,gDAGuBrF,EAAI,KAAK;AAAA,8CACX,IAAI,KAAKA,EAAI,EAAE,EAAE,oBAAoB;AAAA;AAAA;AAAA,gDAGnCmM,GAAmBnM,EAAI,OAAO,CAAC;AAAA;AAAA;AAAA,iBAAA,CAIhE;AAAA;AAAA,WAEJ;AAAA;AAAA,GAGX,CClHO,SAASiN,GAAgBlI,EAAuB,CACrD,OAAOM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,wCAO+BN,EAAM,OAAO,WAAWA,EAAM,SAAS;AAAA,YACnEA,EAAM,QAAU,WAAa,SAAS;AAAA;AAAA;AAAA,QAG1CA,EAAM,UACJM;AAAAA,cACIN,EAAM,SAAS;AAAA,kBAEnBQ,CAAO;AAAA,QACTR,EAAM,cACJM;AAAAA,cACIN,EAAM,aAAa;AAAA,kBAEvBQ,CAAO;AAAA;AAAA,UAEPR,EAAM,QAAQ,SAAW,EACvBM,uDACAN,EAAM,QAAQ,IAAKO,GAAU4H,GAAY5H,CAAK,CAAC,CAAC;AAAA;AAAA;AAAA,GAI5D,CAEA,SAAS4H,GAAY5H,EAAsB,CACzC,MAAM6H,EACJ7H,EAAM,kBAAoB,KACtB,GAAGA,EAAM,gBAAgB,QACzB,MACAoG,EAAOpG,EAAM,MAAQ,UAC3B,OAAOD;AAAAA;AAAAA;AAAAA,kCAGyBC,EAAM,MAAQ,cAAc;AAAA,gCAC9BiG,GAAsBjG,CAAK,CAAC;AAAA;AAAA,+BAE7BoG,CAAI;AAAA,YACvBpG,EAAM,SAAWD,uBAA0BC,EAAM,QAAQ,UAAYC,CAAO;AAAA,YAC5ED,EAAM,aACJD,uBAA0BC,EAAM,YAAY,UAC5CC,CAAO;AAAA,YACTD,EAAM,gBACJD,uBAA0BC,EAAM,eAAe,UAC/CC,CAAO;AAAA,YACTD,EAAM,QAAUD,uBAA0BC,EAAM,OAAO,UAAYC,CAAO;AAAA;AAAA;AAAA;AAAA,eAIvEqG,GAAkBtG,CAAK,CAAC;AAAA,wCACC6H,CAAS;AAAA,oCACb7H,EAAM,QAAU,EAAE;AAAA;AAAA;AAAA,GAItD,CClEO,SAAS8H,GAAYrI,EAAmB,CAC7C,OAAOM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,wCAO+BN,EAAM,OAAO,WAAWA,EAAM,SAAS;AAAA,YACnEA,EAAM,QAAU,WAAa,SAAS;AAAA;AAAA;AAAA;AAAA,UAIxCA,EAAM,MAAM,SAAW,EACrBM,4CACAN,EAAM,MAAM,IAAKtI,GAAMwL,GAAWxL,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA,GAIjD,CAEA,SAASwL,GAAWD,EAA+B,CACjD,MAAMqF,EAAY,EAAQrF,EAAK,UACzBsF,EAAS,EAAQtF,EAAK,OACtB7D,EACH,OAAO6D,EAAK,aAAgB,UAAYA,EAAK,YAAY,KAAA,IACzD,OAAOA,EAAK,QAAW,SAAWA,EAAK,OAAS,WAC7CuF,EAAO,MAAM,QAAQvF,EAAK,IAAI,EAAKA,EAAK,KAAqB,CAAA,EAC7DwF,EAAW,MAAM,QAAQxF,EAAK,QAAQ,EAAKA,EAAK,SAAyB,CAAA,EAC/E,OAAO3C;AAAAA;AAAAA;AAAAA,kCAGyBlB,CAAK;AAAA;AAAA,YAE3B,OAAO6D,EAAK,QAAW,SAAWA,EAAK,OAAS,EAAE;AAAA,YAClD,OAAOA,EAAK,UAAa,SAAW,MAAMA,EAAK,QAAQ,GAAK,EAAE;AAAA,YAC9D,OAAOA,EAAK,SAAY,SAAW,MAAMA,EAAK,OAAO,GAAK,EAAE;AAAA;AAAA;AAAA,+BAGzCsF,EAAS,SAAW,UAAU;AAAA,8BAC/BD,EAAY,UAAY,WAAW;AAAA,cACnDA,EAAY,YAAc,SAAS;AAAA;AAAA,YAErCE,EAAK,MAAM,EAAG,EAAE,EAAE,IAAK5Q,GAAM0I,uBAA0B,OAAO1I,CAAC,CAAC,SAAS,CAAC;AAAA,YAC1E6Q,EACC,MAAM,EAAG,CAAC,EACV,IAAK7Q,GAAM0I,uBAA0B,OAAO1I,CAAC,CAAC,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,GAKrE,CCnCO,SAAS8Q,GAAe1I,EAAsB,CACnD,MAAM+F,EAAW/F,EAAM,OAAO,SAGxB2I,EAAS5C,GAAU,SAAWnB,GAAiBmB,EAAS,QAAQ,EAAI,MACpE6C,EAAO7C,GAAU,QAAQ,eAC3B,GAAGA,EAAS,OAAO,cAAc,KACjC,MAEJ,OAAOzF;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,uBAScN,EAAM,SAAS,UAAU;AAAA,uBACxB3I,GAAa,CACrB,MAAMmB,EAAKnB,EAAE,OAA4B,MACzC2I,EAAM,iBAAiB,CAAE,GAAGA,EAAM,SAAU,WAAYxH,EAAG,CAC7D,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOQwH,EAAM,SAAS,KAAK;AAAA,uBACnB3I,GAAa,CACrB,MAAMmB,EAAKnB,EAAE,OAA4B,MACzC2I,EAAM,iBAAiB,CAAE,GAAGA,EAAM,SAAU,MAAOxH,EAAG,CACxD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAQQwH,EAAM,QAAQ;AAAA,uBACb3I,GAAa,CACrB,MAAMmB,EAAKnB,EAAE,OAA4B,MACzC2I,EAAM,iBAAiBxH,CAAC,CAC1B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOQwH,EAAM,SAAS,UAAU;AAAA,uBACxB3I,GAAa,CACrB,MAAMmB,EAAKnB,EAAE,OAA4B,MACzC2I,EAAM,mBAAmBxH,CAAC,CAC5B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,uCAKwB,IAAMwH,EAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAWzBA,EAAM,UAAY,KAAO,MAAM;AAAA,gBACpDA,EAAM,UAAY,YAAc,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,sCAKxB2I,CAAM;AAAA;AAAA;AAAA;AAAA,sCAINC,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA,gBAK1B5I,EAAM,qBACJuE,EAAUvE,EAAM,oBAAoB,EACpC,KAAK;AAAA;AAAA;AAAA;AAAA,UAIbA,EAAM,UACJM;AAAAA,gBACIN,EAAM,SAAS;AAAA,oBAEnBM;AAAAA;AAAAA,mBAEO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAOeN,EAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKnBA,EAAM,eAAiB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMlDA,EAAM,aAAe,KACnB,MACAA,EAAM,YACJ,UACA,UAAU;AAAA;AAAA,uCAEa+G,GAAc/G,EAAM,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAyBpE,CCjJA,MAAM6I,GAAe,CAAC,GAAI,MAAO,UAAW,MAAO,SAAU,MAAM,EAC7DC,GAAiB,CAAC,GAAI,MAAO,IAAI,EAEhC,SAASC,GAAe/I,EAAsB,CACnD,MAAMgJ,EAAOhJ,EAAM,QAAQ,UAAY,CAAA,EACvC,OAAOM;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,wCAO+BN,EAAM,OAAO,WAAWA,EAAM,SAAS;AAAA,YACnEA,EAAM,QAAU,WAAa,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAQ7BA,EAAM,aAAa;AAAA,qBAClB3I,GACR2I,EAAM,gBAAgB,CACpB,cAAgB3I,EAAE,OAA4B,MAC9C,MAAO2I,EAAM,MACb,cAAeA,EAAM,cACrB,eAAgBA,EAAM,cAAA,CACvB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAMKA,EAAM,KAAK;AAAA,qBACV3I,GACR2I,EAAM,gBAAgB,CACpB,cAAeA,EAAM,cACrB,MAAQ3I,EAAE,OAA4B,MACtC,cAAe2I,EAAM,cACrB,eAAgBA,EAAM,cAAA,CACvB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOOA,EAAM,aAAa;AAAA,sBACnB3I,GACT2I,EAAM,gBAAgB,CACpB,cAAeA,EAAM,cACrB,MAAOA,EAAM,MACb,cAAgB3I,EAAE,OAA4B,QAC9C,eAAgB2I,EAAM,cAAA,CACvB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOOA,EAAM,cAAc;AAAA,sBACpB3I,GACT2I,EAAM,gBAAgB,CACpB,cAAeA,EAAM,cACrB,MAAOA,EAAM,MACb,cAAeA,EAAM,cACrB,eAAiB3I,EAAE,OAA4B,OAAA,CAChD,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,QAKR2I,EAAM,MACJM,0DAA6DN,EAAM,KAAK,SACxEQ,CAAO;AAAA;AAAA;AAAA,UAGPR,EAAM,OAAS,UAAUA,EAAM,OAAO,IAAI,GAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAYjDgJ,EAAK,SAAW,EACd1I,+CACA0I,EAAK,IAAK/B,GAAQgC,GAAUhC,EAAKjH,EAAM,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA,GAI5D,CAEA,SAASiJ,GAAUhC,EAAwB7D,EAAmC,CAC5E,MAAM8F,EAAUjC,EAAI,UAAY1C,EAAU0C,EAAI,SAAS,EAAI,MACrDkC,EAAWlC,EAAI,eAAiB,GAChCmC,EAAUnC,EAAI,cAAgB,GACpC,OAAO3G;AAAAA;AAAAA,0BAEiB2G,EAAI,aAAeA,EAAI,GAAG;AAAA,aACvCA,EAAI,IAAI;AAAA,aACRiC,CAAO;AAAA,aACPlC,GAAoBC,CAAG,CAAC;AAAA;AAAA;AAAA,mBAGlBkC,CAAQ;AAAA,oBACN9R,GAAa,CACtB,MAAMsG,EAAStG,EAAE,OAA6B,MAC9C+L,EAAQ6D,EAAI,IAAK,CAAE,cAAetJ,GAAS,KAAM,CACnD,CAAC;AAAA;AAAA,YAECkL,GAAa,IAAKQ,GAClB/I,kBAAqB+I,CAAK,IAAIA,GAAS,SAAS,WAAA,CACjD;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKQD,CAAO;AAAA,oBACL/R,GAAa,CACtB,MAAMsG,EAAStG,EAAE,OAA6B,MAC9C+L,EAAQ6D,EAAI,IAAK,CAAE,aAActJ,GAAS,KAAM,CAClD,CAAC;AAAA;AAAA,YAECmL,GAAe,IAAKO,GACpB/I,kBAAqB+I,CAAK,IAAIA,GAAS,SAAS,WAAA,CACjD;AAAA;AAAA;AAAA;AAAA,GAKX,CChJO,SAASC,GAAatJ,EAAoB,CAC/C,MAAMuJ,EAASvJ,EAAM,QAAQ,QAAU,CAAA,EACjCwJ,EAASxJ,EAAM,OAAO,KAAA,EAAO,YAAA,EAC7ByJ,EAAWD,EACbD,EAAO,OAAQG,GACb,CAACA,EAAM,KAAMA,EAAM,YAAaA,EAAM,MAAM,EACzC,KAAK,GAAG,EACR,YAAA,EACA,SAASF,CAAM,CAAA,EAEpBD,EAEJ,OAAOjJ;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,wCAO+BN,EAAM,OAAO,WAAWA,EAAM,SAAS;AAAA,YACnEA,EAAM,QAAU,WAAa,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAQ7BA,EAAM,MAAM;AAAA,qBACX3I,GACR2I,EAAM,eAAgB3I,EAAE,OAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,6BAI3CoS,EAAS,MAAM;AAAA;AAAA;AAAA,QAGpCzJ,EAAM,MACJM,0DAA6DN,EAAM,KAAK,SACxEQ,CAAO;AAAA;AAAA,QAETiJ,EAAS,SAAW,EAClBnJ,uEACAA;AAAAA;AAAAA,gBAEMmJ,EAAS,IAAKC,GAAUC,GAAYD,EAAO1J,CAAK,CAAC,CAAC;AAAA;AAAA,WAEvD;AAAA;AAAA,GAGX,CAEA,SAAS2J,GAAYD,EAAyB1J,EAAoB,CAChE,MAAM4J,EAAO5J,EAAM,UAAY0J,EAAM,UAAY1J,EAAM,UAAY0J,EAAM,KACnEG,EAAS7J,EAAM,MAAM0J,EAAM,QAAQ,GAAK,GACxCI,EAAU,CACd,GAAGJ,EAAM,QAAQ,KAAK,IAAKrR,GAAM,OAAOA,CAAC,EAAE,EAC3C,GAAGqR,EAAM,QAAQ,IAAI,IAAKrS,GAAM,OAAOA,CAAC,EAAE,EAC1C,GAAGqS,EAAM,QAAQ,OAAO,IAAK9R,GAAM,UAAUA,CAAC,EAAE,EAChD,GAAG8R,EAAM,QAAQ,GAAG,IAAKnS,GAAM,MAAMA,CAAC,EAAE,CAAA,EAEpCwS,EAAoB,CAAA,EAC1B,OAAIL,EAAM,UAAUK,EAAQ,KAAK,UAAU,EACvCL,EAAM,oBAAoBK,EAAQ,KAAK,sBAAsB,EAC1DzJ;AAAAA;AAAAA;AAAAA;AAAAA,YAIGoJ,EAAM,MAAQ,GAAGA,EAAM,KAAK,IAAM,EAAE,GAAGA,EAAM,IAAI;AAAA;AAAA,gCAE7B7E,GAAU6E,EAAM,YAAa,GAAG,CAAC;AAAA;AAAA,+BAElCA,EAAM,MAAM;AAAA,8BACbA,EAAM,SAAW,UAAY,WAAW;AAAA,cACxDA,EAAM,SAAW,WAAa,SAAS;AAAA;AAAA,YAEzCA,EAAM,SAAWpJ,gDAAqDE,CAAO;AAAA;AAAA,UAE/EsJ,EAAQ,OAAS,EACfxJ;AAAAA;AAAAA,2BAEewJ,EAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,cAGjCtJ,CAAO;AAAA,UACTuJ,EAAQ,OAAS,EACfzJ;AAAAA;AAAAA,0BAEcyJ,EAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,cAGhCvJ,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAMKoJ,CAAI;AAAA,qBACP,IAAM5J,EAAM,SAAS0J,EAAM,SAAUA,EAAM,QAAQ,CAAC;AAAA;AAAA,cAE3DA,EAAM,SAAW,SAAW,SAAS;AAAA;AAAA,YAEvCA,EAAM,QAAQ,OAAS,EACrBpJ;AAAAA;AAAAA,4BAEcsJ,CAAI;AAAA,yBACP,IAAM5J,EAAM,UAAU0J,EAAM,KAAMA,EAAM,QAAQ,CAAC,EAAE,EAAE,CAAC;AAAA;AAAA,kBAE7DA,EAAM,QAAQ,CAAC,EAAE,KAAK;AAAA,yBAE1BlJ,CAAO;AAAA;AAAA,UAEXkJ,EAAM,WACJpJ;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,2BAKeuJ,CAAM;AAAA,2BACLxS,GACR2I,EAAM,OAAO0J,EAAM,SAAWrS,EAAE,OAA4B,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAM1DuS,CAAI;AAAA,yBACP,IAAM5J,EAAM,UAAU0J,EAAM,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA,cAKlDlJ,CAAO;AAAA;AAAA;AAAA,GAInB,CC5DO,MAAMwJ,GAA2C,CACtD,UAAW,GACX,SAAU,GACV,MAAO,GACP,YAAa,GACb,SAAU,GACV,QAAS,GACT,KAAM,GACN,OAAQ,GACR,WAAY,GACZ,SAAU,GACV,YAAa,GACb,YAAa,GACb,OAAQ,GACR,MAAO,GACP,WAAY,EACd,EAEaC,EAAuC,CAClD,UAAW,GACX,SAAU,GACV,KAAM,GACN,WAAY,GACZ,UAAW,EACb,ECtEA,eAAsBC,EAAc1C,EAAyB2C,EAAgB,CAC3E,GAAI,GAAC3C,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,iBACV,CAAAA,EAAM,iBAAmB,GACzBA,EAAM,eAAiB,KACvB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,mBAAoB,CAC1D,MAAA2C,EACA,UAAW,GAAA,CACZ,EACD3C,EAAM,kBAAoBrM,EAC1BqM,EAAM,qBAAuB,KAAK,IAAA,EAClCA,EAAM,oBAAsBrM,EAAI,SAAS,cAAgB,MACzDqM,EAAM,mBAAqBrM,EAAI,SAAS,cAAgB,MACxDqM,EAAM,iBAAmBrM,EAAI,OAAO,iBAAmB,MACvDqM,EAAM,oBAAsBrM,EAAI,OAAO,iBAAmB,KAC5D,OAAST,EAAK,CACZ8M,EAAM,eAAiB,OAAO9M,CAAG,CACnC,QAAA,CACE8M,EAAM,iBAAmB,EAC3B,EACF,CAEA,eAAsB4C,GAAmB5C,EAAyB6C,EAAgB,CAChF,GAAI,GAAC7C,EAAM,QAAU,CAACA,EAAM,WAAaA,EAAM,cAC/C,CAAAA,EAAM,aAAe,GACrB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,kBAAmB,CACzD,MAAA6C,EACA,UAAW,GAAA,CACZ,EACD7C,EAAM,qBAAuBrM,EAAI,SAAW,KAC5CqM,EAAM,uBAAyBrM,EAAI,WAAa,KAChDqM,EAAM,uBAAyB,IACjC,OAAS9M,EAAK,CACZ8M,EAAM,qBAAuB,OAAO9M,CAAG,EACvC8M,EAAM,uBAAyB,KAC/BA,EAAM,uBAAyB,IACjC,QAAA,CACEA,EAAM,aAAe,EACvB,EACF,CAEA,eAAsB8C,GAAkB9C,EAAyB,CAC/D,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAAaA,EAAM,cAC/C,CAAAA,EAAM,aAAe,GACrB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,iBAAkB,CACxD,UAAW,IAAA,CACZ,EACDA,EAAM,qBAAuBrM,EAAI,SAAW,KAC5CqM,EAAM,uBAAyBrM,EAAI,WAAa,KAC5CA,EAAI,YAAWqM,EAAM,uBAAyB,KACpD,OAAS9M,EAAK,CACZ8M,EAAM,qBAAuB,OAAO9M,CAAG,EACvC8M,EAAM,uBAAyB,IACjC,QAAA,CACEA,EAAM,aAAe,EACvB,EACF,CAEA,eAAsB+C,GAAe/C,EAAyB,CAC5D,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAAaA,EAAM,cAC/C,CAAAA,EAAM,aAAe,GACrB,GAAI,CACF,MAAMA,EAAM,OAAO,QAAQ,aAAc,CAAA,CAAE,EAC3CA,EAAM,qBAAuB,cAC7BA,EAAM,uBAAyB,KAC/BA,EAAM,uBAAyB,IACjC,OAAS9M,EAAK,CACZ8M,EAAM,qBAAuB,OAAO9M,CAAG,CACzC,QAAA,CACE8M,EAAM,aAAe,EACvB,EACF,CAEO,SAASgD,GACdhD,EACAiD,EACA,CACAjD,EAAM,aAAe,CAAE,GAAGA,EAAM,aAAc,GAAGiD,CAAA,CACnD,CAEO,SAASC,GACdlD,EACAiD,EACA,CACA,GAAIA,EAAM,QAAS,CACjBjD,EAAM,YAAc,CAClB,GAAGA,EAAM,YACT,GAAGiD,EACH,QAAS,CAAE,GAAGjD,EAAM,YAAY,QAAS,GAAGiD,EAAM,OAAA,CAAQ,EAE5D,MACF,CACAjD,EAAM,YAAc,CAAE,GAAGA,EAAM,YAAa,GAAGiD,CAAA,CACjD,CAEO,SAASE,GACdnD,EACAiD,EACA,CACA,GAAIA,EAAM,QAAS,CACjBjD,EAAM,UAAY,CAChB,GAAGA,EAAM,UACT,GAAGiD,EACH,QAAS,CAAE,GAAGjD,EAAM,UAAU,QAAS,GAAGiD,EAAM,OAAA,CAAQ,EAE1D,MACF,CACAjD,EAAM,UAAY,CAAE,GAAGA,EAAM,UAAW,GAAGiD,CAAA,CAC7C,CAEO,SAASG,GACdpD,EACAiD,EACA,CACAjD,EAAM,WAAa,CAAE,GAAGA,EAAM,WAAY,GAAGiD,CAAA,CAC/C,CAEO,SAASI,GACdrD,EACAiD,EACA,CACAjD,EAAM,aAAe,CAAE,GAAGA,EAAM,aAAc,GAAGiD,CAAA,CACnD,CAEA,eAAsBK,GAAmBtD,EAAyB,CAChE,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,eACV,CAAAA,EAAM,eAAiB,GACvBA,EAAM,qBAAuB,KAC7B,GAAI,CAEF,MAAMuD,EAAS,CAAE,GADJvD,EAAM,gBAAgB,QAAU,CAAA,CACzB,EACdnC,EAAW,CAAE,GAAI0F,EAAO,UAAY,CAAA,CAAC,EAC3C,GAAI,CAACvD,EAAM,oBAAqB,CAC9B,MAAMwD,EAAQxD,EAAM,aAAa,MAAM,KAAA,EACnCwD,IAAgB,SAAWA,SACnB3F,EAAS,QACvB,CACA,MAAM4F,EACJ5F,EAAS,QAAU,OAAOA,EAAS,QAAW,SACzC,CAAE,GAAIA,EAAS,MAAA,EAIhB,CAAA,EACA6F,EACJD,EAAO,GAAG,GAAK,OAAOA,EAAO,GAAG,GAAM,SACjC,CAAE,GAAIA,EAAO,GAAG,CAAA,EAIjB,CAAA,EACNC,EAAa,eAAiB1D,EAAM,aAAa,eACjDyD,EAAO,GAAG,EAAIC,EACd7F,EAAS,OAAS4F,EAClB,OAAO5F,EAAS,eAChB,MAAM8F,EAAYnG,EAAUwC,EAAM,aAAa,SAAS,EACpD2D,EAAU,OAAS,EAAG9F,EAAS,UAAY8F,SACnC9F,EAAS,UACrB,MAAM+F,EAAQ5D,EAAM,aAAa,MAAM,KAAA,EACnC4D,IAAgB,MAAQA,SAChB/F,EAAS,MACrB,MAAMgG,EAAa7D,EAAM,aAAa,WAAW,KAAA,EAC7C6D,IAAqB,WAAaA,SAC1BhG,EAAS,WACrB,MAAMiG,EAAgB9D,EAAM,aAAa,cAAc,KAAA,EACnD8D,IAAwB,cAAgBA,SAChCjG,EAAS,cACrB,MAAMkG,EAAc/D,EAAM,aAAa,YAAY,KAAA,EAC/C+D,IAAsB,YAAcA,SAC5BlG,EAAS,YAErB0F,EAAO,SAAW1F,EAClB,MAAMvK,EAAM,GAAG,KAAK,UAAUiQ,EAAQ,KAAM,CAAC,EAAE,QAAA,CAAS;AAAA,EACxD,MAAMvD,EAAM,OAAO,QAAQ,aAAc,CAAE,IAAA1M,EAAK,EAChD0M,EAAM,qBAAuB,mCAC/B,OAAS9M,EAAK,CACZ8M,EAAM,qBAAuB,OAAO9M,CAAG,CACzC,QAAA,CACE8M,EAAM,eAAiB,EACzB,EACF,CAEA,eAAsBgE,GAAkBhE,EAAyB,CAC/D,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,cACV,CAAAA,EAAM,cAAgB,GACtBA,EAAM,oBAAsB,KAC5B,GAAI,CAEF,MAAMuD,EAAS,CAAE,GADJvD,EAAM,gBAAgB,QAAU,CAAA,CACzB,EACdlC,EAAU,CAAE,GAAIyF,EAAO,SAAW,CAAA,CAAC,EACnC/C,EAAOR,EAAM,YAQnB,GANIQ,EAAK,QACP,OAAO1C,EAAQ,QAEfA,EAAQ,QAAU,GAGhB,CAACkC,EAAM,mBAAoB,CAC7B,MAAMwD,EAAQhD,EAAK,MAAM,KAAA,EACrBgD,IAAe,MAAQA,SACf1F,EAAQ,KACtB,CAEA,MAAM6F,EAAYnG,EAAUgD,EAAK,SAAS,EACpCyD,EAAgBzG,EAAUgD,EAAK,aAAa,EAC5C0D,EAAK,CAAE,GAAIpG,EAAQ,IAAM,CAAA,CAAC,EAC5B0C,EAAK,UAAW,OAAO0D,EAAG,UACtB,QAAU,GACdP,EAAU,OAAS,EAAGO,EAAG,UAAYP,SAC7BO,EAAG,UACX1D,EAAK,aAAc0D,EAAG,aAAe,UAC7BA,EAAG,aACXD,EAAc,OAAS,EAAGC,EAAG,cAAgBD,SACrCC,EAAG,cACX,OAAO,KAAKA,CAAE,EAAE,OAAS,IAAW,GAAKA,SACjCpG,EAAQ,GAEpB,MAAMqG,EAAa,OAAO3D,EAAK,UAAU,EACrC,OAAO,SAAS2D,CAAU,GAAKA,EAAa,EAC9CrG,EAAQ,WAAaqG,EAErB,OAAOrG,EAAQ,WAGjB,MAAMsG,EAAkB5D,EAAK,aAAa,KAAA,EAC1C,GAAI4D,EAAgB,SAAW,EAC7B,OAAOtG,EAAQ,iBACV,CACL,MAAMuG,EAAe,OAAOD,CAAe,EACvC,OAAO,SAASC,CAAY,GAAKA,GAAgB,EACnDvG,EAAQ,aAAeuG,EAEvB,OAAOvG,EAAQ,YAEnB,CAEA,MAAMwG,EAAgB9D,EAAK,eAAe,KAAA,EAC1C,GAAI8D,EAAc,SAAW,EAC3B,OAAOxG,EAAQ,mBACV,CACL,MAAMyG,EAAa,OAAOD,CAAa,EACnC,OAAO,SAASC,CAAU,GAAKA,EAAa,EAC9CzG,EAAQ,eAAiByG,EAEzB,OAAOzG,EAAQ,cAEnB,CAEI0C,EAAK,cAAgB,MACvB,OAAO1C,EAAQ,YAEfA,EAAQ,YAAc0C,EAAK,YAG7B,MAAMgE,EAAa,MAAM,QAAQhE,EAAK,MAAM,EAAIA,EAAK,OAAS,CAAA,EACxDiE,EAAkC,CAAA,EACxCD,EAAW,QAAS9F,GAA4B,CAC9C,MAAM1H,EAAM,OAAO0H,EAAM,KAAO,EAAE,EAAE,KAAA,EACpC,GAAI,CAAC1H,EAAK,OACV,MAAM+B,EAAiC,CAAA,EACjC2L,EAAO,OAAOhG,EAAM,MAAQ,EAAE,EAAE,KAAA,EAClCgG,MAAY,KAAOA,GACnBhG,EAAM,iBAAgB3F,EAAM,eAAiB,KAE/C2F,EAAM,wBAA0B,OAChCA,EAAM,wBAA0B,OAChCA,EAAM,wBAA0B,OAChCA,EAAM,wBAA0B,eAEhC3F,EAAM,sBAAwB2F,EAAM,uBAEtC,MAAMiG,EAAQnH,EAAUkB,EAAM,KAAK,EAC/BiG,EAAM,OAAS,IAAG5L,EAAM,MAAQ4L,GACpC,MAAM7F,EAAoC,CAAA,GACrB,MAAM,QAAQJ,EAAM,QAAQ,EAAIA,EAAM,SAAW,CAAA,GACzD,QAASE,GAAqC,CACzD,MAAMgG,GAAa,OAAOhG,EAAQ,KAAO,EAAE,EAAE,KAAA,EAC7C,GAAI,CAACgG,GAAY,OACjB,MAAMC,EAAwC,CAAA,EAC1CjG,EAAQ,QAAU,KAAOiG,EAAa,MAAQ,IAC9CjG,EAAQ,iBAAgBiG,EAAa,eAAiB,IAC1D/F,EAAS8F,EAAU,EAAIC,CACzB,CAAC,EACG,OAAO,KAAK/F,CAAQ,EAAE,OAAS,MAAS,SAAWA,GACvD2F,EAAOzN,CAAG,EAAI+B,CAChB,CAAC,EACG,OAAO,KAAK0L,CAAM,EAAE,OAAS,IAAW,OAASA,SACzC3G,EAAQ,OAEpB,MAAMgH,EAAsC,CAAA,EACtCC,EAAe/N,GAAiC,CACpD,MAAMb,EAAQqK,EAAK,QAAQxJ,CAAG,EAC1Bb,IAAUqM,GAAsBxL,CAAG,IAAG8N,EAAQ9N,CAAG,EAAIb,EAC3D,EACA4O,EAAY,WAAW,EACvBA,EAAY,UAAU,EACtBA,EAAY,OAAO,EACnBA,EAAY,aAAa,EACzBA,EAAY,UAAU,EACtBA,EAAY,SAAS,EACrBA,EAAY,MAAM,EAClBA,EAAY,QAAQ,EACpBA,EAAY,YAAY,EACxBA,EAAY,UAAU,EACtBA,EAAY,aAAa,EACzBA,EAAY,aAAa,EACzBA,EAAY,QAAQ,EACpBA,EAAY,OAAO,EACnBA,EAAY,YAAY,EACpB,OAAO,KAAKD,CAAO,EAAE,OAAS,EAChChH,EAAQ,QAAUgH,EAElB,OAAOhH,EAAQ,QAGjB,MAAMkH,EAAQ,CAAE,GAAIlH,EAAQ,cAAgB,CAAA,CAAC,EACzC0C,EAAK,aACPwE,EAAM,QAAU,GAEhB,OAAOA,EAAM,QAEXxE,EAAK,UAAU,KAAA,IAAc,KAAOA,EAAK,UAAU,KAAA,SAC3CwE,EAAM,KACdxE,EAAK,mBAAmB,KAAA,EAC1BwE,EAAM,cAAgBxE,EAAK,mBAAmB,KAAA,SACpCwE,EAAM,cACdxE,EAAK,eACP,OAAOwE,EAAM,UAEbA,EAAM,UAAY,GAEhB,OAAO,KAAKA,CAAK,EAAE,OAAS,IAAW,aAAeA,SAC9ClH,EAAQ,aAEhB,OAAO,KAAKA,CAAO,EAAE,OAAS,EAChCyF,EAAO,QAAUzF,EAEjB,OAAOyF,EAAO,QAGhB,MAAMjQ,EAAM,GAAG,KAAK,UAAUiQ,EAAQ,KAAM,CAAC,EAAE,QAAA,CAAS;AAAA,EACxD,MAAMvD,EAAM,OAAO,QAAQ,aAAc,CAAE,IAAA1M,EAAK,EAChD0M,EAAM,oBAAsB,mCAC9B,OAAS9M,EAAK,CACZ8M,EAAM,oBAAsB,OAAO9M,CAAG,CACxC,QAAA,CACE8M,EAAM,cAAgB,EACxB,EACF,CAEA,eAAsBiF,GAAgBjF,EAAyB,CAC7D,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,YACV,CAAAA,EAAM,YAAc,GACpBA,EAAM,kBAAoB,KAC1B,GAAI,CAEF,MAAMuD,EAAS,CAAE,GADJvD,EAAM,gBAAgB,QAAU,CAAA,CACzB,EACdjC,EAAQ,CAAE,GAAIwF,EAAO,OAAS,CAAA,CAAC,EAC/B/C,EAAOR,EAAM,UAQnB,GANIQ,EAAK,QACP,OAAOzC,EAAM,QAEbA,EAAM,QAAU,GAGd,CAACiC,EAAM,iBAAkB,CAC3B,MAAMwD,EAAQhD,EAAK,SAAS,KAAA,EACxBgD,IAAa,SAAWA,SAChBzF,EAAM,QACpB,CACA,GAAI,CAACiC,EAAM,oBAAqB,CAC9B,MAAMwD,EAAQhD,EAAK,SAAS,KAAA,EACxBgD,IAAa,SAAWA,SAChBzF,EAAM,QACpB,CAEA,MAAMmG,EAAK,CAAE,GAAInG,EAAM,IAAM,CAAA,CAAC,EAC9BmG,EAAG,QAAU1D,EAAK,UAClB,MAAMmD,EAAYnG,EAAUgD,EAAK,SAAS,EACtCmD,EAAU,OAAS,EAAGO,EAAG,UAAYP,SAC7BO,EAAG,UACX1D,EAAK,aACP0D,EAAG,aAAe,GAElB,OAAOA,EAAG,aAEZ,MAAMD,EAAgBzG,EAAUgD,EAAK,aAAa,EAC9CyD,EAAc,OAAS,EAAGC,EAAG,cAAgBD,SACrCC,EAAG,cACX,OAAO,KAAKA,CAAE,EAAE,OAAS,IAAS,GAAKA,SAC/BnG,EAAM,GAElB,MAAMoG,EAAa,OAAO,WAAW3D,EAAK,UAAU,EAChD,OAAO,SAAS2D,CAAU,GAAKA,EAAa,EAC9CpG,EAAM,WAAaoG,EAEnB,OAAOpG,EAAM,WAGf,MAAMmH,EAAiB,OAAO,SAAS1E,EAAK,eAAgB,EAAE,EAC1D,OAAO,SAAS0E,CAAc,GAAKA,EAAiB,EACtDnH,EAAM,eAAiBmH,EAEvB,OAAOnH,EAAM,eAGXyC,EAAK,wBAA0B,MACjC,OAAOzC,EAAM,sBAEbA,EAAM,sBAAwByC,EAAK,sBAErC,MAAM2E,EAAoB3H,EAAUgD,EAAK,iBAAiB,EACtD2E,EAAkB,OAAS,EAC7BpH,EAAM,kBAAoBoH,EAE1B,OAAOpH,EAAM,kBAGf,MAAMiH,EAAQ,CAAE,GAAIjH,EAAM,cAAgB,CAAA,CAAC,EACvCyC,EAAK,aACPwE,EAAM,QAAU,GAEhB,OAAOA,EAAM,QAEXxE,EAAK,UAAU,KAAA,IAAc,KAAOA,EAAK,UAAU,KAAA,SAC3CwE,EAAM,KACdxE,EAAK,mBAAmB,KAAA,EAC1BwE,EAAM,cAAgBxE,EAAK,mBAAmB,KAAA,SACpCwE,EAAM,cACdxE,EAAK,eACP,OAAOwE,EAAM,UAEbA,EAAM,UAAY,GAEhB,OAAO,KAAKA,CAAK,EAAE,OAAS,IAAS,aAAeA,SAC5CjH,EAAM,aAElB,MAAM+G,EAAoC,CAAA,EACpCC,EAAe/N,GAA+B,CAClD,MAAMb,EAAQqK,EAAK,QAAQxJ,CAAG,EAC1Bb,IAAUsM,EAAoBzL,CAAG,IAAG8N,EAAQ9N,CAAG,EAAIb,EACzD,EACA4O,EAAY,WAAW,EACvBA,EAAY,UAAU,EACtBA,EAAY,MAAM,EAClBA,EAAY,YAAY,EACxBA,EAAY,WAAW,EACnB,OAAO,KAAKD,CAAO,EAAE,OAAS,EAChC/G,EAAM,QAAU+G,EAEhB,OAAO/G,EAAM,QAGf,MAAMe,EAAW0B,EAAK,SACnB,IAAKzH,GAAoD,CACxD,MAAM/B,EAAM+B,EAAM,IAAI,KAAA,EACtB,GAAI,CAAC/B,EAAK,OAAO,KACjB,MAAMG,EAAkC,CACtC,MAAO4B,EAAM,MACb,eAAgBA,EAAM,cAAA,EAExB,MAAO,CAAC/B,EAAKG,CAAM,CACrB,CAAC,EACA,OAAQhB,GAAsD,EAAQA,CAAM,EAC3E2I,EAAS,OAAS,EACpBf,EAAM,SAAW,OAAO,YAAYe,CAAQ,EAE5C,OAAOf,EAAM,SAGX,OAAO,KAAKA,CAAK,EAAE,OAAS,EAC9BwF,EAAO,MAAQxF,EAEf,OAAOwF,EAAO,MAGhB,MAAMjQ,EAAM,GAAG,KAAK,UAAUiQ,EAAQ,KAAM,CAAC,EAAE,QAAA,CAAS;AAAA,EACxD,MAAMvD,EAAM,OAAO,QAAQ,aAAc,CAAE,IAAA1M,EAAK,EAChD0M,EAAM,kBAAoB,mCAC5B,OAAS9M,EAAK,CACZ8M,EAAM,kBAAoB,OAAO9M,CAAG,CACtC,QAAA,CACE8M,EAAM,YAAc,EACtB,EACF,CAEA,eAAsBoF,GAAiBpF,EAAyB,CAC9D,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,aACV,CAAAA,EAAM,aAAe,GACrBA,EAAM,mBAAqB,KAC3B,GAAI,CAEF,MAAMuD,EAAS,CAAE,GADJvD,EAAM,gBAAgB,QAAU,CAAA,CACzB,EACdhC,EAAS,CAAE,GAAIuF,EAAO,QAAU,CAAA,CAAC,EACjC/C,EAAOR,EAAM,WAEfQ,EAAK,QACP,OAAOxC,EAAO,QAEdA,EAAO,QAAU,GAGnB,MAAMqH,EAAU7E,EAAK,QAAQ,KAAA,EACzB6E,IAAgB,QAAUA,SAClBrH,EAAO,QAEnB,MAAMsH,EAAU9E,EAAK,QAAQ,KAAA,EACzB8E,IAAgB,QAAUA,SAClBtH,EAAO,QAEnB,MAAMuH,EAAW/E,EAAK,SAAS,KAAA,EAC3B+E,IAAiB,SAAWA,SACpBvH,EAAO,SAEnB,MAAMwH,EAAW,OAAOhF,EAAK,QAAQ,EACjC,OAAO,SAASgF,CAAQ,GAAKA,EAAW,EAC1CxH,EAAO,SAAWwH,EAElB,OAAOxH,EAAO,SAGhB,MAAMyH,EAAUjF,EAAK,QAAQ,KAAA,EACzBiF,IAAgB,QAAUA,SAClBzH,EAAO,QAEfwC,EAAK,UACP,OAAOxC,EAAO,UAEdA,EAAO,UAAY,GAGjBwC,EAAK,cAAgB,YAAcA,EAAK,cAAgB,SAC1DxC,EAAO,YAAcwC,EAAK,YAE1B,OAAOxC,EAAO,YAGZwC,EAAK,kBAAmBxC,EAAO,kBAAoB,UAC3CA,EAAO,kBACfwC,EAAK,cAAexC,EAAO,cAAgB,UACnCA,EAAO,cACfwC,EAAK,iBAAkBxC,EAAO,iBAAmB,UACzCA,EAAO,iBAEnB,MAAM2F,EAAYnG,EAAUgD,EAAK,SAAS,EACtCmD,EAAU,OAAS,EAAG3F,EAAO,UAAY2F,SACjC3F,EAAO,UAEnB,MAAMmG,EAAa,OAAO3D,EAAK,UAAU,EACrC,OAAO,SAAS2D,CAAU,GAAKA,EAAa,EAC9CnG,EAAO,WAAamG,EAEpB,OAAOnG,EAAO,WAGZ,OAAO,KAAKA,CAAM,EAAE,OAAS,EAC/BuF,EAAO,OAASvF,EAEhB,OAAOuF,EAAO,OAGhB,MAAMjQ,EAAM,GAAG,KAAK,UAAUiQ,EAAQ,KAAM,CAAC,EAAE,QAAA,CAAS;AAAA,EACxD,MAAMvD,EAAM,OAAO,QAAQ,aAAc,CAAE,IAAA1M,EAAK,EAChD0M,EAAM,mBAAqB,mCAC7B,OAAS9M,EAAK,CACZ8M,EAAM,mBAAqB,OAAO9M,CAAG,CACvC,QAAA,CACE8M,EAAM,aAAe,EACvB,EACF,CAEA,eAAsB0F,GAAmB1F,EAAyB,CAChE,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,eACV,CAAAA,EAAM,eAAiB,GACvBA,EAAM,qBAAuB,KAC7B,GAAI,CAEF,MAAMuD,EAAS,CAAE,GADJvD,EAAM,gBAAgB,QAAU,CAAA,CACzB,EACd/B,EAAW,CAAE,GAAIsF,EAAO,UAAY,CAAA,CAAC,EACrC/C,EAAOR,EAAM,aAEfQ,EAAK,QACP,OAAOvC,EAAS,QAEhBA,EAAS,QAAU,GAGrB,MAAMwH,EAAUjF,EAAK,QAAQ,KAAA,EACzBiF,IAAkB,QAAUA,SACpBxH,EAAS,QAErB,MAAM0H,EAASnF,EAAK,OAAO,KAAA,EACvBmF,IAAiB,OAASA,SAClB1H,EAAS,OAEjBuC,EAAK,UAAY,OACnB,OAAOvC,EAAS,QAEhBA,EAAS,QAAUuC,EAAK,QAG1B,MAAMoF,EAASpF,EAAK,OAAO,KAAA,EACvBoF,IAAiB,OAASA,SAClB3H,EAAS,OAErB,MAAM0F,EAAYnG,EAAUgD,EAAK,SAAS,EACtCmD,EAAU,OAAS,EAAG1F,EAAS,UAAY0F,SACnC1F,EAAS,UAEjBuC,EAAK,mBAAoBvC,EAAS,mBAAqB,UAC/CA,EAAS,mBAErB,MAAMkG,EAAa,OAAO3D,EAAK,UAAU,EACrC,OAAO,SAAS2D,CAAU,GAAKA,EAAa,EAC9ClG,EAAS,WAAakG,EAEtB,OAAOlG,EAAS,WAGd,OAAO,KAAKA,CAAQ,EAAE,OAAS,EACjCsF,EAAO,SAAWtF,EAElB,OAAOsF,EAAO,SAGhB,MAAMjQ,EAAM,GAAG,KAAK,UAAUiQ,EAAQ,KAAM,CAAC,EAAE,QAAA,CAAS;AAAA,EACxD,MAAMvD,EAAM,OAAO,QAAQ,aAAc,CAAE,IAAA1M,EAAK,EAChD0M,EAAM,qBAAuB,mCAC/B,OAAS9M,EAAK,CACZ8M,EAAM,qBAAuB,OAAO9M,CAAG,CACzC,QAAA,CACE8M,EAAM,eAAiB,EACzB,EACF,CCzqBA,eAAsB6F,GAAa7F,EAAsB,CACvD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,gBACV,CAAAA,EAAM,gBAAkB,GACxBA,EAAM,cAAgB,KACtBA,EAAM,eAAiB,KACvB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,kBAAmB,EAAE,EAGzD,MAAM,QAAQrM,CAAG,GACnBqM,EAAM,gBAAkBrM,EACxBqM,EAAM,eAAiBrM,EAAI,SAAW,EAAI,oBAAsB,OAEhEqM,EAAM,gBAAkB,CAAA,EACxBA,EAAM,eAAiB,uBAE3B,OAAS9M,EAAK,CACZ8M,EAAM,cAAgB,OAAO9M,CAAG,CAClC,QAAA,CACE8M,EAAM,gBAAkB,EAC1B,EACF,CClBA,eAAsB8F,EAAa9F,EAAsB,CACvD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,gBACV,CAAAA,EAAM,gBAAkB,GACxBA,EAAM,cAAgB,KACtB,GAAI,CACF,MAAM5M,EAAkC,CACtC,cAAe4M,EAAM,sBACrB,eAAgBA,EAAM,sBAAA,EAElB+F,EAAgBxI,GAASyC,EAAM,qBAAsB,CAAC,EACtD3I,EAAQkG,GAASyC,EAAM,oBAAqB,CAAC,EAC/C+F,EAAgB,IAAG3S,EAAO,cAAgB2S,GAC1C1O,EAAQ,IAAGjE,EAAO,MAAQiE,GAC9B,MAAM1D,EAAO,MAAMqM,EAAM,OAAO,QAAQ,gBAAiB5M,CAAM,EAG3DO,MAAW,eAAiBA,EAClC,OAAST,EAAK,CACZ8M,EAAM,cAAgB,OAAO9M,CAAG,CAClC,QAAA,CACE8M,EAAM,gBAAkB,EAC1B,EACF,CAEA,eAAsBgG,GACpBhG,EACAhJ,EACAiM,EACA,CACA,GAAI,CAACjD,EAAM,QAAU,CAACA,EAAM,UAAW,OACvC,MAAM5M,EAAkC,CAAE,IAAA4D,CAAA,EACtC,kBAAmBiM,IAAO7P,EAAO,cAAgB6P,EAAM,eACvD,iBAAkBA,IAAO7P,EAAO,aAAe6P,EAAM,cACzD,GAAI,CACF,MAAMjD,EAAM,OAAO,QAAQ,iBAAkB5M,CAAM,EACnD,MAAM0S,EAAa9F,CAAK,CAC1B,OAAS9M,EAAK,CACZ8M,EAAM,cAAgB,OAAO9M,CAAG,CAClC,CACF,CC3CA,eAAsB+S,GAAWjG,EAAoB,CACnD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,cACV,CAAAA,EAAM,cAAgB,GACtBA,EAAM,YAAc,KACpB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,gBAAiB,EAAE,EAGvDrM,MAAW,aAAeA,EAChC,OAAST,EAAK,CACZ8M,EAAM,YAAc,OAAO9M,CAAG,CAChC,QAAA,CACE8M,EAAM,cAAgB,EACxB,EACF,CAEO,SAASkG,GACdlG,EACAmG,EACAhQ,EACA,CACA6J,EAAM,WAAa,CAAE,GAAGA,EAAM,WAAY,CAACmG,CAAQ,EAAGhQ,CAAA,CACxD,CAEA,eAAsBiQ,GACpBpG,EACAmG,EACAE,EACA,CACA,GAAI,GAACrG,EAAM,QAAU,CAACA,EAAM,WAC5B,CAAAA,EAAM,cAAgBmG,EACtBnG,EAAM,YAAc,KACpB,GAAI,CACF,MAAMA,EAAM,OAAO,QAAQ,gBAAiB,CAAE,SAAAmG,EAAU,QAAAE,EAAS,EACjE,MAAMJ,GAAWjG,CAAK,CACxB,OAAS9M,EAAK,CACZ8M,EAAM,YAAc,OAAO9M,CAAG,CAChC,QAAA,CACE8M,EAAM,cAAgB,IACxB,EACF,CAEA,eAAsBsG,GAAgBtG,EAAoBmG,EAAkB,CAC1E,GAAI,GAACnG,EAAM,QAAU,CAACA,EAAM,WAC5B,CAAAA,EAAM,cAAgBmG,EACtBnG,EAAM,YAAc,KACpB,GAAI,CACF,MAAMqC,EAASrC,EAAM,WAAWmG,CAAQ,GAAK,GAC7C,MAAMnG,EAAM,OAAO,QAAQ,gBAAiB,CAAE,SAAAmG,EAAU,OAAA9D,EAAQ,EAChE,MAAM4D,GAAWjG,CAAK,CACxB,OAAS9M,EAAK,CACZ8M,EAAM,YAAc,OAAO9M,CAAG,CAChC,QAAA,CACE8M,EAAM,cAAgB,IACxB,EACF,CAEA,eAAsBuG,GACpBvG,EACAlK,EACA0Q,EACA,CACA,GAAI,GAACxG,EAAM,QAAU,CAACA,EAAM,WAC5B,CAAAA,EAAM,cAAgBlK,EACtBkK,EAAM,YAAc,KACpB,GAAI,CACF,MAAMA,EAAM,OAAO,QAAQ,iBAAkB,CAC3C,KAAAlK,EACA,UAAA0Q,EACA,UAAW,IAAA,CACZ,EACD,MAAMP,GAAWjG,CAAK,CACxB,OAAS9M,EAAK,CACZ8M,EAAM,YAAc,OAAO9M,CAAG,CAChC,QAAA,CACE8M,EAAM,cAAgB,IACxB,EACF,CCjFA,eAAsByG,GACpBzG,EACAlN,EACA,CACA,GAAI,GAACkN,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,aACV,CAAAA,EAAM,aAAe,GAChBlN,GAAM,QAAOkN,EAAM,UAAY,MACpC,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,YAAa,EAAE,EAGvDA,EAAM,MAAQ,MAAM,QAAQrM,EAAI,KAAK,EAAIA,EAAI,MAAQ,CAAA,CACvD,OAAST,EAAK,CACPJ,GAAM,QAAOkN,EAAM,UAAY,OAAO9M,CAAG,EAChD,QAAA,CACE8M,EAAM,aAAe,EACvB,EACF,CCHA,eAAsB0G,EAAgB1G,EAAkB,CACtD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAC5B,CAAAA,EAAM,YAAc,GACpBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,eAAgB,CACtD,WAAYA,EAAM,WAClB,MAAO,GAAA,CACR,EACDA,EAAM,aAAe,MAAM,QAAQrM,EAAI,QAAQ,EAAIA,EAAI,SAAW,CAAA,EAClEqM,EAAM,kBAAoBrM,EAAI,eAAiB,IACjD,OAAST,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,YAAc,EACtB,EACF,CAEA,eAAsB2G,GAAS3G,EAAkB,CAC/C,GAAI,CAACA,EAAM,QAAU,CAACA,EAAM,UAAW,OACvC,MAAM4G,EAAM5G,EAAM,YAAY,KAAA,EAC9B,GAAI,CAAC4G,EAAK,OAEV5G,EAAM,YAAc,GACpBA,EAAM,YAAc,GACpBA,EAAM,UAAY,KAClB,MAAM6G,EAAQlU,GAAA,EACdqN,EAAM,UAAY6G,EAClB7G,EAAM,WAAa,GACnB,GAAI,CACF,MAAMA,EAAM,OAAO,QAAQ,YAAa,CACtC,WAAYA,EAAM,WAClB,QAAS4G,EACT,QAAS,GACT,eAAgBC,CAAA,CACjB,CACH,OAAS3T,EAAK,CACZ8M,EAAM,UAAY,KAClBA,EAAM,WAAa,KACnBA,EAAM,YAAc4G,EACpB5G,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,YAAc,EACtB,CACF,CAEO,SAAS8G,GACd9G,EACAH,EACA,CAGA,MAFI,CAACA,GACDA,EAAQ,aAAeG,EAAM,YAC7BH,EAAQ,OAASG,EAAM,WAAaH,EAAQ,QAAUG,EAAM,UACvD,MAELH,EAAQ,QAAU,QACpBG,EAAM,WAAa5F,GAAYyF,EAAQ,OAAO,GAAKG,EAAM,WAChDH,EAAQ,QAAU,SAC3BG,EAAM,WAAa,KACnBA,EAAM,UAAY,MACTH,EAAQ,QAAU,UAC3BG,EAAM,WAAa,KACnBA,EAAM,UAAY,KAClBA,EAAM,UAAYH,EAAQ,cAAgB,cAErCA,EAAQ,MACjB,CAEA,SAASzF,GAAYR,EAAiC,CACpD,MAAM1I,EAAI0I,EACJiB,EAAU3J,EAAE,QAClB,GAAI,OAAO2J,GAAY,SAAU,OAAOA,EACxC,GAAI,MAAM,QAAQA,CAAO,EAAG,CAC1B,MAAMxC,EAAQwC,EACX,IAAKpK,GAAM,CACV,MAAM+F,EAAO/F,EACb,OAAI+F,EAAK,OAAS,QAAU,OAAOA,EAAK,MAAS,SAAiBA,EAAK,KAChE,IACT,CAAC,EACA,OAAQxF,GAAmB,OAAOA,GAAM,QAAQ,EACnD,GAAIqH,EAAM,OAAS,EAAG,OAAOA,EAAM,KAAK;AAAA,CAAI,CAC9C,CACA,OAAI,OAAOnH,EAAE,MAAS,SAAiBA,EAAE,KAClC,IACT,CC5DA,eAAsB6V,EAAW/G,EAAoB,CACnD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAC5B,CAAAA,EAAM,cAAgB,GACtBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,aAAc,EAAE,EACxDgH,GAAoBhH,EAAOrM,CAAG,CAChC,OAAST,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,cAAgB,EACxB,EACF,CAEA,eAAsBiH,GAAiBjH,EAAoB,CACzD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,oBACV,CAAAA,EAAM,oBAAsB,GAC5B,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAC9B,gBACA,CAAA,CAAC,EAEHkH,GAAkBlH,EAAOrM,CAAG,CAC9B,OAAST,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,oBAAsB,EAC9B,EACF,CAEO,SAASkH,GACdlH,EACArM,EACA,CACAqM,EAAM,aAAerM,EAAI,QAAU,KACnCqM,EAAM,cAAgBrM,EAAI,SAAW,CAAA,EACrCqM,EAAM,oBAAsBrM,EAAI,SAAW,IAC7C,CAEO,SAASqT,GAAoBhH,EAAoBzB,EAA0B,CAChFyB,EAAM,eAAiBzB,EACnB,OAAOA,EAAS,KAAQ,SAC1ByB,EAAM,UAAYzB,EAAS,IAClBA,EAAS,QAAU,OAAOA,EAAS,QAAW,WACvDyB,EAAM,UAAY,GAAG,KAAK,UAAUzB,EAAS,OAAQ,KAAM,CAAC,EAAE,QAAA,CAAS;AAAA,GAEzEyB,EAAM,YAAc,OAAOzB,EAAS,OAAU,UAAYA,EAAS,MAAQ,KAC3EyB,EAAM,aAAe,MAAM,QAAQzB,EAAS,MAAM,EAAIA,EAAS,OAAS,CAAA,EAExE,MAAMgF,EAAShF,EAAS,QAAU,CAAA,EAC5BV,EAAY0F,EAAO,UAAY,CAAA,EAC/BzF,EAAWyF,EAAO,SAAW,CAAA,EAC7BvF,EAAUuF,EAAO,QAAU,CAAA,EAC3BtF,EAAYsF,EAAO,UAAY,CAAA,EAC/B4D,EAAUhR,GACd,MAAM,QAAQA,CAAK,EACfA,EACG,IAAKnF,GAAM,OAAOA,GAAK,EAAE,EAAE,KAAA,CAAM,EACjC,OAAQA,GAAMA,EAAE,OAAS,CAAC,EAC1B,KAAK,IAAI,EACZ,GACAoW,EACJvJ,EAAS,QAAU,OAAOA,EAAS,QAAW,SACzCA,EAAS,OACV,CAAA,EACAwJ,EACJD,EAAe,GAAG,GAAK,OAAOA,EAAe,GAAG,GAAM,SACjDA,EAAe,GAAG,EACnB,CAAA,EACAzD,EAAY,MAAM,QAAQ9F,EAAS,SAAS,EAC9CsJ,EAAOtJ,EAAS,SAAS,EACzB,OAAOA,EAAS,WAAc,SAC5BA,EAAS,UACT,GAENmC,EAAM,aAAe,CACnB,MAAO,OAAOnC,EAAS,UAAa,SAAWA,EAAS,SAAW,GACnE,eACE,OAAOwJ,EAAqB,gBAAmB,UAC3CA,EAAqB,eACrB,GACN,UAAA1D,EACA,MAAO,OAAO9F,EAAS,OAAU,SAAWA,EAAS,MAAQ,GAC7D,WAAY,OAAOA,EAAS,YAAe,SAAWA,EAAS,WAAa,GAC5E,cACE,OAAOA,EAAS,eAAkB,SAAWA,EAAS,cAAgB,GACxE,YAAa,OAAOA,EAAS,aAAgB,SAAWA,EAAS,YAAc,EAAA,EAGjF,MAAMyJ,EAAaxJ,EAAQ,IAAM,CAAA,EAC3BkH,EAASlH,EAAQ,cAAgB,CAAA,EACjCyJ,EAAkBzJ,EAAQ,SAAW,CAAA,EACrC0J,EAAgB1J,EAAQ,OACxB2J,EAAczQ,GAClB,OAAOuQ,EAAevQ,CAAG,GAAM,UAC1BuQ,EAAevQ,CAAG,EACnBwL,GAAsBxL,CAAG,EAC/BgJ,EAAM,YAAc,CAClB,QAAS,OAAOlC,EAAQ,SAAY,UAAYA,EAAQ,QAAU,GAClE,MAAO,OAAOA,EAAQ,OAAU,SAAWA,EAAQ,MAAQ,GAC3D,UAAW,OAAOwJ,EAAU,SAAY,UAAYA,EAAU,QAAU,GACxE,UAAWH,EAAOG,EAAU,SAAS,EACrC,aACE,OAAOA,EAAU,cAAiB,UAAYA,EAAU,aAAe,GACzE,cAAeH,EAAOG,EAAU,aAAa,EAC7C,WACE,OAAOxJ,EAAQ,YAAe,SAAW,OAAOA,EAAQ,UAAU,EAAI,GACxE,aACE,OAAOA,EAAQ,cAAiB,SAAW,OAAOA,EAAQ,YAAY,EAAI,GAC5E,eACE,OAAOA,EAAQ,gBAAmB,SAC9B,OAAOA,EAAQ,cAAc,EAC7B,GACN,YACEA,EAAQ,cAAgB,SAAWA,EAAQ,cAAgB,MACvDA,EAAQ,YACR,MACN,OAAQ,MAAM,QAAQ0J,CAAa,EAC/B,CAAA,EACA,OAAOA,GAAkB,UAAYA,EACnC,OAAO,QAAQA,CAAwC,EAAE,IACvD,CAAC,CAACxQ,EAAKb,CAAK,IAAwB,CAClC,MAAM4C,EACJ5C,GAAS,OAAOA,GAAU,SACrBA,EACD,CAAA,EACAuR,EACJ3O,EAAM,UAAY,OAAOA,EAAM,UAAa,SACvCA,EAAM,SACP,CAAA,EACA+F,GAAW,OAAO,QAAQ4I,CAAW,EAAE,IAC3C,CAAC,CAAC9C,EAAY+C,EAAY,IAA+B,CACvD,MAAM/I,GACJ+I,IAAgB,OAAOA,IAAiB,SACnCA,GACD,CAAA,EACN,MAAO,CACL,IAAK/C,EACL,MACE,OAAOhG,GAAQ,OAAU,UAAYA,GAAQ,MAAQ,GACvD,eACE,OAAOA,GAAQ,gBAAmB,UAC9BA,GAAQ,eACR,EAAA,CAEV,CAAA,EAEF,MAAO,CACL,IAAA5H,EACA,KAAM,OAAO+B,EAAM,MAAS,SAAWA,EAAM,KAAO,GACpD,eACE,OAAOA,EAAM,gBAAmB,UAC5BA,EAAM,eACN,GACN,sBACEA,EAAM,wBAA0B,OAChCA,EAAM,wBAA0B,OAChCA,EAAM,wBAA0B,OAChCA,EAAM,wBAA0B,YAC5BA,EAAM,sBACN,MACN,MAAOoO,EAAOpO,EAAM,KAAK,EACzB,SAAA+F,EAAA,CAEJ,CAAA,EAEF,CAAA,EACN,QAAS,CACP,UAAW2I,EAAW,WAAW,EACjC,SAAUA,EAAW,UAAU,EAC/B,MAAOA,EAAW,OAAO,EACzB,YAAaA,EAAW,aAAa,EACrC,SAAUA,EAAW,UAAU,EAC/B,QAASA,EAAW,SAAS,EAC7B,KAAMA,EAAW,MAAM,EACvB,OAAQA,EAAW,QAAQ,EAC3B,WAAYA,EAAW,YAAY,EACnC,SAAUA,EAAW,UAAU,EAC/B,YAAaA,EAAW,aAAa,EACrC,YAAaA,EAAW,aAAa,EACrC,OAAQA,EAAW,QAAQ,EAC3B,MAAOA,EAAW,OAAO,EACzB,WAAYA,EAAW,YAAY,CAAA,EAErC,aAAc,OAAOzC,EAAM,SAAY,UAAYA,EAAM,QAAU,GACnE,UAAW,OAAOA,EAAM,MAAS,SAAWA,EAAM,KAAO,GACzD,mBACE,OAAOA,EAAM,eAAkB,SAAWA,EAAM,cAAgB,GAClE,eACE,OAAOA,EAAM,WAAc,UAAYA,EAAM,UAAY,EAAA,EAG7D,MAAM4C,EAAW,MAAM,IAAM,CAAA,EACvBC,EAAgB,MAAM,SACtBC,EAAc,MAAM,cAAgB,CAAA,EACpCC,EACH,MAAM,SAAW,CAAA,EACpB/H,EAAM,UAAY,CAChB,QAAS,OAAO,MAAM,SAAY,UAAY,MAAM,QAAU,GAC9D,SAAU,OAAO,MAAM,UAAa,SAAW,MAAM,SAAW,GAChE,SAAU,OAAO,MAAM,UAAa,SAAW,MAAM,SAAW,GAChE,UAAW,OAAO4H,EAAQ,SAAY,UAAYA,EAAQ,QAAU,GACpE,UAAWT,EAAOS,EAAQ,SAAS,EACnC,aACE,OAAOA,EAAQ,cAAiB,UAAYA,EAAQ,aAAe,GACrE,cAAeT,EAAOS,EAAQ,aAAa,EAC3C,WACE,OAAO,MAAM,YAAe,SAAW,OAAO,MAAM,UAAU,EAAI,GACpE,eACE,OAAO,MAAM,gBAAmB,SAC5B,OAAO,MAAM,cAAc,EAC3B,GACN,sBACE,MAAM,wBAA0B,OAChC,MAAM,wBAA0B,OAChC,MAAM,wBAA0B,YAC5B,MAAM,sBACN,MACN,kBAAmBT,EAAO,MAAM,iBAAiB,EACjD,aACE,OAAOW,EAAW,SAAY,UAAYA,EAAW,QAAU,GACjE,UAAW,OAAOA,EAAW,MAAS,SAAWA,EAAW,KAAO,GACnE,mBACE,OAAOA,EAAW,eAAkB,SAChCA,EAAW,cACX,GACN,eACE,OAAOA,EAAW,WAAc,UAAYA,EAAW,UAAY,GACrE,QAAS,CACP,GAAGrF,EACH,UACE,OAAOsF,EAAa,WAAc,UAC9BA,EAAa,UACbtF,EAAoB,UAC1B,SACE,OAAOsF,EAAa,UAAa,UAC7BA,EAAa,SACbtF,EAAoB,SAC1B,KACE,OAAOsF,EAAa,MAAS,UACzBA,EAAa,KACbtF,EAAoB,KAC1B,WACE,OAAOsF,EAAa,YAAe,UAC/BA,EAAa,WACbtF,EAAoB,WAC1B,UACE,OAAOsF,EAAa,WAAc,UAC9BA,EAAa,UACbtF,EAAoB,SAAA,EAE5B,SAAU,MAAM,QAAQoF,CAAa,EACjC,CAAA,EACA,OAAOA,GAAkB,UAAYA,EACnC,OAAO,QAAQA,CAAwC,EAAE,IACvD,CAAC,CAAC7Q,EAAKb,CAAK,IAAwB,CAClC,MAAM4C,EACJ5C,GAAS,OAAOA,GAAU,SACrBA,EACD,CAAA,EACN,MAAO,CACL,IAAAa,EACA,MACE,OAAO+B,EAAM,OAAU,UAAYA,EAAM,MAAQ,GACnD,eACE,OAAOA,EAAM,gBAAmB,UAC5BA,EAAM,eACN,EAAA,CAEV,CAAA,EAEF,CAAA,CAAC,EAGTiH,EAAM,WAAa,CACjB,QAAS,OAAOhC,EAAO,SAAY,UAAYA,EAAO,QAAU,GAChE,QAAS,OAAOA,EAAO,SAAY,SAAWA,EAAO,QAAU,GAC/D,QAAS,OAAOA,EAAO,SAAY,SAAWA,EAAO,QAAU,GAC/D,SAAU,OAAOA,EAAO,UAAa,SAAWA,EAAO,SAAW,GAClE,SAAU,OAAOA,EAAO,UAAa,SAAW,OAAOA,EAAO,QAAQ,EAAI,GAC1E,QAAS,OAAOA,EAAO,SAAY,SAAWA,EAAO,QAAU,GAC/D,UAAW,OAAOA,EAAO,WAAc,UAAYA,EAAO,UAAY,GACtE,YACEA,EAAO,cAAgB,YAAcA,EAAO,cAAgB,SACxDA,EAAO,YACP,GACN,kBACE,OAAOA,EAAO,mBAAsB,UAAYA,EAAO,kBAAoB,GAC7E,cACE,OAAOA,EAAO,eAAkB,UAAYA,EAAO,cAAgB,GACrE,iBACE,OAAOA,EAAO,kBAAqB,UAAYA,EAAO,iBAAmB,GAC3E,UAAWmJ,EAAOnJ,EAAO,SAAS,EAClC,WACE,OAAOA,EAAO,YAAe,SAAW,OAAOA,EAAO,UAAU,EAAI,EAAA,EAGxEgC,EAAM,aAAe,CACnB,QAAS,OAAO/B,EAAS,SAAY,UAAYA,EAAS,QAAU,GACpE,QAAS,OAAOA,EAAS,SAAY,SAAWA,EAAS,QAAU,GACnE,OAAQ,OAAOA,EAAS,QAAW,SAAWA,EAAS,OAAS,GAChE,QACEA,EAAS,UAAY,YACrBA,EAAS,UAAY,OACrBA,EAAS,UAAY,OACjBA,EAAS,QACT,OACN,OAAQ,OAAOA,EAAS,QAAW,SAAWA,EAAS,OAAS,GAChE,UAAWkJ,EAAOlJ,EAAS,SAAS,EACpC,mBACE,OAAOA,EAAS,oBAAuB,UACnCA,EAAS,mBACT,GACN,WACE,OAAOA,EAAS,YAAe,SAAW,OAAOA,EAAS,UAAU,EAAI,EAAA,EAG5E,MAAM+J,EAAgBzJ,EAAS,QAAU,GAAQ,kBAAoB,KACrEyB,EAAM,qBAAuBgI,EAC7BhI,EAAM,oBAAsBgI,EAC5BhI,EAAM,kBAAoBgI,EAC1BhI,EAAM,mBAAqBgI,EAC3BhI,EAAM,qBAAuBgI,EAExBhI,EAAM,kBACTA,EAAM,WAAaiI,GAAkB1J,EAAS,QAAU,CAAA,CAAE,EAE9D,CAEA,eAAsB2J,GAAWlI,EAAoB,CACnD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAC5B,CAAAA,EAAM,aAAe,GACrBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAM1M,EACJ0M,EAAM,iBAAmB,QAAUA,EAAM,WACrC,GAAG,KAAK,UAAUA,EAAM,WAAY,KAAM,CAAC,EAAE,SAAS;AAAA,EACtDA,EAAM,UACZ,MAAMA,EAAM,OAAO,QAAQ,aAAc,CAAE,IAAA1M,EAAK,EAChD0M,EAAM,gBAAkB,GACxB,MAAM+G,EAAW/G,CAAK,CACxB,OAAS9M,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,aAAe,EACvB,EACF,CAEO,SAASmI,GACdnI,EACAtL,EACAyB,EACA,CACA,MAAMtB,EAAOoT,GAAkBjI,EAAM,YAAc,CAAA,CAAE,EACrDoI,GAAavT,EAAMH,EAAMyB,CAAK,EAC9B6J,EAAM,WAAanL,EACnBmL,EAAM,gBAAkB,EAC1B,CAYA,SAASiI,GAAqB9R,EAAa,CACzC,OAAI,OAAO,iBAAoB,WACtB,gBAAgBA,CAAK,EAEvB,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,CACzC,CAEA,SAASiS,GACPC,EACA3T,EACAyB,EACA,CACA,GAAIzB,EAAK,SAAW,EAAG,OACvB,IAAIkC,EAA+CyR,EACnD,QAAShY,EAAI,EAAGA,EAAIqE,EAAK,OAAS,EAAGrE,GAAK,EAAG,CAC3C,MAAM2G,EAAMtC,EAAKrE,CAAC,EACZiY,EAAU5T,EAAKrE,EAAI,CAAC,EAC1B,GAAI,OAAO2G,GAAQ,SAAU,CAC3B,GAAI,CAAC,MAAM,QAAQJ,CAAO,EAAG,OACzBA,EAAQI,CAAG,GAAK,OAClBJ,EAAQI,CAAG,EACT,OAAOsR,GAAY,SAAW,CAAA,EAAM,CAAA,GAExC1R,EAAUA,EAAQI,CAAG,CACvB,KAAO,CACL,GAAI,OAAOJ,GAAY,UAAYA,GAAW,KAAM,OACpD,MAAMO,EAASP,EACXO,EAAOH,CAAG,GAAK,OACjBG,EAAOH,CAAG,EACR,OAAOsR,GAAY,SAAW,CAAA,EAAM,CAAA,GAExC1R,EAAUO,EAAOH,CAAG,CACtB,CACF,CACA,MAAMuR,EAAU7T,EAAKA,EAAK,OAAS,CAAC,EACpC,GAAI,OAAO6T,GAAY,SAAU,CAC3B,MAAM,QAAQ3R,CAAO,IACvBA,EAAQ2R,CAAO,EAAIpS,GAErB,MACF,CACI,OAAOS,GAAY,UAAYA,GAAW,OAC3CA,EAAoC2R,CAAO,EAAIpS,EAEpD,CC7bA,eAAsBqS,EAAexI,EAAkB,CACrD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAC5B,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,cAAe,EAAE,EACzDA,EAAM,WAAarM,CACrB,OAAST,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,CACF,CAEA,eAAsBuV,GAAazI,EAAkB,CACnD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,YACV,CAAAA,EAAM,YAAc,GACpBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,YAAa,CACnD,gBAAiB,EAAA,CAClB,EACDA,EAAM,SAAW,MAAM,QAAQrM,EAAI,IAAI,EAAIA,EAAI,KAAO,CAAA,CACxD,OAAST,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,YAAc,EACtB,EACF,CAEO,SAAS0I,GAAkBlI,EAAqB,CACrD,GAAIA,EAAK,eAAiB,KAAM,CAC9B,MAAM1D,EAAK,KAAK,MAAM0D,EAAK,UAAU,EACrC,GAAI,CAAC,OAAO,SAAS1D,CAAE,EAAG,MAAM,IAAI,MAAM,mBAAmB,EAC7D,MAAO,CAAE,KAAM,KAAe,KAAMA,CAAA,CACtC,CACA,GAAI0D,EAAK,eAAiB,QAAS,CACjC,MAAMmI,EAASpL,GAASiD,EAAK,YAAa,CAAC,EAC3C,GAAImI,GAAU,EAAG,MAAM,IAAI,MAAM,0BAA0B,EAC3D,MAAMC,EAAOpI,EAAK,UAElB,MAAO,CAAE,KAAM,QAAkB,QAASmI,GAD7BC,IAAS,UAAY,IAASA,IAAS,QAAU,KAAY,MACvB,CACrD,CACA,MAAMC,EAAOrI,EAAK,SAAS,KAAA,EAC3B,GAAI,CAACqI,EAAM,MAAM,IAAI,MAAM,2BAA2B,EACtD,MAAO,CAAE,KAAM,OAAiB,KAAAA,EAAM,GAAIrI,EAAK,OAAO,KAAA,GAAU,MAAA,CAClE,CAEO,SAASsI,GAAiBtI,EAAqB,CACpD,GAAIA,EAAK,cAAgB,cAAe,CACtC,MAAMjG,EAAOiG,EAAK,YAAY,KAAA,EAC9B,GAAI,CAACjG,EAAM,MAAM,IAAI,MAAM,6BAA6B,EACxD,MAAO,CAAE,KAAM,cAAwB,KAAAA,CAAA,CACzC,CACA,MAAMX,EAAU4G,EAAK,YAAY,KAAA,EACjC,GAAI,CAAC5G,EAAS,MAAM,IAAI,MAAM,yBAAyB,EACvD,MAAMiG,EAOF,CAAE,KAAM,YAAa,QAAAjG,CAAA,EACrB4G,EAAK,UAASX,EAAQ,QAAU,IAChCW,EAAK,UAASX,EAAQ,QAAUW,EAAK,SACrCA,EAAK,GAAG,KAAA,MAAgB,GAAKA,EAAK,GAAG,KAAA,GACzC,MAAMuI,EAAiBxL,GAASiD,EAAK,eAAgB,CAAC,EACtD,OAAIuI,EAAiB,IAAGlJ,EAAQ,eAAiBkJ,GAC1ClJ,CACT,CAEA,eAAsBmJ,GAAWhJ,EAAkB,CACjD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAAaA,EAAM,UAC/C,CAAAA,EAAM,SAAW,GACjBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAMiJ,EAAWP,GAAkB1I,EAAM,QAAQ,EAC3CH,EAAUiJ,GAAiB9I,EAAM,QAAQ,EACzCD,EAAM,CACV,KAAMC,EAAM,SAAS,KAAK,KAAA,EAC1B,YAAaA,EAAM,SAAS,YAAY,QAAU,OAClD,QAASA,EAAM,SAAS,QACxB,SAAAiJ,EACA,cAAejJ,EAAM,SAAS,cAC9B,SAAUA,EAAM,SAAS,SACzB,QAAAH,EACA,UACEG,EAAM,SAAS,iBAAiB,KAAA,GAChCA,EAAM,SAAS,gBAAkB,WAC7B,CAAE,iBAAkBA,EAAM,SAAS,iBAAiB,KAAA,GACpD,MAAA,EAER,GAAI,CAACD,EAAI,KAAM,MAAM,IAAI,MAAM,gBAAgB,EAC/C,MAAMC,EAAM,OAAO,QAAQ,WAAYD,CAAG,EAC1CC,EAAM,SAAW,CACf,GAAGA,EAAM,SACT,KAAM,GACN,YAAa,GACb,YAAa,EAAA,EAEf,MAAMyI,GAAazI,CAAK,EACxB,MAAMwI,EAAexI,CAAK,CAC5B,OAAS9M,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,SAAW,EACnB,EACF,CAEA,eAAsBkJ,GACpBlJ,EACAD,EACAsG,EACA,CACA,GAAI,GAACrG,EAAM,QAAU,CAACA,EAAM,WAAaA,EAAM,UAC/C,CAAAA,EAAM,SAAW,GACjBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAMA,EAAM,OAAO,QAAQ,cAAe,CAAE,GAAID,EAAI,GAAI,MAAO,CAAE,QAAAsG,CAAA,CAAQ,CAAG,EAC5E,MAAMoC,GAAazI,CAAK,EACxB,MAAMwI,EAAexI,CAAK,CAC5B,OAAS9M,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,SAAW,EACnB,EACF,CAEA,eAAsBmJ,GAAWnJ,EAAkBD,EAAc,CAC/D,GAAI,GAACC,EAAM,QAAU,CAACA,EAAM,WAAaA,EAAM,UAC/C,CAAAA,EAAM,SAAW,GACjBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAMA,EAAM,OAAO,QAAQ,WAAY,CAAE,GAAID,EAAI,GAAI,KAAM,QAAS,EACpE,MAAMqJ,GAAapJ,EAAOD,EAAI,EAAE,CAClC,OAAS7M,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,SAAW,EACnB,EACF,CAEA,eAAsBqJ,GAAcrJ,EAAkBD,EAAc,CAClE,GAAI,GAACC,EAAM,QAAU,CAACA,EAAM,WAAaA,EAAM,UAC/C,CAAAA,EAAM,SAAW,GACjBA,EAAM,UAAY,KAClB,GAAI,CACF,MAAMA,EAAM,OAAO,QAAQ,cAAe,CAAE,GAAID,EAAI,GAAI,EACpDC,EAAM,gBAAkBD,EAAI,KAC9BC,EAAM,cAAgB,KACtBA,EAAM,SAAW,CAAA,GAEnB,MAAMyI,GAAazI,CAAK,EACxB,MAAMwI,EAAexI,CAAK,CAC5B,OAAS9M,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,QAAA,CACE8M,EAAM,SAAW,EACnB,EACF,CAEA,eAAsBoJ,GAAapJ,EAAkBsJ,EAAe,CAClE,GAAI,GAACtJ,EAAM,QAAU,CAACA,EAAM,WAC5B,GAAI,CACF,MAAMrM,EAAO,MAAMqM,EAAM,OAAO,QAAQ,YAAa,CACnD,GAAIsJ,EACJ,MAAO,EAAA,CACR,EACDtJ,EAAM,cAAgBsJ,EACtBtJ,EAAM,SAAW,MAAM,QAAQrM,EAAI,OAAO,EAAIA,EAAI,QAAU,CAAA,CAC9D,OAAST,EAAK,CACZ8M,EAAM,UAAY,OAAO9M,CAAG,CAC9B,CACF,CC5KA,eAAsBqW,GAAUvJ,EAAmB,CACjD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,YACxB,CAAAA,EAAM,aACV,CAAAA,EAAM,aAAe,GACrB,GAAI,CACF,KAAM,CAACwJ,EAAQC,EAAQC,EAAQC,CAAS,EAAI,MAAM,QAAQ,IAAI,CAC5D3J,EAAM,OAAO,QAAQ,SAAU,CAAA,CAAE,EACjCA,EAAM,OAAO,QAAQ,SAAU,CAAA,CAAE,EACjCA,EAAM,OAAO,QAAQ,cAAe,CAAA,CAAE,EACtCA,EAAM,OAAO,QAAQ,iBAAkB,CAAA,CAAE,CAAA,CAC1C,EACDA,EAAM,YAAcwJ,EACpBxJ,EAAM,YAAcyJ,EACpB,MAAMG,EAAeF,EACrB1J,EAAM,YAAc,MAAM,QAAQ4J,GAAc,MAAM,EAClDA,GAAc,OACd,CAAA,EACJ5J,EAAM,eAAiB2J,CACzB,OAASzW,EAAK,CACZ8M,EAAM,eAAiB,OAAO9M,CAAG,CACnC,QAAA,CACE8M,EAAM,aAAe,EACvB,EACF,CAEA,eAAsB6J,GAAgB7J,EAAmB,CACvD,GAAI,GAACA,EAAM,QAAU,CAACA,EAAM,WAC5B,CAAAA,EAAM,eAAiB,KACvBA,EAAM,gBAAkB,KACxB,GAAI,CACF,MAAM5M,EAAS4M,EAAM,gBAAgB,KAAA,EAChC,KAAK,MAAMA,EAAM,eAAe,EACjC,CAAA,EACErM,EAAM,MAAMqM,EAAM,OAAO,QAAQA,EAAM,gBAAgB,KAAA,EAAQ5M,CAAM,EAC3E4M,EAAM,gBAAkB,KAAK,UAAUrM,EAAK,KAAM,CAAC,CACrD,OAAST,EAAK,CACZ8M,EAAM,eAAiB,OAAO9M,CAAG,CACnC,EACF,CC8HO,SAAS4W,GAAU9J,EAAqB,CAC7C,MAAM+J,EAAgB/J,EAAM,gBAAgB,OACtCgK,EAAgBhK,EAAM,gBAAgB,OAAS,KAC/CiK,EAAWjK,EAAM,YAAY,cAAgB,KAC7CkK,EAAyBlK,EAAM,MAAM,KAAM9P,GAAM,CACrD,GAAI,CAASA,EAAE,UAAY,MAAO,GAClC,MAAMO,EAAI,OAAOP,EAAE,UAAa,SAAWA,EAAE,SAAS,KAAA,EAAO,YAAA,EAAgB,GAC7E,OAAOO,EAAE,WAAW,KAAK,GAAKA,EAAE,WAAW,QAAQ,GAAKA,EAAE,WAAW,SAAS,CAChF,CAAC,EACK0Z,EAAsBnK,EAAM,UAE9BkK,EACE,KACA,gEAHF,6BAKJ,OAAOpR;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,qCAS4BkH,EAAM,UAAY,KAAO,EAAE;AAAA;AAAA,iCAE/BA,EAAM,UAAY,KAAO,SAAS;AAAA;AAAA,YAEvDoK,GAAkBpK,CAAK,CAAC;AAAA;AAAA;AAAA;AAAA,UAI1B1L,GAAW,IACV+V,GAAUvR;AAAAA;AAAAA,uCAEkBuR,EAAM,KAAK;AAAA,gBAClCA,EAAM,KAAK,IAAK5V,GAAQ6V,GAAUtK,EAAOvL,CAAG,CAAC,CAAC;AAAA;AAAA,WAAA,CAGrD;AAAA;AAAA;AAAA;AAAA;AAAA,sCAK6Bc,GAAYyK,EAAM,GAAG,CAAC;AAAA,oCACxBxK,GAAewK,EAAM,GAAG,CAAC;AAAA;AAAA;AAAA,cAG/CA,EAAM,UACJlH,6BAAgCkH,EAAM,SAAS,SAC/ChH,CAAO;AAAA;AAAA;AAAA;AAAA,UAIbgH,EAAM,MAAQ,WACZkB,GAAe,CACb,UAAWlB,EAAM,UACjB,MAAOA,EAAM,MACb,SAAUA,EAAM,SAChB,SAAUA,EAAM,SAChB,UAAWA,EAAM,UACjB,cAAA+J,EACA,cAAAC,EACA,YAAahK,EAAM,YAAY,SAAW,KAC1C,SAAAiK,EACA,qBAAsBjK,EAAM,qBAC5B,iBAAmB3L,GAAS2L,EAAM,cAAc3L,CAAI,EACpD,iBAAmBA,GAAU2L,EAAM,SAAW3L,EAC9C,mBAAqBA,GAAS,CAC5B2L,EAAM,WAAa3L,EACnB2L,EAAM,YAAc,GACpBA,EAAM,gBAAA,EACNA,EAAM,cAAc,CAAE,GAAGA,EAAM,SAAU,WAAY3L,EAAM,CAC7D,EACA,UAAW,IAAM2L,EAAM,aAAA,CAAa,CACrC,EACDhH,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,cACZrC,GAAkB,CAChB,UAAWqC,EAAM,UACjB,QAASA,EAAM,iBACf,SAAUA,EAAM,kBAChB,UAAWA,EAAM,eACjB,cAAeA,EAAM,qBACrB,gBAAiBA,EAAM,qBACvB,kBAAmBA,EAAM,uBACzB,kBAAmBA,EAAM,uBACzB,aAAcA,EAAM,aACpB,aAAcA,EAAM,aACpB,oBAAqBA,EAAM,oBAC3B,eAAgBA,EAAM,eACtB,eAAgBA,EAAM,qBACtB,YAAaA,EAAM,YACnB,mBAAoBA,EAAM,mBAC1B,cAAeA,EAAM,cACrB,cAAeA,EAAM,oBACrB,UAAWA,EAAM,UACjB,iBAAkBA,EAAM,iBACxB,oBAAqBA,EAAM,oBAC3B,YAAaA,EAAM,YACnB,YAAaA,EAAM,kBACnB,WAAYA,EAAM,WAClB,aAAcA,EAAM,aACpB,aAAcA,EAAM,mBACpB,aAAcA,EAAM,aACpB,eAAgBA,EAAM,eACtB,eAAgBA,EAAM,qBACtB,UAAY2C,GAAUD,EAAc1C,EAAO2C,CAAK,EAChD,gBAAkBE,GAAU7C,EAAM,oBAAoB6C,CAAK,EAC3D,eAAgB,IAAM7C,EAAM,mBAAA,EAC5B,iBAAkB,IAAMA,EAAM,qBAAA,EAC9B,iBAAmBiD,GAAUD,GAAmBhD,EAAOiD,CAAK,EAC5D,eAAgB,IAAMjD,EAAM,mBAAA,EAC5B,gBAAkBiD,GAAUC,GAAkBlD,EAAOiD,CAAK,EAC1D,cAAe,IAAMjD,EAAM,kBAAA,EAC3B,cAAgBiD,GAAUE,GAAgBnD,EAAOiD,CAAK,EACtD,YAAa,IAAMjD,EAAM,gBAAA,EACzB,eAAiBiD,GAAUG,GAAiBpD,EAAOiD,CAAK,EACxD,aAAc,IAAMjD,EAAM,iBAAA,EAC1B,iBAAmBiD,GAAUI,GAAmBrD,EAAOiD,CAAK,EAC5D,eAAgB,IAAMjD,EAAM,mBAAA,CAAmB,CAChD,EACDhH,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,YACZU,GAAgB,CACd,QAASV,EAAM,gBACf,QAASA,EAAM,gBACf,UAAWA,EAAM,cACjB,cAAeA,EAAM,eACrB,UAAW,IAAM6F,GAAa7F,CAAK,CAAA,CACpC,EACDhH,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,WACZuB,GAAe,CACb,QAASvB,EAAM,gBACf,OAAQA,EAAM,eACd,MAAOA,EAAM,cACb,cAAeA,EAAM,qBACrB,MAAOA,EAAM,oBACb,cAAeA,EAAM,sBACrB,eAAgBA,EAAM,uBACtB,gBAAkB3L,GAAS,CACzB2L,EAAM,qBAAuB3L,EAAK,cAClC2L,EAAM,oBAAsB3L,EAAK,MACjC2L,EAAM,sBAAwB3L,EAAK,cACnC2L,EAAM,uBAAyB3L,EAAK,cACtC,EACA,UAAW,IAAMyR,EAAa9F,CAAK,EACnC,QAAS,CAAChJ,EAAKiM,IAAU+C,GAAahG,EAAOhJ,EAAKiM,CAAK,CAAA,CACxD,EACDjK,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,OACZI,GAAW,CACT,QAASJ,EAAM,YACf,OAAQA,EAAM,WACd,KAAMA,EAAM,SACZ,MAAOA,EAAM,UACb,KAAMA,EAAM,SACZ,KAAMA,EAAM,SACZ,UAAWA,EAAM,cACjB,KAAMA,EAAM,SACZ,aAAeiD,GAAWjD,EAAM,SAAW,CAAE,GAAGA,EAAM,SAAU,GAAGiD,CAAA,EACnE,UAAW,IAAMjD,EAAM,SAAA,EACvB,MAAO,IAAMgJ,GAAWhJ,CAAK,EAC7B,SAAU,CAACD,EAAKsG,IAAY6C,GAAclJ,EAAOD,EAAKsG,CAAO,EAC7D,MAAQtG,GAAQoJ,GAAWnJ,EAAOD,CAAG,EACrC,SAAWA,GAAQsJ,GAAcrJ,EAAOD,CAAG,EAC3C,WAAauJ,GAAUF,GAAapJ,EAAOsJ,CAAK,CAAA,CACjD,EACDtQ,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,SACZ8B,GAAa,CACX,QAAS9B,EAAM,cACf,OAAQA,EAAM,aACd,MAAOA,EAAM,YACb,OAAQA,EAAM,aACd,MAAOA,EAAM,WACb,QAASA,EAAM,cACf,eAAiB3L,GAAU2L,EAAM,aAAe3L,EAChD,UAAW,IAAM4R,GAAWjG,CAAK,EACjC,SAAU,CAAChJ,EAAKqP,IAAYD,GAAmBpG,EAAOhJ,EAAKqP,CAAO,EAClE,OAAQ,CAACrP,EAAKb,IAAU+P,GAAgBlG,EAAOhJ,EAAKb,CAAK,EACzD,UAAYa,GAAQsP,GAAgBtG,EAAOhJ,CAAG,EAC9C,UAAW,CAAClB,EAAM0Q,IAAcD,GAAavG,EAAOlK,EAAM0Q,CAAS,CAAA,CACpE,EACDxN,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,QACZa,GAAY,CACV,QAASb,EAAM,aACf,MAAOA,EAAM,MACb,UAAW,IAAMyG,GAAUzG,CAAK,CAAA,CACjC,EACDhH,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,OACZzH,GAAW,CACT,WAAYyH,EAAM,WAClB,mBAAqB3L,GAAS,CAC5B2L,EAAM,WAAa3L,EACnB2L,EAAM,YAAc,GACpBA,EAAM,WAAa,KACnBA,EAAM,UAAY,KAClBA,EAAM,gBAAA,EACNA,EAAM,cAAc,CAAE,GAAGA,EAAM,SAAU,WAAY3L,EAAM,EACtDqS,EAAgB1G,CAAK,CAC5B,EACA,cAAeA,EAAM,kBACrB,QAASA,EAAM,YACf,QAASA,EAAM,YACf,SAAU,CAAC,GAAGA,EAAM,aAAc,GAAGA,EAAM,gBAAgB,EAC3D,OAAQA,EAAM,WACd,MAAOA,EAAM,YACb,UAAWA,EAAM,UACjB,QAASA,EAAM,WAAakK,EAC5B,eAAgBC,EAChB,SAAUnK,EAAM,eAChB,UAAW,KACTA,EAAM,gBAAA,EACC0G,EAAgB1G,CAAK,GAE9B,cAAgB3L,GAAU2L,EAAM,YAAc3L,EAC9C,OAAQ,IAAM2L,EAAM,eAAA,CAAe,CACpC,EACDhH,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,SACZrD,GAAa,CACX,IAAKqD,EAAM,UACX,MAAOA,EAAM,YACb,OAAQA,EAAM,aACd,QAASA,EAAM,cACf,OAAQA,EAAM,aACd,UAAWA,EAAM,UACjB,OAAQA,EAAM,aACd,cAAeA,EAAM,oBACrB,QAASA,EAAM,cACf,SAAUA,EAAM,eAChB,UAAWA,EAAM,WACjB,YAAc3L,GAAU2L,EAAM,UAAY3L,EAC1C,iBAAmB8K,GAAUa,EAAM,eAAiBb,EACpD,YAAa,CAACzK,EAAMyB,IAAUgS,GAAsBnI,EAAOtL,EAAMyB,CAAK,EACtE,SAAU,IAAM4Q,EAAW/G,CAAK,EAChC,OAAQ,IAAMkI,GAAWlI,CAAK,CAAA,CAC/B,EACDhH,CAAO;AAAA;AAAA,UAETgH,EAAM,MAAQ,QACZS,GAAY,CACV,QAAST,EAAM,aACf,OAAQA,EAAM,YACd,OAAQA,EAAM,YACd,OAAQA,EAAM,YACd,UAAWA,EAAM,eACjB,SAAUA,EAAM,SAChB,WAAYA,EAAM,gBAClB,WAAYA,EAAM,gBAClB,WAAYA,EAAM,gBAClB,UAAWA,EAAM,eACjB,mBAAqB3L,GAAU2L,EAAM,gBAAkB3L,EACvD,mBAAqBA,GAAU2L,EAAM,gBAAkB3L,EACvD,UAAW,IAAMkV,GAAUvJ,CAAK,EAChC,OAAQ,IAAM6J,GAAgB7J,CAAK,CAAA,CACpC,EACDhH,CAAO;AAAA;AAAA;AAAA,GAInB,CAEA,SAASsR,GAAUtK,EAAqBvL,EAAU,CAChD,MAAM8V,EAAOvV,GAAWP,EAAKuL,EAAM,QAAQ,EAC3C,OAAOlH;AAAAA;AAAAA,aAEIyR,CAAI;AAAA,wBACOvK,EAAM,MAAQvL,EAAM,SAAW,EAAE;AAAA,eACzC+V,GAAsB,CAE5BA,EAAM,kBACNA,EAAM,SAAW,GACjBA,EAAM,SACNA,EAAM,SACNA,EAAM,UACNA,EAAM,SAIRA,EAAM,eAAA,EACNxK,EAAM,OAAOvL,CAAG,EAClB,CAAC;AAAA;AAAA,cAEOc,GAAYd,CAAG,CAAC;AAAA;AAAA,GAG9B,CAEA,MAAMgW,GAA2B,CAAC,SAAU,QAAS,MAAM,EAE3D,SAASL,GAAkBpK,EAAqB,CAC9C,MAAM3D,EAAQ,KAAK,IAAI,EAAGoO,GAAY,QAAQzK,EAAM,KAAK,CAAC,EACpD0K,EAAcrW,GAAqBmW,GAAsB,CAE7D,MAAMG,EAAkC,CAAE,QAD1BH,EAAM,aACoB,GACtCA,EAAM,SAAWA,EAAM,WACzBG,EAAQ,eAAiBH,EAAM,QAC/BG,EAAQ,eAAiBH,EAAM,SAEjCxK,EAAM,SAAS3L,EAAMsW,CAAO,CAC9B,EAEA,OAAO7R;AAAAA,sDAC6CuD,CAAK;AAAA;AAAA;AAAA;AAAA,wCAInB2D,EAAM,QAAU,SAAW,SAAW,EAAE;AAAA,mBAC7D0K,EAAW,QAAQ,CAAC;AAAA,yBACd1K,EAAM,QAAU,QAAQ;AAAA;AAAA;AAAA;AAAA,YAIrC4K,IAAmB;AAAA;AAAA;AAAA,wCAGS5K,EAAM,QAAU,QAAU,SAAW,EAAE;AAAA,mBAC5D0K,EAAW,OAAO,CAAC;AAAA,yBACb1K,EAAM,QAAU,OAAO;AAAA;AAAA;AAAA;AAAA,YAIpC6K,IAAe;AAAA;AAAA;AAAA,wCAGa7K,EAAM,QAAU,OAAS,SAAW,EAAE;AAAA,mBAC3D0K,EAAW,MAAM,CAAC;AAAA,yBACZ1K,EAAM,QAAU,MAAM;AAAA;AAAA;AAAA;AAAA,YAInC8K,IAAgB;AAAA;AAAA;AAAA;AAAA,GAK5B,CAEA,SAASD,IAAgB,CACvB,OAAO/R;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,GAaT,CAEA,SAASgS,IAAiB,CACxB,OAAOhS;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,GAOT,CAEA,SAAS8R,IAAoB,CAC3B,OAAO9R;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,GAOT,CCnjBO,SAASiS,IAAgC,CAC9C,OAAI,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,YAG3D,OAAO,WAAW,8BAA8B,EAAE,QAFhD,OAIL,OACN,CAEO,SAASC,GAAa7L,EAAgC,CAC3D,OAAIA,IAAS,SAAiB4L,GAAA,EACvB5L,CACT,CCIA,MAAM8L,GAAW9U,GACX,OAAO,MAAMA,CAAK,EAAU,GAC5BA,GAAS,EAAU,EACnBA,GAAS,EAAU,EAChBA,EAGH+U,GAA6B,IAC7B,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,WACzD,GAEF,OAAO,WAAW,kCAAkC,EAAE,SAAW,GAGpEC,GAA0BC,GAAsB,CACpDA,EAAK,UAAU,OAAO,kBAAkB,EACxCA,EAAK,MAAM,eAAe,kBAAkB,EAC5CA,EAAK,MAAM,eAAe,kBAAkB,CAC9C,EAEaC,GAAuB,CAAC,CACnC,UAAAC,EACA,WAAAZ,EACA,QAAAC,EACA,aAAAY,CACF,IAA8B,CAC5B,GAAIA,IAAiBD,EAAW,OAEhC,MAAME,EAAoB,WAAW,UAAY,KACjD,GAAI,CAACA,EAAmB,CACtBd,EAAA,EACA,MACF,CAEA,MAAMU,EAAOI,EAAkB,gBACzBC,EAAYD,EACZE,EAAuBR,GAAA,EAK7B,GAFE,EAAQO,EAAU,qBAAwB,CAACC,EAEnB,CACxB,IAAIC,EAAW,GACXC,EAAW,GAEf,GACEjB,GAAS,iBAAmB,QAC5BA,GAAS,iBAAmB,QAC5B,OAAO,OAAW,IAElBgB,EAAWV,GAAQN,EAAQ,eAAiB,OAAO,UAAU,EAC7DiB,EAAWX,GAAQN,EAAQ,eAAiB,OAAO,WAAW,UACrDA,GAAS,QAAS,CAC3B,MAAMkB,EAAOlB,EAAQ,QAAQ,sBAAA,EAE3BkB,EAAK,MAAQ,GACbA,EAAK,OAAS,GACd,OAAO,OAAW,MAElBF,EAAWV,IAASY,EAAK,KAAOA,EAAK,MAAQ,GAAK,OAAO,UAAU,EACnED,EAAWX,IAASY,EAAK,IAAMA,EAAK,OAAS,GAAK,OAAO,WAAW,EAExE,CAEAT,EAAK,MAAM,YAAY,mBAAoB,GAAGO,EAAW,GAAG,GAAG,EAC/DP,EAAK,MAAM,YAAY,mBAAoB,GAAGQ,EAAW,GAAG,GAAG,EAC/DR,EAAK,UAAU,IAAI,kBAAkB,EAErC,GAAI,CACF,MAAMU,EAAaL,EAAU,sBAAsB,IAAM,CACvDf,EAAA,CACF,CAAC,EACGoB,GAAY,SACTA,EAAW,SAAS,QAAQ,IAAMX,GAAuBC,CAAI,CAAC,EAEnED,GAAuBC,CAAI,CAE/B,MAAQ,CACND,GAAuBC,CAAI,EAC3BV,EAAA,CACF,CACA,MACF,CAEAA,EAAA,EACAS,GAAuBC,CAAI,CAC7B,sMCnBA,MAAMW,GAAoB,GAuB1B,SAASC,GAAsB7V,EAA+B,CAC5D,GAAI,CAACA,GAAS,OAAOA,GAAU,SAAU,OAAO,KAChD,MAAMgB,EAAShB,EACf,GAAI,OAAOgB,EAAO,MAAS,gBAAiBA,EAAO,KACnD,MAAM0D,EAAU1D,EAAO,QACvB,GAAI,CAAC,MAAM,QAAQ0D,CAAO,EAAG,OAAO,KACpC,MAAMxC,EAAQwC,EACX,IAAKrE,GAAS,CACb,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAAU,OAAO,KAC9C,MAAMuC,EAAQvC,EACd,OAAIuC,EAAM,OAAS,QAAU,OAAOA,EAAM,MAAS,SAAiBA,EAAM,KACnE,IACT,CAAC,EACA,OAAQ9C,GAAyB,EAAQA,CAAK,EACjD,OAAIoC,EAAM,SAAW,EAAU,KACxBA,EAAM,KAAK;AAAA,CAAI,CACxB,CAEA,SAAS4T,GAAiB9V,EAA+B,CACvD,GAAIA,GAAU,KAA6B,OAAO,KAClD,GAAI,OAAOA,GAAU,SAAU,OAAOA,EACtC,GAAI,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAChD,OAAO,OAAOA,CAAK,EAErB,MAAMkE,EAAc2R,GAAsB7V,CAAK,EAC/C,GAAIkE,EAAa,OAAOA,EACxB,GAAI,CACF,OAAO,KAAK,UAAUlE,EAAO,KAAM,CAAC,CACtC,MAAQ,CACN,OAAO,OAAOA,CAAK,CACrB,CACF,CAQA,MAAM+V,GAAmC,CACvC,KAAM,GACN,YAAa,GACb,QAAS,GACT,aAAc,QACd,WAAY,GACZ,YAAa,KACb,UAAW,UACX,SAAU,YACV,OAAQ,GACR,cAAe,OACf,SAAU,iBACV,YAAa,cACb,YAAa,GACb,QAAS,GACT,QAAS,OACT,GAAI,GACJ,eAAgB,GAChB,iBAAkB,EACpB,EAGO,IAAMC,EAAN,cAA0BC,CAAW,CAArC,aAAA,CAAA,MAAA,GAAA,SAAA,EACI,KAAA,SAAuBlY,GAAA,EACvB,KAAA,SAAW,GACX,KAAA,IAAW,OACX,KAAA,UAAY,GACZ,KAAA,MAAmB,KAAK,SAAS,OAAS,SAC1C,KAAA,cAA+B,OAC/B,KAAA,MAA+B,KAC/B,KAAA,UAA2B,KAC3B,KAAA,SAA4B,CAAA,EAE5B,KAAA,WAAa,KAAK,SAAS,WAC3B,KAAA,YAAc,GACd,KAAA,YAAc,GACd,KAAA,YAAc,GACd,KAAA,aAA0B,CAAA,EAC1B,KAAA,iBAA8B,CAAA,EAC9B,KAAA,WAA4B,KAC5B,KAAA,UAA2B,KAC3B,KAAA,kBAAmC,KAEnC,KAAA,aAAe,GACf,KAAA,MAAwC,CAAA,EAExC,KAAA,cAAgB,GAChB,KAAA,UAAY;AAAA;AAAA,EACZ,KAAA,YAA8B,KAC9B,KAAA,aAA0B,CAAA,EAC1B,KAAA,aAAe,GACf,KAAA,eAAwC,KACxC,KAAA,aAA+B,KAC/B,KAAA,oBAAqC,KACrC,KAAA,oBAAsB,GACtB,KAAA,cAA+B,CAAA,EAC/B,KAAA,WAA6C,KAC7C,KAAA,gBAAkB,GAClB,KAAA,eAAiC,OAEjC,KAAA,iBAAmB,GACnB,KAAA,kBAAoD,KACpD,KAAA,eAAgC,KAChC,KAAA,qBAAsC,KACtC,KAAA,qBAAsC,KACtC,KAAA,uBAAwC,KACxC,KAAA,uBAAyC,KACzC,KAAA,aAAe,GACf,KAAA,aAA6B,CACpC,MAAO,GACP,eAAgB,GAChB,UAAW,GACX,MAAO,GACP,WAAY,GACZ,cAAe,GACf,YAAa,EAAA,EAEN,KAAA,eAAiB,GACjB,KAAA,oBAAsB,GACtB,KAAA,qBAAsC,KACtC,KAAA,YAA2B,CAClC,QAAS,GACT,MAAO,GACP,UAAW,GACX,UAAW,GACX,aAAc,GACd,cAAe,GACf,WAAY,GACZ,aAAc,GACd,eAAgB,GAChB,OAAQ,CAAA,EACR,QAAS,CAAE,GAAGsO,EAAA,EACd,aAAc,GACd,UAAW,GACX,mBAAoB,GACpB,eAAgB,EAAA,EAET,KAAA,cAAgB,GAChB,KAAA,mBAAqB,GACrB,KAAA,oBAAqC,KACrC,KAAA,UAAuB,CAC9B,QAAS,GACT,SAAU,GACV,SAAU,GACV,UAAW,GACX,UAAW,GACX,aAAc,GACd,cAAe,GACf,WAAY,GACZ,eAAgB,GAChB,sBAAuB,MACvB,kBAAmB,GACnB,aAAc,GACd,UAAW,GACX,mBAAoB,GACpB,eAAgB,GAChB,QAAS,CAAE,GAAGC,CAAA,EACd,SAAU,CAAA,CAAC,EAEJ,KAAA,YAAc,GACd,KAAA,iBAAmB,GACnB,KAAA,oBAAsB,GACtB,KAAA,kBAAmC,KACnC,KAAA,WAAyB,CAChC,QAAS,GACT,QAAS,GACT,QAAS,GACT,SAAU,GACV,SAAU,GACV,QAAS,GACT,UAAW,GACX,YAAa,GACb,kBAAmB,GACnB,cAAe,GACf,iBAAkB,GAClB,UAAW,GACX,WAAY,EAAA,EAEL,KAAA,aAAe,GACf,KAAA,mBAAoC,KACpC,KAAA,aAA6B,CACpC,QAAS,GACT,QAAS,GACT,OAAQ,GACR,QAAS,OACT,OAAQ,GACR,UAAW,GACX,mBAAoB,GACpB,WAAY,EAAA,EAEL,KAAA,eAAiB,GACjB,KAAA,qBAAsC,KAEtC,KAAA,gBAAkB,GAClB,KAAA,gBAAmC,CAAA,EACnC,KAAA,cAA+B,KAC/B,KAAA,eAAgC,KAEhC,KAAA,gBAAkB,GAClB,KAAA,eAA4C,KAC5C,KAAA,cAA+B,KAC/B,KAAA,qBAAuB,GACvB,KAAA,oBAAsB,MACtB,KAAA,sBAAwB,GACxB,KAAA,uBAAyB,GAEzB,KAAA,YAAc,GACd,KAAA,SAAsB,CAAA,EACtB,KAAA,WAAgC,KAChC,KAAA,UAA2B,KAC3B,KAAA,SAA0B,CAAE,GAAGyJ,EAAA,EAC/B,KAAA,cAA+B,KAC/B,KAAA,SAA8B,CAAA,EAC9B,KAAA,SAAW,GAEX,KAAA,cAAgB,GAChB,KAAA,aAAyC,KACzC,KAAA,YAA6B,KAC7B,KAAA,aAAe,GACf,KAAA,WAAqC,CAAA,EACrC,KAAA,cAA+B,KAE/B,KAAA,aAAe,GACf,KAAA,YAAoC,KACpC,KAAA,YAAqC,KACrC,KAAA,YAAyB,CAAA,EACzB,KAAA,eAAiC,KACjC,KAAA,gBAAkB,GAClB,KAAA,gBAAkB,KAClB,KAAA,gBAAiC,KACjC,KAAA,eAAgC,KAEzC,KAAA,OAAsC,KACtC,KAAQ,gBAAiC,KACzC,KAAQ,kBAAmC,KAC3C,KAAQ,kBAAmC,KAC3C,KAAQ,mBAAqB,IAC7B,KAAQ,gBAA4B,CAAA,EACpC,KAAA,SAAW,GACX,KAAQ,gBAAkB,IAAM,KAAK,WAAA,EACrC,KAAQ,WAAoC,KAC5C,KAAQ,kBAAmE,IAAA,CAE3E,kBAAmB,CACjB,OAAO,IACT,CAEA,mBAAoB,CAClB,MAAM,kBAAA,EACN,KAAK,SAAW,KAAK,cAAA,EACrB,KAAK,oBAAoB,EAAI,EAC7B,KAAK,sBAAA,EACL,KAAK,oBAAA,EACL,OAAO,iBAAiB,WAAY,KAAK,eAAe,EACxD,KAAK,qBAAA,EACL,KAAK,QAAA,EACL,KAAK,kBAAA,CACP,CAEA,sBAAuB,CACrB,OAAO,oBAAoB,WAAY,KAAK,eAAe,EAC3D,KAAK,iBAAA,EACL,KAAK,oBAAA,EACL,MAAM,qBAAA,CACR,CAEU,QAAQG,EAAoC,CAElD,KAAK,MAAQ,SACZA,EAAQ,IAAI,cAAc,GACzBA,EAAQ,IAAI,kBAAkB,GAC9BA,EAAQ,IAAI,YAAY,GACxBA,EAAQ,IAAI,aAAa,GACzBA,EAAQ,IAAI,aAAa,GACzBA,EAAQ,IAAI,KAAK,IAEnB,KAAK,mBAAA,CAET,CAEA,SAAU,CACR,KAAK,UAAY,KACjB,KAAK,MAAQ,KACb,KAAK,UAAY,GAEjB,KAAK,QAAQ,KAAA,EACb,KAAK,OAAS,IAAIxZ,GAAqB,CACrC,IAAK,KAAK,SAAS,WACnB,MAAO,KAAK,SAAS,MAAM,OAAS,KAAK,SAAS,MAAQ,OAC1D,SAAU,KAAK,SAAS,KAAA,EAAS,KAAK,SAAW,OACjD,WAAY,sBACZ,KAAM,UACN,QAAUQ,GAAU,CAClB,KAAK,UAAY,GACjB,KAAK,MAAQA,EACb,KAAK,cAAcA,CAAK,EACnBoT,GAAU,KAAM,CAAE,MAAO,GAAM,EAC/B,KAAK,iBAAA,CACZ,EACA,QAAS,CAAC,CAAE,KAAA6F,EAAM,OAAAtZ,KAAa,CAC7B,KAAK,UAAY,GACjB,KAAK,UAAY,iBAAiBsZ,CAAI,MAAMtZ,GAAU,WAAW,EACnE,EACA,QAAUS,GAAQ,KAAK,QAAQA,CAAG,EAClC,MAAO,CAAC,CAAE,SAAA8Y,EAAU,SAAAC,KAAe,CACjC,KAAK,UAAY,oCAAoCD,CAAQ,SAASC,CAAQ,wBAChF,CAAA,CACD,EACD,KAAK,OAAO,MAAA,CACd,CAEQ,oBAAqB,CACvB,KAAK,iBAAiB,qBAAqB,KAAK,eAAe,EAC/D,KAAK,mBAAqB,OAC5B,aAAa,KAAK,iBAAiB,EACnC,KAAK,kBAAoB,MAE3B,KAAK,gBAAkB,sBAAsB,IAAM,CACjD,KAAK,gBAAkB,KACvB,MAAMC,EAAY,KAAK,cAAc,cAAc,EAC9CA,IACLA,EAAU,UAAYA,EAAU,aAChC,KAAK,kBAAoB,OAAO,WAAW,IAAM,CAC/C,KAAK,kBAAoB,KACzB,MAAMC,EAAS,KAAK,cAAc,cAAc,EAC3CA,IACLA,EAAO,UAAYA,EAAO,aAC5B,EAAG,GAAG,EACR,CAAC,CACH,CAEQ,mBAAoB,CACtB,KAAK,mBAAqB,OAC9B,KAAK,kBAAoB,OAAO,YAC9B,IAAA,CAAWjG,GAAU,KAAM,CAAE,MAAO,GAAM,GAC1C,GAAA,EAEJ,CAEQ,kBAAmB,CACrB,KAAK,mBAAqB,OAC9B,cAAc,KAAK,iBAAiB,EACpC,KAAK,kBAAoB,KAC3B,CAEQ,wBAAyB,CAC/B,OAAO,KAAK,MAAM,KAAMvW,GAAM,CAC5B,GAAI,CAASA,EAAE,UAAY,MAAO,GAClC,MAAMO,EACJ,OAAOP,EAAE,UAAa,SAAWA,EAAE,SAAS,KAAA,EAAO,YAAA,EAAgB,GACrE,OACEO,EAAE,WAAW,KAAK,GAAKA,EAAE,WAAW,QAAQ,GAAKA,EAAE,WAAW,SAAS,CAE3E,CAAC,CACH,CAEA,iBAAkB,CAChB,KAAK,eAAe,MAAA,EACpB,KAAK,gBAAkB,CAAA,EACvB,KAAK,iBAAmB,CAAA,CAC1B,CAEQ,gBAAiB,CACvB,GAAI,KAAK,gBAAgB,QAAUsb,GAAmB,OACtD,MAAMY,EAAW,KAAK,gBAAgB,OAASZ,GACzCa,EAAU,KAAK,gBAAgB,OAAO,EAAGD,CAAQ,EACvD,UAAW7Y,KAAM8Y,EAAS,KAAK,eAAe,OAAO9Y,CAAE,CACzD,CAEQ,wBAAyB,CAC/B,KAAK,iBAAmB,KAAK,gBAC1B,IAAKA,GAAO,KAAK,eAAe,IAAIA,CAAE,GAAG,OAAO,EAChD,OAAQ8S,GAAwC,EAAQA,CAAI,CACjE,CAEQ,uBAAuB7N,EAAiD,CAC9E,MAAM8B,EAA0C,CAAA,EAChD,OAAAA,EAAQ,KAAK,CACX,KAAM,WACN,KAAM9B,EAAM,KACZ,UAAWA,EAAM,MAAQ,CAAA,CAAC,CAC3B,EACGA,EAAM,QACR8B,EAAQ,KAAK,CACX,KAAM,aACN,KAAM9B,EAAM,KACZ,KAAMA,EAAM,MAAA,CACb,EAEI,CACL,KAAM,YACN,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAA8B,EACA,UAAW9B,EAAM,SAAA,CAErB,CAEQ,iBAAiB8G,EAA6B,CACpD,GAAI,CAACA,GAAWA,EAAQ,SAAW,OAAQ,OAC3C,MAAMgN,EACJ,OAAOhN,EAAQ,YAAe,SAAWA,EAAQ,WAAa,OAGhE,GAFIgN,GAAcA,IAAe,KAAK,YAElC,CAACA,GAAc,KAAK,WAAahN,EAAQ,QAAU,KAAK,UAAW,OAEvE,MAAMrB,EAAOqB,EAAQ,MAAQ,CAAA,EACvBiN,EACJ,OAAOtO,EAAK,YAAe,SAAWA,EAAK,WAAa,GAC1D,GAAI,CAACsO,EAAY,OACjB,MAAMhX,EAAO,OAAO0I,EAAK,MAAS,SAAWA,EAAK,KAAO,OACnDuO,EAAQ,OAAOvO,EAAK,OAAU,SAAWA,EAAK,MAAQ,GACtD7H,EAAOoW,IAAU,QAAUvO,EAAK,KAAO,OACvCwO,EACJD,IAAU,SACNd,GAAiBzN,EAAK,aAAa,EACnCuO,IAAU,SACRd,GAAiBzN,EAAK,MAAM,EAC5B,OAEF9L,EAAM,KAAK,IAAA,EACjB,IAAIqG,EAAQ,KAAK,eAAe,IAAI+T,CAAU,EACzC/T,GAeHA,EAAM,KAAOjD,EACTa,IAAS,SAAWoC,EAAM,KAAOpC,GACjCqW,IAAW,SAAWjU,EAAM,OAASiU,GACzCjU,EAAM,UAAYrG,IAjBlBqG,EAAQ,CACN,WAAA+T,EACA,MAAOjN,EAAQ,MACf,WAAAgN,EACA,KAAA/W,EACA,KAAAa,EACA,OAAAqW,EACA,UAAW,OAAOnN,EAAQ,IAAO,SAAWA,EAAQ,GAAKnN,EACzD,UAAWA,EACX,QAAS,CAAA,CAAC,EAEZ,KAAK,eAAe,IAAIoa,EAAY/T,CAAK,EACzC,KAAK,gBAAgB,KAAK+T,CAAU,GAQtC/T,EAAM,QAAU,KAAK,uBAAuBA,CAAK,EACjD,KAAK,eAAA,EACL,KAAK,uBAAA,CACP,CAEQ,QAAQtF,EAAwB,CAMtC,GALA,KAAK,SAAW,CACd,CAAE,GAAI,KAAK,MAAO,MAAOA,EAAI,MAAO,QAASA,EAAI,OAAA,EACjD,GAAG,KAAK,QAAA,EACR,MAAM,EAAG,GAAG,EAEVA,EAAI,QAAU,QAAS,CACzB,KAAK,iBAAiBA,EAAI,OAAwC,EAClE,MACF,CAEA,GAAIA,EAAI,QAAU,OAAQ,CACxB,MAAMoM,EAAUpM,EAAI,QACNqT,GAAgB,KAAMjH,CAAO,IAC7B,SAAc6G,EAAgB,IAAI,EAChD,MACF,CAEA,GAAIjT,EAAI,QAAU,WAAY,CAC5B,MAAMoM,EAAUpM,EAAI,QAChBoM,GAAS,UAAY,MAAM,QAAQA,EAAQ,QAAQ,IACrD,KAAK,gBAAkBA,EAAQ,SAC/B,KAAK,cAAgB,KACrB,KAAK,eAAiB,MAExB,MACF,CAEIpM,EAAI,QAAU,QAAU,KAAK,MAAQ,QAClC,KAAK,SAAA,CAEd,CAEQ,cAAcJ,EAAuB,CAC3C,MAAMkL,EAAWlL,EAAM,SAGnBkL,GAAU,UAAY,MAAM,QAAQA,EAAS,QAAQ,IACvD,KAAK,gBAAkBA,EAAS,UAE9BA,GAAU,SACZ,KAAK,YAAcA,EAAS,OAEhC,CAEA,cAAclK,EAAkB,CAC9B,KAAK,SAAWA,EAChBD,GAAaC,CAAI,EACbA,EAAK,QAAU,KAAK,QACtB,KAAK,MAAQA,EAAK,MAClB,KAAK,mBAAmB2W,GAAa3W,EAAK,KAAK,CAAC,EAEpD,CAEQ,sBAAuB,CAC7B,GAAI,CAAC,OAAO,SAAS,OAAQ,OAC7B,MAAMjB,EAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACnDoQ,EAAQpQ,EAAO,IAAI,OAAO,GAAG,KAAA,EACnC,GAAI,CAACoQ,EAAO,OACP,KAAK,SAAS,OACjB,KAAK,cAAc,CAAE,GAAG,KAAK,SAAU,MAAAA,EAAO,EAEhDpQ,EAAO,OAAO,OAAO,EACrB,MAAM6Z,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxCA,EAAI,OAAS7Z,EAAO,SAAA,EACpB,OAAO,QAAQ,aAAa,CAAA,EAAI,GAAI6Z,EAAI,UAAU,CACpD,CAEA,OAAO5Y,EAAW,CACZ,KAAK,MAAQA,IAAM,KAAK,IAAMA,GAC7B,KAAK,iBAAA,EACV,KAAK,eAAeA,EAAM,EAAK,CACjC,CAEA,SAASA,EAAiBsW,EAAkC,CAM1DU,GAAqB,CACnB,UAAWhX,EACX,WAPiB,IAAM,CACvB,KAAK,MAAQA,EACb,KAAK,cAAc,CAAE,GAAG,KAAK,SAAU,MAAOA,EAAM,EACpD,KAAK,mBAAmB2W,GAAa3W,CAAI,CAAC,CAC5C,EAIE,QAAAsW,EACA,aAAc,KAAK,KAAA,CACpB,CACH,CAEA,MAAc,kBAAmB,CAC3B,KAAK,MAAQ,YAAY,MAAM,KAAK,aAAA,EACpC,KAAK,MAAQ,eAAe,MAAM,KAAK,gBAAA,EACvC,KAAK,MAAQ,aAAa,MAAM9E,GAAa,IAAI,EACjD,KAAK,MAAQ,YAAY,MAAMC,EAAa,IAAI,EAChD,KAAK,MAAQ,QAAQ,MAAM,KAAK,SAAA,EAChC,KAAK,MAAQ,UAAU,MAAMG,GAAW,IAAI,EAC5C,KAAK,MAAQ,SAAS,MAAMQ,GAAU,IAAI,EAC1C,KAAK,MAAQ,SACf,MAAM,QAAQ,IAAI,CAACC,EAAgB,IAAI,EAAGZ,EAAa,IAAI,CAAC,CAAC,EAC7D,KAAK,mBAAA,GAEH,KAAK,MAAQ,WACf,MAAMmB,GAAiB,IAAI,EAC3B,MAAMF,EAAW,IAAI,GAEnB,KAAK,MAAQ,SAAS,MAAMwC,GAAU,IAAI,CAChD,CAEQ,eAAgB,CACtB,GAAI,OAAO,OAAW,IAAa,MAAO,GAC1C,MAAM2D,EAAa,OAAO,kCAC1B,OAAI,OAAOA,GAAe,UAAYA,EAAW,OACxCvY,GAAkBuY,CAAU,EAE9B/X,GAA0B,OAAO,SAAS,QAAQ,CAC3D,CAEQ,uBAAwB,CAC9B,KAAK,MAAQ,KAAK,SAAS,OAAS,SACpC,KAAK,mBAAmB6V,GAAa,KAAK,KAAK,CAAC,CAClD,CAEQ,mBAAmBmC,EAAyB,CAElD,GADA,KAAK,cAAgBA,EACjB,OAAO,SAAa,IAAa,OACrC,MAAM/B,EAAO,SAAS,gBACtBA,EAAK,QAAQ,MAAQ+B,EACrB/B,EAAK,MAAM,YAAc+B,CAC3B,CAEQ,qBAAsB,CAC5B,GAAI,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,WAChE,OAMF,GALA,KAAK,WAAa,OAAO,WAAW,8BAA8B,EAClE,KAAK,kBAAqB3C,GAAU,CAC9B,KAAK,QAAU,UACnB,KAAK,mBAAmBA,EAAM,QAAU,OAAS,OAAO,CAC1D,EACI,OAAO,KAAK,WAAW,kBAAqB,WAAY,CAC1D,KAAK,WAAW,iBAAiB,SAAU,KAAK,iBAAiB,EACjE,MACF,CACe,KAAK,WAGb,YAAY,KAAK,iBAAiB,CAC3C,CAEQ,qBAAsB,CAC5B,GAAI,CAAC,KAAK,YAAc,CAAC,KAAK,kBAAmB,OACjD,GAAI,OAAO,KAAK,WAAW,qBAAwB,WAAY,CAC7D,KAAK,WAAW,oBAAoB,SAAU,KAAK,iBAAiB,EACpE,MACF,CACe,KAAK,WAGb,eAAe,KAAK,iBAAiB,EAC5C,KAAK,WAAa,KAClB,KAAK,kBAAoB,IAC3B,CAEQ,oBAAoB4C,EAAkB,CAC5C,GAAI,OAAO,OAAW,IAAa,OACnC,MAAMD,EAAWlY,GAAY,OAAO,SAAS,SAAU,KAAK,QAAQ,GAAK,OACzE,KAAK,gBAAgBkY,CAAQ,EAC7B,KAAK,eAAeA,EAAUC,CAAO,CACvC,CAEQ,YAAa,CACnB,GAAI,OAAO,OAAW,IAAa,OACnC,MAAMD,EAAWlY,GAAY,OAAO,SAAS,SAAU,KAAK,QAAQ,EAC/DkY,GACL,KAAK,gBAAgBA,CAAQ,CAC/B,CAEQ,gBAAgB9Y,EAAW,CAC7B,KAAK,MAAQA,IAAM,KAAK,IAAMA,GAC9B,KAAK,WAAgB,KAAK,iBAAA,CAChC,CAEQ,eAAeI,EAAU2Y,EAAkB,CACjD,GAAI,OAAO,OAAW,IAAa,OACnC,MAAMC,EAAavY,EAAcE,GAAWP,EAAK,KAAK,QAAQ,CAAC,EAE/D,GADoBK,EAAc,OAAO,SAAS,QAAQ,IACtCuY,EAAY,OAChC,MAAMJ,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxCA,EAAI,SAAWI,EACXD,EACF,OAAO,QAAQ,aAAa,CAAA,EAAI,GAAIH,EAAI,UAAU,EAElD,OAAO,QAAQ,UAAU,CAAA,EAAI,GAAIA,EAAI,UAAU,CAEnD,CAEA,MAAM,cAAe,CACnB,MAAM,QAAQ,IAAI,CAChBvK,EAAc,KAAM,EAAK,EACzBmD,GAAa,IAAI,EACjBC,EAAa,IAAI,EACjB0C,EAAe,IAAI,EACnBe,GAAU,IAAI,CAAA,CACf,CACH,CAEA,MAAc,iBAAkB,CAC9B,MAAM,QAAQ,IAAI,CAAC7G,EAAc,KAAM,EAAI,EAAGqE,EAAW,IAAI,CAAC,CAAC,CACjE,CAEA,MAAM,UAAW,CACf,MAAM,QAAQ,IAAI,CAACyB,EAAe,IAAI,EAAGC,GAAa,IAAI,CAAC,CAAC,CAC9D,CAEA,MAAM,gBAAiB,CACjB,CAAC,KAAK,WAAa,CAAC,KAAK,2BAC7B,MAAM9B,GAAS,IAAI,EACdD,EAAgB,IAAI,EAC3B,CAEA,MAAM,oBAAoB7D,EAAgB,CACxC,MAAMD,GAAmB,KAAMC,CAAK,EACpC,MAAMH,EAAc,KAAM,EAAI,CAChC,CAEA,MAAM,oBAAqB,CACzB,MAAMI,GAAkB,IAAI,EAC5B,MAAMJ,EAAc,KAAM,EAAI,CAChC,CAEA,MAAM,sBAAuB,CAC3B,MAAMK,GAAe,IAAI,EACzB,MAAML,EAAc,KAAM,EAAI,CAChC,CAEA,MAAM,oBAAqB,CACzB,MAAMY,GAAmB,IAAI,EAC7B,MAAMyD,EAAW,IAAI,EACrB,MAAMrE,EAAc,KAAM,EAAI,CAChC,CAEA,MAAM,mBAAoB,CACxB,MAAMsB,GAAkB,IAAI,EAC5B,MAAM+C,EAAW,IAAI,EACrB,MAAMrE,EAAc,KAAM,EAAI,CAChC,CAEA,MAAM,iBAAkB,CACtB,MAAMuC,GAAgB,IAAI,EAC1B,MAAM8B,EAAW,IAAI,EACrB,MAAMrE,EAAc,KAAM,EAAI,CAChC,CAEA,MAAM,kBAAmB,CACvB,MAAM0C,GAAiB,IAAI,EAC3B,MAAM2B,EAAW,IAAI,EACrB,MAAMrE,EAAc,KAAM,EAAI,CAChC,CAEA,MAAM,oBAAqB,CACzB,MAAMgD,GAAmB,IAAI,EAC7B,MAAMqB,EAAW,IAAI,EACrB,MAAMrE,EAAc,KAAM,EAAI,CAChC,CAEA,QAAS,CACP,OAAOoH,GAAU,IAAI,CACvB,CACF,EA3oBWwD,EAAA,CAARtN,EAAA,CAAM,EADImM,EACF,UAAA,WAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAFImM,EAEF,UAAA,WAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAHImM,EAGF,UAAA,MAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAJImM,EAIF,UAAA,YAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EALImM,EAKF,UAAA,QAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EANImM,EAMF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAPImM,EAOF,UAAA,QAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EARImM,EAQF,UAAA,YAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EATImM,EASF,UAAA,WAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAXImM,EAWF,UAAA,aAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAZImM,EAYF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAbImM,EAaF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAdImM,EAcF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAfImM,EAeF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAhBImM,EAgBF,UAAA,mBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAjBImM,EAiBF,UAAA,aAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAlBImM,EAkBF,UAAA,YAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAnBImM,EAmBF,UAAA,oBAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EArBImM,EAqBF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAtBImM,EAsBF,UAAA,QAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAxBImM,EAwBF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAzBImM,EAyBF,UAAA,YAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA1BImM,EA0BF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA3BImM,EA2BF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA5BImM,EA4BF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA7BImM,EA6BF,UAAA,iBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA9BImM,EA8BF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA/BImM,EA+BF,UAAA,sBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAhCImM,EAgCF,UAAA,sBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAjCImM,EAiCF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAlCImM,EAkCF,UAAA,aAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAnCImM,EAmCF,UAAA,kBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EApCImM,EAoCF,UAAA,iBAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAtCImM,EAsCF,UAAA,mBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAvCImM,EAuCF,UAAA,oBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAxCImM,EAwCF,UAAA,iBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAzCImM,EAyCF,UAAA,uBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA1CImM,EA0CF,UAAA,uBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA3CImM,EA2CF,UAAA,yBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA5CImM,EA4CF,UAAA,yBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA7CImM,EA6CF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA9CImM,EA8CF,UAAA,eAAA,CAAA,EASAmB,EAAA,CAARtN,EAAA,CAAM,EAvDImM,EAuDF,UAAA,iBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAxDImM,EAwDF,UAAA,sBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAzDImM,EAyDF,UAAA,uBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA1DImM,EA0DF,UAAA,cAAA,CAAA,EAiBAmB,EAAA,CAARtN,EAAA,CAAM,EA3EImM,EA2EF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA5EImM,EA4EF,UAAA,qBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA7EImM,EA6EF,UAAA,sBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA9EImM,EA8EF,UAAA,YAAA,CAAA,EAmBAmB,EAAA,CAARtN,EAAA,CAAM,EAjGImM,EAiGF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAlGImM,EAkGF,UAAA,mBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAnGImM,EAmGF,UAAA,sBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EApGImM,EAoGF,UAAA,oBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EArGImM,EAqGF,UAAA,aAAA,CAAA,EAeAmB,EAAA,CAARtN,EAAA,CAAM,EApHImM,EAoHF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EArHImM,EAqHF,UAAA,qBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAtHImM,EAsHF,UAAA,eAAA,CAAA,EAUAmB,EAAA,CAARtN,EAAA,CAAM,EAhIImM,EAgIF,UAAA,iBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAjIImM,EAiIF,UAAA,uBAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAnIImM,EAmIF,UAAA,kBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EApIImM,EAoIF,UAAA,kBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EArIImM,EAqIF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAtIImM,EAsIF,UAAA,iBAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAxIImM,EAwIF,UAAA,kBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAzIImM,EAyIF,UAAA,iBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA1IImM,EA0IF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA3IImM,EA2IF,UAAA,uBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA5IImM,EA4IF,UAAA,sBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA7IImM,EA6IF,UAAA,wBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA9IImM,EA8IF,UAAA,yBAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAhJImM,EAgJF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAjJImM,EAiJF,UAAA,WAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAlJImM,EAkJF,UAAA,aAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAnJImM,EAmJF,UAAA,YAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EApJImM,EAoJF,UAAA,WAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EArJImM,EAqJF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAtJImM,EAsJF,UAAA,WAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAvJImM,EAuJF,UAAA,WAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAzJImM,EAyJF,UAAA,gBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA1JImM,EA0JF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA3JImM,EA2JF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA5JImM,EA4JF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA7JImM,EA6JF,UAAA,aAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EA9JImM,EA8JF,UAAA,gBAAA,CAAA,EAEAmB,EAAA,CAARtN,EAAA,CAAM,EAhKImM,EAgKF,UAAA,eAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAjKImM,EAiKF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAlKImM,EAkKF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAnKImM,EAmKF,UAAA,cAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EApKImM,EAoKF,UAAA,iBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EArKImM,EAqKF,UAAA,kBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAtKImM,EAsKF,UAAA,kBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAvKImM,EAuKF,UAAA,kBAAA,CAAA,EACAmB,EAAA,CAARtN,EAAA,CAAM,EAxKImM,EAwKF,UAAA,iBAAA,CAAA,EAxKEA,EAANmB,EAAA,CADNC,GAAc,cAAc,CAAA,EAChBpB,CAAA","x_google_ignoreList":[0,1,2,3,4,5,6]}