dsh-web-search-pro 0.2.0 → 0.2.3

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 (266) hide show
  1. package/CHANGELOG.md +179 -0
  2. package/README.md +197 -32
  3. package/assets/skills/dsh-web-search-pro/SKILL.md +14 -13
  4. package/assets/skills/dsh-web-search-pro/references/config.md +36 -0
  5. package/assets/skills/dsh-web-search-pro/references/sources.md +19 -4
  6. package/assets/skills/dsh-web-search-pro/references/troubleshooting.md +3 -1
  7. package/catalog/sources.v1.json +22 -12
  8. package/lib/actions/approval.js +50 -1
  9. package/lib/actions/approval.js.map +1 -1
  10. package/lib/actions/config.js +274 -0
  11. package/lib/actions/config.js.map +1 -0
  12. package/lib/actions/errors.js +8 -1
  13. package/lib/actions/errors.js.map +1 -1
  14. package/lib/actions/format.js +10 -0
  15. package/lib/actions/format.js.map +1 -1
  16. package/lib/actions/index-view.js +2 -2
  17. package/lib/actions/index-view.js.map +1 -1
  18. package/lib/actions/read.js +7 -3
  19. package/lib/actions/read.js.map +1 -1
  20. package/lib/actions/registry.js +3 -1
  21. package/lib/actions/registry.js.map +1 -1
  22. package/lib/actions/run.js +2 -2
  23. package/lib/actions/run.js.map +1 -1
  24. package/lib/actions/schema.js +18 -0
  25. package/lib/actions/schema.js.map +1 -1
  26. package/lib/actions/search.js +12 -6
  27. package/lib/actions/search.js.map +1 -1
  28. package/lib/actions/sources.js +116 -41
  29. package/lib/actions/sources.js.map +1 -1
  30. package/lib/actions/types.js +19 -1
  31. package/lib/actions/types.js.map +1 -1
  32. package/lib/browser-access.js +25 -0
  33. package/lib/browser-access.js.map +1 -1
  34. package/lib/catalog/recommend.js +11 -3
  35. package/lib/catalog/recommend.js.map +1 -1
  36. package/lib/catalog/schema.js +3 -1
  37. package/lib/catalog/schema.js.map +1 -1
  38. package/lib/cli/builtin-specs.js +341 -0
  39. package/lib/cli/builtin-specs.js.map +1 -0
  40. package/lib/cli/chain.js +193 -0
  41. package/lib/cli/chain.js.map +1 -0
  42. package/lib/cli/chains-spec.js +118 -0
  43. package/lib/cli/chains-spec.js.map +1 -0
  44. package/lib/cli/engine.js +99 -0
  45. package/lib/cli/engine.js.map +1 -0
  46. package/lib/cli/opencli-sites.js +83 -0
  47. package/lib/cli/opencli-sites.js.map +1 -0
  48. package/lib/cli/opencli.js +153 -0
  49. package/lib/cli/opencli.js.map +1 -0
  50. package/lib/cli/probe.js +128 -0
  51. package/lib/cli/probe.js.map +1 -0
  52. package/lib/cli/runner.js +564 -0
  53. package/lib/cli/runner.js.map +1 -0
  54. package/lib/cli/spec.js +496 -0
  55. package/lib/cli/spec.js.map +1 -0
  56. package/lib/cli/time-text.js +79 -0
  57. package/lib/cli/time-text.js.map +1 -0
  58. package/lib/cli/trial.js +57 -0
  59. package/lib/cli/trial.js.map +1 -0
  60. package/lib/client/SettingsCard.js +14 -32
  61. package/lib/client/SettingsCard.js.map +1 -1
  62. package/lib/client/agent-mark.js +27 -0
  63. package/lib/client/agent-mark.js.map +1 -0
  64. package/lib/client/card-frame.js +118 -0
  65. package/lib/client/card-frame.js.map +1 -0
  66. package/lib/client/cli-form.js +257 -0
  67. package/lib/client/cli-form.js.map +1 -0
  68. package/lib/client/field-docs.js +130 -0
  69. package/lib/client/field-docs.js.map +1 -0
  70. package/lib/client/field-keys.js +81 -0
  71. package/lib/client/field-keys.js.map +1 -0
  72. package/lib/client/field-rows.js +71 -0
  73. package/lib/client/field-rows.js.map +1 -0
  74. package/lib/client/fill.js +3 -0
  75. package/lib/client/fill.js.map +1 -0
  76. package/lib/client/form-specs.js +15 -1
  77. package/lib/client/form-specs.js.map +1 -1
  78. package/lib/client/form.js +296 -27
  79. package/lib/client/form.js.map +1 -1
  80. package/lib/client/group-advanced.js +23 -0
  81. package/lib/client/group-advanced.js.map +1 -0
  82. package/lib/client/group-agent.js +28 -0
  83. package/lib/client/group-agent.js.map +1 -0
  84. package/lib/client/group-cli.js +136 -0
  85. package/lib/client/group-cli.js.map +1 -0
  86. package/lib/client/group-common.js +29 -0
  87. package/lib/client/group-common.js.map +1 -0
  88. package/lib/client/group-judge.js +67 -0
  89. package/lib/client/group-judge.js.map +1 -0
  90. package/lib/client/group-order.js +201 -0
  91. package/lib/client/group-order.js.map +1 -0
  92. package/lib/client/group-runtime.js +33 -0
  93. package/lib/client/group-runtime.js.map +1 -0
  94. package/lib/client/group-sources.js +83 -0
  95. package/lib/client/group-sources.js.map +1 -0
  96. package/lib/client/groups-basic.js +36 -0
  97. package/lib/client/groups-basic.js.map +1 -0
  98. package/lib/client/index.js.map +1 -1
  99. package/lib/client/json-list.js +50 -0
  100. package/lib/client/json-list.js.map +1 -0
  101. package/lib/client/locales.js +666 -215
  102. package/lib/client/locales.js.map +1 -1
  103. package/lib/client/order.js +192 -0
  104. package/lib/client/order.js.map +1 -0
  105. package/lib/client/overlay-ops.js +46 -0
  106. package/lib/client/overlay-ops.js.map +1 -0
  107. package/lib/client/sources-table.js +1 -0
  108. package/lib/client/sources-table.js.map +1 -1
  109. package/lib/client/styles.js +74 -47
  110. package/lib/client/styles.js.map +1 -1
  111. package/lib/client/text-view.js +98 -0
  112. package/lib/client/text-view.js.map +1 -0
  113. package/lib/client/ui-kit.js +120 -0
  114. package/lib/client/ui-kit.js.map +1 -0
  115. package/lib/client/validators.js +22 -0
  116. package/lib/client/validators.js.map +1 -1
  117. package/lib/client.js +9151 -1987
  118. package/lib/client.js.map +1 -1
  119. package/lib/config-fillers.js +53 -0
  120. package/lib/config-fillers.js.map +1 -0
  121. package/lib/config-groups.js +49 -0
  122. package/lib/config-groups.js.map +1 -0
  123. package/lib/config.js +87 -107
  124. package/lib/config.js.map +1 -1
  125. package/lib/default-chain.js +66 -0
  126. package/lib/default-chain.js.map +1 -0
  127. package/lib/deps.js +109 -102
  128. package/lib/deps.js.map +1 -1
  129. package/lib/engine-error.js +19 -0
  130. package/lib/engine-error.js.map +1 -0
  131. package/lib/engines.js +32 -115
  132. package/lib/engines.js.map +1 -1
  133. package/lib/fetch.js +23 -4
  134. package/lib/fetch.js.map +1 -1
  135. package/lib/index.js +30 -5
  136. package/lib/index.js.map +1 -1
  137. package/lib/overlay-types.js +88 -0
  138. package/lib/overlay-types.js.map +1 -0
  139. package/lib/overlay.js +683 -0
  140. package/lib/overlay.js.map +1 -0
  141. package/lib/pipeline/candidates.js +27 -1
  142. package/lib/pipeline/candidates.js.map +1 -1
  143. package/lib/pipeline/compile.js +63 -0
  144. package/lib/pipeline/compile.js.map +1 -1
  145. package/lib/pipeline/confidence.js +64 -0
  146. package/lib/pipeline/confidence.js.map +1 -0
  147. package/lib/pipeline/fusion.js +50 -3
  148. package/lib/pipeline/fusion.js.map +1 -1
  149. package/lib/pipeline/plan.js +2 -2
  150. package/lib/pipeline/plan.js.map +1 -1
  151. package/lib/pipeline/render.js +20 -2
  152. package/lib/pipeline/render.js.map +1 -1
  153. package/lib/pipeline/run.js +21 -7
  154. package/lib/pipeline/run.js.map +1 -1
  155. package/lib/pipeline/sources-spec.js +19 -3
  156. package/lib/pipeline/sources-spec.js.map +1 -1
  157. package/lib/providers/builtin.js +13 -14
  158. package/lib/providers/builtin.js.map +1 -1
  159. package/lib/providers/deepseek.js +348 -0
  160. package/lib/providers/deepseek.js.map +1 -0
  161. package/lib/providers/http.js.map +1 -1
  162. package/lib/providers/keyed-meta.js +7 -0
  163. package/lib/providers/keyed-meta.js.map +1 -1
  164. package/lib/providers/platforms.js +118 -58
  165. package/lib/providers/platforms.js.map +1 -1
  166. package/lib/providers/registry.js.map +1 -1
  167. package/lib/restart.js +47 -0
  168. package/lib/restart.js.map +1 -0
  169. package/lib/router.js +203 -27
  170. package/lib/router.js.map +1 -1
  171. package/lib/rpc-types.js +15 -0
  172. package/lib/rpc-types.js.map +1 -0
  173. package/lib/rpc.js +85 -0
  174. package/lib/rpc.js.map +1 -0
  175. package/lib/tools.js +10 -4
  176. package/lib/tools.js.map +1 -1
  177. package/lib/types/actions/approval.d.ts +11 -0
  178. package/lib/types/actions/config.d.ts +54 -0
  179. package/lib/types/actions/format.d.ts +9 -2
  180. package/lib/types/actions/run.d.ts +1 -0
  181. package/lib/types/actions/schema.d.ts +7 -1
  182. package/lib/types/actions/sources.d.ts +29 -3
  183. package/lib/types/actions/types.d.ts +28 -2
  184. package/lib/types/browser-access.d.ts +17 -0
  185. package/lib/types/catalog/recommend.d.ts +4 -0
  186. package/lib/types/catalog/schema.d.ts +2 -0
  187. package/lib/types/cli/builtin-specs.d.ts +38 -0
  188. package/lib/types/cli/chain.d.ts +83 -0
  189. package/lib/types/cli/chains-spec.d.ts +48 -0
  190. package/lib/types/cli/engine.d.ts +50 -0
  191. package/lib/types/cli/opencli-sites.d.ts +24 -0
  192. package/lib/types/cli/opencli.d.ts +77 -0
  193. package/lib/types/cli/probe.d.ts +53 -0
  194. package/lib/types/cli/runner.d.ts +126 -0
  195. package/lib/types/cli/spec.d.ts +269 -0
  196. package/lib/types/cli/time-text.d.ts +12 -0
  197. package/lib/types/cli/trial.d.ts +19 -0
  198. package/lib/types/client/SettingsCard.d.ts +17 -1
  199. package/lib/types/client/agent-mark.d.ts +22 -0
  200. package/lib/types/client/card-frame.d.ts +35 -0
  201. package/lib/types/client/cli-form.d.ts +97 -0
  202. package/lib/types/client/field-docs.d.ts +15 -0
  203. package/lib/types/client/field-keys.d.ts +41 -0
  204. package/lib/types/client/field-rows.d.ts +70 -0
  205. package/lib/types/client/fill.d.ts +2 -0
  206. package/lib/types/client/form-specs.d.ts +12 -3
  207. package/lib/types/client/form.d.ts +79 -1
  208. package/lib/types/client/group-advanced.d.ts +9 -0
  209. package/lib/types/client/group-agent.d.ts +20 -0
  210. package/lib/types/client/group-cli.d.ts +52 -0
  211. package/lib/types/client/group-common.d.ts +12 -0
  212. package/lib/types/client/group-judge.d.ts +17 -0
  213. package/lib/types/client/group-order.d.ts +26 -0
  214. package/lib/types/client/group-runtime.d.ts +15 -0
  215. package/lib/types/client/group-sources.d.ts +46 -0
  216. package/lib/types/client/groups-basic.d.ts +18 -0
  217. package/lib/types/client/index.d.ts +8 -0
  218. package/lib/types/client/json-list.d.ts +21 -0
  219. package/lib/types/client/locales.d.ts +1079 -196
  220. package/lib/types/client/order.d.ts +102 -0
  221. package/lib/types/client/overlay-ops.d.ts +37 -0
  222. package/lib/types/client/styles.d.ts +56 -41
  223. package/lib/types/client/text-view.d.ts +22 -0
  224. package/lib/types/client/ui-kit.d.ts +200 -0
  225. package/lib/types/client/validators.d.ts +6 -0
  226. package/lib/types/config-fillers.d.ts +9 -0
  227. package/lib/types/config-groups.d.ts +23 -0
  228. package/lib/types/config.d.ts +265 -216
  229. package/lib/types/default-chain.d.ts +63 -0
  230. package/lib/types/deps.d.ts +25 -23
  231. package/lib/types/engine-error.d.ts +12 -0
  232. package/lib/types/engines.d.ts +45 -10
  233. package/lib/types/fetch.d.ts +12 -3
  234. package/lib/types/index.d.ts +164 -146
  235. package/lib/types/overlay-types.d.ts +98 -0
  236. package/lib/types/overlay.d.ts +141 -0
  237. package/lib/types/pipeline/candidates.d.ts +19 -0
  238. package/lib/types/pipeline/compile.d.ts +11 -0
  239. package/lib/types/pipeline/confidence.d.ts +35 -0
  240. package/lib/types/pipeline/fusion.d.ts +23 -1
  241. package/lib/types/pipeline/render.d.ts +16 -0
  242. package/lib/types/pipeline/run.d.ts +3 -1
  243. package/lib/types/pipeline/sources-spec.d.ts +5 -2
  244. package/lib/types/pipeline/types.d.ts +37 -0
  245. package/lib/types/providers/deepseek.d.ts +130 -0
  246. package/lib/types/providers/http.d.ts +2 -1
  247. package/lib/types/providers/keyed-meta.d.ts +5 -0
  248. package/lib/types/providers/platforms.d.ts +15 -3
  249. package/lib/types/providers/registry.d.ts +10 -0
  250. package/lib/types/restart.d.ts +52 -0
  251. package/lib/types/router.d.ts +69 -9
  252. package/lib/types/rpc-types.d.ts +79 -0
  253. package/lib/types/rpc.d.ts +41 -0
  254. package/lib/types/tools.d.ts +6 -0
  255. package/lib/types/util.d.ts +16 -1
  256. package/lib/util.js +17 -4
  257. package/lib/util.js.map +1 -1
  258. package/package.json +51 -43
  259. package/scripts/check-client-bundle.mjs +1 -1
  260. package/scripts/cli-login-check.mjs +214 -0
  261. package/lib/client/RubricEditor.js +0 -47
  262. package/lib/client/RubricEditor.js.map +0 -1
  263. package/lib/client/fields.js +0 -31
  264. package/lib/client/fields.js.map +0 -1
  265. package/lib/types/client/RubricEditor.d.ts +0 -6
  266. package/lib/types/client/fields.d.ts +0 -65
@@ -0,0 +1,496 @@
1
+ /**
2
+ * Declarative CLI adapter spec (dev-plan M12): what a standalone command-line tool is, which of its commands the plugin
3
+ * may run, and how its output maps to search sources. Pure data plus validation, no Node imports, so the settings card
4
+ * (client bundle) validates `cliAdapters` with the very function the server uses.
5
+ *
6
+ * The read-only guarantee lives here and applies to built-in and user-defined specs alike:
7
+ * - argv is an array of tokens, never a shell string (the runner spawns without a shell);
8
+ * - a spec declares `allowedSubcommands`, and every command word its argv uses (the leading literal tokens before the
9
+ * first flag or placeholder) must be in that list;
10
+ * - no command word, declared subcommand or flag may match the global deny-list (login, post, delete*, like, ...,
11
+ * and the flags that make a CLI read browser cookies or carry secrets in argv).
12
+ * @module web-search-pro/cli/spec
13
+ */
14
+ export const OUTPUT_FORMATS = ['json', 'ndjson', 'yaml', 'text'];
15
+ /** How far a spec has been checked against the real tool (recorded in the spec and shown in `sources.status`). */
16
+ export const CLI_VERIFICATIONS = ['live', 'contract-only', 'docs-only'];
17
+ /**
18
+ * The short honest tag shown next to a backend that was not verified with a real search ("detected and configured" is not "works"),
19
+ * or undefined for `live` and for backends that are not CLI specs.
20
+ */
21
+ export function verificationTag(status) {
22
+ if (status === 'contract-only')
23
+ return 'contract-only — output parser not verified with a real search';
24
+ if (status === 'docs-only')
25
+ return 'docs-only — written from upstream docs, tool not run here';
26
+ if (status === USER_DEFINED)
27
+ return USER_DEFINED_TAG;
28
+ return undefined;
29
+ }
30
+ /** The verification word of a user-defined spec: it is unverified by definition and says so in every result it returns. */
31
+ export const USER_DEFINED = 'user-defined';
32
+ /** The honest label a custom CLI's results and chain entries carry. */
33
+ export const USER_DEFINED_TAG = 'user-defined, not verified by the plugin (用户自定义,未经插件验证)';
34
+ /** Confidence of a custom CLI whose spec gives none: below the built-in sources (1), because nothing here checked its output. */
35
+ export const DEFAULT_CUSTOM_CONFIDENCE = 0.5;
36
+ /** Default and largest size of a whole-output result's text, in characters (`output.lines.maxChars`). */
37
+ export const WHOLE_OUTPUT_DEFAULT_CHARS = 2_000;
38
+ export const WHOLE_OUTPUT_MAX_CHARS = 8_000;
39
+ /** Scheme of the stand-in link of a whole-output result (`cli://<id>?q=<query>`): not a web page, so nothing fetches it. */
40
+ export const WHOLE_OUTPUT_SCHEME = 'cli://';
41
+ export const CLI_ERROR_CODES = ['CLI_NOT_FOUND', 'CLI_CONTRACT_MISMATCH', 'CLI_NOT_LOGGED_IN', 'ENGINE_EMPTY', 'CLI_FAILED'];
42
+ // ── the read-only guard ─────────────────────────────────────────────────────
43
+ /** Command words that write, log in, or change local or remote state. Matched exactly, or as `<word>-...` / `<word>_...`. */
44
+ export const DENIED_SUBCOMMANDS = [
45
+ 'login', 'logout', 'signin', 'signout', 'sign-in', 'sign-out', 'auth', 'whoami-login',
46
+ 'post', 'comment', 'reply', 'publish', 'ask', 'article', 'pin', 'draft', 'upload', 'send', 'create', 'edit', 'write', 'add',
47
+ 'like', 'unlike', 'dislike', 'upvote', 'downvote', 'vote', 'follow', 'unfollow', 'subscribe', 'unsubscribe', 'favorite', 'unfavorite', 'bookmark', 'unbookmark', 'save', 'unsave',
48
+ 'retweet', 'unretweet', 'quote', 'share', 'block', 'unblock', 'mute', 'accept', 'forward',
49
+ 'setup', 'init', 'install', 'uninstall', 'update', 'upgrade', 'config', 'configure', 'register', 'set', 'import', 'export', 'bridge', 'daemon', 'plugin', 'adapter', 'external', 'profile', 'mcp', 'serve',
50
+ ];
51
+ /** Command words denied by prefix alone (`delete`, `delete-note`, `deleteNote`, `remove...`). */
52
+ export const DENIED_PREFIXES = ['delete', 'remove', 'destroy', 'drop', 'purge', 'revoke'];
53
+ /** Flags (without leading dashes) that read browser cookies or carry credentials in argv. */
54
+ export const DENIED_FLAGS = [
55
+ 'cookie-source', 'cookie', 'cookies', 'cookies-from-browser', 'browser-cookies', 'from-browser', 'browser',
56
+ 'password', 'passwd', 'secret', 'token', 'access-token', 'auth-token', 'api-key', 'apikey', 'key', 'username', 'user-token', 'ap-password', 'netrc', 'client-secret', 'authorization', 'auth',
57
+ ];
58
+ function matchesDeniedSubcommand(word) {
59
+ const w = word.toLowerCase();
60
+ if (DENIED_PREFIXES.some(prefix => w.startsWith(prefix)))
61
+ return true;
62
+ return DENIED_SUBCOMMANDS.some(denied => w === denied || w.startsWith(denied + '-') || w.startsWith(denied + '_'));
63
+ }
64
+ const flagName = (token) => token.replace(/^-+/, '').split('=')[0].toLowerCase();
65
+ const isFlag = (token) => token.startsWith('-') && token.length > 1;
66
+ const hasPlaceholder = (token) => /\{[A-Za-z0-9_.]+\}/.test(token);
67
+ /** The command words of an argv: leading literal tokens before the first flag or placeholder token. */
68
+ export function commandWords(argv) {
69
+ const words = [];
70
+ for (const token of argv) {
71
+ if (isFlag(token) || hasPlaceholder(token))
72
+ break;
73
+ words.push(token);
74
+ }
75
+ return words;
76
+ }
77
+ /** Problems of one argv template with respect to the read-only guard (empty = fine). */
78
+ export function argvProblems(argv, allowed, where) {
79
+ const problems = [];
80
+ for (const word of commandWords(argv)) {
81
+ if (matchesDeniedSubcommand(word))
82
+ problems.push(where + ': "' + word + '" is a write / login command (read-only guard)');
83
+ else if (!allowed.includes(word))
84
+ problems.push(where + ': command word "' + word + '" is not in allowedSubcommands');
85
+ }
86
+ for (const token of argv) {
87
+ if (isFlag(token) && DENIED_FLAGS.includes(flagName(token)))
88
+ problems.push(where + ': flag "' + token + '" reads cookies or carries credentials (read-only guard)');
89
+ }
90
+ return problems;
91
+ }
92
+ // ── validation ──────────────────────────────────────────────────────────────
93
+ const isObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
94
+ const isStr = (v, max = 200) => typeof v === 'string' && v.length > 0 && v.length <= max;
95
+ const strList = (v, maxItems, maxLen = 200) => Array.isArray(v) && v.length <= maxItems && v.every(x => isStr(x, maxLen));
96
+ const ID_RE = /^[a-z0-9][a-z0-9._-]{0,39}$/;
97
+ const BIN_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
98
+ const ENV_RE = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
99
+ const PATH_RE = /^[A-Za-z0-9_$-]+(=[A-Za-z0-9_$-]+)?(\.[A-Za-z0-9_$-]+(=[A-Za-z0-9_$-]+)?)*$/;
100
+ const VERSION_RE = /^\d+(\.\d+){0,3}$/;
101
+ const PLACEHOLDERS = new Set(['query', 'count', 'url', 'terms']);
102
+ const MAX_TIMEOUT_MS = 180_000;
103
+ const MAX_OUTPUT_BYTES = 16 * 1024 * 1024;
104
+ const SPEC_KEYS = new Set(['id', 'bins', 'packageNote', 'platforms', 'engine', 'confidence', 'probe', 'allowedSubcommands', 'search', 'searches', 'read', 'env', 'needsLogin', 'login', 'timeoutMs', 'maxOutputBytes', 'verification']);
105
+ const PROBE_KEYS = new Set(['versionArgs', 'minVersion', 'helpArgs', 'mustContain', 'contractHint']);
106
+ const SEARCH_KEYS = new Set(['argv', 'maxCount', 'overfetch', 'output', 'emptyWhen', 'notLoggedInPatterns', 'errorCodes']);
107
+ const ERROR_CODES_KEYS = new Set(['codePath', 'messagePath', 'notLoggedIn', 'notLoggedInExit', 'empty', 'blocked', 'blockedPatterns', 'unavailable', 'timeout', 'usage']);
108
+ const OUTPUT_KEYS = new Set(['format', 'itemsPath', 'expect', 'errorPaths', 'skipWhen', 'lines', 'fields', 'stripTags', 'emptyValues', 'snippetMax', 'titleMax', 'requireTitle']);
109
+ const FIELD_KEYS = new Set(['url', 'title', 'snippet', 'publishedAt']);
110
+ const ENV_KEYS = new Set(['required', 'passthrough', 'set']);
111
+ const LOGIN_KEYS = new Set(['command', 'hint', 'savedCredentialPaths', 'readsBrowserCookiesWithoutLogin']);
112
+ function closed(obj, keys, where, errors) {
113
+ for (const key of Object.keys(obj))
114
+ if (!keys.has(key))
115
+ errors.push(where + '.' + key + ' is not a spec field');
116
+ }
117
+ function templateProblems(text, where, allowedPlaceholders, errors) {
118
+ for (const match of text.matchAll(/\{([^}]*)\}/g)) {
119
+ const name = match[1];
120
+ if (allowedPlaceholders ? !allowedPlaceholders.has(name) : !PATH_RE.test(name))
121
+ errors.push(where + ': unknown placeholder {' + name + '}');
122
+ }
123
+ if (/\{[^}]*$/.test(text) || /^[^{]*\}/.test(text))
124
+ errors.push(where + ': unbalanced brace');
125
+ }
126
+ function checkFieldSource(value, where, errors) {
127
+ if (typeof value === 'string') {
128
+ if (!PATH_RE.test(value))
129
+ errors.push(where + ': "' + value + '" is not a dotted path');
130
+ return;
131
+ }
132
+ if (Array.isArray(value)) {
133
+ if (!value.length || value.length > 12)
134
+ errors.push(where + ': a source list needs 1..12 entries');
135
+ for (const entry of value) {
136
+ if (typeof entry === 'string') {
137
+ if (!PATH_RE.test(entry))
138
+ errors.push(where + ': "' + entry + '" is not a dotted path');
139
+ }
140
+ else if (isObject(entry) && typeof entry.template === 'string')
141
+ checkFieldSource(entry, where, errors);
142
+ else
143
+ errors.push(where + ': list entries are paths or { template, when? }');
144
+ }
145
+ return;
146
+ }
147
+ if (!isObject(value)) {
148
+ errors.push(where + ' must be a path, a list, { template }, { join }, { epoch }, { date } or { time }');
149
+ return;
150
+ }
151
+ const keys = Object.keys(value);
152
+ if (keys.length === 1 && (keys[0] === 'epoch' || keys[0] === 'date' || keys[0] === 'time')) {
153
+ if (typeof value[keys[0]] !== 'string' || !PATH_RE.test(value[keys[0]]))
154
+ errors.push(where + '.' + keys[0] + ' must be a dotted path');
155
+ return;
156
+ }
157
+ if (keys.every(k => k === 'template' || k === 'when') && 'template' in value) {
158
+ if (!isStr(value.template, 300))
159
+ errors.push(where + '.template must be a string');
160
+ else
161
+ templateProblems(value.template, where + '.template', undefined, errors);
162
+ if (value.when !== undefined) {
163
+ const w = value.when;
164
+ if (!(isObject(w) && typeof w.path === 'string' && PATH_RE.test(w.path) && ['string', 'number', 'boolean'].includes(typeof w.equals) && Object.keys(w).every(k => k === 'path' || k === 'equals')))
165
+ errors.push(where + '.when must be { path, equals }');
166
+ }
167
+ return;
168
+ }
169
+ if (keys.every(k => k === 'join' || k === 'sep') && Array.isArray(value.join)) {
170
+ if (!value.join.length || value.join.length > 8)
171
+ errors.push(where + '.join needs 1..8 parts');
172
+ for (const part of value.join) {
173
+ if (typeof part === 'string') {
174
+ if (!PATH_RE.test(part))
175
+ errors.push(where + '.join: "' + part + '" is not a dotted path');
176
+ }
177
+ else if (isObject(part) && typeof part.template === 'string' && Object.keys(part).length === 1) {
178
+ if (!isStr(part.template, 300))
179
+ errors.push(where + '.join: a template part must be a string');
180
+ else
181
+ templateProblems(part.template, where + '.join.template', undefined, errors);
182
+ }
183
+ else if (isObject(part) && (typeof part.path === 'string' ? PATH_RE.test(part.path) : typeof part.time === 'string' && PATH_RE.test(part.time)) && Object.keys(part).every(k => [typeof part.path === 'string' ? 'path' : 'time', 'prefix', 'suffix'].includes(k))) {
184
+ for (const k of ['prefix', 'suffix'])
185
+ if (part[k] !== undefined && !(typeof part[k] === 'string' && part[k].length <= 40))
186
+ errors.push(where + '.join.' + k + ' must be a short string');
187
+ }
188
+ else
189
+ errors.push(where + '.join: each part is a path, { template }, { time } or { path, prefix?, suffix? }');
190
+ }
191
+ if (value.sep !== undefined && !(typeof value.sep === 'string' && value.sep.length <= 16))
192
+ errors.push(where + '.sep must be a short string');
193
+ return;
194
+ }
195
+ errors.push(where + ' must be a path, a list, { template }, { join }, { epoch }, { date } or { time }');
196
+ }
197
+ function checkOutput(value, where, errors) {
198
+ if (!isObject(value)) {
199
+ errors.push(where + ' must be an object');
200
+ return;
201
+ }
202
+ closed(value, OUTPUT_KEYS, where, errors);
203
+ if (!OUTPUT_FORMATS.includes(value.format))
204
+ errors.push(where + '.format must be one of ' + OUTPUT_FORMATS.join('|'));
205
+ if (value.itemsPath !== undefined && !(typeof value.itemsPath === 'string' && PATH_RE.test(value.itemsPath)))
206
+ errors.push(where + '.itemsPath must be a dotted path');
207
+ if (value.expect !== undefined) {
208
+ if (!Array.isArray(value.expect) || value.expect.length > 8)
209
+ errors.push(where + '.expect must be a list of { path, equals }');
210
+ else
211
+ for (const e of value.expect) {
212
+ if (!(isObject(e) && typeof e.path === 'string' && PATH_RE.test(e.path) && ['string', 'number', 'boolean'].includes(typeof e.equals) && Object.keys(e).every(k => k === 'path' || k === 'equals')))
213
+ errors.push(where + '.expect entries are { path, equals }');
214
+ }
215
+ }
216
+ if (value.errorPaths !== undefined && !(Array.isArray(value.errorPaths) && value.errorPaths.length <= 6 && value.errorPaths.every(p => typeof p === 'string' && PATH_RE.test(p))))
217
+ errors.push(where + '.errorPaths must be dotted paths');
218
+ if (value.skipWhen !== undefined) {
219
+ const k = value.skipWhen;
220
+ if (!(isObject(k) && typeof k.path === 'string' && PATH_RE.test(k.path) && ['string', 'number', 'boolean'].includes(typeof k.equals) && Object.keys(k).every(key => key === 'path' || key === 'equals')))
221
+ errors.push(where + '.skipWhen must be { path, equals }');
222
+ }
223
+ const whole = isObject(value.lines) && value.lines.mode === 'whole';
224
+ if (value.lines !== undefined) {
225
+ const l = value.lines;
226
+ if (isObject(l) && l.mode === 'url-lines' && Object.keys(l).length === 1) { /* fine */ }
227
+ else if (isObject(l) && l.mode === 'whole' && Object.keys(l).every(k => k === 'mode' || k === 'maxChars')) {
228
+ if (l.maxChars !== undefined && !(Number.isInteger(l.maxChars) && l.maxChars >= 200 && l.maxChars <= WHOLE_OUTPUT_MAX_CHARS))
229
+ errors.push(where + '.lines.maxChars must be an integer 200..' + WHOLE_OUTPUT_MAX_CHARS);
230
+ }
231
+ else if (isObject(l) && l.mode === 'tsv' && strList(l.columns, 24, 40) && l.columns.length >= 2 && l.columns.every(c => /^[A-Za-z0-9_]+$/.test(c)) && Object.keys(l).every(k => k === 'mode' || k === 'columns')) { /* fine */ }
232
+ else
233
+ errors.push(where + '.lines must be { mode: "url-lines" }, { mode: "tsv", columns: [...] } or { mode: "whole" }');
234
+ }
235
+ if (value.format === 'text' && value.lines === undefined)
236
+ errors.push(where + '.lines is required for format text');
237
+ if (value.format !== 'text' && value.lines !== undefined)
238
+ errors.push(where + '.lines is only for format text');
239
+ if (value.fields === undefined && whole) { /* a whole-output result maps no fields */ }
240
+ else if (!isObject(value.fields))
241
+ errors.push(where + '.fields must be an object');
242
+ else {
243
+ closed(value.fields, FIELD_KEYS, where + '.fields', errors);
244
+ if (value.fields.url === undefined && !whole)
245
+ errors.push(where + '.fields.url is required');
246
+ for (const key of Object.keys(value.fields))
247
+ if (FIELD_KEYS.has(key))
248
+ checkFieldSource(value.fields[key], where + '.fields.' + key, errors);
249
+ }
250
+ if (value.stripTags !== undefined && typeof value.stripTags !== 'boolean')
251
+ errors.push(where + '.stripTags must be a boolean');
252
+ if (value.emptyValues !== undefined && !strList(value.emptyValues, 8, 20))
253
+ errors.push(where + '.emptyValues must be short strings');
254
+ for (const key of ['snippetMax', 'titleMax'])
255
+ if (value[key] !== undefined && !(Number.isInteger(value[key]) && value[key] >= 40 && value[key] <= 2000))
256
+ errors.push(where + '.' + key + ' must be an integer 40..2000');
257
+ if (value.requireTitle !== undefined && typeof value.requireTitle !== 'boolean')
258
+ errors.push(where + '.requireTitle must be a boolean');
259
+ }
260
+ function checkSearch(value, where, allowed, errors) {
261
+ if (!isObject(value)) {
262
+ errors.push(where + ' must be an object');
263
+ return;
264
+ }
265
+ closed(value, SEARCH_KEYS, where, errors);
266
+ if (!Array.isArray(value.argv) || !value.argv.length || value.argv.length > 24 || !value.argv.every(t => typeof t === 'string' && t.length > 0 && t.length <= 200)) {
267
+ errors.push(where + '.argv must be an array of 1..24 non-empty strings (never a shell string)');
268
+ }
269
+ else {
270
+ const argv = value.argv;
271
+ argv.forEach(token => templateProblems(token, where + '.argv', PLACEHOLDERS, errors));
272
+ if (!argv.some(t => /\{(query|url|terms)\}/.test(t)))
273
+ errors.push(where + '.argv must carry a {query} (or {url} / {terms}) placeholder');
274
+ for (const token of argv)
275
+ if (token.includes('{terms}') && token !== '{terms}')
276
+ errors.push(where + '.argv: {terms} must be a token of its own');
277
+ errors.push(...argvProblems(argv, allowed, where + '.argv'));
278
+ }
279
+ if (value.maxCount !== undefined && !(Number.isInteger(value.maxCount) && value.maxCount >= 1 && value.maxCount <= 100))
280
+ errors.push(where + '.maxCount must be an integer 1..100');
281
+ if (value.overfetch !== undefined && !(Number.isInteger(value.overfetch) && value.overfetch >= 0 && value.overfetch <= 10))
282
+ errors.push(where + '.overfetch must be an integer 0..10');
283
+ checkOutput(value.output, where + '.output', errors);
284
+ for (const key of ['emptyWhen', 'notLoggedInPatterns'])
285
+ if (value[key] !== undefined && !strList(value[key], 12, 120))
286
+ errors.push(where + '.' + key + ' must be a list of short strings');
287
+ if (value.errorCodes !== undefined)
288
+ checkErrorCodes(value.errorCodes, where + '.errorCodes', errors);
289
+ }
290
+ function checkErrorCodes(value, where, errors) {
291
+ if (!isObject(value)) {
292
+ errors.push(where + ' must be an object');
293
+ return;
294
+ }
295
+ closed(value, ERROR_CODES_KEYS, where, errors);
296
+ if (!(typeof value.codePath === 'string' && PATH_RE.test(value.codePath)))
297
+ errors.push(where + '.codePath must be a dotted path');
298
+ if (value.messagePath !== undefined && !(typeof value.messagePath === 'string' && PATH_RE.test(value.messagePath)))
299
+ errors.push(where + '.messagePath must be a dotted path');
300
+ for (const key of ['notLoggedIn', 'empty', 'blocked', 'blockedPatterns', 'unavailable', 'timeout', 'usage'])
301
+ if (value[key] !== undefined && !strList(value[key], 16, 80))
302
+ errors.push(where + '.' + key + ' must be a list of short strings');
303
+ if (value.notLoggedInExit !== undefined && !(Array.isArray(value.notLoggedInExit) && value.notLoggedInExit.length <= 8 && value.notLoggedInExit.every(c => Number.isInteger(c) && c > 0 && c < 256)))
304
+ errors.push(where + '.notLoggedInExit must be exit codes 1..255');
305
+ }
306
+ /**
307
+ * Validate one adapter spec (built-in or user-defined). Never throws. A user-defined spec (`origin: 'user'`) may not carry a
308
+ * `verification` (it is unverified by definition) and its `platforms` are ignored: it is registered as `custom-cli:<id>`.
309
+ */
310
+ export function validateCliAdapterSpec(raw, origin = 'user') {
311
+ const errors = [];
312
+ if (!isObject(raw))
313
+ return { ok: false, errors: ['spec must be an object'] };
314
+ const id = typeof raw.id === 'string' ? raw.id : '(no id)';
315
+ const at = 'cliAdapters.' + id;
316
+ closed(raw, SPEC_KEYS, at, errors);
317
+ if (typeof raw.id !== 'string' || !ID_RE.test(raw.id))
318
+ errors.push(at + '.id must match ' + String(ID_RE));
319
+ if (!Array.isArray(raw.bins) || !raw.bins.length || raw.bins.length > 4 || !raw.bins.every(b => typeof b === 'string' && BIN_RE.test(b)))
320
+ errors.push(at + '.bins must be 1..4 command names (no paths)');
321
+ if (!isStr(raw.packageNote, 240))
322
+ errors.push(at + '.packageNote must be a short string (what the package is called, which can differ from the command)');
323
+ // A user spec may serve no platform at all when it is a general engine; a built-in always names its platforms.
324
+ const noPlatforms = origin === 'user' && raw.engine === true;
325
+ if (!strList(raw.platforms, 8, 40) || (!raw.platforms.length && !noPlatforms))
326
+ errors.push(at + (origin === 'user' ? '.platforms must list 1..8 platform ids (or be empty with "engine": true)' : '.platforms must list 1..8 platform ids'));
327
+ for (const key of ['engine', 'confidence'])
328
+ if (raw[key] !== undefined && origin !== 'user')
329
+ errors.push(at + '.' + key + ' is for user-defined specs only');
330
+ if (raw.engine !== undefined && typeof raw.engine !== 'boolean')
331
+ errors.push(at + '.engine must be a boolean');
332
+ if (raw.confidence !== undefined && !(typeof raw.confidence === 'number' && Number.isFinite(raw.confidence) && raw.confidence >= 0 && raw.confidence <= 1))
333
+ errors.push(at + '.confidence must be a number 0..1');
334
+ if (typeof raw.needsLogin !== 'boolean')
335
+ errors.push(at + '.needsLogin must be a boolean');
336
+ if (!(Number.isInteger(raw.timeoutMs) && raw.timeoutMs >= 1_000 && raw.timeoutMs <= MAX_TIMEOUT_MS))
337
+ errors.push(at + '.timeoutMs must be an integer 1000..' + MAX_TIMEOUT_MS);
338
+ if (!(Number.isInteger(raw.maxOutputBytes) && raw.maxOutputBytes >= 1_024 && raw.maxOutputBytes <= MAX_OUTPUT_BYTES))
339
+ errors.push(at + '.maxOutputBytes must be an integer 1024..' + MAX_OUTPUT_BYTES);
340
+ const allowed = strList(raw.allowedSubcommands, 12, 60) ? raw.allowedSubcommands : undefined;
341
+ if (!allowed)
342
+ errors.push(at + '.allowedSubcommands must list the command words the spec uses (up to 12; empty for a tool without subcommands)');
343
+ else
344
+ for (const word of allowed)
345
+ if (matchesDeniedSubcommand(word))
346
+ errors.push(at + '.allowedSubcommands: "' + word + '" is a write / login command (read-only guard)');
347
+ if (!isObject(raw.probe))
348
+ errors.push(at + '.probe must be an object');
349
+ else {
350
+ const p = raw.probe;
351
+ closed(p, PROBE_KEYS, at + '.probe', errors);
352
+ for (const key of ['versionArgs', 'helpArgs']) {
353
+ if (!Array.isArray(p[key]) || !p[key].every(t => typeof t === 'string' && t.length > 0 && t.length <= 80) || p[key].length > 6)
354
+ errors.push(at + '.probe.' + key + ' must be an array of short strings');
355
+ else if (allowed)
356
+ errors.push(...argvProblems(p[key], allowed, at + '.probe.' + key));
357
+ }
358
+ if (!(Array.isArray(p.helpArgs) && p.helpArgs.length))
359
+ errors.push(at + '.probe.helpArgs must not be empty');
360
+ if (p.minVersion !== undefined && !(typeof p.minVersion === 'string' && VERSION_RE.test(p.minVersion)))
361
+ errors.push(at + '.probe.minVersion must look like 1.2.3');
362
+ if (!strList(p.mustContain, 12, 80))
363
+ errors.push(at + '.probe.mustContain must be a list of short strings (the subcommands / flags that prove the contract)');
364
+ if (p.contractHint !== undefined && !isStr(p.contractHint, 200))
365
+ errors.push(at + '.probe.contractHint must be a short string');
366
+ }
367
+ const searchWhere = (key) => at + '.' + key;
368
+ if (allowed) {
369
+ checkSearch(raw.search, searchWhere('search'), allowed, errors);
370
+ if (raw.searches !== undefined) {
371
+ if (!isObject(raw.searches))
372
+ errors.push(at + '.searches must be an object keyed by platform id');
373
+ else
374
+ for (const [platform, s] of Object.entries(raw.searches)) {
375
+ if (!ID_RE.test(platform))
376
+ errors.push(at + '.searches: "' + platform + '" is not a platform id');
377
+ checkSearch(s, at + '.searches.' + platform, allowed, errors);
378
+ }
379
+ }
380
+ if (raw.read !== undefined)
381
+ checkSearch(raw.read, searchWhere('read'), allowed, errors);
382
+ }
383
+ if (!isObject(raw.env))
384
+ errors.push(at + '.env must be an object');
385
+ else {
386
+ closed(raw.env, ENV_KEYS, at + '.env', errors);
387
+ for (const key of ['required', 'passthrough']) {
388
+ const list = raw.env[key];
389
+ if (list !== undefined && !(Array.isArray(list) && list.length <= 16 && list.every(n => typeof n === 'string' && ENV_RE.test(n))))
390
+ errors.push(at + '.env.' + key + ' must be environment variable NAMES (never values)');
391
+ }
392
+ if (raw.env.set !== undefined) {
393
+ const set = raw.env.set;
394
+ if (!isObject(set) || Object.keys(set).length > 8 || !Object.entries(set).every(([k, val]) => ENV_RE.test(k) && typeof val === 'string' && val.length <= 80))
395
+ errors.push(at + '.env.set must be a few NAME: short literal pairs');
396
+ else if (Object.keys(set).some(k => /key|token|secret|password|cookie/i.test(k)))
397
+ errors.push(at + '.env.set must not set credentials: name them in env.required / env.passthrough and keep the value in your environment');
398
+ }
399
+ }
400
+ if (raw.login !== undefined) {
401
+ const l = raw.login;
402
+ if (!isObject(l))
403
+ errors.push(at + '.login must be an object');
404
+ else {
405
+ closed(l, LOGIN_KEYS, at + '.login', errors);
406
+ if (l.command === undefined && l.hint === undefined)
407
+ errors.push(at + '.login needs a command (what the user runs themselves) or a hint (what the user does)');
408
+ if (l.command !== undefined && !isStr(l.command, 120))
409
+ errors.push(at + '.login.command must be a short string (what the user runs themselves)');
410
+ if (l.hint !== undefined && !isStr(l.hint, 200))
411
+ errors.push(at + '.login.hint must be a short string (what the user does)');
412
+ if (l.savedCredentialPaths !== undefined && !(strList(l.savedCredentialPaths, 4, 160) && l.savedCredentialPaths.every(p => /^~\/[^\0]+$/.test(p) && !p.includes('..'))))
413
+ errors.push(at + '.login.savedCredentialPaths must be paths starting with ~/ (no ..)');
414
+ if (l.readsBrowserCookiesWithoutLogin !== undefined && typeof l.readsBrowserCookiesWithoutLogin !== 'boolean')
415
+ errors.push(at + '.login.readsBrowserCookiesWithoutLogin must be a boolean');
416
+ if (l.readsBrowserCookiesWithoutLogin === true && !(Array.isArray(l.savedCredentialPaths) && l.savedCredentialPaths.length))
417
+ errors.push(at + '.login: a tool that reads browser cookies without a login needs savedCredentialPaths, so the plugin can refuse to run it without one');
418
+ }
419
+ }
420
+ if (raw.needsLogin === true && !isObject(raw.login) && !(isObject(raw.env) && Array.isArray(raw.env.required) && raw.env.required.length))
421
+ errors.push(at + ': needsLogin without login.command or env.required gives the user nothing to run');
422
+ if (raw.verification !== undefined) {
423
+ const v = raw.verification;
424
+ if (origin === 'user')
425
+ errors.push(at + '.verification is for built-in specs only');
426
+ else if (!(isObject(v) && CLI_VERIFICATIONS.includes(v.status) && Object.keys(v).every(k => ['status', 'version', 'date', 'note'].includes(k))))
427
+ errors.push(at + '.verification must be { status, version?, date?, note? }');
428
+ else if (v.status === 'live' && !(isStr(v.version, 40) && typeof v.date === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(v.date)))
429
+ errors.push(at + '.verification: live needs the verified version and a YYYY-MM-DD date');
430
+ }
431
+ if (errors.length)
432
+ return { ok: false, errors };
433
+ const spec = raw;
434
+ // Every platform the spec lists has a search command.
435
+ return { ok: true, errors: [], spec };
436
+ }
437
+ /** Validate the `cliAdapters` setting: the valid specs by id and the problems of the rest (an invalid entry is ignored, never fatal). */
438
+ export function resolveCliAdapters(input) {
439
+ const specs = new Map();
440
+ const diagnostics = [];
441
+ if (input === undefined || input === null)
442
+ return { specs, diagnostics };
443
+ if (!isObject(input))
444
+ return { specs, diagnostics: ['cliAdapters must be an object keyed by adapter id'] };
445
+ for (const [key, raw] of Object.entries(input)) {
446
+ if (isObject(raw) && raw.id !== undefined && raw.id !== key) {
447
+ diagnostics.push('cliAdapters.' + key + ' ignored: its id "' + String(raw.id) + '" must equal its key');
448
+ continue;
449
+ }
450
+ const result = validateCliAdapterSpec(isObject(raw) ? { ...raw, id: key } : raw, 'user');
451
+ if (!result.ok) {
452
+ diagnostics.push('cliAdapters.' + key + ' ignored: ' + result.errors.slice(0, 4).join('; ') + (result.errors.length > 4 ? ' (+' + (result.errors.length - 4) + ' more)' : ''));
453
+ continue;
454
+ }
455
+ specs.set(key, result.spec);
456
+ }
457
+ return { specs, diagnostics };
458
+ }
459
+ /** Search spec of one platform: the platform's override, else the default. */
460
+ export function searchSpecFor(spec, platform) {
461
+ return spec.searches?.[platform] ?? spec.search;
462
+ }
463
+ // ── versions ────────────────────────────────────────────────────────────────
464
+ export function compareVersions(left, right) {
465
+ const a = left.split('.').map(Number);
466
+ const b = right.split('.').map(Number);
467
+ for (let index = 0; index < Math.max(a.length, b.length); index++) {
468
+ const delta = (a[index] ?? 0) - (b[index] ?? 0);
469
+ if (delta !== 0)
470
+ return delta;
471
+ }
472
+ return 0;
473
+ }
474
+ /** The first `X.Y.Z` (or `X.Y`) in a tool's version output. */
475
+ export function parseVersion(output) {
476
+ return /\b(\d+\.\d+(?:\.\d+)?)\b/.exec(output)?.[1];
477
+ }
478
+ // ── platform backend settings (`platformBackends`) ──────────────────────────
479
+ /** `platformBackends`: ordered backend ids per platform. Pure shape check; ids are checked against the known backends by the caller. */
480
+ export function platformBackendProblems(input) {
481
+ if (input === undefined || input === null)
482
+ return [];
483
+ if (!isObject(input))
484
+ return ['platformBackends must be an object: { <platform>: [backend ids] }'];
485
+ const problems = [];
486
+ for (const [platform, ids] of Object.entries(input)) {
487
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,59}$/.test(platform))
488
+ problems.push('platformBackends: "' + platform + '" is not a platform id');
489
+ if (!(Array.isArray(ids) && ids.length <= 12 && ids.every(id => typeof id === 'string' && /^[A-Za-z0-9][A-Za-z0-9._:-]{0,59}$/.test(id))))
490
+ problems.push('platformBackends.' + platform + ' must be a list of backend ids');
491
+ else if (new Set(ids).size !== ids.length)
492
+ problems.push('platformBackends.' + platform + ' lists a backend twice');
493
+ }
494
+ return problems;
495
+ }
496
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/cli/spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAU,CAAA;AAGzE,kHAAkH;AAClH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,CAAU,CAAA;AAGhF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,IAAI,MAAM,KAAK,eAAe;QAAE,OAAO,+DAA+D,CAAA;IACtG,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,2DAA2D,CAAA;IAC9F,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,gBAAgB,CAAA;IACpD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,2HAA2H;AAC3H,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAA;AAC1C,uEAAuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,yDAAyD,CAAA;AACzF,iIAAiI;AACjI,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAA;AAC5C,yGAAyG;AACzG,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAA;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAA;AAC3C,4HAA4H;AAC5H,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAA;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,eAAe,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,CAAU,CAAA;AAuKrI,+EAA+E;AAE/E,6HAA6H;AAC7H,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc;IACrF,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;IAC3H,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ;IACjL,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS;IACzF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO;CAC3M,CAAA;AACD,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;AAE5G,6FAA6F;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAsB;IAC7C,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS;IAC1G,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM;CAC9L,CAAA;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAC5B,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACrE,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAA;AACpH,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAA;AACjG,MAAM,MAAM,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;AACpF,MAAM,cAAc,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAEnF,uGAAuG;AACvG,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC;YAAE,MAAK;QACjD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,IAAuB,EAAE,OAA0B,EAAE,KAAa;IAC7F,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,uBAAuB,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,gDAAgD,CAAC,CAAA;aACpH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,GAAG,gCAAgC,CAAC,CAAA;IACvH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,0DAA0D,CAAC,CAAA;IACrK,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,+EAA+E;AAE/E,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACvH,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,GAAG,GAAG,GAAG,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAA;AAC9G,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,QAAgB,EAAE,MAAM,GAAG,GAAG,EAAiB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAEzJ,MAAM,KAAK,GAAG,6BAA6B,CAAA;AAC3C,MAAM,MAAM,GAAG,mCAAmC,CAAA;AAClD,MAAM,MAAM,GAAG,+BAA+B,CAAA;AAC9C,MAAM,OAAO,GAAG,6EAA6E,CAAA;AAC7F,MAAM,UAAU,GAAG,mBAAmB,CAAA;AACtC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;AAChE,MAAM,cAAc,GAAG,OAAO,CAAA;AAC9B,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAA;AACvO,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,CAAA;AACpG,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,YAAY,CAAC,CAAC,CAAA;AAC1H,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;AACzK,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAA;AACjL,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;AACtE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAA;AAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,sBAAsB,EAAE,iCAAiC,CAAC,CAAC,CAAA;AAE1G,SAAS,MAAM,CAAC,GAA4B,EAAE,IAAiB,EAAE,KAAa,EAAE,MAAgB;IAC9F,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,sBAAsB,CAAC,CAAA;AACjH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa,EAAE,mBAAoD,EAAE,MAAgB;IAC3H,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACtB,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,yBAAyB,GAAG,IAAI,GAAG,GAAG,CAAC,CAAA;IAC7I,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC,CAAA;AAC/F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,KAAa,EAAE,MAAgB;IACvE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,wBAAwB,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAClI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,qCAAqC,CAAC,CAAA;QAClG,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,wBAAwB,CAAC,CAAA;YAAC,CAAC;iBACrH,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAAE,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;;gBACjG,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,iDAAiD,CAAC,CAAA;QAC7E,CAAC;QACD,OAAM;IACR,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,kFAAkF,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IACzI,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;QAC3F,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAW,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAA;QAClJ,OAAM;IACR,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,4BAA4B,CAAC,CAAA;;YAC7E,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAC7E,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAA;YACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,gCAAgC,CAAC,CAAA;QAC3P,CAAC;QACD,OAAM;IACR,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC,CAAA;QAC9F,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI,GAAG,wBAAwB,CAAC,CAAA;YAAC,CAAC;iBACvH,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/F,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,yCAAyC,CAAC,CAAA;;oBACzF,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,gBAAgB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;YACnF,CAAC;iBAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrQ,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;oBAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAK,IAAI,CAAC,CAAC,CAAY,CAAC,MAAM,IAAI,EAAE,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,GAAG,yBAAyB,CAAC,CAAA;YACtM,CAAC;;gBAAM,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,kFAAkF,CAAC,CAAA;QAChH,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,6BAA6B,CAAC,CAAA;QAC7I,OAAM;IACR,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,kFAAkF,CAAC,CAAA;AACzG,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa,EAAE,MAAgB;IAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACzC,IAAI,CAAE,cAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,yBAAyB,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7I,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,kCAAkC,CAAC,CAAA;IACrK,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,4CAA4C,CAAC,CAAA;;YACzH,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,sCAAsC,CAAC,CAAA;YACjQ,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,kCAAkC,CAAC,CAAA;IAC1O,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAA;QACxB,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oCAAoC,CAAC,CAAA;IACrQ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA;IACnE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAA;QACrB,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;aACnF,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAK,CAAC,CAAC,QAAmB,IAAI,GAAG,IAAK,CAAC,CAAC,QAAmB,IAAI,sBAAsB,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,0CAA0C,GAAG,sBAAsB,CAAC,CAAA;QAChP,CAAC;aACI,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;;YAC3N,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,4FAA4F,CAAC,CAAA;IACxH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oCAAoC,CAAC,CAAA;IACnH,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,gCAAgC,CAAC,CAAA;IAC/G,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC,0CAA0C,CAAC,CAAC;SAClF,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,2BAA2B,CAAC,CAAA;SAC7E,CAAC;QACJ,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,GAAG,SAAS,EAAE,MAAM,CAAC,CAAA;QAC3D,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,yBAAyB,CAAC,CAAA;QAC5F,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,GAAG,EAAE,MAAM,CAAC,CAAA;IAC7I,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,8BAA8B,CAAC,CAAA;IAC9H,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oCAAoC,CAAC,CAAA;IACpI,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAU;QAAE,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAK,KAAK,CAAC,GAAG,CAAY,IAAI,EAAE,IAAK,KAAK,CAAC,GAAG,CAAY,IAAI,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,8BAA8B,CAAC,CAAA;IACzP,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,iCAAiC,CAAC,CAAA;AACzI,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa,EAAE,OAA0B,EAAE,MAAgB;IAC9F,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC;QACnK,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,0EAA0E,CAAC,CAAA;IACjG,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,KAAK,CAAC,IAAgB,CAAA;QACnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;QACrF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,6DAA6D,CAAC,CAAA;QACxI,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,2CAA2C,CAAC,CAAA;QAChJ,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAA;IAC9D,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAK,KAAK,CAAC,QAAmB,IAAI,CAAC,IAAK,KAAK,CAAC,QAAmB,IAAI,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,qCAAqC,CAAC,CAAA;IAC3M,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAK,KAAK,CAAC,SAAoB,IAAI,CAAC,IAAK,KAAK,CAAC,SAAoB,IAAI,EAAE,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,qCAAqC,CAAC,CAAA;IAC9M,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,EAAE,MAAM,CAAC,CAAA;IACpD,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAU;QAAE,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,kCAAkC,CAAC,CAAA;IACnM,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,GAAG,aAAa,EAAE,MAAM,CAAC,CAAA;AACtG,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa,EAAE,MAAgB;IACtE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oBAAoB,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAC9C,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,iCAAiC,CAAC,CAAA;IACjI,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,oCAAoC,CAAC,CAAA;IAC7K,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAU;QAAE,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,kCAAkC,CAAC,CAAA;IACvP,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAK,CAAY,GAAG,CAAC,IAAK,CAAY,GAAG,GAAG,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,4CAA4C,CAAC,CAAA;AACjS,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,SAA6B,MAAM;IACtF,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAA;IAC5E,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1D,MAAM,EAAE,GAAG,cAAc,GAAG,EAAE,CAAA;IAC9B,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,6CAA6C,CAAC,CAAA;IACzM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,qGAAqG,CAAC,CAAA;IACzJ,+GAA+G;IAC/G,MAAM,WAAW,GAAG,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAA;IAC5D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAE,GAAG,CAAC,SAAsB,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAA;IAC1P,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAU;QAAE,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,iCAAiC,CAAC,CAAA;IACrK,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,2BAA2B,CAAC,CAAA;IAC9G,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,mCAAmC,CAAC,CAAA;IACjN,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,+BAA+B,CAAC,CAAA;IAC1F,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAK,GAAG,CAAC,SAAoB,IAAI,KAAK,IAAK,GAAG,CAAC,SAAoB,IAAI,cAAc,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,sCAAsC,GAAG,cAAc,CAAC,CAAA;IACtM,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,IAAK,GAAG,CAAC,cAAyB,IAAI,KAAK,IAAK,GAAG,CAAC,cAAyB,IAAI,gBAAgB,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,2CAA2C,GAAG,gBAAgB,CAAC,CAAA;IAE9N,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAA8B,CAAC,CAAC,CAAC,SAAS,CAAA;IACxG,IAAI,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,gHAAgH,CAAC,CAAA;;QAC3I,KAAK,MAAM,IAAI,IAAI,OAAO;YAAE,IAAI,uBAAuB,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,wBAAwB,GAAG,IAAI,GAAG,gDAAgD,CAAC,CAAA;IAExK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,0BAA0B,CAAC,CAAA;SACjE,CAAC;QACJ,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAA;QACnB,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC5C,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAU,EAAE,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAK,CAAC,CAAC,GAAG,CAAe,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,GAAG,GAAG,GAAG,oCAAoC,CAAC,CAAA;iBAClN,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAa,EAAE,OAAO,EAAE,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,CAAA;QACnG,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,mCAAmC,CAAC,CAAA;QAC5G,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,wCAAwC,CAAC,CAAA;QAClK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,sGAAsG,CAAC,CAAA;QAC7J,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,4CAA4C,CAAC,CAAA;IACjI,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAA;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAC/D,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,kDAAkD,CAAC,CAAA;;gBAC5F,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,cAAc,GAAG,QAAQ,GAAG,wBAAwB,CAAC,CAAA;oBACjG,WAAW,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;gBAC/D,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACzF,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,wBAAwB,CAAC,CAAA;SAC7D,CAAC;QACJ,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAA;QAC9C,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAU,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,GAAG,GAAG,GAAG,oDAAoD,CAAC,CAAA;QAC3N,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAA;YACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,kDAAkD,CAAC,CAAA;iBAC7N,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,uHAAuH,CAAC,CAAA;QAC7N,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,0BAA0B,CAAC,CAAA;aACzD,CAAC;YACJ,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC5C,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,uFAAuF,CAAC,CAAA;YAC9J,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,uEAAuE,CAAC,CAAA;YAChJ,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,yDAAyD,CAAC,CAAA;YAC5H,IAAI,CAAC,CAAC,oBAAoB,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,EAAE,GAAG,CAAC,IAAK,CAAC,CAAC,oBAAiC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,oEAAoE,CAAC,CAAA;YAC7Q,IAAI,CAAC,CAAC,+BAA+B,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,+BAA+B,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,0DAA0D,CAAC,CAAA;YAC3L,IAAI,CAAC,CAAC,+BAA+B,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,sIAAsI,CAAC,CAAA;QACvR,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,kFAAkF,CAAC,CAAA;IAE/O,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAA;QAC1B,IAAI,MAAM,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,0CAA0C,CAAC,CAAA;aAC9E,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAK,iBAAwC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,0DAA0D,CAAC,CAAA;aAChP,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,sEAAsE,CAAC,CAAA;IACvN,CAAC;IAED,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC/C,MAAM,IAAI,GAAG,GAAgC,CAAA;IAC7C,sDAAsD;IACtD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;AACvC,CAAC;AAED,yIAAyI;AACzI,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;IAC/C,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAA;IACxE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,mDAAmD,CAAC,EAAE,CAAA;IAC1G,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,WAAW,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,GAAG,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,CAAC;YAAC,SAAQ;QAAC,CAAC;QAClL,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACxF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAAC,WAAW,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,GAAG,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,SAAQ;QAAC,CAAC;QAC5M,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAK,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAA;AAC/B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,IAAoB,EAAE,QAAgB;IAClE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAA;AACjD,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAC/C,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;IAC/B,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,+EAA+E;AAE/E,wIAAwI;AACxI,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IACpD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,mEAAmE,CAAC,CAAA;IAClG,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,qBAAqB,GAAG,QAAQ,GAAG,wBAAwB,CAAC,CAAA;QACpI,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,oCAAoC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,GAAG,gCAAgC,CAAC,CAAA;aACtN,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,GAAG,wBAAwB,CAAC,CAAA;IACrH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}