@wrongstack/bench 0.260.0 → 0.264.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.
package/dist/index.js CHANGED
@@ -155,6 +155,7 @@ function execCommand(opts) {
155
155
  resolve({
156
156
  exitCode: null,
157
157
  stdout: "",
158
+ /* v8 ignore next -- spawn throws Error subclasses; the String(err) branch is defensive. */
158
159
  stderr: err instanceof Error ? err.message : String(err),
159
160
  timedOut: false
160
161
  });
@@ -475,6 +476,7 @@ async function runWstack(opts) {
475
476
  });
476
477
  } catch (err) {
477
478
  resolve(
479
+ /* v8 ignore next -- spawn throws Error subclasses; the String(err) branch is defensive. */
478
480
  crashed(startedAt, `spawn failed: ${err instanceof Error ? err.message : String(err)}`)
479
481
  );
480
482
  return;
@@ -755,6 +757,7 @@ async function runBenchmark(opts) {
755
757
  } catch (err) {
756
758
  grade = {
757
759
  passed: false,
760
+ /* v8 ignore next -- graders reject with Error; the String(err) branch is defensive. */
758
761
  detail: `grader error: ${err instanceof Error ? err.message : String(err)}`
759
762
  };
760
763
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/aggregate.ts","../src/config.ts","../src/exec-command.ts","../src/fingerprint.ts","../src/graders/polyglot-grader.ts","../src/report/predictions.ts","../src/suites/swebench-patch.ts","../src/graders/swebench-grader.ts","../src/isolation.ts","../src/runner.ts","../src/session-metrics.ts","../src/orchestrate.ts","../src/report/json.ts","../src/report/markdown.ts","../src/suites/polyglot.ts","../src/suites/swebench.ts"],"names":["path","fs","fs2","path2","slug","spawn","fs4","path3","stat","fs5","path4","path5","fs6","createHash","fs7","path6","buildPrompt"],"mappings":"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","file":"index.js","sourcesContent":["import type { CellResult, ModelCell, TaskResult } from './types.js';\n\n/**\n * Fold every per-(task × cell) result for ONE cell into its leaderboard row.\n * All metrics are derived from deterministic signals (grader pass/fail, the\n * `--output-json` usage block, and session-log tool counts) — nothing here\n * consults a model.\n */\nexport function aggregateCell(cell: ModelCell, results: TaskResult[]): CellResult {\n const taskCount = results.length;\n if (taskCount === 0) {\n return {\n cell,\n taskCount: 0,\n gradedCount: 0,\n passRate: 0,\n editApplyRate: 1,\n avgCostUsd: 0,\n avgTokensIn: 0,\n avgTokensOut: 0,\n p50Iterations: 0,\n p50ElapsedMs: 0,\n timeoutRate: 0,\n totalRateLimitRetries: 0,\n };\n }\n\n // Only count rows that produced an actual verdict — exported-but-ungraded\n // SWE-bench rows (graded === false) must not deflate the pass rate.\n const graded = results.filter((r) => r.grade.graded !== false);\n const passed = graded.filter((r) => r.grade.passed).length;\n const timeouts = results.filter((r) => r.run.status === 'timeout').length;\n\n const editCalls = sum(results, (r) => r.tools.editCalls);\n const editErrors = sum(results, (r) => r.tools.editErrors);\n // Edit-apply rate is undefined when no edit was ever attempted; report 1\n // (nothing failed to apply) so a no-op run doesn't drag the column down.\n const editApplyRate = editCalls === 0 ? 1 : (editCalls - editErrors) / editCalls;\n\n return {\n cell,\n taskCount,\n gradedCount: graded.length,\n passRate: graded.length === 0 ? 0 : passed / graded.length,\n editApplyRate,\n avgCostUsd: sum(results, (r) => r.run.costUsd) / taskCount,\n avgTokensIn: sum(results, (r) => r.run.tokensIn) / taskCount,\n avgTokensOut: sum(results, (r) => r.run.tokensOut) / taskCount,\n p50Iterations: median(results.map((r) => r.run.iterations)),\n p50ElapsedMs: median(results.map((r) => r.run.elapsedMs)),\n timeoutRate: timeouts / taskCount,\n totalRateLimitRetries: sum(results, (r) => r.tools.rateLimitRetries),\n };\n}\n\n/** Group all results by cell label and aggregate each group. */\nexport function aggregateAll(cells: ModelCell[], results: TaskResult[]): CellResult[] {\n return cells.map((cell) =>\n aggregateCell(\n cell,\n results.filter((r) => r.cell.label === cell.label),\n ),\n );\n}\n\n/** Median of a numeric array (0 for empty). Exported for tests. */\nexport function median(values: number[]): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0\n ? ((sorted[mid - 1] as number) + (sorted[mid] as number)) / 2\n : (sorted[mid] as number);\n}\n\nfunction sum<T>(items: T[], pick: (item: T) => number): number {\n let total = 0;\n for (const item of items) total += pick(item);\n return total;\n}\n","import * as fs from 'node:fs/promises';\nimport type { BenchConfig, ModelCell } from './types.js';\n\nconst DEFAULTS = {\n maxIterations: 40,\n concurrency: 4,\n timeoutMs: 600_000,\n} as const;\n\n/**\n * Parse and validate a raw `bench.config.json` object. Throws a descriptive\n * Error on any structural problem so the CLI can surface it cleanly instead of\n * failing deep inside the runner.\n */\nexport function parseBenchConfig(raw: unknown): BenchConfig {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('bench config must be a JSON object');\n }\n const obj = raw as Record<string, unknown>;\n\n const cellsRaw = obj['cells'];\n if (!Array.isArray(cellsRaw) || cellsRaw.length === 0) {\n throw new Error('bench config \"cells\" must be a non-empty array');\n }\n\n const seen = new Set<string>();\n const cells: ModelCell[] = cellsRaw.map((c, i) => {\n if (typeof c !== 'object' || c === null) {\n throw new Error(`cells[${i}] must be an object`);\n }\n const cell = c as Record<string, unknown>;\n const provider = cell['provider'];\n const model = cell['model'];\n if (typeof provider !== 'string' || provider.length === 0) {\n throw new Error(`cells[${i}].provider must be a non-empty string`);\n }\n if (typeof model !== 'string' || model.length === 0) {\n throw new Error(`cells[${i}].model must be a non-empty string`);\n }\n const label =\n typeof cell['label'] === 'string' && cell['label'].length > 0\n ? cell['label']\n : `${provider}/${model}`;\n if (seen.has(label)) {\n throw new Error(`duplicate cell label \"${label}\" — labels must be unique`);\n }\n seen.add(label);\n return { label, provider, model };\n });\n\n const maxIterations = positiveInt(obj['maxIterations'], DEFAULTS.maxIterations, 'maxIterations');\n const concurrency = positiveInt(obj['concurrency'], DEFAULTS.concurrency, 'concurrency');\n const timeoutMs = positiveInt(obj['timeoutMs'], DEFAULTS.timeoutMs, 'timeoutMs');\n\n return { maxIterations, concurrency, timeoutMs, cells };\n}\n\n/** Load and validate a `bench.config.json` from disk. */\nexport async function loadBenchConfig(path: string): Promise<BenchConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(path, 'utf8');\n } catch (err) {\n throw new Error(\n `cannot read bench config at ${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new Error(\n `bench config at ${path} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return parseBenchConfig(parsed);\n}\n\nfunction positiveInt(value: unknown, fallback: number, name: string): number {\n if (value === undefined) return fallback;\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a positive number`);\n }\n return Math.floor(value);\n}\n","import { spawn } from 'node:child_process';\n\nexport interface ExecResult {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n}\n\n/**\n * Run a command (argv form) in a directory and capture its result. Used by the\n * deterministic graders to run a suite's own test command — the run's exit code\n * is the pass/fail signal, no LLM involved.\n *\n * Never rejects; a spawn failure surfaces as exitCode null with the error on\n * stderr.\n */\nexport function execCommand(opts: {\n command: string;\n args: string[];\n cwd: string;\n timeoutMs: number;\n env?: NodeJS.ProcessEnv | undefined;\n /**\n * Run through a shell. Needed for launchers that resolve platform wrappers\n * (`npm` → npm.cmd on Windows, `./gradlew`). Defaults to true. Pass false for\n * real executables (git, python, node, cargo, go) to avoid the shell entirely\n * — no metacharacter interpretation, no DEP0190, no injection surface.\n */\n shell?: boolean | undefined;\n}): Promise<ExecResult> {\n const useShell = opts.shell ?? true;\n return new Promise<ExecResult>((resolve) => {\n let child: ReturnType<typeof spawn>;\n try {\n if (useShell) {\n // Build a SINGLE command string rather than passing an args array with\n // `shell:true` — the latter triggers Node's DEP0190 warning and does\n // not escape the args anyway. Trusted, benchmark-defined commands only.\n const line = [opts.command, ...opts.args.map(shellQuote)].join(' ');\n child = spawn(line, {\n cwd: opts.cwd,\n env: { ...process.env, ...opts.env },\n windowsHide: true,\n shell: true,\n });\n } else {\n // No shell: args are passed verbatim to the program, so nothing in them\n // is interpreted. Preferred for git/python/etc.\n child = spawn(opts.command, opts.args, {\n cwd: opts.cwd,\n env: { ...process.env, ...opts.env },\n windowsHide: true,\n });\n }\n } catch (err) {\n resolve({\n exitCode: null,\n stdout: '',\n stderr: err instanceof Error ? err.message : String(err),\n timedOut: false,\n });\n return;\n }\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n child.kill('SIGKILL');\n } catch {\n /* already gone */\n }\n }, opts.timeoutMs);\n\n child.stdout?.on('data', (d: Buffer) => {\n stdout += d.toString('utf8');\n });\n child.stderr?.on('data', (d: Buffer) => {\n stderr += d.toString('utf8');\n });\n\n const done = (exitCode: number | null) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({ exitCode, stdout, stderr, timedOut });\n };\n\n child.on('error', (err) => {\n stderr += `\\n${err.message}`;\n done(null);\n });\n child.on('close', (code) => done(code));\n });\n}\n\n/** Quote a single arg for the shell only when it contains whitespace. */\nfunction shellQuote(arg: string): string {\n if (arg.length > 0 && !/\\s/.test(arg)) return arg;\n // Wrap in double quotes and escape any embedded double quotes. Sufficient for\n // the benchmark's own test commands (no untrusted shell metacharacters).\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n}\n","import { createHash } from 'node:crypto';\nimport type { HarnessFingerprint } from './types.js';\n\n/**\n * Compute the harness fingerprint. This is what makes a report\n * \"model-independent\": every cell in a run shares one fingerprint, so the only\n * thing that varies across leaderboard rows is the model. Change the CLI\n * version, the tool roster, the iteration cap, the yolo flag, or the task\n * subset and the hash changes — which is exactly when old numbers stop being\n * comparable.\n *\n * The hash is intentionally cheap and reproducible: no timestamps, no random\n * salt. Same inputs → same hash, on any machine.\n */\nexport function computeHarnessFingerprint(input: {\n cliVersion: string;\n toolNames: string[];\n maxIterations: number;\n yolo: boolean;\n subsetId: string;\n}): HarnessFingerprint {\n const toolNames = [...input.toolNames].sort((a, b) => a.localeCompare(b));\n // Canonical, order-stable serialization of every field that affects results.\n const canonical = JSON.stringify({\n cliVersion: input.cliVersion,\n toolNames,\n maxIterations: input.maxIterations,\n yolo: input.yolo,\n subsetId: input.subsetId,\n });\n const hash = createHash('sha256').update(canonical).digest('hex').slice(0, 12);\n return {\n cliVersion: input.cliVersion,\n toolNames,\n maxIterations: input.maxIterations,\n yolo: input.yolo,\n subsetId: input.subsetId,\n hash,\n };\n}\n\n/** One-line human label for report headers: `wrongstack@0.255 · fp:a3f9c7 · maxIter=40 · yolo`. */\nexport function fingerprintLabel(fp: HarnessFingerprint): string {\n const parts = [`wrongstack@${fp.cliVersion}`, `fp:${fp.hash}`, `maxIter=${fp.maxIterations}`];\n if (fp.yolo) parts.push('yolo');\n return parts.join(' · ');\n}\n","import { execCommand } from '../exec-command.js';\nimport type { PolyglotMeta } from '../suites/polyglot.js';\nimport type { BenchTask, GradeResult } from '../types.js';\n\n/**\n * Deterministic polyglot grader: run the exercise's own test command in the\n * finished workdir. Exit code 0 → passed. No LLM, no judgement — this is the\n * invariant that keeps the report model-independent.\n *\n * For languages with a dependency-install step (JS `npm install`, etc.) the\n * setup command runs first; if setup fails the task is graded as not-passed\n * with the setup error as detail (it cannot be the model's fault, but the run\n * is genuinely ungradeable, so it counts as a fail rather than crashing).\n */\nexport async function gradePolyglot(opts: {\n workdir: string;\n task: BenchTask;\n /** Per-step timeout for setup/test commands. */\n timeoutMs: number;\n}): Promise<GradeResult> {\n const meta = opts.task.meta as unknown as PolyglotMeta;\n\n if (meta.setupCommand) {\n const setup = await execCommand({\n command: meta.setupCommand.command,\n args: meta.setupCommand.args,\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n });\n if (setup.exitCode !== 0) {\n return {\n passed: false,\n detail: `setup failed (${meta.setupCommand.command}): ${tail(setup.stderr || setup.stdout)}`,\n };\n }\n }\n\n const test = await execCommand({\n command: meta.testCommand.command,\n args: meta.testCommand.args,\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n });\n\n if (test.timedOut) {\n return { passed: false, detail: 'test command timed out' };\n }\n if (test.exitCode === 0) {\n return { passed: true };\n }\n return { passed: false, detail: tail(test.stdout + '\\n' + test.stderr) };\n}\n\n/** Last ~500 chars of output — enough to see the failing assertion. */\nfunction tail(s: string): string {\n const clean = s.trim();\n return clean.length > 500 ? `…${clean.slice(-500)}` : clean;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * One SWE-bench prediction row, in the exact shape the official harness\n * (`princeton-nlp/SWE-bench`) consumes via `--predictions_path`.\n */\nexport interface SwebenchPrediction {\n instance_id: string;\n /** The model/system label — becomes a column in the official report. */\n model_name_or_path: string;\n /** The unified diff the agent produced. */\n model_patch: string;\n}\n\n/**\n * Write a `predictions.jsonl` for one model cell. SWE-bench grading is delegated\n * to the canonical, version-sensitive harness rather than re-implemented here:\n * we own running the agent and producing a conformant patch; the official tool\n * owns the Docker execution and pass/fail verdict.\n *\n * Returns the file path written.\n */\nexport async function writePredictionsJsonl(\n outDir: string,\n cellLabel: string,\n predictions: SwebenchPrediction[],\n): Promise<string> {\n await fs.mkdir(outDir, { recursive: true });\n const file = path.join(outDir, `predictions-${slug(cellLabel)}.jsonl`);\n const body = predictions.map((p) => JSON.stringify(p)).join('\\n');\n await fs.writeFile(file, body + (body ? '\\n' : ''), 'utf8');\n return file;\n}\n\n/**\n * Write one instance's prediction to its own file under\n * `<predictionsDir>/<cell>/<instance>.json`. Distinct files per instance are\n * concurrency-safe — the SWE-bench grader runs inside the orchestrator's\n * parallel fan-out, so appending to a shared jsonl would race. Call\n * {@link collectCellPredictions} after the run to merge them.\n */\nexport async function writeInstancePrediction(\n predictionsDir: string,\n cellLabel: string,\n prediction: SwebenchPrediction,\n): Promise<void> {\n const dir = path.join(predictionsDir, slug(cellLabel));\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(\n path.join(dir, `${slug(prediction.instance_id)}.json`),\n JSON.stringify(prediction),\n 'utf8',\n );\n}\n\n/** Read back every per-instance prediction written for one cell. */\nexport async function collectCellPredictions(\n predictionsDir: string,\n cellLabel: string,\n): Promise<SwebenchPrediction[]> {\n const dir = path.join(predictionsDir, slug(cellLabel));\n let entries: string[];\n try {\n entries = await fs.readdir(dir);\n } catch {\n return [];\n }\n const out: SwebenchPrediction[] = [];\n for (const name of entries.filter((e) => e.endsWith('.json')).sort()) {\n try {\n out.push(JSON.parse(await fs.readFile(path.join(dir, name), 'utf8')) as SwebenchPrediction);\n } catch {\n // skip unreadable\n }\n }\n return out;\n}\n\n/**\n * Parse an official SWE-bench evaluation report JSON for the set of resolved\n * instance ids. The harness writes `resolved_ids` (newer) or a per-instance\n * `{ resolved: bool }` map; both shapes are handled so this keeps working across\n * harness versions.\n */\nexport function parseResolvedIds(reportJson: unknown): Set<string> {\n const resolved = new Set<string>();\n if (typeof reportJson !== 'object' || reportJson === null) return resolved;\n const obj = reportJson as Record<string, unknown>;\n\n if (Array.isArray(obj['resolved_ids'])) {\n for (const id of obj['resolved_ids']) if (typeof id === 'string') resolved.add(id);\n return resolved;\n }\n\n // Per-instance map fallback: { \"<id>\": { resolved: true }, ... }.\n for (const [id, v] of Object.entries(obj)) {\n if (v && typeof v === 'object' && (v as Record<string, unknown>)['resolved'] === true) {\n resolved.add(id);\n }\n }\n return resolved;\n}\n\nfunction slug(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60) || 'cell'\n );\n}\n","import { type ExecResult, execCommand } from '../exec-command.js';\n\n/** Injectable command runner (defaults to execCommand) for testability. */\nexport type Exec = (opts: {\n command: string;\n args: string[];\n cwd: string;\n timeoutMs: number;\n shell?: boolean | undefined;\n}) => Promise<ExecResult>;\n\n/**\n * Extract the model's patch from a finished SWE-bench workdir.\n *\n * The workdir is a git checkout at the instance's base commit; the agent's\n * edits are uncommitted. `git add -A` stages new/modified/deleted files, then\n * `git diff --cached` produces a unified diff in the exact form the official\n * SWE-bench harness expects as `model_patch`.\n *\n * Changes to files touched by the held-out `test_patch` are stripped: the\n * harness applies the model patch and then the test patch, and the agent is\n * told not to edit tests — dropping those sections keeps the model patch from\n * conflicting with (or sneaking changes into) the graded tests.\n */\nexport async function extractModelPatch(opts: {\n workdir: string;\n /** The instance's held-out test patch, used to exclude test-file edits. */\n testPatch?: string | undefined;\n timeoutMs: number;\n exec?: Exec | undefined;\n}): Promise<string> {\n const exec = opts.exec ?? execCommand;\n // git is a real executable — no shell needed, so nothing in the (controlled)\n // args is ever interpreted.\n await exec({\n command: 'git',\n args: ['add', '-A'],\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n shell: false,\n });\n const diff = await exec({\n command: 'git',\n args: ['diff', '--cached', '--no-color'],\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n shell: false,\n });\n const raw = diff.stdout;\n const testPaths = opts.testPatch ? extractPatchPaths(opts.testPatch) : new Set<string>();\n // Always drop two kinds of sections: (1) edits to the held-out test files,\n // and (2) harness bookkeeping the wstack subprocess writes into the checkout\n // (the `.gitignore` `.wrongstack/` line and any `.wrongstack/` dir) — neither\n // is part of the model's fix, and both would corrupt a SWE-bench prediction.\n return filterPatchSections(\n raw,\n (a, b) => testPaths.has(a) || testPaths.has(b) || isHarnessArtifact(a) || isHarnessArtifact(b),\n );\n}\n\n/** True for paths the wstack harness itself creates/edits in the checkout. */\nfunction isHarnessArtifact(p: string): boolean {\n return p === '.gitignore' || p.split('/')[0] === '.wrongstack';\n}\n\n/**\n * Collect the file paths a unified diff touches. Reads both the\n * `diff --git a/<p> b/<p>` header and the `+++ b/<p>` / `--- a/<p>` lines so it\n * works on patches produced by git or by `diff -u`.\n */\nexport function extractPatchPaths(patch: string): Set<string> {\n const paths = new Set<string>();\n for (const line of patch.split('\\n')) {\n const git = /^diff --git a\\/(.+?) b\\/(.+)$/.exec(line);\n if (git) {\n paths.add(git[1] as string);\n paths.add(git[2] as string);\n continue;\n }\n const minus = /^--- (?:a\\/)?(.+)$/.exec(line);\n if (minus && minus[1] !== '/dev/null') paths.add(stripTimestamp(minus[1] as string));\n const plus = /^\\+\\+\\+ (?:b\\/)?(.+)$/.exec(line);\n if (plus && plus[1] !== '/dev/null') paths.add(stripTimestamp(plus[1] as string));\n }\n return paths;\n}\n\n/**\n * Drop every per-file section of `patch` whose target path is in `exclude`.\n * Sections are delimited by `diff --git` headers (git's format).\n */\nexport function filterPatchExcludingPaths(patch: string, exclude: Set<string>): string {\n if (exclude.size === 0) return patch;\n return filterPatchSections(patch, (a, b) => exclude.has(a) || exclude.has(b));\n}\n\n/**\n * Drop each `diff --git` section for which `shouldDrop(aPath, bPath)` is true.\n */\nexport function filterPatchSections(\n patch: string,\n shouldDrop: (aPath: string, bPath: string) => boolean,\n): string {\n const lines = patch.split('\\n');\n const out: string[] = [];\n let skipping = false;\n for (const line of lines) {\n const header = /^diff --git a\\/(.+?) b\\/(.+)$/.exec(line);\n if (header) {\n skipping = shouldDrop(header[1] as string, header[2] as string);\n }\n if (!skipping) out.push(line);\n }\n return out.join('\\n');\n}\n\n/** Strip a trailing tab+timestamp some diff tools append to `+++`/`---` paths. */\nfunction stripTimestamp(p: string): string {\n const tab = p.indexOf('\\t');\n return tab === -1 ? p : p.slice(0, tab);\n}\n","import { writeInstancePrediction } from '../report/predictions.js';\nimport type { SwebenchMeta } from '../suites/swebench.js';\nimport { type Exec, extractModelPatch } from '../suites/swebench-patch.js';\nimport type { BenchTask, GradeResult, ModelCell } from '../types.js';\n\n/**\n * Inline (Docker) grader hook. Given an instance's model patch and held-out\n * test data, return whether the issue is resolved — or `undefined` if it could\n * not produce a verdict. Left injectable so the heavy, version-sensitive Docker\n * execution is plugged in by the host (the official SWE-bench harness) rather\n * than re-implemented and guessed-at here.\n */\nexport type SwebenchExternalGrade = (args: {\n instanceId: string;\n patch: string;\n image?: string | undefined;\n failToPass: string[];\n passToPass: string[];\n testPatch?: string | undefined;\n workdir: string;\n timeoutMs: number;\n}) => Promise<boolean | undefined>;\n\n/**\n * SWE-bench grader.\n *\n * Resolution is decided deterministically by the instance's own tests\n * (`FAIL_TO_PASS` must pass, `PASS_TO_PASS` must still pass) inside its pinned\n * Docker image — never an LLM. We do NOT re-implement that Docker evaluation\n * (the official `princeton-nlp/SWE-bench` harness owns it and it is version\n * sensitive). Instead this grader:\n *\n * 1. Extracts the model patch from the finished workdir (`git diff`),\n * excluding any edits to the held-out test files.\n * 2. Writes a conformant per-instance prediction so the run can be graded by\n * the official harness (`--predictions_path`).\n * 3. If an inline grader is supplied (Docker available), runs it and returns a\n * real pass/fail verdict; otherwise marks the row \"exported, ungraded\"\n * (graded:false) so it is excluded from pass@1 rather than counted as a\n * failure.\n */\nexport async function gradeSwebench(opts: {\n workdir: string;\n task: BenchTask;\n cell: ModelCell;\n timeoutMs: number;\n /** Where per-instance prediction files are written. */\n predictionsDir: string;\n exec?: Exec | undefined;\n externalGrade?: SwebenchExternalGrade | undefined;\n}): Promise<GradeResult> {\n const meta = opts.task.meta as unknown as SwebenchMeta;\n\n const patch = await extractModelPatch({\n workdir: opts.workdir,\n testPatch: meta.testPatch,\n timeoutMs: opts.timeoutMs,\n exec: opts.exec,\n });\n\n await writeInstancePrediction(opts.predictionsDir, opts.cell.label, {\n instance_id: meta.instanceId,\n model_name_or_path: opts.cell.label,\n model_patch: patch,\n });\n\n // An empty patch resolves nothing — that is a genuine, gradeable failure.\n if (patch.trim().length === 0) {\n return { passed: false, graded: true, detail: 'empty patch (agent made no edits)' };\n }\n\n if (opts.externalGrade) {\n const verdict = await opts.externalGrade({\n instanceId: meta.instanceId,\n patch,\n image: meta.image,\n failToPass: meta.failToPass,\n passToPass: meta.passToPass,\n testPatch: meta.testPatch,\n workdir: opts.workdir,\n timeoutMs: opts.timeoutMs,\n });\n if (verdict !== undefined) {\n return { passed: verdict, graded: true };\n }\n }\n\n // No inline grading available — the patch is exported for the official harness.\n return {\n passed: false,\n graded: false,\n detail: `patch exported (${patch.length} bytes) — grade with the official SWE-bench harness`,\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Per-run isolation. Each benchmark run gets one sandbox directory tree:\n *\n * <sandbox>/\n * home/ → isolated WRONGSTACK_HOME (config seed + all session JSONL)\n * work/<id>/ → one copy of a task template per (task × cell)\n *\n * The isolated home keeps the bench off the developer's real ~/.wrongstack\n * (config, sessions, models cache). Each task workdir hashes to its own\n * project slug under home/projects/, so concurrent runs never share a session\n * file even though they share one home.\n */\nexport interface Sandbox {\n /** Root sandbox dir. */\n root: string;\n /** Isolated WRONGSTACK_HOME. */\n homeDir: string;\n /** Directory that holds per-task workdirs. */\n workRoot: string;\n}\n\n/** Create the sandbox tree and seed the isolated home's config.json. */\nexport async function createSandbox(opts: {\n /** Where to create the sandbox. Defaults to an OS temp dir. */\n baseDir?: string | undefined;\n maxIterations: number;\n yolo: boolean;\n}): Promise<Sandbox> {\n const base = opts.baseDir ?? (await fs.mkdtemp(path.join(os.tmpdir(), 'wstack-bench-')));\n await fs.mkdir(base, { recursive: true });\n const homeDir = path.join(base, 'home');\n const workRoot = path.join(base, 'work');\n await fs.mkdir(homeDir, { recursive: true });\n await fs.mkdir(workRoot, { recursive: true });\n\n // Seed config.json so the subprocess inherits the iteration cap and runs\n // unattended (yolo). auditLevel 'standard' guarantees tool_call_end events\n // land in the session JSONL — session-metrics depends on them. No secrets\n // are written here: provider keys come from the inherited env.\n const config = {\n yolo: opts.yolo,\n tools: { maxIterations: opts.maxIterations },\n session: { auditLevel: 'standard' },\n };\n await fs.writeFile(path.join(homeDir, 'config.json'), JSON.stringify(config, null, 2), 'utf8');\n\n return { root: base, homeDir, workRoot };\n}\n\n/**\n * Copy a task template into a fresh workdir. The directory name embeds the\n * cell label and task id so it is both unique (parallel-safe) and debuggable.\n */\nexport async function prepareWorkdir(\n sandbox: Sandbox,\n templateDir: string,\n taskId: string,\n cellLabel: string,\n exclude?: string[] | undefined,\n): Promise<string> {\n const safe = `${slug(cellLabel)}__${slug(taskId)}`;\n const dest = path.join(sandbox.workRoot, safe);\n // Fresh copy every time: a previous failed run must not leak edits forward.\n await fs.rm(dest, { recursive: true, force: true });\n const excludeSet = new Set(exclude ?? []);\n await fs.cp(templateDir, dest, {\n recursive: true,\n // Drop any path whose segments include an excluded name (e.g. `.meta`),\n // so the reference solution never reaches the agent's workdir.\n filter:\n excludeSet.size === 0\n ? undefined\n : (src) => !src.split(/[\\\\/]/).some((seg) => excludeSet.has(seg)),\n });\n return dest;\n}\n\n/** Remove the whole sandbox tree. Best-effort. */\nexport async function cleanupSandbox(sandbox: Sandbox): Promise<void> {\n await fs.rm(sandbox.root, { recursive: true, force: true }).catch(() => undefined);\n}\n\nfunction slug(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60) || 'x'\n );\n}\n","import { type ChildProcess, spawn, spawnSync } from 'node:child_process';\nimport type { ModelCell, RawRun } from './types.js';\n\n/** Everything needed to run one (task × cell) subprocess. */\nexport interface RunWstackOptions {\n /** Node executable (process.execPath). */\n nodeBin: string;\n /** Path to the wstack CLI entry (dist/index.js) — or a fake in tests. */\n wstackEntry: string;\n /** Isolated WRONGSTACK_HOME for this run. */\n homeDir: string;\n /** Task workdir (becomes the subprocess cwd / projectRoot). */\n workdir: string;\n cell: ModelCell;\n prompt: string;\n timeoutMs: number;\n /** Extra env merged over process.env (e.g. provider keys already present). */\n env?: NodeJS.ProcessEnv | undefined;\n /** Extra CLI args appended after the standard set (Phase 2 hooks). */\n extraArgs?: string[] | undefined;\n}\n\n/**\n * Run the real `wstack` binary once, in single-shot `--output-json` mode, and\n * parse its machine-readable result. This is the heart of the model-independent\n * design: the subprocess is the *whole* harness (real wiring, real tools), and\n * the only thing that varies between calls is `--provider`/`--model`.\n *\n * Never rejects — a crash, non-JSON output, or timeout becomes a RawRun with an\n * explanatory status so the grader still produces a row.\n */\nexport async function runWstack(opts: RunWstackOptions): Promise<RawRun> {\n const args = [\n opts.wstackEntry,\n '--prompt',\n opts.prompt,\n '--provider',\n opts.cell.provider,\n '--model',\n opts.cell.model,\n '--output-json',\n '--no-tui',\n '--no-interactive',\n '--no-banner',\n '--yolo',\n '--no-models-refresh',\n '--skip-index',\n ...(opts.extraArgs ?? []),\n ];\n\n const startedAt = Date.now();\n return new Promise<RawRun>((resolve) => {\n let child: ChildProcess;\n try {\n child = spawn(opts.nodeBin, args, {\n cwd: opts.workdir,\n env: { ...process.env, ...opts.env, WRONGSTACK_HOME: opts.homeDir },\n // windowsHide + no detached: per the repo spawn convention, detached on\n // win32 voids CREATE_NO_WINDOW and pops visible consoles for grandchildren.\n windowsHide: true,\n });\n } catch (err) {\n resolve(\n crashed(startedAt, `spawn failed: ${err instanceof Error ? err.message : String(err)}`),\n );\n return;\n }\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n treeKill(child);\n }, opts.timeoutMs);\n\n child.stdout?.on('data', (d: Buffer) => {\n stdout += d.toString('utf8');\n });\n child.stderr?.on('data', (d: Buffer) => {\n stderr += d.toString('utf8');\n });\n\n const finish = (run: RawRun) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(run);\n };\n\n child.on('error', (err) => {\n finish(crashed(startedAt, `process error: ${err.message}`));\n });\n\n child.on('close', (code) => {\n const elapsedMs = Date.now() - startedAt;\n if (timedOut) {\n finish({\n status: 'timeout',\n finalText: null,\n iterations: 0,\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n elapsedMs,\n exitCode: code,\n });\n return;\n }\n const parsed = parseOutputJson(stdout);\n if (!parsed) {\n finish({\n status: 'crashed',\n finalText: null,\n iterations: 0,\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n elapsedMs,\n exitCode: code,\n // stderr is intentionally not surfaced in RawRun; the caller can read\n // the session log. Keep the shape minimal.\n });\n void stderr;\n return;\n }\n finish({ ...parsed, elapsedMs, exitCode: code });\n });\n });\n}\n\n/**\n * Find and parse the `--output-json` payload. The CLI prints exactly one such\n * line via writeOut; we scan from the end so any stray stdout before it is\n * ignored. Returns the RawRun minus elapsedMs/exitCode (filled by the caller).\n */\nfunction parseOutputJson(stdout: string): Omit<RawRun, 'elapsedMs' | 'exitCode'> | undefined {\n const lines = stdout.split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]?.trim();\n if (!line?.startsWith('{')) continue;\n let obj: Record<string, unknown>;\n try {\n obj = JSON.parse(line) as Record<string, unknown>;\n } catch {\n continue;\n }\n if (typeof obj['status'] !== 'string') continue;\n const usage = (obj['usage'] as Record<string, unknown> | undefined) ?? {};\n return {\n status: normalizeStatus(obj['status'] as string),\n finalText: typeof obj['finalText'] === 'string' ? (obj['finalText'] as string) : null,\n iterations: num(usage['iterations']),\n tokensIn: num(usage['input']),\n tokensOut: num(usage['output']),\n costUsd: num(usage['cost']),\n };\n }\n return undefined;\n}\n\nfunction normalizeStatus(s: string): RawRun['status'] {\n switch (s) {\n case 'completed':\n case 'failed':\n case 'aborted':\n case 'max_iterations':\n return s;\n default:\n return 'failed';\n }\n}\n\nfunction num(v: unknown): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : 0;\n}\n\nfunction crashed(startedAt: number, _reason: string): RawRun {\n return {\n status: 'crashed',\n finalText: null,\n iterations: 0,\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n elapsedMs: Date.now() - startedAt,\n exitCode: null,\n };\n}\n\n/**\n * Kill a child and its descendants. On Windows a plain child.kill() orphans\n * grandchildren (cmd.exe, bash, the model's spawned processes) that keep stdio\n * pipes open; taskkill /T tears down the whole tree. POSIX gets SIGTERM then a\n * SIGKILL backstop.\n */\nfunction treeKill(child: ChildProcess): void {\n if (child.pid === undefined) return;\n if (process.platform === 'win32') {\n spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F'], { windowsHide: true });\n return;\n }\n try {\n child.kill('SIGTERM');\n } catch {\n /* already gone */\n }\n setTimeout(() => {\n try {\n child.kill('SIGKILL');\n } catch {\n /* already gone */\n }\n }, 2000).unref();\n}\n\n/**\n * Map `items` through `fn` with at most `concurrency` in flight at once.\n * Results preserve input order. A tiny dependency-free p-limit.\n */\nexport async function mapWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let next = 0;\n const limit = Math.max(1, Math.min(concurrency, items.length || 1));\n const workers = Array.from({ length: limit }, async () => {\n while (true) {\n const i = next++;\n if (i >= items.length) return;\n results[i] = await fn(items[i] as T, i);\n }\n });\n await Promise.all(workers);\n return results;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { resolveWstackPaths } from '@wrongstack/core';\nimport type { ToolMetrics } from './types.js';\n\n/**\n * Edit-family tools. The fraction of these that apply cleanly is the\n * edit-accuracy signal Aider's polyglot benchmark cares about. Kept inclusive\n * so it stays correct if more edit tools are added later.\n */\nconst EDIT_TOOLS = new Set([\n 'edit',\n 'write',\n 'multiedit',\n 'multi_edit',\n 'str_replace',\n 'apply_patch',\n]);\n\n/**\n * Derive model-free tool metrics from the isolated session JSONL the\n * subprocess wrote. Everything here comes from `tool_call_end` events\n * (`{ name, ok }`) and provider retry/error events — no LLM, no heuristics.\n *\n * Returns zeroed metrics (never throws) when the session log is missing or\n * unreadable: a crashed run still produces a valid, gradeable TaskResult.\n */\nexport async function readToolMetrics(opts: {\n homeDir: string;\n /** The task workdir — the subprocess used this as its projectRoot. */\n workdir: string;\n}): Promise<ToolMetrics> {\n const empty: ToolMetrics = {\n totalCalls: 0,\n editCalls: 0,\n editErrors: 0,\n rateLimitRetries: 0,\n };\n\n let jsonlPath: string | undefined;\n try {\n const sessionsDir = resolveWstackPaths({\n projectRoot: opts.workdir,\n globalRoot: opts.homeDir,\n }).projectSessions;\n jsonlPath = await newestJsonl(sessionsDir);\n } catch {\n return empty;\n }\n if (!jsonlPath) return empty;\n\n let raw: string;\n try {\n raw = await fs.readFile(jsonlPath, 'utf8');\n } catch {\n return empty;\n }\n\n const metrics = { ...empty };\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n continue; // tolerate partial/corrupt trailing lines\n }\n const type = event['type'];\n if (type === 'tool_call_end') {\n metrics.totalCalls++;\n const name = typeof event['name'] === 'string' ? event['name'].toLowerCase() : '';\n if (EDIT_TOOLS.has(name)) {\n metrics.editCalls++;\n if (event['ok'] === false) metrics.editErrors++;\n }\n } else if (type === 'provider_retry' || type === 'provider_error') {\n metrics.rateLimitRetries++;\n }\n }\n return metrics;\n}\n\n/** Newest `*.jsonl` (by mtime) in a directory, or undefined if none. */\nasync function newestJsonl(dir: string): Promise<string | undefined> {\n let entries: string[];\n try {\n entries = await fs.readdir(dir);\n } catch {\n return undefined;\n }\n const jsonls = entries.filter((e) => e.endsWith('.jsonl'));\n if (jsonls.length === 0) return undefined;\n\n let newest: { path: string; mtime: number } | undefined;\n for (const name of jsonls) {\n const full = path.join(dir, name);\n try {\n const stat = await fs.stat(full);\n if (!newest || stat.mtimeMs > newest.mtime) {\n newest = { path: full, mtime: stat.mtimeMs };\n }\n } catch {\n // skip unreadable entry\n }\n }\n return newest?.path;\n}\n","import { aggregateAll } from './aggregate.js';\nimport { computeHarnessFingerprint } from './fingerprint.js';\nimport { cleanupSandbox, createSandbox, prepareWorkdir } from './isolation.js';\nimport { mapWithConcurrency, runWstack } from './runner.js';\nimport { readToolMetrics } from './session-metrics.js';\nimport type {\n BenchConfig,\n BenchReport,\n BenchSuite,\n BenchTask,\n GradeResult,\n ModelCell,\n TaskResult,\n} from './types.js';\n\nexport interface RunBenchmarkOptions {\n suite: BenchSuite;\n /** Suite-specific deterministic grader. */\n grade: (args: {\n workdir: string;\n task: BenchTask;\n cell: ModelCell;\n timeoutMs: number;\n }) => Promise<GradeResult>;\n config: BenchConfig;\n cliVersion: string;\n /** Tool names available to the agent — folded into the fingerprint. */\n toolNames: string[];\n /** Node executable. */\n nodeBin: string;\n /** Path to the wstack CLI entry. */\n wstackEntry: string;\n /** Cap the number of tasks (cheap smoke runs). */\n limit?: number | undefined;\n /** Where the sandbox is created (default OS temp). */\n sandboxBaseDir?: string | undefined;\n /** Extra env for the subprocess (provider keys are inherited from process.env). */\n env?: NodeJS.ProcessEnv | undefined;\n /** Keep the sandbox on disk after the run (debugging). */\n keepSandbox?: boolean | undefined;\n /** Progress callback (one line per event). */\n onProgress?: ((msg: string) => void) | undefined;\n /** Injected clock for the report timestamp (tests pass a fixed value). */\n now?: (() => string) | undefined;\n}\n\n/**\n * Run the full benchmark: load the task subset, fan every (task × cell) cell\n * out through isolated subprocesses, grade deterministically, and fold into a\n * fingerprint-stamped report.\n */\nexport async function runBenchmark(opts: RunBenchmarkOptions): Promise<BenchReport> {\n const progress = opts.onProgress ?? (() => {});\n const nowFn = opts.now ?? (() => new Date().toISOString());\n\n const tasks = await opts.suite.loadTasks({ limit: opts.limit });\n if (tasks.length === 0) {\n throw new Error(`suite \"${opts.suite.id}\" produced no tasks (check the data directory)`);\n }\n const subsetId = opts.suite.subsetId(tasks);\n const fingerprint = computeHarnessFingerprint({\n cliVersion: opts.cliVersion,\n toolNames: opts.toolNames,\n maxIterations: opts.config.maxIterations,\n yolo: true,\n subsetId,\n });\n\n progress(\n `suite=${opts.suite.id} tasks=${tasks.length} cells=${opts.config.cells.length} fp=${fingerprint.hash}`,\n );\n\n const sandbox = await createSandbox({\n baseDir: opts.sandboxBaseDir,\n maxIterations: opts.config.maxIterations,\n yolo: true,\n });\n\n // The unit of work is one (task × cell) pair. Fanning out at this granularity\n // keeps all cores busy even when one cell is much slower than another.\n const units: Array<{ task: BenchTask; cell: ModelCell }> = [];\n for (const task of tasks) {\n for (const cell of opts.config.cells) {\n units.push({ task, cell });\n }\n }\n\n try {\n const results = await mapWithConcurrency(units, opts.config.concurrency, async (unit) => {\n const { task, cell } = unit;\n const workdir = await prepareWorkdir(\n sandbox,\n task.templateDir,\n task.id,\n cell.label,\n task.templateExclude,\n );\n\n const run = await runWstack({\n nodeBin: opts.nodeBin,\n wstackEntry: opts.wstackEntry,\n homeDir: sandbox.homeDir,\n workdir,\n cell,\n prompt: task.prompt,\n timeoutMs: opts.config.timeoutMs,\n env: opts.env,\n });\n\n const tools = await readToolMetrics({ homeDir: sandbox.homeDir, workdir });\n\n let grade: GradeResult;\n try {\n grade = await opts.grade({ workdir, task, cell, timeoutMs: opts.config.timeoutMs });\n } catch (err) {\n grade = {\n passed: false,\n detail: `grader error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n progress(\n ` ${cell.label} · ${task.id} → ${grade.passed ? 'PASS' : 'fail'} ` +\n `(${run.status}, ${run.iterations} it, $${run.costUsd.toFixed(3)})`,\n );\n\n const result: TaskResult = { taskId: task.id, cell, run, grade, tools };\n return result;\n });\n\n const cells = aggregateAll(opts.config.cells, results);\n return {\n suite: opts.suite.id,\n finishedAt: nowFn(),\n fingerprint,\n cells,\n results,\n };\n } finally {\n if (!opts.keepSandbox) await cleanupSandbox(sandbox);\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { BenchReport } from '../types.js';\n\n/**\n * Write the machine-readable report artifacts:\n * - results.jsonl → one line per (task × cell), for reproducibility\n * - summary.json → fingerprint + folded cell results\n *\n * The markdown report is derived from summary.json (see report/markdown.ts), so\n * `wstack bench report` can re-render without re-running anything.\n */\nexport async function writeJsonArtifacts(outDir: string, report: BenchReport): Promise<void> {\n await fs.mkdir(outDir, { recursive: true });\n\n const jsonl = report.results.map((r) => JSON.stringify(r)).join('\\n');\n await fs.writeFile(path.join(outDir, 'results.jsonl'), jsonl + (jsonl ? '\\n' : ''), 'utf8');\n\n const summary = {\n suite: report.suite,\n finishedAt: report.finishedAt,\n fingerprint: report.fingerprint,\n cells: report.cells,\n };\n await fs.writeFile(path.join(outDir, 'summary.json'), JSON.stringify(summary, null, 2), 'utf8');\n}\n\n/** Read back a summary.json into the partial report shape markdown needs. */\nexport async function readSummary(\n outDir: string,\n): Promise<Pick<BenchReport, 'suite' | 'finishedAt' | 'fingerprint' | 'cells'>> {\n const raw = await fs.readFile(path.join(outDir, 'summary.json'), 'utf8');\n return JSON.parse(raw) as Pick<BenchReport, 'suite' | 'finishedAt' | 'fingerprint' | 'cells'>;\n}\n","import { fingerprintLabel } from '../fingerprint.js';\nimport type { BenchReport, CellResult, HarnessFingerprint } from '../types.js';\n\n/**\n * Render the human-facing leaderboard. The header carries the harness\n * fingerprint: rows are only comparable across reports that share it. The body\n * sorts cells by pass rate (the headline correctness metric), highest first.\n */\nexport function renderMarkdownReport(\n report: Pick<BenchReport, 'suite' | 'finishedAt' | 'fingerprint' | 'cells'>,\n): string {\n const { suite, finishedAt, fingerprint, cells } = report;\n const lines: string[] = [];\n\n lines.push(`# WrongStack benchmark — ${suite}`);\n lines.push('');\n lines.push(`**Harness:** ${fingerprintLabel(fingerprint)}`);\n lines.push(`**Finished:** ${finishedAt}`);\n lines.push(`**Tasks/cell:** ${cells[0]?.taskCount ?? 0}`);\n lines.push('');\n lines.push(\n \"Grading is deterministic (the suite's own tests decide pass/fail — no LLM judge). \" +\n 'The only variable across rows is the model; everything else is fixed by the harness fingerprint.',\n );\n lines.push('');\n\n const sorted = [...cells].sort((a, b) => b.passRate - a.passRate);\n\n lines.push(\n '| Model | Pass@1 | Edit-apply | $/task | tok in/out | iters (p50) | wall (p50) | timeout | 429s |',\n );\n lines.push('|---|---:|---:|---:|---:|---:|---:|---:|---:|');\n for (const c of sorted) {\n lines.push(renderRow(c));\n }\n lines.push('');\n lines.push(\n `_Fingerprint hash: \\`${fingerprint.hash}\\` · tools: ${fingerprint.toolNames.length} · subset: \\`${fingerprint.subsetId}\\`_`,\n );\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction renderRow(c: CellResult): string {\n // No graded rows (e.g. SWE-bench predictions exported for offline grading) →\n // show a dash rather than a misleading 0%.\n const passCell =\n c.gradedCount === 0\n ? '—'\n : c.gradedCount < c.taskCount\n ? `${pct(c.passRate)} (${c.gradedCount}/${c.taskCount})`\n : pct(c.passRate);\n return [\n '',\n c.cell.label,\n passCell,\n pct(c.editApplyRate),\n `$${c.avgCostUsd.toFixed(3)}`,\n `${fmtK(c.avgTokensIn)}/${fmtK(c.avgTokensOut)}`,\n String(Math.round(c.p50Iterations)),\n fmtMs(c.p50ElapsedMs),\n pct(c.timeoutRate),\n String(c.totalRateLimitRetries),\n '',\n ]\n .join(' | ')\n .trim();\n}\n\nfunction pct(x: number): string {\n return `${(x * 100).toFixed(1)}%`;\n}\n\nfunction fmtK(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(Math.round(n));\n}\n\nfunction fmtMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.round(ms)}ms`;\n}\n\n/** Build the full fingerprint-stamped header line for terminal echo. */\nexport function reportHeaderLine(fp: HarnessFingerprint): string {\n return fingerprintLabel(fp);\n}\n","import { createHash } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { BenchSuite, BenchTask } from '../types.js';\n\n/**\n * Aider polyglot benchmark loader.\n *\n * The polyglot-benchmark repo (https://github.com/Aider-AI/polyglot-benchmark)\n * lays exercises out in Exercism form:\n *\n * <root>/<language>/exercises/practice/<slug>/\n * .docs/instructions.md ← problem statement\n * .meta/config.json ← Exercism file manifest (solution/test/example)\n * .meta/example.<ext> ← reference solution (EXCLUDED from the agent)\n * <solution files> ← stubs the agent edits\n * <test files> ← the hidden tests the grader runs\n *\n * We do NOT vendor the exercises (225 across 6 languages); the caller points\n * `--polyglot-dir` at a local checkout.\n */\n\n/** Per-language test command + optional dependency-install step. */\ninterface LanguageRunner {\n /** Directory name under the polyglot root. */\n dir: string;\n /** argv for the test command, run in the workdir. */\n test: (testFiles: string[]) => { command: string; args: string[] };\n /** argv for an optional setup/install step run before tests. */\n setup?: { command: string; args: string[] } | undefined;\n}\n\nconst LANGUAGE_RUNNERS: Record<string, LanguageRunner> = {\n python: {\n dir: 'python',\n test: (tests) => ({ command: 'python', args: ['-m', 'pytest', '-q', ...tests] }),\n },\n javascript: {\n dir: 'javascript',\n setup: { command: 'npm', args: ['install', '--no-audit', '--no-fund'] },\n test: () => ({ command: 'npm', args: ['test'] }),\n },\n go: {\n dir: 'go',\n test: () => ({ command: 'go', args: ['test', './...'] }),\n },\n rust: {\n dir: 'rust',\n test: () => ({ command: 'cargo', args: ['test', '--', '--include-ignored'] }),\n },\n cpp: {\n dir: 'cpp',\n test: () => ({ command: 'cmake', args: ['--build', 'build', '--target', 'test'] }),\n },\n java: {\n dir: 'java',\n test: () => ({ command: './gradlew', args: ['test'] }),\n },\n};\n\n/** Metadata the polyglot grader reads off each task. */\nexport interface PolyglotMeta {\n language: string;\n solutionFiles: string[];\n testFiles: string[];\n testCommand: { command: string; args: string[] };\n setupCommand?: { command: string; args: string[] } | undefined;\n}\n\nexport function createPolyglotSuite(opts: {\n /** Local checkout of the polyglot-benchmark repo. */\n polyglotDir: string;\n /** Restrict to these languages (default: all present). */\n languages?: string[] | undefined;\n}): BenchSuite {\n return {\n id: 'polyglot',\n async loadTasks({ limit }) {\n const tasks: BenchTask[] = [];\n const langs = opts.languages ?? Object.keys(LANGUAGE_RUNNERS);\n for (const lang of langs) {\n const runner = LANGUAGE_RUNNERS[lang];\n if (!runner) continue;\n const practiceDir = path.join(opts.polyglotDir, runner.dir, 'exercises', 'practice');\n let slugs: string[];\n try {\n slugs = (await fs.readdir(practiceDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort((a, b) => a.localeCompare(b));\n } catch {\n continue; // language not present in this checkout\n }\n for (const slug of slugs) {\n const exerciseDir = path.join(practiceDir, slug);\n const task = await loadExercise(exerciseDir, lang, runner, slug);\n if (task) tasks.push(task);\n if (limit !== undefined && tasks.length >= limit) return tasks;\n }\n }\n return tasks;\n },\n subsetId(tasks) {\n // Order-independent digest of the exact task ids in this run.\n const ids = tasks.map((t) => t.id).sort((a, b) => a.localeCompare(b));\n return `polyglot:${createHash('sha256').update(ids.join('\\n')).digest('hex').slice(0, 12)}`;\n },\n };\n}\n\nasync function loadExercise(\n exerciseDir: string,\n language: string,\n runner: LanguageRunner,\n slug: string,\n): Promise<BenchTask | undefined> {\n // Exercism manifest tells us which files are the solution vs the tests.\n let manifest: { files?: { solution?: string[]; test?: string[] } };\n try {\n const raw = await fs.readFile(path.join(exerciseDir, '.meta', 'config.json'), 'utf8');\n manifest = JSON.parse(raw) as typeof manifest;\n } catch {\n return undefined; // not a well-formed exercise\n }\n const solutionFiles = manifest.files?.solution ?? [];\n const testFiles = manifest.files?.test ?? [];\n if (solutionFiles.length === 0) return undefined;\n\n const instructions = await readInstructions(exerciseDir);\n\n const meta: PolyglotMeta = {\n language,\n solutionFiles,\n testFiles,\n testCommand: runner.test(testFiles),\n setupCommand: runner.setup,\n };\n\n return {\n id: `polyglot/${language}/${slug}`,\n suite: 'polyglot',\n prompt: buildPrompt(instructions, solutionFiles, testFiles),\n templateDir: exerciseDir,\n // Never copy the reference solution into the agent's workdir.\n templateExclude: ['.meta'],\n meta: meta as unknown as Record<string, unknown>,\n };\n}\n\nasync function readInstructions(exerciseDir: string): Promise<string> {\n const docs = path.join(exerciseDir, '.docs');\n const parts: string[] = [];\n for (const name of ['introduction.md', 'instructions.md', 'instructions.append.md']) {\n try {\n parts.push((await fs.readFile(path.join(docs, name), 'utf8')).trim());\n } catch {\n // optional file\n }\n }\n return parts.filter(Boolean).join('\\n\\n');\n}\n\nfunction buildPrompt(instructions: string, solutionFiles: string[], testFiles: string[]): string {\n return [\n instructions,\n '',\n '---',\n '',\n `Implement the solution by editing **only** these file(s): ${solutionFiles.join(', ')}.`,\n testFiles.length > 0\n ? `The test suite (${testFiles.join(', ')}) is already present and will be run to grade your work — do not modify the tests.`\n : 'A hidden test suite will be run to grade your work.',\n 'Make the tests pass. Use the available file tools to read and edit the files. When the implementation is complete, stop.',\n ].join('\\n');\n}\n\nexport { LANGUAGE_RUNNERS };\n","import { createHash } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { BenchSuite, BenchTask } from '../types.js';\n\n/**\n * SWE-bench Verified adapter (Phase 2).\n *\n * Unlike polyglot (a self-contained directory of exercises), SWE-bench requires\n * a materialized repo at a specific base commit AND the task's pinned execution\n * environment — which the official harness ships as per-instance Docker images.\n * Running it without Docker is not meaningful, so this adapter is wired and\n * fingerprint-aware but gated: `loadTasks` throws an actionable error unless a\n * prepared dataset directory is supplied and `docker` is enabled.\n *\n * The fixed instance subset lives in `subsets/swe-bench-verified-50.json` so a\n * model comparison always grades the exact same issues (reproducibility).\n */\nexport interface SwebenchOptions {\n /**\n * Directory of prepared instances. Expected layout (produced by your\n * SWE-bench setup step — see packages/bench/README.md):\n * <datasetDir>/<instance_id>/\n * repo/ ← git checkout at base_commit\n * instance.json ← { problem_statement, test_patch, FAIL_TO_PASS, PASS_TO_PASS, image }\n */\n datasetDir?: string | undefined;\n /** Must be true to actually build tasks — the env is Docker-backed. */\n docker?: boolean | undefined;\n /** Override the committed subset file. */\n subsetFile?: string | undefined;\n}\n\nexport interface SwebenchMeta {\n instanceId: string;\n instanceDir: string;\n image?: string | undefined;\n failToPass: string[];\n passToPass: string[];\n testPatch?: string | undefined;\n}\n\nconst SUBSET_FILE = 'swe-bench-verified-50.json';\n\n/**\n * Locate the committed subset file. The relative depth differs between the\n * bundled artifact (`dist/index.js` → `../subsets`) and source execution\n * (`src/suites/swebench.js` → `../../subsets`), so try both and use whichever\n * exists.\n */\nasync function resolveDefaultSubset(): Promise<string> {\n const candidates = [\n fileURLToPath(new URL(`../subsets/${SUBSET_FILE}`, import.meta.url)),\n fileURLToPath(new URL(`../../subsets/${SUBSET_FILE}`, import.meta.url)),\n ];\n for (const c of candidates) {\n try {\n await fs.access(c);\n return c;\n } catch {\n // try next\n }\n }\n // Fall back to the first candidate so the error message points somewhere real.\n return candidates[0] as string;\n}\n\n/** Read the pinned instance-id subset (the canonical task set). */\nexport async function loadSubset(subsetFile?: string): Promise<string[]> {\n const file = subsetFile ?? (await resolveDefaultSubset());\n const raw = await fs.readFile(file, 'utf8');\n const parsed = JSON.parse(raw) as { instances?: unknown };\n if (!Array.isArray(parsed.instances)) {\n throw new Error(`subset file ${file} is missing an \"instances\" array`);\n }\n return parsed.instances.filter((x): x is string => typeof x === 'string');\n}\n\nexport function createSwebenchSuite(opts: SwebenchOptions = {}): BenchSuite {\n return {\n id: 'swebench',\n async loadTasks({ limit }) {\n const instanceIds = await loadSubset(opts.subsetFile);\n\n // A dataset dir (materialized repos at base commit) is required to run the\n // agent at all. Docker is only needed for INLINE grading; without it we\n // still run the agent and export predictions for the official harness.\n if (!opts.datasetDir) {\n throw new Error(\n 'SWE-bench requires a prepared dataset directory (materialized repos).\\n' +\n 'Run with `--dataset-dir <path>`; add `--docker` to grade inline, or omit it to ' +\n 'export predictions.jsonl for the official harness.\\n' +\n `The pinned subset (${instanceIds.length} instances) is committed in ` +\n 'packages/bench/subsets/swe-bench-verified-50.json. See packages/bench/README.md ' +\n 'for the dataset-preparation steps.',\n );\n }\n\n const tasks: BenchTask[] = [];\n for (const id of instanceIds) {\n const instanceDir = path.join(opts.datasetDir, id);\n let meta: { problem_statement?: string } & Record<string, unknown>;\n try {\n meta = JSON.parse(await fs.readFile(path.join(instanceDir, 'instance.json'), 'utf8'));\n } catch {\n continue; // instance not materialized — skip\n }\n const swMeta: SwebenchMeta = {\n instanceId: id,\n instanceDir,\n image: meta['image'] as string | undefined,\n failToPass: (meta['FAIL_TO_PASS'] as string[] | undefined) ?? [],\n passToPass: (meta['PASS_TO_PASS'] as string[] | undefined) ?? [],\n testPatch: meta['test_patch'] as string | undefined,\n };\n tasks.push({\n id: `swebench/${id}`,\n suite: 'swebench',\n prompt: buildPrompt(\n typeof meta.problem_statement === 'string' ? meta.problem_statement : '',\n ),\n templateDir: path.join(instanceDir, 'repo'),\n meta: swMeta as unknown as Record<string, unknown>,\n });\n if (limit !== undefined && tasks.length >= limit) break;\n }\n return tasks;\n },\n subsetId(tasks) {\n const ids = tasks.map((t) => t.id).sort((a, b) => a.localeCompare(b));\n return `swebench:${createHash('sha256').update(ids.join('\\n')).digest('hex').slice(0, 12)}`;\n },\n };\n}\n\nfunction buildPrompt(problemStatement: string): string {\n return [\n problemStatement,\n '',\n '---',\n '',\n 'You are working in a checkout of the repository. Resolve the issue above by editing the',\n 'source. Do not edit test files. Use the available tools to explore and modify the code.',\n 'When the fix is complete, stop.',\n ].join('\\n');\n}\n"]}
1
+ {"version":3,"sources":["../src/aggregate.ts","../src/config.ts","../src/exec-command.ts","../src/fingerprint.ts","../src/graders/polyglot-grader.ts","../src/report/predictions.ts","../src/suites/swebench-patch.ts","../src/graders/swebench-grader.ts","../src/isolation.ts","../src/runner.ts","../src/session-metrics.ts","../src/orchestrate.ts","../src/report/json.ts","../src/report/markdown.ts","../src/suites/polyglot.ts","../src/suites/swebench.ts"],"names":["path","fs","fs2","path2","slug","spawn","fs4","path3","stat","fs5","path4","path5","fs6","createHash","fs7","path6","buildPrompt"],"mappings":";;;;;;;;;AAQO,SAAS,aAAA,CAAc,MAAiB,OAAA,EAAmC;AAChF,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAC1B,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA,EAAW,CAAA;AAAA,MACX,WAAA,EAAa,CAAA;AAAA,MACb,QAAA,EAAU,CAAA;AAAA,MACV,aAAA,EAAe,CAAA;AAAA,MACf,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,aAAA,EAAe,CAAA;AAAA,MACf,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,CAAA;AAAA,MACb,qBAAA,EAAuB;AAAA,KACzB;AAAA,EACF;AAIA,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,WAAW,KAAK,CAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA,CAAE,MAAA;AACpD,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAEnE,EAAA,MAAM,YAAY,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,SAAS,CAAA;AACvD,EAAA,MAAM,aAAa,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,UAAU,CAAA;AAGzD,EAAA,MAAM,aAAA,GAAgB,SAAA,KAAc,CAAA,GAAI,CAAA,GAAA,CAAK,YAAY,UAAA,IAAc,SAAA;AAEvE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAa,MAAA,CAAO,MAAA;AAAA,IACpB,UAAU,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,SAAS,MAAA,CAAO,MAAA;AAAA,IACpD,aAAA;AAAA,IACA,UAAA,EAAY,IAAI,OAAA,EAAS,CAAC,MAAM,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA,GAAI,SAAA;AAAA,IACjD,WAAA,EAAa,IAAI,OAAA,EAAS,CAAC,MAAM,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA,GAAI,SAAA;AAAA,IACnD,YAAA,EAAc,IAAI,OAAA,EAAS,CAAC,MAAM,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,GAAI,SAAA;AAAA,IACrD,aAAA,EAAe,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,IAC1D,YAAA,EAAc,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,IACxD,aAAa,QAAA,GAAW,SAAA;AAAA,IACxB,uBAAuB,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,gBAAgB;AAAA,GACrE;AACF;AAGO,SAAS,YAAA,CAAa,OAAoB,OAAA,EAAqC;AACpF,EAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,KAChB,aAAA;AAAA,MACE,IAAA;AAAA,MACA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,KAAA,KAAU,KAAK,KAAK;AAAA;AACnD,GACF;AACF;AAGO,SAAS,OAAO,MAAA,EAA0B;AAC/C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC/C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AACxC,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,KAAM,CAAA,GAAA,CACvB,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA,GAAgB,MAAA,CAAO,GAAG,CAAA,IAAgB,CAAA,GACzD,OAAO,GAAG,CAAA;AACjB;AAEA,SAAS,GAAA,CAAO,OAAY,IAAA,EAAmC;AAC7D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,KAAA,IAAS,IAAA,CAAK,IAAI,CAAA;AAC5C,EAAA,OAAO,KAAA;AACT;AC5EA,IAAM,QAAA,GAAW;AAAA,EACf,aAAA,EAAe,EAAA;AAAA,EACf,WAAA,EAAa,CAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAA;AAOO,SAAS,iBAAiB,GAAA,EAA2B;AAC1D,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,GAAA,GAAM,GAAA;AAEZ,EAAA,MAAM,QAAA,GAAW,IAAI,OAAO,CAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AACrD,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,KAAA,GAAqB,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAChD,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,CAAC,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,QAAA,GAAW,KAAK,UAAU,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAO,CAAA;AAC1B,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,WAAW,CAAA,EAAG;AACzD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,CAAC,CAAA,qCAAA,CAAuC,CAAA;AAAA,IACnE;AACA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,WAAW,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,CAAC,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAChE;AACA,IAAA,MAAM,QACJ,OAAO,IAAA,CAAK,OAAO,CAAA,KAAM,YAAY,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IACxD,IAAA,CAAK,OAAO,IACZ,CAAA,EAAG,QAAQ,IAAI,KAAK,CAAA,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,CAAA,8BAAA,CAA2B,CAAA;AAAA,IAC3E;AACA,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,MAAM,gBAAgB,WAAA,CAAY,GAAA,CAAI,eAAe,CAAA,EAAG,QAAA,CAAS,eAAe,eAAe,CAAA;AAC/F,EAAA,MAAM,cAAc,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA,EAAG,QAAA,CAAS,aAAa,aAAa,CAAA;AACvF,EAAA,MAAM,YAAY,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,EAAG,QAAA,CAAS,WAAW,WAAW,CAAA;AAE/E,EAAA,OAAO,EAAE,aAAA,EAAe,WAAA,EAAa,SAAA,EAAW,KAAA,EAAM;AACxD;AAGA,eAAsB,gBAAgBA,KAAAA,EAAoC;AACxE,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAASC,GAAA,CAAA,QAAA,CAASD,KAAAA,EAAM,MAAM,CAAA;AAAA,EACtC,SAAS,GAAA,EAAK;AAEZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4BAAA,EAA+BA,KAAI,CAAA,EAAA,EAAK,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAC1F;AAAA,EACF;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,SAAS,GAAA,EAAK;AAEZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gBAAA,EAAmBA,KAAI,CAAA,oBAAA,EAAuB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KAChG;AAAA,EACF;AACA,EAAA,OAAO,iBAAiB,MAAM,CAAA;AAChC;AAEA,SAAS,WAAA,CAAY,KAAA,EAAgB,QAAA,EAAkB,IAAA,EAAsB;AAC3E,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,QAAA;AAChC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,CAAC,OAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,IAAS,CAAA,EAAG;AACtE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,0BAAA,CAA4B,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;ACrEO,SAAS,YAAY,IAAA,EAaJ;AACtB,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,IAAS,IAAA;AAC/B,EAAA,OAAO,IAAI,OAAA,CAAoB,CAAC,OAAA,KAAY;AAC1C,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAI,QAAA,EAAU;AAIZ,QAAA,MAAM,IAAA,GAAO,CAAC,IAAA,CAAK,OAAA,EAAS,GAAG,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAClE,QAAA,KAAA,GAAQ,MAAM,IAAA,EAAM;AAAA,UAClB,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,EAAE,GAAG,QAAQ,GAAA,EAAK,GAAG,KAAK,GAAA,EAAI;AAAA,UACnC,WAAA,EAAa,IAAA;AAAA,UACb,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAA,MAAO;AAGL,QAAA,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM;AAAA,UACrC,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,EAAE,GAAG,QAAQ,GAAA,EAAK,GAAG,KAAK,GAAA,EAAI;AAAA,UACnC,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA;AAAA,QAER,QAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,QACvD,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AAEd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA,EAAG,KAAK,SAAS,CAAA;AAEjB,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACtC,MAAA,MAAA,IAAU,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACtC,MAAA,MAAA,IAAU,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,CAAC,QAAA,KAA4B;AACxC,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAA,IAAU;AAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAC1B,MAAA,IAAA,CAAK,IAAI,CAAA;AAAA,IACX,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACxC,CAAC,CAAA;AACH;AAGA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,IAAK,CAAC,KAAK,IAAA,CAAK,GAAG,GAAG,OAAO,GAAA;AAG9C,EAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA,CAAA;AACrC;AC9FO,SAAS,0BAA0B,KAAA,EAMnB;AACrB,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAExE,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU;AAAA,IAC/B,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,SAAA;AAAA,IACA,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,UAAU,KAAA,CAAM;AAAA,GACjB,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC7E,EAAA,OAAO;AAAA,IACL,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,SAAA;AAAA,IACA,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB;AAAA,GACF;AACF;AAGO,SAAS,iBAAiB,EAAA,EAAgC;AAC/D,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,WAAA,EAAc,EAAA,CAAG,UAAU,CAAA,CAAA,EAAI,CAAA,GAAA,EAAM,EAAA,CAAG,IAAI,CAAA,CAAA,EAAI,CAAA,QAAA,EAAW,EAAA,CAAG,aAAa,CAAA,CAAE,CAAA;AAC5F,EAAA,IAAI,EAAA,CAAG,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAC9B,EAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AACzB;;;AChCA,eAAsB,cAAc,IAAA,EAKX;AACvB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA;AAEvB,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY;AAAA,MAC9B,OAAA,EAAS,KAAK,YAAA,CAAa,OAAA;AAAA,MAC3B,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA;AAAA,MACxB,KAAK,IAAA,CAAK,OAAA;AAAA,MACV,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AACD,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACxB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,KAAA;AAAA,QACR,MAAA,EAAQ,CAAA,cAAA,EAAiB,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,OAC5F;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY;AAAA,IAC7B,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,IAC1B,IAAA,EAAM,KAAK,WAAA,CAAY,IAAA;AAAA,IACvB,KAAK,IAAA,CAAK,OAAA;AAAA,IACV,WAAW,IAAA,CAAK;AAAA,GACjB,CAAA;AAED,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,wBAAA,EAAyB;AAAA,EAC3D;AACA,EAAA,IAAI,IAAA,CAAK,aAAa,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,EACxB;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,KAAK,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,MAAM,CAAA,EAAE;AACzE;AAGA,SAAS,KAAK,CAAA,EAAmB;AAC/B,EAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAK;AACrB,EAAA,OAAO,KAAA,CAAM,SAAS,GAAA,GAAM,CAAA,MAAA,EAAI,MAAM,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,GAAK,KAAA;AACxD;AClCA,eAAsB,qBAAA,CACpB,MAAA,EACA,SAAA,EACA,WAAA,EACiB;AACjB,EAAA,MAASE,GAAA,CAAA,KAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1C,EAAA,MAAM,OAAY,IAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,eAAe,IAAA,CAAK,SAAS,CAAC,CAAA,MAAA,CAAQ,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAChE,EAAA,MAASA,cAAU,IAAA,EAAM,IAAA,IAAQ,IAAA,GAAO,IAAA,GAAO,KAAK,MAAM,CAAA;AAC1D,EAAA,OAAO,IAAA;AACT;AASA,eAAsB,uBAAA,CACpB,cAAA,EACA,SAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,SAAS,CAAC,CAAA;AACrD,EAAA,MAASA,GAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAASA,GAAA,CAAA,SAAA;AAAA,IACF,UAAK,GAAA,EAAK,CAAA,EAAG,KAAK,UAAA,CAAW,WAAW,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,IACrD,IAAA,CAAK,UAAU,UAAU,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAGA,eAAsB,sBAAA,CACpB,gBACA,SAAA,EAC+B;AAC/B,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,SAAS,CAAC,CAAA;AACrD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAASA,YAAQ,GAAG,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,MAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG;AACpE,IAAA,IAAI;AACF,MAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAASA,GAAA,CAAA,QAAA,CAAc,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA,EAAG,MAAM,CAAC,CAAuB,CAAA;AAAA,IAC5F,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,iBAAiB,UAAA,EAAkC;AACjE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,MAAM,OAAO,QAAA;AAClE,EAAA,MAAM,GAAA,GAAM,UAAA;AAEZ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAC,CAAA,EAAG;AACtC,IAAA,KAAA,MAAW,EAAA,IAAM,GAAA,CAAI,cAAc,CAAA,EAAG,IAAI,OAAO,EAAA,KAAO,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACjF,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzC,IAAA,IAAI,KAAK,OAAO,CAAA,KAAM,YAAa,CAAA,CAA8B,UAAU,MAAM,IAAA,EAAM;AACrF,MAAA,QAAA,CAAS,IAAI,EAAE,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,KAAK,CAAA,EAAmB;AAC/B,EAAA,OACE,CAAA,CACG,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,MAAA;AAEvB;;;ACxFA,eAAsB,kBAAkB,IAAA,EAMpB;AAClB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,WAAA;AAG1B,EAAA,MAAM,IAAA,CAAK;AAAA,IACT,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,CAAC,KAAA,EAAO,IAAI,CAAA;AAAA,IAClB,KAAK,IAAA,CAAK,OAAA;AAAA,IACV,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK;AAAA,IACtB,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,CAAC,MAAA,EAAQ,UAAA,EAAY,YAAY,CAAA;AAAA,IACvC,KAAK,IAAA,CAAK,OAAA;AAAA,IACV,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,GAAY,iBAAA,CAAkB,KAAK,SAAS,CAAA,uBAAQ,GAAA,EAAY;AAKvF,EAAA,OAAO,mBAAA;AAAA,IACL,GAAA;AAAA,IACA,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,IAAI,CAAC,CAAA,IAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,IAAK,iBAAA,CAAkB,CAAC,CAAA,IAAK,kBAAkB,CAAC;AAAA,GAC/F;AACF;AAGA,SAAS,kBAAkB,CAAA,EAAoB;AAC7C,EAAA,OAAO,MAAM,YAAA,IAAgB,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,KAAM,aAAA;AACnD;AAOO,SAAS,kBAAkB,KAAA,EAA4B;AAC5D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACpC,IAAA,MAAM,GAAA,GAAM,+BAAA,CAAgC,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,CAAC,CAAW,CAAA;AAC1B,MAAA,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,CAAC,CAAW,CAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,KAAM,WAAA,EAAa,KAAA,CAAM,GAAA,CAAI,cAAA,CAAe,KAAA,CAAM,CAAC,CAAW,CAAC,CAAA;AACnF,IAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,WAAA,EAAa,KAAA,CAAM,GAAA,CAAI,cAAA,CAAe,IAAA,CAAK,CAAC,CAAW,CAAC,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,yBAAA,CAA0B,OAAe,OAAA,EAA8B;AACrF,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,OAAO,KAAA;AAC/B,EAAA,OAAO,mBAAA,CAAoB,KAAA,EAAO,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAC9E;AAKO,SAAS,mBAAA,CACd,OACA,UAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC9B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,+BAAA,CAAgC,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,GAAW,WAAW,MAAA,CAAO,CAAC,CAAA,EAAa,MAAA,CAAO,CAAC,CAAW,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,CAAC,QAAA,EAAU,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AACtB;AAGA,SAAS,eAAe,CAAA,EAAmB;AACzC,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAI,CAAA;AAC1B,EAAA,OAAO,QAAQ,EAAA,GAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AACxC;;;AC/EA,eAAsB,cAAc,IAAA,EASX;AACvB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA;AAEvB,EAAA,MAAM,KAAA,GAAQ,MAAM,iBAAA,CAAkB;AAAA,IACpC,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,MAAM,IAAA,CAAK;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,uBAAA,CAAwB,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,KAAK,KAAA,EAAO;AAAA,IAClE,aAAa,IAAA,CAAK,UAAA;AAAA,IAClB,kBAAA,EAAoB,KAAK,IAAA,CAAK,KAAA;AAAA,IAC9B,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,IAAI,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,QAAQ,mCAAA,EAAoC;AAAA,EACpF;AAEA,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,aAAA,CAAc;AAAA,MACvC,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,KAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AACD,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAK;AAAA,IACzC;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAQ,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAM,CAAA,wDAAA;AAAA,GACzC;AACF;ACnEA,eAAsB,cAAc,IAAA,EAKf;AACnB,EAAA,MAAM,IAAA,GAAO,KAAK,OAAA,IAAY,MAAS,YAAaC,IAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,MAAA,EAAO,EAAG,eAAe,CAAC,CAAA;AACtF,EAAA,MAAS,GAAA,CAAA,KAAA,CAAM,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AACxC,EAAA,MAAM,OAAA,GAAeA,IAAA,CAAA,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,MAAM,QAAA,GAAgBA,IAAA,CAAA,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AACvC,EAAA,MAAS,GAAA,CAAA,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,EAAA,MAAS,GAAA,CAAA,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAM5C,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,KAAA,EAAO,EAAE,aAAA,EAAe,IAAA,CAAK,aAAA,EAAc;AAAA,IAC3C,OAAA,EAAS,EAAE,UAAA,EAAY,UAAA;AAAW,GACpC;AACA,EAAA,MAAS,GAAA,CAAA,SAAA,CAAeA,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,MAAM,CAAA;AAE7F,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,QAAA,EAAS;AACzC;AAMA,eAAsB,cAAA,CACpB,OAAA,EACA,WAAA,EACA,MAAA,EACA,WACA,OAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAO,GAAGC,KAAAA,CAAK,SAAS,CAAC,CAAA,EAAA,EAAKA,KAAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAChD,EAAA,MAAM,IAAA,GAAYD,IAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AAE7C,EAAA,MAAS,OAAG,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,OAAA,IAAW,EAAE,CAAA;AACxC,EAAA,MAAS,GAAA,CAAA,EAAA,CAAG,aAAa,IAAA,EAAM;AAAA,IAC7B,SAAA,EAAW,IAAA;AAAA;AAAA;AAAA,IAGX,QACE,UAAA,CAAW,IAAA,KAAS,IAChB,MAAA,GACA,CAAC,QAAQ,CAAC,GAAA,CAAI,KAAA,CAAM,OAAO,EAAE,IAAA,CAAK,CAAC,QAAQ,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC;AAAA,GACrE,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAGA,eAAsB,eAAe,OAAA,EAAiC;AAEpE,EAAA,MAAS,GAAA,CAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACnF;AAEA,SAASC,MAAK,CAAA,EAAmB;AAC/B,EAAA,OACE,CAAA,CACG,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAEvB;AChEA,eAAsB,UAAU,IAAA,EAAyC;AACvE,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,IAAA,CAAK,WAAA;AAAA,IACL,UAAA;AAAA,IACA,IAAA,CAAK,MAAA;AAAA,IACL,YAAA;AAAA,IACA,KAAK,IAAA,CAAK,QAAA;AAAA,IACV,SAAA;AAAA,IACA,KAAK,IAAA,CAAK,KAAA;AAAA,IACV,eAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,qBAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAI,IAAA,CAAK,SAAA,IAAa;AAAC,GACzB;AAEA,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY;AACtC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQC,KAAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM;AAAA,QAChC,KAAK,IAAA,CAAK,OAAA;AAAA,QACV,GAAA,EAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,GAAG,IAAA,CAAK,GAAA,EAAK,eAAA,EAAiB,IAAA,CAAK,OAAA,EAAQ;AAAA;AAAA;AAAA,QAGlE,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA;AAAA;AAAA,QAEE,OAAA,CAAQ,SAAA,EAAW,CAAA,cAAA,EAAiB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE;AAAA,OACxF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AAEd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAA,EAAG,KAAK,SAAS,CAAA;AAEjB,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACtC,MAAA,MAAA,IAAU,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACtC,MAAA,MAAA,IAAU,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB;AAE9B,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAA,CAAO,QAAQ,SAAA,EAAW,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,EAAE,CAAC,CAAA;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC/B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,SAAA;AAAA,UACR,SAAA,EAAW,IAAA;AAAA,UACX,UAAA,EAAY,CAAA;AAAA,UACZ,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,CAAA;AAAA,UACX,OAAA,EAAS,CAAA;AAAA,UACT,SAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAA,CAAO;AAAA,UACL,MAAA,EAAQ,SAAA;AAAA,UACR,SAAA,EAAW,IAAA;AAAA,UACX,UAAA,EAAY,CAAA;AAAA,UACZ,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,CAAA;AAAA,UACX,OAAA,EAAS,CAAA;AAAA,UACT,SAAA;AAAA,UACA,QAAA,EAAU;AAAA;AAAA;AAAA,SAGX,CAAA;AAED,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,MAAM,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAOA,SAAS,gBAAgB,MAAA,EAAoE;AAC3F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,CAAI,QAAQ,CAAA,KAAM,QAAA,EAAU;AACvC,IAAA,MAAM,KAAA,GAAS,GAAA,CAAI,OAAO,CAAA,IAA6C,EAAC;AACxE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAW,CAAA;AAAA,MAC/C,SAAA,EAAW,OAAO,GAAA,CAAI,WAAW,MAAM,QAAA,GAAY,GAAA,CAAI,WAAW,CAAA,GAAe,IAAA;AAAA,MACjF,UAAA,EAAY,GAAA,CAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,MACnC,QAAA,EAAU,GAAA,CAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC5B,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,MAC9B,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,MAAM,CAAC;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAgB,CAAA,EAA6B;AACpD,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,WAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AAEA,SAAS,IAAI,CAAA,EAAoB;AAC/B,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,QAAA,CAAS,CAAC,IAAI,CAAA,GAAI,CAAA;AAC3D;AAEA,SAAS,OAAA,CAAQ,WAAmB,OAAA,EAAyB;AAC3D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,CAAA;AAAA,IACZ,QAAA,EAAU,CAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,OAAA,EAAS,CAAA;AAAA,IACT,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACxB,QAAA,EAAU;AAAA,GACZ;AACF;AAQA,SAAS,SAAS,KAAA,EAA2B;AAE3C,EAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAW;AAC7B,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,SAAA,CAAU,UAAA,EAAY,CAAC,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG,IAAA,EAAM,IAAI,CAAA,EAAG,EAAE,WAAA,EAAa,MAAM,CAAA;AACpF,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,UAAA,CAAW,MAAM;AACf,IAAA,IAAI;AACF,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,GAAI,CAAA,CAAE,KAAA,EAAM;AAEjB;AAMA,eAAsB,kBAAA,CACpB,KAAA,EACA,WAAA,EACA,EAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACzC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,WAAA,EAAa,KAAA,CAAM,MAAA,IAAU,CAAC,CAAC,CAAA;AAClE,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,IAAS,YAAY;AACxD,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,CAAA,GAAI,IAAA,EAAA;AACV,MAAA,IAAI,CAAA,IAAK,MAAM,MAAA,EAAQ;AACvB,MAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAM,GAAG,KAAA,CAAM,CAAC,GAAQ,CAAC,CAAA;AAAA,IACxC;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,CAAQ,IAAI,OAAO,CAAA;AACzB,EAAA,OAAO,OAAA;AACT;AC1OA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAUD,eAAsB,gBAAgB,IAAA,EAIb;AACvB,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IACX,UAAA,EAAY,CAAA;AAAA,IACZ,gBAAA,EAAkB;AAAA,GACpB;AAEA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,cAAc,kBAAA,CAAmB;AAAA,MACrC,aAAa,IAAA,CAAK,OAAA;AAAA,MAClB,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA,CAAE,eAAA;AACH,IAAA,SAAA,GAAY,MAAM,YAAY,WAAW,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AAEvB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAASC,GAAA,CAAA,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,KAAA,EAAM;AAC3B,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,MAAM,CAAA;AACzB,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,OAAA,CAAQ,UAAA,EAAA;AACR,MAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,MAAM,CAAA,KAAM,WAAW,KAAA,CAAM,MAAM,CAAA,CAAE,WAAA,EAAY,GAAI,EAAA;AAC/E,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,SAAA,EAAA;AACR,QAAA,IAAI,KAAA,CAAM,IAAI,CAAA,KAAM,KAAA,EAAO,OAAA,CAAQ,UAAA,EAAA;AAAA,MACrC;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,KAAS,gBAAA,IAAoB,IAAA,KAAS,gBAAA,EAAkB;AACjE,MAAA,OAAA,CAAQ,gBAAA,EAAA;AAAA,IACV;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAGA,eAAe,YAAY,GAAA,EAA0C;AACnE,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAASA,YAAQ,GAAG,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAA;AACzD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEhC,EAAA,IAAI,MAAA;AACJ,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,GAAYC,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,IAAI;AACF,MAAA,MAAMC,KAAAA,GAAO,MAASF,GAAA,CAAA,IAAA,CAAK,IAAI,CAAA;AAC/B,MAAA,IAAI,CAAC,MAAA,IAAUE,KAAAA,CAAK,OAAA,GAAU,OAAO,KAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAOA,MAAK,OAAA,EAAQ;AAAA,MAC7C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,MAAA,EAAQ,IAAA;AACjB;;;ACzDA,eAAsB,aAAa,IAAA,EAAiD;AAClF,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,KAAe,MAAM;AAAA,EAAC,CAAA,CAAA;AAC5C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,KAAQ,uBAAM,IAAI,IAAA,IAAO,WAAA,EAAY,CAAA;AAExD,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,8CAAA,CAAgD,CAAA;AAAA,EACzF;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,cAAc,yBAAA,CAA0B;AAAA,IAC5C,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,IAC3B,IAAA,EAAM,IAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,QAAA;AAAA,IACE,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,EAAE,UAAU,KAAA,CAAM,MAAM,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,IAAA,EAAO,YAAY,IAAI,CAAA;AAAA,GACvG;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc;AAAA,IAClC,SAAS,IAAA,CAAK,cAAA;AAAA,IACd,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,IAC3B,IAAA,EAAM;AAAA,GACP,CAAA;AAID,EAAA,MAAM,QAAqD,EAAC;AAC5D,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,KAAA,EAAO,KAAK,MAAA,CAAO,WAAA,EAAa,OAAO,IAAA,KAAS;AACvF,MAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,IAAA;AACvB,MAAA,MAAM,UAAU,MAAM,cAAA;AAAA,QACpB,OAAA;AAAA,QACA,IAAA,CAAK,WAAA;AAAA,QACL,IAAA,CAAK,EAAA;AAAA,QACL,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU;AAAA,QAC1B,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,OAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,QACvB,KAAK,IAAA,CAAK;AAAA,OACX,CAAA;AAED,MAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,EAAE,SAAS,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA;AAEzE,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,CAAA;AAAA,MACpF,SAAS,GAAA,EAAK;AACZ,QAAA,KAAA,GAAQ;AAAA,UACN,MAAA,EAAQ,KAAA;AAAA;AAAA,UAER,MAAA,EAAQ,iBAAiB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SAC3E;AAAA,MACF;AAEA,MAAA,QAAA;AAAA,QACE,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,MAAA,EAAM,KAAK,EAAE,CAAA,QAAA,EAAM,KAAA,CAAM,MAAA,GAAS,MAAA,GAAS,MAAM,KAC1D,GAAA,CAAI,MAAM,KAAK,GAAA,CAAI,UAAU,SAAS,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OACpE;AAEA,MAAA,MAAM,MAAA,GAAqB,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,IAAA,EAAM,GAAA,EAAK,OAAO,KAAA,EAAM;AACtE,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,KAAA,CAAM,EAAA;AAAA,MAClB,YAAY,KAAA,EAAM;AAAA,MAClB,WAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,MAAM,eAAe,OAAO,CAAA;AAAA,EACrD;AACF;AClIA,eAAsB,kBAAA,CAAmB,QAAgB,MAAA,EAAoC;AAC3F,EAAA,MAASC,GAAA,CAAA,KAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAE1C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACpE,EAAA,MAASA,GAAA,CAAA,SAAA,CAAeC,UAAK,MAAA,EAAQ,eAAe,GAAG,KAAA,IAAS,KAAA,GAAQ,IAAA,GAAO,EAAA,CAAA,EAAK,MAAM,CAAA;AAE1F,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAO,MAAA,CAAO;AAAA,GAChB;AACA,EAAA,MAASD,GAAA,CAAA,SAAA,CAAeC,IAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,cAAc,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,MAAM,CAAA;AAChG;AAGA,eAAsB,YACpB,MAAA,EAC8E;AAC9E,EAAA,MAAM,MAAM,MAASD,GAAA,CAAA,QAAA,CAAcC,UAAK,MAAA,EAAQ,cAAc,GAAG,MAAM,CAAA;AACvE,EAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB;;;ACzBO,SAAS,qBACd,MAAA,EACQ;AACR,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,OAAM,GAAI,MAAA;AAClD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,8BAAA,EAA4B,KAAK,CAAA,CAAE,CAAA;AAC9C,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,gBAAA,CAAiB,WAAW,CAAC,CAAA,CAAE,CAAA;AAC1D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAE,CAAA;AACxC,EAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,CAAC,CAAA,EAAG,SAAA,IAAa,CAAC,CAAA,CAAE,CAAA;AACxD,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ;AAAA,GAEF;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAQ,CAAA;AAEhE,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ;AAAA,GACF;AACA,EAAA,KAAA,CAAM,KAAK,+CAA+C,CAAA;AAC1D,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EACzB;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,qBAAA,EAAwB,YAAY,IAAI,CAAA,eAAA,EAAe,YAAY,SAAA,CAAU,MAAM,CAAA,gBAAA,EAAgB,WAAA,CAAY,QAAQ,CAAA,GAAA;AAAA,GACzH;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,UAAU,CAAA,EAAuB;AAGxC,EAAA,MAAM,QAAA,GACJ,EAAE,WAAA,KAAgB,CAAA,GACd,WACA,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,SAAA,GAChB,CAAA,EAAG,GAAA,CAAI,EAAE,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,WAAW,CAAA,CAAA,EAAI,EAAE,SAAS,CAAA,CAAA,CAAA,GACnD,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA;AACtB,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,EAAE,IAAA,CAAK,KAAA;AAAA,IACP,QAAA;AAAA,IACA,GAAA,CAAI,EAAE,aAAa,CAAA;AAAA,IACnB,CAAA,CAAA,EAAI,CAAA,CAAE,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,IAC3B,CAAA,EAAG,KAAK,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,YAAY,CAAC,CAAA,CAAA;AAAA,IAC9C,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,IAClC,KAAA,CAAM,EAAE,YAAY,CAAA;AAAA,IACpB,GAAA,CAAI,EAAE,WAAW,CAAA;AAAA,IACjB,MAAA,CAAO,EAAE,qBAAqB,CAAA;AAAA,IAC9B;AAAA,GACF,CACG,IAAA,CAAK,KAAK,CAAA,CACV,IAAA,EAAK;AACV;AAEA,SAAS,IAAI,CAAA,EAAmB;AAC9B,EAAA,OAAO,CAAA,EAAA,CAAI,CAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAChC;AAEA,SAAS,KAAK,CAAA,EAAmB;AAC/B,EAAA,IAAI,CAAA,IAAK,KAAM,OAAO,CAAA,EAAA,CAAI,IAAI,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC9C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B;AAEA,SAAS,MAAM,EAAA,EAAoB;AACjC,EAAA,IAAI,EAAA,IAAM,KAAM,OAAO,CAAA,EAAA,CAAI,KAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA,CAAA;AAC1B;AAGO,SAAS,iBAAiB,EAAA,EAAgC;AAC/D,EAAA,OAAO,iBAAiB,EAAE,CAAA;AAC5B;ACvDA,IAAM,gBAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ;AAAA,IACN,GAAA,EAAK,QAAA;AAAA,IACL,IAAA,EAAM,CAAC,KAAA,MAAW,EAAE,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,CAAC,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,GAAG,KAAK,CAAA,EAAE;AAAA,GAChF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,GAAA,EAAK,YAAA;AAAA,IACL,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAM,CAAC,SAAA,EAAW,YAAA,EAAc,WAAW,CAAA,EAAE;AAAA,IACtE,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,OAAO,IAAA,EAAM,CAAC,MAAM,CAAA,EAAE;AAAA,GAChD;AAAA,EACA,EAAA,EAAI;AAAA,IACF,GAAA,EAAK,IAAA;AAAA,IACL,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,MAAM,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,GACxD;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,MAAA;AAAA,IACL,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,MAAM,CAAC,MAAA,EAAQ,IAAA,EAAM,mBAAmB,CAAA,EAAE;AAAA,GAC7E;AAAA,EACA,GAAA,EAAK;AAAA,IACH,GAAA,EAAK,KAAA;AAAA,IACL,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,CAAC,SAAA,EAAW,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,GAClF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,MAAA;AAAA,IACL,IAAA,EAAM,OAAO,EAAE,OAAA,EAAS,aAAa,IAAA,EAAM,CAAC,MAAM,CAAA,EAAE;AAAA;AAExD;AAWO,SAAS,oBAAoB,IAAA,EAKrB;AACb,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,UAAA;AAAA,IACJ,MAAM,SAAA,CAAU,EAAE,KAAA,EAAM,EAAG;AACzB,MAAA,MAAM,QAAqB,EAAC;AAC5B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,IAAa,MAAA,CAAO,KAAK,gBAAgB,CAAA;AAC5D,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,MAAA,GAAS,iBAAiB,IAAI,CAAA;AACpC,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,cAAmBC,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAa,MAAA,CAAO,GAAA,EAAK,aAAa,UAAU,CAAA;AACnF,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI;AACF,UAAA,KAAA,GAAA,CAAS,MAASC,GAAA,CAAA,OAAA,CAAQ,WAAA,EAAa,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAC3D,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,CAC7B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,QACtC,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,KAAA,MAAWR,SAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,WAAA,GAAmBO,IAAA,CAAA,IAAA,CAAK,WAAA,EAAaP,KAAI,CAAA;AAC/C,UAAA,MAAM,OAAO,MAAM,YAAA,CAAa,WAAA,EAAa,IAAA,EAAM,QAAQA,KAAI,CAAA;AAC/D,UAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACzB,UAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,MAAA,IAAU,OAAO,OAAO,KAAA;AAAA,QAC3D;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,SAAS,KAAA,EAAO;AAEd,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACpE,MAAA,OAAO,YAAYS,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IAC3F;AAAA,GACF;AACF;AAEA,eAAe,YAAA,CACb,WAAA,EACA,QAAA,EACA,MAAA,EACAT,KAAAA,EACgC;AAEhC,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAASQ,GAAA,CAAA,QAAA,CAAcD,IAAA,CAAA,IAAA,CAAK,aAAa,OAAA,EAAS,aAAa,GAAG,MAAM,CAAA;AACpF,IAAA,QAAA,GAAW,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,EAAO,QAAA,IAAY,EAAC;AACnD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,IAAA,IAAQ,EAAC;AAC3C,EAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEvC,EAAA,MAAM,YAAA,GAAe,MAAM,gBAAA,CAAiB,WAAW,CAAA;AAEvD,EAAA,MAAM,IAAA,GAAqB;AAAA,IACzB,QAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IAClC,cAAc,MAAA,CAAO;AAAA,GACvB;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,EAAIP,KAAI,CAAA,CAAA;AAAA,IAChC,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,WAAA,CAAY,YAAA,EAAc,aAAA,EAAe,SAAS,CAAA;AAAA,IAC1D,WAAA,EAAa,WAAA;AAAA;AAAA,IAEb,eAAA,EAAiB,CAAC,OAAO,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAEA,eAAe,iBAAiB,WAAA,EAAsC;AACpE,EAAA,MAAM,IAAA,GAAYO,IAAA,CAAA,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAC3C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,wBAAwB,CAAA,EAAG;AACnF,IAAA,IAAI;AACF,MAAA,KAAA,CAAM,IAAA,CAAA,CAAM,MAASC,GAAA,CAAA,QAAA,CAAcD,IAAA,CAAA,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA;AAAA,IACtE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAC1C;AAEA,SAAS,WAAA,CAAY,YAAA,EAAsB,aAAA,EAAyB,SAAA,EAA6B;AAC/F,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,EAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,CAAA,0DAAA,EAA6D,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACrF,SAAA,CAAU,SAAS,CAAA,GACf,CAAA,gBAAA,EAAmB,UAAU,IAAA,CAAK,IAAI,CAAC,CAAA,uFAAA,CAAA,GACvC,qDAAA;AAAA,IACJ;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;ACnIA,IAAM,WAAA,GAAc,4BAAA;AAQpB,eAAe,oBAAA,GAAwC;AACrD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,aAAA,CAAc,IAAI,GAAA,CAAI,CAAA,WAAA,EAAc,WAAW,CAAA,CAAA,EAAI,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAAA,IACnE,aAAA,CAAc,IAAI,GAAA,CAAI,CAAA,cAAA,EAAiB,WAAW,CAAA,CAAA,EAAI,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC;AAAA,GACxE;AACA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI;AACF,MAAA,MAASG,WAAO,CAAC,CAAA;AACjB,MAAA,OAAO,CAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,WAAW,CAAC,CAAA;AACrB;AAGA,eAAsB,WAAW,UAAA,EAAwC;AACvE,EAAA,MAAM,IAAA,GAAO,UAAA,IAAe,MAAM,oBAAA,EAAqB;AACvD,EAAA,MAAM,GAAA,GAAM,MAASA,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,CAAA,gCAAA,CAAkC,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAO,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAQ,CAAA;AAC1E;AAEO,SAAS,mBAAA,CAAoB,IAAA,GAAwB,EAAC,EAAe;AAC1E,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,UAAA;AAAA,IACJ,MAAM,SAAA,CAAU,EAAE,KAAA,EAAM,EAAG;AACzB,MAAA,MAAM,WAAA,GAAc,MAAM,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAKpD,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;AAAA;AAAA,mBAAA,EAGwB,YAAY,MAAM,CAAA,8IAAA;AAAA,SAG5C;AAAA,MACF;AAEA,MAAA,MAAM,QAAqB,EAAC;AAC5B,MAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,QAAA,MAAM,WAAA,GAAmBC,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,EAAE,CAAA;AACjD,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,IAAA,CAAK,MAAM,MAASD,GAAA,CAAA,QAAA,CAAcC,UAAK,WAAA,EAAa,eAAe,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,QACtF,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAuB;AAAA,UAC3B,UAAA,EAAY,EAAA;AAAA,UACZ,WAAA;AAAA,UACA,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,UACnB,UAAA,EAAa,IAAA,CAAK,cAAc,CAAA,IAA8B,EAAC;AAAA,UAC/D,UAAA,EAAa,IAAA,CAAK,cAAc,CAAA,IAA8B,EAAC;AAAA,UAC/D,SAAA,EAAW,KAAK,YAAY;AAAA,SAC9B;AACA,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,EAAA,EAAI,YAAY,EAAE,CAAA,CAAA;AAAA,UAClB,KAAA,EAAO,UAAA;AAAA,UACP,MAAA,EAAQC,YAAAA;AAAA,YACN,OAAO,IAAA,CAAK,iBAAA,KAAsB,QAAA,GAAW,KAAK,iBAAA,GAAoB;AAAA,WACxE;AAAA,UACA,WAAA,EAAkBD,IAAA,CAAA,IAAA,CAAK,WAAA,EAAa,MAAM,CAAA;AAAA,UAC1C,IAAA,EAAM;AAAA,SACP,CAAA;AACD,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,MAAA,IAAU,KAAA,EAAO;AAAA,MACpD;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACpE,MAAA,OAAO,YAAYF,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IAC3F;AAAA,GACF;AACF;AAEA,SAASG,aAAY,gBAAA,EAAkC;AACrD,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,EAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,yFAAA;AAAA,IACA,yFAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb","file":"index.js","sourcesContent":["import type { CellResult, ModelCell, TaskResult } from './types.js';\n\n/**\n * Fold every per-(task × cell) result for ONE cell into its leaderboard row.\n * All metrics are derived from deterministic signals (grader pass/fail, the\n * `--output-json` usage block, and session-log tool counts) — nothing here\n * consults a model.\n */\nexport function aggregateCell(cell: ModelCell, results: TaskResult[]): CellResult {\n const taskCount = results.length;\n if (taskCount === 0) {\n return {\n cell,\n taskCount: 0,\n gradedCount: 0,\n passRate: 0,\n editApplyRate: 1,\n avgCostUsd: 0,\n avgTokensIn: 0,\n avgTokensOut: 0,\n p50Iterations: 0,\n p50ElapsedMs: 0,\n timeoutRate: 0,\n totalRateLimitRetries: 0,\n };\n }\n\n // Only count rows that produced an actual verdict — exported-but-ungraded\n // SWE-bench rows (graded === false) must not deflate the pass rate.\n const graded = results.filter((r) => r.grade.graded !== false);\n const passed = graded.filter((r) => r.grade.passed).length;\n const timeouts = results.filter((r) => r.run.status === 'timeout').length;\n\n const editCalls = sum(results, (r) => r.tools.editCalls);\n const editErrors = sum(results, (r) => r.tools.editErrors);\n // Edit-apply rate is undefined when no edit was ever attempted; report 1\n // (nothing failed to apply) so a no-op run doesn't drag the column down.\n const editApplyRate = editCalls === 0 ? 1 : (editCalls - editErrors) / editCalls;\n\n return {\n cell,\n taskCount,\n gradedCount: graded.length,\n passRate: graded.length === 0 ? 0 : passed / graded.length,\n editApplyRate,\n avgCostUsd: sum(results, (r) => r.run.costUsd) / taskCount,\n avgTokensIn: sum(results, (r) => r.run.tokensIn) / taskCount,\n avgTokensOut: sum(results, (r) => r.run.tokensOut) / taskCount,\n p50Iterations: median(results.map((r) => r.run.iterations)),\n p50ElapsedMs: median(results.map((r) => r.run.elapsedMs)),\n timeoutRate: timeouts / taskCount,\n totalRateLimitRetries: sum(results, (r) => r.tools.rateLimitRetries),\n };\n}\n\n/** Group all results by cell label and aggregate each group. */\nexport function aggregateAll(cells: ModelCell[], results: TaskResult[]): CellResult[] {\n return cells.map((cell) =>\n aggregateCell(\n cell,\n results.filter((r) => r.cell.label === cell.label),\n ),\n );\n}\n\n/** Median of a numeric array (0 for empty). Exported for tests. */\nexport function median(values: number[]): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0\n ? ((sorted[mid - 1] as number) + (sorted[mid] as number)) / 2\n : (sorted[mid] as number);\n}\n\nfunction sum<T>(items: T[], pick: (item: T) => number): number {\n let total = 0;\n for (const item of items) total += pick(item);\n return total;\n}\n","import * as fs from 'node:fs/promises';\nimport type { BenchConfig, ModelCell } from './types.js';\n\nconst DEFAULTS = {\n maxIterations: 40,\n concurrency: 4,\n timeoutMs: 600_000,\n} as const;\n\n/**\n * Parse and validate a raw `bench.config.json` object. Throws a descriptive\n * Error on any structural problem so the CLI can surface it cleanly instead of\n * failing deep inside the runner.\n */\nexport function parseBenchConfig(raw: unknown): BenchConfig {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('bench config must be a JSON object');\n }\n const obj = raw as Record<string, unknown>;\n\n const cellsRaw = obj['cells'];\n if (!Array.isArray(cellsRaw) || cellsRaw.length === 0) {\n throw new Error('bench config \"cells\" must be a non-empty array');\n }\n\n const seen = new Set<string>();\n const cells: ModelCell[] = cellsRaw.map((c, i) => {\n if (typeof c !== 'object' || c === null) {\n throw new Error(`cells[${i}] must be an object`);\n }\n const cell = c as Record<string, unknown>;\n const provider = cell['provider'];\n const model = cell['model'];\n if (typeof provider !== 'string' || provider.length === 0) {\n throw new Error(`cells[${i}].provider must be a non-empty string`);\n }\n if (typeof model !== 'string' || model.length === 0) {\n throw new Error(`cells[${i}].model must be a non-empty string`);\n }\n const label =\n typeof cell['label'] === 'string' && cell['label'].length > 0\n ? cell['label']\n : `${provider}/${model}`;\n if (seen.has(label)) {\n throw new Error(`duplicate cell label \"${label}\" — labels must be unique`);\n }\n seen.add(label);\n return { label, provider, model };\n });\n\n const maxIterations = positiveInt(obj['maxIterations'], DEFAULTS.maxIterations, 'maxIterations');\n const concurrency = positiveInt(obj['concurrency'], DEFAULTS.concurrency, 'concurrency');\n const timeoutMs = positiveInt(obj['timeoutMs'], DEFAULTS.timeoutMs, 'timeoutMs');\n\n return { maxIterations, concurrency, timeoutMs, cells };\n}\n\n/** Load and validate a `bench.config.json` from disk. */\nexport async function loadBenchConfig(path: string): Promise<BenchConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(path, 'utf8');\n } catch (err) {\n /* v8 ignore next 2 -- readFile rejects with an Error; the String(err) branch is defensive. */\n throw new Error(\n `cannot read bench config at ${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n /* v8 ignore next 2 -- JSON.parse throws a SyntaxError; the String(err) branch is defensive. */\n throw new Error(\n `bench config at ${path} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return parseBenchConfig(parsed);\n}\n\nfunction positiveInt(value: unknown, fallback: number, name: string): number {\n if (value === undefined) return fallback;\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a positive number`);\n }\n return Math.floor(value);\n}\n","import { spawn } from 'node:child_process';\n\nexport interface ExecResult {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n}\n\n/**\n * Run a command (argv form) in a directory and capture its result. Used by the\n * deterministic graders to run a suite's own test command — the run's exit code\n * is the pass/fail signal, no LLM involved.\n *\n * Never rejects; a spawn failure surfaces as exitCode null with the error on\n * stderr.\n */\nexport function execCommand(opts: {\n command: string;\n args: string[];\n cwd: string;\n timeoutMs: number;\n env?: NodeJS.ProcessEnv | undefined;\n /**\n * Run through a shell. Needed for launchers that resolve platform wrappers\n * (`npm` → npm.cmd on Windows, `./gradlew`). Defaults to true. Pass false for\n * real executables (git, python, node, cargo, go) to avoid the shell entirely\n * — no metacharacter interpretation, no DEP0190, no injection surface.\n */\n shell?: boolean | undefined;\n}): Promise<ExecResult> {\n const useShell = opts.shell ?? true;\n return new Promise<ExecResult>((resolve) => {\n let child: ReturnType<typeof spawn>;\n try {\n if (useShell) {\n // Build a SINGLE command string rather than passing an args array with\n // `shell:true` — the latter triggers Node's DEP0190 warning and does\n // not escape the args anyway. Trusted, benchmark-defined commands only.\n const line = [opts.command, ...opts.args.map(shellQuote)].join(' ');\n child = spawn(line, {\n cwd: opts.cwd,\n env: { ...process.env, ...opts.env },\n windowsHide: true,\n shell: true,\n });\n } else {\n // No shell: args are passed verbatim to the program, so nothing in them\n // is interpreted. Preferred for git/python/etc.\n child = spawn(opts.command, opts.args, {\n cwd: opts.cwd,\n env: { ...process.env, ...opts.env },\n windowsHide: true,\n });\n }\n } catch (err) {\n resolve({\n exitCode: null,\n stdout: '',\n /* v8 ignore next -- spawn throws Error subclasses; the String(err) branch is defensive. */\n stderr: err instanceof Error ? err.message : String(err),\n timedOut: false,\n });\n return;\n }\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n child.kill('SIGKILL');\n } catch {\n /* already gone */\n }\n }, opts.timeoutMs);\n\n child.stdout?.on('data', (d: Buffer) => {\n stdout += d.toString('utf8');\n });\n child.stderr?.on('data', (d: Buffer) => {\n stderr += d.toString('utf8');\n });\n\n const done = (exitCode: number | null) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({ exitCode, stdout, stderr, timedOut });\n };\n\n child.on('error', (err) => {\n stderr += `\\n${err.message}`;\n done(null);\n });\n child.on('close', (code) => done(code));\n });\n}\n\n/** Quote a single arg for the shell only when it contains whitespace. */\nfunction shellQuote(arg: string): string {\n if (arg.length > 0 && !/\\s/.test(arg)) return arg;\n // Wrap in double quotes and escape any embedded double quotes. Sufficient for\n // the benchmark's own test commands (no untrusted shell metacharacters).\n return `\"${arg.replace(/\"/g, '\\\\\"')}\"`;\n}\n","import { createHash } from 'node:crypto';\nimport type { HarnessFingerprint } from './types.js';\n\n/**\n * Compute the harness fingerprint. This is what makes a report\n * \"model-independent\": every cell in a run shares one fingerprint, so the only\n * thing that varies across leaderboard rows is the model. Change the CLI\n * version, the tool roster, the iteration cap, the yolo flag, or the task\n * subset and the hash changes — which is exactly when old numbers stop being\n * comparable.\n *\n * The hash is intentionally cheap and reproducible: no timestamps, no random\n * salt. Same inputs → same hash, on any machine.\n */\nexport function computeHarnessFingerprint(input: {\n cliVersion: string;\n toolNames: string[];\n maxIterations: number;\n yolo: boolean;\n subsetId: string;\n}): HarnessFingerprint {\n const toolNames = [...input.toolNames].sort((a, b) => a.localeCompare(b));\n // Canonical, order-stable serialization of every field that affects results.\n const canonical = JSON.stringify({\n cliVersion: input.cliVersion,\n toolNames,\n maxIterations: input.maxIterations,\n yolo: input.yolo,\n subsetId: input.subsetId,\n });\n const hash = createHash('sha256').update(canonical).digest('hex').slice(0, 12);\n return {\n cliVersion: input.cliVersion,\n toolNames,\n maxIterations: input.maxIterations,\n yolo: input.yolo,\n subsetId: input.subsetId,\n hash,\n };\n}\n\n/** One-line human label for report headers: `wrongstack@0.255 · fp:a3f9c7 · maxIter=40 · yolo`. */\nexport function fingerprintLabel(fp: HarnessFingerprint): string {\n const parts = [`wrongstack@${fp.cliVersion}`, `fp:${fp.hash}`, `maxIter=${fp.maxIterations}`];\n if (fp.yolo) parts.push('yolo');\n return parts.join(' · ');\n}\n","import { execCommand } from '../exec-command.js';\nimport type { PolyglotMeta } from '../suites/polyglot.js';\nimport type { BenchTask, GradeResult } from '../types.js';\n\n/**\n * Deterministic polyglot grader: run the exercise's own test command in the\n * finished workdir. Exit code 0 → passed. No LLM, no judgement — this is the\n * invariant that keeps the report model-independent.\n *\n * For languages with a dependency-install step (JS `npm install`, etc.) the\n * setup command runs first; if setup fails the task is graded as not-passed\n * with the setup error as detail (it cannot be the model's fault, but the run\n * is genuinely ungradeable, so it counts as a fail rather than crashing).\n */\nexport async function gradePolyglot(opts: {\n workdir: string;\n task: BenchTask;\n /** Per-step timeout for setup/test commands. */\n timeoutMs: number;\n}): Promise<GradeResult> {\n const meta = opts.task.meta as unknown as PolyglotMeta;\n\n if (meta.setupCommand) {\n const setup = await execCommand({\n command: meta.setupCommand.command,\n args: meta.setupCommand.args,\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n });\n if (setup.exitCode !== 0) {\n return {\n passed: false,\n detail: `setup failed (${meta.setupCommand.command}): ${tail(setup.stderr || setup.stdout)}`,\n };\n }\n }\n\n const test = await execCommand({\n command: meta.testCommand.command,\n args: meta.testCommand.args,\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n });\n\n if (test.timedOut) {\n return { passed: false, detail: 'test command timed out' };\n }\n if (test.exitCode === 0) {\n return { passed: true };\n }\n return { passed: false, detail: tail(test.stdout + '\\n' + test.stderr) };\n}\n\n/** Last ~500 chars of output — enough to see the failing assertion. */\nfunction tail(s: string): string {\n const clean = s.trim();\n return clean.length > 500 ? `…${clean.slice(-500)}` : clean;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * One SWE-bench prediction row, in the exact shape the official harness\n * (`princeton-nlp/SWE-bench`) consumes via `--predictions_path`.\n */\nexport interface SwebenchPrediction {\n instance_id: string;\n /** The model/system label — becomes a column in the official report. */\n model_name_or_path: string;\n /** The unified diff the agent produced. */\n model_patch: string;\n}\n\n/**\n * Write a `predictions.jsonl` for one model cell. SWE-bench grading is delegated\n * to the canonical, version-sensitive harness rather than re-implemented here:\n * we own running the agent and producing a conformant patch; the official tool\n * owns the Docker execution and pass/fail verdict.\n *\n * Returns the file path written.\n */\nexport async function writePredictionsJsonl(\n outDir: string,\n cellLabel: string,\n predictions: SwebenchPrediction[],\n): Promise<string> {\n await fs.mkdir(outDir, { recursive: true });\n const file = path.join(outDir, `predictions-${slug(cellLabel)}.jsonl`);\n const body = predictions.map((p) => JSON.stringify(p)).join('\\n');\n await fs.writeFile(file, body + (body ? '\\n' : ''), 'utf8');\n return file;\n}\n\n/**\n * Write one instance's prediction to its own file under\n * `<predictionsDir>/<cell>/<instance>.json`. Distinct files per instance are\n * concurrency-safe — the SWE-bench grader runs inside the orchestrator's\n * parallel fan-out, so appending to a shared jsonl would race. Call\n * {@link collectCellPredictions} after the run to merge them.\n */\nexport async function writeInstancePrediction(\n predictionsDir: string,\n cellLabel: string,\n prediction: SwebenchPrediction,\n): Promise<void> {\n const dir = path.join(predictionsDir, slug(cellLabel));\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(\n path.join(dir, `${slug(prediction.instance_id)}.json`),\n JSON.stringify(prediction),\n 'utf8',\n );\n}\n\n/** Read back every per-instance prediction written for one cell. */\nexport async function collectCellPredictions(\n predictionsDir: string,\n cellLabel: string,\n): Promise<SwebenchPrediction[]> {\n const dir = path.join(predictionsDir, slug(cellLabel));\n let entries: string[];\n try {\n entries = await fs.readdir(dir);\n } catch {\n return [];\n }\n const out: SwebenchPrediction[] = [];\n for (const name of entries.filter((e) => e.endsWith('.json')).sort()) {\n try {\n out.push(JSON.parse(await fs.readFile(path.join(dir, name), 'utf8')) as SwebenchPrediction);\n } catch {\n // skip unreadable\n }\n }\n return out;\n}\n\n/**\n * Parse an official SWE-bench evaluation report JSON for the set of resolved\n * instance ids. The harness writes `resolved_ids` (newer) or a per-instance\n * `{ resolved: bool }` map; both shapes are handled so this keeps working across\n * harness versions.\n */\nexport function parseResolvedIds(reportJson: unknown): Set<string> {\n const resolved = new Set<string>();\n if (typeof reportJson !== 'object' || reportJson === null) return resolved;\n const obj = reportJson as Record<string, unknown>;\n\n if (Array.isArray(obj['resolved_ids'])) {\n for (const id of obj['resolved_ids']) if (typeof id === 'string') resolved.add(id);\n return resolved;\n }\n\n // Per-instance map fallback: { \"<id>\": { resolved: true }, ... }.\n for (const [id, v] of Object.entries(obj)) {\n if (v && typeof v === 'object' && (v as Record<string, unknown>)['resolved'] === true) {\n resolved.add(id);\n }\n }\n return resolved;\n}\n\nfunction slug(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60) || 'cell'\n );\n}\n","import { type ExecResult, execCommand } from '../exec-command.js';\n\n/** Injectable command runner (defaults to execCommand) for testability. */\nexport type Exec = (opts: {\n command: string;\n args: string[];\n cwd: string;\n timeoutMs: number;\n shell?: boolean | undefined;\n}) => Promise<ExecResult>;\n\n/**\n * Extract the model's patch from a finished SWE-bench workdir.\n *\n * The workdir is a git checkout at the instance's base commit; the agent's\n * edits are uncommitted. `git add -A` stages new/modified/deleted files, then\n * `git diff --cached` produces a unified diff in the exact form the official\n * SWE-bench harness expects as `model_patch`.\n *\n * Changes to files touched by the held-out `test_patch` are stripped: the\n * harness applies the model patch and then the test patch, and the agent is\n * told not to edit tests — dropping those sections keeps the model patch from\n * conflicting with (or sneaking changes into) the graded tests.\n */\nexport async function extractModelPatch(opts: {\n workdir: string;\n /** The instance's held-out test patch, used to exclude test-file edits. */\n testPatch?: string | undefined;\n timeoutMs: number;\n exec?: Exec | undefined;\n}): Promise<string> {\n const exec = opts.exec ?? execCommand;\n // git is a real executable — no shell needed, so nothing in the (controlled)\n // args is ever interpreted.\n await exec({\n command: 'git',\n args: ['add', '-A'],\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n shell: false,\n });\n const diff = await exec({\n command: 'git',\n args: ['diff', '--cached', '--no-color'],\n cwd: opts.workdir,\n timeoutMs: opts.timeoutMs,\n shell: false,\n });\n const raw = diff.stdout;\n const testPaths = opts.testPatch ? extractPatchPaths(opts.testPatch) : new Set<string>();\n // Always drop two kinds of sections: (1) edits to the held-out test files,\n // and (2) harness bookkeeping the wstack subprocess writes into the checkout\n // (the `.gitignore` `.wrongstack/` line and any `.wrongstack/` dir) — neither\n // is part of the model's fix, and both would corrupt a SWE-bench prediction.\n return filterPatchSections(\n raw,\n (a, b) => testPaths.has(a) || testPaths.has(b) || isHarnessArtifact(a) || isHarnessArtifact(b),\n );\n}\n\n/** True for paths the wstack harness itself creates/edits in the checkout. */\nfunction isHarnessArtifact(p: string): boolean {\n return p === '.gitignore' || p.split('/')[0] === '.wrongstack';\n}\n\n/**\n * Collect the file paths a unified diff touches. Reads both the\n * `diff --git a/<p> b/<p>` header and the `+++ b/<p>` / `--- a/<p>` lines so it\n * works on patches produced by git or by `diff -u`.\n */\nexport function extractPatchPaths(patch: string): Set<string> {\n const paths = new Set<string>();\n for (const line of patch.split('\\n')) {\n const git = /^diff --git a\\/(.+?) b\\/(.+)$/.exec(line);\n if (git) {\n paths.add(git[1] as string);\n paths.add(git[2] as string);\n continue;\n }\n const minus = /^--- (?:a\\/)?(.+)$/.exec(line);\n if (minus && minus[1] !== '/dev/null') paths.add(stripTimestamp(minus[1] as string));\n const plus = /^\\+\\+\\+ (?:b\\/)?(.+)$/.exec(line);\n if (plus && plus[1] !== '/dev/null') paths.add(stripTimestamp(plus[1] as string));\n }\n return paths;\n}\n\n/**\n * Drop every per-file section of `patch` whose target path is in `exclude`.\n * Sections are delimited by `diff --git` headers (git's format).\n */\nexport function filterPatchExcludingPaths(patch: string, exclude: Set<string>): string {\n if (exclude.size === 0) return patch;\n return filterPatchSections(patch, (a, b) => exclude.has(a) || exclude.has(b));\n}\n\n/**\n * Drop each `diff --git` section for which `shouldDrop(aPath, bPath)` is true.\n */\nexport function filterPatchSections(\n patch: string,\n shouldDrop: (aPath: string, bPath: string) => boolean,\n): string {\n const lines = patch.split('\\n');\n const out: string[] = [];\n let skipping = false;\n for (const line of lines) {\n const header = /^diff --git a\\/(.+?) b\\/(.+)$/.exec(line);\n if (header) {\n skipping = shouldDrop(header[1] as string, header[2] as string);\n }\n if (!skipping) out.push(line);\n }\n return out.join('\\n');\n}\n\n/** Strip a trailing tab+timestamp some diff tools append to `+++`/`---` paths. */\nfunction stripTimestamp(p: string): string {\n const tab = p.indexOf('\\t');\n return tab === -1 ? p : p.slice(0, tab);\n}\n","import { writeInstancePrediction } from '../report/predictions.js';\nimport type { SwebenchMeta } from '../suites/swebench.js';\nimport { type Exec, extractModelPatch } from '../suites/swebench-patch.js';\nimport type { BenchTask, GradeResult, ModelCell } from '../types.js';\n\n/**\n * Inline (Docker) grader hook. Given an instance's model patch and held-out\n * test data, return whether the issue is resolved — or `undefined` if it could\n * not produce a verdict. Left injectable so the heavy, version-sensitive Docker\n * execution is plugged in by the host (the official SWE-bench harness) rather\n * than re-implemented and guessed-at here.\n */\nexport type SwebenchExternalGrade = (args: {\n instanceId: string;\n patch: string;\n image?: string | undefined;\n failToPass: string[];\n passToPass: string[];\n testPatch?: string | undefined;\n workdir: string;\n timeoutMs: number;\n}) => Promise<boolean | undefined>;\n\n/**\n * SWE-bench grader.\n *\n * Resolution is decided deterministically by the instance's own tests\n * (`FAIL_TO_PASS` must pass, `PASS_TO_PASS` must still pass) inside its pinned\n * Docker image — never an LLM. We do NOT re-implement that Docker evaluation\n * (the official `princeton-nlp/SWE-bench` harness owns it and it is version\n * sensitive). Instead this grader:\n *\n * 1. Extracts the model patch from the finished workdir (`git diff`),\n * excluding any edits to the held-out test files.\n * 2. Writes a conformant per-instance prediction so the run can be graded by\n * the official harness (`--predictions_path`).\n * 3. If an inline grader is supplied (Docker available), runs it and returns a\n * real pass/fail verdict; otherwise marks the row \"exported, ungraded\"\n * (graded:false) so it is excluded from pass@1 rather than counted as a\n * failure.\n */\nexport async function gradeSwebench(opts: {\n workdir: string;\n task: BenchTask;\n cell: ModelCell;\n timeoutMs: number;\n /** Where per-instance prediction files are written. */\n predictionsDir: string;\n exec?: Exec | undefined;\n externalGrade?: SwebenchExternalGrade | undefined;\n}): Promise<GradeResult> {\n const meta = opts.task.meta as unknown as SwebenchMeta;\n\n const patch = await extractModelPatch({\n workdir: opts.workdir,\n testPatch: meta.testPatch,\n timeoutMs: opts.timeoutMs,\n exec: opts.exec,\n });\n\n await writeInstancePrediction(opts.predictionsDir, opts.cell.label, {\n instance_id: meta.instanceId,\n model_name_or_path: opts.cell.label,\n model_patch: patch,\n });\n\n // An empty patch resolves nothing — that is a genuine, gradeable failure.\n if (patch.trim().length === 0) {\n return { passed: false, graded: true, detail: 'empty patch (agent made no edits)' };\n }\n\n if (opts.externalGrade) {\n const verdict = await opts.externalGrade({\n instanceId: meta.instanceId,\n patch,\n image: meta.image,\n failToPass: meta.failToPass,\n passToPass: meta.passToPass,\n testPatch: meta.testPatch,\n workdir: opts.workdir,\n timeoutMs: opts.timeoutMs,\n });\n if (verdict !== undefined) {\n return { passed: verdict, graded: true };\n }\n }\n\n // No inline grading available — the patch is exported for the official harness.\n return {\n passed: false,\n graded: false,\n detail: `patch exported (${patch.length} bytes) — grade with the official SWE-bench harness`,\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Per-run isolation. Each benchmark run gets one sandbox directory tree:\n *\n * <sandbox>/\n * home/ → isolated WRONGSTACK_HOME (config seed + all session JSONL)\n * work/<id>/ → one copy of a task template per (task × cell)\n *\n * The isolated home keeps the bench off the developer's real ~/.wrongstack\n * (config, sessions, models cache). Each task workdir hashes to its own\n * project slug under home/projects/, so concurrent runs never share a session\n * file even though they share one home.\n */\nexport interface Sandbox {\n /** Root sandbox dir. */\n root: string;\n /** Isolated WRONGSTACK_HOME. */\n homeDir: string;\n /** Directory that holds per-task workdirs. */\n workRoot: string;\n}\n\n/** Create the sandbox tree and seed the isolated home's config.json. */\nexport async function createSandbox(opts: {\n /** Where to create the sandbox. Defaults to an OS temp dir. */\n baseDir?: string | undefined;\n maxIterations: number;\n yolo: boolean;\n}): Promise<Sandbox> {\n const base = opts.baseDir ?? (await fs.mkdtemp(path.join(os.tmpdir(), 'wstack-bench-')));\n await fs.mkdir(base, { recursive: true });\n const homeDir = path.join(base, 'home');\n const workRoot = path.join(base, 'work');\n await fs.mkdir(homeDir, { recursive: true });\n await fs.mkdir(workRoot, { recursive: true });\n\n // Seed config.json so the subprocess inherits the iteration cap and runs\n // unattended (yolo). auditLevel 'standard' guarantees tool_call_end events\n // land in the session JSONL — session-metrics depends on them. No secrets\n // are written here: provider keys come from the inherited env.\n const config = {\n yolo: opts.yolo,\n tools: { maxIterations: opts.maxIterations },\n session: { auditLevel: 'standard' },\n };\n await fs.writeFile(path.join(homeDir, 'config.json'), JSON.stringify(config, null, 2), 'utf8');\n\n return { root: base, homeDir, workRoot };\n}\n\n/**\n * Copy a task template into a fresh workdir. The directory name embeds the\n * cell label and task id so it is both unique (parallel-safe) and debuggable.\n */\nexport async function prepareWorkdir(\n sandbox: Sandbox,\n templateDir: string,\n taskId: string,\n cellLabel: string,\n exclude?: string[] | undefined,\n): Promise<string> {\n const safe = `${slug(cellLabel)}__${slug(taskId)}`;\n const dest = path.join(sandbox.workRoot, safe);\n // Fresh copy every time: a previous failed run must not leak edits forward.\n await fs.rm(dest, { recursive: true, force: true });\n const excludeSet = new Set(exclude ?? []);\n await fs.cp(templateDir, dest, {\n recursive: true,\n // Drop any path whose segments include an excluded name (e.g. `.meta`),\n // so the reference solution never reaches the agent's workdir.\n filter:\n excludeSet.size === 0\n ? undefined\n : (src) => !src.split(/[\\\\/]/).some((seg) => excludeSet.has(seg)),\n });\n return dest;\n}\n\n/** Remove the whole sandbox tree. Best-effort. */\nexport async function cleanupSandbox(sandbox: Sandbox): Promise<void> {\n /* v8 ignore next -- fs.rm with force:true does not reject for a missing tree; the catch is a best-effort guard. */\n await fs.rm(sandbox.root, { recursive: true, force: true }).catch(() => undefined);\n}\n\nfunction slug(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60) || 'x'\n );\n}\n","import { type ChildProcess, spawn, spawnSync } from 'node:child_process';\nimport type { ModelCell, RawRun } from './types.js';\n\n/** Everything needed to run one (task × cell) subprocess. */\nexport interface RunWstackOptions {\n /** Node executable (process.execPath). */\n nodeBin: string;\n /** Path to the wstack CLI entry (dist/index.js) — or a fake in tests. */\n wstackEntry: string;\n /** Isolated WRONGSTACK_HOME for this run. */\n homeDir: string;\n /** Task workdir (becomes the subprocess cwd / projectRoot). */\n workdir: string;\n cell: ModelCell;\n prompt: string;\n timeoutMs: number;\n /** Extra env merged over process.env (e.g. provider keys already present). */\n env?: NodeJS.ProcessEnv | undefined;\n /** Extra CLI args appended after the standard set (Phase 2 hooks). */\n extraArgs?: string[] | undefined;\n}\n\n/**\n * Run the real `wstack` binary once, in single-shot `--output-json` mode, and\n * parse its machine-readable result. This is the heart of the model-independent\n * design: the subprocess is the *whole* harness (real wiring, real tools), and\n * the only thing that varies between calls is `--provider`/`--model`.\n *\n * Never rejects — a crash, non-JSON output, or timeout becomes a RawRun with an\n * explanatory status so the grader still produces a row.\n */\nexport async function runWstack(opts: RunWstackOptions): Promise<RawRun> {\n const args = [\n opts.wstackEntry,\n '--prompt',\n opts.prompt,\n '--provider',\n opts.cell.provider,\n '--model',\n opts.cell.model,\n '--output-json',\n '--no-tui',\n '--no-interactive',\n '--no-banner',\n '--yolo',\n '--no-models-refresh',\n '--skip-index',\n ...(opts.extraArgs ?? []),\n ];\n\n const startedAt = Date.now();\n return new Promise<RawRun>((resolve) => {\n let child: ChildProcess;\n try {\n child = spawn(opts.nodeBin, args, {\n cwd: opts.workdir,\n env: { ...process.env, ...opts.env, WRONGSTACK_HOME: opts.homeDir },\n // windowsHide + no detached: per the repo spawn convention, detached on\n // win32 voids CREATE_NO_WINDOW and pops visible consoles for grandchildren.\n windowsHide: true,\n });\n } catch (err) {\n resolve(\n /* v8 ignore next -- spawn throws Error subclasses; the String(err) branch is defensive. */\n crashed(startedAt, `spawn failed: ${err instanceof Error ? err.message : String(err)}`),\n );\n return;\n }\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n treeKill(child);\n }, opts.timeoutMs);\n\n child.stdout?.on('data', (d: Buffer) => {\n stdout += d.toString('utf8');\n });\n child.stderr?.on('data', (d: Buffer) => {\n stderr += d.toString('utf8');\n });\n\n const finish = (run: RawRun) => {\n /* v8 ignore next -- guards against a late close after error/timeout already settled; defensive. */\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(run);\n };\n\n child.on('error', (err) => {\n finish(crashed(startedAt, `process error: ${err.message}`));\n });\n\n child.on('close', (code) => {\n const elapsedMs = Date.now() - startedAt;\n if (timedOut) {\n finish({\n status: 'timeout',\n finalText: null,\n iterations: 0,\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n elapsedMs,\n exitCode: code,\n });\n return;\n }\n const parsed = parseOutputJson(stdout);\n if (!parsed) {\n finish({\n status: 'crashed',\n finalText: null,\n iterations: 0,\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n elapsedMs,\n exitCode: code,\n // stderr is intentionally not surfaced in RawRun; the caller can read\n // the session log. Keep the shape minimal.\n });\n void stderr;\n return;\n }\n finish({ ...parsed, elapsedMs, exitCode: code });\n });\n });\n}\n\n/**\n * Find and parse the `--output-json` payload. The CLI prints exactly one such\n * line via writeOut; we scan from the end so any stray stdout before it is\n * ignored. Returns the RawRun minus elapsedMs/exitCode (filled by the caller).\n */\nfunction parseOutputJson(stdout: string): Omit<RawRun, 'elapsedMs' | 'exitCode'> | undefined {\n const lines = stdout.split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]?.trim();\n if (!line?.startsWith('{')) continue;\n let obj: Record<string, unknown>;\n try {\n obj = JSON.parse(line) as Record<string, unknown>;\n } catch {\n continue;\n }\n if (typeof obj['status'] !== 'string') continue;\n const usage = (obj['usage'] as Record<string, unknown> | undefined) ?? {};\n return {\n status: normalizeStatus(obj['status'] as string),\n finalText: typeof obj['finalText'] === 'string' ? (obj['finalText'] as string) : null,\n iterations: num(usage['iterations']),\n tokensIn: num(usage['input']),\n tokensOut: num(usage['output']),\n costUsd: num(usage['cost']),\n };\n }\n return undefined;\n}\n\nfunction normalizeStatus(s: string): RawRun['status'] {\n switch (s) {\n case 'completed':\n case 'failed':\n case 'aborted':\n case 'max_iterations':\n return s;\n default:\n return 'failed';\n }\n}\n\nfunction num(v: unknown): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : 0;\n}\n\nfunction crashed(startedAt: number, _reason: string): RawRun {\n return {\n status: 'crashed',\n finalText: null,\n iterations: 0,\n tokensIn: 0,\n tokensOut: 0,\n costUsd: 0,\n elapsedMs: Date.now() - startedAt,\n exitCode: null,\n };\n}\n\n/**\n * Kill a child and its descendants. On Windows a plain child.kill() orphans\n * grandchildren (cmd.exe, bash, the model's spawned processes) that keep stdio\n * pipes open; taskkill /T tears down the whole tree. POSIX gets SIGTERM then a\n * SIGKILL backstop.\n */\nfunction treeKill(child: ChildProcess): void {\n /* v8 ignore next -- a successfully-spawned child always has a pid; the guard is defensive. */\n if (child.pid === undefined) return;\n if (process.platform === 'win32') {\n spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F'], { windowsHide: true });\n return;\n }\n try {\n child.kill('SIGTERM');\n } catch {\n /* already gone */\n }\n /* v8 ignore start -- 2s SIGKILL backstop fires only if SIGTERM didn't end the process; not exercised in fast unit tests. */\n setTimeout(() => {\n try {\n child.kill('SIGKILL');\n } catch {\n /* already gone */\n }\n }, 2000).unref();\n /* v8 ignore stop */\n}\n\n/**\n * Map `items` through `fn` with at most `concurrency` in flight at once.\n * Results preserve input order. A tiny dependency-free p-limit.\n */\nexport async function mapWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n fn: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let next = 0;\n const limit = Math.max(1, Math.min(concurrency, items.length || 1));\n const workers = Array.from({ length: limit }, async () => {\n while (true) {\n const i = next++;\n if (i >= items.length) return;\n results[i] = await fn(items[i] as T, i);\n }\n });\n await Promise.all(workers);\n return results;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { resolveWstackPaths } from '@wrongstack/core';\nimport type { ToolMetrics } from './types.js';\n\n/**\n * Edit-family tools. The fraction of these that apply cleanly is the\n * edit-accuracy signal Aider's polyglot benchmark cares about. Kept inclusive\n * so it stays correct if more edit tools are added later.\n */\nconst EDIT_TOOLS = new Set([\n 'edit',\n 'write',\n 'multiedit',\n 'multi_edit',\n 'str_replace',\n 'apply_patch',\n]);\n\n/**\n * Derive model-free tool metrics from the isolated session JSONL the\n * subprocess wrote. Everything here comes from `tool_call_end` events\n * (`{ name, ok }`) and provider retry/error events — no LLM, no heuristics.\n *\n * Returns zeroed metrics (never throws) when the session log is missing or\n * unreadable: a crashed run still produces a valid, gradeable TaskResult.\n */\nexport async function readToolMetrics(opts: {\n homeDir: string;\n /** The task workdir — the subprocess used this as its projectRoot. */\n workdir: string;\n}): Promise<ToolMetrics> {\n const empty: ToolMetrics = {\n totalCalls: 0,\n editCalls: 0,\n editErrors: 0,\n rateLimitRetries: 0,\n };\n\n let jsonlPath: string | undefined;\n try {\n const sessionsDir = resolveWstackPaths({\n projectRoot: opts.workdir,\n globalRoot: opts.homeDir,\n }).projectSessions;\n jsonlPath = await newestJsonl(sessionsDir);\n } catch {\n /* v8 ignore next -- resolveWstackPaths is pure and newestJsonl swallows its own fs errors; this outer catch is defensive. */\n return empty;\n }\n if (!jsonlPath) return empty;\n\n let raw: string;\n try {\n raw = await fs.readFile(jsonlPath, 'utf8');\n } catch {\n return empty;\n }\n\n const metrics = { ...empty };\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n continue; // tolerate partial/corrupt trailing lines\n }\n const type = event['type'];\n if (type === 'tool_call_end') {\n metrics.totalCalls++;\n const name = typeof event['name'] === 'string' ? event['name'].toLowerCase() : '';\n if (EDIT_TOOLS.has(name)) {\n metrics.editCalls++;\n if (event['ok'] === false) metrics.editErrors++;\n }\n } else if (type === 'provider_retry' || type === 'provider_error') {\n metrics.rateLimitRetries++;\n }\n }\n return metrics;\n}\n\n/** Newest `*.jsonl` (by mtime) in a directory, or undefined if none. */\nasync function newestJsonl(dir: string): Promise<string | undefined> {\n let entries: string[];\n try {\n entries = await fs.readdir(dir);\n } catch {\n return undefined;\n }\n const jsonls = entries.filter((e) => e.endsWith('.jsonl'));\n if (jsonls.length === 0) return undefined;\n\n let newest: { path: string; mtime: number } | undefined;\n for (const name of jsonls) {\n const full = path.join(dir, name);\n try {\n const stat = await fs.stat(full);\n if (!newest || stat.mtimeMs > newest.mtime) {\n newest = { path: full, mtime: stat.mtimeMs };\n }\n } catch {\n // skip unreadable entry\n }\n }\n return newest?.path;\n}\n","import { aggregateAll } from './aggregate.js';\nimport { computeHarnessFingerprint } from './fingerprint.js';\nimport { cleanupSandbox, createSandbox, prepareWorkdir } from './isolation.js';\nimport { mapWithConcurrency, runWstack } from './runner.js';\nimport { readToolMetrics } from './session-metrics.js';\nimport type {\n BenchConfig,\n BenchReport,\n BenchSuite,\n BenchTask,\n GradeResult,\n ModelCell,\n TaskResult,\n} from './types.js';\n\nexport interface RunBenchmarkOptions {\n suite: BenchSuite;\n /** Suite-specific deterministic grader. */\n grade: (args: {\n workdir: string;\n task: BenchTask;\n cell: ModelCell;\n timeoutMs: number;\n }) => Promise<GradeResult>;\n config: BenchConfig;\n cliVersion: string;\n /** Tool names available to the agent — folded into the fingerprint. */\n toolNames: string[];\n /** Node executable. */\n nodeBin: string;\n /** Path to the wstack CLI entry. */\n wstackEntry: string;\n /** Cap the number of tasks (cheap smoke runs). */\n limit?: number | undefined;\n /** Where the sandbox is created (default OS temp). */\n sandboxBaseDir?: string | undefined;\n /** Extra env for the subprocess (provider keys are inherited from process.env). */\n env?: NodeJS.ProcessEnv | undefined;\n /** Keep the sandbox on disk after the run (debugging). */\n keepSandbox?: boolean | undefined;\n /** Progress callback (one line per event). */\n onProgress?: ((msg: string) => void) | undefined;\n /** Injected clock for the report timestamp (tests pass a fixed value). */\n now?: (() => string) | undefined;\n}\n\n/**\n * Run the full benchmark: load the task subset, fan every (task × cell) cell\n * out through isolated subprocesses, grade deterministically, and fold into a\n * fingerprint-stamped report.\n */\nexport async function runBenchmark(opts: RunBenchmarkOptions): Promise<BenchReport> {\n const progress = opts.onProgress ?? (() => {});\n const nowFn = opts.now ?? (() => new Date().toISOString());\n\n const tasks = await opts.suite.loadTasks({ limit: opts.limit });\n if (tasks.length === 0) {\n throw new Error(`suite \"${opts.suite.id}\" produced no tasks (check the data directory)`);\n }\n const subsetId = opts.suite.subsetId(tasks);\n const fingerprint = computeHarnessFingerprint({\n cliVersion: opts.cliVersion,\n toolNames: opts.toolNames,\n maxIterations: opts.config.maxIterations,\n yolo: true,\n subsetId,\n });\n\n progress(\n `suite=${opts.suite.id} tasks=${tasks.length} cells=${opts.config.cells.length} fp=${fingerprint.hash}`,\n );\n\n const sandbox = await createSandbox({\n baseDir: opts.sandboxBaseDir,\n maxIterations: opts.config.maxIterations,\n yolo: true,\n });\n\n // The unit of work is one (task × cell) pair. Fanning out at this granularity\n // keeps all cores busy even when one cell is much slower than another.\n const units: Array<{ task: BenchTask; cell: ModelCell }> = [];\n for (const task of tasks) {\n for (const cell of opts.config.cells) {\n units.push({ task, cell });\n }\n }\n\n try {\n const results = await mapWithConcurrency(units, opts.config.concurrency, async (unit) => {\n const { task, cell } = unit;\n const workdir = await prepareWorkdir(\n sandbox,\n task.templateDir,\n task.id,\n cell.label,\n task.templateExclude,\n );\n\n const run = await runWstack({\n nodeBin: opts.nodeBin,\n wstackEntry: opts.wstackEntry,\n homeDir: sandbox.homeDir,\n workdir,\n cell,\n prompt: task.prompt,\n timeoutMs: opts.config.timeoutMs,\n env: opts.env,\n });\n\n const tools = await readToolMetrics({ homeDir: sandbox.homeDir, workdir });\n\n let grade: GradeResult;\n try {\n grade = await opts.grade({ workdir, task, cell, timeoutMs: opts.config.timeoutMs });\n } catch (err) {\n grade = {\n passed: false,\n /* v8 ignore next -- graders reject with Error; the String(err) branch is defensive. */\n detail: `grader error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n progress(\n ` ${cell.label} · ${task.id} → ${grade.passed ? 'PASS' : 'fail'} ` +\n `(${run.status}, ${run.iterations} it, $${run.costUsd.toFixed(3)})`,\n );\n\n const result: TaskResult = { taskId: task.id, cell, run, grade, tools };\n return result;\n });\n\n const cells = aggregateAll(opts.config.cells, results);\n return {\n suite: opts.suite.id,\n finishedAt: nowFn(),\n fingerprint,\n cells,\n results,\n };\n } finally {\n if (!opts.keepSandbox) await cleanupSandbox(sandbox);\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { BenchReport } from '../types.js';\n\n/**\n * Write the machine-readable report artifacts:\n * - results.jsonl → one line per (task × cell), for reproducibility\n * - summary.json → fingerprint + folded cell results\n *\n * The markdown report is derived from summary.json (see report/markdown.ts), so\n * `wstack bench report` can re-render without re-running anything.\n */\nexport async function writeJsonArtifacts(outDir: string, report: BenchReport): Promise<void> {\n await fs.mkdir(outDir, { recursive: true });\n\n const jsonl = report.results.map((r) => JSON.stringify(r)).join('\\n');\n await fs.writeFile(path.join(outDir, 'results.jsonl'), jsonl + (jsonl ? '\\n' : ''), 'utf8');\n\n const summary = {\n suite: report.suite,\n finishedAt: report.finishedAt,\n fingerprint: report.fingerprint,\n cells: report.cells,\n };\n await fs.writeFile(path.join(outDir, 'summary.json'), JSON.stringify(summary, null, 2), 'utf8');\n}\n\n/** Read back a summary.json into the partial report shape markdown needs. */\nexport async function readSummary(\n outDir: string,\n): Promise<Pick<BenchReport, 'suite' | 'finishedAt' | 'fingerprint' | 'cells'>> {\n const raw = await fs.readFile(path.join(outDir, 'summary.json'), 'utf8');\n return JSON.parse(raw) as Pick<BenchReport, 'suite' | 'finishedAt' | 'fingerprint' | 'cells'>;\n}\n","import { fingerprintLabel } from '../fingerprint.js';\nimport type { BenchReport, CellResult, HarnessFingerprint } from '../types.js';\n\n/**\n * Render the human-facing leaderboard. The header carries the harness\n * fingerprint: rows are only comparable across reports that share it. The body\n * sorts cells by pass rate (the headline correctness metric), highest first.\n */\nexport function renderMarkdownReport(\n report: Pick<BenchReport, 'suite' | 'finishedAt' | 'fingerprint' | 'cells'>,\n): string {\n const { suite, finishedAt, fingerprint, cells } = report;\n const lines: string[] = [];\n\n lines.push(`# WrongStack benchmark — ${suite}`);\n lines.push('');\n lines.push(`**Harness:** ${fingerprintLabel(fingerprint)}`);\n lines.push(`**Finished:** ${finishedAt}`);\n lines.push(`**Tasks/cell:** ${cells[0]?.taskCount ?? 0}`);\n lines.push('');\n lines.push(\n \"Grading is deterministic (the suite's own tests decide pass/fail — no LLM judge). \" +\n 'The only variable across rows is the model; everything else is fixed by the harness fingerprint.',\n );\n lines.push('');\n\n const sorted = [...cells].sort((a, b) => b.passRate - a.passRate);\n\n lines.push(\n '| Model | Pass@1 | Edit-apply | $/task | tok in/out | iters (p50) | wall (p50) | timeout | 429s |',\n );\n lines.push('|---|---:|---:|---:|---:|---:|---:|---:|---:|');\n for (const c of sorted) {\n lines.push(renderRow(c));\n }\n lines.push('');\n lines.push(\n `_Fingerprint hash: \\`${fingerprint.hash}\\` · tools: ${fingerprint.toolNames.length} · subset: \\`${fingerprint.subsetId}\\`_`,\n );\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction renderRow(c: CellResult): string {\n // No graded rows (e.g. SWE-bench predictions exported for offline grading) →\n // show a dash rather than a misleading 0%.\n const passCell =\n c.gradedCount === 0\n ? '—'\n : c.gradedCount < c.taskCount\n ? `${pct(c.passRate)} (${c.gradedCount}/${c.taskCount})`\n : pct(c.passRate);\n return [\n '',\n c.cell.label,\n passCell,\n pct(c.editApplyRate),\n `$${c.avgCostUsd.toFixed(3)}`,\n `${fmtK(c.avgTokensIn)}/${fmtK(c.avgTokensOut)}`,\n String(Math.round(c.p50Iterations)),\n fmtMs(c.p50ElapsedMs),\n pct(c.timeoutRate),\n String(c.totalRateLimitRetries),\n '',\n ]\n .join(' | ')\n .trim();\n}\n\nfunction pct(x: number): string {\n return `${(x * 100).toFixed(1)}%`;\n}\n\nfunction fmtK(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(Math.round(n));\n}\n\nfunction fmtMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.round(ms)}ms`;\n}\n\n/** Build the full fingerprint-stamped header line for terminal echo. */\nexport function reportHeaderLine(fp: HarnessFingerprint): string {\n return fingerprintLabel(fp);\n}\n","import { createHash } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { BenchSuite, BenchTask } from '../types.js';\n\n/**\n * Aider polyglot benchmark loader.\n *\n * The polyglot-benchmark repo (https://github.com/Aider-AI/polyglot-benchmark)\n * lays exercises out in Exercism form:\n *\n * <root>/<language>/exercises/practice/<slug>/\n * .docs/instructions.md ← problem statement\n * .meta/config.json ← Exercism file manifest (solution/test/example)\n * .meta/example.<ext> ← reference solution (EXCLUDED from the agent)\n * <solution files> ← stubs the agent edits\n * <test files> ← the hidden tests the grader runs\n *\n * We do NOT vendor the exercises (225 across 6 languages); the caller points\n * `--polyglot-dir` at a local checkout.\n */\n\n/** Per-language test command + optional dependency-install step. */\ninterface LanguageRunner {\n /** Directory name under the polyglot root. */\n dir: string;\n /** argv for the test command, run in the workdir. */\n test: (testFiles: string[]) => { command: string; args: string[] };\n /** argv for an optional setup/install step run before tests. */\n setup?: { command: string; args: string[] } | undefined;\n}\n\nconst LANGUAGE_RUNNERS: Record<string, LanguageRunner> = {\n python: {\n dir: 'python',\n test: (tests) => ({ command: 'python', args: ['-m', 'pytest', '-q', ...tests] }),\n },\n javascript: {\n dir: 'javascript',\n setup: { command: 'npm', args: ['install', '--no-audit', '--no-fund'] },\n test: () => ({ command: 'npm', args: ['test'] }),\n },\n go: {\n dir: 'go',\n test: () => ({ command: 'go', args: ['test', './...'] }),\n },\n rust: {\n dir: 'rust',\n test: () => ({ command: 'cargo', args: ['test', '--', '--include-ignored'] }),\n },\n cpp: {\n dir: 'cpp',\n test: () => ({ command: 'cmake', args: ['--build', 'build', '--target', 'test'] }),\n },\n java: {\n dir: 'java',\n test: () => ({ command: './gradlew', args: ['test'] }),\n },\n};\n\n/** Metadata the polyglot grader reads off each task. */\nexport interface PolyglotMeta {\n language: string;\n solutionFiles: string[];\n testFiles: string[];\n testCommand: { command: string; args: string[] };\n setupCommand?: { command: string; args: string[] } | undefined;\n}\n\nexport function createPolyglotSuite(opts: {\n /** Local checkout of the polyglot-benchmark repo. */\n polyglotDir: string;\n /** Restrict to these languages (default: all present). */\n languages?: string[] | undefined;\n}): BenchSuite {\n return {\n id: 'polyglot',\n async loadTasks({ limit }) {\n const tasks: BenchTask[] = [];\n const langs = opts.languages ?? Object.keys(LANGUAGE_RUNNERS);\n for (const lang of langs) {\n const runner = LANGUAGE_RUNNERS[lang];\n if (!runner) continue;\n const practiceDir = path.join(opts.polyglotDir, runner.dir, 'exercises', 'practice');\n let slugs: string[];\n try {\n slugs = (await fs.readdir(practiceDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort((a, b) => a.localeCompare(b));\n } catch {\n continue; // language not present in this checkout\n }\n for (const slug of slugs) {\n const exerciseDir = path.join(practiceDir, slug);\n const task = await loadExercise(exerciseDir, lang, runner, slug);\n if (task) tasks.push(task);\n if (limit !== undefined && tasks.length >= limit) return tasks;\n }\n }\n return tasks;\n },\n subsetId(tasks) {\n // Order-independent digest of the exact task ids in this run.\n const ids = tasks.map((t) => t.id).sort((a, b) => a.localeCompare(b));\n return `polyglot:${createHash('sha256').update(ids.join('\\n')).digest('hex').slice(0, 12)}`;\n },\n };\n}\n\nasync function loadExercise(\n exerciseDir: string,\n language: string,\n runner: LanguageRunner,\n slug: string,\n): Promise<BenchTask | undefined> {\n // Exercism manifest tells us which files are the solution vs the tests.\n let manifest: { files?: { solution?: string[]; test?: string[] } };\n try {\n const raw = await fs.readFile(path.join(exerciseDir, '.meta', 'config.json'), 'utf8');\n manifest = JSON.parse(raw) as typeof manifest;\n } catch {\n return undefined; // not a well-formed exercise\n }\n const solutionFiles = manifest.files?.solution ?? [];\n const testFiles = manifest.files?.test ?? [];\n if (solutionFiles.length === 0) return undefined;\n\n const instructions = await readInstructions(exerciseDir);\n\n const meta: PolyglotMeta = {\n language,\n solutionFiles,\n testFiles,\n testCommand: runner.test(testFiles),\n setupCommand: runner.setup,\n };\n\n return {\n id: `polyglot/${language}/${slug}`,\n suite: 'polyglot',\n prompt: buildPrompt(instructions, solutionFiles, testFiles),\n templateDir: exerciseDir,\n // Never copy the reference solution into the agent's workdir.\n templateExclude: ['.meta'],\n meta: meta as unknown as Record<string, unknown>,\n };\n}\n\nasync function readInstructions(exerciseDir: string): Promise<string> {\n const docs = path.join(exerciseDir, '.docs');\n const parts: string[] = [];\n for (const name of ['introduction.md', 'instructions.md', 'instructions.append.md']) {\n try {\n parts.push((await fs.readFile(path.join(docs, name), 'utf8')).trim());\n } catch {\n // optional file\n }\n }\n return parts.filter(Boolean).join('\\n\\n');\n}\n\nfunction buildPrompt(instructions: string, solutionFiles: string[], testFiles: string[]): string {\n return [\n instructions,\n '',\n '---',\n '',\n `Implement the solution by editing **only** these file(s): ${solutionFiles.join(', ')}.`,\n testFiles.length > 0\n ? `The test suite (${testFiles.join(', ')}) is already present and will be run to grade your work — do not modify the tests.`\n : 'A hidden test suite will be run to grade your work.',\n 'Make the tests pass. Use the available file tools to read and edit the files. When the implementation is complete, stop.',\n ].join('\\n');\n}\n\nexport { LANGUAGE_RUNNERS };\n","import { createHash } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { BenchSuite, BenchTask } from '../types.js';\n\n/**\n * SWE-bench Verified adapter (Phase 2).\n *\n * Unlike polyglot (a self-contained directory of exercises), SWE-bench requires\n * a materialized repo at a specific base commit AND the task's pinned execution\n * environment — which the official harness ships as per-instance Docker images.\n * Running it without Docker is not meaningful, so this adapter is wired and\n * fingerprint-aware but gated: `loadTasks` throws an actionable error unless a\n * prepared dataset directory is supplied and `docker` is enabled.\n *\n * The fixed instance subset lives in `subsets/swe-bench-verified-50.json` so a\n * model comparison always grades the exact same issues (reproducibility).\n */\nexport interface SwebenchOptions {\n /**\n * Directory of prepared instances. Expected layout (produced by your\n * SWE-bench setup step — see packages/bench/README.md):\n * <datasetDir>/<instance_id>/\n * repo/ ← git checkout at base_commit\n * instance.json ← { problem_statement, test_patch, FAIL_TO_PASS, PASS_TO_PASS, image }\n */\n datasetDir?: string | undefined;\n /** Must be true to actually build tasks — the env is Docker-backed. */\n docker?: boolean | undefined;\n /** Override the committed subset file. */\n subsetFile?: string | undefined;\n}\n\nexport interface SwebenchMeta {\n instanceId: string;\n instanceDir: string;\n image?: string | undefined;\n failToPass: string[];\n passToPass: string[];\n testPatch?: string | undefined;\n}\n\nconst SUBSET_FILE = 'swe-bench-verified-50.json';\n\n/**\n * Locate the committed subset file. The relative depth differs between the\n * bundled artifact (`dist/index.js` → `../subsets`) and source execution\n * (`src/suites/swebench.js` → `../../subsets`), so try both and use whichever\n * exists.\n */\nasync function resolveDefaultSubset(): Promise<string> {\n const candidates = [\n fileURLToPath(new URL(`../subsets/${SUBSET_FILE}`, import.meta.url)),\n fileURLToPath(new URL(`../../subsets/${SUBSET_FILE}`, import.meta.url)),\n ];\n for (const c of candidates) {\n try {\n await fs.access(c);\n return c;\n } catch {\n // try next\n }\n }\n /* v8 ignore next -- one candidate always resolves in a real checkout (the subset is committed); this fallback only fires if the artifact is missing. */\n return candidates[0] as string;\n}\n\n/** Read the pinned instance-id subset (the canonical task set). */\nexport async function loadSubset(subsetFile?: string): Promise<string[]> {\n const file = subsetFile ?? (await resolveDefaultSubset());\n const raw = await fs.readFile(file, 'utf8');\n const parsed = JSON.parse(raw) as { instances?: unknown };\n if (!Array.isArray(parsed.instances)) {\n throw new Error(`subset file ${file} is missing an \"instances\" array`);\n }\n return parsed.instances.filter((x): x is string => typeof x === 'string');\n}\n\nexport function createSwebenchSuite(opts: SwebenchOptions = {}): BenchSuite {\n return {\n id: 'swebench',\n async loadTasks({ limit }) {\n const instanceIds = await loadSubset(opts.subsetFile);\n\n // A dataset dir (materialized repos at base commit) is required to run the\n // agent at all. Docker is only needed for INLINE grading; without it we\n // still run the agent and export predictions for the official harness.\n if (!opts.datasetDir) {\n throw new Error(\n 'SWE-bench requires a prepared dataset directory (materialized repos).\\n' +\n 'Run with `--dataset-dir <path>`; add `--docker` to grade inline, or omit it to ' +\n 'export predictions.jsonl for the official harness.\\n' +\n `The pinned subset (${instanceIds.length} instances) is committed in ` +\n 'packages/bench/subsets/swe-bench-verified-50.json. See packages/bench/README.md ' +\n 'for the dataset-preparation steps.',\n );\n }\n\n const tasks: BenchTask[] = [];\n for (const id of instanceIds) {\n const instanceDir = path.join(opts.datasetDir, id);\n let meta: { problem_statement?: string } & Record<string, unknown>;\n try {\n meta = JSON.parse(await fs.readFile(path.join(instanceDir, 'instance.json'), 'utf8'));\n } catch {\n continue; // instance not materialized — skip\n }\n const swMeta: SwebenchMeta = {\n instanceId: id,\n instanceDir,\n image: meta['image'] as string | undefined,\n failToPass: (meta['FAIL_TO_PASS'] as string[] | undefined) ?? [],\n passToPass: (meta['PASS_TO_PASS'] as string[] | undefined) ?? [],\n testPatch: meta['test_patch'] as string | undefined,\n };\n tasks.push({\n id: `swebench/${id}`,\n suite: 'swebench',\n prompt: buildPrompt(\n typeof meta.problem_statement === 'string' ? meta.problem_statement : '',\n ),\n templateDir: path.join(instanceDir, 'repo'),\n meta: swMeta as unknown as Record<string, unknown>,\n });\n if (limit !== undefined && tasks.length >= limit) break;\n }\n return tasks;\n },\n subsetId(tasks) {\n const ids = tasks.map((t) => t.id).sort((a, b) => a.localeCompare(b));\n return `swebench:${createHash('sha256').update(ids.join('\\n')).digest('hex').slice(0, 12)}`;\n },\n };\n}\n\nfunction buildPrompt(problemStatement: string): string {\n return [\n problemStatement,\n '',\n '---',\n '',\n 'You are working in a checkout of the repository. Resolve the issue above by editing the',\n 'source. Do not edit test files. Use the available tools to explore and modify the code.',\n 'When the fix is complete, stop.',\n ].join('\\n');\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/bench",
3
- "version": "0.260.0",
3
+ "version": "0.264.0",
4
4
  "license": "MIT",
5
5
  "description": "Model-independent agentic benchmark harness for WrongStack (Aider polyglot + SWE-bench Verified) with deterministic graders and harness fingerprinting.",
6
6
  "repository": {
@@ -27,7 +27,7 @@
27
27
  "README.md"
28
28
  ],
29
29
  "dependencies": {
30
- "@wrongstack/core": "0.260.0"
30
+ "@wrongstack/core": "0.264.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^25.9.3",