loopforge 3.7.0 → 3.8.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.
Files changed (151) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +171 -157
  3. package/dist/audit.d.ts +53 -1
  4. package/dist/audit.d.ts.map +1 -1
  5. package/dist/audit.js +106 -22
  6. package/dist/audit.js.map +1 -1
  7. package/dist/canonical-state.d.ts +75 -69
  8. package/dist/canonical-state.d.ts.map +1 -1
  9. package/dist/canonical-state.js +276 -168
  10. package/dist/canonical-state.js.map +1 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +111 -12
  13. package/dist/cli.js.map +1 -1
  14. package/dist/cognitive-facts.d.ts +13 -0
  15. package/dist/cognitive-facts.d.ts.map +1 -1
  16. package/dist/cognitive-facts.js +30 -16
  17. package/dist/cognitive-facts.js.map +1 -1
  18. package/dist/cognitive-governance.d.ts +30 -6
  19. package/dist/cognitive-governance.d.ts.map +1 -1
  20. package/dist/cognitive-governance.js +74 -18
  21. package/dist/cognitive-governance.js.map +1 -1
  22. package/dist/committed-round.d.ts +109 -24
  23. package/dist/committed-round.d.ts.map +1 -1
  24. package/dist/committed-round.js +235 -52
  25. package/dist/committed-round.js.map +1 -1
  26. package/dist/contract-items.d.ts +55 -0
  27. package/dist/contract-items.d.ts.map +1 -0
  28. package/dist/contract-items.js +180 -0
  29. package/dist/contract-items.js.map +1 -0
  30. package/dist/enforcement-gate.d.ts +43 -20
  31. package/dist/enforcement-gate.d.ts.map +1 -1
  32. package/dist/enforcement-gate.js +269 -378
  33. package/dist/enforcement-gate.js.map +1 -1
  34. package/dist/engine.d.ts +11 -6
  35. package/dist/engine.d.ts.map +1 -1
  36. package/dist/engine.js +102 -67
  37. package/dist/engine.js.map +1 -1
  38. package/dist/evidence-claims.d.ts +4 -4
  39. package/dist/evidence-claims.d.ts.map +1 -1
  40. package/dist/evidence-claims.js +16 -14
  41. package/dist/evidence-claims.js.map +1 -1
  42. package/dist/evidence-provider.d.ts +91 -90
  43. package/dist/evidence-provider.d.ts.map +1 -1
  44. package/dist/evidence-provider.js +349 -160
  45. package/dist/evidence-provider.js.map +1 -1
  46. package/dist/explain.d.ts +76 -0
  47. package/dist/explain.d.ts.map +1 -0
  48. package/dist/explain.js +127 -0
  49. package/dist/explain.js.map +1 -0
  50. package/dist/generate-schema.js +250 -53
  51. package/dist/generate-schema.js.map +1 -1
  52. package/dist/index.d.ts +8 -7
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +7 -6
  55. package/dist/index.js.map +1 -1
  56. package/dist/loop-compiler.d.ts +41 -40
  57. package/dist/loop-compiler.d.ts.map +1 -1
  58. package/dist/loop-compiler.js +275 -515
  59. package/dist/loop-compiler.js.map +1 -1
  60. package/dist/loop-extras-parser.d.ts +0 -1
  61. package/dist/loop-extras-parser.d.ts.map +1 -1
  62. package/dist/loop-extras-parser.js +0 -4
  63. package/dist/loop-extras-parser.js.map +1 -1
  64. package/dist/loop-projection.d.ts.map +1 -1
  65. package/dist/loop-projection.js +3 -1
  66. package/dist/loop-projection.js.map +1 -1
  67. package/dist/mcp/round-lifecycle.d.ts +40 -21
  68. package/dist/mcp/round-lifecycle.d.ts.map +1 -1
  69. package/dist/mcp/round-lifecycle.js +173 -120
  70. package/dist/mcp/round-lifecycle.js.map +1 -1
  71. package/dist/mcp/server.d.ts.map +1 -1
  72. package/dist/mcp/server.js +63 -10
  73. package/dist/mcp/server.js.map +1 -1
  74. package/dist/mcp/session.d.ts +53 -7
  75. package/dist/mcp/session.d.ts.map +1 -1
  76. package/dist/mcp/session.js +240 -139
  77. package/dist/mcp/session.js.map +1 -1
  78. package/dist/mcp/submission-boundary.d.ts +89 -0
  79. package/dist/mcp/submission-boundary.d.ts.map +1 -0
  80. package/dist/mcp/submission-boundary.js +203 -0
  81. package/dist/mcp/submission-boundary.js.map +1 -0
  82. package/dist/mcp/tools.d.ts.map +1 -1
  83. package/dist/mcp/tools.js +377 -125
  84. package/dist/mcp/tools.js.map +1 -1
  85. package/dist/policy-metrics.js +2 -2
  86. package/dist/policy-metrics.js.map +1 -1
  87. package/dist/policy.d.ts +65 -95
  88. package/dist/policy.d.ts.map +1 -1
  89. package/dist/policy.js +151 -39
  90. package/dist/policy.js.map +1 -1
  91. package/dist/prompt-assembler.d.ts +7 -33
  92. package/dist/prompt-assembler.d.ts.map +1 -1
  93. package/dist/prompt-assembler.js +313 -473
  94. package/dist/prompt-assembler.js.map +1 -1
  95. package/dist/prompt-policy.d.ts +1 -4
  96. package/dist/prompt-policy.d.ts.map +1 -1
  97. package/dist/prompt-policy.js +6 -7
  98. package/dist/prompt-policy.js.map +1 -1
  99. package/dist/protocol.d.ts +411 -168
  100. package/dist/protocol.d.ts.map +1 -1
  101. package/dist/protocol.js +23 -69
  102. package/dist/protocol.js.map +1 -1
  103. package/dist/replay.js +2 -2
  104. package/dist/replay.js.map +1 -1
  105. package/dist/round-contract.d.ts +69 -57
  106. package/dist/round-contract.d.ts.map +1 -1
  107. package/dist/round-contract.js +104 -64
  108. package/dist/round-contract.js.map +1 -1
  109. package/dist/round-coordinator.d.ts +55 -16
  110. package/dist/round-coordinator.d.ts.map +1 -1
  111. package/dist/round-coordinator.js +179 -57
  112. package/dist/round-coordinator.js.map +1 -1
  113. package/dist/round-driver.d.ts +7 -5
  114. package/dist/round-driver.d.ts.map +1 -1
  115. package/dist/round-driver.js +2 -1
  116. package/dist/round-driver.js.map +1 -1
  117. package/dist/round-facts.d.ts +96 -0
  118. package/dist/round-facts.d.ts.map +1 -0
  119. package/dist/round-facts.js +216 -0
  120. package/dist/round-facts.js.map +1 -0
  121. package/dist/round-transaction.d.ts +23 -9
  122. package/dist/round-transaction.d.ts.map +1 -1
  123. package/dist/round-transaction.js +99 -22
  124. package/dist/round-transaction.js.map +1 -1
  125. package/dist/self-eval.d.ts +127 -11
  126. package/dist/self-eval.d.ts.map +1 -1
  127. package/dist/self-eval.js +517 -36
  128. package/dist/self-eval.js.map +1 -1
  129. package/dist/subgoal-state.d.ts +77 -0
  130. package/dist/subgoal-state.d.ts.map +1 -0
  131. package/dist/subgoal-state.js +198 -0
  132. package/dist/subgoal-state.js.map +1 -0
  133. package/dist/token-utils.d.ts +52 -19
  134. package/dist/token-utils.d.ts.map +1 -1
  135. package/dist/token-utils.js +83 -72
  136. package/dist/token-utils.js.map +1 -1
  137. package/dist/verification-gate.d.ts +27 -46
  138. package/dist/verification-gate.d.ts.map +1 -1
  139. package/dist/verification-gate.js +308 -557
  140. package/dist/verification-gate.js.map +1 -1
  141. package/dist/version.d.ts +5 -0
  142. package/dist/version.d.ts.map +1 -0
  143. package/dist/version.js +5 -0
  144. package/dist/version.js.map +1 -0
  145. package/dist/workspace.d.ts +9 -0
  146. package/dist/workspace.d.ts.map +1 -1
  147. package/dist/workspace.js +17 -0
  148. package/dist/workspace.js.map +1 -1
  149. package/loop_policy.json +17 -25
  150. package/package.json +7 -7
  151. package/skills/perception/SKILL.md +266 -64
@@ -0,0 +1,180 @@
1
+ /** Round Contract item status — the v3.8 verification skeleton.
2
+ *
3
+ * A contract declares ITEMS; each item binds evidence commands. The agent
4
+ * may only CLAIM `met` / `remaining`; whether an item is `verified`,
5
+ * `contradicted`, or `insufficient` is derived here from committed
6
+ * observations and the in-flight round. Nothing in this module writes state:
7
+ * it is a pure function of the committed round views, the current report,
8
+ * the current observations, and policy.
9
+ */
10
+ const EMPTY_VIEW = {
11
+ contractId: "",
12
+ closure: "open",
13
+ closed_at_round: null,
14
+ items: [],
15
+ verifiedCount: 0,
16
+ contradictedCount: 0,
17
+ insufficientCount: 0,
18
+ };
19
+ function itemClaims(item, slices) {
20
+ const claims = [];
21
+ for (const slice of slices) {
22
+ for (const claim of slice.report?.contract_item_claims ?? []) {
23
+ if (claim.item_id === item.id)
24
+ claims.push({ round: slice.round, outcome: claim.outcome });
25
+ }
26
+ }
27
+ return claims;
28
+ }
29
+ /** The round in which the item was last claimed `met` (null when the latest
30
+ * claim is `remaining` or there is none). */
31
+ function metClaimRound(claims) {
32
+ const last = claims[claims.length - 1];
33
+ return last && last.outcome === "met" ? last.round : null;
34
+ }
35
+ function evaluateCommand(commandId, declaredHash, slices, fromRound, configured) {
36
+ if (!configured) {
37
+ return {
38
+ verdict: "insufficient",
39
+ reason: `command "${commandId}" is no longer configured/enabled — cannot observe it`,
40
+ };
41
+ }
42
+ // v3.8.1: the LATEST observation at or after the claim decides, so the
43
+ // closing round's evidence is the one consulted. Scanning forward let an
44
+ // early pass outlive a later failure: the item stayed `verified`, its
45
+ // contract closed, and a success stop could reach `completed` in a round
46
+ // whose bound command the machine had just observed FAILING.
47
+ for (const slice of [...slices].reverse()) {
48
+ if (slice.round < fromRound)
49
+ continue;
50
+ const observation = slice.observations.find((item) => item.kind === "command" &&
51
+ item.phase === "after" &&
52
+ item.data.commandId === commandId);
53
+ if (!observation || observation.kind !== "command")
54
+ continue;
55
+ const data = observation.data;
56
+ if (declaredHash && data.configHash !== declaredHash) {
57
+ return {
58
+ verdict: "insufficient",
59
+ reason: `command "${commandId}" was reconfigured after declaration (round ${slice.round})`,
60
+ };
61
+ }
62
+ const changed = new Set(slice.observations
63
+ .filter((item) => item.providerId === "git")
64
+ .flatMap((item) => item.files));
65
+ if (observation.status === "passed") {
66
+ // A malformed observation must not crash the derivation the compile
67
+ // path, the projection, the coordinator, explain and audit all share:
68
+ // no entrypoint list means the tamper check simply has nothing to
69
+ // compare, the same posture as a command with no entrypoint files.
70
+ const entrypoints = Array.isArray(data.entrypointFiles) ? data.entrypointFiles : [];
71
+ if (changed.size > 0 && entrypoints.some((file) => changed.has(file))) {
72
+ return {
73
+ verdict: "contradicted",
74
+ reason: `command "${commandId}" passed but its entrypoint changed in round ${slice.round}`,
75
+ };
76
+ }
77
+ return { verdict: "verified", reason: "" };
78
+ }
79
+ if (observation.status === "failed") {
80
+ return {
81
+ verdict: "contradicted",
82
+ reason: `command "${commandId}" failed in round ${slice.round}` +
83
+ (typeof data.exitCode === "number" ? ` (exit ${data.exitCode})` : ""),
84
+ };
85
+ }
86
+ return {
87
+ verdict: "insufficient",
88
+ reason: `command "${commandId}" observed ${observation.status} in round ${slice.round}`,
89
+ };
90
+ }
91
+ return {
92
+ verdict: "insufficient",
93
+ reason: `command "${commandId}" produced no after-phase observation since round ${fromRound}`,
94
+ };
95
+ }
96
+ /** v3.8: Derive every item's status plus the contract's closure. */
97
+ export function deriveContractItemStatuses(input) {
98
+ const contract = input.contract;
99
+ if (!contract)
100
+ return EMPTY_VIEW;
101
+ const slices = [
102
+ ...input.rounds.map((round) => ({
103
+ round: round.round,
104
+ report: round.executionReport,
105
+ observations: round.observationDelta,
106
+ outcome: round.outcome,
107
+ })),
108
+ {
109
+ round: input.currentRound,
110
+ report: input.currentReport,
111
+ observations: input.currentObservations,
112
+ outcome: input.currentOutcome ?? null,
113
+ },
114
+ ].filter((slice) => slice.round < input.currentRound || slice.round === input.currentRound);
115
+ const enabledCommands = new Set(input.commands.filter((command) => command.enabled).map((command) => command.name));
116
+ const items = contract.items.map((item) => {
117
+ const claims = itemClaims(item, slices);
118
+ const metRound = metClaimRound(claims);
119
+ if (metRound === null) {
120
+ return {
121
+ itemId: item.id,
122
+ description: item.description,
123
+ status: "pending",
124
+ status_at_round: null,
125
+ history: [],
126
+ reasons: [],
127
+ };
128
+ }
129
+ const verdicts = item.verify_with.map((commandId) => evaluateCommand(commandId, contract.config_hash_by_command[commandId], slices, metRound, enabledCommands.has(commandId)));
130
+ const reasons = verdicts.map((verdict) => verdict.reason).filter(Boolean);
131
+ let status;
132
+ if (verdicts.some((verdict) => verdict.verdict === "contradicted")) {
133
+ status = "contradicted";
134
+ }
135
+ else if (verdicts.length > 0 && verdicts.every((verdict) => verdict.verdict === "verified")) {
136
+ status = "verified";
137
+ }
138
+ else {
139
+ status = "insufficient";
140
+ }
141
+ return {
142
+ itemId: item.id,
143
+ description: item.description,
144
+ status,
145
+ status_at_round: metRound,
146
+ history: [{ round: metRound, status, refs: item.verify_with }],
147
+ reasons,
148
+ };
149
+ });
150
+ const verifiedCount = items.filter((item) => item.status === "verified").length;
151
+ const contradictedCount = items.filter((item) => item.status === "contradicted").length;
152
+ const insufficientCount = items.filter((item) => item.status === "insufficient").length;
153
+ const committingRound = slices[slices.length - 1];
154
+ const blocked = committingRound?.outcome === "blocked";
155
+ const allVerified = items.length > 0 && verifiedCount === items.length;
156
+ const closure = allVerified ? "verified" : blocked ? "blocked" : "open";
157
+ return {
158
+ contractId: contract.id,
159
+ closure,
160
+ closed_at_round: closure === "open" ? null : committingRound?.round ?? null,
161
+ items,
162
+ verifiedCount,
163
+ contradictedCount,
164
+ insufficientCount,
165
+ };
166
+ }
167
+ /** v3.8: The round-level verification posture. */
168
+ export function roundVerificationStatus(view, report) {
169
+ if (view.contradictedCount > 0)
170
+ return "contradicted";
171
+ if (view.insufficientCount > 0)
172
+ return "insufficient";
173
+ // A success claim with no machine-backed item at all is insufficient too.
174
+ const claims = report?.contract_item_claims ?? [];
175
+ if (claims.some((claim) => claim.outcome === "met") && view.verifiedCount === 0) {
176
+ return "insufficient";
177
+ }
178
+ return "trusted";
179
+ }
180
+ //# sourceMappingURL=contract-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-items.js","sourceRoot":"","sources":["../src/contract-items.ts"],"names":[],"mappings":"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"}
@@ -35,30 +35,53 @@ export declare function findBacktrackTargetGitHead(restoreRound: number, vaultEn
35
35
  * v2.13: Includes concrete workspace restore instructions with affected
36
36
  * file lists from skipped rounds. The agent must restore the working tree
37
37
  * to the clean round's state before proceeding. */
38
- export declare function buildBacktrackPrompt(fromRound: number, toRound: number, triggerRule: string, skippedDiscoveries: string[],
38
+ export interface BacktrackRecoveryFacts {
39
+ /** v3.7.1: Rolled-back rounds (restore point + 1 … trigger round). */
40
+ failedRounds: number[];
41
+ /** v3.7.1: One approach per failed round — what must NOT be repeated. */
42
+ approaches: string[];
43
+ /** v3.7.1: Falsified assumptions collected from the failed rounds. */
44
+ wrongAssumptions: string[];
45
+ }
46
+ /** v3.8.1: the ONE Recovery Brief renderer.
47
+ *
48
+ * The rollback prompt and the state file's Recent tier used to carry two
49
+ * hand-written copies of these lines — differing in punctuation
50
+ * ("the redo is round N" vs "redo round N") and in whether an approach
51
+ * overflow count was shown at all. Two renderers over one rollback meant the
52
+ * two surfaces could describe the same event differently while both claiming
53
+ * to be derived facts. The facts are supplied by the caller: the coordinator
54
+ * from its live walk, the compile path from `decodeBacktrackRecord` on the
55
+ * committed decision. */
56
+ export declare function recoveryBriefLines(input: {
57
+ target: number;
58
+ triggerRule: string;
59
+ failedRounds: string[] | number[];
60
+ approaches: string[];
61
+ wrongAssumptions: string[];
62
+ recoveryRoundId?: string;
63
+ maxApproaches?: number;
64
+ maxAssumptions?: number;
65
+ }): string[];
66
+ export declare function buildBacktrackPrompt(fromRound: number, toRound: number, triggerRule: string, skippedDiscoveries: string[],
39
67
  /** v2.13: Files changed in the skipped rounds (from evidence snapshots).
40
68
  * Used to show the agent exactly what needs to be reverted. */
41
- skippedFiles?: string[],
69
+ skippedFiles?: string[],
42
70
  /** v2.12: Git HEAD commit hash at the backtrack point (current HEAD).
43
71
  * The agent must discard work back to the clean round's state. */
44
- gitHead?: string): string;
45
- /** Enforce round-boundary rules based on the verification gate's findings
46
- * and the agent's self-evaluation integrity.
47
- *
48
- * Rules run in priority order — the rules array below IS the priority
49
- * order; numeric IDs (R1–R9, R-EVID) reflect insertion history, not
50
- * priority. The first rule that fires wins.
51
- *
52
- * @param selfEval The agent's self-evaluation for the current round.
53
- * @param verifyResult The verification gate's output (from verifySelfEvaluation).
54
- * @param currentRound Current round number (1-based, BEFORE increment).
55
- * @param vaultEntries Vault entries for this loop (used for progress tracking).
56
- * @param consecutiveRejections How many consecutive rounds have already been rejected.
57
- * Starts at 0; increments on each reject; resets on accept.
58
- */
59
- export declare function enforceRound(selfEval: SelfEvaluation, verifyResult: VerificationResult, currentRound: number, vaultEntries: VaultEntry[], consecutiveRejections?: number,
60
- /** v2.12: Current clarification streak for R7 escalation. */
61
- driftClarificationStreak?: number): EnforcementResult;
72
+ gitHead?: string,
73
+ /** v3.7.1: The redo submission's roundId (loop:<id>:round:<toRound+1>). */
74
+ recoveryRoundId?: string,
75
+ /** v3.7.1: Derived Recovery Brief facts — committed facts + the
76
+ * in-flight attempt only; never rejected payloads. */
77
+ recovery?: BacktrackRecoveryFacts): string;
78
+ export declare function enforceRound(selfEval: SelfEvaluation, verifyResult: VerificationResult, currentRound: number, vaultEntries: VaultEntry[], consecutiveRejections?: number,
79
+ /** L4 (v3.7.x): which check rejected the PREVIOUS round. The coordinator
80
+ * resets consecutiveRejections to 1 whenever the check changes, so the
81
+ * counter only ever measures one check's streak — this field names that
82
+ * check and lets uniform rows escalate on THEIR OWN streak instead of
83
+ * inheriting an unrelated history. */
84
+ lastRejectionCheck?: string): EnforcementResult;
62
85
  /** Build a rejection prompt for the agent.
63
86
  *
64
87
  * The prompt clearly states the round was rejected, why, what the agent
@@ -1 +1 @@
1
- {"version":3,"file":"enforcement-gate.d.ts","sourceRoot":"","sources":["../src/enforcement-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AA4FvB;;iEAEiE;AACjE,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,UAAU,EAAE,EAC1B,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAgCxD;AAED;;;sCAGsC;AACtC,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,UAAU,EAAE,GACzB,MAAM,GAAG,IAAI,CAWf;AAED;;;;oDAIoD;AACpD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAAE;AAC5B;gEACgE;AAChE,YAAY,GAAE,MAAM,EAAO;AAC3B;mEACmE;AACnE,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAoJR;AAg5BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,kBAAkB,EAChC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,UAAU,EAAE,EAC1B,qBAAqB,GAAE,MAAU;AACjC,6DAA6D;AAC7D,wBAAwB,GAAE,MAAU,GACnC,iBAAiB,CAqFnB;AAED;;;;;;;;;;;;;;sEAcsE;AACtE,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,iBAAiB,EAChC,iBAAiB,GAAE,gBAAgB,EAAO,GACzC,MAAM,CA6CR"}
1
+ {"version":3,"file":"enforcement-gate.d.ts","sourceRoot":"","sources":["../src/enforcement-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AA0FvB;;iEAEiE;AACjE,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,UAAU,EAAE,EAC1B,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAgCxD;AAED;;;sCAGsC;AACtC,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,UAAU,EAAE,GACzB,MAAM,GAAG,IAAI,CAWf;AAED;;;;oDAIoD;AACpD,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yEAAyE;IACzE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;0BAS0B;AAC1B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,EAAE,CA6BX;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAAE;AAC5B;gEACgE;AAChE,YAAY,GAAE,MAAM,EAAO;AAC3B;mEACmE;AACnE,OAAO,CAAC,EAAE,MAAM;AAChB,2EAA2E;AAC3E,eAAe,CAAC,EAAE,MAAM;AACxB;uDACuD;AACvD,QAAQ,CAAC,EAAE,sBAAsB,GAChC,MAAM,CAmKR;AAwrBD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,kBAAkB,EAChC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,UAAU,EAAE,EAC1B,qBAAqB,GAAE,MAAU;AACjC;;;;uCAIuC;AACvC,kBAAkB,GAAE,MAAW,GAC9B,iBAAiB,CAoGnB;AAED;;;;;;;;;;;;;;sEAcsE;AACtE,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,iBAAiB,EAChC,iBAAiB,GAAE,gBAAgB,EAAO,GACzC,MAAM,CA6CR"}