@multiplayer-app/agent 0.1.20 → 0.1.21

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 (290) hide show
  1. package/README.md +14 -7
  2. package/dist/agent/definition.test.js +8 -3
  3. package/dist/agent/definition.test.js.map +1 -1
  4. package/dist/agent/profiles/coding.d.ts +1 -1
  5. package/dist/agent/profiles/coding.d.ts.map +1 -1
  6. package/dist/agent/profiles/coding.js +21 -4
  7. package/dist/agent/profiles/coding.js.map +1 -1
  8. package/dist/agent/profiles/index.js +1 -1
  9. package/dist/agent/profiles/index.js.map +1 -1
  10. package/dist/agent/profiles/research.d.ts.map +1 -1
  11. package/dist/agent/profiles/research.js +2 -2
  12. package/dist/agent/profiles/research.js.map +1 -1
  13. package/dist/agent/turn-history.d.ts.map +1 -1
  14. package/dist/agent/turn-history.js +7 -1
  15. package/dist/agent/turn-history.js.map +1 -1
  16. package/dist/agent/turn-runner.d.ts +8 -0
  17. package/dist/agent/turn-runner.d.ts.map +1 -1
  18. package/dist/agent/turn-runner.js +35 -10
  19. package/dist/agent/turn-runner.js.map +1 -1
  20. package/dist/app/app-host.d.ts +57 -0
  21. package/dist/app/app-host.d.ts.map +1 -0
  22. package/dist/app/app-host.js +252 -0
  23. package/dist/app/app-host.js.map +1 -0
  24. package/dist/app/app-host.test.d.ts +2 -0
  25. package/dist/app/app-host.test.d.ts.map +1 -0
  26. package/dist/app/app-host.test.js +639 -0
  27. package/dist/app/app-host.test.js.map +1 -0
  28. package/dist/app/config.d.ts +196 -0
  29. package/dist/app/config.d.ts.map +1 -0
  30. package/dist/app/config.js +362 -0
  31. package/dist/app/config.js.map +1 -0
  32. package/dist/app/config.test.d.ts +2 -0
  33. package/dist/app/config.test.d.ts.map +1 -0
  34. package/dist/app/config.test.js +224 -0
  35. package/dist/app/config.test.js.map +1 -0
  36. package/dist/app/detect.d.ts +68 -0
  37. package/dist/app/detect.d.ts.map +1 -0
  38. package/dist/app/detect.js +449 -0
  39. package/dist/app/detect.js.map +1 -0
  40. package/dist/app/detect.test.d.ts +2 -0
  41. package/dist/app/detect.test.d.ts.map +1 -0
  42. package/dist/app/detect.test.js +267 -0
  43. package/dist/app/detect.test.js.map +1 -0
  44. package/dist/app/env.d.ts +5 -0
  45. package/dist/app/env.d.ts.map +1 -0
  46. package/dist/app/env.js +22 -0
  47. package/dist/app/env.js.map +1 -0
  48. package/dist/app/functions-cli.d.ts +3 -0
  49. package/dist/app/functions-cli.d.ts.map +1 -0
  50. package/dist/app/functions-cli.js +27 -0
  51. package/dist/app/functions-cli.js.map +1 -0
  52. package/dist/app/functions-host.d.ts +15 -0
  53. package/dist/app/functions-host.d.ts.map +1 -0
  54. package/dist/app/functions-host.js +276 -0
  55. package/dist/app/functions-host.js.map +1 -0
  56. package/dist/app/functions-host.test.d.ts +2 -0
  57. package/dist/app/functions-host.test.d.ts.map +1 -0
  58. package/dist/app/functions-host.test.js +117 -0
  59. package/dist/app/functions-host.test.js.map +1 -0
  60. package/dist/app/functions-routes.d.ts +23 -0
  61. package/dist/app/functions-routes.d.ts.map +1 -0
  62. package/dist/app/functions-routes.js +85 -0
  63. package/dist/app/functions-routes.js.map +1 -0
  64. package/dist/app/functions-routes.test.d.ts +2 -0
  65. package/dist/app/functions-routes.test.d.ts.map +1 -0
  66. package/dist/app/functions-routes.test.js +40 -0
  67. package/dist/app/functions-routes.test.js.map +1 -0
  68. package/dist/app/manifest.d.ts +17 -0
  69. package/dist/app/manifest.d.ts.map +1 -0
  70. package/dist/app/manifest.js +64 -0
  71. package/dist/app/manifest.js.map +1 -0
  72. package/dist/app/manifest.test.d.ts +2 -0
  73. package/dist/app/manifest.test.d.ts.map +1 -0
  74. package/dist/app/manifest.test.js +173 -0
  75. package/dist/app/manifest.test.js.map +1 -0
  76. package/dist/app/release-artifacts.d.ts +39 -0
  77. package/dist/app/release-artifacts.d.ts.map +1 -0
  78. package/dist/app/release-artifacts.js +229 -0
  79. package/dist/app/release-artifacts.js.map +1 -0
  80. package/dist/app/release-artifacts.test.d.ts +2 -0
  81. package/dist/app/release-artifacts.test.d.ts.map +1 -0
  82. package/dist/app/release-artifacts.test.js +295 -0
  83. package/dist/app/release-artifacts.test.js.map +1 -0
  84. package/dist/app/route-pattern.d.ts +23 -0
  85. package/dist/app/route-pattern.d.ts.map +1 -0
  86. package/dist/app/route-pattern.js +339 -0
  87. package/dist/app/route-pattern.js.map +1 -0
  88. package/dist/app/route-pattern.test.d.ts +2 -0
  89. package/dist/app/route-pattern.test.d.ts.map +1 -0
  90. package/dist/app/route-pattern.test.js +187 -0
  91. package/dist/app/route-pattern.test.js.map +1 -0
  92. package/dist/app/rules.d.ts +61 -0
  93. package/dist/app/rules.d.ts.map +1 -0
  94. package/dist/app/rules.js +90 -0
  95. package/dist/app/rules.js.map +1 -0
  96. package/dist/app/rules.test.d.ts +2 -0
  97. package/dist/app/rules.test.d.ts.map +1 -0
  98. package/dist/app/rules.test.js +69 -0
  99. package/dist/app/rules.test.js.map +1 -0
  100. package/dist/app/runner.d.ts +109 -0
  101. package/dist/app/runner.d.ts.map +1 -0
  102. package/dist/app/runner.js +429 -0
  103. package/dist/app/runner.js.map +1 -0
  104. package/dist/app/site.d.ts +73 -0
  105. package/dist/app/site.d.ts.map +1 -0
  106. package/dist/app/site.js +161 -0
  107. package/dist/app/site.js.map +1 -0
  108. package/dist/app/site.test.d.ts +2 -0
  109. package/dist/app/site.test.d.ts.map +1 -0
  110. package/dist/app/site.test.js +291 -0
  111. package/dist/app/site.test.js.map +1 -0
  112. package/dist/app/static-server.d.ts +20 -0
  113. package/dist/app/static-server.d.ts.map +1 -0
  114. package/dist/app/static-server.js +145 -0
  115. package/dist/app/static-server.js.map +1 -0
  116. package/dist/persistence/conversation-store.d.ts +21 -0
  117. package/dist/persistence/conversation-store.d.ts.map +1 -0
  118. package/dist/persistence/conversation-store.js +59 -0
  119. package/dist/persistence/conversation-store.js.map +1 -0
  120. package/dist/persistence/conversation-store.test.d.ts +2 -0
  121. package/dist/persistence/conversation-store.test.d.ts.map +1 -0
  122. package/dist/persistence/conversation-store.test.js +98 -0
  123. package/dist/persistence/conversation-store.test.js.map +1 -0
  124. package/dist/persistence/git-sync.d.ts +14 -1
  125. package/dist/persistence/git-sync.d.ts.map +1 -1
  126. package/dist/persistence/git-sync.js +73 -17
  127. package/dist/persistence/git-sync.js.map +1 -1
  128. package/dist/persistence/git-sync.test.js +155 -6
  129. package/dist/persistence/git-sync.test.js.map +1 -1
  130. package/dist/persistence/snapshot-sync.d.ts +19 -2
  131. package/dist/persistence/snapshot-sync.d.ts.map +1 -1
  132. package/dist/persistence/snapshot-sync.js +194 -83
  133. package/dist/persistence/snapshot-sync.js.map +1 -1
  134. package/dist/persistence/snapshot-sync.test.js +145 -27
  135. package/dist/persistence/snapshot-sync.test.js.map +1 -1
  136. package/dist/persistence/workspace.d.ts +3 -0
  137. package/dist/persistence/workspace.d.ts.map +1 -1
  138. package/dist/persistence/workspace.js +1 -0
  139. package/dist/persistence/workspace.js.map +1 -1
  140. package/dist/research/extract-texts.d.ts.map +1 -1
  141. package/dist/research/extract-texts.js +6 -13
  142. package/dist/research/extract-texts.js.map +1 -1
  143. package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
  144. package/dist/research/filingramp/attachment-tools.js +7 -4
  145. package/dist/research/filingramp/attachment-tools.js.map +1 -1
  146. package/dist/research/filingramp/shared.d.ts.map +1 -1
  147. package/dist/research/filingramp/shared.js +5 -5
  148. package/dist/research/filingramp/shared.js.map +1 -1
  149. package/dist/runtime/app-mode.d.ts +10 -0
  150. package/dist/runtime/app-mode.d.ts.map +1 -0
  151. package/dist/runtime/app-mode.js +172 -0
  152. package/dist/runtime/app-mode.js.map +1 -0
  153. package/dist/runtime/app-mode.test.d.ts +2 -0
  154. package/dist/runtime/app-mode.test.d.ts.map +1 -0
  155. package/dist/runtime/app-mode.test.js +130 -0
  156. package/dist/runtime/app-mode.test.js.map +1 -0
  157. package/dist/runtime/app-rehearsal.d.ts +2 -0
  158. package/dist/runtime/app-rehearsal.d.ts.map +1 -0
  159. package/dist/runtime/app-rehearsal.js +56 -0
  160. package/dist/runtime/app-rehearsal.js.map +1 -0
  161. package/dist/runtime/build-mode.d.ts +12 -0
  162. package/dist/runtime/build-mode.d.ts.map +1 -0
  163. package/dist/runtime/build-mode.js +116 -0
  164. package/dist/runtime/build-mode.js.map +1 -0
  165. package/dist/runtime/build-mode.test.d.ts +2 -0
  166. package/dist/runtime/build-mode.test.d.ts.map +1 -0
  167. package/dist/runtime/build-mode.test.js +121 -0
  168. package/dist/runtime/build-mode.test.js.map +1 -0
  169. package/dist/runtime/cli.js +7 -2
  170. package/dist/runtime/cli.js.map +1 -1
  171. package/dist/runtime/config.d.ts +4 -0
  172. package/dist/runtime/config.d.ts.map +1 -1
  173. package/dist/runtime/config.js +13 -2
  174. package/dist/runtime/config.js.map +1 -1
  175. package/dist/runtime/guest-server.d.ts +3 -0
  176. package/dist/runtime/guest-server.d.ts.map +1 -0
  177. package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
  178. package/dist/runtime/guest-server.js.map +1 -0
  179. package/dist/runtime/image-hooks.d.ts +5 -0
  180. package/dist/runtime/image-hooks.d.ts.map +1 -0
  181. package/dist/runtime/image-hooks.js +68 -0
  182. package/dist/runtime/image-hooks.js.map +1 -0
  183. package/dist/runtime/image-hooks.test.d.ts +2 -0
  184. package/dist/runtime/image-hooks.test.d.ts.map +1 -0
  185. package/dist/runtime/image-hooks.test.js +74 -0
  186. package/dist/runtime/image-hooks.test.js.map +1 -0
  187. package/dist/runtime/index.d.ts +8 -3
  188. package/dist/runtime/index.d.ts.map +1 -1
  189. package/dist/runtime/index.js +53 -35
  190. package/dist/runtime/index.js.map +1 -1
  191. package/dist/runtime/listening-ports.d.ts +13 -0
  192. package/dist/runtime/listening-ports.d.ts.map +1 -0
  193. package/dist/runtime/listening-ports.js +78 -0
  194. package/dist/runtime/listening-ports.js.map +1 -0
  195. package/dist/runtime/listening-ports.test.d.ts +2 -0
  196. package/dist/runtime/listening-ports.test.d.ts.map +1 -0
  197. package/dist/runtime/listening-ports.test.js +39 -0
  198. package/dist/runtime/listening-ports.test.js.map +1 -0
  199. package/dist/runtime/preview-proxy.d.ts +56 -0
  200. package/dist/runtime/preview-proxy.d.ts.map +1 -0
  201. package/dist/runtime/preview-proxy.js +302 -0
  202. package/dist/runtime/preview-proxy.js.map +1 -0
  203. package/dist/runtime/preview-proxy.test.d.ts +2 -0
  204. package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
  205. package/dist/runtime/preview-proxy.test.js +122 -0
  206. package/dist/runtime/preview-proxy.test.js.map +1 -0
  207. package/dist/runtime/session-mode.d.ts +3 -0
  208. package/dist/runtime/session-mode.d.ts.map +1 -0
  209. package/dist/runtime/session-mode.js +60 -0
  210. package/dist/runtime/session-mode.js.map +1 -0
  211. package/dist/runtime/workload.d.ts +44 -0
  212. package/dist/runtime/workload.d.ts.map +1 -0
  213. package/dist/runtime/workload.js +222 -0
  214. package/dist/runtime/workload.js.map +1 -0
  215. package/dist/runtime/workload.test.d.ts +2 -0
  216. package/dist/runtime/workload.test.d.ts.map +1 -0
  217. package/dist/runtime/workload.test.js +235 -0
  218. package/dist/runtime/workload.test.js.map +1 -0
  219. package/dist/session/conversation.d.ts +3 -2
  220. package/dist/session/conversation.d.ts.map +1 -1
  221. package/dist/session/conversation.js +11 -7
  222. package/dist/session/conversation.js.map +1 -1
  223. package/dist/session/conversation.test.js +2 -3
  224. package/dist/session/conversation.test.js.map +1 -1
  225. package/dist/session/runtime.d.ts +16 -3
  226. package/dist/session/runtime.d.ts.map +1 -1
  227. package/dist/session/runtime.js +80 -13
  228. package/dist/session/runtime.js.map +1 -1
  229. package/dist/session/runtime.test.js +18 -7
  230. package/dist/session/runtime.test.js.map +1 -1
  231. package/dist/session/tools.d.ts.map +1 -1
  232. package/dist/session/tools.js +3 -3
  233. package/dist/session/tools.js.map +1 -1
  234. package/dist/task/loop.d.ts.map +1 -1
  235. package/dist/task/loop.js +6 -4
  236. package/dist/task/loop.js.map +1 -1
  237. package/dist/tools/exec-tools.d.ts +12 -0
  238. package/dist/tools/exec-tools.d.ts.map +1 -1
  239. package/dist/tools/exec-tools.js +46 -3
  240. package/dist/tools/exec-tools.js.map +1 -1
  241. package/dist/tools/exec-tools.test.d.ts +2 -0
  242. package/dist/tools/exec-tools.test.d.ts.map +1 -0
  243. package/dist/tools/exec-tools.test.js +48 -0
  244. package/dist/tools/exec-tools.test.js.map +1 -0
  245. package/dist/tools/fs-tools.d.ts.map +1 -1
  246. package/dist/tools/fs-tools.js +5 -5
  247. package/dist/tools/fs-tools.js.map +1 -1
  248. package/dist/transport/link.d.ts.map +1 -1
  249. package/dist/transport/link.js +16 -5
  250. package/dist/transport/link.js.map +1 -1
  251. package/dist/transport/link.test.js +24 -0
  252. package/dist/transport/link.test.js.map +1 -1
  253. package/dist/transport/protocol.d.ts +190 -3
  254. package/dist/transport/protocol.d.ts.map +1 -1
  255. package/dist/transport/protocol.js +147 -7
  256. package/dist/transport/protocol.js.map +1 -1
  257. package/dist/transport/protocol.test.js +41 -0
  258. package/dist/transport/protocol.test.js.map +1 -1
  259. package/dist/workspace-sync/eligibility.d.ts +14 -0
  260. package/dist/workspace-sync/eligibility.d.ts.map +1 -0
  261. package/dist/workspace-sync/eligibility.js +53 -0
  262. package/dist/workspace-sync/eligibility.js.map +1 -0
  263. package/dist/workspace-sync/merge.d.ts +15 -0
  264. package/dist/workspace-sync/merge.d.ts.map +1 -0
  265. package/dist/workspace-sync/merge.js +66 -0
  266. package/dist/workspace-sync/merge.js.map +1 -0
  267. package/dist/workspace-sync/merge.test.d.ts +2 -0
  268. package/dist/workspace-sync/merge.test.d.ts.map +1 -0
  269. package/dist/workspace-sync/merge.test.js +28 -0
  270. package/dist/workspace-sync/merge.test.js.map +1 -0
  271. package/dist/workspace-sync/workspace-sync.d.ts +48 -0
  272. package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
  273. package/dist/workspace-sync/workspace-sync.js +308 -0
  274. package/dist/workspace-sync/workspace-sync.js.map +1 -0
  275. package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
  276. package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
  277. package/dist/workspace-sync/workspace-sync.test.js +111 -0
  278. package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
  279. package/dist/workspace-sync/write-drafts.d.ts +24 -0
  280. package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
  281. package/dist/workspace-sync/write-drafts.js +87 -0
  282. package/dist/workspace-sync/write-drafts.js.map +1 -0
  283. package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
  284. package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
  285. package/dist/workspace-sync/write-drafts.test.js +36 -0
  286. package/dist/workspace-sync/write-drafts.test.js.map +1 -0
  287. package/package.json +12 -2
  288. package/dist/runtime/lambda-microvm.d.ts +0 -3
  289. package/dist/runtime/lambda-microvm.d.ts.map +0 -1
  290. package/dist/runtime/lambda-microvm.js.map +0 -1
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.compileRoute = compileRoute;
7
+ exports.routeSourceProblem = routeSourceProblem;
8
+ exports.isValidRouteSource = isValidRouteSource;
9
+ exports.runsOnTimeLimit = runsOnTimeLimit;
10
+ exports.forgetRouteStrikes = forgetRouteStrikes;
11
+ exports.matchRoute = matchRoute;
12
+ exports.fillDestination = fillDestination;
13
+ // builder.json's `source` patterns, read the way Vercel reads vercel.json's: path-to-regexp 6.x
14
+ // syntax (`/api/(.*)`, `/blog/:slug`, `/((?!assets/).*)`) with its defaults — case-insensitive,
15
+ // an optional trailing slash, anchored at both ends. Only the subset of that syntax builder.json
16
+ // needs; `{…}` groups are rejected.
17
+ //
18
+ // These patterns are written by whoever owns the app and run inside the shared gateway on paths
19
+ // anyone can send, and a regex can't be stopped by an event loop. So: shapes that blow up are refused
20
+ // when the file is read, patterns that provably can't blow up run as they are, and everything
21
+ // else runs under a time limit. RE2 or V8's linear engine would be simpler, but neither has
22
+ // lookaheads, which `/((?!assets/).*)` needs.
23
+ const node_vm_1 = __importDefault(require("node:vm"));
24
+ const DEFAULT_PATTERN = '[^\\/#\\?]+?';
25
+ const PREFIXES = './';
26
+ const MODIFIERS = '?*+';
27
+ /** Far past what a real pattern needs on a real path, and short enough not to be felt. */
28
+ const MATCH_TIME_LIMIT_MS = 10;
29
+ /** What a pattern on a time limit is tried against. Length is what a slow pattern feeds on. */
30
+ const MAX_LIMITED_PATH_LENGTH = 2048;
31
+ /** A pattern that runs out of time this often in a window stops matching until the window ends. */
32
+ const MAX_STRIKES = 3;
33
+ const STRIKE_WINDOW_MS = 10 * 60000;
34
+ const MAX_TRACKED_STRIKES = 1000;
35
+ /** One thing a pattern's text does in a fixed number of steps: a character, or a look at literal text ahead. */
36
+ const FIXED_STEP = String.raw `[\w/~%-]|\\.|\(\?[=!](?:[\w./~%|-]|\\.)*\)`;
37
+ /** One character or class repeated. */
38
+ const SINGLE_REPEAT = String.raw `(?:\.|\\.|\[(?:[^\]\\]|\\.)*\])[*+]`;
39
+ /** A custom pattern of fixed steps with at most one repeat among them. Group 1 is that repeat. */
40
+ const LINEAR_PATTERN = new RegExp(`^(?:${FIXED_STEP})*(?:(${SINGLE_REPEAT})(?:${FIXED_STEP})*)?$`);
41
+ function escape(text) {
42
+ return text.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1');
43
+ }
44
+ /** The `(…)` group starting at `start`, and the index after it. */
45
+ function readGroup(source, start) {
46
+ var _a;
47
+ if (source[start + 1] === '?')
48
+ throw new Error(`pattern cannot start with "?" at ${start + 1}`);
49
+ let depth = 1;
50
+ let pattern = '';
51
+ let i = start + 1;
52
+ while (i < source.length) {
53
+ const char = source[i];
54
+ if (char === '\\') {
55
+ pattern += char + ((_a = source[i + 1]) !== null && _a !== void 0 ? _a : '');
56
+ i += 2;
57
+ continue;
58
+ }
59
+ if (char === ')') {
60
+ depth--;
61
+ if (depth === 0)
62
+ break;
63
+ }
64
+ else if (char === '(') {
65
+ depth++;
66
+ if (source[i + 1] !== '?')
67
+ throw new Error(`capturing groups are not allowed at ${i}`);
68
+ }
69
+ pattern += char;
70
+ i++;
71
+ }
72
+ if (depth !== 0)
73
+ throw new Error(`unbalanced pattern at ${start}`);
74
+ if (!pattern)
75
+ throw new Error(`missing pattern at ${start}`);
76
+ return { pattern, end: i + 1 };
77
+ }
78
+ function parse(source) {
79
+ var _a, _b;
80
+ const tokens = [];
81
+ let path = '';
82
+ let unnamed = 0;
83
+ let i = 0;
84
+ const pushParam = (name, pattern) => {
85
+ let prefix = '';
86
+ const last = path[path.length - 1];
87
+ if (last !== undefined && PREFIXES.includes(last)) {
88
+ prefix = last;
89
+ path = path.slice(0, -1);
90
+ }
91
+ if (path)
92
+ tokens.push(path);
93
+ path = '';
94
+ let modifier = '';
95
+ if (i < source.length && MODIFIERS.includes(source[i]))
96
+ modifier = source[i++];
97
+ tokens.push({ name, prefix, pattern, modifier });
98
+ };
99
+ while (i < source.length) {
100
+ const char = source[i];
101
+ if (char === '\\') {
102
+ path += (_a = source[i + 1]) !== null && _a !== void 0 ? _a : '';
103
+ i += 2;
104
+ }
105
+ else if (char === ':') {
106
+ const name = (_b = /^[A-Za-z0-9_]+/.exec(source.slice(i + 1))) === null || _b === void 0 ? void 0 : _b[0];
107
+ if (!name)
108
+ throw new Error(`missing parameter name at ${i}`);
109
+ i += 1 + name.length;
110
+ let pattern = DEFAULT_PATTERN;
111
+ if (source[i] === '(') {
112
+ const group = readGroup(source, i);
113
+ pattern = group.pattern;
114
+ i = group.end;
115
+ }
116
+ pushParam(name, pattern);
117
+ }
118
+ else if (char === '(') {
119
+ const group = readGroup(source, i);
120
+ i = group.end;
121
+ pushParam(unnamed++, group.pattern);
122
+ }
123
+ else if (char === '{' || char === '}' || MODIFIERS.includes(char)) {
124
+ throw new Error(`unexpected "${char}" at ${i}`);
125
+ }
126
+ else {
127
+ path += char;
128
+ i++;
129
+ }
130
+ }
131
+ if (path)
132
+ tokens.push(path);
133
+ return tokens;
134
+ }
135
+ /** Why a custom pattern can take exponential time, or capture what the keys don't count; undefined if neither. */
136
+ function patternProblem(pattern, repeated) {
137
+ var _a;
138
+ // One entry per open group: whether it holds something that can match more than one way.
139
+ const groups = [{ varies: false }];
140
+ /** Whether what was just read, which a quantifier would apply to, is a group that varies. */
141
+ let lastVaries = false;
142
+ let i = 0;
143
+ while (i < pattern.length) {
144
+ const char = pattern[i];
145
+ if (char === '\\') {
146
+ if (/[1-9k]/.test((_a = pattern[i + 1]) !== null && _a !== void 0 ? _a : ''))
147
+ return 'it refers back to a group, which can take exponential time';
148
+ i += 2;
149
+ lastVaries = false;
150
+ }
151
+ else if (char === '[') {
152
+ i++;
153
+ while (i < pattern.length && pattern[i] !== ']')
154
+ i += pattern[i] === '\\' ? 2 : 1;
155
+ i++;
156
+ lastVaries = false;
157
+ }
158
+ else if (char === '(') {
159
+ if (/^\(\?<(?![=!])/.test(pattern.slice(i, i + 4)))
160
+ return 'it has a named group; use :name';
161
+ groups.push({ varies: false });
162
+ i++;
163
+ if (pattern[i] === '?')
164
+ i += pattern[i + 2] === '=' || pattern[i + 2] === '!' ? 3 : 2;
165
+ lastVaries = false;
166
+ }
167
+ else if (char === ')') {
168
+ lastVaries = groups.pop().varies;
169
+ if (lastVaries)
170
+ groups[groups.length - 1].varies = true;
171
+ i++;
172
+ }
173
+ else if (char === '|') {
174
+ groups[groups.length - 1].varies = true;
175
+ i++;
176
+ lastVaries = false;
177
+ }
178
+ else if (char === '*' || char === '+' || char === '?' || char === '{') {
179
+ const close = char === '{' ? pattern.indexOf('}', i) : i;
180
+ if (close === -1) {
181
+ i++;
182
+ continue;
183
+ }
184
+ const repeats = char !== '?';
185
+ if (repeats && lastVaries)
186
+ return 'it repeats a group that can itself match in more than one way, which can take exponential time';
187
+ groups[groups.length - 1].varies = true;
188
+ i = close + 1;
189
+ if (pattern[i] === '?')
190
+ i++;
191
+ lastVaries = false;
192
+ }
193
+ else {
194
+ i++;
195
+ lastVaries = false;
196
+ }
197
+ }
198
+ if (repeated && groups[0].varies)
199
+ return 'a :name+ or :name* repeats a pattern that can itself match in more than one way, which can take exponential time';
200
+ return undefined;
201
+ }
202
+ /** Whether every step of matching is settled by the next character, bar at most one choice. */
203
+ function isLinear(tokens) {
204
+ let choices = 0;
205
+ for (const [index, token] of tokens.entries()) {
206
+ if (typeof token === 'string')
207
+ continue;
208
+ if (token.pattern === DEFAULT_PATTERN) {
209
+ // It stops at the next `/`, so the only way on is the one that starts with one.
210
+ const next = tokens[index + 1];
211
+ const bounded = token.prefix === '/' && (next === undefined || (typeof next === 'string' ? next.startsWith('/') : next.prefix === '/'));
212
+ if (!bounded)
213
+ return false;
214
+ if (token.modifier)
215
+ choices++;
216
+ }
217
+ else {
218
+ const shape = LINEAR_PATTERN.exec(token.pattern);
219
+ if (!shape || token.modifier)
220
+ return false;
221
+ if (shape[1])
222
+ choices++;
223
+ }
224
+ }
225
+ return choices <= 1;
226
+ }
227
+ /** Compiles a `source` pattern; throws an Error saying what is wrong with an invalid or dangerous one. */
228
+ function compileRoute(source) {
229
+ const keys = [];
230
+ const tokens = parse(source);
231
+ let route = '^';
232
+ for (const token of tokens) {
233
+ if (typeof token === 'string') {
234
+ route += escape(token);
235
+ continue;
236
+ }
237
+ keys.push(token.name);
238
+ const prefix = escape(token.prefix);
239
+ if (token.modifier === '+' || token.modifier === '*') {
240
+ const optional = token.modifier === '*' ? '?' : '';
241
+ route += `(?:${prefix}((?:${token.pattern})(?:${prefix}(?:${token.pattern}))*))${optional}`;
242
+ }
243
+ else {
244
+ route += `(?:${prefix}(${token.pattern}))${token.modifier}`;
245
+ }
246
+ }
247
+ route += '[\\/#\\?]?$';
248
+ const regexp = new RegExp(route, 'i');
249
+ for (const token of tokens) {
250
+ if (typeof token === 'string' || token.pattern === DEFAULT_PATTERN)
251
+ continue;
252
+ const problem = patternProblem(token.pattern, token.modifier === '+' || token.modifier === '*');
253
+ if (problem)
254
+ throw new Error(problem);
255
+ }
256
+ return { source, regexp, keys, linear: isLinear(tokens) };
257
+ }
258
+ /** What is wrong with `source`, in a sentence; undefined when it's fine. */
259
+ function routeSourceProblem(source) {
260
+ try {
261
+ compileRoute(source);
262
+ return undefined;
263
+ }
264
+ catch (error) {
265
+ return error.message;
266
+ }
267
+ }
268
+ /** Whether `source` compiles. */
269
+ function isValidRouteSource(source) {
270
+ return routeSourceProblem(source) === undefined;
271
+ }
272
+ /** Whether `source` will run under the time limit. */
273
+ function runsOnTimeLimit(source) {
274
+ return !compileRoute(source).linear;
275
+ }
276
+ const limited = node_vm_1.default.createContext(Object.create(null));
277
+ const limitedExec = new node_vm_1.default.Script('regexp.exec(pathname)');
278
+ /** By source, since a site can be compiled again. Only a window's end clears them: a request that matches proves nothing about the next path. */
279
+ const strikes = new Map();
280
+ function isStruckOut(source, now) {
281
+ const entry = strikes.get(source);
282
+ if (!entry)
283
+ return false;
284
+ if (now - entry.since < STRIKE_WINDOW_MS)
285
+ return entry.count >= MAX_STRIKES;
286
+ strikes.delete(source);
287
+ return false;
288
+ }
289
+ function strike(source, now) {
290
+ var _a;
291
+ const entry = strikes.get(source);
292
+ if (entry) {
293
+ entry.count++;
294
+ }
295
+ else {
296
+ if (strikes.size >= MAX_TRACKED_STRIKES)
297
+ strikes.delete(strikes.keys().next().value);
298
+ strikes.set(source, { count: 1, since: now });
299
+ }
300
+ console.warn(`builder.json path pattern ${JSON.stringify(source)} ran out of time (${(_a = entry === null || entry === void 0 ? void 0 : entry.count) !== null && _a !== void 0 ? _a : 1} of ${MAX_STRIKES})`);
301
+ }
302
+ /** Tests only. */
303
+ function forgetRouteStrikes() {
304
+ strikes.clear();
305
+ }
306
+ /** The match, or null when there is none or it took too long: a slow pattern only costs its own site that rule. */
307
+ function execLimited(pattern, pathname) {
308
+ if (pathname.length > MAX_LIMITED_PATH_LENGTH)
309
+ return null;
310
+ const now = Date.now();
311
+ if (isStruckOut(pattern.source, now))
312
+ return null;
313
+ limited.regexp = pattern.regexp;
314
+ limited.pathname = pathname;
315
+ try {
316
+ return limitedExec.runInContext(limited, { timeout: MATCH_TIME_LIMIT_MS });
317
+ }
318
+ catch (_a) {
319
+ strike(pattern.source, now);
320
+ return null;
321
+ }
322
+ }
323
+ /** The pattern's values for `pathname` (by key), or undefined when it doesn't match. */
324
+ function matchRoute(pattern, pathname) {
325
+ const match = pattern.linear ? pattern.regexp.exec(pathname) : execLimited(pattern, pathname);
326
+ if (!match)
327
+ return undefined;
328
+ const values = new Map();
329
+ pattern.keys.forEach((key, index) => { var _a; return values.set(key, (_a = match[index + 1]) !== null && _a !== void 0 ? _a : ''); });
330
+ return values;
331
+ }
332
+ /** A rewrite destination with `:name` and `$1`-style references to a match filled in. */
333
+ function fillDestination(destination, values) {
334
+ const positional = [...values.values()];
335
+ return destination
336
+ .replace(/\$(\d+)/g, (_, index) => { var _a; return (_a = positional[Number(index) - 1]) !== null && _a !== void 0 ? _a : ''; })
337
+ .replace(/:([A-Za-z0-9_]+)/g, (whole, name) => (values.has(name) ? values.get(name) : whole));
338
+ }
339
+ //# sourceMappingURL=route-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-pattern.js","sourceRoot":"","sources":["../../src/app/route-pattern.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=route-pattern.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-pattern.test.d.ts","sourceRoot":"","sources":["../../src/app/route-pattern.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const route_pattern_1 = require("./route-pattern");
9
+ function matches(source, pathname) {
10
+ return (0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)(source), pathname) !== undefined;
11
+ }
12
+ (0, node_test_1.describe)('route patterns (path-to-regexp 6 syntax, as vercel.json)', () => {
13
+ (0, node_test_1.it)('reads the rewrites of a vercel.json', () => {
14
+ strict_1.default.ok(matches('/api/(.*)', '/api/users/1'));
15
+ strict_1.default.ok(matches('/api/(.*)', '/api/'));
16
+ strict_1.default.ok(!matches('/api/(.*)', '/apis/x'));
17
+ strict_1.default.ok(matches('/(.*)', '/'));
18
+ strict_1.default.ok(matches('/(.*)', '/anything/at/all'));
19
+ });
20
+ (0, node_test_1.it)('keeps a negative lookahead group', () => {
21
+ strict_1.default.ok(matches('/((?!assets/).*)', '/dashboard/settings'));
22
+ strict_1.default.ok(matches('/((?!assets/).*)', '/'));
23
+ strict_1.default.ok(!matches('/((?!assets/).*)', '/assets/index-abc.js'));
24
+ });
25
+ (0, node_test_1.it)('matches named parameters with their modifiers', () => {
26
+ strict_1.default.deepEqual([...(0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)('/blog/:slug'), '/blog/hello')], [['slug', 'hello']]);
27
+ strict_1.default.ok(!matches('/blog/:slug', '/blog/a/b'));
28
+ strict_1.default.ok(matches('/docs/:path*', '/docs'));
29
+ strict_1.default.ok(matches('/docs/:path*', '/docs/a/b'));
30
+ strict_1.default.ok(!matches('/docs/:path+', '/docs'));
31
+ strict_1.default.ok(matches('/user/:id?', '/user'));
32
+ });
33
+ (0, node_test_1.it)('ignores case and a trailing slash, as path-to-regexp does by default', () => {
34
+ strict_1.default.ok(matches('/About', '/about/'));
35
+ });
36
+ (0, node_test_1.it)('fills a destination from the match', () => {
37
+ const values = (0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)('/old/:name/(.*)'), '/old/docs/a/b');
38
+ strict_1.default.equal((0, route_pattern_1.fillDestination)('/new/:name/$2', values), '/new/docs/a/b');
39
+ });
40
+ (0, node_test_1.it)('rejects what it cannot read', () => {
41
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/(foo'), false);
42
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/((foo))'), false);
43
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/{a}'), false);
44
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/:'), false);
45
+ });
46
+ });
47
+ (0, node_test_1.describe)('a pattern someone else wrote, on a path anyone can send', () => {
48
+ /** How long a match takes, and what it answered. */
49
+ function timed(source, pathname) {
50
+ const pattern = (0, route_pattern_1.compileRoute)(source);
51
+ const start = performance.now();
52
+ const matched = (0, route_pattern_1.matchRoute)(pattern, pathname) !== undefined;
53
+ return { ms: performance.now() - start, matched };
54
+ }
55
+ (0, node_test_1.it)('refuses the shapes that take exponential time, and says why', () => {
56
+ var _a, _b, _c, _d;
57
+ for (const source of [
58
+ '/((?:a+)+)',
59
+ '/((?:a*)*)',
60
+ '/((?:a|a)*)',
61
+ '/((?:a|b)+)',
62
+ '/((?:a+){2,})',
63
+ '/((?!(?:a+)+b).*)',
64
+ '/((?:(?:a+))+)',
65
+ '/:x((?:a|b))+',
66
+ '/:x(a+)*',
67
+ '/:x(.*)+',
68
+ ]) {
69
+ strict_1.default.match((_a = (0, route_pattern_1.routeSourceProblem)(source)) !== null && _a !== void 0 ? _a : 'allowed', /exponential/, source);
70
+ }
71
+ strict_1.default.match((_b = (0, route_pattern_1.routeSourceProblem)(String.raw `/(.*\1)`)) !== null && _b !== void 0 ? _b : '', /refers back/);
72
+ strict_1.default.match((_c = (0, route_pattern_1.routeSourceProblem)('/((?<name>a))')) !== null && _c !== void 0 ? _c : '', /named group/);
73
+ strict_1.default.match((_d = (0, route_pattern_1.routeSourceProblem)('/(+)')) !== null && _d !== void 0 ? _d : '', /Invalid regular expression/);
74
+ });
75
+ (0, node_test_1.it)('keeps what real apps write', () => {
76
+ for (const source of [
77
+ '/(.*)',
78
+ '/api/(.*)',
79
+ '/blog/:slug',
80
+ '/docs/:path*',
81
+ '/:lang(en|fr)/about',
82
+ '/:id(\\\\d+)',
83
+ '/((?!assets/).*)',
84
+ '/((?!api|_next/static|favicon.ico).*)',
85
+ '/(admin(?!/))',
86
+ '/assets/(.*\\.(?:js|css))',
87
+ '/((?:foo|bar)?)',
88
+ '/(a+b+)',
89
+ ]) {
90
+ strict_1.default.equal((0, route_pattern_1.routeSourceProblem)(source), undefined, source);
91
+ }
92
+ });
93
+ (0, node_test_1.it)('runs the common shapes with no time limit, and only those', () => {
94
+ for (const source of [
95
+ '/',
96
+ '/about',
97
+ '/(.*)',
98
+ '/api/(.*)',
99
+ '/api/:version/(.*)',
100
+ '/blog/:slug',
101
+ '/a/:b/c/:d',
102
+ '/user/:id?',
103
+ '/docs/:path*',
104
+ '/docs/:path+',
105
+ '/:id(\\d+)',
106
+ '/:name([a-z-]+)',
107
+ '/((?!assets/).*)',
108
+ '/((?!api|_next/static|favicon\\.ico).*)',
109
+ '/(admin(?!/))',
110
+ ]) {
111
+ strict_1.default.equal((0, route_pattern_1.compileRoute)(source).linear, true, source);
112
+ }
113
+ for (const source of [
114
+ '/:a?/:b?',
115
+ '/:a*/x/:b*',
116
+ '/(.*)/(.*)',
117
+ '/:a:b(.*)',
118
+ '/:a.:b',
119
+ '/:a-:b',
120
+ '/(.*)-(.*)',
121
+ '/:lang(en|fr)',
122
+ '/(a+b+)',
123
+ '/:name(.*)?',
124
+ ]) {
125
+ strict_1.default.equal((0, route_pattern_1.compileRoute)(source).linear, false, source);
126
+ }
127
+ });
128
+ (0, node_test_1.it)('takes linear time on what it runs with no limit, on the worst paths for each', () => {
129
+ const size = 200000;
130
+ for (const [source, pathname] of [
131
+ ['/(.*)x', '/' + 'a'.repeat(size)],
132
+ ['/((?!assets/).*)x', '/' + 'a'.repeat(size)],
133
+ ['/a/:b/(.*)x/c', '/a/b/' + 'x/'.repeat(size / 2)],
134
+ ['/(.*)/:a/:b/:c', '/' + 'a'.repeat(size)],
135
+ ['/:path*/x', '/' + 'a/'.repeat(size / 2)],
136
+ ['/:a/:b/:c/:d', '/' + 'a/'.repeat(size / 2)],
137
+ ['/:name([a-z]+)x', '/' + 'a'.repeat(size)],
138
+ ]) {
139
+ const pattern = (0, route_pattern_1.compileRoute)(source);
140
+ strict_1.default.equal(pattern.linear, true, source);
141
+ const { ms } = timed(source, pathname);
142
+ // Quadratic on this size would take minutes.
143
+ strict_1.default.ok(ms < 1000, `${source} took ${ms}ms`);
144
+ }
145
+ });
146
+ (0, node_test_1.it)('stops every slow pattern it can\'t rule out, and carries on', () => {
147
+ (0, route_pattern_1.forgetRouteStrikes)();
148
+ for (const [source, pathname] of [
149
+ ['/(.*)(.*)(.*)(.*)(.*)x', '/' + 'a'.repeat(2000)],
150
+ ['/((?=(?:.*)(?:.*)(?:.*)(?:.*)x).*)', '/' + 'a'.repeat(2000)],
151
+ ['/([ab]+[ab]+[ab]+[ab]+[ab]+x)', '/' + 'a'.repeat(2000)],
152
+ ['/(.{1,60000}.{1,60000}.{1,60000}.{1,60000}.{1,60000}x)', '/' + 'a'.repeat(2000)],
153
+ ]) {
154
+ strict_1.default.equal((0, route_pattern_1.compileRoute)(source).linear, false, source);
155
+ const { ms, matched } = timed(source, pathname);
156
+ strict_1.default.equal(matched, false, source);
157
+ strict_1.default.ok(ms < 200, `${source} took ${ms}ms`);
158
+ }
159
+ strict_1.default.ok((0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)('/:lang(en|fr)/x'), '/en/x'));
160
+ });
161
+ (0, node_test_1.it)('stops trying a pattern that keeps running out of time, then gives it another chance', (t) => {
162
+ (0, route_pattern_1.forgetRouteStrikes)();
163
+ const warned = t.mock.method(console, 'warn', () => undefined);
164
+ const now = t.mock.method(Date, 'now', () => 1000);
165
+ const source = '/(.*)(.*)(.*)(.*)(.*)x';
166
+ const slow = '/' + 'a'.repeat(2000);
167
+ for (let attempt = 0; attempt < 3; attempt++)
168
+ timed(source, slow);
169
+ strict_1.default.equal(warned.mock.callCount(), 3);
170
+ const struck = timed(source, slow);
171
+ strict_1.default.equal(warned.mock.callCount(), 3);
172
+ strict_1.default.ok(struck.ms < 5, `took ${struck.ms}ms`);
173
+ // Matching in the meantime clears nothing, or a run of slow paths could alternate with quick ones.
174
+ strict_1.default.equal(timed(source, '/axxxx').matched, false);
175
+ now.mock.mockImplementation(() => 1000 + 11 * 60000);
176
+ strict_1.default.equal(timed(source, '/ax').matched, true);
177
+ (0, route_pattern_1.forgetRouteStrikes)();
178
+ });
179
+ (0, node_test_1.it)('does not try one on a path longer than it would ever need', () => {
180
+ (0, route_pattern_1.forgetRouteStrikes)();
181
+ const source = '/:lang(en|fr)/(.*)';
182
+ strict_1.default.ok(timed(source, '/en/' + 'a'.repeat(2000)).matched);
183
+ strict_1.default.ok(!timed(source, '/en/' + 'a'.repeat(3000)).matched);
184
+ strict_1.default.ok(timed('/api/(.*)', '/api/' + 'a'.repeat(3000)).matched);
185
+ });
186
+ });
187
+ //# sourceMappingURL=route-pattern.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-pattern.test.js","sourceRoot":"","sources":["../../src/app/route-pattern.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type RoutePattern } from './route-pattern';
2
+ interface CompiledRedirect {
3
+ pattern: RoutePattern;
4
+ destination: string;
5
+ status: number;
6
+ }
7
+ interface CompiledRewrite {
8
+ pattern: RoutePattern;
9
+ destination: string;
10
+ }
11
+ interface CompiledHeaderRule {
12
+ pattern: RoutePattern;
13
+ headers: Array<{
14
+ key: string;
15
+ value: string;
16
+ }>;
17
+ }
18
+ export interface RoutingRules {
19
+ redirects: CompiledRedirect[];
20
+ rewrites: CompiledRewrite[];
21
+ headers: CompiledHeaderRule[];
22
+ cleanUrls: boolean;
23
+ trailingSlash?: boolean;
24
+ }
25
+ /** The rule keys of a service in builder.json. */
26
+ export interface RuleSettings {
27
+ redirects?: Array<{
28
+ source: string;
29
+ destination: string;
30
+ permanent?: boolean;
31
+ statusCode?: number;
32
+ }>;
33
+ rewrites?: Array<{
34
+ source: string;
35
+ destination: string;
36
+ }>;
37
+ headers?: Array<{
38
+ source: string;
39
+ headers: Array<{
40
+ key: string;
41
+ value: string;
42
+ }>;
43
+ }>;
44
+ cleanUrls?: boolean;
45
+ trailingSlash?: boolean;
46
+ }
47
+ export declare function compileRules(settings: RuleSettings): RoutingRules;
48
+ /** The redirect that answers `pathname`, if any; `search` (with its `?`) carries over to it. */
49
+ export declare function redirectFor(rules: RoutingRules, pathname: string, search: string): {
50
+ status: number;
51
+ location: string;
52
+ } | undefined;
53
+ /** The URL a rewrite turns `pathname` into, `search` included; undefined when none matches. */
54
+ export declare function rewriteFor(rules: RoutingRules, pathname: string, search?: string): string | undefined;
55
+ /** The headers every matching rule sets on the answer to `pathname`. */
56
+ export declare function headersFor(rules: RoutingRules, pathname: string): Array<{
57
+ key: string;
58
+ value: string;
59
+ }>;
60
+ export {};
61
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/app/rules.ts"],"names":[],"mappings":"AAIA,OAAO,EAA6C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAK9F,UAAU,gBAAgB;IACxB,OAAO,EAAE,YAAY,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,YAAY,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,YAAY,CAAA;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,SAAS,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpG,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzD,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;IACnF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CAYjE;AA8BD,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAUnI;AAED,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,GAAG,SAAS,CAMjG;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAEvG"}