@letrquan/book 0.2.0 → 0.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/CHANGELOG.md +3771 -40
  2. package/README.md +135 -1311
  3. package/dist/additional-roots-VAWRQ625.js +32 -0
  4. package/dist/{app-MOXXWEOY.js → app-J7BVPSUH.js} +9648 -5509
  5. package/dist/app-J7BVPSUH.js.map +1 -0
  6. package/dist/chunk-2AAOF5B5.js +28 -0
  7. package/dist/chunk-2AAOF5B5.js.map +1 -0
  8. package/dist/chunk-32WBCUAN.js +660 -0
  9. package/dist/chunk-32WBCUAN.js.map +1 -0
  10. package/dist/chunk-4DKHLZRI.js +120 -0
  11. package/dist/chunk-4DKHLZRI.js.map +1 -0
  12. package/dist/{chunk-CAGOB2N4.js → chunk-62EEAUID.js} +6 -4
  13. package/dist/chunk-62EEAUID.js.map +1 -0
  14. package/dist/chunk-AHC7OU75.js +1124 -0
  15. package/dist/chunk-AHC7OU75.js.map +1 -0
  16. package/dist/{chunk-E75IPST5.js → chunk-AJZWLKLQ.js} +73 -70
  17. package/dist/chunk-AJZWLKLQ.js.map +1 -0
  18. package/dist/chunk-B5FC3MYZ.js +395 -0
  19. package/dist/chunk-B5FC3MYZ.js.map +1 -0
  20. package/dist/{chunk-KWHQ2XXL.js → chunk-DNFQTSMJ.js} +55 -13
  21. package/dist/chunk-DNFQTSMJ.js.map +1 -0
  22. package/dist/{chunk-J7MIZ5CA.js → chunk-E5WLQSKA.js} +719 -89
  23. package/dist/chunk-E5WLQSKA.js.map +1 -0
  24. package/dist/chunk-ECLC4CIJ.js +1181 -0
  25. package/dist/chunk-ECLC4CIJ.js.map +1 -0
  26. package/dist/chunk-EEX6QNXV.js +127 -0
  27. package/dist/chunk-EEX6QNXV.js.map +1 -0
  28. package/dist/chunk-EFXVSQ5J.js +931 -0
  29. package/dist/chunk-EFXVSQ5J.js.map +1 -0
  30. package/dist/{chunk-V4BOYR52.js → chunk-ENLB7NYV.js} +1304 -326
  31. package/dist/chunk-ENLB7NYV.js.map +1 -0
  32. package/dist/chunk-FPR7SKIE.js +6926 -0
  33. package/dist/chunk-FPR7SKIE.js.map +1 -0
  34. package/dist/{chunk-DGMQEI6Y.js → chunk-HFB74CLM.js} +30 -9
  35. package/dist/chunk-HFB74CLM.js.map +1 -0
  36. package/dist/{chunk-5RDRAO4B.js → chunk-HOZXKOE3.js} +37 -1
  37. package/dist/chunk-HOZXKOE3.js.map +1 -0
  38. package/dist/chunk-IDYWN37T.js +36 -0
  39. package/dist/chunk-IDYWN37T.js.map +1 -0
  40. package/dist/chunk-J4F2QLM2.js +273 -0
  41. package/dist/chunk-J4F2QLM2.js.map +1 -0
  42. package/dist/chunk-JGF5HLSI.js +1065 -0
  43. package/dist/chunk-JGF5HLSI.js.map +1 -0
  44. package/dist/{chunk-XIFFTATU.js → chunk-KDNWMKXV.js} +7166 -4237
  45. package/dist/chunk-KDNWMKXV.js.map +1 -0
  46. package/dist/chunk-KXAYUIKP.js +90 -0
  47. package/dist/chunk-KXAYUIKP.js.map +1 -0
  48. package/dist/{chunk-3U5IBM24.js → chunk-MEOB2DZA.js} +12 -2
  49. package/dist/chunk-MEOB2DZA.js.map +1 -0
  50. package/dist/{chunk-WKBO5R4O.js → chunk-MV5PQNIA.js} +2 -2
  51. package/dist/chunk-MV5PQNIA.js.map +1 -0
  52. package/dist/chunk-N2G4Q7ME.js +2672 -0
  53. package/dist/chunk-N2G4Q7ME.js.map +1 -0
  54. package/dist/chunk-OJBMDM5H.js +299 -0
  55. package/dist/chunk-OJBMDM5H.js.map +1 -0
  56. package/dist/{chunk-URLQAXTR.js → chunk-PTDC7ZUP.js} +2 -2
  57. package/dist/chunk-PTDC7ZUP.js.map +1 -0
  58. package/dist/{chunk-574C6MQR.js → chunk-REASC2QG.js} +173 -64
  59. package/dist/chunk-REASC2QG.js.map +1 -0
  60. package/dist/{chunk-7N4J557C.js → chunk-RT5SATF7.js} +1 -1
  61. package/dist/chunk-RT5SATF7.js.map +1 -0
  62. package/dist/chunk-SBTU5BEC.js +114 -0
  63. package/dist/chunk-SBTU5BEC.js.map +1 -0
  64. package/dist/{chunk-5KLVH3PY.js → chunk-SWPDKLNM.js} +5 -3
  65. package/dist/chunk-SWPDKLNM.js.map +1 -0
  66. package/dist/chunk-UCFJ43OS.js +520 -0
  67. package/dist/chunk-UCFJ43OS.js.map +1 -0
  68. package/dist/{chunk-VZQXX3WW.js → chunk-W7SLYS3M.js} +80 -16
  69. package/dist/chunk-W7SLYS3M.js.map +1 -0
  70. package/dist/{chunk-ANSJPYGI.js → chunk-WV3O5PGX.js} +3 -3
  71. package/dist/chunk-WV3O5PGX.js.map +1 -0
  72. package/dist/chunk-XHAO3K7I.js +18 -0
  73. package/dist/chunk-XHAO3K7I.js.map +1 -0
  74. package/dist/chunk-XJRJVXJR.js +1050 -0
  75. package/dist/chunk-XJRJVXJR.js.map +1 -0
  76. package/dist/chunk-YIL6HTJX.js +663 -0
  77. package/dist/chunk-YIL6HTJX.js.map +1 -0
  78. package/dist/{chunk-24AXE6SP.js → chunk-ZPSZZUWF.js} +1 -1
  79. package/dist/chunk-ZPSZZUWF.js.map +1 -0
  80. package/dist/{command-approvals-6Y57VCWZ.js → command-approvals-ZRY66LCW.js} +7 -5
  81. package/dist/context-C3RAP6K5.js +41 -0
  82. package/dist/{hook-approvals-CTUFKEJT.js → hook-approvals-DPQD5H65.js} +6 -5
  83. package/dist/index.js +947 -203
  84. package/dist/index.js.map +1 -1
  85. package/dist/{interactive-assets-CCAAWVKH.js → interactive-assets-73AQO5WP.js} +18 -9
  86. package/dist/interactive-assets-73AQO5WP.js.map +1 -0
  87. package/dist/job-runner.js +166 -111
  88. package/dist/job-runner.js.map +1 -1
  89. package/dist/job-supervisor.d.ts +2 -0
  90. package/dist/job-supervisor.js +121 -0
  91. package/dist/job-supervisor.js.map +1 -0
  92. package/dist/loader-DQNPDKOX.js +27 -0
  93. package/dist/{mcp-approvals-WNPH65BK.js → mcp-approvals-27LJYADQ.js} +6 -5
  94. package/dist/{mcp-config-YIJIES2C.js → mcp-config-GXSODNCM.js} +4 -3
  95. package/dist/memory-store-I6Z54VUN.js +51 -0
  96. package/dist/{model-window-store-YFVNXCIP.js → model-window-store-6VKXXTPJ.js} +9 -4
  97. package/dist/openai-compatible-IPUNBJ53.js +16 -0
  98. package/dist/permission-approvals-Q5IMFEZI.js +15 -0
  99. package/dist/permissions-7Y35X6HZ.js +62 -0
  100. package/dist/provider-approvals-5AGH3RVT.js +76 -0
  101. package/dist/sandbox-N2RY72GN.js +42 -0
  102. package/dist/{scrollback-LUKLIBVI.js → scrollback-GD76GNM4.js} +44 -26
  103. package/dist/scrollback-GD76GNM4.js.map +1 -0
  104. package/dist/sdk.d.ts +2739 -2069
  105. package/dist/sdk.js +77 -42
  106. package/dist/sdk.js.map +1 -1
  107. package/dist/settings-loader-KDBH45AQ.js +43 -0
  108. package/dist/settings-loader-KDBH45AQ.js.map +1 -0
  109. package/dist/{settings-removed-JWWPT4WA.js → settings-removed-3ATWJEF3.js} +2 -2
  110. package/dist/settings-removed-3ATWJEF3.js.map +1 -0
  111. package/dist/shell-selection-Z5WORZU4.js +31 -0
  112. package/dist/shell-selection-Z5WORZU4.js.map +1 -0
  113. package/package.json +25 -24
  114. package/dist/app-MOXXWEOY.js.map +0 -1
  115. package/dist/chunk-24AXE6SP.js.map +0 -1
  116. package/dist/chunk-3U5IBM24.js.map +0 -1
  117. package/dist/chunk-574C6MQR.js.map +0 -1
  118. package/dist/chunk-5GDZ22YP.js +0 -449
  119. package/dist/chunk-5GDZ22YP.js.map +0 -1
  120. package/dist/chunk-5KLVH3PY.js.map +0 -1
  121. package/dist/chunk-5RDRAO4B.js.map +0 -1
  122. package/dist/chunk-7N4J557C.js.map +0 -1
  123. package/dist/chunk-A7JLBK2Y.js +0 -3506
  124. package/dist/chunk-A7JLBK2Y.js.map +0 -1
  125. package/dist/chunk-ANSJPYGI.js.map +0 -1
  126. package/dist/chunk-BTZZUCLI.js +0 -264
  127. package/dist/chunk-BTZZUCLI.js.map +0 -1
  128. package/dist/chunk-C7D4NJ2D.js +0 -217
  129. package/dist/chunk-C7D4NJ2D.js.map +0 -1
  130. package/dist/chunk-CAGOB2N4.js.map +0 -1
  131. package/dist/chunk-DGMQEI6Y.js.map +0 -1
  132. package/dist/chunk-E75IPST5.js.map +0 -1
  133. package/dist/chunk-EYGD6X2T.js +0 -180
  134. package/dist/chunk-EYGD6X2T.js.map +0 -1
  135. package/dist/chunk-GTVB4HEM.js +0 -765
  136. package/dist/chunk-GTVB4HEM.js.map +0 -1
  137. package/dist/chunk-J7MIZ5CA.js.map +0 -1
  138. package/dist/chunk-KWHQ2XXL.js.map +0 -1
  139. package/dist/chunk-L6LK2QIQ.js +0 -657
  140. package/dist/chunk-L6LK2QIQ.js.map +0 -1
  141. package/dist/chunk-MAQXCUR4.js +0 -1007
  142. package/dist/chunk-MAQXCUR4.js.map +0 -1
  143. package/dist/chunk-S4XL7HOM.js +0 -402
  144. package/dist/chunk-S4XL7HOM.js.map +0 -1
  145. package/dist/chunk-URLQAXTR.js.map +0 -1
  146. package/dist/chunk-V4BOYR52.js.map +0 -1
  147. package/dist/chunk-VZQXX3WW.js.map +0 -1
  148. package/dist/chunk-WKBO5R4O.js.map +0 -1
  149. package/dist/chunk-XIFFTATU.js.map +0 -1
  150. package/dist/context-ZC5IFEAX.js +0 -25
  151. package/dist/interactive-assets-CCAAWVKH.js.map +0 -1
  152. package/dist/loader-4IDS2RIE.js +0 -15
  153. package/dist/openai-compatible-RHZUBHV6.js +0 -10
  154. package/dist/permission-approvals-76PVREFD.js +0 -14
  155. package/dist/permissions-CHCKTFQQ.js +0 -28
  156. package/dist/sandbox-CNVAQDA7.js +0 -23
  157. package/dist/scrollback-LUKLIBVI.js.map +0 -1
  158. package/dist/settings-loader-M2QP5TX2.js +0 -21
  159. package/dist/shell-selection-V6QAYXPX.js +0 -17
  160. package/patches/ink+6.8.0.patch +0 -13
  161. package/scripts/apply-ink-patch.mjs +0 -29
  162. package/scripts/ink-patch.mjs +0 -59
  163. package/scripts/verify-ink-patch.mjs +0 -11
  164. /package/dist/{command-approvals-6Y57VCWZ.js.map → additional-roots-VAWRQ625.js.map} +0 -0
  165. /package/dist/{context-ZC5IFEAX.js.map → command-approvals-ZRY66LCW.js.map} +0 -0
  166. /package/dist/{hook-approvals-CTUFKEJT.js.map → context-C3RAP6K5.js.map} +0 -0
  167. /package/dist/{loader-4IDS2RIE.js.map → hook-approvals-DPQD5H65.js.map} +0 -0
  168. /package/dist/{mcp-approvals-WNPH65BK.js.map → loader-DQNPDKOX.js.map} +0 -0
  169. /package/dist/{mcp-config-YIJIES2C.js.map → mcp-approvals-27LJYADQ.js.map} +0 -0
  170. /package/dist/{model-window-store-YFVNXCIP.js.map → mcp-config-GXSODNCM.js.map} +0 -0
  171. /package/dist/{openai-compatible-RHZUBHV6.js.map → memory-store-I6Z54VUN.js.map} +0 -0
  172. /package/dist/{permission-approvals-76PVREFD.js.map → model-window-store-6VKXXTPJ.js.map} +0 -0
  173. /package/dist/{permissions-CHCKTFQQ.js.map → openai-compatible-IPUNBJ53.js.map} +0 -0
  174. /package/dist/{sandbox-CNVAQDA7.js.map → permission-approvals-Q5IMFEZI.js.map} +0 -0
  175. /package/dist/{settings-loader-M2QP5TX2.js.map → permissions-7Y35X6HZ.js.map} +0 -0
  176. /package/dist/{settings-removed-JWWPT4WA.js.map → provider-approvals-5AGH3RVT.js.map} +0 -0
  177. /package/dist/{shell-selection-V6QAYXPX.js.map → sandbox-N2RY72GN.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skills.ts"],"sourcesContent":["import {\n closeSync,\n existsSync,\n lstatSync,\n openSync,\n readFileSync,\n readSync,\n readdirSync,\n realpathSync,\n statSync,\n} from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport { homedir } from 'node:os';\nimport { dirname, isAbsolute, join, parse, relative, resolve, sep } from 'node:path';\nimport { parseFrontmatter } from './frontmatter.js';\nimport { resolveBookHome } from './book-home.js';\nimport { isUserHome, tryRealPath } from './repo-containment.js';\nimport type { SkillActivation, SkillExecution } from './settings.js';\nimport { createUncGuard, reachesUncPath, type UncGuard } from './unc-path.js';\n\nexport const SKILL_ENTRY_FILENAME = 'SKILL.md';\nexport const MAX_SKILL_HEADER_BYTES = 64 * 1024;\nexport const MAX_SKILL_BODY_BYTES = 100 * 1024;\nexport const MAX_SKILL_RESOURCES = 200;\nexport const MAX_SKILL_RESOURCE_DEPTH = 4;\nexport const MAX_SKILL_RESOURCE_BYTES = 2 * 1024 * 1024;\n\nconst SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nconst KNOWN_FRONTMATTER_FIELDS = new Set([\n 'name',\n 'description',\n 'license',\n 'compatibility',\n 'version',\n 'metadata',\n 'allowed-tools',\n 'tools',\n 'when_to_use',\n 'model',\n 'lifetime',\n 'disabled',\n // Interoperable Claude/Codex skill metadata. Invocation controls are\n // advisory to Book's explicit `$name` UI and do not grant permissions.\n 'disable-model-invocation',\n 'user-invocable',\n 'argument-hint',\n]);\n\nexport type SkillSource = 'user' | 'project';\nexport type SkillRootKind = 'book' | 'agents' | 'claude' | 'opencode';\nexport type SkillIssueSeverity = 'error' | 'warning';\n\nexport interface SkillIssue {\n code: string;\n message: string;\n severity: SkillIssueSeverity;\n}\n\nexport interface SkillResource {\n relativePath: string;\n byteSize: number;\n mtimeMs: number;\n digest: string;\n}\n\nexport interface ShadowedSkill {\n path: string;\n source: SkillSource;\n rootKind: SkillRootKind;\n}\n\n/** Metadata discovered without retaining or injecting the SKILL.md body. */\nexport interface Skill {\n id: string;\n version: string;\n descriptorDigest: string;\n resourceDigest: string;\n name: string;\n description: string;\n whenToUse?: string;\n license?: string;\n compatibility?: string;\n metadata: Record<string, string>;\n /** Requested tool ceiling. It never grants permission by itself. */\n allowedTools?: string[];\n model?: string;\n lifetime: 'turn' | 'run';\n /** Absolute path to the skill entrypoint. */\n path: string;\n /** Absolute directory that owns the skill and its resources. */\n rootPath: string;\n source: SkillSource;\n rootKind: SkillRootKind;\n activation: SkillActivation;\n execution: SkillExecution;\n invocationCount: number;\n entryByteSize: number;\n entryMtimeMs: number;\n resources: SkillResource[];\n issues: SkillIssue[];\n valid: boolean;\n shadowed: ShadowedSkill[];\n}\n\nexport interface LoadedSkillBody {\n body: string;\n digest: string;\n byteSize: number;\n}\n\nexport interface SkillRoot {\n path: string;\n source: SkillSource;\n kind: SkillRootKind;\n}\n\nexport interface DiscoverSkillsOptions {\n homeDir?: string;\n bookHomeDir?: string;\n includeUser?: boolean;\n projectRoot?: string;\n includeOpenCode?: boolean;\n enabled?: boolean;\n executionOverrides?: Readonly<Record<string, SkillExecution>>;\n}\n\nfunction pathKey(path: string): string {\n return process.platform === 'win32' ? resolve(path).toLowerCase() : resolve(path);\n}\n\n/**\n * The real path of a skill root, or undefined when it does not exist (it contributes no skills,\n * so there is nothing to fold).\n *\n * Only for asking whether a project root is a user root reached another way. {@link pathKey}\n * stays the path as written because it also builds the skill id, which keys consent and\n * execution overrides, and it is what roots are otherwise deduped by.\n */\nfunction realRootPath(path: string): string | undefined {\n try {\n const real = realpathSync.native(path);\n return process.platform === 'win32' ? real.toLowerCase() : real;\n } catch {\n return undefined;\n }\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const rel = relative(root, candidate);\n return rel === '' || (!rel.startsWith(`..${sep}`) && rel !== '..' && !isAbsolute(rel));\n}\n\n/**\n * The nearest directory above `workspace`, as written, with a `.git` entry; the workspace when\n * there is none. A `.git` at the home directory (`home`, the user's when not given) is a dotfiles\n * repository, not a project (`findRepositoryRoot` in `repo-containment.ts`), so it ends the walk\n * with no repository: a project under the home directory without its own `.git` scans its own\n * directory, not every directory from the home directory down.\n */\nfunction projectRootFor(workspace: string, home: string | undefined, reachesUnc: UncGuard): string {\n // A workspace that reaches a network share has no project roots (`skillRoots`), so nothing on\n // the way up is probed; nor is a `.git` that does, which `existsSync` would follow (#579).\n if (reachesUnc(workspace)) return resolve(workspace);\n let current = resolve(workspace);\n const filesystemRoot = parse(current).root;\n while (true) {\n const dotGit = join(current, '.git');\n // A `.git` it may not open is one it cannot read: the workspace is then its own root, as for\n // memory (`findGitRoot`).\n if (reachesUnc(dotGit)) return resolve(workspace);\n if (existsSync(dotGit)) {\n return isUserHome(tryRealPath(current) ?? current, home) ? resolve(workspace) : current;\n }\n if (current === filesystemRoot) return resolve(workspace);\n current = dirname(current);\n }\n}\n\nfunction directoriesFromRoot(root: string, workspace: string): string[] {\n const normalizedRoot = resolve(root);\n const normalizedWorkspace = resolve(workspace);\n if (!isInside(normalizedRoot, normalizedWorkspace)) return [normalizedWorkspace];\n const directories: string[] = [];\n let current = normalizedWorkspace;\n while (true) {\n directories.push(current);\n if (pathKey(current) === pathKey(normalizedRoot)) break;\n current = dirname(current);\n }\n return directories.reverse();\n}\n\n/**\n * Roots are ordered from lowest to highest precedence.\n *\n * A project root is a path a repository can commit as a link, and on Windows resolving a link to\n * a network share opens the share, which can send the user's credentials to the host it names\n * (#567, #579). A project root that reaches one is therefore not a root at all, so nothing that\n * takes its roots from here resolves it. The user's own roots are theirs to keep on a share.\n * `reachesUnc` is the UNC guard of the discovery this is part of, so the two share what it probed.\n */\nexport function skillRoots(\n workspace: string,\n options: DiscoverSkillsOptions = {},\n reachesUnc: UncGuard = createUncGuard(),\n): SkillRoot[] {\n const roots: SkillRoot[] = [];\n if (options.includeUser !== false) {\n const home = options.homeDir ?? homedir();\n const bookHome =\n options.bookHomeDir ?? (options.homeDir ? join(home, '.book') : resolveBookHome());\n roots.push(\n { path: join(home, '.claude', 'skills'), source: 'user', kind: 'claude' },\n { path: join(home, '.agents', 'skills'), source: 'user', kind: 'agents' },\n ...(options.includeOpenCode === false\n ? []\n : [\n {\n path: join(home, '.config', 'opencode', 'skills'),\n source: 'user' as const,\n kind: 'opencode' as const,\n },\n ]),\n { path: join(bookHome, 'skills'), source: 'user', kind: 'book' },\n );\n }\n\n const projectRoot = options.projectRoot ?? projectRootFor(workspace, options.homeDir, reachesUnc);\n for (const directory of directoriesFromRoot(projectRoot, workspace)) {\n roots.push(\n { path: join(directory, '.claude', 'skills'), source: 'project', kind: 'claude' },\n { path: join(directory, '.agents', 'skills'), source: 'project', kind: 'agents' },\n ...(options.includeOpenCode === false\n ? []\n : [\n {\n path: join(directory, '.opencode', 'skills'),\n source: 'project' as const,\n kind: 'opencode' as const,\n },\n ]),\n { path: join(directory, '.book', 'skills'), source: 'project', kind: 'book' },\n );\n }\n // The real paths of the user roots, for the one fold below. Two roots that merely alias each\n // other (a repository linking `.claude/skills` to `.book/skills`) are *not* merged: each keeps\n // its slot, and the later one still wins, as it did before roots were compared by real path.\n const userRealPaths = new Set<string>();\n for (const root of roots) {\n if (root.source !== 'user') continue;\n const real = realRootPath(root.path);\n if (real) userRealPaths.add(real);\n }\n const byPath = new Map<string, SkillRoot>();\n for (const root of roots) {\n const key = pathKey(root.path);\n // A workspace at `$HOME` walks the user's own roots again as project roots. They stay\n // user roots: a project skill asks before the model may run it, and the user's own\n // skills must not start asking because of where Book was launched (#429).\n if (byPath.get(key)?.source === 'user') continue;\n if (root.source === 'project' && reachesUnc(root.path)) continue;\n // The same, when the home is reached through a link, so the project spelling of the path\n // differs (#449). Only a project root is ever folded into a user root, never the reverse.\n if (root.source === 'project' && userRealPaths.size > 0) {\n const real = realRootPath(root.path);\n if (real && userRealPaths.has(real)) continue;\n }\n byPath.set(key, root);\n }\n return [...byPath.values()];\n}\n\nfunction readFrontmatterPrefix(path: string): {\n frontmatter: Record<string, unknown>;\n headerText: string;\n issues: SkillIssue[];\n} {\n const issues: SkillIssue[] = [];\n const fd = openSync(path, 'r');\n const chunks: Buffer[] = [];\n let total = 0;\n try {\n while (total < MAX_SKILL_HEADER_BYTES) {\n const chunk = Buffer.alloc(Math.min(4096, MAX_SKILL_HEADER_BYTES - total));\n const count = readSync(fd, chunk, 0, chunk.length, total);\n if (count === 0) break;\n chunks.push(chunk.subarray(0, count));\n total += count;\n const text = Buffer.concat(chunks).toString('utf8');\n if (/^---\\r?\\n[\\s\\S]*?\\r?\\n---(?:\\r?\\n|$)/.test(text)) {\n const match = text.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---(?:\\r?\\n|$)/);\n const headerText = match?.[0] ?? '';\n return { frontmatter: parseFrontmatter(headerText).frontmatter, headerText, issues };\n }\n }\n } finally {\n closeSync(fd);\n }\n issues.push({\n code: 'invalid_frontmatter',\n message: `Missing YAML frontmatter or closing delimiter within ${MAX_SKILL_HEADER_BYTES} bytes.`,\n severity: 'error',\n });\n return { frontmatter: {}, headerText: '', issues };\n}\n\nfunction stringField(frontmatter: Record<string, unknown>, name: string): string | undefined {\n const value = frontmatter[name];\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction metadataFromHeader(headerText: string): Record<string, string> {\n const lines = headerText.split(/\\r?\\n/);\n const metadata: Record<string, string> = {};\n const start = lines.findIndex((line) => /^metadata\\s*:\\s*$/.test(line.trim()));\n if (start < 0) return metadata;\n for (const line of lines.slice(start + 1)) {\n if (/^---\\s*$/.test(line)) break;\n if (line.trim() && !/^\\s+/.test(line)) break;\n const match = line.match(/^\\s+([A-Za-z0-9_.-]+)\\s*:\\s*(.*?)\\s*$/);\n if (!match) continue;\n metadata[match[1]] = match[2].replace(/^[\"'](.*)[\"']$/, '$1');\n }\n return metadata;\n}\n\nfunction allowedToolsFrom(frontmatter: Record<string, unknown>): string[] | undefined {\n const value = frontmatter['allowed-tools'] ?? frontmatter.tools;\n if (Array.isArray(value)) {\n const tools = value\n .map(String)\n .map((tool) => tool.trim())\n .filter(Boolean);\n return tools.length ? tools : undefined;\n }\n if (typeof value === 'string') {\n const tools = value.match(/[^\\s]+(?:\\([^)]*\\))?/g)?.map((tool) => tool.trim()) ?? [];\n return tools.length ? tools : undefined;\n }\n return undefined;\n}\n\nfunction collectResources(\n rootPath: string,\n entryPath: string,\n): {\n resources: SkillResource[];\n issues: SkillIssue[];\n} {\n const resources: SkillResource[] = [];\n const issues: SkillIssue[] = [];\n let depthLimitReported = false;\n const visit = (directory: string, depth: number): void => {\n if (depth > MAX_SKILL_RESOURCE_DEPTH) {\n if (!depthLimitReported) {\n depthLimitReported = true;\n issues.push({\n code: 'resource_depth_limit',\n message: `Resources deeper than ${MAX_SKILL_RESOURCE_DEPTH} directories are ignored.`,\n severity: 'warning',\n });\n }\n return;\n }\n if (resources.length >= MAX_SKILL_RESOURCES) return;\n let entries: string[];\n try {\n entries = readdirSync(directory).sort();\n } catch (error) {\n issues.push({\n code: 'resource_unreadable',\n message: `Could not inspect resources in ${directory}: ${error instanceof Error ? error.message : String(error)}`,\n severity: 'warning',\n });\n return;\n }\n for (const entry of entries) {\n if (resources.length >= MAX_SKILL_RESOURCES) break;\n const fullPath = join(directory, entry);\n if (pathKey(fullPath) === pathKey(entryPath)) continue;\n let info;\n try {\n info = lstatSync(fullPath);\n } catch {\n continue;\n }\n if (info.isSymbolicLink()) {\n issues.push({\n code: 'resource_symlink_ignored',\n message: `Ignored symbolic-link resource: ${relative(rootPath, fullPath)}`,\n severity: 'warning',\n });\n continue;\n }\n if (info.isDirectory()) {\n visit(fullPath, depth + 1);\n continue;\n }\n if (!info.isFile()) continue;\n let digest = createHash('sha256')\n .update(`unavailable:${info.size}:${info.mtimeMs}`)\n .digest('hex');\n if (info.size > MAX_SKILL_RESOURCE_BYTES) {\n issues.push({\n code: 'resource_too_large',\n message: `Resource exceeds ${MAX_SKILL_RESOURCE_BYTES} bytes: ${relative(rootPath, fullPath)}`,\n severity: 'warning',\n });\n }\n try {\n const fd = openSync(fullPath, 'r');\n try {\n const prefix = Buffer.alloc(Math.min(info.size, 8192));\n const read = readSync(fd, prefix, 0, prefix.length, 0);\n if (prefix.subarray(0, read).includes(0)) {\n issues.push({\n code: 'binary_resource',\n message: `Binary resource cannot be loaded into model context: ${relative(rootPath, fullPath)}`,\n severity: 'warning',\n });\n }\n } finally {\n closeSync(fd);\n }\n } catch (error) {\n issues.push({\n code: 'resource_unreadable',\n message: `Could not validate resource ${relative(rootPath, fullPath)}: ${error instanceof Error ? error.message : String(error)}`,\n severity: 'warning',\n });\n }\n if (info.size <= MAX_SKILL_RESOURCE_BYTES) {\n try {\n digest = createHash('sha256').update(readFileSync(fullPath)).digest('hex');\n } catch {\n // The visible unreadable-resource issue above is the actionable diagnostic.\n }\n }\n resources.push({\n relativePath: relative(rootPath, fullPath).split(sep).join('/'),\n byteSize: info.size,\n mtimeMs: info.mtimeMs,\n digest,\n });\n }\n };\n visit(rootPath, 1);\n if (resources.length >= MAX_SKILL_RESOURCES) {\n issues.push({\n code: 'resource_limit',\n message: `Only the first ${MAX_SKILL_RESOURCES} resources are available.`,\n severity: 'warning',\n });\n }\n return { resources, issues };\n}\n\nfunction descriptorFromEntry(\n entryPath: string,\n root: SkillRoot,\n directoryName: string,\n flat = false,\n): Skill {\n const { frontmatter, headerText, issues: headerIssues } = readFrontmatterPrefix(entryPath);\n const issues = [...headerIssues];\n const declaredName = stringField(frontmatter, 'name');\n const name = declaredName ?? directoryName;\n const description = stringField(frontmatter, 'description') ?? '';\n\n if (!SKILL_NAME_PATTERN.test(name) || name.length > 64) {\n issues.push({\n code: 'invalid_name',\n message: 'Skill names must be 1-64 lowercase letters, numbers, or single hyphens.',\n severity: 'error',\n });\n }\n if (!flat && declaredName !== directoryName) {\n issues.push({\n code: 'name_directory_mismatch',\n message: `Declared name \"${declaredName ?? '(missing)'}\" must match directory \"${directoryName}\".`,\n severity: 'error',\n });\n }\n if (!declaredName && flat) {\n issues.push({\n code: 'legacy_flat_skill',\n message: 'Flat .skill.md files are supported for compatibility; use <name>/SKILL.md.',\n severity: 'warning',\n });\n }\n if (!description || description.length > 1024) {\n issues.push({\n code: 'invalid_description',\n message: 'Skill description is required and must be at most 1024 characters.',\n severity: 'error',\n });\n }\n const compatibility = stringField(frontmatter, 'compatibility');\n if (compatibility && compatibility.length > 500) {\n issues.push({\n code: 'invalid_compatibility',\n message: 'Skill compatibility must be at most 500 characters.',\n severity: 'error',\n });\n }\n const whenToUse = stringField(frontmatter, 'when_to_use');\n if (whenToUse && whenToUse.length > 1024) {\n issues.push({\n code: 'invalid_when_to_use',\n message: 'Skill when_to_use must be at most 1024 characters.',\n severity: 'error',\n });\n }\n const model = stringField(frontmatter, 'model');\n if (model) {\n issues.push({\n code: 'unsupported_model_hint',\n message: 'The model field is retained for compatibility but does not change Book models.',\n severity: 'warning',\n });\n }\n const requestedLifetime = stringField(frontmatter, 'lifetime');\n if (requestedLifetime && requestedLifetime !== 'run' && requestedLifetime !== 'turn') {\n issues.push({\n code: 'invalid_lifetime',\n message: 'Skill lifetime must be run or turn; Book will use run.',\n severity: 'warning',\n });\n }\n const lifetime = requestedLifetime === 'turn' ? 'turn' : 'run';\n for (const field of Object.keys(frontmatter)) {\n if (!KNOWN_FRONTMATTER_FIELDS.has(field)) {\n issues.push({\n code: 'unknown_frontmatter_field',\n message: `Unknown frontmatter field: ${field}`,\n severity: 'warning',\n });\n }\n }\n\n let entryByteSize = 0;\n let entryMtimeMs = 0;\n try {\n const entryInfo = statSync(entryPath);\n entryByteSize = entryInfo.size;\n entryMtimeMs = entryInfo.mtimeMs;\n if (entryByteSize > MAX_SKILL_BODY_BYTES + MAX_SKILL_HEADER_BYTES) {\n issues.push({\n code: 'body_too_large',\n message: `SKILL.md exceeds the ${MAX_SKILL_BODY_BYTES}-byte body budget.`,\n severity: 'error',\n });\n }\n } catch {\n issues.push({\n code: 'skill_unreadable',\n message: 'Skill entrypoint is unreadable.',\n severity: 'error',\n });\n }\n\n const rootPath = dirname(entryPath);\n const resourceResult = flat\n ? { resources: [] as SkillResource[], issues: [] as SkillIssue[] }\n : collectResources(rootPath, entryPath);\n issues.push(...resourceResult.issues);\n\n const metadata = metadataFromHeader(headerText);\n const version = stringField(frontmatter, 'version') ?? metadata.version ?? 'unversioned';\n const resourceDigest = createHash('sha256')\n .update(JSON.stringify(resourceResult.resources))\n .digest('hex');\n const descriptorDigest = createHash('sha256')\n .update(\n JSON.stringify({\n name,\n description,\n whenToUse,\n version,\n source: root.source,\n rootKind: root.kind,\n path: pathKey(entryPath),\n allowedTools: allowedToolsFrom(frontmatter),\n lifetime,\n resourceDigest,\n }),\n )\n .digest('hex');\n\n return {\n id: `${root.kind}:${pathKey(entryPath)}`,\n version,\n descriptorDigest,\n resourceDigest,\n name,\n description,\n whenToUse,\n license: stringField(frontmatter, 'license'),\n compatibility,\n metadata,\n allowedTools: allowedToolsFrom(frontmatter),\n model,\n lifetime,\n path: entryPath,\n rootPath,\n source: root.source,\n rootKind: root.kind,\n activation: String(frontmatter.disabled).toLowerCase() === 'true' ? 'off' : 'manual',\n execution: 'inherit',\n invocationCount: 0,\n entryByteSize,\n entryMtimeMs,\n resources: resourceResult.resources,\n issues,\n valid: !issues.some((issue) => issue.severity === 'error'),\n shadowed: [],\n };\n}\n\n/**\n * The skills in one root. In a project root, each skill directory and SKILL.md is a path a\n * repository can commit as a link to a network share, as the root itself can (see\n * {@link skillRoots}, which drops such a root): each is asked of `reachesUnc` before anything\n * follows it, and one that reaches a share is not listed. A resource link is never followed\n * (`collectResources`).\n */\nfunction skillsUnderRoot(root: SkillRoot, reachesUnc: UncGuard): Skill[] {\n const refused = (path: string) => root.source === 'project' && reachesUnc(path);\n if (!existsSync(root.path)) return [];\n let entries: string[];\n try {\n entries = readdirSync(root.path).sort();\n } catch {\n return [];\n }\n\n const skills: Skill[] = [];\n for (const entry of entries) {\n const fullPath = join(root.path, entry);\n let info;\n try {\n info = lstatSync(fullPath);\n } catch {\n continue;\n }\n let directory = info.isDirectory();\n if (info.isSymbolicLink()) {\n if (refused(fullPath)) continue;\n try {\n directory = statSync(fullPath).isDirectory();\n } catch {\n continue;\n }\n }\n if (directory) {\n const entryPath = join(fullPath, SKILL_ENTRY_FILENAME);\n if (!refused(entryPath) && existsSync(entryPath) && statSync(entryPath).isFile()) {\n skills.push(descriptorFromEntry(entryPath, root, entry));\n }\n } else if (info.isFile() && entry.endsWith('.skill.md')) {\n skills.push(descriptorFromEntry(fullPath, root, entry.replace(/\\.skill\\.md$/, ''), true));\n }\n }\n return skills;\n}\n\nexport function discoverSkills(\n workspace: string,\n overrides: Readonly<Record<string, SkillActivation>> = {},\n options: DiscoverSkillsOptions = {},\n): Skill[] {\n const byName = new Map<string, Skill>();\n const reachesUnc = createUncGuard();\n for (const root of skillRoots(workspace, options, reachesUnc)) {\n for (const skill of skillsUnderRoot(root, reachesUnc)) {\n const previous = byName.get(skill.name);\n if (previous) {\n skill.shadowed = [\n ...previous.shadowed,\n { path: previous.path, source: previous.source, rootKind: previous.rootKind },\n ];\n }\n byName.set(skill.name, skill);\n }\n }\n return applySkillOverrides(\n [...byName.values()].sort((a, b) => a.name.localeCompare(b.name)),\n overrides,\n options.executionOverrides ?? {},\n options.enabled ?? true,\n );\n}\n\nexport function applySkillOverrides(\n skills: readonly Skill[],\n overrides: Readonly<Record<string, SkillActivation>>,\n executionOverrides: Readonly<Record<string, SkillExecution>> = {},\n enabled = true,\n): Skill[] {\n return skills.map((skill) => ({\n ...skill,\n activation: enabled ? (overrides[skill.name] ?? skill.activation ?? 'manual') : 'off',\n execution: executionOverrides[skill.name] ?? skill.execution ?? 'inherit',\n }));\n}\n\nexport function loadSkillBody(skill: Skill): LoadedSkillBody {\n if (!skill.valid) throw new Error(`Skill \"${skill.name}\" is invalid.`);\n // Asked again here, not only at discovery: the directory may have become a link since (#579).\n if (skill.source === 'project' && reachesUncPath(skill.path)) {\n throw new Error(`Skill \"${skill.name}\" is on a network (UNC) path and is not loaded.`);\n }\n const canonicalRoot = realpathSync(skill.rootPath);\n const canonicalEntry = realpathSync(skill.path);\n if (!isInside(canonicalRoot, canonicalEntry)) {\n throw new Error(`Skill entrypoint escapes its root: ${skill.path}`);\n }\n const current = statSync(canonicalEntry);\n if (current.size !== skill.entryByteSize || current.mtimeMs !== skill.entryMtimeMs) {\n throw new Error(`Skill \"${skill.name}\" changed after discovery; reload skills before use.`);\n }\n const buffer = readFileSync(canonicalEntry);\n if (buffer.includes(0)) {\n throw new Error(`Skill \"${skill.name}\" contains binary content.`);\n }\n const raw = buffer.toString('utf8');\n const { body } = parseFrontmatter(raw);\n const byteSize = Buffer.byteLength(body);\n if (byteSize > MAX_SKILL_BODY_BYTES) {\n throw new Error(`Skill body exceeds ${MAX_SKILL_BODY_BYTES} bytes.`);\n }\n return {\n body,\n digest: createHash('sha256').update(body).digest('hex'),\n byteSize,\n };\n}\n\nexport interface SkillListingResult {\n text: string;\n budgetChars: number;\n visibleCount: number;\n included: string[];\n omitted: string[];\n collapsed: string[];\n charCount: number;\n}\n\n/**\n * Characters the skill listing may occupy in the system prompt.\n *\n * Lives here so the listing shipped to the model and the /skills diagnostics\n * that describe it cannot drift: both call this, neither re-derives the share\n * or the cap.\n */\nexport function skillListingBudgetChars(contextWindow: number): number {\n return Math.min(8000, Math.max(512, Math.floor(contextWindow * 0.08)));\n}\n\nexport function buildSkillListing(\n skills: readonly Skill[],\n budgetChars = 8000,\n): SkillListingResult {\n const visible = skills.filter(\n (skill) => skill.valid && (skill.activation === 'auto' || skill.activation === 'name-only'),\n );\n if (visible.length === 0) {\n return {\n text: '',\n budgetChars,\n visibleCount: 0,\n included: [],\n omitted: [],\n collapsed: [],\n charCount: 0,\n };\n }\n\n const sorted = [...visible].sort(\n (a, b) => b.invocationCount - a.invocationCount || a.name.localeCompare(b.name),\n );\n const lines = [\n '## Available skills',\n 'Use InvokeSkill when a request matches a description. A user can force exact use with `$skill-name`.',\n ];\n let remainingBudget = budgetChars - lines.join('\\n').length;\n const includedNames: string[] = [];\n const collapsedNames = new Set<string>();\n\n let included = 0;\n for (const skill of sorted) {\n if (skill.activation === 'name-only') {\n const bare = `- **${skill.name}**`;\n if (bare.length > remainingBudget) break;\n lines.push(bare);\n remainingBudget -= bare.length + 1;\n included++;\n includedNames.push(skill.name);\n collapsedNames.add(skill.name);\n continue;\n }\n const entry = `- **${skill.name}**: ${skill.description}`;\n const trigger = skill.whenToUse ? `\\n when: ${skill.whenToUse}` : '';\n const full = `${entry}${trigger}`;\n if (full.length > remainingBudget) {\n const bare = `- **${skill.name}**`;\n if (bare.length <= remainingBudget) {\n lines.push(bare);\n included++;\n includedNames.push(skill.name);\n collapsedNames.add(skill.name);\n }\n break;\n }\n lines.push(full);\n remainingBudget -= full.length + 1;\n included++;\n includedNames.push(skill.name);\n }\n let omitted = sorted.length - included;\n if (omitted > 0) {\n let warning = `- ${omitted} additional skill${omitted === 1 ? ' was' : 's were'} omitted from this prompt budget. Use /skills to inspect the full catalog.`;\n while (warning.length > remainingBudget && lines.length > 2) {\n const removed = lines.pop();\n if (!removed) break;\n remainingBudget += removed.length + 1;\n included--;\n const removedName = includedNames.pop();\n if (removedName) collapsedNames.delete(removedName);\n omitted = sorted.length - included;\n warning = `- ${omitted} additional skill${omitted === 1 ? ' was' : 's were'} omitted from this prompt budget. Use /skills to inspect the full catalog.`;\n }\n if (warning.length <= remainingBudget) lines.push(warning);\n }\n const text = lines.join('\\n');\n const includedSet = new Set(includedNames);\n return {\n text,\n budgetChars,\n visibleCount: sorted.length,\n included: includedNames,\n omitted: sorted.filter((skill) => !includedSet.has(skill.name)).map((skill) => skill.name),\n collapsed: includedNames.filter((name) => collapsedNames.has(name)),\n charCount: text.length,\n };\n}\n\nexport function generateSkillListing(skills: readonly Skill[], budgetChars = 8000): string {\n return buildSkillListing(skills, budgetChars).text;\n}\n\nexport function explicitSkillMentions(prompt: string, skills: readonly Skill[]): string[] {\n const available = new Set(skills.map((skill) => skill.name));\n const mentions: string[] = [];\n // A `$` that follows a path separator, a dot or a mention's `@` is part of a file or command name\n // (`@$deploy.md`, `docs/$deploy/`, `/$deploy`), not a request for a skill.\n const pattern = /(?<![A-Za-z0-9_\\-/\\\\@.])\\$([a-z0-9]+(?:-[a-z0-9]+)*)(?![A-Za-z0-9_-])/g;\n for (const match of prompt.matchAll(pattern)) {\n const name = match[1];\n if (available.has(name) && !mentions.includes(name)) mentions.push(name);\n }\n return mentions;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY,MAAM,OAAO,UAAU,SAAS,WAAW;AAOlE,IAAM,uBAAuB;AAC7B,IAAM,yBAAyB,KAAK;AACpC,IAAM,uBAAuB,MAAM;AACnC,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,2BAA2B,IAAI,OAAO;AAEnD,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAgFD,SAAS,QAAQ,MAAsB;AACrC,SAAO,QAAQ,aAAa,UAAU,QAAQ,IAAI,EAAE,YAAY,IAAI,QAAQ,IAAI;AAClF;AAUA,SAAS,aAAa,MAAkC;AACtD,MAAI;AACF,UAAM,OAAO,aAAa,OAAO,IAAI;AACrC,WAAO,QAAQ,aAAa,UAAU,KAAK,YAAY,IAAI;AAAA,EAC7D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,MAAc,WAA4B;AAC1D,QAAM,MAAM,SAAS,MAAM,SAAS;AACpC,SAAO,QAAQ,MAAO,CAAC,IAAI,WAAW,KAAK,GAAG,EAAE,KAAK,QAAQ,QAAQ,CAAC,WAAW,GAAG;AACtF;AASA,SAAS,eAAe,WAAmB,MAA0B,YAA8B;AAGjG,MAAI,WAAW,SAAS,EAAG,QAAO,QAAQ,SAAS;AACnD,MAAI,UAAU,QAAQ,SAAS;AAC/B,QAAM,iBAAiB,MAAM,OAAO,EAAE;AACtC,SAAO,MAAM;AACX,UAAM,SAAS,KAAK,SAAS,MAAM;AAGnC,QAAI,WAAW,MAAM,EAAG,QAAO,QAAQ,SAAS;AAChD,QAAI,WAAW,MAAM,GAAG;AACtB,aAAO,WAAW,YAAY,OAAO,KAAK,SAAS,IAAI,IAAI,QAAQ,SAAS,IAAI;AAAA,IAClF;AACA,QAAI,YAAY,eAAgB,QAAO,QAAQ,SAAS;AACxD,cAAU,QAAQ,OAAO;AAAA,EAC3B;AACF;AAEA,SAAS,oBAAoB,MAAc,WAA6B;AACtE,QAAM,iBAAiB,QAAQ,IAAI;AACnC,QAAM,sBAAsB,QAAQ,SAAS;AAC7C,MAAI,CAAC,SAAS,gBAAgB,mBAAmB,EAAG,QAAO,CAAC,mBAAmB;AAC/E,QAAM,cAAwB,CAAC;AAC/B,MAAI,UAAU;AACd,SAAO,MAAM;AACX,gBAAY,KAAK,OAAO;AACxB,QAAI,QAAQ,OAAO,MAAM,QAAQ,cAAc,EAAG;AAClD,cAAU,QAAQ,OAAO;AAAA,EAC3B;AACA,SAAO,YAAY,QAAQ;AAC7B;AAWO,SAAS,WACd,WACA,UAAiC,CAAC,GAClC,aAAuB,eAAe,GACzB;AACb,QAAM,QAAqB,CAAC;AAC5B,MAAI,QAAQ,gBAAgB,OAAO;AACjC,UAAM,OAAO,QAAQ,WAAW,QAAQ;AACxC,UAAM,WACJ,QAAQ,gBAAgB,QAAQ,UAAU,KAAK,MAAM,OAAO,IAAI,gBAAgB;AAClF,UAAM;AAAA,MACJ,EAAE,MAAM,KAAK,MAAM,WAAW,QAAQ,GAAG,QAAQ,QAAQ,MAAM,SAAS;AAAA,MACxE,EAAE,MAAM,KAAK,MAAM,WAAW,QAAQ,GAAG,QAAQ,QAAQ,MAAM,SAAS;AAAA,MACxE,GAAI,QAAQ,oBAAoB,QAC5B,CAAC,IACD;AAAA,QACE;AAAA,UACE,MAAM,KAAK,MAAM,WAAW,YAAY,QAAQ;AAAA,UAChD,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACJ,EAAE,MAAM,KAAK,UAAU,QAAQ,GAAG,QAAQ,QAAQ,MAAM,OAAO;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,eAAe,eAAe,WAAW,QAAQ,SAAS,UAAU;AAChG,aAAW,aAAa,oBAAoB,aAAa,SAAS,GAAG;AACnE,UAAM;AAAA,MACJ,EAAE,MAAM,KAAK,WAAW,WAAW,QAAQ,GAAG,QAAQ,WAAW,MAAM,SAAS;AAAA,MAChF,EAAE,MAAM,KAAK,WAAW,WAAW,QAAQ,GAAG,QAAQ,WAAW,MAAM,SAAS;AAAA,MAChF,GAAI,QAAQ,oBAAoB,QAC5B,CAAC,IACD;AAAA,QACE;AAAA,UACE,MAAM,KAAK,WAAW,aAAa,QAAQ;AAAA,UAC3C,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACJ,EAAE,MAAM,KAAK,WAAW,SAAS,QAAQ,GAAG,QAAQ,WAAW,MAAM,OAAO;AAAA,IAC9E;AAAA,EACF;AAIA,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,OAAQ;AAC5B,UAAM,OAAO,aAAa,KAAK,IAAI;AACnC,QAAI,KAAM,eAAc,IAAI,IAAI;AAAA,EAClC;AACA,QAAM,SAAS,oBAAI,IAAuB;AAC1C,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,QAAQ,KAAK,IAAI;AAI7B,QAAI,OAAO,IAAI,GAAG,GAAG,WAAW,OAAQ;AACxC,QAAI,KAAK,WAAW,aAAa,WAAW,KAAK,IAAI,EAAG;AAGxD,QAAI,KAAK,WAAW,aAAa,cAAc,OAAO,GAAG;AACvD,YAAM,OAAO,aAAa,KAAK,IAAI;AACnC,UAAI,QAAQ,cAAc,IAAI,IAAI,EAAG;AAAA,IACvC;AACA,WAAO,IAAI,KAAK,IAAI;AAAA,EACtB;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEA,SAAS,sBAAsB,MAI7B;AACA,QAAM,SAAuB,CAAC;AAC9B,QAAM,KAAK,SAAS,MAAM,GAAG;AAC7B,QAAM,SAAmB,CAAC;AAC1B,MAAI,QAAQ;AACZ,MAAI;AACF,WAAO,QAAQ,wBAAwB;AACrC,YAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,MAAM,yBAAyB,KAAK,CAAC;AACzE,YAAM,QAAQ,SAAS,IAAI,OAAO,GAAG,MAAM,QAAQ,KAAK;AACxD,UAAI,UAAU,EAAG;AACjB,aAAO,KAAK,MAAM,SAAS,GAAG,KAAK,CAAC;AACpC,eAAS;AACT,YAAM,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAClD,UAAI,uCAAuC,KAAK,IAAI,GAAG;AACrD,cAAM,QAAQ,KAAK,MAAM,sCAAsC;AAC/D,cAAM,aAAa,QAAQ,CAAC,KAAK;AACjC,eAAO,EAAE,aAAa,iBAAiB,UAAU,EAAE,aAAa,YAAY,OAAO;AAAA,MACrF;AAAA,IACF;AAAA,EACF,UAAE;AACA,cAAU,EAAE;AAAA,EACd;AACA,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,SAAS,wDAAwD,sBAAsB;AAAA,IACvF,UAAU;AAAA,EACZ,CAAC;AACD,SAAO,EAAE,aAAa,CAAC,GAAG,YAAY,IAAI,OAAO;AACnD;AAEA,SAAS,YAAY,aAAsC,MAAkC;AAC3F,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,mBAAmB,YAA4C;AACtE,QAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,QAAM,WAAmC,CAAC;AAC1C,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,oBAAoB,KAAK,KAAK,KAAK,CAAC,CAAC;AAC7E,MAAI,QAAQ,EAAG,QAAO;AACtB,aAAW,QAAQ,MAAM,MAAM,QAAQ,CAAC,GAAG;AACzC,QAAI,WAAW,KAAK,IAAI,EAAG;AAC3B,QAAI,KAAK,KAAK,KAAK,CAAC,OAAO,KAAK,IAAI,EAAG;AACvC,UAAM,QAAQ,KAAK,MAAM,uCAAuC;AAChE,QAAI,CAAC,MAAO;AACZ,aAAS,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,QAAQ,kBAAkB,IAAI;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,aAA4D;AACpF,QAAM,QAAQ,YAAY,eAAe,KAAK,YAAY;AAC1D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,MACX,IAAI,MAAM,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACjB,WAAO,MAAM,SAAS,QAAQ;AAAA,EAChC;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,QAAQ,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,KAAK,CAAC;AACnF,WAAO,MAAM,SAAS,QAAQ;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,iBACP,UACA,WAIA;AACA,QAAM,YAA6B,CAAC;AACpC,QAAM,SAAuB,CAAC;AAC9B,MAAI,qBAAqB;AACzB,QAAM,QAAQ,CAAC,WAAmB,UAAwB;AACxD,QAAI,QAAQ,0BAA0B;AACpC,UAAI,CAAC,oBAAoB;AACvB,6BAAqB;AACrB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,yBAAyB,wBAAwB;AAAA,UAC1D,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,UAAU,UAAU,oBAAqB;AAC7C,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,SAAS,EAAE,KAAK;AAAA,IACxC,SAAS,OAAO;AACd,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,kCAAkC,SAAS,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC/G,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,UAAU,UAAU,oBAAqB;AAC7C,YAAM,WAAW,KAAK,WAAW,KAAK;AACtC,UAAI,QAAQ,QAAQ,MAAM,QAAQ,SAAS,EAAG;AAC9C,UAAI;AACJ,UAAI;AACF,eAAO,UAAU,QAAQ;AAAA,MAC3B,QAAQ;AACN;AAAA,MACF;AACA,UAAI,KAAK,eAAe,GAAG;AACzB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,mCAAmC,SAAS,UAAU,QAAQ,CAAC;AAAA,UACxE,UAAU;AAAA,QACZ,CAAC;AACD;AAAA,MACF;AACA,UAAI,KAAK,YAAY,GAAG;AACtB,cAAM,UAAU,QAAQ,CAAC;AACzB;AAAA,MACF;AACA,UAAI,CAAC,KAAK,OAAO,EAAG;AACpB,UAAI,SAAS,WAAW,QAAQ,EAC7B,OAAO,eAAe,KAAK,IAAI,IAAI,KAAK,OAAO,EAAE,EACjD,OAAO,KAAK;AACf,UAAI,KAAK,OAAO,0BAA0B;AACxC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,oBAAoB,wBAAwB,WAAW,SAAS,UAAU,QAAQ,CAAC;AAAA,UAC5F,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,UAAI;AACF,cAAM,KAAK,SAAS,UAAU,GAAG;AACjC,YAAI;AACF,gBAAM,SAAS,OAAO,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;AACrD,gBAAM,OAAO,SAAS,IAAI,QAAQ,GAAG,OAAO,QAAQ,CAAC;AACrD,cAAI,OAAO,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC,GAAG;AACxC,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,SAAS,wDAAwD,SAAS,UAAU,QAAQ,CAAC;AAAA,cAC7F,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF,UAAE;AACA,oBAAU,EAAE;AAAA,QACd;AAAA,MACF,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,+BAA+B,SAAS,UAAU,QAAQ,CAAC,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC/H,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,UAAI,KAAK,QAAQ,0BAA0B;AACzC,YAAI;AACF,mBAAS,WAAW,QAAQ,EAAE,OAAO,aAAa,QAAQ,CAAC,EAAE,OAAO,KAAK;AAAA,QAC3E,QAAQ;AAAA,QAER;AAAA,MACF;AACA,gBAAU,KAAK;AAAA,QACb,cAAc,SAAS,UAAU,QAAQ,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA,QAC9D,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,UAAU,CAAC;AACjB,MAAI,UAAU,UAAU,qBAAqB;AAC3C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,kBAAkB,mBAAmB;AAAA,MAC9C,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,SAAO,EAAE,WAAW,OAAO;AAC7B;AAEA,SAAS,oBACP,WACA,MACA,eACA,OAAO,OACA;AACP,QAAM,EAAE,aAAa,YAAY,QAAQ,aAAa,IAAI,sBAAsB,SAAS;AACzF,QAAM,SAAS,CAAC,GAAG,YAAY;AAC/B,QAAM,eAAe,YAAY,aAAa,MAAM;AACpD,QAAM,OAAO,gBAAgB;AAC7B,QAAM,cAAc,YAAY,aAAa,aAAa,KAAK;AAE/D,MAAI,CAAC,mBAAmB,KAAK,IAAI,KAAK,KAAK,SAAS,IAAI;AACtD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,MAAI,CAAC,QAAQ,iBAAiB,eAAe;AAC3C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,kBAAkB,gBAAgB,WAAW,2BAA2B,aAAa;AAAA,MAC9F,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,MAAI,CAAC,gBAAgB,MAAM;AACzB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,MAAI,CAAC,eAAe,YAAY,SAAS,MAAM;AAC7C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,YAAY,aAAa,eAAe;AAC9D,MAAI,iBAAiB,cAAc,SAAS,KAAK;AAC/C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,QAAM,YAAY,YAAY,aAAa,aAAa;AACxD,MAAI,aAAa,UAAU,SAAS,MAAM;AACxC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,YAAY,aAAa,OAAO;AAC9C,MAAI,OAAO;AACT,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,QAAM,oBAAoB,YAAY,aAAa,UAAU;AAC7D,MAAI,qBAAqB,sBAAsB,SAAS,sBAAsB,QAAQ;AACpF,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,QAAM,WAAW,sBAAsB,SAAS,SAAS;AACzD,aAAW,SAAS,OAAO,KAAK,WAAW,GAAG;AAC5C,QAAI,CAAC,yBAAyB,IAAI,KAAK,GAAG;AACxC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,8BAA8B,KAAK;AAAA,QAC5C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,gBAAgB;AACpB,MAAI,eAAe;AACnB,MAAI;AACF,UAAM,YAAY,SAAS,SAAS;AACpC,oBAAgB,UAAU;AAC1B,mBAAe,UAAU;AACzB,QAAI,gBAAgB,uBAAuB,wBAAwB;AACjE,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,wBAAwB,oBAAoB;AAAA,QACrD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AACN,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,QAAQ,SAAS;AAClC,QAAM,iBAAiB,OACnB,EAAE,WAAW,CAAC,GAAsB,QAAQ,CAAC,EAAkB,IAC/D,iBAAiB,UAAU,SAAS;AACxC,SAAO,KAAK,GAAG,eAAe,MAAM;AAEpC,QAAM,WAAW,mBAAmB,UAAU;AAC9C,QAAM,UAAU,YAAY,aAAa,SAAS,KAAK,SAAS,WAAW;AAC3E,QAAM,iBAAiB,WAAW,QAAQ,EACvC,OAAO,KAAK,UAAU,eAAe,SAAS,CAAC,EAC/C,OAAO,KAAK;AACf,QAAM,mBAAmB,WAAW,QAAQ,EACzC;AAAA,IACC,KAAK,UAAU;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,MAAM,QAAQ,SAAS;AAAA,MACvB,cAAc,iBAAiB,WAAW;AAAA,MAC1C;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,EACC,OAAO,KAAK;AAEf,SAAO;AAAA,IACL,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,SAAS,CAAC;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,YAAY,aAAa,SAAS;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,cAAc,iBAAiB,WAAW;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,IACf,YAAY,OAAO,YAAY,QAAQ,EAAE,YAAY,MAAM,SAAS,QAAQ;AAAA,IAC5E,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA,WAAW,eAAe;AAAA,IAC1B;AAAA,IACA,OAAO,CAAC,OAAO,KAAK,CAAC,UAAU,MAAM,aAAa,OAAO;AAAA,IACzD,UAAU,CAAC;AAAA,EACb;AACF;AASA,SAAS,gBAAgB,MAAiB,YAA+B;AACvE,QAAM,UAAU,CAAC,SAAiB,KAAK,WAAW,aAAa,WAAW,IAAI;AAC9E,MAAI,CAAC,WAAW,KAAK,IAAI,EAAG,QAAO,CAAC;AACpC,MAAI;AACJ,MAAI;AACF,cAAU,YAAY,KAAK,IAAI,EAAE,KAAK;AAAA,EACxC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,KAAK,KAAK,MAAM,KAAK;AACtC,QAAI;AACJ,QAAI;AACF,aAAO,UAAU,QAAQ;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,QAAI,YAAY,KAAK,YAAY;AACjC,QAAI,KAAK,eAAe,GAAG;AACzB,UAAI,QAAQ,QAAQ,EAAG;AACvB,UAAI;AACF,oBAAY,SAAS,QAAQ,EAAE,YAAY;AAAA,MAC7C,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW;AACb,YAAM,YAAY,KAAK,UAAU,oBAAoB;AACrD,UAAI,CAAC,QAAQ,SAAS,KAAK,WAAW,SAAS,KAAK,SAAS,SAAS,EAAE,OAAO,GAAG;AAChF,eAAO,KAAK,oBAAoB,WAAW,MAAM,KAAK,CAAC;AAAA,MACzD;AAAA,IACF,WAAW,KAAK,OAAO,KAAK,MAAM,SAAS,WAAW,GAAG;AACvD,aAAO,KAAK,oBAAoB,UAAU,MAAM,MAAM,QAAQ,gBAAgB,EAAE,GAAG,IAAI,CAAC;AAAA,IAC1F;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,eACd,WACA,YAAuD,CAAC,GACxD,UAAiC,CAAC,GACzB;AACT,QAAM,SAAS,oBAAI,IAAmB;AACtC,QAAM,aAAa,eAAe;AAClC,aAAW,QAAQ,WAAW,WAAW,SAAS,UAAU,GAAG;AAC7D,eAAW,SAAS,gBAAgB,MAAM,UAAU,GAAG;AACrD,YAAM,WAAW,OAAO,IAAI,MAAM,IAAI;AACtC,UAAI,UAAU;AACZ,cAAM,WAAW;AAAA,UACf,GAAG,SAAS;AAAA,UACZ,EAAE,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,UAAU,SAAS,SAAS;AAAA,QAC9E;AAAA,MACF;AACA,aAAO,IAAI,MAAM,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AAAA,IACL,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,IAChE;AAAA,IACA,QAAQ,sBAAsB,CAAC;AAAA,IAC/B,QAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,oBACd,QACA,WACA,qBAA+D,CAAC,GAChE,UAAU,MACD;AACT,SAAO,OAAO,IAAI,CAAC,WAAW;AAAA,IAC5B,GAAG;AAAA,IACH,YAAY,UAAW,UAAU,MAAM,IAAI,KAAK,MAAM,cAAc,WAAY;AAAA,IAChF,WAAW,mBAAmB,MAAM,IAAI,KAAK,MAAM,aAAa;AAAA,EAClE,EAAE;AACJ;AAEO,SAAS,cAAc,OAA+B;AAC3D,MAAI,CAAC,MAAM,MAAO,OAAM,IAAI,MAAM,UAAU,MAAM,IAAI,eAAe;AAErE,MAAI,MAAM,WAAW,aAAa,eAAe,MAAM,IAAI,GAAG;AAC5D,UAAM,IAAI,MAAM,UAAU,MAAM,IAAI,iDAAiD;AAAA,EACvF;AACA,QAAM,gBAAgB,aAAa,MAAM,QAAQ;AACjD,QAAM,iBAAiB,aAAa,MAAM,IAAI;AAC9C,MAAI,CAAC,SAAS,eAAe,cAAc,GAAG;AAC5C,UAAM,IAAI,MAAM,sCAAsC,MAAM,IAAI,EAAE;AAAA,EACpE;AACA,QAAM,UAAU,SAAS,cAAc;AACvC,MAAI,QAAQ,SAAS,MAAM,iBAAiB,QAAQ,YAAY,MAAM,cAAc;AAClF,UAAM,IAAI,MAAM,UAAU,MAAM,IAAI,sDAAsD;AAAA,EAC5F;AACA,QAAM,SAAS,aAAa,cAAc;AAC1C,MAAI,OAAO,SAAS,CAAC,GAAG;AACtB,UAAM,IAAI,MAAM,UAAU,MAAM,IAAI,4BAA4B;AAAA,EAClE;AACA,QAAM,MAAM,OAAO,SAAS,MAAM;AAClC,QAAM,EAAE,KAAK,IAAI,iBAAiB,GAAG;AACrC,QAAM,WAAW,OAAO,WAAW,IAAI;AACvC,MAAI,WAAW,sBAAsB;AACnC,UAAM,IAAI,MAAM,sBAAsB,oBAAoB,SAAS;AAAA,EACrE;AACA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAAA,IACtD;AAAA,EACF;AACF;AAmBO,SAAS,wBAAwB,eAA+B;AACrE,SAAO,KAAK,IAAI,KAAM,KAAK,IAAI,KAAK,KAAK,MAAM,gBAAgB,IAAI,CAAC,CAAC;AACvE;AAEO,SAAS,kBACd,QACA,cAAc,KACM;AACpB,QAAM,UAAU,OAAO;AAAA,IACrB,CAAC,UAAU,MAAM,UAAU,MAAM,eAAe,UAAU,MAAM,eAAe;AAAA,EACjF;AACA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,cAAc;AAAA,MACd,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,MACV,WAAW,CAAC;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,OAAO,EAAE;AAAA,IAC1B,CAAC,GAAG,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EAChF;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACA,MAAI,kBAAkB,cAAc,MAAM,KAAK,IAAI,EAAE;AACrD,QAAM,gBAA0B,CAAC;AACjC,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,MAAI,WAAW;AACf,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,eAAe,aAAa;AACpC,YAAM,OAAO,OAAO,MAAM,IAAI;AAC9B,UAAI,KAAK,SAAS,gBAAiB;AACnC,YAAM,KAAK,IAAI;AACf,yBAAmB,KAAK,SAAS;AACjC;AACA,oBAAc,KAAK,MAAM,IAAI;AAC7B,qBAAe,IAAI,MAAM,IAAI;AAC7B;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,MAAM,WAAW;AACvD,UAAM,UAAU,MAAM,YAAY;AAAA,UAAa,MAAM,SAAS,KAAK;AACnE,UAAM,OAAO,GAAG,KAAK,GAAG,OAAO;AAC/B,QAAI,KAAK,SAAS,iBAAiB;AACjC,YAAM,OAAO,OAAO,MAAM,IAAI;AAC9B,UAAI,KAAK,UAAU,iBAAiB;AAClC,cAAM,KAAK,IAAI;AACf;AACA,sBAAc,KAAK,MAAM,IAAI;AAC7B,uBAAe,IAAI,MAAM,IAAI;AAAA,MAC/B;AACA;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AACf,uBAAmB,KAAK,SAAS;AACjC;AACA,kBAAc,KAAK,MAAM,IAAI;AAAA,EAC/B;AACA,MAAI,UAAU,OAAO,SAAS;AAC9B,MAAI,UAAU,GAAG;AACf,QAAI,UAAU,KAAK,OAAO,oBAAoB,YAAY,IAAI,SAAS,QAAQ;AAC/E,WAAO,QAAQ,SAAS,mBAAmB,MAAM,SAAS,GAAG;AAC3D,YAAM,UAAU,MAAM,IAAI;AAC1B,UAAI,CAAC,QAAS;AACd,yBAAmB,QAAQ,SAAS;AACpC;AACA,YAAM,cAAc,cAAc,IAAI;AACtC,UAAI,YAAa,gBAAe,OAAO,WAAW;AAClD,gBAAU,OAAO,SAAS;AAC1B,gBAAU,KAAK,OAAO,oBAAoB,YAAY,IAAI,SAAS,QAAQ;AAAA,IAC7E;AACA,QAAI,QAAQ,UAAU,gBAAiB,OAAM,KAAK,OAAO;AAAA,EAC3D;AACA,QAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,QAAM,cAAc,IAAI,IAAI,aAAa;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAc,OAAO;AAAA,IACrB,UAAU;AAAA,IACV,SAAS,OAAO,OAAO,CAAC,UAAU,CAAC,YAAY,IAAI,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,IACzF,WAAW,cAAc,OAAO,CAAC,SAAS,eAAe,IAAI,IAAI,CAAC;AAAA,IAClE,WAAW,KAAK;AAAA,EAClB;AACF;AAEO,SAAS,qBAAqB,QAA0B,cAAc,KAAc;AACzF,SAAO,kBAAkB,QAAQ,WAAW,EAAE;AAChD;AAEO,SAAS,sBAAsB,QAAgB,QAAoC;AACxF,QAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAC3D,QAAM,WAAqB,CAAC;AAG5B,QAAM,UAAU;AAChB,aAAW,SAAS,OAAO,SAAS,OAAO,GAAG;AAC5C,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,UAAU,IAAI,IAAI,KAAK,CAAC,SAAS,SAAS,IAAI,EAAG,UAAS,KAAK,IAAI;AAAA,EACzE;AACA,SAAO;AACT;","names":[]}