ppef 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +76 -125
  2. package/bin/ppef.mjs +20 -0
  3. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts +8 -0
  4. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/cli/evaluate-command.integration.test.js +308 -0
  6. package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -0
  7. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts +8 -0
  8. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js +405 -0
  10. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js.map +1 -0
  11. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts +8 -0
  12. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts.map +1 -0
  13. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js +424 -0
  14. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js.map +1 -0
  15. package/dist/__tests__/evaluators/registry.unit.test.d.ts +7 -0
  16. package/dist/__tests__/evaluators/registry.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/evaluators/registry.unit.test.js +173 -0
  18. package/dist/__tests__/evaluators/registry.unit.test.js.map +1 -0
  19. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts +8 -0
  20. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts.map +1 -0
  21. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js +260 -0
  22. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js.map +1 -0
  23. package/dist/__tests__/framework-pipeline.integration.test.js +49 -20
  24. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  25. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  26. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/index-exports.unit.test.js +124 -0
  28. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  29. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  30. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  31. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  32. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  33. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  34. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  35. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  36. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  37. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  38. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  39. package/dist/aggregation/aggregators.d.ts +9 -0
  40. package/dist/aggregation/aggregators.d.ts.map +1 -1
  41. package/dist/aggregation/aggregators.js +1 -1
  42. package/dist/aggregation/aggregators.js.map +1 -1
  43. package/dist/aggregation/index.d.ts +1 -1
  44. package/dist/aggregation/index.d.ts.map +1 -1
  45. package/dist/aggregation/index.js +1 -1
  46. package/dist/aggregation/index.js.map +1 -1
  47. package/dist/aggregation/pipeline.d.ts.map +1 -1
  48. package/dist/aggregation/pipeline.js +40 -3
  49. package/dist/aggregation/pipeline.js.map +1 -1
  50. package/dist/claims/index.d.ts +6 -3
  51. package/dist/claims/index.d.ts.map +1 -1
  52. package/dist/claims/index.js +6 -3
  53. package/dist/claims/index.js.map +1 -1
  54. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/aggregate.command.unit.test.js +399 -0
  57. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/binary-sut.integration.test.d.ts +8 -0
  59. package/dist/cli/__tests__/binary-sut.integration.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/binary-sut.integration.test.js +165 -0
  61. package/dist/cli/__tests__/binary-sut.integration.test.js.map +1 -0
  62. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  63. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  65. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  66. package/dist/cli/__tests__/config-loader.unit.test.d.ts +7 -0
  67. package/dist/cli/__tests__/config-loader.unit.test.d.ts.map +1 -0
  68. package/dist/cli/__tests__/config-loader.unit.test.js +611 -0
  69. package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -0
  70. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  71. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  72. package/dist/cli/__tests__/index.unit.test.js +65 -0
  73. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  74. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  75. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  76. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  77. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  78. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  79. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  80. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  81. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  82. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  83. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  84. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  85. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  86. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  87. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  88. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  89. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  90. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  91. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  92. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  93. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  94. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  95. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  96. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  97. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  98. package/dist/cli/command-deps.d.ts +137 -0
  99. package/dist/cli/command-deps.d.ts.map +1 -0
  100. package/dist/cli/command-deps.js +7 -0
  101. package/dist/cli/command-deps.js.map +1 -0
  102. package/dist/cli/commands/aggregate.d.ts +35 -0
  103. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  104. package/dist/cli/commands/aggregate.js +124 -0
  105. package/dist/cli/commands/aggregate.js.map +1 -0
  106. package/dist/cli/commands/evaluate.d.ts +41 -0
  107. package/dist/cli/commands/evaluate.d.ts.map +1 -0
  108. package/dist/cli/commands/evaluate.js +287 -0
  109. package/dist/cli/commands/evaluate.js.map +1 -0
  110. package/dist/cli/commands/plan.d.ts +36 -0
  111. package/dist/cli/commands/plan.d.ts.map +1 -0
  112. package/dist/cli/commands/plan.js +109 -0
  113. package/dist/cli/commands/plan.js.map +1 -0
  114. package/dist/cli/commands/run.d.ts +33 -0
  115. package/dist/cli/commands/run.d.ts.map +1 -0
  116. package/dist/cli/commands/run.js +277 -0
  117. package/dist/cli/commands/run.js.map +1 -0
  118. package/dist/cli/commands/validate.d.ts +27 -0
  119. package/dist/cli/commands/validate.d.ts.map +1 -0
  120. package/dist/cli/commands/validate.js +88 -0
  121. package/dist/cli/commands/validate.js.map +1 -0
  122. package/dist/cli/config-loader.d.ts +30 -0
  123. package/dist/cli/config-loader.d.ts.map +1 -0
  124. package/dist/cli/config-loader.js +181 -0
  125. package/dist/cli/config-loader.js.map +1 -0
  126. package/dist/cli/index.d.ts +27 -0
  127. package/dist/cli/index.d.ts.map +1 -0
  128. package/dist/cli/index.js +60 -0
  129. package/dist/cli/index.js.map +1 -0
  130. package/dist/cli/logger.d.ts +75 -0
  131. package/dist/cli/logger.d.ts.map +1 -0
  132. package/dist/cli/logger.js +131 -0
  133. package/dist/cli/logger.js.map +1 -0
  134. package/dist/cli/module-loader.d.ts +68 -0
  135. package/dist/cli/module-loader.d.ts.map +1 -0
  136. package/dist/cli/module-loader.js +134 -0
  137. package/dist/cli/module-loader.js.map +1 -0
  138. package/dist/cli/output-writer.d.ts +51 -0
  139. package/dist/cli/output-writer.d.ts.map +1 -0
  140. package/dist/cli/output-writer.js +65 -0
  141. package/dist/cli/output-writer.js.map +1 -0
  142. package/dist/cli/types.d.ts +193 -0
  143. package/dist/cli/types.d.ts.map +1 -0
  144. package/dist/cli/types.js +7 -0
  145. package/dist/cli/types.js.map +1 -0
  146. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  147. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  148. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  149. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  150. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  151. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  152. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  153. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  154. package/dist/evaluators/claims-evaluator.d.ts +87 -0
  155. package/dist/evaluators/claims-evaluator.d.ts.map +1 -0
  156. package/dist/evaluators/claims-evaluator.js +289 -0
  157. package/dist/evaluators/claims-evaluator.js.map +1 -0
  158. package/dist/evaluators/exploratory-evaluator.d.ts +136 -0
  159. package/dist/evaluators/exploratory-evaluator.d.ts.map +1 -0
  160. package/dist/evaluators/exploratory-evaluator.js +545 -0
  161. package/dist/evaluators/exploratory-evaluator.js.map +1 -0
  162. package/dist/evaluators/index.d.ts +13 -0
  163. package/dist/evaluators/index.d.ts.map +1 -0
  164. package/dist/evaluators/index.js +14 -0
  165. package/dist/evaluators/index.js.map +1 -0
  166. package/dist/evaluators/metrics-evaluator.d.ts +114 -0
  167. package/dist/evaluators/metrics-evaluator.d.ts.map +1 -0
  168. package/dist/evaluators/metrics-evaluator.js +433 -0
  169. package/dist/evaluators/metrics-evaluator.js.map +1 -0
  170. package/dist/evaluators/registry.d.ts +106 -0
  171. package/dist/evaluators/registry.d.ts.map +1 -0
  172. package/dist/evaluators/registry.js +148 -0
  173. package/dist/evaluators/registry.js.map +1 -0
  174. package/dist/evaluators/robustness-evaluator.d.ts +57 -0
  175. package/dist/evaluators/robustness-evaluator.d.ts.map +1 -0
  176. package/dist/evaluators/robustness-evaluator.js +186 -0
  177. package/dist/evaluators/robustness-evaluator.js.map +1 -0
  178. package/dist/executor/__tests__/binary-sut.unit.test.d.ts +8 -0
  179. package/dist/executor/__tests__/binary-sut.unit.test.d.ts.map +1 -0
  180. package/dist/executor/__tests__/binary-sut.unit.test.js +313 -0
  181. package/dist/executor/__tests__/binary-sut.unit.test.js.map +1 -0
  182. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  183. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  184. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  185. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  186. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  187. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  188. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +148 -1
  189. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  190. package/dist/executor/__tests__/executor.unit.test.js +123 -8
  191. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  192. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  193. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  194. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  195. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  196. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  197. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  198. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  199. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  200. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts +10 -0
  201. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts.map +1 -0
  202. package/dist/executor/__tests__/resource-calculator.unit.test.js +104 -0
  203. package/dist/executor/__tests__/resource-calculator.unit.test.js.map +1 -0
  204. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  205. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  206. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  207. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  208. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  209. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  210. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  211. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  212. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  213. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  214. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  215. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  216. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts +8 -0
  217. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts.map +1 -0
  218. package/dist/executor/__tests__/worker-threads-executor.unit.test.js +276 -0
  219. package/dist/executor/__tests__/worker-threads-executor.unit.test.js.map +1 -0
  220. package/dist/executor/binary-sut.d.ts +105 -0
  221. package/dist/executor/binary-sut.d.ts.map +1 -0
  222. package/dist/executor/binary-sut.js +174 -0
  223. package/dist/executor/binary-sut.js.map +1 -0
  224. package/dist/executor/checkpoint-storage.d.ts.map +1 -1
  225. package/dist/executor/checkpoint-storage.js +6 -4
  226. package/dist/executor/checkpoint-storage.js.map +1 -1
  227. package/dist/executor/executor.d.ts +28 -0
  228. package/dist/executor/executor.d.ts.map +1 -1
  229. package/dist/executor/executor.js +85 -24
  230. package/dist/executor/executor.js.map +1 -1
  231. package/dist/executor/index.d.ts +4 -0
  232. package/dist/executor/index.d.ts.map +1 -1
  233. package/dist/executor/index.js +4 -0
  234. package/dist/executor/index.js.map +1 -1
  235. package/dist/executor/parallel-executor.d.ts +186 -0
  236. package/dist/executor/parallel-executor.d.ts.map +1 -1
  237. package/dist/executor/parallel-executor.js +218 -83
  238. package/dist/executor/parallel-executor.js.map +1 -1
  239. package/dist/executor/resource-calculator.d.ts +49 -0
  240. package/dist/executor/resource-calculator.d.ts.map +1 -0
  241. package/dist/executor/resource-calculator.js +129 -0
  242. package/dist/executor/resource-calculator.js.map +1 -0
  243. package/dist/executor/run-id.d.ts.map +1 -1
  244. package/dist/executor/run-id.js +8 -1
  245. package/dist/executor/run-id.js.map +1 -1
  246. package/dist/executor/worker-entry.d.ts +2 -0
  247. package/dist/executor/worker-entry.d.ts.map +1 -1
  248. package/dist/executor/worker-entry.js +46 -55
  249. package/dist/executor/worker-entry.js.map +1 -1
  250. package/dist/executor/worker-executor.d.ts +257 -0
  251. package/dist/executor/worker-executor.d.ts.map +1 -0
  252. package/dist/executor/worker-executor.js +308 -0
  253. package/dist/executor/worker-executor.js.map +1 -0
  254. package/dist/executor/worker-threads-executor.d.ts +245 -0
  255. package/dist/executor/worker-threads-executor.d.ts.map +1 -0
  256. package/dist/executor/worker-threads-executor.js +332 -0
  257. package/dist/executor/worker-threads-executor.js.map +1 -0
  258. package/dist/index.d.ts +1 -0
  259. package/dist/index.d.ts.map +1 -1
  260. package/dist/index.js +4 -2
  261. package/dist/index.js.map +1 -1
  262. package/dist/renderers/latex-renderer.d.ts +60 -0
  263. package/dist/renderers/latex-renderer.d.ts.map +1 -1
  264. package/dist/renderers/latex-renderer.js +299 -0
  265. package/dist/renderers/latex-renderer.js.map +1 -1
  266. package/dist/renderers/types.d.ts +9 -0
  267. package/dist/renderers/types.d.ts.map +1 -1
  268. package/dist/renderers/types.js.map +1 -1
  269. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  270. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  271. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  272. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  273. package/dist/robustness/index.d.ts +5 -2
  274. package/dist/robustness/index.d.ts.map +1 -1
  275. package/dist/robustness/index.js +4 -2
  276. package/dist/robustness/index.js.map +1 -1
  277. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  278. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  279. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  280. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  281. package/dist/types/evaluator.d.ts +449 -0
  282. package/dist/types/evaluator.d.ts.map +1 -0
  283. package/dist/types/evaluator.js +9 -0
  284. package/dist/types/evaluator.js.map +1 -0
  285. package/dist/types/result.d.ts +2 -0
  286. package/dist/types/result.d.ts.map +1 -1
  287. package/package.json +8 -1
  288. package/dist/claims/evaluator.d.ts +0 -33
  289. package/dist/claims/evaluator.d.ts.map +0 -1
  290. package/dist/claims/evaluator.js +0 -174
  291. package/dist/claims/evaluator.js.map +0 -1
  292. package/dist/robustness/analyzer.d.ts +0 -61
  293. package/dist/robustness/analyzer.d.ts.map +0 -1
  294. package/dist/robustness/analyzer.js +0 -191
  295. package/dist/robustness/analyzer.js.map +0 -1
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Worker Threads Executor
3
+ *
4
+ * Executes experiments using Node.js worker threads for parallelism.
5
+ * Each worker runs in isolation, preventing SUT crashes from affecting the main process.
6
+ *
7
+ * Architecture:
8
+ * - Main thread spawns N worker threads (75% of CPU cores by default)
9
+ * - Each worker receives a batch of runs via postMessage
10
+ * - Workers write results to sharded checkpoint files
11
+ * - Main thread merges shards after all workers complete
12
+ *
13
+ * Benefits:
14
+ * - Main thread isolation: SUT crashes don't crash the CLI
15
+ * - True parallelism: Workers run on separate OS threads
16
+ * - Resource managed: Automatic 75% resource allocation
17
+ * - Fault tolerance: Single worker failure doesn't stop others
18
+ *
19
+ * Dependency Injection:
20
+ * - Logger interface enables testing of log output
21
+ * - WorkerFactory interface enables mocking Worker for testing
22
+ * - WorkerEntryPath interface enables testing worker path resolution
23
+ */
24
+ import { resolve } from "node:path";
25
+ import { fileURLToPath } from "node:url";
26
+ /**
27
+ * Production logger using console.
28
+ */
29
+ export class ConsoleLogger {
30
+ log(message) {
31
+ console.log(message);
32
+ }
33
+ debug(message) {
34
+ console.log(message);
35
+ }
36
+ info(message) {
37
+ console.log(message);
38
+ }
39
+ warn(message) {
40
+ console.warn(message);
41
+ }
42
+ }
43
+ import { Worker } from "node:worker_threads";
44
+ /**
45
+ * Production worker factory using node:worker_threads.
46
+ * Registers the tsx loader when spawning workers from TypeScript source.
47
+ */
48
+ export class WorkerFactory {
49
+ create(workerPath) {
50
+ const execArgv = workerPath.endsWith(".ts") ? ["--import", "tsx"] : [];
51
+ return new Worker(workerPath, { execArgv });
52
+ }
53
+ }
54
+ /**
55
+ * Production path resolver using import.meta.url.
56
+ * Handles both compiled (dist/*.js) and source (src/*.ts via tsx) contexts.
57
+ */
58
+ export class WorkerEntryPath {
59
+ getWorkerEntryPath() {
60
+ const __filename = fileURLToPath(import.meta.url);
61
+ const __dirname = resolve(__filename, "..");
62
+ const ext = __filename.endsWith(".ts") ? ".ts" : ".js";
63
+ return resolve(__dirname, `worker-entry${ext}`);
64
+ }
65
+ }
66
+ /**
67
+ * Worker threads executor class with dependency injection.
68
+ *
69
+ * Executes experiments using Node.js worker threads for parallelism.
70
+ * Each worker runs in isolation, preventing SUT crashes from affecting the main process.
71
+ */
72
+ export class WorkerThreadsExecutor {
73
+ logger;
74
+ workerFactory;
75
+ workerEntryPath;
76
+ baseDir;
77
+ useRegistryManifest;
78
+ constructor(options = {}) {
79
+ this.logger = options.logger ?? new ConsoleLogger();
80
+ this.workerFactory = options.workerFactory ?? new WorkerFactory();
81
+ this.workerEntryPath = options.workerEntryPath ?? new WorkerEntryPath();
82
+ this.baseDir = options.baseDir ?? process.cwd();
83
+ this.useRegistryManifest = options.useRegistryManifest ?? false;
84
+ }
85
+ /**
86
+ * Split runs into batches for parallel processing.
87
+ * @param runs - Runs to distribute
88
+ * @param numberWorkers - Number of worker threads
89
+ * @returns Array of run batches
90
+ */
91
+ _createBatches(runs, numberWorkers) {
92
+ const batchSize = Math.ceil(runs.length / numberWorkers);
93
+ const batches = [];
94
+ for (let i = 0; i < runs.length; i += batchSize) {
95
+ const batch = runs.slice(i, i + batchSize);
96
+ const batchIndex = Math.floor(i / batchSize);
97
+ const runIds = batch.map((r) => r.runId);
98
+ batches.push({
99
+ index: batchIndex,
100
+ runIds,
101
+ runs: batch,
102
+ firstRunId: batch[0]?.runId ?? "none",
103
+ lastRunId: batch.at(-1)?.runId ?? "none",
104
+ });
105
+ }
106
+ return batches;
107
+ }
108
+ /**
109
+ * Execute runs using multiple worker threads.
110
+ *
111
+ * Each worker writes to its own sharded checkpoint file to avoid race conditions.
112
+ * After all workers complete, results are aggregated and returned.
113
+ *
114
+ * @param runs - Planned runs to execute
115
+ * @param suts - SUT definitions (serialized and passed to workers)
116
+ * @param cases - Case definitions (serialized and passed to workers)
117
+ * @param config - Executor configuration
118
+ * @param options - Worker threads executor options
119
+ * @param checkpointDir - Checkpoint directory for shard files
120
+ * @returns Execution results
121
+ */
122
+ async execute(runs, suts, cases, config, options = {}, checkpointDir = resolve(process.cwd(), "results/execute")) {
123
+ const workerCount = options.workers ?? 1;
124
+ this.logger.info(`WorkerThreadsExecutor: Spawning ${workerCount} workers for ${runs.length} runs`);
125
+ this.logger.info(`Checkpoint directory: ${checkpointDir}`);
126
+ // Split runs into batches
127
+ const batches = this._createBatches(runs, workerCount);
128
+ // Log batch information
129
+ for (const batch of batches) {
130
+ this.logger.debug(`Batch ${batch.index} has ${batch.runIds.length} runs`);
131
+ this.logger.debug(` First run: ${batch.firstRunId}, Last run: ${batch.lastRunId}`);
132
+ }
133
+ // Get worker entry path
134
+ const workerPath = this.workerEntryPath.getWorkerEntryPath();
135
+ this.logger.debug(`Worker entry path: ${workerPath}`);
136
+ // Spawn workers
137
+ const workerStates = this._spawnWorkers(batches, workerPath, checkpointDir, config, suts, cases);
138
+ // Wait for all workers to complete
139
+ await this._waitForWorkers(workerStates);
140
+ // Aggregate results
141
+ const allResults = [];
142
+ const allErrors = [];
143
+ for (const state of workerStates) {
144
+ allResults.push(...state.results);
145
+ allErrors.push(...state.errors);
146
+ }
147
+ this.logger.info(`All workers completed: ${allResults.length} results, ${allErrors.length} errors`);
148
+ return { results: allResults, errors: allErrors };
149
+ }
150
+ /**
151
+ * Spawn worker threads for all batches.
152
+ * @param batches - Run batches
153
+ * @param workerPath - Path to worker entry point
154
+ * @param checkpointDir - Checkpoint directory
155
+ * @param config - Executor configuration
156
+ * @param suts - SUT definitions to serialize
157
+ * @param cases - Case definitions to serialize
158
+ * @returns Array of worker states
159
+ */
160
+ _spawnWorkers(batches, workerPath, checkpointDir, config, suts, cases) {
161
+ const workerStates = [];
162
+ // Serialize SUTs for WorkerMessage
163
+ const serializedSuts = suts.map((sut) => ({
164
+ id: sut.registration.id,
165
+ module: `./dist/suts/${sut.registration.id}.js`,
166
+ exportName: "createSut",
167
+ registration: {
168
+ name: sut.registration.name,
169
+ version: sut.registration.version,
170
+ role: sut.registration.role,
171
+ },
172
+ }));
173
+ // Serialize cases for WorkerMessage
174
+ const serializedCases = cases.map((c) => ({
175
+ caseId: c.case.caseId,
176
+ module: `./dist/cases/${c.case.caseId}.js`,
177
+ exportName: "createCase",
178
+ }));
179
+ for (const batch of batches) {
180
+ const checkpointPath = resolve(checkpointDir, `checkpoint-worker-${String(batch.index).padStart(2, "0")}.json`);
181
+ const worker = this.workerFactory.create(workerPath);
182
+ const state = {
183
+ worker,
184
+ index: batch.index,
185
+ batch,
186
+ checkpointPath,
187
+ completed: false,
188
+ results: [],
189
+ errors: [],
190
+ };
191
+ // Set up message handler
192
+ worker.on("message", (data) => {
193
+ this._handleWorkerMessage(state, data, config);
194
+ });
195
+ // Set up error handler
196
+ worker.on("error", (error) => {
197
+ this.logger.warn(`Worker ${batch.index} error: ${error.message}`);
198
+ state.completed = true;
199
+ // Add error for all runs in this batch
200
+ for (const runId of batch.runIds) {
201
+ state.errors.push({ runId, error: error.message });
202
+ }
203
+ });
204
+ // Send initial message to worker with serialized SUTs and cases
205
+ const workerMessage = {
206
+ runs: batch.runs.map((run) => ({
207
+ runId: run.runId,
208
+ sutId: run.sutId,
209
+ caseId: run.caseId,
210
+ repetition: run.repetition,
211
+ config: run.config,
212
+ })),
213
+ config: {
214
+ repetitions: config.repetitions,
215
+ seedBase: config.seedBase,
216
+ continueOnError: config.continueOnError,
217
+ timeoutMs: config.timeoutMs,
218
+ collectProvenance: config.collectProvenance,
219
+ },
220
+ baseDir: this.baseDir,
221
+ suts: serializedSuts,
222
+ cases: serializedCases,
223
+ };
224
+ // Add registry manifest if useRegistryManifest is enabled
225
+ if (this.useRegistryManifest) {
226
+ const registryManifest = {
227
+ suts: suts.map((sut) => ({
228
+ id: sut.registration.id,
229
+ name: sut.registration.name,
230
+ version: sut.registration.version,
231
+ role: sut.registration.role,
232
+ config: {},
233
+ tags: [],
234
+ })),
235
+ sharedCode: "", // Registry code not bundled in this implementation
236
+ sutModules: Object.fromEntries(suts.map((sut) => [sut.registration.id, `./dist/suts/${sut.registration.id}.js`])),
237
+ exportName: "createSut",
238
+ };
239
+ workerMessage.registryManifest = registryManifest;
240
+ }
241
+ worker.postMessage(workerMessage);
242
+ workerStates.push(state);
243
+ }
244
+ return workerStates;
245
+ }
246
+ /**
247
+ * Handle a message from a worker.
248
+ * @param state - Worker state
249
+ * @param data - Message data
250
+ * @param config - Executor configuration
251
+ */
252
+ _handleWorkerMessage(state, data, config) {
253
+ // Use type guards to discriminate the union type
254
+ const isError = (msg) => msg.type === "error";
255
+ const isSuccess = (msg) => msg.type === "done";
256
+ // Handle WorkerErrorMessage
257
+ if (isError(data)) {
258
+ this.logger.warn(`Worker ${state.index} error: ${data.error}`);
259
+ state.completed = true;
260
+ for (const runId of state.batch.runIds) {
261
+ state.errors.push({ runId, error: data.error });
262
+ }
263
+ return;
264
+ }
265
+ // Handle WorkerSuccessMessage
266
+ if (isSuccess(data)) {
267
+ state.results.push(...data.results);
268
+ state.errors.push(...data.errors);
269
+ state.completed = true;
270
+ this.logger.debug(`Worker ${state.index} completed: ${data.results.length} results`);
271
+ // Call onResult callback for each result
272
+ if (config.onResult) {
273
+ for (const result of data.results) {
274
+ try {
275
+ void config.onResult(result);
276
+ }
277
+ catch (error) {
278
+ this.logger.warn(`Error in onResult callback: ${String(error)}`);
279
+ }
280
+ }
281
+ }
282
+ }
283
+ }
284
+ /**
285
+ * Wait for all workers to complete.
286
+ * @param workerStates - Worker states
287
+ * @returns Promise that resolves when all workers complete
288
+ */
289
+ async _waitForWorkers(workerStates) {
290
+ return new Promise((resolve, reject) => {
291
+ let completedCount = 0;
292
+ const totalWorkers = workerStates.length;
293
+ const checkCompletion = () => {
294
+ completedCount = workerStates.filter((s) => s.completed).length;
295
+ if (completedCount === totalWorkers) {
296
+ clearInterval(interval);
297
+ clearTimeout(timeout);
298
+ resolve();
299
+ }
300
+ };
301
+ // Poll for completion
302
+ const interval = setInterval(checkCompletion, 100);
303
+ // Timeout after 1 hour
304
+ const timeout = setTimeout(() => {
305
+ clearInterval(interval);
306
+ const incomplete = workerStates.filter((s) => !s.completed).map((s) => s.index);
307
+ reject(new Error(`Worker timeout after 1 hour. Incomplete workers: ${incomplete.join(", ")}`));
308
+ }, 3_600_000);
309
+ });
310
+ }
311
+ }
312
+ /**
313
+ * Execute runs using multiple worker threads.
314
+ *
315
+ * Each worker writes to its own sharded checkpoint file to avoid race conditions.
316
+ * After all workers complete, results are aggregated and returned.
317
+ *
318
+ * This is a convenience function that creates a WorkerThreadsExecutor with default dependencies.
319
+ * For testing or custom behavior, use the WorkerThreadsExecutor class directly.
320
+ *
321
+ * @param runs - Planned runs to execute
322
+ * @param suts - SUT definitions (serialized and passed to workers)
323
+ * @param cases - Case definitions (serialized and passed to workers)
324
+ * @param config - Executor configuration
325
+ * @param options - Worker threads executor options
326
+ * @returns Execution results
327
+ */
328
+ export const executeWithWorkerThreads = async (runs, suts, cases, config, options = {}) => {
329
+ const executor = new WorkerThreadsExecutor(options);
330
+ return executor.execute(runs, suts, cases, config, options);
331
+ };
332
+ //# sourceMappingURL=worker-threads-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-threads-executor.js","sourceRoot":"","sources":["../../src/executor/worker-threads-executor.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export * from "./executor/index.js";
9
9
  export * from "./collector/index.js";
10
10
  export * from "./statistical/index.js";
11
11
  export * from "./aggregation/index.js";
12
+ export * from "./evaluators/index.js";
12
13
  export * from "./claims/index.js";
13
14
  export * from "./robustness/index.js";
14
15
  export * from "./renderers/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -15,9 +15,11 @@ export * from "./collector/index.js";
15
15
  export * from "./statistical/index.js";
16
16
  // Aggregation
17
17
  export * from "./aggregation/index.js";
18
- // Claims
18
+ // Evaluators (new extensible evaluation system)
19
+ export * from "./evaluators/index.js";
20
+ // Claims (types only)
19
21
  export * from "./claims/index.js";
20
- // Robustness
22
+ // Robustness (types and perturbations only)
21
23
  export * from "./robustness/index.js";
22
24
  // Renderers
23
25
  export * from "./renderers/index.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,YAAY;AACZ,cAAc,sBAAsB,CAAC;AAErC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,SAAS;AACT,cAAc,mBAAmB,CAAC;AAElC,aAAa;AACb,cAAc,uBAAuB,CAAC;AAEtC,YAAY;AACZ,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,YAAY;AACZ,cAAc,sBAAsB,CAAC;AAErC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,cAAc;AACd,cAAc,wBAAwB,CAAC;AAEvC,gDAAgD;AAChD,cAAc,uBAAuB,CAAC;AAEtC,sBAAsB;AACtB,cAAc,mBAAmB,CAAC;AAElC,4CAA4C;AAC5C,cAAc,uBAAuB,CAAC;AAEtC,YAAY;AACZ,cAAc,sBAAsB,CAAC"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import type { AggregatedResult } from "../types/aggregate.js";
8
8
  import type { ClaimEvaluation } from "../types/claims.js";
9
+ import type { EvaluationOutput } from "../types/evaluator.js";
9
10
  import type { ClaimStatusDisplay, Renderer, RenderOutput, TableRenderSpec } from "./types.js";
10
11
  /**
11
12
  * Options for LaTeX rendering.
@@ -36,6 +37,65 @@ export declare class LaTeXRenderer implements Renderer {
36
37
  * @param specs
37
38
  */
38
39
  renderAll(aggregates: AggregatedResult[], specs: TableRenderSpec[]): RenderOutput[];
40
+ /**
41
+ * Render evaluation output (generic for all evaluation types).
42
+ * Dispatches to type-specific rendering methods.
43
+ *
44
+ * @param evaluation - Evaluation output from any evaluator
45
+ * @returns Rendered output
46
+ */
47
+ renderEvaluation<T>(evaluation: EvaluationOutput<T>): RenderOutput;
48
+ /**
49
+ * Render claims evaluation output.
50
+ *
51
+ * @param evaluation - Claims evaluation output
52
+ * @returns Rendered output
53
+ */
54
+ private renderClaimsEvaluation;
55
+ /**
56
+ * Render robustness evaluation output.
57
+ *
58
+ * @param evaluation - Robustness evaluation output
59
+ * @returns Rendered output
60
+ */
61
+ private renderRobustnessEvaluation;
62
+ /**
63
+ * Render metrics evaluation output.
64
+ *
65
+ * @param evaluation - Metrics evaluation output
66
+ * @returns Rendered output
67
+ */
68
+ private renderMetricsEvaluation;
69
+ /**
70
+ * Render exploratory evaluation output.
71
+ *
72
+ * @param evaluation - Exploratory evaluation output
73
+ * @returns Rendered output
74
+ */
75
+ private renderExploratoryEvaluation;
76
+ /**
77
+ * Render SUT rankings table.
78
+ */
79
+ private renderSutRankings;
80
+ /**
81
+ * Render pairwise comparisons table.
82
+ */
83
+ private renderPairwiseComparisons;
84
+ /**
85
+ * Render case-class effects table.
86
+ */
87
+ private renderCaseClassEffects;
88
+ /**
89
+ * Render metric correlations table.
90
+ */
91
+ private renderMetricCorrelations;
92
+ /**
93
+ * Render custom evaluation output (generic fallback).
94
+ *
95
+ * @param evaluation - Custom evaluation output
96
+ * @returns Rendered output
97
+ */
98
+ private renderCustomEvaluation;
39
99
  /**
40
100
  * Render claim evaluation summary.
41
101
  * @param evaluations
@@ -1 +1 @@
1
- {"version":3,"file":"latex-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/latex-renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EACX,kBAAkB,EAElB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,2BAA2B;IAC3B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAEjC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAWD;;GAEG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,OAAO,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAIvD;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,eAAe,GAAG,YAAY;IAgChF;;;;OAIG;IACH,SAAS,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE;IAInF;;;OAGG;IACH,kBAAkB,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,YAAY;IAmDhE;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAwClB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAanB;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAOlD;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOpC;;;OAGG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAMnC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAKO,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,OAAO,CAAC,oBAAoB,CAAC,KAAG,aACnD,CAAC"}
1
+ {"version":3,"file":"latex-renderer.d.ts","sourceRoot":"","sources":["../../src/renderers/latex-renderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EACX,gBAAgB,EAKhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,kBAAkB,EAElB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,2BAA2B;IAC3B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAEjC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAWD;;GAEG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,OAAO,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAIvD;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,eAAe,GAAG,YAAY;IAgChF;;;;OAIG;IACH,SAAS,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,YAAY,EAAE;IAInF;;;;;;OAMG;IACH,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY;IAoBlE;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAM9B;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IA+ClC;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAmE/B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAwCnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyCzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAuCjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuC9B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqChC;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;;OAGG;IACH,kBAAkB,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,YAAY;IAmDhE;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAwClB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAanB;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAOlD;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOpC;;;OAGG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAMnC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAKO,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,OAAO,CAAC,oBAAoB,CAAC,KAAG,aACnD,CAAC"}