@earendil-works/pi-durable 1.4.0 → 1.5.1
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/CHANGELOG.md +204 -0
- package/README.md +195 -85
- package/dist/codemode/codemode.d.ts +6 -5
- package/dist/codemode/codemode.d.ts.map +1 -1
- package/dist/codemode/codemode.js +10 -49
- package/dist/codemode/codemode.js.map +1 -1
- package/dist/codemode/models.d.ts +2 -1
- package/dist/codemode/models.d.ts.map +1 -1
- package/dist/codemode/models.js +4 -4
- package/dist/codemode/models.js.map +1 -1
- package/dist/documents.d.ts +1 -1
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1 -1
- package/dist/documents.js.map +1 -1
- package/dist/entries.d.ts +1 -1
- package/dist/entries.d.ts.map +1 -1
- package/dist/entries.js.map +1 -1
- package/dist/env/index.d.ts +13 -11
- package/dist/env/index.d.ts.map +1 -1
- package/dist/env/index.js.map +1 -1
- package/dist/env/node-watch.d.ts +4 -4
- package/dist/env/node-watch.d.ts.map +1 -1
- package/dist/env/node-watch.js +18 -16
- package/dist/env/node-watch.js.map +1 -1
- package/dist/env/node.d.ts +3 -3
- package/dist/env/node.d.ts.map +1 -1
- package/dist/env/node.js +1 -1
- package/dist/env/node.js.map +1 -1
- package/dist/errors.d.ts +18 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +26 -3
- package/dist/errors.js.map +1 -1
- package/dist/harness/agent.d.ts.map +1 -1
- package/dist/harness/agent.js +37 -3
- package/dist/harness/agent.js.map +1 -1
- package/dist/harness/compaction.d.ts +8 -3
- package/dist/harness/compaction.d.ts.map +1 -1
- package/dist/harness/compaction.js +40 -11
- package/dist/harness/compaction.js.map +1 -1
- package/dist/harness/context.d.ts +24 -8
- package/dist/harness/context.d.ts.map +1 -1
- package/dist/harness/context.js +71 -25
- package/dist/harness/context.js.map +1 -1
- package/dist/harness/define.d.ts +8 -4
- package/dist/harness/define.d.ts.map +1 -1
- package/dist/harness/define.js +4 -0
- package/dist/harness/define.js.map +1 -1
- package/dist/harness/generation.d.ts +39 -6
- package/dist/harness/generation.d.ts.map +1 -1
- package/dist/harness/generation.js +451 -100
- package/dist/harness/generation.js.map +1 -1
- package/dist/harness/harness.d.ts +3 -1
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js +87 -62
- package/dist/harness/harness.js.map +1 -1
- package/dist/harness/inbox.d.ts +7 -2
- package/dist/harness/inbox.d.ts.map +1 -1
- package/dist/harness/inbox.js +5 -2
- package/dist/harness/inbox.js.map +1 -1
- package/dist/harness/json.d.ts +21 -5
- package/dist/harness/json.d.ts.map +1 -1
- package/dist/harness/json.js +23 -5
- package/dist/harness/json.js.map +1 -1
- package/dist/harness/live.d.ts +124 -17
- package/dist/harness/live.d.ts.map +1 -1
- package/dist/harness/live.js +93 -12
- package/dist/harness/live.js.map +1 -1
- package/dist/harness/partial-changes.d.ts +54 -0
- package/dist/harness/partial-changes.d.ts.map +1 -0
- package/dist/harness/partial-changes.js +163 -0
- package/dist/harness/partial-changes.js.map +1 -0
- package/dist/harness/prompt.d.ts +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/provider.d.ts +1 -1
- package/dist/harness/provider.d.ts.map +1 -1
- package/dist/harness/provider.js.map +1 -1
- package/dist/harness/registry-reader.d.ts +11 -0
- package/dist/harness/registry-reader.d.ts.map +1 -0
- package/dist/harness/registry-reader.js +25 -0
- package/dist/harness/registry-reader.js.map +1 -0
- package/dist/harness/scheduler.d.ts +48 -20
- package/dist/harness/scheduler.d.ts.map +1 -1
- package/dist/harness/scheduler.js +1006 -380
- package/dist/harness/scheduler.js.map +1 -1
- package/dist/harness/submissions.d.ts +18 -11
- package/dist/harness/submissions.d.ts.map +1 -1
- package/dist/harness/submissions.js +63 -26
- package/dist/harness/submissions.js.map +1 -1
- package/dist/harness/task-graph.d.ts +14 -9
- package/dist/harness/task-graph.d.ts.map +1 -1
- package/dist/harness/task-graph.js +38 -28
- package/dist/harness/task-graph.js.map +1 -1
- package/dist/harness/telemetry.d.ts +11 -11
- package/dist/harness/telemetry.d.ts.map +1 -1
- package/dist/harness/telemetry.js +7 -7
- package/dist/harness/telemetry.js.map +1 -1
- package/dist/harness/tool.d.ts +3 -1
- package/dist/harness/tool.d.ts.map +1 -1
- package/dist/harness/tool.js +172 -56
- package/dist/harness/tool.js.map +1 -1
- package/dist/harness/transcript.d.ts +72 -0
- package/dist/harness/transcript.d.ts.map +1 -0
- package/dist/harness/transcript.js +264 -0
- package/dist/harness/transcript.js.map +1 -0
- package/dist/harness/types.d.ts +237 -61
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage.d.ts +2 -1
- package/dist/harness/usage.d.ts.map +1 -1
- package/dist/harness/usage.js +1 -1
- package/dist/harness/usage.js.map +1 -1
- package/dist/harness/util.d.ts +4 -2
- package/dist/harness/util.d.ts.map +1 -1
- package/dist/harness/util.js +9 -0
- package/dist/harness/util.js.map +1 -1
- package/dist/harness/view.d.ts +44 -22
- package/dist/harness/view.d.ts.map +1 -1
- package/dist/harness/view.js +130 -71
- package/dist/harness/view.js.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/search.d.ts +19 -3
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +107 -44
- package/dist/search.js.map +1 -1
- package/dist/session/cached-storage.d.ts +72 -0
- package/dist/session/cached-storage.d.ts.map +1 -0
- package/dist/session/cached-storage.js +269 -0
- package/dist/session/cached-storage.js.map +1 -0
- package/dist/session/conversation-tails.d.ts +33 -0
- package/dist/session/conversation-tails.d.ts.map +1 -0
- package/dist/session/conversation-tails.js +101 -0
- package/dist/session/conversation-tails.js.map +1 -0
- package/dist/session/forks.d.ts +1 -1
- package/dist/session/forks.d.ts.map +1 -1
- package/dist/session/forks.js.map +1 -1
- package/dist/session/keys.d.ts +69 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +161 -0
- package/dist/session/keys.js.map +1 -0
- package/dist/session/session.d.ts +169 -26
- package/dist/session/session.d.ts.map +1 -1
- package/dist/session/session.js +1029 -171
- package/dist/session/session.js.map +1 -1
- package/dist/session/transaction.d.ts +84 -5
- package/dist/session/transaction.d.ts.map +1 -1
- package/dist/session/transaction.js +227 -40
- package/dist/session/transaction.js.map +1 -1
- package/dist/session/writer.d.ts +74 -0
- package/dist/session/writer.d.ts.map +1 -0
- package/dist/session/writer.js +294 -0
- package/dist/session/writer.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +12 -3
- package/dist/storage/indexeddb.d.ts.map +1 -1
- package/dist/storage/indexeddb.js +91 -41
- package/dist/storage/indexeddb.js.map +1 -1
- package/dist/storage/jsonl/index.d.ts +1 -1
- package/dist/storage/jsonl/index.d.ts.map +1 -1
- package/dist/storage/jsonl/index.js +1 -1
- package/dist/storage/jsonl/index.js.map +1 -1
- package/dist/storage/jsonl/node.d.ts +3 -3
- package/dist/storage/jsonl/node.d.ts.map +1 -1
- package/dist/storage/jsonl/node.js +2 -2
- package/dist/storage/jsonl/node.js.map +1 -1
- package/dist/storage/jsonl/storage.d.ts +46 -5
- package/dist/storage/jsonl/storage.d.ts.map +1 -1
- package/dist/storage/jsonl/storage.js +158 -43
- package/dist/storage/jsonl/storage.js.map +1 -1
- package/dist/storage/memory.d.ts +9 -3
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +28 -2
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/sqlite/commit.d.ts +52 -0
- package/dist/storage/sqlite/commit.d.ts.map +1 -0
- package/dist/storage/sqlite/commit.js +371 -0
- package/dist/storage/sqlite/commit.js.map +1 -0
- package/dist/storage/sqlite/rows.d.ts +33 -0
- package/dist/storage/sqlite/rows.d.ts.map +1 -0
- package/dist/storage/sqlite/rows.js +53 -0
- package/dist/storage/sqlite/rows.js.map +1 -0
- package/dist/storage/sqlite/statements.d.ts +13 -0
- package/dist/storage/sqlite/statements.d.ts.map +1 -0
- package/dist/storage/sqlite/statements.js +88 -0
- package/dist/storage/sqlite/statements.js.map +1 -0
- package/dist/storage/sqlite/storage.d.ts +23 -10
- package/dist/storage/sqlite/storage.d.ts.map +1 -1
- package/dist/storage/sqlite/storage.js +120 -261
- package/dist/storage/sqlite/storage.js.map +1 -1
- package/dist/storage/store/commit.d.ts +33 -0
- package/dist/storage/store/commit.d.ts.map +1 -0
- package/dist/storage/store/commit.js +286 -0
- package/dist/storage/store/commit.js.map +1 -0
- package/dist/storage/store/documents.d.ts +43 -0
- package/dist/storage/store/documents.d.ts.map +1 -0
- package/dist/storage/store/documents.js +102 -0
- package/dist/storage/store/documents.js.map +1 -0
- package/dist/storage/store/index.d.ts +2 -0
- package/dist/storage/store/index.d.ts.map +1 -0
- package/dist/storage/store/index.js +2 -0
- package/dist/storage/store/index.js.map +1 -0
- package/dist/storage/store/queries.d.ts +49 -0
- package/dist/storage/store/queries.d.ts.map +1 -0
- package/dist/storage/store/queries.js +93 -0
- package/dist/storage/store/queries.js.map +1 -0
- package/dist/storage/store/storage.d.ts +60 -0
- package/dist/storage/store/storage.d.ts.map +1 -0
- package/dist/storage/store/storage.js +438 -0
- package/dist/storage/store/storage.js.map +1 -0
- package/dist/storage/store/tables.d.ts +54 -0
- package/dist/storage/store/tables.d.ts.map +1 -0
- package/dist/storage/store/tables.js +108 -0
- package/dist/storage/store/tables.js.map +1 -0
- package/dist/testing/commit-writes.d.ts +5 -0
- package/dist/testing/commit-writes.d.ts.map +1 -0
- package/dist/testing/commit-writes.js +12 -0
- package/dist/testing/commit-writes.js.map +1 -0
- package/dist/testing/env-conformance.js +7 -7
- package/dist/testing/env-conformance.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/storage-benchmark.d.ts.map +1 -1
- package/dist/testing/storage-benchmark.js +18 -17
- package/dist/testing/storage-benchmark.js.map +1 -1
- package/dist/testing/storage-conformance.d.ts.map +1 -1
- package/dist/testing/storage-conformance.js +354 -69
- package/dist/testing/storage-conformance.js.map +1 -1
- package/dist/tool-search/tool-search.d.ts +8 -14
- package/dist/tool-search/tool-search.d.ts.map +1 -1
- package/dist/tool-search/tool-search.js +25 -13
- package/dist/tool-search/tool-search.js.map +1 -1
- package/dist/tools/bash.d.ts +13 -13
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +16 -15
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +7 -7
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +9 -9
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/file-mutation-queue.d.ts +1 -1
- package/dist/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/tools/file-mutation-queue.js.map +1 -1
- package/dist/tools/index.d.ts +32 -32
- package/dist/tools/path-utils.d.ts +1 -1
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/read.d.ts +6 -6
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +19 -8
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/write.d.ts +4 -4
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +5 -5
- package/dist/tools/write.js.map +1 -1
- package/dist/types.d.ts +228 -78
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +19 -12
- package/dist/harness/events.d.ts +0 -186
- package/dist/harness/events.d.ts.map +0 -1
- package/dist/harness/events.js +0 -373
- package/dist/harness/events.js.map +0 -1
- package/dist/session/observation.d.ts +0 -42
- package/dist/session/observation.d.ts.map +0 -1
- package/dist/session/observation.js +0 -281
- package/dist/session/observation.js.map +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Durable's records as declared tables of the store (slice 6b D2, §2.2): every row carries its record's indexed columns
|
|
2
|
+
// and the whole record as one `json(...)` cell. Indexed strings that must stay lossless (`kind`, `request_id`) hold
|
|
3
|
+
// Durable's JSON encoding; index columns are never `opt`, so absent values take sentinels no encoded value can be
|
|
4
|
+
// (`0` for an absent owner, which is never an id; `""` for an absent request id: an encoded string starts with `"`).
|
|
5
|
+
import { defineTable, int, json, str, unknown } from "@earendil-works/chord";
|
|
6
|
+
/** A record as one `json(...)` cell. */
|
|
7
|
+
const record = () => json(unknown(), { version: 1 });
|
|
8
|
+
/** Which record type owns an id: Durable's one namespace across its five record types. */
|
|
9
|
+
export const RecordIds = defineTable("record_ids", {
|
|
10
|
+
version: 1,
|
|
11
|
+
columns: { id: int(), record_type: str() },
|
|
12
|
+
key: ["id"],
|
|
13
|
+
});
|
|
14
|
+
export const Conversations = defineTable("conversations", {
|
|
15
|
+
version: 1,
|
|
16
|
+
columns: { id: int(), owner_conversation_id: int(), owner_task_id: int(), record: record() },
|
|
17
|
+
key: ["id"],
|
|
18
|
+
indexes: { by_owner_conversation: ["owner_conversation_id"], by_owner_task: ["owner_task_id"] },
|
|
19
|
+
});
|
|
20
|
+
export const Entries = defineTable("entries", {
|
|
21
|
+
version: 1,
|
|
22
|
+
columns: { id: int(), conversation_id: int(), commit_seq: int(), record: record() },
|
|
23
|
+
key: ["id"],
|
|
24
|
+
indexes: { by_conversation: ["conversation_id"] },
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* The entries with a head marker, by conversation: what `SqliteStorage`'s partial index on `head IS NOT NULL` is,
|
|
28
|
+
* as rows written only with such an entry, so a commit of an entry without one updates no second index.
|
|
29
|
+
*/
|
|
30
|
+
export const EntryHeads = defineTable("entry_heads", {
|
|
31
|
+
version: 1,
|
|
32
|
+
columns: { id: int(), conversation_id: int() },
|
|
33
|
+
key: ["id"],
|
|
34
|
+
indexes: { by_conversation: ["conversation_id"] },
|
|
35
|
+
});
|
|
36
|
+
export const Tasks = defineTable("tasks", {
|
|
37
|
+
version: 1,
|
|
38
|
+
columns: {
|
|
39
|
+
id: int(),
|
|
40
|
+
conversation_id: int(),
|
|
41
|
+
kind: str(),
|
|
42
|
+
status: str(),
|
|
43
|
+
abort_requested: int(),
|
|
44
|
+
background: int(),
|
|
45
|
+
record: record(),
|
|
46
|
+
},
|
|
47
|
+
key: ["id"],
|
|
48
|
+
indexes: {
|
|
49
|
+
by_status: ["status"],
|
|
50
|
+
by_conversation: ["conversation_id"],
|
|
51
|
+
by_kind: ["kind"],
|
|
52
|
+
by_abort_requested: ["abort_requested"],
|
|
53
|
+
by_background: ["background"],
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
export const Submissions = defineTable("submissions", {
|
|
57
|
+
version: 1,
|
|
58
|
+
columns: { id: int(), conversation_id: int(), request_id: str(), status: str(), record: record() },
|
|
59
|
+
key: ["id"],
|
|
60
|
+
indexes: {
|
|
61
|
+
by_request: ["conversation_id", "request_id"],
|
|
62
|
+
by_conversation: ["conversation_id"],
|
|
63
|
+
by_status: ["status"],
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
/** Durable's JSON encoding of an indexed string: lossless whatever the string (lone surrogates, NUL). */
|
|
67
|
+
export const encodeIndexed = (value) => JSON.stringify(value);
|
|
68
|
+
/** The row of a conversation record. */
|
|
69
|
+
export function conversationRow(value) {
|
|
70
|
+
return {
|
|
71
|
+
id: value.id,
|
|
72
|
+
owner_conversation_id: value.owner?.conversationId ?? 0,
|
|
73
|
+
owner_task_id: value.owner?.taskId ?? 0,
|
|
74
|
+
record: value,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** The row of an entry record; `commit_seq` is stamped by the step. */
|
|
78
|
+
export function entryRow(value) {
|
|
79
|
+
return {
|
|
80
|
+
id: value.id,
|
|
81
|
+
conversation_id: value.conversationId,
|
|
82
|
+
commit_seq: 0,
|
|
83
|
+
record: value,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** The row of a task record. */
|
|
87
|
+
export function taskRow(value) {
|
|
88
|
+
return {
|
|
89
|
+
id: value.id,
|
|
90
|
+
conversation_id: value.conversationId,
|
|
91
|
+
kind: encodeIndexed(value.kind),
|
|
92
|
+
status: value.state.status,
|
|
93
|
+
abort_requested: value.abortRequested ? 1 : 0,
|
|
94
|
+
background: value.background ? 1 : 0,
|
|
95
|
+
record: value,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** The row of a submission record. */
|
|
99
|
+
export function submissionRow(value) {
|
|
100
|
+
return {
|
|
101
|
+
id: value.id,
|
|
102
|
+
conversation_id: value.conversationId,
|
|
103
|
+
request_id: value.requestId === undefined ? "" : encodeIndexed(value.requestId),
|
|
104
|
+
status: value.status,
|
|
105
|
+
record: value,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/storage/store/tables.ts"],"names":[],"mappings":"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","sourcesContent":["// Durable's records as declared tables of the store (slice 6b D2, §2.2): every row carries its record's indexed columns\n// and the whole record as one `json(...)` cell. Indexed strings that must stay lossless (`kind`, `request_id`) hold\n// Durable's JSON encoding; index columns are never `opt`, so absent values take sentinels no encoded value can be\n// (`0` for an absent owner, which is never an id; `\"\"` for an absent request id: an encoded string starts with `\"`).\n\nimport { defineTable, int, json, str, unknown } from \"@earendil-works/chord\";\nimport type { JsonValue } from \"@earendil-works/chord/json\";\nimport type { ConversationRecord, EntryRecord, SubmissionRecord, TaskRecord } from \"../../types.ts\";\n\n/** A record as one `json(...)` cell. */\nconst record = () => json(unknown(), { version: 1 });\n\n/** Which record type owns an id: Durable's one namespace across its five record types. */\nexport const RecordIds = defineTable(\"record_ids\", {\n\tversion: 1,\n\tcolumns: { id: int(), record_type: str() },\n\tkey: [\"id\"],\n});\n\nexport const Conversations = defineTable(\"conversations\", {\n\tversion: 1,\n\tcolumns: { id: int(), owner_conversation_id: int(), owner_task_id: int(), record: record() },\n\tkey: [\"id\"],\n\tindexes: { by_owner_conversation: [\"owner_conversation_id\"], by_owner_task: [\"owner_task_id\"] },\n});\n\nexport const Entries = defineTable(\"entries\", {\n\tversion: 1,\n\tcolumns: { id: int(), conversation_id: int(), commit_seq: int(), record: record() },\n\tkey: [\"id\"],\n\tindexes: { by_conversation: [\"conversation_id\"] },\n});\n\n/**\n * The entries with a head marker, by conversation: what `SqliteStorage`'s partial index on `head IS NOT NULL` is,\n * as rows written only with such an entry, so a commit of an entry without one updates no second index.\n */\nexport const EntryHeads = defineTable(\"entry_heads\", {\n\tversion: 1,\n\tcolumns: { id: int(), conversation_id: int() },\n\tkey: [\"id\"],\n\tindexes: { by_conversation: [\"conversation_id\"] },\n});\n\nexport const Tasks = defineTable(\"tasks\", {\n\tversion: 1,\n\tcolumns: {\n\t\tid: int(),\n\t\tconversation_id: int(),\n\t\tkind: str(),\n\t\tstatus: str(),\n\t\tabort_requested: int(),\n\t\tbackground: int(),\n\t\trecord: record(),\n\t},\n\tkey: [\"id\"],\n\tindexes: {\n\t\tby_status: [\"status\"],\n\t\tby_conversation: [\"conversation_id\"],\n\t\tby_kind: [\"kind\"],\n\t\tby_abort_requested: [\"abort_requested\"],\n\t\tby_background: [\"background\"],\n\t},\n});\n\nexport const Submissions = defineTable(\"submissions\", {\n\tversion: 1,\n\tcolumns: { id: int(), conversation_id: int(), request_id: str(), status: str(), record: record() },\n\tkey: [\"id\"],\n\tindexes: {\n\t\tby_request: [\"conversation_id\", \"request_id\"],\n\t\tby_conversation: [\"conversation_id\"],\n\t\tby_status: [\"status\"],\n\t},\n});\n\n/** Durable's JSON encoding of an indexed string: lossless whatever the string (lone surrogates, NUL). */\nexport const encodeIndexed = (value: string): string => JSON.stringify(value);\n\n/** The row of a conversation record. */\nexport function conversationRow(value: ConversationRecord): object {\n\treturn {\n\t\tid: value.id,\n\t\towner_conversation_id: value.owner?.conversationId ?? 0,\n\t\towner_task_id: value.owner?.taskId ?? 0,\n\t\trecord: value,\n\t};\n}\n\n/** The row of an entry record; `commit_seq` is stamped by the step. */\nexport function entryRow(value: EntryRecord): object {\n\treturn {\n\t\tid: value.id,\n\t\tconversation_id: value.conversationId,\n\t\tcommit_seq: 0,\n\t\trecord: value,\n\t};\n}\n\n/** The row of a task record. */\nexport function taskRow(value: TaskRecord<JsonValue, JsonValue, JsonValue>): object {\n\treturn {\n\t\tid: value.id,\n\t\tconversation_id: value.conversationId,\n\t\tkind: encodeIndexed(value.kind),\n\t\tstatus: value.state.status,\n\t\tabort_requested: value.abortRequested ? 1 : 0,\n\t\tbackground: value.background ? 1 : 0,\n\t\trecord: value,\n\t};\n}\n\n/** The row of a submission record. */\nexport function submissionRow(value: SubmissionRecord): object {\n\treturn {\n\t\tid: value.id,\n\t\tconversation_id: value.conversationId,\n\t\trequest_id: value.requestId === undefined ? \"\" : encodeIndexed(value.requestId),\n\t\tstatus: value.status,\n\t\trecord: value,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Context } from "@earendil-works/chord/context";
|
|
2
|
+
import type { Seq, Storage, StorageWrite } from "../types.ts";
|
|
3
|
+
/** Commits `writes` as one batch and resolves with its seq; rejects with the refusal if the storage refused it. */
|
|
4
|
+
export declare function commitWrites(storage: Storage, writes: readonly StorageWrite[], context: Context): Promise<Seq>;
|
|
5
|
+
//# sourceMappingURL=commit-writes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-writes.d.ts","sourceRoot":"","sources":["../../src/testing/commit-writes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,mHAAmH;AACnH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAWpH"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// One batch through `Storage.commit()`, for tests and suites that seed or write a storage directly.
|
|
2
|
+
/** Commits `writes` as one batch and resolves with its seq; rejects with the refusal if the storage refused it. */
|
|
3
|
+
export async function commitWrites(storage, writes, context) {
|
|
4
|
+
let stored;
|
|
5
|
+
const result = await storage.commit([writes], (_index, seq) => {
|
|
6
|
+
stored = seq;
|
|
7
|
+
}, context);
|
|
8
|
+
if (result.stored === 0)
|
|
9
|
+
throw result.refused;
|
|
10
|
+
return stored;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=commit-writes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-writes.js","sourceRoot":"","sources":["../../src/testing/commit-writes.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAKpG,mHAAmH;AACnH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,MAA+B,EAAE,OAAgB;IACrG,IAAI,MAAuB,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC,CAAC,MAAM,CAAC,EACR,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,CAAC;IACd,CAAC,EACD,OAAO,CACP,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,MAAM,CAAC,OAAO,CAAC;IAC9C,OAAO,MAAO,CAAC;AAChB,CAAC","sourcesContent":["// One batch through `Storage.commit()`, for tests and suites that seed or write a storage directly.\n\nimport type { Context } from \"@earendil-works/chord/context\";\nimport type { Seq, Storage, StorageWrite } from \"../types.ts\";\n\n/** Commits `writes` as one batch and resolves with its seq; rejects with the refusal if the storage refused it. */\nexport async function commitWrites(storage: Storage, writes: readonly StorageWrite[], context: Context): Promise<Seq> {\n\tlet stored: Seq | undefined;\n\tconst result = await storage.commit(\n\t\t[writes],\n\t\t(_index, seq) => {\n\t\t\tstored = seq;\n\t\t},\n\t\tcontext,\n\t);\n\tif (result.stored === 0) throw result.refused;\n\treturn stored!;\n}\n"]}
|
|
@@ -40,9 +40,9 @@ async function listed(env, path, options) {
|
|
|
40
40
|
}
|
|
41
41
|
/** Whether a change reports `path`: an overflow, or a reported path at or above it. */
|
|
42
42
|
function covers(change, path) {
|
|
43
|
-
if ("overflow"
|
|
43
|
+
if (change.kind === "overflow")
|
|
44
44
|
return true;
|
|
45
|
-
if (
|
|
45
|
+
if (change.kind !== "paths")
|
|
46
46
|
return false;
|
|
47
47
|
return change.paths.some((reported) => path === reported || path.startsWith(`${reported}/`) || path.startsWith(`${reported}\\`));
|
|
48
48
|
}
|
|
@@ -70,7 +70,7 @@ async function watching(env, targets, run) {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
finally {
|
|
73
|
-
await watcher.
|
|
73
|
+
await watcher.stop(context);
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
@@ -297,7 +297,7 @@ export function createEnvConformance(options) {
|
|
|
297
297
|
});
|
|
298
298
|
const hidden = [await absolute("skills/node_modules"), await absolute("skills/.SKILL.md.tmp")];
|
|
299
299
|
for (const change of changes) {
|
|
300
|
-
if (
|
|
300
|
+
if (change.kind !== "paths")
|
|
301
301
|
continue;
|
|
302
302
|
for (const path of change.paths) {
|
|
303
303
|
assert.ok(!hidden.some((excluded) => path === excluded || path.startsWith(excluded)), `excluded ${path}`);
|
|
@@ -329,12 +329,12 @@ export function createEnvConformance(options) {
|
|
|
329
329
|
});
|
|
330
330
|
});
|
|
331
331
|
}),
|
|
332
|
-
watchCase("watch stops reporting once
|
|
332
|
+
watchCase("watch stops reporting once stopped", async (env) => {
|
|
333
333
|
const changes = [];
|
|
334
334
|
const watcher = getOrThrow(await env.watch([{ path: "file.txt" }], (change) => changes.push(change), context));
|
|
335
335
|
assert.ok(watcher.mode === "native" || watcher.mode === "polling", "watcher reports its mode");
|
|
336
|
-
await watcher.
|
|
337
|
-
await watcher.
|
|
336
|
+
await watcher.stop(context);
|
|
337
|
+
await watcher.stop(context);
|
|
338
338
|
getOrThrow(await env.writeFile("file.txt", "x", context));
|
|
339
339
|
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
340
340
|
assert.deepEqual(changes, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-conformance.js","sourceRoot":"","sources":["../../src/testing/env-conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT, withAbortSignal } from \"@earendil-works/chord/context\";\nimport {\n\ttype ExecutionEnv,\n\ttype FileInfo,\n\tgetOrThrow,\n\ttype ListFilesOptions,\n\ttype Result,\n\ttype ShellOutputInfo,\n\ttype WatchChange,\n\ttype WatchTarget,\n} from \"../env/index.ts\";\nimport type { EnvConformanceCase, EnvConformanceOptions } from \"./types.ts\";\n\nconst context = BACKGROUND_CONTEXT;\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\ntype EnvTest = (env: ExecutionEnv) => Promise<void>;\n\nfunction abortedContext(): Context {\n\tconst controller = new AbortController();\n\tcontroller.abort();\n\treturn withAbortSignal(controller.signal, BACKGROUND_CONTEXT);\n}\n\nfunction errorCode(result: Result<unknown, { code: string }>): string | undefined {\n\treturn result.ok ? undefined : result.error.code;\n}\n\nasync function readAll(\n\tenv: ExecutionEnv,\n\tpath: string,\n\tmaxEntries: number,\n): Promise<{ pages: FileInfo[][]; done: boolean }> {\n\tconst reader = getOrThrow(await env.openDirReader(path, context));\n\tconst pages: FileInfo[][] = [];\n\ttry {\n\t\tfor (let page = 0; page < 1000; page++) {\n\t\t\tconst next = getOrThrow(await reader.next(maxEntries, context));\n\t\t\tpages.push(next.entries);\n\t\t\tif (next.done) return { pages, done: true };\n\t\t}\n\t\treturn { pages, done: false };\n\t} finally {\n\t\tawait reader.close(context);\n\t}\n}\n\n/** A listing as `<kind letter> <path>` lines (`f`, `d`, `l`), with its truncation. */\nasync function listed(\n\tenv: ExecutionEnv,\n\tpath: string,\n\toptions?: ListFilesOptions,\n): Promise<{ entries: string[]; truncated: boolean }> {\n\tif (env.listFiles === undefined) throw new Error(\"The environment does not implement listFiles\");\n\tconst listing = getOrThrow(await env.listFiles(path, options, context));\n\tconst letter = { file: \"f\", directory: \"d\", symlink: \"l\" } as const;\n\treturn {\n\t\tentries: listing.entries.map((entry) => `${letter[entry.kind]} ${entry.path}`),\n\t\ttruncated: listing.truncated,\n\t};\n}\n\n/** Whether a change reports `path`: an overflow, or a reported path at or above it. */\nfunction covers(change: WatchChange, path: string): boolean {\n\tif (\"overflow\" in change) return true;\n\tif (!(\"paths\" in change)) return false;\n\treturn change.paths.some(\n\t\t(reported) => path === reported || path.startsWith(`${reported}/`) || path.startsWith(`${reported}\\\\`),\n\t);\n}\n\n/** Watch `targets` while `run` changes files, with a helper that waits for a change reporting a path. */\nasync function watching(\n\tenv: ExecutionEnv,\n\ttargets: readonly WatchTarget[],\n\trun: (helpers: {\n\t\treadonly changes: WatchChange[];\n\t\t/** Wait up to three seconds for a change, after the call, that reports `path`. */\n\t\texpectChange(path: string, change: () => Promise<void>): Promise<void>;\n\t\tabsolute(path: string): Promise<string>;\n\t}) => Promise<void>,\n): Promise<void> {\n\tconst changes: WatchChange[] = [];\n\tconst watcher = getOrThrow(await env.watch(targets, (change) => changes.push(change), context));\n\ttry {\n\t\tconst absolute = async (path: string) => getOrThrow(await env.absolutePath(path, context));\n\t\tawait run({\n\t\t\tchanges,\n\t\t\tabsolute,\n\t\t\tasync expectChange(path, change) {\n\t\t\t\tconst target = await absolute(path);\n\t\t\t\tconst from = changes.length;\n\t\t\t\tawait change();\n\t\t\t\tconst deadline = Date.now() + 3000;\n\t\t\t\twhile (!changes.slice(from).some((entry) => covers(entry, target))) {\n\t\t\t\t\tif (Date.now() > deadline) {\n\t\t\t\t\t\tthrow new Error(`No change reported ${target}; got ${JSON.stringify(changes.slice(from))}`);\n\t\t\t\t\t}\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 20));\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t} finally {\n\t\tawait watcher.close(context);\n\t}\n}\n\n/**\n * Creates runner-independent cases for an `ExecutionEnv`. `withEnv` must call and await its callback exactly once per\n * case with an environment whose `cwd` is a fresh, empty, writable directory.\n */\nexport function createEnvConformance(options: EnvConformanceOptions): readonly EnvConformanceCase[] {\n\tconst assert = options.assertions;\n\tconst shell = options.shell ?? [\"sh\", \"-c\"];\n\tconst symlinks = options.symlinks ?? true;\n\tconst createCase = (name: string, test: EnvTest, timeoutMs?: number): EnvConformanceCase => ({\n\t\tname,\n\t\t...(timeoutMs === undefined ? {} : { timeoutMs }),\n\t\trun: () => options.withEnv(test),\n\t});\n\t// Watch cases wait up to three seconds per step, longer than test runners allow by default.\n\tconst watchCase = (name: string, test: EnvTest): EnvConformanceCase => createCase(name, test, 30_000);\n\tconst execCollect = async (env: ExecutionEnv, command: string | readonly string[], cwd?: string) => {\n\t\tconst output: Record<ShellOutputInfo[\"stream\"], string> = { stdout: \"\", stderr: \"\" };\n\t\tconst result = await env.exec(\n\t\t\tcommand,\n\t\t\t{\n\t\t\t\t...(cwd === undefined ? {} : { cwd }),\n\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\toutput[info.stream] += text;\n\t\t\t\t},\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t\treturn { result, ...output };\n\t};\n\n\tconst cases: EnvConformanceCase[] = [\n\t\tcreateCase(\"binary reader reads byte ranges of the opened file\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"data.txt\", \"hello world\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"data.txt\", undefined, context));\n\t\t\tconst info = getOrThrow(await reader.info(context));\n\t\t\tassert.partialDeepEqual(info, { name: \"data.txt\", kind: \"file\", size: 11 });\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 5, context))), \"hello\");\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(6, 100, context))), \"world\");\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(11, 4, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(50, 1, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(3, 0, context)).length, 0);\n\t\t\tassert.strictEqual(errorCode(await reader.read(-1, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1.5, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.info(context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"binary reader scans lines like decoding the whole file\", async (env) => {\n\t\t\t// A byte-order mark, an invalid sequence before a newline, an empty line, a later U+FEFF, and no final newline.\n\t\t\tconst bytes = Uint8Array.from([\n\t\t\t\t0xef, 0xbb, 0xbf, 0x61, 0x0a, 0xe2, 0x82, 0x0a, 0x0a, 0xef, 0xbb, 0xbf, 0x62, 0x0a, 0xc3, 0xa9,\n\t\t\t]);\n\t\t\tgetOrThrow(await env.writeFile(\"lines.txt\", bytes, context));\n\t\t\tconst lines = new TextDecoder().decode(bytes).split(\"\\n\");\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"lines.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tconst ranges: [number, number | undefined][] = [\n\t\t\t\t\t[0, undefined],\n\t\t\t\t\t[0, 1],\n\t\t\t\t\t[1, 3],\n\t\t\t\t\t[2, 3],\n\t\t\t\t\t[3, undefined],\n\t\t\t\t\t[4, 9],\n\t\t\t\t];\n\t\t\t\tfor (const [startLine, endLine] of ranges) {\n\t\t\t\t\tconst scan = getOrThrow(\n\t\t\t\t\t\tawait reader.scanLines({ startLine, ...(endLine === undefined ? {} : { endLine }) }, context),\n\t\t\t\t\t);\n\t\t\t\t\tconst selected = lines.slice(startLine, endLine);\n\t\t\t\t\tconst range = (from: number, to: number) =>\n\t\t\t\t\t\tnew TextDecoder(\"utf-8\", { ignoreBOM: from > 0 }).decode(bytes.subarray(from, to));\n\t\t\t\t\tassert.strictEqual(scan.newlines, lines.length - 1);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.end), selected.join(\"\\n\"));\n\t\t\t\t\tassert.strictEqual(scan.selectedBytes, encoder.encode(selected.join(\"\\n\")).length);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.firstLineEnd), lines[startLine]);\n\t\t\t\t\tassert.strictEqual(scan.firstLineBytes, encoder.encode(lines[startLine]).length);\n\t\t\t\t}\n\t\t\t\tassert.partialDeepEqual(getOrThrow(await reader.scanLines({ startLine: 9 }, context)), {\n\t\t\t\t\tstart: bytes.length,\n\t\t\t\t\tend: bytes.length,\n\t\t\t\t\tselectedBytes: 0,\n\t\t\t\t});\n\t\t\t\tassert.strictEqual(errorCode(await reader.scanLines({ startLine: 2, endLine: 2 }, context)), \"invalid\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader keeps reading the file it opened after a rename\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"one\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"a.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tgetOrThrow(await env.renameFile(\"a.txt\", \"b.txt\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"two\", context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 10, context))), \"one\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader refuses directories, missing files and aborted opens\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"dir\", undefined, context)), \"is_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"missing.txt\", undefined, context)), \"not_found\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"file.txt\", undefined, abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader pages every entry exactly once\", async (env) => {\n\t\t\tconst names = [\"a.txt\", \"b.txt\", \"c.txt\", \"d.txt\", \"e.txt\"];\n\t\t\tfor (const name of names) getOrThrow(await env.writeFile(name, name, context));\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst { pages, done } = await readAll(env, \".\", 2);\n\t\t\tassert.ok(done, \"directory reader reached the end\");\n\t\t\tfor (const page of pages) assert.ok(page.length <= 2, \"page within maxEntries\");\n\t\t\tconst entries = pages.flat();\n\t\t\tassert.deepEqual(entries.map((entry) => entry.name).sort(), [...names, \"sub\"].sort());\n\t\t\tassert.strictEqual(entries.find((entry) => entry.name === \"sub\")?.kind, \"directory\");\n\t\t\tassert.partialDeepEqual(\n\t\t\t\tentries.find((entry) => entry.name === \"a.txt\"),\n\t\t\t\t{ kind: \"file\", size: 5 },\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\"directory reader reports the end and refuses use after close\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"empty\", undefined, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"empty\", context));\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.strictEqual(errorCode(await reader.next(0, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader refuses missing paths and files\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\"missing\", context)), \"not_found\");\n\t\t\tconst file = await env.openDirReader(\"file.txt\", context);\n\t\t\tassert.strictEqual(errorCode(file), \"not_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\".\", abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader skips entries removed during enumeration\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.writeFile(`dir/${name}`, name, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"dir\", context));\n\t\t\ttry {\n\t\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.remove(`dir/${name}`, undefined, context));\n\t\t\t\tconst entries: FileInfo[] = [];\n\t\t\t\tfor (let page = 0; page < 10; page++) {\n\t\t\t\t\tconst next = getOrThrow(await reader.next(10, context));\n\t\t\t\t\tentries.push(...next.entries);\n\t\t\t\t\tif (next.done) break;\n\t\t\t\t}\n\t\t\t\tassert.deepEqual(entries, []);\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing file's creation, changes, replacement and removal\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\t// Editors replace a file by renaming a new one over it.\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md.tmp\", \"three\", context));\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"AGENTS.md.tmp\", \"AGENTS.md\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"four\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.remove(\"AGENTS.md\", undefined, context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing target whose ancestors are created\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"a/b/c/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"a/b/c/AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"a/b/c/AGENTS.md\", \"x\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows directories created together with their contents\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\t// Written before any watcher on the new directories can exist.\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/c/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/c/SKILL.md\", \"deeper\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps watching a path whose parent is renamed and recreated\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"proj/.pi/skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"proj/.pi/skills\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"proj/.pi\", \"proj/old\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch skips excluded entries and reports a rename out of them\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tconst targets: WatchTarget[] = [\n\t\t\t\t{ path: \"skills\", recursive: true, exclude: { hidden: true, names: [\"node_modules\"] } },\n\t\t\t];\n\t\t\tawait watching(env, targets, async ({ changes, expectChange, absolute }) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/node_modules/dep/SKILL.md\", \"dep\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/.SKILL.md.tmp\", \"draft\", context));\n\t\t\t\tawait expectChange(\"skills/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/.SKILL.md.tmp\", \"skills/SKILL.md\", context));\n\t\t\t\t});\n\t\t\t\tconst hidden = [await absolute(\"skills/node_modules\"), await absolute(\"skills/.SKILL.md.tmp\")];\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tif (!(\"paths\" in change)) continue;\n\t\t\t\t\tfor (const path of change.paths) {\n\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t!hidden.some((excluded) => path === excluded || path.startsWith(excluded)),\n\t\t\t\t\t\t\t`excluded ${path}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps recursive coverage where a non-recursive target overlaps\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/one.md\", \"one\", context));\n\t\t\tconst targets: WatchTarget[] = [{ path: \"skills\" }, { path: \"skills\", recursive: true }];\n\t\t\tawait watching(env, targets, async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a/two.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/two.md\", \"two\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows a directory replaced at the same path\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/a\", \"skills-old\", context));\n\t\t\t\t\tgetOrThrow(await env.createDir(\"skills/a\", undefined, context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch stops reporting once closed\", async (env) => {\n\t\t\tconst changes: WatchChange[] = [];\n\t\t\tconst watcher = getOrThrow(await env.watch([{ path: \"file.txt\" }], (change) => changes.push(change), context));\n\t\t\tassert.ok(watcher.mode === \"native\" || watcher.mode === \"polling\", \"watcher reports its mode\");\n\t\t\tawait watcher.close(context);\n\t\t\tawait watcher.close(context);\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tassert.deepEqual(changes, []);\n\t\t}),\n\n\t\tcreateCase(\"argv exec passes arguments to the program without shell parsing\", async (env) => {\n\t\t\tconst hostile = \"it's $(touch pwned) `touch pwned` *; touch pwned\";\n\t\t\tconst { result, stdout } = await execCollect(env, [\n\t\t\t\t...shell,\n\t\t\t\t'printf \"%s|%s\" \"$1\" \"$2\"',\n\t\t\t\t\"argv0\",\n\t\t\t\thostile,\n\t\t\t\t\"a b\",\n\t\t\t]);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tassert.strictEqual(stdout, `${hostile}|a b`);\n\t\t\tassert.strictEqual(getOrThrow(await env.exists(\"pwned\", context)), false);\n\t\t}),\n\n\t\tcreateCase(\"exec reports the stream of every chunk in both forms\", async (env) => {\n\t\t\tconst script = \"printf out; printf err >&2; printf more\";\n\t\t\tconst argv = await execCollect(env, [...shell, script]);\n\t\t\tassert.strictEqual(getOrThrow(argv.result).exitCode, 0);\n\t\t\tassert.strictEqual(argv.stdout, \"outmore\");\n\t\t\tassert.strictEqual(argv.stderr, \"err\");\n\t\t\tconst string = await execCollect(env, script);\n\t\t\tassert.strictEqual(getOrThrow(string.result).exitCode, 0);\n\t\t\tassert.strictEqual(string.stdout, \"outmore\");\n\t\t\tassert.strictEqual(string.stderr, \"err\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec honors cwd and exit codes\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst made = await execCollect(env, [...shell, \"printf x > made.txt; exit 3\"], \"sub\");\n\t\t\tassert.strictEqual(getOrThrow(made.result).exitCode, 3);\n\t\t\tassert.strictEqual(getOrThrow(await env.readTextFile(\"sub/made.txt\", context)), \"x\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec reports missing programs and empty argv as spawn errors\", async (env) => {\n\t\t\tassert.strictEqual(\n\t\t\t\terrorCode(await env.exec([\"pi-durable-conformance-missing-program\"], undefined, context)),\n\t\t\t\t\"spawn_error\",\n\t\t\t);\n\t\t\tassert.strictEqual(errorCode(await env.exec([], undefined, context)), \"spawn_error\");\n\t\t}),\n\n\t\tcreateCase(\"windowed exec keeps the exact tail and counts what it skips\", async (env) => {\n\t\t\tconst lines = 2000;\n\t\t\tconst window = { maxBytes: 200, maxLines: 5, minIntervalMs: 0, bytesPerSecond: 1_000_000_000 };\n\t\t\tlet bytes = 0;\n\t\t\tlet newlines = 0;\n\t\t\tlet tail = \"\";\n\t\t\tconst result = await env.exec(\n\t\t\t\t[...shell, `i=0; while [ $i -lt ${lines} ]; do echo line-$i; i=$((i+1)); done`],\n\t\t\t\t{\n\t\t\t\t\twindow,\n\t\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\t\tif (info.skipped !== undefined) {\n\t\t\t\t\t\t\tbytes += info.skipped.bytes;\n\t\t\t\t\t\t\tnewlines += info.skipped.newlines;\n\t\t\t\t\t\t\tconst after = encoder.encode(text).length;\n\t\t\t\t\t\t\tconst afterNewlines = text.split(\"\\n\").length - 1;\n\t\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t\tafter > window.maxBytes || afterNewlines > window.maxLines,\n\t\t\t\t\t\t\t\t\"a skip is followed by more than the window\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttail = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbytes += encoder.encode(text).length;\n\t\t\t\t\t\tnewlines += text.split(\"\\n\").length - 1;\n\t\t\t\t\t\ttail += text;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tconst expected = Array.from({ length: lines }, (_, index) => `line-${index}\\n`);\n\t\t\tassert.strictEqual(bytes, expected.join(\"\").length);\n\t\t\tassert.strictEqual(newlines, lines);\n\t\t\tassert.ok(tail.endsWith(expected.slice(-window.maxLines).join(\"\")), \"the delivered output ends with the tail\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec distinguishes timeout from abort\", async (env) => {\n\t\t\tconst timedOut = await env.exec([...shell, \"sleep 2\"], { timeout: 0.1 }, context);\n\t\t\tassert.strictEqual(errorCode(timedOut), \"timeout\");\n\t\t\tconst controller = new AbortController();\n\t\t\tconst running = env.exec([...shell, \"sleep 2\"], undefined, withAbortSignal(controller.signal, context));\n\t\t\tsetTimeout(() => controller.abort(), 100);\n\t\t\tassert.strictEqual(errorCode(await running), \"aborted\");\n\t\t}),\n\t];\n\n\tif (options.listFiles) {\n\t\tconst writeAll = async (env: ExecutionEnv, files: readonly string[]) => {\n\t\t\tfor (const file of files) getOrThrow(await env.writeFile(file, \"\", context));\n\t\t};\n\t\tcases.push(\n\t\t\tcreateCase(\"listFiles lists files and directories depth first in name order\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"b.txt\", \"a/z.txt\", \"a/b/c.txt\", \".hidden/x\", \"A.txt\"]);\n\t\t\t\tgetOrThrow(await env.createDir(\"empty\", undefined, context));\n\t\t\t\tassert.deepEqual(await listed(env, \".\"), {\n\t\t\t\t\tentries: [\n\t\t\t\t\t\t\"d .hidden\",\n\t\t\t\t\t\t\"f .hidden/x\",\n\t\t\t\t\t\t\"f A.txt\",\n\t\t\t\t\t\t\"d a\",\n\t\t\t\t\t\t\"d a/b\",\n\t\t\t\t\t\t\"f a/b/c.txt\",\n\t\t\t\t\t\t\"f a/z.txt\",\n\t\t\t\t\t\t\"f b.txt\",\n\t\t\t\t\t\t\"d empty\",\n\t\t\t\t\t],\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t\t\tassert.deepEqual((await listed(env, \".\", { hidden: false })).entries, [\n\t\t\t\t\t\"f A.txt\",\n\t\t\t\t\t\"d a\",\n\t\t\t\t\t\"d a/b\",\n\t\t\t\t\t\"f a/b/c.txt\",\n\t\t\t\t\t\"f a/z.txt\",\n\t\t\t\t\t\"f b.txt\",\n\t\t\t\t\t\"d empty\",\n\t\t\t\t]);\n\t\t\t\tconst expected = { entries: [\"d b\", \"f b/c.txt\", \"f z.txt\"], truncated: false };\n\t\t\t\tassert.deepEqual(await listed(env, \"a\"), expected);\n\t\t\t\tassert.deepEqual(await listed(env, getOrThrow(await env.absolutePath(\"a\", context))), expected);\n\t\t\t\tassert.deepEqual(await listed(env, \"empty\"), { entries: [], truncated: false });\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles skips what git ignores in work trees, .git, and excluded names\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"keep.txt\", \"out/x.js\", \"sub/keep.txt\", \"sub/drop.log\", \"node_modules/m/i.js\"]);\n\t\t\t\tgetOrThrow(await env.writeFile(\".gitignore\", \"out/\\n*.log\\n\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"sub/.gitignore\", \"!keep.txt\\n\", context));\n\t\t\t\t// Not a work tree yet: `.gitignore` files have no effect.\n\t\t\t\tassert.ok((await listed(env, \".\")).entries.includes(\"f out/x.js\"));\n\t\t\t\tgetOrThrow(await env.writeFile(\".git/HEAD\", \"ref: refs/heads/main\\n\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\".git/info/exclude\", \"keep.txt\\n\", context));\n\t\t\t\tassert.deepEqual((await listed(env, \".\", { exclude: [\"node_modules\"] })).entries, [\n\t\t\t\t\t\"f .gitignore\",\n\t\t\t\t\t\"d sub\",\n\t\t\t\t\t\"f sub/.gitignore\",\n\t\t\t\t\t\"f sub/keep.txt\",\n\t\t\t\t]);\n\t\t\t\t// A directory inside the work tree applies its parents' rules.\n\t\t\t\tassert.deepEqual((await listed(env, \"sub\")).entries, [\"f .gitignore\", \"f keep.txt\"]);\n\t\t\t\tconst all = (await listed(env, \".\", { gitignore: false })).entries;\n\t\t\t\tassert.ok(\n\t\t\t\t\tall.includes(\"f out/x.js\") && all.includes(\"f node_modules/m/i.js\") && all.includes(\"f keep.txt\"),\n\t\t\t\t);\n\t\t\t\tassert.ok(!all.some((entry) => entry.includes(\".git/\") || entry === \"d .git\"));\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles stops at its bounds and reports truncated\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"a\", \"b\", \"c\"]);\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 2 }), { entries: [\"f a\", \"f b\"], truncated: true });\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 3 }), {\n\t\t\t\t\tentries: [\"f a\", \"f b\", \"f c\"],\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t\t\t// Each entry counts its path plus two bytes.\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxBytes: 6 }), { entries: [\"f a\", \"f b\"], truncated: true });\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 0 }), { entries: [], truncated: true });\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", { maxEntries: -1 }, context)), \"invalid\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", { timeoutMs: 1.5 }, context)), \"invalid\");\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles fails on missing directories, files, and aborts\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"\", context));\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\"missing\", undefined, context)), \"not_found\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\"file.txt\", undefined, context)), \"not_directory\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", undefined, abortedContext())), \"aborted\");\n\t\t\t}),\n\t\t);\n\t}\n\n\tif (symlinks && options.listFiles) {\n\t\tcases.push(\n\t\t\tcreateCase(\"listFiles lists symbolic links without following them\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"dir/inner.txt\", \"\", context));\n\t\t\t\tconst linked = await env.exec(\n\t\t\t\t\t[...shell, \"ln -s dir link && ln -s missing dangling && ln -s .. dir/loop\"],\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\t\t\t\tassert.deepEqual((await listed(env, \".\")).entries, [\n\t\t\t\t\t\"l dangling\",\n\t\t\t\t\t\"d dir\",\n\t\t\t\t\t\"f dir/inner.txt\",\n\t\t\t\t\t\"l dir/loop\",\n\t\t\t\t\t\"l link\",\n\t\t\t\t]);\n\t\t\t\t// The listed directory itself may be a link.\n\t\t\t\tassert.deepEqual((await listed(env, \"link\")).entries, [\"f inner.txt\", \"l loop\"]);\n\t\t\t}),\n\t\t);\n\t}\n\n\tif (symlinks) {\n\t\tcases.push(\n\t\t\tcreateCase(\"binary reader follows symlinks unless noFollow refuses the final one\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"target.txt\", \"target\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"sub/inner.txt\", \"inner\", context));\n\t\t\t\tconst linked = await env.exec(\n\t\t\t\t\t[...shell, \"ln -s target.txt link.txt && ln -s sub dirlink\"],\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\n\t\t\t\tconst followed = getOrThrow(await env.openBinaryReader(\"link.txt\", undefined, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await followed.read(0, 10, context))), \"target\");\n\t\t\t\tawait followed.close(context);\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\terrorCode(await env.openBinaryReader(\"link.txt\", { noFollow: true }, context)),\n\t\t\t\t\t\"invalid\",\n\t\t\t\t);\n\n\t\t\t\t// Only the final component is refused; earlier symlinked directories still resolve.\n\t\t\t\tconst inner = getOrThrow(await env.openBinaryReader(\"dirlink/inner.txt\", { noFollow: true }, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await inner.read(0, 10, context))), \"inner\");\n\t\t\t\tawait inner.close(context);\n\t\t\t}),\n\n\t\t\twatchCase(\"watch reports changes to the file a watched symbolic link points to\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"one\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"config\", undefined, context));\n\t\t\t\tconst linked = await env.exec([...shell, \"ln -s ../data/real.md config/AGENTS.md\"], undefined, context);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\t\t\t\tawait watching(env, [{ path: \"config/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\t\tawait expectChange(\"config/AGENTS.md\", async () => {\n\t\t\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"two!\", context));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn cases;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"env-conformance.js","sourceRoot":"","sources":["../../src/testing/env-conformance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAIN,UAAU,GAKV,MAAM,iBAAiB,CAAC;AAGzB,MAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAIlC,SAAS,cAAc;IACtB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,OAAO,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,MAAyC;IAC3D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,OAAO,CACrB,GAAiB,EACjB,IAAY,EACZ,UAAkB;IAElB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,CAAC;QACJ,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC;AAED,sFAAsF;AACtF,KAAK,UAAU,MAAM,CACpB,GAAiB,EACjB,IAAY,EACZ,OAA0B;IAE1B,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAW,CAAC;IACpE,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9E,SAAS,EAAE,OAAO,CAAC,SAAS;KAC5B,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,MAAM,CAAC,MAAkB,EAAE,IAAY;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CACvB,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,IAAI,CAAC,CACtG,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,KAAK,UAAU,QAAQ,CACtB,GAAiB,EACjB,OAA+B,EAC/B,GAKmB;IAEnB,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAChG,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3F,MAAM,GAAG,CAAC;YACT,OAAO;YACP,QAAQ;YACR,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM;gBAC9B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC5B,MAAM,MAAM,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBACnC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;oBACpE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;wBAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC7F,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC;YACF,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;YAAS,CAAC;QACV,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC1C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAa,EAAE,SAAkB,EAAsB,EAAE,CAAC,CAAC;QAC5F,IAAI;QACJ,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;KAChC,CAAC,CAAC;IACH,4FAA4F;IAC5F,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,IAAa,EAAsB,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACtG,MAAM,WAAW,GAAG,KAAK,EAAE,GAAiB,EAAE,OAAmC,EAAE,GAAY,EAAE,EAAE;QAClG,MAAM,MAAM,GAA8C,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,OAAO,EACP;YACC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;YACrC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;gBAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;YAC7B,CAAC;SACD,EACD,OAAO,CACP,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAyB;QACnC,UAAU,CAAC,oDAAoD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1F,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5F,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC7E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACpF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC3E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC,CAAC;QAEF,UAAU,CAAC,wDAAwD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAClF,gHAAgH;YAChH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;gBAC7B,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;aAC9F,CAAC,CAAC;YACH,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACvF,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAmC;oBAC9C,CAAC,CAAC,EAAE,SAAS,CAAC;oBACd,CAAC,CAAC,EAAE,CAAC,CAAC;oBACN,CAAC,CAAC,EAAE,CAAC,CAAC;oBACN,CAAC,CAAC,EAAE,CAAC,CAAC;oBACN,CAAC,CAAC,EAAE,SAAS,CAAC;oBACd,CAAC,CAAC,EAAE,CAAC,CAAC;iBACN,CAAC;gBACF,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;oBAC3C,MAAM,IAAI,GAAG,UAAU,CACtB,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAC7F,CAAC;oBACF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACjD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAC1C,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;oBACpF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACpD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACnF,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC3E,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAClF,CAAC;gBACD,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE;oBACtF,KAAK,EAAE,KAAK,CAAC,MAAM;oBACnB,GAAG,EAAE,KAAK,CAAC,MAAM;oBACjB,aAAa,EAAE,CAAC;iBAChB,CAAC,CAAC;gBACH,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACzG,CAAC;oBAAS,CAAC;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QAEF,UAAU,CAAC,+DAA+D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACzF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACnF,IAAI,CAAC;gBACJ,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC5D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1F,CAAC;oBAAS,CAAC;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QAEF,UAAU,CAAC,oEAAoE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACrG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC1G,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC/G,CAAC,CAAC;QAEF,UAAU,CAAC,iDAAiD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3E,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5D,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAChF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YACrF,MAAM,CAAC,gBAAgB,CACtB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CACzB,CAAC;QACH,CAAC,CAAC;QAEF,UAAU,CAAC,8DAA8D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACxF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,CAAC,CAAC;QAEF,UAAU,CAAC,kDAAkD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACxF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;YACrD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1F,CAAC,CAAC;QAEF,UAAU,CAAC,2DAA2D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;gBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAClG,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC;gBACJ,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;oBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpG,MAAM,OAAO,GAAe,EAAE,CAAC;gBAC/B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;oBACxD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC9B,IAAI,IAAI,CAAC,IAAI;wBAAE,MAAM;gBACtB,CAAC;gBACD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;oBAAS,CAAC;gBACV,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QAEF,SAAS,CAAC,2EAA2E,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACvE,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBACH,wDAAwD;gBACxD,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;oBACnE,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBAC1C,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,4DAA4D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrF,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBAC7E,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,gEAAgE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACzF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACrF,+DAA+D;gBAC/D,MAAM,YAAY,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;oBACpD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;oBACpD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;oBACtD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,mEAAmE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YACtE,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBAC9F,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBACnE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;oBACrD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;oBACrD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,+DAA+D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACxF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAkB;gBAC9B,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE;aACvF,CAAC;YACF,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC1E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC1E,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtF,CAAC,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAC/F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;wBAAE,SAAS;oBACtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjC,MAAM,CAAC,EAAE,CACR,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAC1E,YAAY,IAAI,EAAE,CAClB,CAAC;oBACH,CAAC;gBACF,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,sEAAsE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,MAAM,OAAO,GAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACvD,MAAM,YAAY,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;oBAChD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,qDAAqD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBACrF,MAAM,YAAY,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;oBACzC,UAAU,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;oBACpE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;oBAC9C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;oBAC9C,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,SAAS,CAAC,oCAAoC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7D,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/G,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,0BAA0B,CAAC,CAAC;YAC/F,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,UAAU,CAAC,iEAAiE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3F,MAAM,OAAO,GAAG,kDAAkD,CAAC;YACnE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE;gBACjD,GAAG,KAAK;gBACR,0BAA0B;gBAC1B,OAAO;gBACP,OAAO;gBACP,KAAK;aACL,CAAC,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC,CAAC;QAEF,UAAU,CAAC,sDAAsD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAChF,MAAM,MAAM,GAAG,yCAAyC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEF,UAAU,CAAC,qCAAqC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,6BAA6B,CAAC,EAAE,KAAK,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtF,CAAC,CAAC;QAEF,UAAU,CAAC,mEAAmE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7F,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,wCAAwC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EACzF,aAAa,CACb,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACtF,CAAC,CAAC;QAEF,UAAU,CAAC,6DAA6D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACvF,MAAM,KAAK,GAAG,IAAI,CAAC;YACnB,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;YAC/F,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,CAAC,GAAG,KAAK,EAAE,uBAAuB,KAAK,uCAAuC,CAAC,EAC/E;gBACC,MAAM;gBACN,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;oBAClC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAChC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;wBAC5B,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;wBAClC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;wBAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;wBAClD,MAAM,CAAC,EAAE,CACR,KAAK,GAAG,MAAM,CAAC,QAAQ,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,EAC1D,4CAA4C,CAC5C,CAAC;wBACF,IAAI,GAAG,EAAE,CAAC;oBACX,CAAC;oBACD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;oBACrC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACxC,IAAI,IAAI,IAAI,CAAC;gBACd,CAAC;aACD,EACD,OAAO,CACP,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YAChF,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,yCAAyC,CAAC,CAAC;QAChH,CAAC,CAAC;QAEF,UAAU,CAAC,4CAA4C,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACtE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;YAClF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YACxG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACzD,CAAC,CAAC;KACF,CAAC;IAEF,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAiB,EAAE,KAAwB,EAAE,EAAE;YACtE,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC;QACF,KAAK,CAAC,IAAI,CACT,UAAU,CAAC,iEAAiE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC3F,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7E,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;gBACxC,OAAO,EAAE;oBACR,WAAW;oBACX,aAAa;oBACb,SAAS;oBACT,KAAK;oBACL,OAAO;oBACP,aAAa;oBACb,WAAW;oBACX,SAAS;oBACT,SAAS;iBACT;gBACD,SAAS,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;gBACrE,SAAS;gBACT,KAAK;gBACL,OAAO;gBACP,aAAa;gBACb,WAAW;gBACX,SAAS;gBACT,SAAS;aACT,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAChF,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAChG,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,EAEF,UAAU,CAAC,0EAA0E,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;YACrG,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YACxE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1E,0DAA0D;YAC1D,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;YACnE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC,CAAC;YAChF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5E,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;gBACjF,cAAc;gBACd,OAAO;gBACP,kBAAkB;gBAClB,gBAAgB;aAChB,CAAC,CAAC;YACH,+DAA+D;YAC/D,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;YACrF,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACnE,MAAM,CAAC,EAAE,CACR,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CACjG,CAAC;YACF,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC,EAEF,UAAU,CAAC,qDAAqD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/E,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1G,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE;gBAC3D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;gBAC9B,SAAS,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,6CAA6C;YAC7C,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxG,MAAM,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9F,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACjG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAClG,CAAC,CAAC,EAEF,UAAU,CAAC,2DAA2D,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACrF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAChG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YACrG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAU,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAClG,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CACT,UAAU,CAAC,uDAAuD,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACjF,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,CAAC,GAAG,KAAK,EAAE,+DAA+D,CAAC,EAC3E,SAAS,EACT,OAAO,CACP,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE;gBAClD,YAAY;gBACZ,OAAO;gBACP,iBAAiB;gBACjB,YAAY;gBACZ,QAAQ;aACR,CAAC,CAAC;YACH,6CAA6C;YAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CACT,UAAU,CAAC,sEAAsE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAChG,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACjE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAC5B,CAAC,GAAG,KAAK,EAAE,gDAAgD,CAAC,EAC5D,SAAS,EACT,OAAO,CACP,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAEnD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC9F,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE9B,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,EAC9E,SAAS,CACT,CAAC;YAEF,oFAAoF;YACpF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;YACvG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1F,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC,CAAC,EAEF,SAAS,CAAC,qEAAqE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9F,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YAChE,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,wCAAwC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACxG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnD,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;gBAC9E,MAAM,YAAY,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;oBACjD,UAAU,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CACF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord/context\";\nimport { BACKGROUND_CONTEXT, withAbortSignal } from \"@earendil-works/chord/context\";\nimport {\n\ttype ExecutionEnv,\n\ttype FileChange,\n\ttype FileInfo,\n\tgetOrThrow,\n\ttype ListFilesOptions,\n\ttype Result,\n\ttype ShellOutputInfo,\n\ttype WatchTarget,\n} from \"../env/index.ts\";\nimport type { EnvConformanceCase, EnvConformanceOptions } from \"./types.ts\";\n\nconst context = BACKGROUND_CONTEXT;\nconst decoder = new TextDecoder();\nconst encoder = new TextEncoder();\n\ntype EnvTest = (env: ExecutionEnv) => Promise<void>;\n\nfunction abortedContext(): Context {\n\tconst controller = new AbortController();\n\tcontroller.abort();\n\treturn withAbortSignal(controller.signal, BACKGROUND_CONTEXT);\n}\n\nfunction errorCode(result: Result<unknown, { code: string }>): string | undefined {\n\treturn result.ok ? undefined : result.error.code;\n}\n\nasync function readAll(\n\tenv: ExecutionEnv,\n\tpath: string,\n\tmaxEntries: number,\n): Promise<{ pages: FileInfo[][]; done: boolean }> {\n\tconst reader = getOrThrow(await env.openDirReader(path, context));\n\tconst pages: FileInfo[][] = [];\n\ttry {\n\t\tfor (let page = 0; page < 1000; page++) {\n\t\t\tconst next = getOrThrow(await reader.next(maxEntries, context));\n\t\t\tpages.push(next.entries);\n\t\t\tif (next.done) return { pages, done: true };\n\t\t}\n\t\treturn { pages, done: false };\n\t} finally {\n\t\tawait reader.close(context);\n\t}\n}\n\n/** A listing as `<kind letter> <path>` lines (`f`, `d`, `l`), with its truncation. */\nasync function listed(\n\tenv: ExecutionEnv,\n\tpath: string,\n\toptions?: ListFilesOptions,\n): Promise<{ entries: string[]; truncated: boolean }> {\n\tif (env.listFiles === undefined) throw new Error(\"The environment does not implement listFiles\");\n\tconst listing = getOrThrow(await env.listFiles(path, options, context));\n\tconst letter = { file: \"f\", directory: \"d\", symlink: \"l\" } as const;\n\treturn {\n\t\tentries: listing.entries.map((entry) => `${letter[entry.kind]} ${entry.path}`),\n\t\ttruncated: listing.truncated,\n\t};\n}\n\n/** Whether a change reports `path`: an overflow, or a reported path at or above it. */\nfunction covers(change: FileChange, path: string): boolean {\n\tif (change.kind === \"overflow\") return true;\n\tif (change.kind !== \"paths\") return false;\n\treturn change.paths.some(\n\t\t(reported) => path === reported || path.startsWith(`${reported}/`) || path.startsWith(`${reported}\\\\`),\n\t);\n}\n\n/** Watch `targets` while `run` changes files, with a helper that waits for a change reporting a path. */\nasync function watching(\n\tenv: ExecutionEnv,\n\ttargets: readonly WatchTarget[],\n\trun: (helpers: {\n\t\treadonly changes: FileChange[];\n\t\t/** Wait up to three seconds for a change, after the call, that reports `path`. */\n\t\texpectChange(path: string, change: () => Promise<void>): Promise<void>;\n\t\tabsolute(path: string): Promise<string>;\n\t}) => Promise<void>,\n): Promise<void> {\n\tconst changes: FileChange[] = [];\n\tconst watcher = getOrThrow(await env.watch(targets, (change) => changes.push(change), context));\n\ttry {\n\t\tconst absolute = async (path: string) => getOrThrow(await env.absolutePath(path, context));\n\t\tawait run({\n\t\t\tchanges,\n\t\t\tabsolute,\n\t\t\tasync expectChange(path, change) {\n\t\t\t\tconst target = await absolute(path);\n\t\t\t\tconst from = changes.length;\n\t\t\t\tawait change();\n\t\t\t\tconst deadline = Date.now() + 3000;\n\t\t\t\twhile (!changes.slice(from).some((entry) => covers(entry, target))) {\n\t\t\t\t\tif (Date.now() > deadline) {\n\t\t\t\t\t\tthrow new Error(`No change reported ${target}; got ${JSON.stringify(changes.slice(from))}`);\n\t\t\t\t\t}\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 20));\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t} finally {\n\t\tawait watcher.stop(context);\n\t}\n}\n\n/**\n * Creates runner-independent cases for an `ExecutionEnv`. `withEnv` must call and await its callback exactly once per\n * case with an environment whose `cwd` is a fresh, empty, writable directory.\n */\nexport function createEnvConformance(options: EnvConformanceOptions): readonly EnvConformanceCase[] {\n\tconst assert = options.assertions;\n\tconst shell = options.shell ?? [\"sh\", \"-c\"];\n\tconst symlinks = options.symlinks ?? true;\n\tconst createCase = (name: string, test: EnvTest, timeoutMs?: number): EnvConformanceCase => ({\n\t\tname,\n\t\t...(timeoutMs === undefined ? {} : { timeoutMs }),\n\t\trun: () => options.withEnv(test),\n\t});\n\t// Watch cases wait up to three seconds per step, longer than test runners allow by default.\n\tconst watchCase = (name: string, test: EnvTest): EnvConformanceCase => createCase(name, test, 30_000);\n\tconst execCollect = async (env: ExecutionEnv, command: string | readonly string[], cwd?: string) => {\n\t\tconst output: Record<ShellOutputInfo[\"stream\"], string> = { stdout: \"\", stderr: \"\" };\n\t\tconst result = await env.exec(\n\t\t\tcommand,\n\t\t\t{\n\t\t\t\t...(cwd === undefined ? {} : { cwd }),\n\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\toutput[info.stream] += text;\n\t\t\t\t},\n\t\t\t},\n\t\t\tcontext,\n\t\t);\n\t\treturn { result, ...output };\n\t};\n\n\tconst cases: EnvConformanceCase[] = [\n\t\tcreateCase(\"binary reader reads byte ranges of the opened file\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"data.txt\", \"hello world\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"data.txt\", undefined, context));\n\t\t\tconst info = getOrThrow(await reader.info(context));\n\t\t\tassert.partialDeepEqual(info, { name: \"data.txt\", kind: \"file\", size: 11 });\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 5, context))), \"hello\");\n\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(6, 100, context))), \"world\");\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(11, 4, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(50, 1, context)).length, 0);\n\t\t\tassert.strictEqual(getOrThrow(await reader.read(3, 0, context)).length, 0);\n\t\t\tassert.strictEqual(errorCode(await reader.read(-1, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1.5, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.read(0, 1, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.info(context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"binary reader scans lines like decoding the whole file\", async (env) => {\n\t\t\t// A byte-order mark, an invalid sequence before a newline, an empty line, a later U+FEFF, and no final newline.\n\t\t\tconst bytes = Uint8Array.from([\n\t\t\t\t0xef, 0xbb, 0xbf, 0x61, 0x0a, 0xe2, 0x82, 0x0a, 0x0a, 0xef, 0xbb, 0xbf, 0x62, 0x0a, 0xc3, 0xa9,\n\t\t\t]);\n\t\t\tgetOrThrow(await env.writeFile(\"lines.txt\", bytes, context));\n\t\t\tconst lines = new TextDecoder().decode(bytes).split(\"\\n\");\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"lines.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tconst ranges: [number, number | undefined][] = [\n\t\t\t\t\t[0, undefined],\n\t\t\t\t\t[0, 1],\n\t\t\t\t\t[1, 3],\n\t\t\t\t\t[2, 3],\n\t\t\t\t\t[3, undefined],\n\t\t\t\t\t[4, 9],\n\t\t\t\t];\n\t\t\t\tfor (const [startLine, endLine] of ranges) {\n\t\t\t\t\tconst scan = getOrThrow(\n\t\t\t\t\t\tawait reader.scanLines({ startLine, ...(endLine === undefined ? {} : { endLine }) }, context),\n\t\t\t\t\t);\n\t\t\t\t\tconst selected = lines.slice(startLine, endLine);\n\t\t\t\t\tconst range = (from: number, to: number) =>\n\t\t\t\t\t\tnew TextDecoder(\"utf-8\", { ignoreBOM: from > 0 }).decode(bytes.subarray(from, to));\n\t\t\t\t\tassert.strictEqual(scan.newlines, lines.length - 1);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.end), selected.join(\"\\n\"));\n\t\t\t\t\tassert.strictEqual(scan.selectedBytes, encoder.encode(selected.join(\"\\n\")).length);\n\t\t\t\t\tassert.strictEqual(range(scan.start, scan.firstLineEnd), lines[startLine]);\n\t\t\t\t\tassert.strictEqual(scan.firstLineBytes, encoder.encode(lines[startLine]).length);\n\t\t\t\t}\n\t\t\t\tassert.partialDeepEqual(getOrThrow(await reader.scanLines({ startLine: 9 }, context)), {\n\t\t\t\t\tstart: bytes.length,\n\t\t\t\t\tend: bytes.length,\n\t\t\t\t\tselectedBytes: 0,\n\t\t\t\t});\n\t\t\t\tassert.strictEqual(errorCode(await reader.scanLines({ startLine: 2, endLine: 2 }, context)), \"invalid\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader keeps reading the file it opened after a rename\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"one\", context));\n\t\t\tconst reader = getOrThrow(await env.openBinaryReader(\"a.txt\", undefined, context));\n\t\t\ttry {\n\t\t\t\tgetOrThrow(await env.renameFile(\"a.txt\", \"b.txt\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"a.txt\", \"two\", context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await reader.read(0, 10, context))), \"one\");\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(\"binary reader refuses directories, missing files and aborted opens\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"dir\", undefined, context)), \"is_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"missing.txt\", undefined, context)), \"not_found\");\n\t\t\tassert.strictEqual(errorCode(await env.openBinaryReader(\"file.txt\", undefined, abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader pages every entry exactly once\", async (env) => {\n\t\t\tconst names = [\"a.txt\", \"b.txt\", \"c.txt\", \"d.txt\", \"e.txt\"];\n\t\t\tfor (const name of names) getOrThrow(await env.writeFile(name, name, context));\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst { pages, done } = await readAll(env, \".\", 2);\n\t\t\tassert.ok(done, \"directory reader reached the end\");\n\t\t\tfor (const page of pages) assert.ok(page.length <= 2, \"page within maxEntries\");\n\t\t\tconst entries = pages.flat();\n\t\t\tassert.deepEqual(entries.map((entry) => entry.name).sort(), [...names, \"sub\"].sort());\n\t\t\tassert.strictEqual(entries.find((entry) => entry.name === \"sub\")?.kind, \"directory\");\n\t\t\tassert.partialDeepEqual(\n\t\t\t\tentries.find((entry) => entry.name === \"a.txt\"),\n\t\t\t\t{ kind: \"file\", size: 5 },\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\"directory reader reports the end and refuses use after close\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"empty\", undefined, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"empty\", context));\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.deepEqual(getOrThrow(await reader.next(10, context)), { entries: [], done: true });\n\t\t\tassert.strictEqual(errorCode(await reader.next(0, context)), \"invalid\");\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, abortedContext())), \"aborted\");\n\t\t\tawait reader.close(context);\n\t\t\tawait reader.close(context);\n\t\t\tassert.strictEqual(errorCode(await reader.next(1, context)), \"invalid\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader refuses missing paths and files\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\"missing\", context)), \"not_found\");\n\t\t\tconst file = await env.openDirReader(\"file.txt\", context);\n\t\t\tassert.strictEqual(errorCode(file), \"not_directory\");\n\t\t\tassert.strictEqual(errorCode(await env.openDirReader(\".\", abortedContext())), \"aborted\");\n\t\t}),\n\n\t\tcreateCase(\"directory reader skips entries removed during enumeration\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"dir\", undefined, context));\n\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.writeFile(`dir/${name}`, name, context));\n\t\t\tconst reader = getOrThrow(await env.openDirReader(\"dir\", context));\n\t\t\ttry {\n\t\t\t\tfor (const name of [\"x\", \"y\", \"z\"]) getOrThrow(await env.remove(`dir/${name}`, undefined, context));\n\t\t\t\tconst entries: FileInfo[] = [];\n\t\t\t\tfor (let page = 0; page < 10; page++) {\n\t\t\t\t\tconst next = getOrThrow(await reader.next(10, context));\n\t\t\t\t\tentries.push(...next.entries);\n\t\t\t\t\tif (next.done) break;\n\t\t\t\t}\n\t\t\t\tassert.deepEqual(entries, []);\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing file's creation, changes, replacement and removal\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\t// Editors replace a file by renaming a new one over it.\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md.tmp\", \"three\", context));\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"AGENTS.md.tmp\", \"AGENTS.md\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"AGENTS.md\", \"four\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.remove(\"AGENTS.md\", undefined, context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch reports a missing target whose ancestors are created\", async (env) => {\n\t\t\tawait watching(env, [{ path: \"a/b/c/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"a/b/c/AGENTS.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"a/b/c/AGENTS.md\", \"x\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows directories created together with their contents\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\t// Written before any watcher on the new directories can exist.\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"one\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/SKILL.md\", \"two!\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/b/c/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/b/c/SKILL.md\", \"deeper\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps watching a path whose parent is renamed and recreated\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"proj/.pi/skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"proj/.pi/skills\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"proj/.pi\", \"proj/old\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"proj/.pi/skills/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"proj/.pi/skills/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch skips excluded entries and reports a rename out of them\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"skills\", undefined, context));\n\t\t\tconst targets: WatchTarget[] = [\n\t\t\t\t{ path: \"skills\", recursive: true, exclude: { hidden: true, names: [\"node_modules\"] } },\n\t\t\t];\n\t\t\tawait watching(env, targets, async ({ changes, expectChange, absolute }) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/node_modules/dep/SKILL.md\", \"dep\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"skills/.SKILL.md.tmp\", \"draft\", context));\n\t\t\t\tawait expectChange(\"skills/SKILL.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/.SKILL.md.tmp\", \"skills/SKILL.md\", context));\n\t\t\t\t});\n\t\t\t\tconst hidden = [await absolute(\"skills/node_modules\"), await absolute(\"skills/.SKILL.md.tmp\")];\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tif (change.kind !== \"paths\") continue;\n\t\t\t\t\tfor (const path of change.paths) {\n\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t!hidden.some((excluded) => path === excluded || path.startsWith(excluded)),\n\t\t\t\t\t\t\t`excluded ${path}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch keeps recursive coverage where a non-recursive target overlaps\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/one.md\", \"one\", context));\n\t\t\tconst targets: WatchTarget[] = [{ path: \"skills\" }, { path: \"skills\", recursive: true }];\n\t\t\tawait watching(env, targets, async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a/two.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/two.md\", \"two\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch follows a directory replaced at the same path\", async (env) => {\n\t\t\tgetOrThrow(await env.writeFile(\"skills/a/x.md\", \"x\", context));\n\t\t\tawait watching(env, [{ path: \"skills\", recursive: true }], async ({ expectChange }) => {\n\t\t\t\tawait expectChange(\"skills/a\", async () => {\n\t\t\t\t\tgetOrThrow(await env.renameFile(\"skills/a\", \"skills-old\", context));\n\t\t\t\t\tgetOrThrow(await env.createDir(\"skills/a\", undefined, context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"y\", context));\n\t\t\t\t});\n\t\t\t\tawait expectChange(\"skills/a/y.md\", async () => {\n\t\t\t\t\tgetOrThrow(await env.writeFile(\"skills/a/y.md\", \"yy\", context));\n\t\t\t\t});\n\t\t\t});\n\t\t}),\n\n\t\twatchCase(\"watch stops reporting once stopped\", async (env) => {\n\t\t\tconst changes: FileChange[] = [];\n\t\t\tconst watcher = getOrThrow(await env.watch([{ path: \"file.txt\" }], (change) => changes.push(change), context));\n\t\t\tassert.ok(watcher.mode === \"native\" || watcher.mode === \"polling\", \"watcher reports its mode\");\n\t\t\tawait watcher.stop(context);\n\t\t\tawait watcher.stop(context);\n\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"x\", context));\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tassert.deepEqual(changes, []);\n\t\t}),\n\n\t\tcreateCase(\"argv exec passes arguments to the program without shell parsing\", async (env) => {\n\t\t\tconst hostile = \"it's $(touch pwned) `touch pwned` *; touch pwned\";\n\t\t\tconst { result, stdout } = await execCollect(env, [\n\t\t\t\t...shell,\n\t\t\t\t'printf \"%s|%s\" \"$1\" \"$2\"',\n\t\t\t\t\"argv0\",\n\t\t\t\thostile,\n\t\t\t\t\"a b\",\n\t\t\t]);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tassert.strictEqual(stdout, `${hostile}|a b`);\n\t\t\tassert.strictEqual(getOrThrow(await env.exists(\"pwned\", context)), false);\n\t\t}),\n\n\t\tcreateCase(\"exec reports the stream of every chunk in both forms\", async (env) => {\n\t\t\tconst script = \"printf out; printf err >&2; printf more\";\n\t\t\tconst argv = await execCollect(env, [...shell, script]);\n\t\t\tassert.strictEqual(getOrThrow(argv.result).exitCode, 0);\n\t\t\tassert.strictEqual(argv.stdout, \"outmore\");\n\t\t\tassert.strictEqual(argv.stderr, \"err\");\n\t\t\tconst string = await execCollect(env, script);\n\t\t\tassert.strictEqual(getOrThrow(string.result).exitCode, 0);\n\t\t\tassert.strictEqual(string.stdout, \"outmore\");\n\t\t\tassert.strictEqual(string.stderr, \"err\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec honors cwd and exit codes\", async (env) => {\n\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\tconst made = await execCollect(env, [...shell, \"printf x > made.txt; exit 3\"], \"sub\");\n\t\t\tassert.strictEqual(getOrThrow(made.result).exitCode, 3);\n\t\t\tassert.strictEqual(getOrThrow(await env.readTextFile(\"sub/made.txt\", context)), \"x\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec reports missing programs and empty argv as spawn errors\", async (env) => {\n\t\t\tassert.strictEqual(\n\t\t\t\terrorCode(await env.exec([\"pi-durable-conformance-missing-program\"], undefined, context)),\n\t\t\t\t\"spawn_error\",\n\t\t\t);\n\t\t\tassert.strictEqual(errorCode(await env.exec([], undefined, context)), \"spawn_error\");\n\t\t}),\n\n\t\tcreateCase(\"windowed exec keeps the exact tail and counts what it skips\", async (env) => {\n\t\t\tconst lines = 2000;\n\t\t\tconst window = { maxBytes: 200, maxLines: 5, minIntervalMs: 0, bytesPerSecond: 1_000_000_000 };\n\t\t\tlet bytes = 0;\n\t\t\tlet newlines = 0;\n\t\t\tlet tail = \"\";\n\t\t\tconst result = await env.exec(\n\t\t\t\t[...shell, `i=0; while [ $i -lt ${lines} ]; do echo line-$i; i=$((i+1)); done`],\n\t\t\t\t{\n\t\t\t\t\twindow,\n\t\t\t\t\tonOutput: (text, _context, info) => {\n\t\t\t\t\t\tif (info.skipped !== undefined) {\n\t\t\t\t\t\t\tbytes += info.skipped.bytes;\n\t\t\t\t\t\t\tnewlines += info.skipped.newlines;\n\t\t\t\t\t\t\tconst after = encoder.encode(text).length;\n\t\t\t\t\t\t\tconst afterNewlines = text.split(\"\\n\").length - 1;\n\t\t\t\t\t\t\tassert.ok(\n\t\t\t\t\t\t\t\tafter > window.maxBytes || afterNewlines > window.maxLines,\n\t\t\t\t\t\t\t\t\"a skip is followed by more than the window\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\ttail = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbytes += encoder.encode(text).length;\n\t\t\t\t\t\tnewlines += text.split(\"\\n\").length - 1;\n\t\t\t\t\t\ttail += text;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tassert.strictEqual(getOrThrow(result).exitCode, 0);\n\t\t\tconst expected = Array.from({ length: lines }, (_, index) => `line-${index}\\n`);\n\t\t\tassert.strictEqual(bytes, expected.join(\"\").length);\n\t\t\tassert.strictEqual(newlines, lines);\n\t\t\tassert.ok(tail.endsWith(expected.slice(-window.maxLines).join(\"\")), \"the delivered output ends with the tail\");\n\t\t}),\n\n\t\tcreateCase(\"argv exec distinguishes timeout from abort\", async (env) => {\n\t\t\tconst timedOut = await env.exec([...shell, \"sleep 2\"], { timeout: 0.1 }, context);\n\t\t\tassert.strictEqual(errorCode(timedOut), \"timeout\");\n\t\t\tconst controller = new AbortController();\n\t\t\tconst running = env.exec([...shell, \"sleep 2\"], undefined, withAbortSignal(controller.signal, context));\n\t\t\tsetTimeout(() => controller.abort(), 100);\n\t\t\tassert.strictEqual(errorCode(await running), \"aborted\");\n\t\t}),\n\t];\n\n\tif (options.listFiles) {\n\t\tconst writeAll = async (env: ExecutionEnv, files: readonly string[]) => {\n\t\t\tfor (const file of files) getOrThrow(await env.writeFile(file, \"\", context));\n\t\t};\n\t\tcases.push(\n\t\t\tcreateCase(\"listFiles lists files and directories depth first in name order\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"b.txt\", \"a/z.txt\", \"a/b/c.txt\", \".hidden/x\", \"A.txt\"]);\n\t\t\t\tgetOrThrow(await env.createDir(\"empty\", undefined, context));\n\t\t\t\tassert.deepEqual(await listed(env, \".\"), {\n\t\t\t\t\tentries: [\n\t\t\t\t\t\t\"d .hidden\",\n\t\t\t\t\t\t\"f .hidden/x\",\n\t\t\t\t\t\t\"f A.txt\",\n\t\t\t\t\t\t\"d a\",\n\t\t\t\t\t\t\"d a/b\",\n\t\t\t\t\t\t\"f a/b/c.txt\",\n\t\t\t\t\t\t\"f a/z.txt\",\n\t\t\t\t\t\t\"f b.txt\",\n\t\t\t\t\t\t\"d empty\",\n\t\t\t\t\t],\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t\t\tassert.deepEqual((await listed(env, \".\", { hidden: false })).entries, [\n\t\t\t\t\t\"f A.txt\",\n\t\t\t\t\t\"d a\",\n\t\t\t\t\t\"d a/b\",\n\t\t\t\t\t\"f a/b/c.txt\",\n\t\t\t\t\t\"f a/z.txt\",\n\t\t\t\t\t\"f b.txt\",\n\t\t\t\t\t\"d empty\",\n\t\t\t\t]);\n\t\t\t\tconst expected = { entries: [\"d b\", \"f b/c.txt\", \"f z.txt\"], truncated: false };\n\t\t\t\tassert.deepEqual(await listed(env, \"a\"), expected);\n\t\t\t\tassert.deepEqual(await listed(env, getOrThrow(await env.absolutePath(\"a\", context))), expected);\n\t\t\t\tassert.deepEqual(await listed(env, \"empty\"), { entries: [], truncated: false });\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles skips what git ignores in work trees, .git, and excluded names\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"keep.txt\", \"out/x.js\", \"sub/keep.txt\", \"sub/drop.log\", \"node_modules/m/i.js\"]);\n\t\t\t\tgetOrThrow(await env.writeFile(\".gitignore\", \"out/\\n*.log\\n\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"sub/.gitignore\", \"!keep.txt\\n\", context));\n\t\t\t\t// Not a work tree yet: `.gitignore` files have no effect.\n\t\t\t\tassert.ok((await listed(env, \".\")).entries.includes(\"f out/x.js\"));\n\t\t\t\tgetOrThrow(await env.writeFile(\".git/HEAD\", \"ref: refs/heads/main\\n\", context));\n\t\t\t\tgetOrThrow(await env.writeFile(\".git/info/exclude\", \"keep.txt\\n\", context));\n\t\t\t\tassert.deepEqual((await listed(env, \".\", { exclude: [\"node_modules\"] })).entries, [\n\t\t\t\t\t\"f .gitignore\",\n\t\t\t\t\t\"d sub\",\n\t\t\t\t\t\"f sub/.gitignore\",\n\t\t\t\t\t\"f sub/keep.txt\",\n\t\t\t\t]);\n\t\t\t\t// A directory inside the work tree applies its parents' rules.\n\t\t\t\tassert.deepEqual((await listed(env, \"sub\")).entries, [\"f .gitignore\", \"f keep.txt\"]);\n\t\t\t\tconst all = (await listed(env, \".\", { gitignore: false })).entries;\n\t\t\t\tassert.ok(\n\t\t\t\t\tall.includes(\"f out/x.js\") && all.includes(\"f node_modules/m/i.js\") && all.includes(\"f keep.txt\"),\n\t\t\t\t);\n\t\t\t\tassert.ok(!all.some((entry) => entry.includes(\".git/\") || entry === \"d .git\"));\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles stops at its bounds and reports truncated\", async (env) => {\n\t\t\t\tawait writeAll(env, [\"a\", \"b\", \"c\"]);\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 2 }), { entries: [\"f a\", \"f b\"], truncated: true });\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 3 }), {\n\t\t\t\t\tentries: [\"f a\", \"f b\", \"f c\"],\n\t\t\t\t\ttruncated: false,\n\t\t\t\t});\n\t\t\t\t// Each entry counts its path plus two bytes.\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxBytes: 6 }), { entries: [\"f a\", \"f b\"], truncated: true });\n\t\t\t\tassert.deepEqual(await listed(env, \".\", { maxEntries: 0 }), { entries: [], truncated: true });\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", { maxEntries: -1 }, context)), \"invalid\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", { timeoutMs: 1.5 }, context)), \"invalid\");\n\t\t\t}),\n\n\t\t\tcreateCase(\"listFiles fails on missing directories, files, and aborts\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"file.txt\", \"\", context));\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\"missing\", undefined, context)), \"not_found\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\"file.txt\", undefined, context)), \"not_directory\");\n\t\t\t\tassert.strictEqual(errorCode(await env.listFiles!(\".\", undefined, abortedContext())), \"aborted\");\n\t\t\t}),\n\t\t);\n\t}\n\n\tif (symlinks && options.listFiles) {\n\t\tcases.push(\n\t\t\tcreateCase(\"listFiles lists symbolic links without following them\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"dir/inner.txt\", \"\", context));\n\t\t\t\tconst linked = await env.exec(\n\t\t\t\t\t[...shell, \"ln -s dir link && ln -s missing dangling && ln -s .. dir/loop\"],\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\t\t\t\tassert.deepEqual((await listed(env, \".\")).entries, [\n\t\t\t\t\t\"l dangling\",\n\t\t\t\t\t\"d dir\",\n\t\t\t\t\t\"f dir/inner.txt\",\n\t\t\t\t\t\"l dir/loop\",\n\t\t\t\t\t\"l link\",\n\t\t\t\t]);\n\t\t\t\t// The listed directory itself may be a link.\n\t\t\t\tassert.deepEqual((await listed(env, \"link\")).entries, [\"f inner.txt\", \"l loop\"]);\n\t\t\t}),\n\t\t);\n\t}\n\n\tif (symlinks) {\n\t\tcases.push(\n\t\t\tcreateCase(\"binary reader follows symlinks unless noFollow refuses the final one\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"target.txt\", \"target\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"sub\", undefined, context));\n\t\t\t\tgetOrThrow(await env.writeFile(\"sub/inner.txt\", \"inner\", context));\n\t\t\t\tconst linked = await env.exec(\n\t\t\t\t\t[...shell, \"ln -s target.txt link.txt && ln -s sub dirlink\"],\n\t\t\t\t\tundefined,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\n\t\t\t\tconst followed = getOrThrow(await env.openBinaryReader(\"link.txt\", undefined, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await followed.read(0, 10, context))), \"target\");\n\t\t\t\tawait followed.close(context);\n\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\terrorCode(await env.openBinaryReader(\"link.txt\", { noFollow: true }, context)),\n\t\t\t\t\t\"invalid\",\n\t\t\t\t);\n\n\t\t\t\t// Only the final component is refused; earlier symlinked directories still resolve.\n\t\t\t\tconst inner = getOrThrow(await env.openBinaryReader(\"dirlink/inner.txt\", { noFollow: true }, context));\n\t\t\t\tassert.strictEqual(decoder.decode(getOrThrow(await inner.read(0, 10, context))), \"inner\");\n\t\t\t\tawait inner.close(context);\n\t\t\t}),\n\n\t\t\twatchCase(\"watch reports changes to the file a watched symbolic link points to\", async (env) => {\n\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"one\", context));\n\t\t\t\tgetOrThrow(await env.createDir(\"config\", undefined, context));\n\t\t\t\tconst linked = await env.exec([...shell, \"ln -s ../data/real.md config/AGENTS.md\"], undefined, context);\n\t\t\t\tassert.strictEqual(getOrThrow(linked).exitCode, 0);\n\t\t\t\tawait watching(env, [{ path: \"config/AGENTS.md\" }], async ({ expectChange }) => {\n\t\t\t\t\tawait expectChange(\"config/AGENTS.md\", async () => {\n\t\t\t\t\t\tgetOrThrow(await env.writeFile(\"data/real.md\", \"two!\", context));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn cases;\n}\n"]}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createExpectAssertions, type ExpectLike } from "./assertions.ts";
|
|
2
|
+
export { commitWrites } from "./commit-writes.ts";
|
|
2
3
|
export { createEnvConformance } from "./env-conformance.ts";
|
|
3
4
|
export { registerEnvConformance, registerStorageConformance, type StorageConformanceRunner } from "./runner.ts";
|
|
4
5
|
export { STORAGE_MEMORY_SCALES, STORAGE_READ_BENCHMARKS, STORAGE_WRITE_BENCHMARKS, type StorageBenchmarkDataset, type StorageBenchmarkScale, type StorageReadBenchmark, type StorageWriteBenchmark, seedStorageBenchmark, seedStorageWriteBenchmark, storageBenchmarkPrimaryRecordCount, TIMING_SCALE, } from "./storage-benchmark.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAChH,OAAO,EACN,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,kCAAkC,EAClC,YAAY,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EACX,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC1B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAChH,OAAO,EACN,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,kCAAkC,EAClC,YAAY,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EACX,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC1B,MAAM,YAAY,CAAC"}
|
package/dist/testing/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createExpectAssertions } from "./assertions.js";
|
|
2
|
+
export { commitWrites } from "./commit-writes.js";
|
|
2
3
|
export { createEnvConformance } from "./env-conformance.js";
|
|
3
4
|
export { registerEnvConformance, registerStorageConformance } from "./runner.js";
|
|
4
5
|
export { STORAGE_MEMORY_SCALES, STORAGE_READ_BENCHMARKS, STORAGE_WRITE_BENCHMARKS, seedStorageBenchmark, seedStorageWriteBenchmark, storageBenchmarkPrimaryRecordCount, TIMING_SCALE, } from "./storage-benchmark.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAmB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAiC,MAAM,aAAa,CAAC;AAChH,OAAO,EACN,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EAKxB,oBAAoB,EACpB,yBAAyB,EACzB,kCAAkC,EAClC,YAAY,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["export { createExpectAssertions, type ExpectLike } from \"./assertions.ts\";\nexport { createEnvConformance } from \"./env-conformance.ts\";\nexport { registerEnvConformance, registerStorageConformance, type StorageConformanceRunner } from \"./runner.ts\";\nexport {\n\tSTORAGE_MEMORY_SCALES,\n\tSTORAGE_READ_BENCHMARKS,\n\tSTORAGE_WRITE_BENCHMARKS,\n\ttype StorageBenchmarkDataset,\n\ttype StorageBenchmarkScale,\n\ttype StorageReadBenchmark,\n\ttype StorageWriteBenchmark,\n\tseedStorageBenchmark,\n\tseedStorageWriteBenchmark,\n\tstorageBenchmarkPrimaryRecordCount,\n\tTIMING_SCALE,\n} from \"./storage-benchmark.ts\";\nexport { createStorageConformance } from \"./storage-conformance.ts\";\nexport type {\n\tEnvConformanceAssertions,\n\tEnvConformanceCase,\n\tEnvConformanceOptions,\n\tEnvConformanceProvider,\n\tStorageConformanceAssertions,\n\tStorageConformanceCase,\n\tStorageConformanceOptions,\n\tStorageConformanceProvider,\n} from \"./types.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAmB,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAiC,MAAM,aAAa,CAAC;AAChH,OAAO,EACN,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EAKxB,oBAAoB,EACpB,yBAAyB,EACzB,kCAAkC,EAClC,YAAY,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["export { createExpectAssertions, type ExpectLike } from \"./assertions.ts\";\nexport { commitWrites } from \"./commit-writes.ts\";\nexport { createEnvConformance } from \"./env-conformance.ts\";\nexport { registerEnvConformance, registerStorageConformance, type StorageConformanceRunner } from \"./runner.ts\";\nexport {\n\tSTORAGE_MEMORY_SCALES,\n\tSTORAGE_READ_BENCHMARKS,\n\tSTORAGE_WRITE_BENCHMARKS,\n\ttype StorageBenchmarkDataset,\n\ttype StorageBenchmarkScale,\n\ttype StorageReadBenchmark,\n\ttype StorageWriteBenchmark,\n\tseedStorageBenchmark,\n\tseedStorageWriteBenchmark,\n\tstorageBenchmarkPrimaryRecordCount,\n\tTIMING_SCALE,\n} from \"./storage-benchmark.ts\";\nexport { createStorageConformance } from \"./storage-conformance.ts\";\nexport type {\n\tEnvConformanceAssertions,\n\tEnvConformanceCase,\n\tEnvConformanceOptions,\n\tEnvConformanceProvider,\n\tStorageConformanceAssertions,\n\tStorageConformanceCase,\n\tStorageConformanceOptions,\n\tStorageConformanceProvider,\n} from \"./types.ts\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-benchmark.d.ts","sourceRoot":"","sources":["../../src/testing/storage-benchmark.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,cAAc,EAEd,UAAU,EACV,OAAO,EACP,GAAG,EACH,OAAO,EAKP,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"storage-benchmark.d.ts","sourceRoot":"","sources":["../../src/testing/storage-benchmark.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,cAAc,EAEd,UAAU,EACV,OAAO,EACP,GAAG,EACH,OAAO,EAKP,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,qBAAqB,EAGjE,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,qBAK1B,CAAC;AAEF,QAAA,MAAM,YAAY,YAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAK,CAAU,CAAC;AAMlD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAUvF;AAID,MAAM,MAAM,uBAAuB,GAAG;IACrC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACxF,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;IACvB,QAAQ,CAAC,qBAAqB,EAAE,cAAc,CAAC;IAC/C,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACtC,CAAC;AAoBF,yFAAyF;AACzF,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,qBAAoC,GACzC,OAAO,CAAC,uBAAuB,CAAC,CAiMlC;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,QAAQ,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAkGlE,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,sEAAsE;AACtE,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/E;AAED,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAiFpE,CAAC"}
|