@hyperdreamer/pi-webui 1.6.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 (276) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +148 -0
  3. package/dist/cli.js +975 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client/apple-touch-icon.png +0 -0
  6. package/dist/client/assets/CodeViewer-aB4ZVzEu.js +4 -0
  7. package/dist/client/assets/UnifiedDiffViewer-f8X7aTkU.js +39 -0
  8. package/dist/client/assets/index-Cffeusjy.js +6022 -0
  9. package/dist/client/assets/vendor-editor-core-vUi74DnD.js +12 -0
  10. package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +46 -0
  11. package/dist/client/assets/vendor-editor-legacy-CYBnW6ZU.js +1 -0
  12. package/dist/client/assets/vendor-terminal-BrP-ENHg.css +1 -0
  13. package/dist/client/assets/vendor-terminal-D8k4UKM2.js +35 -0
  14. package/dist/client/favicon.svg +8 -0
  15. package/dist/client/index.html +65 -0
  16. package/dist/client/manifest.webmanifest +24 -0
  17. package/dist/client/pwa-icon-192.png +0 -0
  18. package/dist/client/pwa-icon-512.png +0 -0
  19. package/dist/config.js +417 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/docker/piWebUiDockerCommandPlan.js +211 -0
  22. package/dist/docker/piWebUiDockerCommandPlan.js.map +1 -0
  23. package/dist/nativeServices/serviceDoctor.js +480 -0
  24. package/dist/nativeServices/serviceDoctor.js.map +1 -0
  25. package/dist/nativeServices/serviceInstall.js +35 -0
  26. package/dist/nativeServices/serviceInstall.js.map +1 -0
  27. package/dist/nativeServices/servicePlan.js +358 -0
  28. package/dist/nativeServices/servicePlan.js.map +1 -0
  29. package/dist/nativeServices/serviceProbe.js +447 -0
  30. package/dist/nativeServices/serviceProbe.js.map +1 -0
  31. package/dist/nativeServices/serviceRendering.js +122 -0
  32. package/dist/nativeServices/serviceRendering.js.map +1 -0
  33. package/dist/pi-webui-plugins/info/package.json +9 -0
  34. package/dist/pi-webui-plugins/info/pi-webui-plugin.js +51 -0
  35. package/dist/pi-webui-plugins/updates/package.json +9 -0
  36. package/dist/pi-webui-plugins/updates/pi-webui-plugin.js +185 -0
  37. package/dist/pi-webui-plugins/updates/updatesLogic.js +97 -0
  38. package/dist/pi-webui-plugins/workspace-tasks/config.js +91 -0
  39. package/dist/pi-webui-plugins/workspace-tasks/package.json +9 -0
  40. package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +48 -0
  41. package/dist/pi-webui-plugins/workspace-tasks/taskRunner.js +12 -0
  42. package/dist/pi-webui-plugins/workspace-tasks/tasksPanelElement.js +288 -0
  43. package/dist/pi-webui-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
  44. package/dist/piWebUiVersionReport.js +225 -0
  45. package/dist/piWebUiVersionReport.js.map +1 -0
  46. package/dist/plugin-api/unstable.d.ts +22 -0
  47. package/dist/plugin-api.d.ts +199 -0
  48. package/dist/server/activeAgentProfileProvider.js +25 -0
  49. package/dist/server/activeAgentProfileProvider.js.map +1 -0
  50. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  51. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  52. package/dist/server/activity/workspaceActivityService.js +98 -0
  53. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  54. package/dist/server/app.js +211 -0
  55. package/dist/server/app.js.map +1 -0
  56. package/dist/server/browserMessageProjection.js +56 -0
  57. package/dist/server/browserMessageProjection.js.map +1 -0
  58. package/dist/server/configRoutes.js +309 -0
  59. package/dist/server/configRoutes.js.map +1 -0
  60. package/dist/server/diagnostics/nodePtyNativeModule.js +36 -0
  61. package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -0
  62. package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
  63. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  64. package/dist/server/git/gitEnv.js +15 -0
  65. package/dist/server/git/gitEnv.js.map +1 -0
  66. package/dist/server/git/gitService.js +123 -0
  67. package/dist/server/git/gitService.js.map +1 -0
  68. package/dist/server/gitRoutes.js +23 -0
  69. package/dist/server/gitRoutes.js.map +1 -0
  70. package/dist/server/index.js +7 -0
  71. package/dist/server/index.js.map +1 -0
  72. package/dist/server/machines/machineClient.js +172 -0
  73. package/dist/server/machines/machineClient.js.map +1 -0
  74. package/dist/server/machines/machinePluginProxyRoutes.js +190 -0
  75. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
  76. package/dist/server/machines/machineProxyRoutes.js +172 -0
  77. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  78. package/dist/server/machines/machineRoutes.js +56 -0
  79. package/dist/server/machines/machineRoutes.js.map +1 -0
  80. package/dist/server/machines/machineService.js +238 -0
  81. package/dist/server/machines/machineService.js.map +1 -0
  82. package/dist/server/machines/machineStore.js +128 -0
  83. package/dist/server/machines/machineStore.js.map +1 -0
  84. package/dist/server/models/modelsConfigRoutes.js +40 -0
  85. package/dist/server/models/modelsConfigRoutes.js.map +1 -0
  86. package/dist/server/models/modelsConfigService.js +339 -0
  87. package/dist/server/models/modelsConfigService.js.map +1 -0
  88. package/dist/server/piPackagePluginsConfigRoutes.js +86 -0
  89. package/dist/server/piPackagePluginsConfigRoutes.js.map +1 -0
  90. package/dist/server/piPackagePluginsConfigService.js +311 -0
  91. package/dist/server/piPackagePluginsConfigService.js.map +1 -0
  92. package/dist/server/piPackageRoutes.js +91 -0
  93. package/dist/server/piPackageRoutes.js.map +1 -0
  94. package/dist/server/piPackageService.js +101 -0
  95. package/dist/server/piPackageService.js.map +1 -0
  96. package/dist/server/piWebUiPluginService.js +326 -0
  97. package/dist/server/piWebUiPluginService.js.map +1 -0
  98. package/dist/server/piWebUiReleaseLookupCache.js +37 -0
  99. package/dist/server/piWebUiReleaseLookupCache.js.map +1 -0
  100. package/dist/server/piWebUiStatus.js +622 -0
  101. package/dist/server/piWebUiStatus.js.map +1 -0
  102. package/dist/server/piWebUiStatusCache.js +45 -0
  103. package/dist/server/piWebUiStatusCache.js.map +1 -0
  104. package/dist/server/projects/directorySuggestions.js +37 -0
  105. package/dist/server/projects/directorySuggestions.js.map +1 -0
  106. package/dist/server/projects/projectService.js +31 -0
  107. package/dist/server/projects/projectService.js.map +1 -0
  108. package/dist/server/realtime/sessionEventHub.js +70 -0
  109. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  110. package/dist/server/sessiond/sessionDaemonStartup.js +49 -0
  111. package/dist/server/sessiond/sessionDaemonStartup.js.map +1 -0
  112. package/dist/server/sessiond/sessionProxyRoutes.js +87 -0
  113. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  114. package/dist/server/sessiond/skillsGithubToken.js +7 -0
  115. package/dist/server/sessiond/skillsGithubToken.js.map +1 -0
  116. package/dist/server/sessiond.js +152 -0
  117. package/dist/server/sessiond.js.map +1 -0
  118. package/dist/server/sessions/attachmentService.js +119 -0
  119. package/dist/server/sessions/attachmentService.js.map +1 -0
  120. package/dist/server/sessions/authProviderOptions.js +50 -0
  121. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  122. package/dist/server/sessions/authRoutes.js +69 -0
  123. package/dist/server/sessions/authRoutes.js.map +1 -0
  124. package/dist/server/sessions/authService.js +134 -0
  125. package/dist/server/sessions/authService.js.map +1 -0
  126. package/dist/server/sessions/builtinCommands.js +27 -0
  127. package/dist/server/sessions/builtinCommands.js.map +1 -0
  128. package/dist/server/sessions/editPreview.js +196 -0
  129. package/dist/server/sessions/editPreview.js.map +1 -0
  130. package/dist/server/sessions/messagePaging.js +43 -0
  131. package/dist/server/sessions/messagePaging.js.map +1 -0
  132. package/dist/server/sessions/oauthLoginFlowService.js +349 -0
  133. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  134. package/dist/server/sessions/piSessionManagerGateway.js +115 -0
  135. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
  136. package/dist/server/sessions/piSessionService.js +3230 -0
  137. package/dist/server/sessions/piSessionService.js.map +1 -0
  138. package/dist/server/sessions/plainTextTheme.js +112 -0
  139. package/dist/server/sessions/plainTextTheme.js.map +1 -0
  140. package/dist/server/sessions/sessionArchiveMigration.js +590 -0
  141. package/dist/server/sessions/sessionArchiveMigration.js.map +1 -0
  142. package/dist/server/sessions/sessionArchiveStore.js +262 -0
  143. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  144. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  145. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  146. package/dist/server/sessions/sessionCleanup.js +157 -0
  147. package/dist/server/sessions/sessionCleanup.js.map +1 -0
  148. package/dist/server/sessions/sessionCommandService.js +313 -0
  149. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  150. package/dist/server/sessions/sessionDefaultsRoutes.js +65 -0
  151. package/dist/server/sessions/sessionDefaultsRoutes.js.map +1 -0
  152. package/dist/server/sessions/sessionDefaultsService.js +90 -0
  153. package/dist/server/sessions/sessionDefaultsService.js.map +1 -0
  154. package/dist/server/sessions/sessionHistoryExport.js +115 -0
  155. package/dist/server/sessions/sessionHistoryExport.js.map +1 -0
  156. package/dist/server/sessions/sessionMetadataStore.js +102 -0
  157. package/dist/server/sessions/sessionMetadataStore.js.map +1 -0
  158. package/dist/server/sessions/sessionNameGenerator.js +90 -0
  159. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  160. package/dist/server/sessions/sessionNotificationStore.js +484 -0
  161. package/dist/server/sessions/sessionNotificationStore.js.map +1 -0
  162. package/dist/server/sessions/sessionRoutes.js +590 -0
  163. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  164. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  165. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  166. package/dist/server/sessions/sessionService.js +2 -0
  167. package/dist/server/sessions/sessionService.js.map +1 -0
  168. package/dist/server/sessions/sessionTreeProjection.js +250 -0
  169. package/dist/server/sessions/sessionTreeProjection.js.map +1 -0
  170. package/dist/server/sessions/sessionUnreadStore.js +520 -0
  171. package/dist/server/sessions/sessionUnreadStore.js.map +1 -0
  172. package/dist/server/sessions/spawnSessionTool.js +41 -0
  173. package/dist/server/sessions/spawnSessionTool.js.map +1 -0
  174. package/dist/server/sessions/spawnSubsessionTool.js +214 -0
  175. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
  176. package/dist/server/sessions/spawnTargetResolver.js +36 -0
  177. package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
  178. package/dist/server/sessions/subsessionTranscript.js +235 -0
  179. package/dist/server/sessions/subsessionTranscript.js.map +1 -0
  180. package/dist/server/skills/runNpx.js +30 -0
  181. package/dist/server/skills/runNpx.js.map +1 -0
  182. package/dist/server/skills/skillLock.js +115 -0
  183. package/dist/server/skills/skillLock.js.map +1 -0
  184. package/dist/server/skills/skillUpdates.js +194 -0
  185. package/dist/server/skills/skillUpdates.js.map +1 -0
  186. package/dist/server/skills/skillsConfigRoutes.js +64 -0
  187. package/dist/server/skills/skillsConfigRoutes.js.map +1 -0
  188. package/dist/server/skills/skillsConfigService.js +391 -0
  189. package/dist/server/skills/skillsConfigService.js.map +1 -0
  190. package/dist/server/storage/projectStore.js +88 -0
  191. package/dist/server/storage/projectStore.js.map +1 -0
  192. package/dist/server/systemInfoRoutes.js +265 -0
  193. package/dist/server/systemInfoRoutes.js.map +1 -0
  194. package/dist/server/terminalProxyRoutes.js +140 -0
  195. package/dist/server/terminalProxyRoutes.js.map +1 -0
  196. package/dist/server/terminals/terminalRoutes.js +155 -0
  197. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  198. package/dist/server/terminals/terminalService.js +305 -0
  199. package/dist/server/terminals/terminalService.js.map +1 -0
  200. package/dist/server/terminals/terminalSize.js +17 -0
  201. package/dist/server/terminals/terminalSize.js.map +1 -0
  202. package/dist/server/types.js +2 -0
  203. package/dist/server/types.js.map +1 -0
  204. package/dist/server/webSocketBridge.js +32 -0
  205. package/dist/server/webSocketBridge.js.map +1 -0
  206. package/dist/server/workingDirectory.js +44 -0
  207. package/dist/server/workingDirectory.js.map +1 -0
  208. package/dist/server/workspaceExplorerRoutes.js +109 -0
  209. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  210. package/dist/server/workspaces/effectivePathAccess.js +27 -0
  211. package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
  212. package/dist/server/workspaces/fileContentService.js +181 -0
  213. package/dist/server/workspaces/fileContentService.js.map +1 -0
  214. package/dist/server/workspaces/fileSuggestions.js +520 -0
  215. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  216. package/dist/server/workspaces/fileTreeService.js +35 -0
  217. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  218. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  219. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  220. package/dist/server/workspaces/imagePreviewService.js +40 -0
  221. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  222. package/dist/server/workspaces/pathAccessPolicy.js +90 -0
  223. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
  224. package/dist/server/workspaces/pathSafety.js +45 -0
  225. package/dist/server/workspaces/pathSafety.js.map +1 -0
  226. package/dist/server/workspaces/projectPiWebUiConfig.js +61 -0
  227. package/dist/server/workspaces/projectPiWebUiConfig.js.map +1 -0
  228. package/dist/server/workspaces/workspaceContext.js +8 -0
  229. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  230. package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
  231. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
  232. package/dist/server/workspaces/workspaceService.js +39 -0
  233. package/dist/server/workspaces/workspaceService.js.map +1 -0
  234. package/dist/sessiond/activeAgentProfile.js +31 -0
  235. package/dist/sessiond/activeAgentProfile.js.map +1 -0
  236. package/dist/sessiond/config.js +9 -0
  237. package/dist/sessiond/config.js.map +1 -0
  238. package/dist/sessiond/sessionDaemonClient.js +103 -0
  239. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  240. package/dist/shared/activeAgentProfile.js +76 -0
  241. package/dist/shared/activeAgentProfile.js.map +1 -0
  242. package/dist/shared/activity.js +11 -0
  243. package/dist/shared/activity.js.map +1 -0
  244. package/dist/shared/apiTypes.d.ts +1212 -0
  245. package/dist/shared/apiTypes.js +25 -0
  246. package/dist/shared/apiTypes.js.map +1 -0
  247. package/dist/shared/capabilities.js +69 -0
  248. package/dist/shared/capabilities.js.map +1 -0
  249. package/dist/shared/federatedRoutes.js +109 -0
  250. package/dist/shared/federatedRoutes.js.map +1 -0
  251. package/dist/shared/machinePluginIds.js +41 -0
  252. package/dist/shared/machinePluginIds.js.map +1 -0
  253. package/dist/shared/piWebUiStatusParsing.js +108 -0
  254. package/dist/shared/piWebUiStatusParsing.js.map +1 -0
  255. package/dist/shared/pluginIds.js +5 -0
  256. package/dist/shared/pluginIds.js.map +1 -0
  257. package/dist/shared/promptAttachments.js +92 -0
  258. package/dist/shared/promptAttachments.js.map +1 -0
  259. package/dist/shared/thinkingLevels.d.ts +27 -0
  260. package/dist/shared/thinkingLevels.js +31 -0
  261. package/dist/shared/thinkingLevels.js.map +1 -0
  262. package/dist/shared/workspaceDeletion.js +12 -0
  263. package/dist/shared/workspaceDeletion.js.map +1 -0
  264. package/dist/shared/workspaceFiles.js +3 -0
  265. package/dist/shared/workspaceFiles.js.map +1 -0
  266. package/docs/assets/favicon.svg +8 -0
  267. package/docs/assets/pi-webui-banner.png +0 -0
  268. package/docs/assets/pi-webui-desktop.png +0 -0
  269. package/docs/assets/pi-webui-mobile.png +0 -0
  270. package/docs/assets/pi-webui-tablet.png +0 -0
  271. package/docs/config.md +265 -0
  272. package/docs/plugins.md +988 -0
  273. package/extensions/pi-webui.ts +133 -0
  274. package/package.json +143 -0
  275. package/plugin-api/unstable.d.ts +1 -0
  276. package/plugin-api.d.ts +1 -0
@@ -0,0 +1,520 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { readdir, stat } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { basename, dirname, isAbsolute, join, relative, sep, win32 } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { sanitizedGitEnv } from "../git/gitEnv.js";
7
+ import { createPathAccessPolicy, isAbsoluteishPath, resolvePathAccessTarget } from "./pathAccessPolicy.js";
8
+ const execFileAsync = promisify(execFile);
9
+ const commandMaxBuffer = 1024 * 1024 * 8;
10
+ const maxFilesystemFallbackPaths = 20_000;
11
+ const maxFileSuggestions = 80;
12
+ class CommandExitError extends Error {
13
+ constructor(file, code, stderr) {
14
+ const codeText = code === null ? "unknown" : String(code);
15
+ super(`${file} exited with code ${codeText}${stderr === "" ? "" : `: ${stderr}`}`);
16
+ this.name = "CommandExitError";
17
+ if (code !== null)
18
+ this.exitCode = code;
19
+ }
20
+ }
21
+ export function isAbsoluteishFileSuggestionQuery(query = "") {
22
+ return isAbsoluteishPath(fileQueryText(query));
23
+ }
24
+ export async function listFileSuggestions(cwd, query = "", options = {}, deps = {}) {
25
+ const queryText = fileQueryText(query);
26
+ if (isAbsoluteishFileSuggestionQuery(query)) {
27
+ return (await listPathSuggestions(cwd, queryText, options.pathAccess, deps))
28
+ .filter((file) => options.kind === undefined || file.kind === options.kind)
29
+ .slice(0, maxFileSuggestions);
30
+ }
31
+ const normalizedQuery = normalizeFileQuery(query);
32
+ const command = deps.execFile ?? runCommand;
33
+ const files = await listFilesForScope(cwd, options.scope, command);
34
+ return (await rankFileSuggestionsWithOptionalFzf(cwd, files.filter((file) => options.kind === undefined || file.kind === options.kind), normalizedQuery, fzfRunnerForDependencies(deps))).slice(0, maxFileSuggestions);
35
+ }
36
+ export async function listPathSuggestions(cwd, prefix = "", pathAccess, deps = {}) {
37
+ const query = fileQueryText(prefix);
38
+ const fzf = fzfRunnerForDependencies(deps);
39
+ if (isAbsoluteishPath(query))
40
+ return listAllowedPathSuggestions(cwd, query, pathAccess, fzf);
41
+ const normalizedPrefix = query.replace(/\\/g, "/");
42
+ const directoryPrefix = normalizedPrefix.endsWith("/") ? normalizedPrefix : dirname(normalizedPrefix) === "." ? "" : `${dirname(normalizedPrefix)}/`;
43
+ const searchPrefix = normalizedPrefix.endsWith("/") ? "" : basename(normalizedPrefix);
44
+ const candidates = await listDirectoryEntrySuggestions(cwd, directoryPrefix);
45
+ return (await rankPathSuggestionsWithOptionalFzf(cwd, candidates, searchPrefix, () => prefixPathSuggestions(candidates, searchPrefix), fzf)).slice(0, maxFileSuggestions);
46
+ }
47
+ async function listDirectoryEntrySuggestions(cwd, directoryPrefix) {
48
+ const policy = await createPathAccessPolicy(cwd, undefined);
49
+ const resolved = await resolveWorkspaceSuggestionDirectory(policy, directoryPrefix);
50
+ if (resolved === undefined)
51
+ return [];
52
+ const entries = await readdir(resolved.target, { withFileTypes: true });
53
+ const suggestions = [];
54
+ for (const entry of entries.sort(compareDirectoryEntries)) {
55
+ const childPath = appendRequestPath(resolved.displayPath, entry.name);
56
+ const isDirectory = await suggestionEntryIsDirectory(policy, childPath, entry);
57
+ if (isDirectory === undefined)
58
+ continue;
59
+ suggestions.push({ path: `${childPath}${isDirectory ? "/" : ""}`, kind: "other" });
60
+ }
61
+ return suggestions;
62
+ }
63
+ async function resolveWorkspaceSuggestionDirectory(policy, directoryPrefix) {
64
+ try {
65
+ const resolved = await resolvePathAccessTarget(policy, directoryPrefix);
66
+ return resolved.kind === "workspace" ? resolved : undefined;
67
+ }
68
+ catch (error) {
69
+ if (isPathSuggestionMiss(error))
70
+ return undefined;
71
+ throw error;
72
+ }
73
+ }
74
+ async function listAllowedPathSuggestions(cwd, query, pathAccess, fzf) {
75
+ const policy = await createPathAccessPolicy(cwd, pathAccess);
76
+ if (policy.allowedRoots.length === 0)
77
+ throw new Error("Absolute paths are not allowed");
78
+ const rootCandidates = allowedRootSuggestionCandidates(policy, query);
79
+ const directoryCandidates = await listAllowedDirectoryEntryCandidates(policy, query);
80
+ return (await rankPathSuggestionsWithOptionalFzf(cwd, mergeSuggestions(rootCandidates, directoryCandidates), query, () => mergeSuggestions(allowedRootPrefixSuggestions(policy, query), prefixPathSuggestions(directoryCandidates, pathSuggestionPrefix(query).searchPrefix)).sort(compareFileSuggestions), fzf)).slice(0, maxFileSuggestions);
81
+ }
82
+ function allowedRootPrefixSuggestions(policy, query) {
83
+ return allowedRootSuggestionCandidates(policy, query).filter((suggestion) => pathStartsWith(suggestion.path, query));
84
+ }
85
+ function allowedRootSuggestionCandidates(policy, query) {
86
+ const suggestions = [];
87
+ const seen = new Set();
88
+ for (const root of policy.allowedRoots) {
89
+ for (const displayPath of allowedRootDisplayPaths(root.path, query)) {
90
+ const path = ensureTrailingPathSeparator(displayPath);
91
+ if (hasTrailingPathSeparator(query) && stripTrailingPathSeparators(path) === stripTrailingPathSeparators(query))
92
+ continue;
93
+ if (seen.has(path))
94
+ continue;
95
+ seen.add(path);
96
+ suggestions.push({ path, kind: "other" });
97
+ }
98
+ }
99
+ return suggestions;
100
+ }
101
+ function allowedRootDisplayPaths(rootPath, query) {
102
+ if (query !== "~" && !query.startsWith("~/") && !query.startsWith("~\\"))
103
+ return [rootPath];
104
+ const home = homedir();
105
+ const homeRelativePath = relative(home, rootPath);
106
+ if (!isInsideRelativePath(homeRelativePath))
107
+ return [rootPath];
108
+ const separator = query.startsWith("~\\") ? "\\" : "/";
109
+ const tildePath = homeRelativePath === "" ? "~" : `~${separator}${homeRelativePath.split(/[\\/]+/u).join(separator)}`;
110
+ return [tildePath, rootPath];
111
+ }
112
+ async function listAllowedDirectoryEntryCandidates(policy, query) {
113
+ const { directoryPrefix } = pathSuggestionPrefix(query);
114
+ const resolved = await resolveSuggestionDirectory(policy, directoryPrefix);
115
+ if (resolved === undefined)
116
+ return [];
117
+ const entries = await readdir(resolved.target, { withFileTypes: true });
118
+ const suggestions = [];
119
+ for (const entry of entries.sort(compareDirectoryEntries)) {
120
+ const childPath = appendRequestPath(directoryPrefix, entry.name);
121
+ const isDirectory = await suggestionEntryIsDirectory(policy, childPath, entry);
122
+ if (isDirectory === undefined)
123
+ continue;
124
+ suggestions.push({ path: `${childPath}${isDirectory ? "/" : ""}`, kind: "other" });
125
+ }
126
+ return suggestions;
127
+ }
128
+ async function resolveSuggestionDirectory(policy, directoryPrefix) {
129
+ try {
130
+ const resolved = await resolvePathAccessTarget(policy, directoryPrefix);
131
+ return resolved.kind === "allowed" ? resolved : undefined;
132
+ }
133
+ catch (error) {
134
+ if (isPathSuggestionMiss(error))
135
+ return undefined;
136
+ throw error;
137
+ }
138
+ }
139
+ async function suggestionEntryIsDirectory(policy, childPath, entry) {
140
+ if (!entry.isSymbolicLink())
141
+ return entry.isDirectory();
142
+ try {
143
+ const resolved = await resolvePathAccessTarget(policy, childPath);
144
+ const result = await stat(resolved.target);
145
+ if (result.isDirectory())
146
+ return true;
147
+ if (result.isFile())
148
+ return false;
149
+ return undefined;
150
+ }
151
+ catch (error) {
152
+ if (isPathSuggestionMiss(error))
153
+ return undefined;
154
+ throw error;
155
+ }
156
+ }
157
+ function pathSuggestionPrefix(query) {
158
+ if (query === "~" || hasTrailingPathSeparator(query))
159
+ return { directoryPrefix: query, searchPrefix: "" };
160
+ const directory = dirname(query);
161
+ return { directoryPrefix: directory === "." ? "" : directory, searchPrefix: basename(query) };
162
+ }
163
+ function appendRequestPath(base, name) {
164
+ if (base === "")
165
+ return name;
166
+ if (isAbsolute(base) || win32.isAbsolute(base))
167
+ return join(base, name);
168
+ if (hasTrailingPathSeparator(base))
169
+ return `${base}${name}`;
170
+ return `${base}/${name}`;
171
+ }
172
+ function pathStartsWith(path, query) {
173
+ return path.toLowerCase().startsWith(query.toLowerCase());
174
+ }
175
+ function ensureTrailingPathSeparator(path) {
176
+ return hasTrailingPathSeparator(path) ? path : `${path}/`;
177
+ }
178
+ function hasTrailingPathSeparator(path) {
179
+ return path.endsWith("/") || path.endsWith("\\");
180
+ }
181
+ function stripTrailingPathSeparators(path) {
182
+ let end = path.length;
183
+ while (end > 1 && (path[end - 1] === "/" || path[end - 1] === "\\"))
184
+ end -= 1;
185
+ return path.slice(0, end);
186
+ }
187
+ function isInsideRelativePath(path) {
188
+ return path === "" || (path !== ".." && !path.startsWith(`..${sep}`) && !isAbsolute(path));
189
+ }
190
+ function isPathSuggestionMiss(error) {
191
+ if (!(error instanceof Error))
192
+ return false;
193
+ return error.message === "Path is outside allowed paths"
194
+ || error.message === "Path does not exist"
195
+ || error.message === "Path traversal is not allowed"
196
+ || error.message === "Path escapes workspace"
197
+ || error.message.startsWith("Path is not absolute:");
198
+ }
199
+ async function listFilesForScope(cwd, scope, exec) {
200
+ if (scope === "all")
201
+ return listAllFiles(cwd, exec);
202
+ if (scope === "tracked")
203
+ return listTrackedFiles(cwd, exec).catch(() => listPlainFiles(cwd, exec, true));
204
+ return listGitFiles(cwd, exec).catch(() => listPlainFiles(cwd, exec, false));
205
+ }
206
+ async function listTrackedFiles(cwd, exec) {
207
+ return withDirectories(nulRecords(await git(cwd, ["ls-files", "-z"], exec)), "tracked");
208
+ }
209
+ async function listGitFiles(cwd, exec) {
210
+ const [trackedResult, untrackedResult] = await Promise.allSettled([
211
+ git(cwd, ["ls-files", "-z"], exec),
212
+ git(cwd, ["ls-files", "--others", "--exclude-standard", "-z"], exec),
213
+ ]);
214
+ if (trackedResult.status === "rejected")
215
+ throw trackedResult.reason;
216
+ if (untrackedResult.status === "rejected")
217
+ throw untrackedResult.reason;
218
+ return [
219
+ ...withDirectories(nulRecords(trackedResult.value), "tracked"),
220
+ ...withDirectories(nulRecords(untrackedResult.value), "untracked"),
221
+ ];
222
+ }
223
+ async function listAllFiles(cwd, exec) {
224
+ const [gitFiles, plainFiles] = await Promise.all([
225
+ listGitFiles(cwd, exec).catch(() => []),
226
+ listPlainFiles(cwd, exec, true),
227
+ ]);
228
+ return mergeSuggestions(gitFiles, plainFiles);
229
+ }
230
+ async function listPlainFiles(cwd, exec, includeIgnored) {
231
+ try {
232
+ const args = includeIgnored ? ["--files", "--hidden", "--no-ignore", "--glob", "!.git", "--glob", "!.git/**"] : ["--files"];
233
+ const { stdout } = await exec("rg", args, { cwd, maxBuffer: commandMaxBuffer });
234
+ return withDirectories(textLines(stdout), "other");
235
+ }
236
+ catch {
237
+ return withDirectories(await filesystemFiles(cwd), "other");
238
+ }
239
+ }
240
+ async function filesystemFiles(cwd) {
241
+ const paths = [];
242
+ await collectFilesystemFiles(cwd, "", paths, false);
243
+ return paths;
244
+ }
245
+ async function collectFilesystemFiles(cwd, relativeDirectory, paths, optionalDirectory) {
246
+ if (paths.length >= maxFilesystemFallbackPaths)
247
+ return;
248
+ const absoluteDirectory = relativeDirectory === "" ? cwd : join(cwd, relativeDirectory);
249
+ let entries;
250
+ try {
251
+ entries = await readdir(absoluteDirectory, { withFileTypes: true });
252
+ }
253
+ catch (error) {
254
+ if (optionalDirectory)
255
+ return;
256
+ throw error;
257
+ }
258
+ entries.sort((a, b) => Number(!a.isDirectory()) - Number(!b.isDirectory()) || a.name.localeCompare(b.name));
259
+ for (const entry of entries) {
260
+ if (paths.length >= maxFilesystemFallbackPaths)
261
+ return;
262
+ const relativePath = relativeDirectory === "" ? entry.name : `${relativeDirectory}/${entry.name}`;
263
+ if (entry.isDirectory()) {
264
+ if (entry.name === ".git")
265
+ continue;
266
+ await collectFilesystemFiles(cwd, relativePath, paths, true);
267
+ continue;
268
+ }
269
+ if (entry.isFile() || await isSymlinkedFile(cwd, relativePath, entry.isSymbolicLink()))
270
+ paths.push(relativePath);
271
+ }
272
+ }
273
+ async function isSymlinkedFile(cwd, relativePath, symbolicLink) {
274
+ if (!symbolicLink)
275
+ return false;
276
+ try {
277
+ return (await stat(join(cwd, relativePath))).isFile();
278
+ }
279
+ catch {
280
+ return false;
281
+ }
282
+ }
283
+ async function git(cwd, args, exec) {
284
+ const { stdout } = await exec("git", args, { cwd, env: sanitizedGitEnv(), maxBuffer: commandMaxBuffer });
285
+ return stdout;
286
+ }
287
+ function normalizeFileQuery(query) {
288
+ return fileQueryText(query).toLowerCase();
289
+ }
290
+ function fileQueryText(query) {
291
+ return query.replace(/^!@/, "").replace(/^@\s?/, "").replace(/^"/, "");
292
+ }
293
+ function fzfRunnerForDependencies(deps) {
294
+ return deps.fzf ?? (deps.execFile === undefined ? runCommand : undefined);
295
+ }
296
+ async function rankFileSuggestionsWithOptionalFzf(cwd, files, normalizedQuery, fzf) {
297
+ return rankSuggestionsWithOptionalFzf(cwd, files, normalizedQuery, () => rankFileSuggestions(files, normalizedQuery), fzf);
298
+ }
299
+ async function rankPathSuggestionsWithOptionalFzf(cwd, candidates, query, fallback, fzf) {
300
+ return rankSuggestionsWithOptionalFzf(cwd, candidates, query, fallback, fzf);
301
+ }
302
+ async function rankSuggestionsWithOptionalFzf(cwd, candidates, query, fallback, fzf) {
303
+ if (fzf === undefined || query === "" || candidates.length === 0)
304
+ return fallback();
305
+ try {
306
+ return await fzfFilterSuggestions(cwd, candidates, query, fzf);
307
+ }
308
+ catch {
309
+ return fallback();
310
+ }
311
+ }
312
+ async function fzfFilterSuggestions(cwd, candidates, query, fzf) {
313
+ const byPath = new Map(candidates.map((suggestion) => [suggestion.path, suggestion]));
314
+ const { stdout } = await runFzf(cwd, [...byPath.keys()], query, fzf);
315
+ const suggestions = [];
316
+ const seen = new Set();
317
+ for (const path of nulRecords(stdout)) {
318
+ const suggestion = byPath.get(path);
319
+ if (suggestion === undefined || seen.has(suggestion.path))
320
+ continue;
321
+ seen.add(suggestion.path);
322
+ suggestions.push(suggestion);
323
+ }
324
+ if (suggestions.length === 0 && stdout !== "")
325
+ throw new Error("fzf returned paths outside the gathered suggestions");
326
+ return suggestions;
327
+ }
328
+ async function runFzf(cwd, candidates, query, fzf) {
329
+ try {
330
+ return await fzf("fzf", ["--filter", query, "--read0", "--print0"], { cwd, maxBuffer: commandMaxBuffer, input: `${candidates.join("\0")}\0` });
331
+ }
332
+ catch (error) {
333
+ if (errorExitCode(error) === 1)
334
+ return { stdout: "" };
335
+ throw error;
336
+ }
337
+ }
338
+ function prefixPathSuggestions(candidates, searchPrefix) {
339
+ const normalizedSearchPrefix = searchPrefix.toLowerCase();
340
+ return candidates
341
+ .filter((suggestion) => pathSuggestionName(suggestion.path).toLowerCase().startsWith(normalizedSearchPrefix))
342
+ .sort(compareFileSuggestions);
343
+ }
344
+ function pathSuggestionName(path) {
345
+ const stripped = stripTrailingPathSeparators(path);
346
+ return stripped.split(/[\\/]+/u).filter(Boolean).at(-1) ?? stripped;
347
+ }
348
+ function rankFileSuggestions(files, normalizedQuery) {
349
+ if (normalizedQuery === "")
350
+ return [...files].sort(compareFileSuggestions);
351
+ return files
352
+ .map((file) => ({ file, score: fileSuggestionScore(file.path, normalizedQuery) }))
353
+ .filter(({ score }) => score > 0)
354
+ .sort((a, b) => b.score - a.score || kindRank(a.file.kind) - kindRank(b.file.kind) || pathDepth(a.file.path) - pathDepth(b.file.path) || compareFileSuggestions(a.file, b.file))
355
+ .map(({ file }) => file);
356
+ }
357
+ function fileSuggestionScore(path, normalizedQuery) {
358
+ const normalizedPath = normalizeSuggestionPathForSearch(path);
359
+ const name = displayBasename(normalizedPath);
360
+ if (normalizedPath === normalizedQuery)
361
+ return 1000;
362
+ if (name === normalizedQuery)
363
+ return 980;
364
+ if (name.startsWith(normalizedQuery))
365
+ return 900;
366
+ if (normalizedPath.startsWith(normalizedQuery))
367
+ return 850;
368
+ if (name.includes(normalizedQuery))
369
+ return 750;
370
+ if (normalizedPath.includes(normalizedQuery))
371
+ return 650;
372
+ const tokens = normalizedQuery.split(/\s+/u).filter(Boolean);
373
+ if (tokens.length > 1 && tokens.every((token) => normalizedPath.includes(token))) {
374
+ return 550 + tokens.filter((token) => name.includes(token)).length * 25;
375
+ }
376
+ return isSubsequence(normalizedQuery, normalizedPath) ? 200 : 0;
377
+ }
378
+ function normalizeSuggestionPathForSearch(path) {
379
+ const lower = path.toLowerCase();
380
+ return lower.endsWith("/") ? lower.slice(0, -1) : lower;
381
+ }
382
+ function displayBasename(path) {
383
+ return path.split("/").filter(Boolean).at(-1) ?? path;
384
+ }
385
+ function isSubsequence(needle, haystack) {
386
+ let haystackIndex = 0;
387
+ for (const char of needle) {
388
+ haystackIndex = haystack.indexOf(char, haystackIndex);
389
+ if (haystackIndex === -1)
390
+ return false;
391
+ haystackIndex += char.length;
392
+ }
393
+ return true;
394
+ }
395
+ function compareFileSuggestions(a, b) {
396
+ return Number(!a.path.endsWith("/")) - Number(!b.path.endsWith("/")) || a.path.localeCompare(b.path);
397
+ }
398
+ function compareDirectoryEntries(a, b) {
399
+ return Number(!a.isDirectory()) - Number(!b.isDirectory()) || a.name.localeCompare(b.name);
400
+ }
401
+ function kindRank(kind) {
402
+ switch (kind) {
403
+ case "tracked": return 0;
404
+ case "untracked": return 1;
405
+ case "other": return 2;
406
+ }
407
+ }
408
+ function pathDepth(path) {
409
+ return path.split("/").filter(Boolean).length;
410
+ }
411
+ async function runCommand(file, args, options) {
412
+ const { input, ...execOptions } = options;
413
+ if (input === undefined)
414
+ return execFileAsync(file, args, execOptions);
415
+ return runCommandWithInput(file, args, { ...execOptions, input });
416
+ }
417
+ async function runCommandWithInput(file, args, options) {
418
+ return await new Promise((resolve, reject) => {
419
+ const child = spawn(file, args, {
420
+ cwd: options.cwd,
421
+ ...(options.env === undefined ? {} : { env: options.env }),
422
+ stdio: ["pipe", "pipe", "pipe"],
423
+ });
424
+ let settled = false;
425
+ let stdout = "";
426
+ let stderr = "";
427
+ let stdoutBytes = 0;
428
+ let stderrBytes = 0;
429
+ const rejectOnce = (error) => {
430
+ if (settled)
431
+ return;
432
+ settled = true;
433
+ reject(error);
434
+ };
435
+ child.stdout.on("data", (chunk) => {
436
+ stdoutBytes += chunk.length;
437
+ if (stdoutBytes > options.maxBuffer) {
438
+ child.kill();
439
+ rejectOnce(new Error(`${file} stdout exceeded maxBuffer`));
440
+ return;
441
+ }
442
+ stdout += chunk.toString("utf8");
443
+ });
444
+ child.stderr.on("data", (chunk) => {
445
+ stderrBytes += chunk.length;
446
+ if (stderrBytes > options.maxBuffer) {
447
+ child.kill();
448
+ rejectOnce(new Error(`${file} stderr exceeded maxBuffer`));
449
+ return;
450
+ }
451
+ stderr += chunk.toString("utf8");
452
+ });
453
+ child.on("error", rejectOnce);
454
+ child.on("close", (code) => {
455
+ if (settled)
456
+ return;
457
+ settled = true;
458
+ if (code === 0) {
459
+ resolve({ stdout });
460
+ return;
461
+ }
462
+ reject(new CommandExitError(file, code, stderr));
463
+ });
464
+ child.stdin.on("error", () => undefined);
465
+ child.stdin.end(options.input);
466
+ });
467
+ }
468
+ function errorExitCode(error) {
469
+ if (error instanceof CommandExitError)
470
+ return error.exitCode;
471
+ if (!(error instanceof Error))
472
+ return undefined;
473
+ if ("exitCode" in error && typeof error.exitCode === "number")
474
+ return error.exitCode;
475
+ if ("code" in error && typeof error.code === "number")
476
+ return error.code;
477
+ return undefined;
478
+ }
479
+ function textLines(text) {
480
+ return text.split("\n").map((line) => line.endsWith("\r") ? line.slice(0, -1) : line).filter((line) => line !== "");
481
+ }
482
+ function nulRecords(text) {
483
+ return text.split("\0").filter((record) => record !== "");
484
+ }
485
+ function mergeSuggestions(primary, secondary) {
486
+ const seen = new Set();
487
+ const merged = [];
488
+ for (const suggestion of [...primary, ...secondary]) {
489
+ if (seen.has(suggestion.path))
490
+ continue;
491
+ seen.add(suggestion.path);
492
+ merged.push(suggestion);
493
+ }
494
+ return merged;
495
+ }
496
+ function withDirectories(paths, kind) {
497
+ const seen = new Set();
498
+ const suggestions = [];
499
+ for (const path of paths) {
500
+ for (const directory of parentDirectories(path))
501
+ add(`${directory}/`);
502
+ add(path);
503
+ }
504
+ return suggestions;
505
+ function add(path) {
506
+ if (seen.has(path))
507
+ return;
508
+ seen.add(path);
509
+ suggestions.push({ path, kind });
510
+ }
511
+ }
512
+ function parentDirectories(path) {
513
+ const parts = path.split("/").filter(Boolean);
514
+ const directories = [];
515
+ for (let index = 1; index < parts.length; index++) {
516
+ directories.push(parts.slice(0, index).join("/"));
517
+ }
518
+ return directories;
519
+ }
520
+ //# sourceMappingURL=fileSuggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileSuggestions.js","sourceRoot":"","sources":["../../../src/server/workspaces/fileSuggestions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,uBAAuB,EAAyB,MAAM,uBAAuB,CAAC;AAElI,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;AACzC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAC1C,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAW9B,MAAM,gBAAiB,SAAQ,KAAK;IAGlC,YAAY,IAAY,EAAE,IAAmB,EAAE,MAAc;QAC3D,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,KAAK,CAAC,GAAG,IAAI,qBAAqB,QAAQ,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,IAAI,KAAK,IAAI;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1C,CAAC;CACF;AAeD,MAAM,UAAU,gCAAgC,CAAC,KAAK,GAAG,EAAE;IACzD,OAAO,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,KAAK,GAAG,EAAE,EAAE,UAAiC,EAAE,EAAE,OAAmC,EAAE;IAC3I,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,gCAAgC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;aACzE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;aAC1E,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,MAAM,kCAAkC,CAC9C,GAAG,EACH,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,EAChF,eAAe,EACf,wBAAwB,CAAC,IAAI,CAAC,CAC/B,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE,EAAE,UAAoC,EAAE,OAAmC,EAAE;IAC7I,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAE7F,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC;IACrJ,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACtF,MAAM,UAAU,GAAG,MAAM,6BAA6B,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC7E,OAAO,CAAC,MAAM,kCAAkC,CAC9C,GAAG,EACH,UAAU,EACV,YAAY,EACZ,GAAG,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,EACrD,GAAG,CACJ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,6BAA6B,CAAC,GAAW,EAAE,eAAuB;IAC/E,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,mCAAmC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACpF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/E,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QACxC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,mCAAmC,CAAC,MAAwB,EAAE,eAAuB;IAClG,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACxE,OAAO,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,oBAAoB,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,GAAW,EAAE,KAAa,EAAE,UAA+C,EAAE,GAA8B;IACnJ,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACxF,MAAM,cAAc,GAAG,+BAA+B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,MAAM,mCAAmC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrF,OAAO,CAAC,MAAM,kCAAkC,CAC9C,GAAG,EACH,gBAAgB,CAAC,cAAc,EAAE,mBAAmB,CAAC,EACrD,KAAK,EACL,GAAG,EAAE,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,qBAAqB,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,EACtL,GAAG,CACJ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAwB,EAAE,KAAa;IAC3E,OAAO,+BAA+B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACvH,CAAC;AAED,SAAS,+BAA+B,CAAC,MAAwB,EAAE,KAAa;IAC9E,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACvC,KAAK,MAAM,WAAW,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,wBAAwB,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,2BAA2B,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC1H,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,KAAa;IAC9D,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5F,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,MAAM,SAAS,GAAG,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IACtH,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,mCAAmC,CAAC,MAAwB,EAAE,KAAa;IACxF,MAAM,EAAE,eAAe,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC3E,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/E,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QACxC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAAwB,EAAE,eAAuB;IACzF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACxE,OAAO,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,oBAAoB,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAAwB,EAAE,SAAiB,EAAE,KAA4D;IACjJ,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,KAAK,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,oBAAoB,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,IAAI,KAAK,KAAK,GAAG,IAAI,wBAAwB,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC1G,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,EAAE,eAAe,EAAE,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAY;IACnD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxE,IAAI,wBAAwB,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;IAC5D,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,KAAa;IACjD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAY;IAC/C,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;AAC5D,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAY;IAC/C,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,GAAG,IAAI,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAO,KAAK,+BAA+B;WACnD,KAAK,CAAC,OAAO,KAAK,qBAAqB;WACvC,KAAK,CAAC,OAAO,KAAK,+BAA+B;WACjD,KAAK,CAAC,OAAO,KAAK,wBAAwB;WAC1C,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,KAAsC,EAAE,IAAmB;IACvG,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACzG,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAmB;IAC9D,OAAO,eAAe,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1F,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAmB;IAC1D,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QAChE,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;QAClC,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;KAC5D,CAAC,CAAC;IACZ,IAAI,aAAa,CAAC,MAAM,KAAK,UAAU;QAAE,MAAM,aAAa,CAAC,MAAM,CAAC;IACpE,IAAI,eAAe,CAAC,MAAM,KAAK,UAAU;QAAE,MAAM,eAAe,CAAC,MAAM,CAAC;IAExE,OAAO;QACL,GAAG,eAAe,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;QAC9D,GAAG,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAmB;IAC1D,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAA2B,EAAE,CAAC,EAAE,CAAC;QAC/D,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;KAChC,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAAmB,EAAE,cAAuB;IACrF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5H,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAChF,OAAO,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,sBAAsB,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,GAAW,EAAE,iBAAyB,EAAE,KAAe,EAAE,iBAA0B;IACvH,IAAI,KAAK,CAAC,MAAM,IAAI,0BAA0B;QAAE,OAAO;IACvD,MAAM,iBAAiB,GAAG,iBAAiB,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACxF,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,iBAAiB;YAAE,OAAO;QAC9B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5G,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,0BAA0B;YAAE,OAAO;QACvD,MAAM,YAAY,GAAG,iBAAiB,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAClG,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACpC,MAAM,sBAAsB,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,MAAM,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,YAAoB,EAAE,YAAqB;IACrF,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,IAAmB;IACjE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAgC;IAChE,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,kCAAkC,CAAC,GAAW,EAAE,KAA6B,EAAE,eAAuB,EAAE,GAA8B;IACnJ,OAAO,8BAA8B,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7H,CAAC;AAED,KAAK,UAAU,kCAAkC,CAAC,GAAW,EAAE,UAAkC,EAAE,KAAa,EAAE,QAAsC,EAAE,GAA8B;IACtL,OAAO,8BAA8B,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,GAAW,EAAE,UAAkC,EAAE,KAAa,EAAE,QAAsC,EAAE,GAA8B;IAClL,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,EAAE,CAAC;IAEpF,IAAI,CAAC;QACH,OAAO,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,UAAkC,EAAE,KAAa,EAAE,GAAkB;IACpH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACrE,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACpE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACtH,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,UAAoB,EAAE,KAAa,EAAE,GAAkB;IACxF,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACjJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkC,EAAE,YAAoB;IACrF,MAAM,sBAAsB,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAC1D,OAAO,UAAU;SACd,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;SAC5G,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;AACtE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA6B,EAAE,eAAuB;IACjF,IAAI,eAAe,KAAK,EAAE;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC3E,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;SACjF,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;SAC/K,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,eAAuB;IAChE,MAAM,cAAc,GAAG,gCAAgC,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,cAAc,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,GAAG,CAAC;IACzC,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,GAAG,CAAC;IACjD,IAAI,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/C,IAAI,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,GAAG,CAAC;IAEzD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;IAC1E,CAAC;IAED,OAAO,aAAa,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gCAAgC,CAAC,IAAY;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,QAAgB;IACrD,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,aAAa,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAuB,EAAE,CAAuB;IAC9E,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,uBAAuB,CAAC,CAA2C,EAAE,CAA2C;IACvH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,QAAQ,CAAC,IAAkC;IAClD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;QACzB,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3B,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAAc,EAAE,OAA6B;IACnF,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvE,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAc,EAAE,OAA0D;IACzH,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;YAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1D,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,EAAE;YAClC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,gBAAgB;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;IAC7D,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,UAAU,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;IACrF,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACzE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACtH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA+B,EAAE,SAAiC;IAC1F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACxC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,KAAe,EAAE,IAAkC;IAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,WAAW,CAAC;IAEnB,SAAS,GAAG,CAAC,IAAY;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { lstat, readdir } from "node:fs/promises";
2
+ import { isAbsolute, join, win32 } from "node:path";
3
+ import { resolveWorkspacePathAccessTarget } from "./pathAccessPolicy.js";
4
+ const MAX_ENTRIES = 1000;
5
+ export async function listWorkspaceTree(rootPath, path, pathAccess) {
6
+ const { target, displayPath } = await resolveWorkspacePathAccessTarget(rootPath, path, pathAccess);
7
+ const stat = await lstat(target);
8
+ if (!stat.isDirectory())
9
+ throw new Error("Path is not a directory");
10
+ const dirents = await readdir(target, { withFileTypes: true });
11
+ const sorted = dirents.sort((a, b) => {
12
+ if (a.isDirectory() !== b.isDirectory())
13
+ return a.isDirectory() ? -1 : 1;
14
+ return a.name.localeCompare(b.name);
15
+ });
16
+ const selected = sorted.slice(0, MAX_ENTRIES);
17
+ const entries = await Promise.all(selected.map(async (entry) => {
18
+ const absolute = join(target, entry.name);
19
+ const childPath = appendRequestPath(displayPath, entry.name);
20
+ const childStat = await lstat(absolute);
21
+ const type = entry.isDirectory() ? "directory" : entry.isSymbolicLink() ? "symlink" : "file";
22
+ return { name: entry.name, path: childPath, type, size: childStat.size, modifiedAt: childStat.mtime.toISOString() };
23
+ }));
24
+ return { path: displayPath, entries, scannedAt: new Date().toISOString(), truncated: sorted.length > selected.length };
25
+ }
26
+ function appendRequestPath(base, name) {
27
+ if (base === "")
28
+ return name;
29
+ if (isAbsolute(base) || win32.isAbsolute(base))
30
+ return join(base, name);
31
+ if (base.endsWith("/") || base.endsWith("\\"))
32
+ return `${base}${name}`;
33
+ return `${base}/${name}`;
34
+ }
35
+ //# sourceMappingURL=fileTreeService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileTreeService.js","sourceRoot":"","sources":["../../../src/server/workspaces/fileTreeService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { sanitizedGitEnv } from "../git/gitEnv.js";
4
+ const execFileAsync = promisify(execFile);
5
+ export async function isGitRepository(path) {
6
+ try {
7
+ const { stdout } = await execFileAsync("git", ["-C", path, "rev-parse", "--is-inside-work-tree"], { env: sanitizedGitEnv() });
8
+ return stdout.trim() === "true";
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ export async function discoverGitWorktrees(path) {
15
+ const { stdout } = await execFileAsync("git", ["-C", path, "worktree", "list", "--porcelain"], { env: sanitizedGitEnv() });
16
+ const chunks = stdout.trim().split(/\n\s*\n/).filter(Boolean);
17
+ return chunks.map((chunk) => {
18
+ const info = { path: "" };
19
+ for (const line of chunk.split("\n")) {
20
+ const [key, ...rest] = line.split(" ");
21
+ const value = rest.join(" ");
22
+ if (key === "worktree")
23
+ info.path = value;
24
+ if (key === "branch")
25
+ info.branch = value.replace(/^refs\/heads\//, "");
26
+ if (key === "bare")
27
+ info.bare = true;
28
+ if (key === "detached")
29
+ info.detached = true;
30
+ }
31
+ return info;
32
+ }).filter((w) => w.path);
33
+ }
34
+ //# sourceMappingURL=gitWorktreeDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitWorktreeDiscovery.js","sourceRoot":"","sources":["../../../src/server/workspaces/gitWorktreeDiscovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAS1C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC9H,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY;IACrD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IAC3H,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE9D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,KAAK,UAAU;gBAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAC1C,IAAI,GAAG,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACxE,IAAI,GAAG,KAAK,MAAM;gBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACrC,IAAI,GAAG,KAAK,UAAU;gBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}