hippo-memory 0.36.0 → 0.37.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 +16 -0
- package/dist/api.d.ts +20 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +23 -3
- package/dist/api.js.map +1 -1
- package/dist/benchmarks/e1.3/incident-recall-eval.js +74 -0
- package/dist/benchmarks/e1.3/incident-recall-eval.js.map +1 -0
- package/dist/benchmarks/e1.3/scenarios.json +2587 -0
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +102 -0
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +1 -0
- package/dist/cli.js +82 -0
- package/dist/cli.js.map +1 -1
- package/dist/connectors/slack/backfill.d.ts +42 -0
- package/dist/connectors/slack/backfill.d.ts.map +1 -0
- package/dist/connectors/slack/backfill.js +76 -0
- package/dist/connectors/slack/backfill.js.map +1 -0
- package/dist/connectors/slack/deletion.d.ts +14 -0
- package/dist/connectors/slack/deletion.d.ts.map +1 -0
- package/dist/connectors/slack/deletion.js +46 -0
- package/dist/connectors/slack/deletion.js.map +1 -0
- package/dist/connectors/slack/dlq.d.ts +21 -0
- package/dist/connectors/slack/dlq.d.ts.map +1 -0
- package/dist/connectors/slack/dlq.js +23 -0
- package/dist/connectors/slack/dlq.js.map +1 -0
- package/dist/connectors/slack/idempotency.d.ts +5 -0
- package/dist/connectors/slack/idempotency.d.ts.map +1 -0
- package/dist/connectors/slack/idempotency.js +13 -0
- package/dist/connectors/slack/idempotency.js.map +1 -0
- package/dist/connectors/slack/ingest.d.ts +27 -0
- package/dist/connectors/slack/ingest.d.ts.map +1 -0
- package/dist/connectors/slack/ingest.js +48 -0
- package/dist/connectors/slack/ingest.js.map +1 -0
- package/dist/connectors/slack/ratelimit.d.ts +9 -0
- package/dist/connectors/slack/ratelimit.d.ts.map +1 -0
- package/dist/connectors/slack/ratelimit.js +18 -0
- package/dist/connectors/slack/ratelimit.js.map +1 -0
- package/dist/connectors/slack/scope.d.ts +16 -0
- package/dist/connectors/slack/scope.d.ts.map +1 -0
- package/dist/connectors/slack/scope.js +13 -0
- package/dist/connectors/slack/scope.js.map +1 -0
- package/dist/connectors/slack/signature.d.ts +12 -0
- package/dist/connectors/slack/signature.d.ts.map +1 -0
- package/dist/connectors/slack/signature.js +20 -0
- package/dist/connectors/slack/signature.js.map +1 -0
- package/dist/connectors/slack/tenant-routing.d.ts +13 -0
- package/dist/connectors/slack/tenant-routing.d.ts.map +1 -0
- package/dist/connectors/slack/tenant-routing.js +17 -0
- package/dist/connectors/slack/tenant-routing.js.map +1 -0
- package/dist/connectors/slack/transform.d.ts +20 -0
- package/dist/connectors/slack/transform.d.ts.map +1 -0
- package/dist/connectors/slack/transform.js +31 -0
- package/dist/connectors/slack/transform.js.map +1 -0
- package/dist/connectors/slack/types.d.ts +35 -0
- package/dist/connectors/slack/types.d.ts.map +1 -0
- package/dist/connectors/slack/types.js +23 -0
- package/dist/connectors/slack/types.js.map +1 -0
- package/dist/connectors/slack/web-client.d.ts +12 -0
- package/dist/connectors/slack/web-client.d.ts.map +1 -0
- package/dist/connectors/slack/web-client.js +43 -0
- package/dist/connectors/slack/web-client.js.map +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +46 -1
- package/dist/db.js.map +1 -1
- package/dist/importers.js +3 -3
- package/dist/importers.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +174 -2
- package/dist/server.js.map +1 -1
- package/dist/src/ambient.js +147 -0
- package/dist/src/ambient.js.map +1 -0
- package/dist/src/api.js +343 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/audit.js +152 -0
- package/dist/src/audit.js.map +1 -0
- package/dist/src/auth.js +65 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/autolearn.js +143 -0
- package/dist/src/autolearn.js.map +1 -0
- package/dist/src/capture.js +512 -0
- package/dist/src/capture.js.map +1 -0
- package/dist/src/cli.js +4971 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/client.js +181 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/config.js +108 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/connectors/slack/backfill.js +76 -0
- package/dist/src/connectors/slack/backfill.js.map +1 -0
- package/dist/src/connectors/slack/deletion.js +46 -0
- package/dist/src/connectors/slack/deletion.js.map +1 -0
- package/dist/src/connectors/slack/dlq.js +23 -0
- package/dist/src/connectors/slack/dlq.js.map +1 -0
- package/dist/src/connectors/slack/idempotency.js +13 -0
- package/dist/src/connectors/slack/idempotency.js.map +1 -0
- package/dist/src/connectors/slack/ingest.js +48 -0
- package/dist/src/connectors/slack/ingest.js.map +1 -0
- package/dist/src/connectors/slack/ratelimit.js +18 -0
- package/dist/src/connectors/slack/ratelimit.js.map +1 -0
- package/dist/src/connectors/slack/scope.js +13 -0
- package/dist/src/connectors/slack/scope.js.map +1 -0
- package/dist/src/connectors/slack/signature.js +20 -0
- package/dist/src/connectors/slack/signature.js.map +1 -0
- package/dist/src/connectors/slack/tenant-routing.js +17 -0
- package/dist/src/connectors/slack/tenant-routing.js.map +1 -0
- package/dist/src/connectors/slack/transform.js +31 -0
- package/dist/src/connectors/slack/transform.js.map +1 -0
- package/dist/src/connectors/slack/types.js +23 -0
- package/dist/src/connectors/slack/types.js.map +1 -0
- package/dist/src/connectors/slack/web-client.js +43 -0
- package/dist/src/connectors/slack/web-client.js.map +1 -0
- package/dist/src/consolidate.js +517 -0
- package/dist/src/consolidate.js.map +1 -0
- package/dist/src/dag.js +104 -0
- package/dist/src/dag.js.map +1 -0
- package/dist/src/dashboard.js +409 -0
- package/dist/src/dashboard.js.map +1 -0
- package/dist/src/db.js +584 -0
- package/dist/src/db.js.map +1 -0
- package/dist/src/embeddings.js +344 -0
- package/dist/src/embeddings.js.map +1 -0
- package/dist/src/eval-suite.js +289 -0
- package/dist/src/eval-suite.js.map +1 -0
- package/dist/src/eval.js +187 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/extract.js +87 -0
- package/dist/src/extract.js.map +1 -0
- package/dist/src/handoff.js +30 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/hooks.js +582 -0
- package/dist/src/hooks.js.map +1 -0
- package/dist/src/importers.js +399 -0
- package/dist/src/importers.js.map +1 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/invalidation.js +94 -0
- package/dist/src/invalidation.js.map +1 -0
- package/dist/src/mcp/framing.js +45 -0
- package/dist/src/mcp/framing.js.map +1 -0
- package/dist/src/mcp/server.js +510 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/memory.js +280 -0
- package/dist/src/memory.js.map +1 -0
- package/dist/src/multihop.js +32 -0
- package/dist/src/multihop.js.map +1 -0
- package/dist/src/path-context.js +32 -0
- package/dist/src/path-context.js.map +1 -0
- package/dist/src/physics-config.js +26 -0
- package/dist/src/physics-config.js.map +1 -0
- package/dist/src/physics-state.js +163 -0
- package/dist/src/physics-state.js.map +1 -0
- package/dist/src/physics.js +361 -0
- package/dist/src/physics.js.map +1 -0
- package/dist/src/postinstall.js +68 -0
- package/dist/src/postinstall.js.map +1 -0
- package/dist/src/raw-archive.js +72 -0
- package/dist/src/raw-archive.js.map +1 -0
- package/dist/src/refine-llm.js +147 -0
- package/dist/src/refine-llm.js.map +1 -0
- package/dist/src/replay.js +117 -0
- package/dist/src/replay.js.map +1 -0
- package/dist/src/salience.js +74 -0
- package/dist/src/salience.js.map +1 -0
- package/dist/src/scheduler.js +67 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/scope.js +35 -0
- package/dist/src/scope.js.map +1 -0
- package/dist/src/search.js +801 -0
- package/dist/src/search.js.map +1 -0
- package/dist/src/server-detect.js +70 -0
- package/dist/src/server-detect.js.map +1 -0
- package/dist/src/server.js +784 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/shared.js +309 -0
- package/dist/src/shared.js.map +1 -0
- package/dist/src/sso.js +22 -0
- package/dist/src/sso.js.map +1 -0
- package/dist/src/store.js +1390 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/tenant.js +17 -0
- package/dist/src/tenant.js.map +1 -0
- package/dist/src/trace.js +64 -0
- package/dist/src/trace.js.map +1 -0
- package/dist/src/working-memory.js +149 -0
- package/dist/src/working-memory.js.map +1 -0
- package/dist/src/yaml.js +98 -0
- package/dist/src/yaml.js.map +1 -0
- package/dist/store.d.ts +9 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +30 -2
- package/dist/store.js.map +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/import.d.ts +0 -31
- package/dist/import.d.ts.map +0 -1
- package/dist/import.js +0 -307
- package/dist/import.js.map +0 -1
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture actionable items from conversation text.
|
|
3
|
+
*
|
|
4
|
+
* Uses heuristic pattern matching (no LLM) to extract:
|
|
5
|
+
* - Decisions ("we decided", "let's do", "going with")
|
|
6
|
+
* - Specs / requirements (bullet lists after spec/feature/plan headings)
|
|
7
|
+
* - Rules / constraints ("never", "always", "the rule is", "must")
|
|
8
|
+
* - Errors / gotchas ("error:", "bug:", "gotcha:", "watch out")
|
|
9
|
+
* - Preferences ("prefer", "use X instead of Y", "don't use")
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import { createMemory, Layer } from './memory.js';
|
|
14
|
+
import { isContentWorthStoring } from './audit.js';
|
|
15
|
+
import { isInitialized, writeEntry, loadAllEntries, updateStats, } from './store.js';
|
|
16
|
+
import { getGlobalRoot, initGlobal } from './shared.js';
|
|
17
|
+
import { isEmbeddingAvailable, embedMemory } from './embeddings.js';
|
|
18
|
+
// Sentence-level patterns
|
|
19
|
+
const DECISION_PATTERNS = [
|
|
20
|
+
/(?:we(?:'ve| have)?|i(?:'ve| have)?|let's)\s+decid(?:ed|e)\s+(?:to\s+)?(.{10,200})/i,
|
|
21
|
+
/(?:let's|we(?:'ll| will| should)?)\s+(?:go with|do|use|try|build|implement|switch to)\s+(.{5,200})/i,
|
|
22
|
+
/(?:going|went)\s+with\s+(.{5,200})/i,
|
|
23
|
+
/(?:the plan is|plan:)\s+(.{10,200})/i,
|
|
24
|
+
/decision:\s*(.{10,200})/i,
|
|
25
|
+
];
|
|
26
|
+
const RULE_PATTERNS = [
|
|
27
|
+
/(?:never|always|must(?:\s+not)?|do(?:n't| not)\s+ever)\s+(.{5,200})/i,
|
|
28
|
+
/(?:the rule is|rule:)\s*(.{5,200})/i,
|
|
29
|
+
/(?:important|critical|remember):\s*(.{10,200})/i,
|
|
30
|
+
/(?:make sure|ensure)\s+(?:to\s+)?(.{10,200})/i,
|
|
31
|
+
];
|
|
32
|
+
const ERROR_PATTERNS = [
|
|
33
|
+
/(?:error|bug|gotcha|watch out|careful|warning|caveat|trap):\s*(.{10,200})/i,
|
|
34
|
+
/(?:this broke|this breaks|this will break|broke because)\s+(.{5,200})/i,
|
|
35
|
+
/(?:the (?:issue|problem|fix) (?:is|was))\s+(.{10,200})/i,
|
|
36
|
+
/(?:don't forget|easy to miss):\s*(.{5,200})/i,
|
|
37
|
+
];
|
|
38
|
+
const PREFERENCE_PATTERNS = [
|
|
39
|
+
/(?:prefer|use)\s+(.{5,100})\s+(?:instead of|over|not)\s+(.{3,100})/i,
|
|
40
|
+
/(?:don't use|avoid|skip)\s+(.{5,200})/i,
|
|
41
|
+
/(?:we(?:'re| are)\s+using|the stack is|we use)\s+(.{5,200})/i,
|
|
42
|
+
];
|
|
43
|
+
// Heading patterns that signal a following list of specs/requirements
|
|
44
|
+
const SPEC_HEADING_PATTERNS = [
|
|
45
|
+
/^#+\s*(?:features?|requirements?|specs?|specifications?|plan|design|architecture|interface|api|todo|tasks?|implementation|notes?)(?:\s|:|$)/i,
|
|
46
|
+
/^(?:features?|requirements?|specs?|specifications?|plan|design|tasks?|implementation)(?:\s*:|$)/i,
|
|
47
|
+
];
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Extraction engine
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
function splitSentences(text) {
|
|
52
|
+
// Split on sentence boundaries, keeping reasonable chunks
|
|
53
|
+
return text
|
|
54
|
+
.split(/(?<=[.!?])\s+|\n/)
|
|
55
|
+
.map((s) => s.trim())
|
|
56
|
+
.filter((s) => s.length > 5);
|
|
57
|
+
}
|
|
58
|
+
function cleanExtract(raw) {
|
|
59
|
+
return raw
|
|
60
|
+
.replace(/^[:\s-]+/, '')
|
|
61
|
+
.replace(/[.!?,;:\s]+$/, '')
|
|
62
|
+
.trim();
|
|
63
|
+
}
|
|
64
|
+
function extractFromPatterns(sentence, patterns, category, tag) {
|
|
65
|
+
for (const pat of patterns) {
|
|
66
|
+
const match = sentence.match(pat);
|
|
67
|
+
if (match) {
|
|
68
|
+
// Use the captured group if available, otherwise the full match
|
|
69
|
+
const raw = match[1] ?? match[0];
|
|
70
|
+
const content = cleanExtract(raw);
|
|
71
|
+
if (content.length >= 8 && content.length <= 500) {
|
|
72
|
+
return { content, category, tags: [tag, 'captured'] };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
/** Extract spec items from bullet lists that follow spec-like headings. */
|
|
79
|
+
function extractSpecSections(text) {
|
|
80
|
+
const items = [];
|
|
81
|
+
const lines = text.split('\n');
|
|
82
|
+
let inSpecSection = false;
|
|
83
|
+
for (const line of lines) {
|
|
84
|
+
const trimmed = line.trim();
|
|
85
|
+
// Check if this line is a spec heading
|
|
86
|
+
if (SPEC_HEADING_PATTERNS.some((p) => p.test(trimmed))) {
|
|
87
|
+
inSpecSection = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Another heading resets the section
|
|
91
|
+
if (/^#+\s/.test(trimmed) || /^[A-Z][a-z]+:$/.test(trimmed)) {
|
|
92
|
+
inSpecSection = false;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Blank line after non-bullet content ends section
|
|
96
|
+
if (!trimmed && inSpecSection) {
|
|
97
|
+
// Keep going, blank lines within spec sections are ok
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (inSpecSection) {
|
|
101
|
+
const bulletMatch = trimmed.match(/^[-*]\s+(.+)/) || trimmed.match(/^\d+\.\s+(.+)/);
|
|
102
|
+
if (bulletMatch) {
|
|
103
|
+
const content = bulletMatch[1].trim();
|
|
104
|
+
if (content.length >= 8 && content.length <= 500) {
|
|
105
|
+
items.push({
|
|
106
|
+
content,
|
|
107
|
+
category: 'spec',
|
|
108
|
+
tags: ['spec', 'captured'],
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return items;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Main extraction function. Scans text for actionable items using heuristics.
|
|
118
|
+
*/
|
|
119
|
+
export function extractFromText(text) {
|
|
120
|
+
const items = [];
|
|
121
|
+
const seen = new Set();
|
|
122
|
+
const addIfNew = (item) => {
|
|
123
|
+
const norm = item.content.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
124
|
+
if (seen.has(norm))
|
|
125
|
+
return;
|
|
126
|
+
if (!isContentWorthStoring(item.content))
|
|
127
|
+
return;
|
|
128
|
+
seen.add(norm);
|
|
129
|
+
items.push(item);
|
|
130
|
+
};
|
|
131
|
+
// 1. Extract spec sections (bullet lists under spec headings)
|
|
132
|
+
for (const item of extractSpecSections(text)) {
|
|
133
|
+
addIfNew(item);
|
|
134
|
+
}
|
|
135
|
+
// 2. Pattern-match on individual sentences
|
|
136
|
+
const sentences = splitSentences(text);
|
|
137
|
+
for (const sentence of sentences) {
|
|
138
|
+
// Try each category in priority order
|
|
139
|
+
const decision = extractFromPatterns(sentence, DECISION_PATTERNS, 'decision', 'decision');
|
|
140
|
+
if (decision) {
|
|
141
|
+
addIfNew(decision);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const rule = extractFromPatterns(sentence, RULE_PATTERNS, 'rule', 'rule');
|
|
145
|
+
if (rule) {
|
|
146
|
+
addIfNew(rule);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const error = extractFromPatterns(sentence, ERROR_PATTERNS, 'error', 'error');
|
|
150
|
+
if (error) {
|
|
151
|
+
addIfNew(error);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const preference = extractFromPatterns(sentence, PREFERENCE_PATTERNS, 'preference', 'preference');
|
|
155
|
+
if (preference) {
|
|
156
|
+
addIfNew(preference);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return items;
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Normalisation for deduplication (mirrors import.ts)
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
function normalise(text) {
|
|
166
|
+
return text
|
|
167
|
+
.toLowerCase()
|
|
168
|
+
.replace(/[^\w\s]/g, '')
|
|
169
|
+
.replace(/\s+/g, ' ')
|
|
170
|
+
.trim();
|
|
171
|
+
}
|
|
172
|
+
function isDuplicate(content, existing) {
|
|
173
|
+
const norm = normalise(content);
|
|
174
|
+
if (!norm)
|
|
175
|
+
return true;
|
|
176
|
+
for (const e of existing) {
|
|
177
|
+
if (normalise(e.content) === norm)
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Build a compact text summary from a Claude Code / OpenCode JSONL transcript.
|
|
184
|
+
* Keeps plain user messages and the final chunk of assistant text, drops
|
|
185
|
+
* thinking blocks, tool_use, and tool_result noise. Output is fed to the
|
|
186
|
+
* existing `extractFromText` pipeline.
|
|
187
|
+
*
|
|
188
|
+
* Exported for tests.
|
|
189
|
+
*/
|
|
190
|
+
export function summariseTranscript(jsonl) {
|
|
191
|
+
const lines = jsonl.split('\n').filter((l) => l.trim());
|
|
192
|
+
const userMessages = [];
|
|
193
|
+
const assistantTexts = [];
|
|
194
|
+
for (const line of lines) {
|
|
195
|
+
let entry;
|
|
196
|
+
try {
|
|
197
|
+
entry = JSON.parse(line);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (!entry || typeof entry !== 'object')
|
|
203
|
+
continue;
|
|
204
|
+
const e = entry;
|
|
205
|
+
if (e.type === 'user' || e.type === 'assistant') {
|
|
206
|
+
const message = e.message;
|
|
207
|
+
if (!message)
|
|
208
|
+
continue;
|
|
209
|
+
const content = message.content;
|
|
210
|
+
if (e.type === 'user') {
|
|
211
|
+
// Plain text user messages only (skip tool_result arrays)
|
|
212
|
+
if (typeof content === 'string' && content.trim()) {
|
|
213
|
+
userMessages.push(content.trim());
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else if (Array.isArray(content)) {
|
|
217
|
+
// Keep assistant text blocks; drop thinking + tool_use
|
|
218
|
+
const chunks = [];
|
|
219
|
+
for (const block of content) {
|
|
220
|
+
if (block && typeof block === 'object') {
|
|
221
|
+
const b = block;
|
|
222
|
+
if (b.type === 'text' && typeof b.text === 'string' && b.text.trim()) {
|
|
223
|
+
chunks.push(b.text.trim());
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (chunks.length > 0) {
|
|
228
|
+
assistantTexts.push(chunks.join('\n'));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
// Codex rollout transcript shape: response_item -> payload.message
|
|
234
|
+
if (e.type === 'response_item') {
|
|
235
|
+
const payload = e.payload;
|
|
236
|
+
if (!payload || payload.type !== 'message')
|
|
237
|
+
continue;
|
|
238
|
+
const role = payload.role;
|
|
239
|
+
const content = payload.content;
|
|
240
|
+
if (!Array.isArray(content))
|
|
241
|
+
continue;
|
|
242
|
+
const chunks = [];
|
|
243
|
+
for (const block of content) {
|
|
244
|
+
if (!block || typeof block !== 'object')
|
|
245
|
+
continue;
|
|
246
|
+
const b = block;
|
|
247
|
+
if (role === 'user' && b.type === 'input_text' && typeof b.text === 'string' && b.text.trim()) {
|
|
248
|
+
chunks.push(b.text.trim());
|
|
249
|
+
}
|
|
250
|
+
if (role === 'assistant' && b.type === 'output_text' && typeof b.text === 'string' && b.text.trim()) {
|
|
251
|
+
chunks.push(b.text.trim());
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (chunks.length === 0)
|
|
255
|
+
continue;
|
|
256
|
+
if (role === 'user')
|
|
257
|
+
userMessages.push(chunks.join('\n'));
|
|
258
|
+
if (role === 'assistant')
|
|
259
|
+
assistantTexts.push(chunks.join('\n'));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (userMessages.length === 0 && assistantTexts.length === 0)
|
|
263
|
+
return '';
|
|
264
|
+
// Keep the tail: last ~20 user turns and last ~10 assistant replies.
|
|
265
|
+
// Session-end is about what was decided near the end, not at the start.
|
|
266
|
+
const tailUsers = userMessages.slice(-20);
|
|
267
|
+
const tailAssistants = assistantTexts.slice(-10);
|
|
268
|
+
return [
|
|
269
|
+
'# Session Summary',
|
|
270
|
+
'',
|
|
271
|
+
'## User Messages',
|
|
272
|
+
...tailUsers.map((m) => `- ${m.replace(/\s+/g, ' ').slice(0, 500)}`),
|
|
273
|
+
'',
|
|
274
|
+
'## Assistant Responses',
|
|
275
|
+
...tailAssistants.map((t) => t.slice(0, 2000)),
|
|
276
|
+
].join('\n');
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Resolve a transcript path for `--last-session`.
|
|
280
|
+
*
|
|
281
|
+
* Priority:
|
|
282
|
+
* 1. Explicit `transcriptPath` option (from `--transcript <path>`)
|
|
283
|
+
* 2. Stdin JSON payload (Claude Code / OpenCode SessionEnd hook shape)
|
|
284
|
+
* 3. Most recent `.jsonl` under `~/.claude/projects/<any>/`
|
|
285
|
+
*
|
|
286
|
+
* Returns null when nothing resolves. Never throws.
|
|
287
|
+
*/
|
|
288
|
+
export function resolveLastSessionTranscript(explicit, stdinText) {
|
|
289
|
+
if (explicit && fs.existsSync(explicit))
|
|
290
|
+
return explicit;
|
|
291
|
+
// Try parsing stdin as the SessionEnd JSON payload
|
|
292
|
+
if (stdinText && stdinText.trim().startsWith('{')) {
|
|
293
|
+
try {
|
|
294
|
+
const payload = JSON.parse(stdinText);
|
|
295
|
+
const tp = payload.transcript_path;
|
|
296
|
+
if (typeof tp === 'string' && fs.existsSync(tp))
|
|
297
|
+
return tp;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// not JSON - fall through
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Auto-discover the most recent transcript
|
|
304
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
305
|
+
if (!home)
|
|
306
|
+
return null;
|
|
307
|
+
const projectsDir = path.join(home, '.claude', 'projects');
|
|
308
|
+
if (!fs.existsSync(projectsDir))
|
|
309
|
+
return null;
|
|
310
|
+
let newest = null;
|
|
311
|
+
try {
|
|
312
|
+
for (const entry of fs.readdirSync(projectsDir)) {
|
|
313
|
+
const subDir = path.join(projectsDir, entry);
|
|
314
|
+
const stat = fs.statSync(subDir);
|
|
315
|
+
if (!stat.isDirectory())
|
|
316
|
+
continue;
|
|
317
|
+
for (const file of fs.readdirSync(subDir)) {
|
|
318
|
+
if (!file.endsWith('.jsonl'))
|
|
319
|
+
continue;
|
|
320
|
+
const full = path.join(subDir, file);
|
|
321
|
+
const m = fs.statSync(full).mtimeMs;
|
|
322
|
+
if (!newest || m > newest.mtime)
|
|
323
|
+
newest = { path: full, mtime: m };
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
return newest?.path ?? null;
|
|
331
|
+
}
|
|
332
|
+
export function cmdCapture(hippoRoot, options) {
|
|
333
|
+
// Tee stdout/stderr to a log file when --log-file is set. Used by the
|
|
334
|
+
// SessionEnd hook so output (otherwise swallowed by TUI teardown) surfaces
|
|
335
|
+
// on the next session start via `hippo last-sleep`. Runs second in the
|
|
336
|
+
// SessionEnd sequence after `hippo sleep`, so we APPEND rather than
|
|
337
|
+
// truncate — sleep already wrote its own header + body to this file.
|
|
338
|
+
const restoreStdio = options.logFile ? beginLogTee(options.logFile) : null;
|
|
339
|
+
try {
|
|
340
|
+
cmdCaptureCore(hippoRoot, options);
|
|
341
|
+
if (options.logFile)
|
|
342
|
+
console.log('[hippo] capture complete');
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
if (options.logFile)
|
|
346
|
+
console.log(`[hippo] capture failed: ${err.message}`);
|
|
347
|
+
throw err;
|
|
348
|
+
}
|
|
349
|
+
finally {
|
|
350
|
+
if (restoreStdio)
|
|
351
|
+
restoreStdio();
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Append-mode tee: writes a banner line then mirrors every stdout/stderr
|
|
356
|
+
* chunk to `logFile` until the returned restore function is called.
|
|
357
|
+
* Failures to write the log are non-fatal; the real streams still get
|
|
358
|
+
* the data.
|
|
359
|
+
*/
|
|
360
|
+
function beginLogTee(logFile) {
|
|
361
|
+
try {
|
|
362
|
+
fs.mkdirSync(path.dirname(logFile), { recursive: true });
|
|
363
|
+
fs.appendFileSync(logFile, `[hippo] ${new Date().toISOString()} capturing session...\n`, 'utf8');
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
console.error(`[hippo] warning: could not open log file ${logFile}: ${err.message}`);
|
|
367
|
+
return () => { };
|
|
368
|
+
}
|
|
369
|
+
const origStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
370
|
+
const origStderrWrite = process.stderr.write.bind(process.stderr);
|
|
371
|
+
const tee = (chunk) => {
|
|
372
|
+
try {
|
|
373
|
+
const buf = typeof chunk === 'string'
|
|
374
|
+
? chunk
|
|
375
|
+
: Buffer.isBuffer(chunk)
|
|
376
|
+
? chunk.toString('utf8')
|
|
377
|
+
: String(chunk);
|
|
378
|
+
fs.appendFileSync(logFile, buf, 'utf8');
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
// log failures are non-fatal
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
process.stdout.write = ((chunk, enc, cb) => {
|
|
385
|
+
tee(chunk);
|
|
386
|
+
return origStdoutWrite(chunk, enc, cb);
|
|
387
|
+
});
|
|
388
|
+
process.stderr.write = ((chunk, enc, cb) => {
|
|
389
|
+
tee(chunk);
|
|
390
|
+
return origStderrWrite(chunk, enc, cb);
|
|
391
|
+
});
|
|
392
|
+
return () => {
|
|
393
|
+
process.stdout.write = origStdoutWrite;
|
|
394
|
+
process.stderr.write = origStderrWrite;
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function cmdCaptureCore(hippoRoot, options) {
|
|
398
|
+
const useGlobal = options.global;
|
|
399
|
+
const targetRoot = useGlobal ? getGlobalRoot() : hippoRoot;
|
|
400
|
+
if (useGlobal) {
|
|
401
|
+
initGlobal();
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
if (!isInitialized(hippoRoot)) {
|
|
405
|
+
console.error('No .hippo directory found. Run `hippo init` first.');
|
|
406
|
+
process.exit(1);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// Read input text
|
|
410
|
+
let text;
|
|
411
|
+
switch (options.source) {
|
|
412
|
+
case 'stdin': {
|
|
413
|
+
try {
|
|
414
|
+
text = fs.readFileSync(0, 'utf8');
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
console.error('No input on stdin. Pipe text in or use --file <path>.');
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
case 'file': {
|
|
423
|
+
if (!options.filePath) {
|
|
424
|
+
console.error('Missing file path. Usage: hippo capture --file <path>');
|
|
425
|
+
process.exit(1);
|
|
426
|
+
}
|
|
427
|
+
if (!fs.existsSync(options.filePath)) {
|
|
428
|
+
console.error(`File not found: ${options.filePath}`);
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
text = fs.readFileSync(options.filePath, 'utf8');
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
case 'last-session': {
|
|
435
|
+
// Try to read stdin non-blockingly: SessionEnd hooks pass a JSON payload,
|
|
436
|
+
// but manual / test invocations have no piped stdin. fs.readFileSync(0)
|
|
437
|
+
// will block waiting for input when run interactively, so:
|
|
438
|
+
// - skip entirely when caller passed an explicit --transcript path
|
|
439
|
+
// - skip when stdin is a TTY (interactive shell)
|
|
440
|
+
let stdinText;
|
|
441
|
+
if (!options.transcriptPath && !process.stdin.isTTY) {
|
|
442
|
+
try {
|
|
443
|
+
stdinText = fs.readFileSync(0, 'utf8');
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
stdinText = undefined;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
const resolved = resolveLastSessionTranscript(options.transcriptPath, stdinText);
|
|
450
|
+
if (!resolved) {
|
|
451
|
+
console.log('No transcript found. Pass --transcript <path> or run from a SessionEnd hook.');
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
const jsonl = fs.readFileSync(resolved, 'utf8');
|
|
455
|
+
text = summariseTranscript(jsonl);
|
|
456
|
+
if (!text) {
|
|
457
|
+
console.log('Transcript had no user/assistant messages to summarise.');
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
break;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
if (!text || text.trim().length === 0) {
|
|
464
|
+
console.log('No text to capture from.');
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
// Extract items
|
|
468
|
+
const extracted = extractFromText(text);
|
|
469
|
+
if (extracted.length === 0) {
|
|
470
|
+
console.log('No actionable items found in the input.');
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
// Load existing for dedup
|
|
474
|
+
const existing = loadAllEntries(targetRoot);
|
|
475
|
+
let captured = 0;
|
|
476
|
+
let skipped = 0;
|
|
477
|
+
for (const item of extracted) {
|
|
478
|
+
if (isDuplicate(item.content, existing)) {
|
|
479
|
+
skipped++;
|
|
480
|
+
if (options.dryRun) {
|
|
481
|
+
console.log(` [skip] (${item.category}) ${item.content.slice(0, 80)}`);
|
|
482
|
+
}
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
if (options.dryRun) {
|
|
486
|
+
console.log(` [capture] (${item.category}) ${item.content}`);
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
// A3: kind defaults to 'distilled'. capture.ts extracts curated items from
|
|
490
|
+
// session output (not raw transcript chunks), so distilled is correct. If a
|
|
491
|
+
// future variant captures full raw session text, it MUST set kind: 'raw'
|
|
492
|
+
// and route deletions through archiveRawMemory(). See MEMORY_ENVELOPE.md.
|
|
493
|
+
const entry = createMemory(item.content, {
|
|
494
|
+
layer: Layer.Episodic,
|
|
495
|
+
tags: item.tags,
|
|
496
|
+
source: 'capture',
|
|
497
|
+
confidence: 'observed',
|
|
498
|
+
});
|
|
499
|
+
writeEntry(targetRoot, entry);
|
|
500
|
+
updateStats(targetRoot, { remembered: 1 });
|
|
501
|
+
existing.push(entry); // within-batch dedup
|
|
502
|
+
if (isEmbeddingAvailable()) {
|
|
503
|
+
embedMemory(targetRoot, entry).catch(() => { });
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
captured++;
|
|
507
|
+
}
|
|
508
|
+
const prefix = options.dryRun ? '[dry-run] ' : '';
|
|
509
|
+
const globalPrefix = useGlobal ? '[global] ' : '';
|
|
510
|
+
console.log(`\n${prefix}${globalPrefix}Captured ${captured} items (${skipped} skipped as duplicates)`);
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAe,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAYpE,0BAA0B;AAC1B,MAAM,iBAAiB,GAAG;IACxB,qFAAqF;IACrF,qGAAqG;IACrG,qCAAqC;IACrC,sCAAsC;IACtC,0BAA0B;CAC3B,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,sEAAsE;IACtE,qCAAqC;IACrC,iDAAiD;IACjD,+CAA+C;CAChD,CAAC;AAEF,MAAM,cAAc,GAAG;IACrB,4EAA4E;IAC5E,wEAAwE;IACxE,yDAAyD;IACzD,8CAA8C;CAC/C,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC1B,qEAAqE;IACrE,wCAAwC;IACxC,8DAA8D;CAC/D,CAAC;AAEF,sEAAsE;AACtE,MAAM,qBAAqB,GAAG;IAC5B,8IAA8I;IAC9I,kGAAkG;CACnG,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,cAAc,CAAC,IAAY;IAClC,0DAA0D;IAC1D,OAAO,IAAI;SACR,KAAK,CAAC,kBAAkB,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,QAAkB,EAClB,QAAgB,EAChB,GAAW;IAEX,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,gEAAgE;YAChE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACjD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,uCAAuC;QACvC,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACvD,aAAa,GAAG,IAAI,CAAC;YACrB,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,aAAa,GAAG,KAAK,CAAC;YACtB,SAAS;QACX,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;YAC9B,sDAAsD;YACtD,SAAS;QACX,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACpF,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;oBACjD,KAAK,CAAC,IAAI,CAAC;wBACT,OAAO;wBACP,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;qBAC3B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,MAAM,QAAQ,GAAG,CAAC,IAAmB,EAAQ,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAC3B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO;QACjD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,8DAA8D;IAC9D,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,2CAA2C;IAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEvC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,sCAAsC;QACtC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1F,IAAI,QAAQ,EAAE,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1E,IAAI,IAAI,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAEvC,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,KAAK,EAAE,CAAC;YAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAEzC,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAClG,IAAI,UAAU,EAAE,CAAC;YAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;IACrD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,QAAuB;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AA4BD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAE3C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,CAAC,CAAC,OAA8C,CAAC;YACjE,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAEhC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACtB,0DAA0D;gBAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,uDAAuD;gBACvD,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACvC,MAAM,CAAC,GAAG,KAAgC,CAAC;wBAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;4BACrE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;wBAC7B,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,mEAAmE;QACnE,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,OAA8C,CAAC;YACjE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS;YACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,SAAS;YAEtC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,SAAS;gBAClD,MAAM,CAAC,GAAG,KAAgC,CAAC;gBAC3C,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC9F,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7B,CAAC;gBACD,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBACpG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAClC,IAAI,IAAI,KAAK,MAAM;gBAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,IAAI,IAAI,KAAK,WAAW;gBAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExE,qEAAqE;IACrE,wEAAwE;IACxE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAEjD,OAAO;QACL,mBAAmB;QACnB,EAAE;QACF,kBAAkB;QAClB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACpE,EAAE;QACF,wBAAwB;QACxB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;KAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAA4B,EAC5B,SAA6B;IAE7B,IAAI,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEzD,mDAAmD;IACnD,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAA4B,CAAC;YACjE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC;YACnC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;gBAAE,OAAO,EAAE,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7C,IAAI,MAAM,GAA2C,IAAI,CAAC;IAC1D,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE,SAAS;YAClC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACrC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;gBACpC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK;oBAAE,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,SAAiB,EACjB,OAAuB;IAEvB,sEAAsE;IACtE,2EAA2E;IAC3E,uEAAuE;IACvE,oEAAoE;IACpE,qEAAqE;IACrE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,IAAI,CAAC;QACH,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,2BAA4B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,IAAI,YAAY;YAAE,YAAY,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,EAAE,CAAC,cAAc,CACf,OAAO,EACP,WAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,yBAAyB,EAC5D,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4CAA4C,OAAO,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChG,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,CAAC,KAAc,EAAQ,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GACP,OAAO,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACtB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACxB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAc,EAAE,GAAa,EAAE,EAAY,EAAW,EAAE;QAC/E,GAAG,CAAC,KAAK,CAAC,CAAC;QACX,OAAQ,eAAmD,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAgC,CAAC;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAc,EAAE,GAAa,EAAE,EAAY,EAAW,EAAE;QAC/E,GAAG,CAAC,KAAK,CAAC,CAAC;QACX,OAAQ,eAAmD,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAgC,CAAC;IAElC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,SAAiB,EACjB,OAAuB;IAEvB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IACjC,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3D,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,IAAY,CAAC;IAEjB,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM;QACR,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,0EAA0E;YAC1E,wEAAwE;YACxE,2DAA2D;YAC3D,qEAAqE;YACrE,mDAAmD;YACnD,IAAI,SAA6B,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACpD,IAAI,CAAC;oBACH,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,GAAG,SAAS,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,4BAA4B,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YACjF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;gBAC5F,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE5C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,2EAA2E;YAC3E,4EAA4E;YAC5E,yEAAyE;YACzE,0EAA0E;YAC1E,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE;gBACvC,KAAK,EAAE,KAAK,CAAC,QAAQ;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,UAAU;aACvB,CAAC,CAAC;YAEH,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC9B,WAAW,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB;YAE3C,IAAI,oBAAoB,EAAE,EAAE,CAAC;gBAC3B,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,OAAO,CAAC,GAAG,CACT,KAAK,MAAM,GAAG,YAAY,YAAY,QAAQ,WAAW,OAAO,yBAAyB,CAC1F,CAAC;AACJ,CAAC"}
|