@ggui-ai/negotiator 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/dist/ensure-conforming-contract.d.ts +8 -6
- package/dist/ensure-conforming-contract.d.ts.map +1 -1
- package/dist/ensure-conforming-contract.js +7 -2
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/preserve-declared-members.d.ts +89 -0
- package/dist/preserve-declared-members.d.ts.map +1 -0
- package/dist/preserve-declared-members.js +427 -0
- package/dist/synthesize-contract.d.ts.map +1 -1
- package/dist/synthesize-contract.js +20 -16
- package/package.json +3 -3
- package/src/ensure-conforming-contract.ts +15 -8
- package/src/index.ts +5 -3
- package/src/preserve-declared-members.ts +521 -0
- package/src/synthesize-contract.ts +22 -16
- package/dist/contract-hash.d.ts +0 -54
- package/dist/contract-hash.d.ts.map +0 -1
- package/dist/contract-hash.js +0 -96
- package/dist/preserve-action-members.d.ts +0 -79
- package/dist/preserve-action-members.d.ts.map +0 -1
- package/dist/preserve-action-members.js +0 -199
- package/src/contract-hash.ts +0 -102
- package/src/preserve-action-members.ts +0 -224
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @ggui-ai/negotiator
|
|
2
2
|
|
|
3
3
|
Contract-synthesis + match-judge engine for
|
|
4
|
-
[
|
|
4
|
+
[GGUI](https://github.com/ggui-ai/ggui)'s handshake.
|
|
5
5
|
|
|
6
6
|
Given an agent's draft contract + intent, this package synthesizes (or
|
|
7
7
|
repairs) a conforming `DataContract`, judges blueprint-match candidates for
|
|
@@ -36,11 +36,13 @@ pnpm add @ggui-ai/negotiator
|
|
|
36
36
|
an untrusted draft and, on errors, deterministically normalizes or
|
|
37
37
|
LLM-repairs it so the handshake always returns a contract that passes the
|
|
38
38
|
backstop. Never throws. A repair keeps every member the draft declared on
|
|
39
|
-
|
|
40
|
-
`
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
each entry it keeps under the same key, on every spec (an action's
|
|
40
|
+
`oneShot` and `nextStep`, a stream's `mode` and `replay`, a tool's
|
|
41
|
+
`toolInfo.description`, …), puts back any tool the repair dropped
|
|
42
|
+
(`REPAIR_ENTRY_RESTORED`), and names anything it cannot keep at its own
|
|
43
|
+
path — the LLM repair as `REPAIR_MEMBER_DROPPED` / `REPAIR_ENTRY_DROPPED`
|
|
44
|
+
with the gate's reason in the message, the salvaged subset with the
|
|
45
|
+
gate's code at the cut path — so a declaration is never lost silently.
|
|
44
46
|
- **`rerankCandidates(...)`** — LLM judge that re-ranks blueprint-match
|
|
45
47
|
retrieval candidates (the semantic-match decision used by
|
|
46
48
|
`decideHandshake`).
|
|
@@ -63,12 +63,14 @@ export interface EnsureConformingAccepted {
|
|
|
63
63
|
* findings that rejected the agent's draft — so the agent-side model
|
|
64
64
|
* learns what it got wrong, even though we repaired it. On
|
|
65
65
|
* `llm-repair` they additionally carry one `REPAIR_MEMBER_DROPPED` per
|
|
66
|
-
* declared
|
|
67
|
-
* `REPAIR_ENTRY_DROPPED` per draft
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
66
|
+
* declared member the repair could not keep, on any spec, one
|
|
67
|
+
* `REPAIR_ENTRY_DROPPED` per draft entry it no longer carries under its
|
|
68
|
+
* key, and one `REPAIR_ENTRY_RESTORED` (`warn`) per draft tool the repair
|
|
69
|
+
* dropped and the overlay put back (ggui#1421, ggui#1430 — a repair
|
|
70
|
+
* preserves the draft's declarations, `oneShot` above all, and names any
|
|
71
|
+
* it must drop, each at its own path with the gate's reason in the
|
|
72
|
+
* message; a member under repair is named by the gate's own finding at
|
|
73
|
+
* that same path).
|
|
72
74
|
* The error findings are the union of what the gate refused on the
|
|
73
75
|
* raw draft and on its normalized form (the gate stops after the
|
|
74
76
|
* shape phase, so the raw lint alone can hide a semantic finding). On
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-conforming-contract.d.ts","sourceRoot":"","sources":["../src/ensure-conforming-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ensure-conforming-contract.d.ts","sourceRoot":"","sources":["../src/ensure-conforming-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD;;;;;;;;;GASG;AACH,MAAM,MAAM,sBAAsB,GAC9B,UAAU,GACV,YAAY,GACZ,YAAY,GACZ,iBAAiB,CAAC;AAEtB,4DAA4D;AAC5D,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,sBAAsB,GAAG,wBAAwB,GAAG,wBAAwB,CAAC;AAEzF,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CAAE,EACjC,IAAI,EAAE;IACJ,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACnD,GACA,OAAO,CAAC,sBAAsB,CAAC,CAyJjC"}
|
|
@@ -37,6 +37,7 @@ import { lintContract, dataContractSchema, } from '@ggui-ai/protocol';
|
|
|
37
37
|
import { synthesizeContract } from './synthesize-contract.js';
|
|
38
38
|
import { liftedRequiredNames, normalizeDraft } from './normalize-draft.js';
|
|
39
39
|
import { salvageConformingSubset } from './salvage-draft.js';
|
|
40
|
+
import { REPAIR_ENTRY_RESTORED } from './preserve-declared-members.js';
|
|
40
41
|
export async function ensureConformingContract(deps, args) {
|
|
41
42
|
const lint = lintContract(args.draft);
|
|
42
43
|
const warnFindings = lint.warnings.map((w) => ({
|
|
@@ -125,7 +126,8 @@ export async function ensureConformingContract(deps, args) {
|
|
|
125
126
|
});
|
|
126
127
|
if (synth.contract !== null &&
|
|
127
128
|
lintContract(synth.contract).errors.length === 0) {
|
|
128
|
-
const droppedPaths = synth.dropped.map((d) => d.path);
|
|
129
|
+
const droppedPaths = synth.dropped.filter((d) => d.code !== REPAIR_ENTRY_RESTORED).map((d) => d.path);
|
|
130
|
+
const restoredPaths = synth.dropped.filter((d) => d.code === REPAIR_ENTRY_RESTORED).map((d) => d.path);
|
|
129
131
|
return {
|
|
130
132
|
contract: synth.contract,
|
|
131
133
|
origin: 'synth',
|
|
@@ -133,7 +135,10 @@ export async function ensureConformingContract(deps, args) {
|
|
|
133
135
|
findings: withGateFindings(synth.dropped),
|
|
134
136
|
reasoning: `repaired the agent draft to pass validateContract — ${synth.reason}` +
|
|
135
137
|
(droppedPaths.length > 0
|
|
136
|
-
? `; dropped ${droppedPaths.length} declared
|
|
138
|
+
? `; dropped ${droppedPaths.length} declared ${droppedPaths.length === 1 ? 'member/entry' : 'members/entries'} the repair could not keep (${droppedPaths.join(', ')}) — each is a finding`
|
|
139
|
+
: '') +
|
|
140
|
+
(restoredPaths.length > 0
|
|
141
|
+
? `; restored ${restoredPaths.length} declared ${restoredPaths.length === 1 ? 'tool' : 'tools'} the repair dropped (${restoredPaths.join(', ')}) — each is a finding`
|
|
137
142
|
: ''),
|
|
138
143
|
};
|
|
139
144
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,8 +8,11 @@
|
|
|
8
8
|
* handshake always returns a valid contract;
|
|
9
9
|
* - judges blueprint-match candidates for reuse (`rerankCandidates`);
|
|
10
10
|
* - validates contract structure + novelty (`contract-validators`);
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
11
|
+
* - normalizes untrusted drafts (`normalizeDraft`).
|
|
12
|
+
*
|
|
13
|
+
* Contract identity is not this package's: the cache key is
|
|
14
|
+
* `blueprintKey(contract)` and the variant key is `variantKey(variance)`,
|
|
15
|
+
* both from `@ggui-ai/protocol/blueprint-key`.
|
|
13
16
|
*
|
|
14
17
|
* The HANDSHAKE DECISION itself (find-similar → reuse vs synth-create)
|
|
15
18
|
* lives in the shared `decideHandshake` core in
|
|
@@ -24,7 +27,6 @@
|
|
|
24
27
|
* This barrel stays narrow — it exports only the minimum surface
|
|
25
28
|
* consumers need. Each additive export carries semver weight.
|
|
26
29
|
*/
|
|
27
|
-
export { hashContract, buildVariant } from './contract-hash.js';
|
|
28
30
|
export type { LLMCaller, LLMCallerConfig, Metered, TokenUsage, ToolSchema } from './llm-caller.js';
|
|
29
31
|
export { llmRerankJudge, rerankCandidates, RERANK_SYSTEM_PROMPT } from './llm-rerank.js';
|
|
30
32
|
export type { RerankCandidate, RerankDecision, RerankJudge, RerankQuery, } from './llm-rerank.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzF,YAAY,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EACV,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,yBAAyB,EACzB,6BAA6B,EAC7B,wBAAwB,EACxB,6BAA6B,EAC7B,gCAAgC,GACjC,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,8 +8,11 @@
|
|
|
8
8
|
* handshake always returns a valid contract;
|
|
9
9
|
* - judges blueprint-match candidates for reuse (`rerankCandidates`);
|
|
10
10
|
* - validates contract structure + novelty (`contract-validators`);
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
11
|
+
* - normalizes untrusted drafts (`normalizeDraft`).
|
|
12
|
+
*
|
|
13
|
+
* Contract identity is not this package's: the cache key is
|
|
14
|
+
* `blueprintKey(contract)` and the variant key is `variantKey(variance)`,
|
|
15
|
+
* both from `@ggui-ai/protocol/blueprint-key`.
|
|
13
16
|
*
|
|
14
17
|
* The HANDSHAKE DECISION itself (find-similar → reuse vs synth-create)
|
|
15
18
|
* lives in the shared `decideHandshake` core in
|
|
@@ -24,7 +27,6 @@
|
|
|
24
27
|
* This barrel stays narrow — it exports only the minimum surface
|
|
25
28
|
* consumers need. Each additive export carries semver weight.
|
|
26
29
|
*/
|
|
27
|
-
export { hashContract, buildVariant } from './contract-hash.js';
|
|
28
30
|
export { llmRerankJudge, rerankCandidates, RERANK_SYSTEM_PROMPT } from './llm-rerank.js';
|
|
29
31
|
export { synthesizeContract } from './synthesize-contract.js';
|
|
30
32
|
export { ensureConformingContract } from './ensure-conforming-contract.js';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declared-member preservation: the deterministic backstop that keeps a
|
|
3
|
+
* repair FAITHFUL to what the agent DECLARED (ggui#1421 for actions,
|
|
4
|
+
* ggui#1430 for every spec).
|
|
5
|
+
*
|
|
6
|
+
* The repair tool authors only a few members per entry:
|
|
7
|
+
* - `label` / `schema` on an action;
|
|
8
|
+
* - `schema` / `required` on a prop;
|
|
9
|
+
* - `schema` / `default` on a context slot;
|
|
10
|
+
* - `schema` / `source` on a stream channel;
|
|
11
|
+
* - `toolInfo.inputSchema` / `toolInfo.outputSchema` / `usage` on a tool.
|
|
12
|
+
* Every other member is the agent's declaration: an action's `oneShot` (the
|
|
13
|
+
* one-shot line keys on it being ON THE SERVED CONTRACT, ggui#1108 →
|
|
14
|
+
* ggui#1223), a stream's `mode` / `replay` / `complete`, a prop's
|
|
15
|
+
* `default`, a tool's `toolInfo.description`. A repair that re-emits an entry
|
|
16
|
+
* from the tool's answer alone drops them silently. So the overlay below puts
|
|
17
|
+
* the draft's declarations back on the repaired candidate, under the SAME
|
|
18
|
+
* KEY, and names whatever it cannot keep.
|
|
19
|
+
*
|
|
20
|
+
* The toolbox is the agent's too. A repair that drops a tool entry the draft
|
|
21
|
+
* declared leaves every `nextStep` naming it dangling, so a draft tool the
|
|
22
|
+
* candidate lacks is restored WHOLE. Only tools: a repair may legitimately
|
|
23
|
+
* move or remove an action, prop, context or stream entry.
|
|
24
|
+
*
|
|
25
|
+
* Findings, each at its own path:
|
|
26
|
+
* - `REPAIR_MEMBER_DROPPED` at `<spec>.<name>.<member>`: a declared
|
|
27
|
+
* member the merged contract cannot carry (it fails its own schema, or
|
|
28
|
+
* the gate refuses it there or, for `nextStep`, as `CTR_SCHEMA_INCOMPAT`
|
|
29
|
+
* at the sibling `.schema`);
|
|
30
|
+
* - `REPAIR_ENTRY_DROPPED` at `<spec>.<name>`: a draft action, prop,
|
|
31
|
+
* context, stream or tool entry the proposal no longer carries under that
|
|
32
|
+
* key (renamed, moved or removed), named ONCE; its members are not owed
|
|
33
|
+
* one by one. A restored tool the gate refuses is named so, with the
|
|
34
|
+
* gate's reason;
|
|
35
|
+
* - `REPAIR_ENTRY_RESTORED` at `agentCapabilities.tools.<name>`
|
|
36
|
+
* (severity `warn`): a draft tool the repair dropped and the overlay put
|
|
37
|
+
* back, so a tool coming back is never silent.
|
|
38
|
+
*
|
|
39
|
+
* A member whose path a DRAFT finding already names is under repair: it is
|
|
40
|
+
* not restored, and its absence is named by that finding. A draft tool with a
|
|
41
|
+
* finding at or under its path is not restored. Paths follow the gate's
|
|
42
|
+
* convention (`propsSpec.<name>`, not `propsSpec.properties.<name>`).
|
|
43
|
+
* Model-independent: the overlay works whatever the repair LLM returns, and
|
|
44
|
+
* it never makes the proposal fail the gate BECAUSE of what it put back.
|
|
45
|
+
*/
|
|
46
|
+
import { type DataContract, type SuggestionFinding } from '@ggui-ai/protocol';
|
|
47
|
+
/** A declared member the repair could not keep; path `<spec>.<name>.<member>`. */
|
|
48
|
+
export declare const REPAIR_MEMBER_DROPPED: "REPAIR_MEMBER_DROPPED";
|
|
49
|
+
/** A draft entry the proposal no longer carries under its key; path `<spec>.<name>`. */
|
|
50
|
+
export declare const REPAIR_ENTRY_DROPPED: "REPAIR_ENTRY_DROPPED";
|
|
51
|
+
/** A draft tool the repair dropped and the overlay restored; path `agentCapabilities.tools.<name>`. */
|
|
52
|
+
export declare const REPAIR_ENTRY_RESTORED: "REPAIR_ENTRY_RESTORED";
|
|
53
|
+
/**
|
|
54
|
+
* Overlay the draft's declarations onto the candidate: every declared member
|
|
55
|
+
* of every entry the candidate carries under the same key (keeping what the
|
|
56
|
+
* repair authors), and every draft tool the candidate dropped, whole. A
|
|
57
|
+
* member or tool whose path a draft finding names is under repair and stays
|
|
58
|
+
* out. Then lint the merged contract and un-restore, until the tree is
|
|
59
|
+
* stable, every restored member the gate refuses (at its own path, or for
|
|
60
|
+
* `nextStep` as `CTR_SCHEMA_INCOMPAT` at the sibling `.schema`) and every
|
|
61
|
+
* restored tool whose presence adds a gate error, naming each one, so the
|
|
62
|
+
* returned contract never fails the gate BECAUSE of the overlay. A malformed
|
|
63
|
+
* candidate entry is left un-overlaid for the loop's own gate to retry;
|
|
64
|
+
* nothing here throws on the model's answer. Entries the candidate moved or
|
|
65
|
+
* removed (other than tools) get nothing back here: see
|
|
66
|
+
* {@link findDroppedEntries}.
|
|
67
|
+
*/
|
|
68
|
+
export declare function restoreDraftDeclaredMembers(draft: unknown, candidate: DataContract, underRepair: ReadonlySet<string>): {
|
|
69
|
+
readonly contract: DataContract;
|
|
70
|
+
readonly dropped: readonly SuggestionFinding[];
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Whether `finding` sits on an entry `contract` still carries: at its exact
|
|
74
|
+
* entry path or one of its member paths, never by dotted prefix (an action
|
|
75
|
+
* named `a` is not a prefix of `a.b`). Used to keep a repair's member and
|
|
76
|
+
* restore findings only for entries the final proposal carries.
|
|
77
|
+
*/
|
|
78
|
+
export declare function isOnSurvivingEntry(finding: SuggestionFinding, contract: DataContract): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* One `REPAIR_ENTRY_DROPPED` per draft entry, on every spec, that the
|
|
81
|
+
* candidate no longer carries under its key: renamed, moved or removed by the
|
|
82
|
+
* repair, or pruned by the loop's own placement pass. Its members are not
|
|
83
|
+
* owed one by one. When the gate refused the NAME itself (`CTR_DUP_NAME` /
|
|
84
|
+
* `CTR_RESERVED_NAME` at `<spec>.<name>`, so the path is under repair) the
|
|
85
|
+
* message says so and does not send the agent back to a name the gate will
|
|
86
|
+
* refuse again. Empty when every draft entry survived.
|
|
87
|
+
*/
|
|
88
|
+
export declare function findDroppedEntries(draft: unknown, candidate: DataContract, underRepair: ReadonlySet<string>): readonly SuggestionFinding[];
|
|
89
|
+
//# sourceMappingURL=preserve-declared-members.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preserve-declared-members.d.ts","sourceRoot":"","sources":["../src/preserve-declared-members.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,EAWL,KAAK,YAAY,EAGjB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAC;AACtE,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,EAAG,sBAA+B,CAAC;AACpE,uGAAuG;AACvG,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAC;AA4VtE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,YAAY,EACvB,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B;IAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,CA+CrF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAE9F;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,YAAY,EACvB,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,SAAS,iBAAiB,EAAE,CAa9B"}
|