@workbench-ai/workbench 0.0.48 → 0.0.50

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.
@@ -1,36 +1,37 @@
1
1
  import { promises as fs } from "node:fs";
2
2
  import path from "node:path";
3
- import { buildWorkbenchTraceSessionsFromFiles, selectExecutionOutputFilesForInspection, } from "@workbench-ai/workbench-core";
3
+ import { buildWorkbenchTraceSessionsFromFiles, candidateRecordWithoutDerivedFields, selectExecutionOutputFilesForInspection, } from "@workbench-ai/workbench-core";
4
4
  const RUNTIME_DIR = ".workbench/runtime";
5
+ const CANDIDATE_RECORDS_DIR = "candidates";
5
6
  export function localRuntimeDir(workspace) {
6
7
  return path.join(workspace, RUNTIME_DIR);
7
8
  }
8
9
  export async function loadLocalArchive(workspace) {
9
10
  const index = await loadLocalArchiveIndex(workspace);
10
11
  const root = localRuntimeDir(workspace);
11
- const subjectFiles = {};
12
- await Promise.all(index.subjects.map(async (subject) => {
13
- subjectFiles[subject.id] = await readSurfaceFiles(path.join(root, "subjects", localRecordName(subject.id), "files"));
12
+ const candidateFiles = {};
13
+ await Promise.all(index.candidates.map(async (candidate) => {
14
+ candidateFiles[candidate.id] = await readSurfaceFiles(path.join(root, CANDIDATE_RECORDS_DIR, localRecordName(candidate.id), "files"));
14
15
  }));
15
16
  const snapshot = {
16
17
  ...index,
17
- subjectFiles,
18
+ candidateFiles,
18
19
  };
19
20
  validateLocalArchiveSnapshot(snapshot);
20
21
  return snapshot;
21
22
  }
22
23
  export async function loadLocalArchiveIndex(workspace) {
23
24
  const root = localRuntimeDir(workspace);
24
- const [state, subjects, evaluations, runs, events] = await Promise.all([
25
+ const [state, candidates, evaluations, runs, events] = await Promise.all([
25
26
  readJson(path.join(root, "state.json"), {}),
26
- readRecords(path.join(root, "subjects"), "record.json"),
27
+ readRecords(path.join(root, CANDIDATE_RECORDS_DIR), "record.json"),
27
28
  readFlatRecords(path.join(root, "evaluations")),
28
29
  readFlatRecords(path.join(root, "runs")),
29
30
  readJson(path.join(root, "events.json"), []),
30
31
  ]);
31
32
  const index = {
32
33
  activeId: typeof state.activeId === "string" ? state.activeId : null,
33
- subjects: subjects.sort((left, right) => left.ordinal - right.ordinal || left.id.localeCompare(right.id)),
34
+ candidates: candidates.sort(compareLocalCandidateRecords),
34
35
  evaluations: evaluations.sort((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id)),
35
36
  runs: runs.sort((left, right) => left.startedAt.localeCompare(right.startedAt) || left.id.localeCompare(right.id)),
36
37
  events: events.sort((left, right) => left.at.localeCompare(right.at) || left.id.localeCompare(right.id)),
@@ -42,19 +43,19 @@ export async function saveLocalArchive(workspace, snapshot) {
42
43
  const root = localRuntimeDir(workspace);
43
44
  await fs.mkdir(root, { recursive: true });
44
45
  await writeJson(path.join(root, "state.json"), { activeId: snapshot.activeId });
45
- await fs.rm(path.join(root, "subjects"), { force: true, recursive: true });
46
+ await fs.rm(path.join(root, CANDIDATE_RECORDS_DIR), { force: true, recursive: true });
46
47
  await fs.rm(path.join(root, "evaluations"), { force: true, recursive: true });
47
48
  await fs.rm(path.join(root, "runs"), { force: true, recursive: true });
48
49
  await Promise.all([
49
- fs.mkdir(path.join(root, "subjects"), { recursive: true }),
50
+ fs.mkdir(path.join(root, CANDIDATE_RECORDS_DIR), { recursive: true }),
50
51
  fs.mkdir(path.join(root, "evaluations"), { recursive: true }),
51
52
  fs.mkdir(path.join(root, "runs"), { recursive: true }),
52
53
  ]);
53
- for (const subject of snapshot.subjects) {
54
- const subjectRoot = path.join(root, "subjects", subject.id);
55
- await fs.mkdir(subjectRoot, { recursive: true });
56
- await writeJson(path.join(subjectRoot, "record.json"), subject);
57
- await writeSurfaceFiles(path.join(subjectRoot, "files"), snapshot.subjectFiles[subject.id] ?? []);
54
+ for (const candidate of snapshot.candidates) {
55
+ const candidateRoot = path.join(root, CANDIDATE_RECORDS_DIR, candidate.id);
56
+ await fs.mkdir(candidateRoot, { recursive: true });
57
+ await writeJson(path.join(candidateRoot, "record.json"), candidateRecordWithoutDerivedFields(candidate));
58
+ await writeSurfaceFiles(path.join(candidateRoot, "files"), snapshot.candidateFiles[candidate.id] ?? []);
58
59
  }
59
60
  for (const evaluation of snapshot.evaluations) {
60
61
  await writeJson(path.join(root, "evaluations", `${evaluation.id}.json`), evaluation);
@@ -92,17 +93,17 @@ export async function saveLocalJobs(workspace, jobs) {
92
93
  export async function readLocalExecutionFiles(workspace, jobId) {
93
94
  return await readSurfaceFiles(path.join(localRuntimeDir(workspace), "execution-files", localRecordName(jobId)));
94
95
  }
95
- export async function readLocalSubjectRecord(workspace, subjectId) {
96
- const subject = await readJson(path.join(localRuntimeDir(workspace), "subjects", localRecordName(subjectId), "record.json"), null);
97
- if (!subject) {
98
- throw new Error(`Subject not found: ${subjectId}`);
96
+ export async function readLocalCandidateRecord(workspace, candidateId) {
97
+ const candidate = await readJson(path.join(localRuntimeDir(workspace), CANDIDATE_RECORDS_DIR, localRecordName(candidateId), "record.json"), null);
98
+ if (!candidate) {
99
+ throw new Error(`Candidate not found: ${candidateId}`);
99
100
  }
100
- validateSubjectRecord(subject);
101
- return subject;
101
+ validateCandidateRecord(candidate);
102
+ return candidate;
102
103
  }
103
- export async function readLocalSubjectFilesForId(workspace, subjectId) {
104
- await readLocalSubjectRecord(workspace, subjectId);
105
- return await readSurfaceFiles(path.join(localRuntimeDir(workspace), "subjects", localRecordName(subjectId), "files"));
104
+ export async function readLocalCandidateFilesForId(workspace, candidateId) {
105
+ await readLocalCandidateRecord(workspace, candidateId);
106
+ return await readSurfaceFiles(path.join(localRuntimeDir(workspace), CANDIDATE_RECORDS_DIR, localRecordName(candidateId), "files"));
106
107
  }
107
108
  export async function readLocalEvaluationRecord(workspace, evaluationId) {
108
109
  const evaluation = await readJson(path.join(localRuntimeDir(workspace), "evaluations", `${localRecordName(evaluationId)}.json`), null);
@@ -131,16 +132,16 @@ export async function readLocalRunJobs(workspace, runId) {
131
132
  export async function readLocalJobInRun(workspace, runId, jobId) {
132
133
  return (await readLocalRunJobs(workspace, runId)).find((job) => job.id === jobId) ?? null;
133
134
  }
134
- export function upsertLocalSubject(snapshot, subject, files) {
135
+ export function upsertLocalCandidate(snapshot, candidate, files) {
135
136
  return {
136
137
  ...snapshot,
137
- subjects: [
138
- ...snapshot.subjects.filter((entry) => entry.id !== subject.id),
139
- subject,
140
- ].sort((left, right) => left.ordinal - right.ordinal || left.id.localeCompare(right.id)),
141
- subjectFiles: {
142
- ...snapshot.subjectFiles,
143
- [subject.id]: files.map((file) => ({ ...file })),
138
+ candidates: [
139
+ ...snapshot.candidates.filter((entry) => entry.id !== candidate.id),
140
+ candidate,
141
+ ].sort(compareLocalCandidateRecords),
142
+ candidateFiles: {
143
+ ...snapshot.candidateFiles,
144
+ [candidate.id]: files.map((file) => ({ ...file })),
144
145
  },
145
146
  };
146
147
  }
@@ -153,7 +154,7 @@ export function upsertLocalEvaluation(snapshot, evaluation) {
153
154
  ].sort((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id)),
154
155
  };
155
156
  }
156
- export function appendLocalRun(snapshot, run, events) {
157
+ export function upsertLocalRun(snapshot, run, events) {
157
158
  return {
158
159
  ...snapshot,
159
160
  runs: [
@@ -172,66 +173,68 @@ export function setLocalActive(snapshot, activeId) {
172
173
  activeId,
173
174
  };
174
175
  }
175
- export function readLocalSubject(snapshot, subjectId) {
176
- const subject = snapshot.subjects.find((entry) => entry.id === subjectId);
177
- if (!subject) {
178
- throw new Error(`Subject not found: ${subjectId}`);
176
+ export function readLocalCandidate(snapshot, candidateId) {
177
+ const candidate = snapshot.candidates.find((entry) => entry.id === candidateId);
178
+ if (!candidate) {
179
+ throw new Error(`Candidate not found: ${candidateId}`);
179
180
  }
180
- return subject;
181
+ return candidate;
181
182
  }
182
- export function readLocalSubjectFiles(snapshot, subjectId) {
183
- readLocalSubject(snapshot, subjectId);
184
- return (snapshot.subjectFiles[subjectId] ?? []).map((file) => ({ ...file }));
183
+ export function readLocalCandidateFiles(snapshot, candidateId) {
184
+ readLocalCandidate(snapshot, candidateId);
185
+ return (snapshot.candidateFiles[candidateId] ?? []).map((file) => ({ ...file }));
185
186
  }
186
187
  function validateLocalArchiveSnapshot(snapshot) {
187
188
  validateLocalArchiveIndex(snapshot);
188
189
  }
189
190
  function validateLocalArchiveIndex(snapshot) {
190
- const subjectIds = new Set(snapshot.subjects.map((subject) => subject.id));
191
- if (snapshot.activeId && !subjectIds.has(snapshot.activeId)) {
192
- throw new Error(`Active subject not found: ${snapshot.activeId}`);
193
- }
194
- for (const subject of snapshot.subjects) {
195
- validateSubjectRecord(subject);
196
- if (!Array.isArray(subject.referenceIds)) {
197
- throw new Error(`subject ${subject.id}.referenceIds must be an array.`);
191
+ const candidateIds = new Set(snapshot.candidates.map((candidate) => candidate.id));
192
+ if (snapshot.activeId && !candidateIds.has(snapshot.activeId)) {
193
+ throw new Error(`Active candidate not found: ${snapshot.activeId}`);
194
+ }
195
+ for (const candidate of snapshot.candidates) {
196
+ validateCandidateRecord(candidate);
197
+ if (!Array.isArray(candidate.referenceIds)) {
198
+ throw new Error(`candidate ${candidate.id}.referenceIds must be an array.`);
198
199
  }
199
- if (!Array.isArray(subject.fileChanges)) {
200
- throw new Error(`subject ${subject.id}.fileChanges must be an array.`);
200
+ if (!Array.isArray(candidate.fileChanges)) {
201
+ throw new Error(`candidate ${candidate.id}.fileChanges must be an array.`);
201
202
  }
202
- if (subject.baseId && !subjectIds.has(subject.baseId)) {
203
- throw new Error(`subject ${subject.id}.baseId not found: ${subject.baseId}`);
203
+ if (candidate.baseId && !candidateIds.has(candidate.baseId)) {
204
+ throw new Error(`candidate ${candidate.id}.baseId not found: ${candidate.baseId}`);
204
205
  }
205
206
  }
206
207
  for (const evaluation of snapshot.evaluations) {
207
208
  validateEvaluationRecord(evaluation);
208
- const subject = snapshot.subjects.find((entry) => entry.id === evaluation.subjectId);
209
- if (!subject) {
210
- throw new Error(`evaluation ${evaluation.id}.subjectId not found: ${evaluation.subjectId}`);
209
+ const candidate = snapshot.candidates.find((entry) => entry.id === evaluation.candidateId);
210
+ if (!candidate) {
211
+ throw new Error(`evaluation ${evaluation.id}.candidateId not found: ${evaluation.candidateId}`);
211
212
  }
212
- if (subject.benchmarkFingerprint !== evaluation.benchmarkFingerprint) {
213
- throw new Error(`evaluation ${evaluation.id}.benchmarkFingerprint does not match subject ${subject.id}.`);
213
+ if (candidate.benchmarkFingerprint !== evaluation.benchmarkFingerprint) {
214
+ throw new Error(`evaluation ${evaluation.id}.benchmarkFingerprint does not match candidate ${candidate.id}.`);
214
215
  }
215
- if (subject.subjectFingerprint !== evaluation.subjectFingerprint) {
216
- throw new Error(`evaluation ${evaluation.id}.subjectFingerprint does not match subject ${subject.id}.`);
216
+ if (candidate.candidateFingerprint !== evaluation.candidateFingerprint) {
217
+ throw new Error(`evaluation ${evaluation.id}.candidateFingerprint does not match candidate ${candidate.id}.`);
217
218
  }
218
219
  }
219
220
  for (const run of snapshot.runs) {
220
221
  validateRunRecord(run);
221
222
  }
222
223
  }
223
- function validateSubjectRecord(subject) {
224
- requireArchiveString(subject.id, "subject.id");
225
- requireArchiveString(subject.benchmarkFingerprint, `subject ${subject.id}.benchmarkFingerprint`);
226
- requireArchiveString(subject.subjectFingerprint, `subject ${subject.id}.subjectFingerprint`);
227
- requireArchiveString(subject.createdAt, `subject ${subject.id}.createdAt`);
224
+ function validateCandidateRecord(candidate) {
225
+ requireArchiveString(candidate.id, "candidate.id");
226
+ requireArchivePositiveInteger(candidate.version, `candidate ${candidate.id}.version`);
227
+ requireArchivePositiveInteger(candidate.ordinal, `candidate ${candidate.id}.ordinal`);
228
+ requireArchiveString(candidate.benchmarkFingerprint, `candidate ${candidate.id}.benchmarkFingerprint`);
229
+ requireArchiveString(candidate.candidateFingerprint, `candidate ${candidate.id}.candidateFingerprint`);
230
+ requireArchiveString(candidate.createdAt, `candidate ${candidate.id}.createdAt`);
228
231
  }
229
232
  function validateEvaluationRecord(evaluation) {
230
233
  requireArchiveString(evaluation.id, "evaluation.id");
231
234
  requireArchiveString(evaluation.runId, `evaluation ${evaluation.id}.runId`);
232
235
  requireArchiveString(evaluation.benchmarkFingerprint, `evaluation ${evaluation.id}.benchmarkFingerprint`);
233
- requireArchiveString(evaluation.subjectFingerprint, `evaluation ${evaluation.id}.subjectFingerprint`);
234
- requireArchiveString(evaluation.subjectId, `evaluation ${evaluation.id}.subjectId`);
236
+ requireArchiveString(evaluation.candidateFingerprint, `evaluation ${evaluation.id}.candidateFingerprint`);
237
+ requireArchiveString(evaluation.candidateId, `evaluation ${evaluation.id}.candidateId`);
235
238
  }
236
239
  function validateRunRecord(run) {
237
240
  requireArchiveString(run.id, "run.id");
@@ -245,13 +248,23 @@ function requireArchiveString(value, label) {
245
248
  throw new Error(`${label} must be a non-empty string.`);
246
249
  }
247
250
  }
251
+ function requireArchivePositiveInteger(value, label) {
252
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
253
+ throw new Error(`${label} must be a positive integer.`);
254
+ }
255
+ }
256
+ function compareLocalCandidateRecords(left, right) {
257
+ return left.version - right.version ||
258
+ left.createdAt.localeCompare(right.createdAt) ||
259
+ left.id.localeCompare(right.id);
260
+ }
248
261
  function archivedLocalJob(job, outputFiles, traceSourceFiles) {
249
262
  const output = jsonRecord(job.output);
250
263
  const traceSessions = buildLocalJobTraceSessions(job, traceSourceFiles);
251
264
  return {
252
265
  ...job,
253
266
  ...(Object.keys(output).length > 0
254
- ? { output: { ...output, files: outputFiles } }
267
+ ? { output: { ...output, files: traceSourceFiles } }
255
268
  : {}),
256
269
  trace: buildLocalJobTrace(job),
257
270
  traceSessions,
@@ -266,7 +279,7 @@ function isWorkbenchReservedArchivePath(filePath) {
266
279
  }
267
280
  function buildLocalJobTrace(job) {
268
281
  const purpose = readExecutionPurpose(job);
269
- const role = purpose === "improve" ? "optimizer" : "engine";
282
+ const role = purpose === "improve" ? "improver" : "engine";
270
283
  const stageId = purpose ?? "execution";
271
284
  const status = traceStatusForJob(job.status);
272
285
  const startedAt = job.startedAt ?? job.createdAt;
@@ -358,7 +371,7 @@ function buildLocalJobTraceSessions(job, outputFiles) {
358
371
  job,
359
372
  files: outputFiles,
360
373
  purpose,
361
- fallbackRole: purpose === "improve" ? "optimizer" : "engine",
374
+ fallbackRole: purpose === "improve" ? "improver" : "engine",
362
375
  });
363
376
  }
364
377
  function completedJobOutputFiles(job) {
@@ -439,8 +452,8 @@ function traceUsageSummary(value) {
439
452
  const record = jsonRecord(value);
440
453
  const usage = Object.keys(jsonRecord(record.total)).length > 0
441
454
  ? jsonRecord(record.total)
442
- : Object.keys(jsonRecord(record.optimizer)).length > 0
443
- ? jsonRecord(record.optimizer)
455
+ : Object.keys(jsonRecord(record.improver)).length > 0
456
+ ? jsonRecord(record.improver)
444
457
  : Object.keys(jsonRecord(record.runner)).length > 0
445
458
  ? jsonRecord(record.runner)
446
459
  : Object.keys(jsonRecord(record.engine)).length > 0
@@ -488,8 +501,8 @@ function localRecordName(value) {
488
501
  }
489
502
  return value;
490
503
  }
491
- export async function materializeSubjectRoot(workspace, subjectRoot, files) {
492
- const root = path.join(workspace, normalizeRelativePath(subjectRoot));
504
+ export async function materializeCandidateRoot(workspace, candidateRoot, files) {
505
+ const root = path.join(workspace, normalizeRelativePath(candidateRoot));
493
506
  const before = new Set((await readSurfaceFiles(root)).map((file) => file.path));
494
507
  await fs.rm(root, { force: true, recursive: true });
495
508
  await writeSurfaceFiles(root, files);
@@ -3,9 +3,8 @@ import { type WorkbenchEngineCase, type WorkbenchEngineResolveResult } from "@wo
3
3
  import { type WorkspaceSnapshotFile } from "./workspace-snapshot.js";
4
4
  import { type ResolvedWorkbenchAdapter } from "./adapter-project.js";
5
5
  export declare const WORKBENCH_BENCHMARK_FILE = "benchmark.yaml";
6
- export declare const WORKBENCH_SUBJECTS_DIR = "subjects";
7
- export declare const WORKBENCH_OPTIMIZERS_DIR = "optimizers";
8
- export declare const WORKBENCH_SUBJECT_FILE = "subject.yaml";
6
+ export declare const WORKBENCH_CANDIDATES_DIR = "candidates";
7
+ export declare const WORKBENCH_CANDIDATE_FILE = "candidate.yaml";
9
8
  export type HostedFile = WorkspaceSnapshotFile;
10
9
  export interface LocalProjectSource {
11
10
  dir: string;
@@ -14,20 +13,20 @@ export interface LocalProjectSource {
14
13
  spec: ReturnType<typeof resolveWorkbenchResolvedSourceYaml>;
15
14
  benchmarkPath: string;
16
15
  benchmarkSource: string;
17
- subjectName: string;
18
- subjectDir: string;
19
- subjectFilesPath: string;
20
- subjectSpecPath: string;
21
- subjectSource: string;
22
- optimizerPath?: string;
23
- optimizerSource?: string;
16
+ candidateName: string;
17
+ candidateDir: string;
18
+ candidateFilesPath: string;
19
+ candidateSpecPath: string;
20
+ candidateSource: string;
21
+ candidateRunId: string;
22
+ candidateRunIds: string[];
24
23
  benchmarkAdapterSources: string[];
25
24
  benchmarkAdapterIds: string[];
26
25
  dockerfilePath: string;
27
26
  dockerfile: string;
28
27
  runtimeDockerfile: string;
29
28
  dockerfileFiles: HostedFile[];
30
- subjectFiles: HostedFile[];
29
+ candidateFiles: HostedFile[];
31
30
  engineResolveFiles: HostedFile[];
32
31
  adapters: ResolvedWorkbenchAdapter[];
33
32
  adapterFiles: HostedFile[];
@@ -44,11 +43,9 @@ export interface LocalAuthoredProjectSource {
44
43
  specSource: string;
45
44
  benchmarkPath: string;
46
45
  benchmarkSource: string;
47
- subjectDir: string;
48
- subjectSpecPath: string;
49
- subjectSource: string;
50
- optimizerPath?: string;
51
- optimizerSource?: string;
46
+ candidateDir: string;
47
+ candidateSpecPath: string;
48
+ candidateSource: string;
52
49
  sourceFiles: SurfaceSnapshotFile[];
53
50
  }
54
51
  export interface LocalEngineResolveInvocation {
@@ -57,7 +54,7 @@ export interface LocalEngineResolveInvocation {
57
54
  auth?: Json;
58
55
  }
59
56
  interface LocalProjectSourceOptions {
60
- optimizerPath?: string;
57
+ runId?: string;
61
58
  }
62
59
  export declare function readLocalProjectSource(source: string, options?: LocalProjectSourceOptions): Promise<LocalProjectSource>;
63
60
  export declare function readLocalAuthoredProjectSource(source: string, options?: LocalProjectSourceOptions): Promise<LocalAuthoredProjectSource>;
@@ -1 +1 @@
1
- {"version":3,"file":"project-source.d.ts","sourceRoot":"","sources":["../src/project-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-source.d.ts","sourceRoot":"","sources":["../src/project-source.ts"],"names":[],"mappings":"AAKA,OAAO,EAOL,kCAAkC,EAGlC,KAAK,IAAI,EACT,KAAK,mBAAmB,EACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAQL,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EAClC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAML,KAAK,wBAAwB,EAC9B,MAAM,sBAAsB,CAAC;AAI9B,eAAO,MAAM,wBAAwB,mBAAsB,CAAC;AAC5D,eAAO,MAAM,wBAAwB,eAAe,CAAC;AACrD,eAAO,MAAM,wBAAwB,mBAAsB,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC,OAAO,kCAAkC,CAAC,CAAC;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,aAAa,EAAE,4BAA4B,CAAC;IAC5C,4BAA4B,EAAE,MAAM,CAAC;IACrC,wBAAwB,CAAC,EAAE,4BAA4B,CAAC,aAAa,CAAC,CAAC;IACvE,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,UAAU,yBAAyB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CA8G7B;AAED,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,0BAA0B,CAAC,CA6BrC"}