@vidiemme/copilot-proxy 0.3.3 → 0.4.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 +43 -0
- package/dist/cli.js +141 -0
- package/dist/cli.js.map +1 -1
- package/dist/collector/forwarder.d.ts +4 -1
- package/dist/collector/forwarder.js +20 -15
- package/dist/collector/forwarder.js.map +1 -1
- package/dist/projectDetector.d.ts +2 -0
- package/dist/projectDetector.js +4 -0
- package/dist/projectDetector.js.map +1 -1
- package/dist/reload/copilotCli.d.ts +23 -0
- package/dist/reload/copilotCli.js +103 -0
- package/dist/reload/copilotCli.js.map +1 -0
- package/dist/reload/index.d.ts +69 -0
- package/dist/reload/index.js +244 -0
- package/dist/reload/index.js.map +1 -0
- package/dist/reload/reconstruct.d.ts +35 -0
- package/dist/reload/reconstruct.js +89 -0
- package/dist/reload/reconstruct.js.map +1 -0
- package/dist/reload/vscodeChat.d.ts +40 -0
- package/dist/reload/vscodeChat.js +203 -0
- package/dist/reload/vscodeChat.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { knownEditors } from '../editors.js';
|
|
5
|
+
function asObject(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : undefined;
|
|
7
|
+
}
|
|
8
|
+
function asNumber(value) {
|
|
9
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Riapplica il log delle modifiche con cui VS Code salva una sessione.
|
|
13
|
+
*
|
|
14
|
+
* Le versioni recenti non riscrivono il file a ogni messaggio: aggiungono righe
|
|
15
|
+
* `{kind, k, v}` — 0 stato iniziale, 1 assegnazione al percorso `k`, 2 aggiunta
|
|
16
|
+
* in coda (da `i` in poi, se presente), 3 rimozione. Le versioni piu' vecchie
|
|
17
|
+
* salvano invece in `.json` un unico oggetto con lo stato completo.
|
|
18
|
+
*/
|
|
19
|
+
export function replaySession(content) {
|
|
20
|
+
let state;
|
|
21
|
+
for (const line of content.split('\n')) {
|
|
22
|
+
if (line.trim().length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
let entry;
|
|
25
|
+
try {
|
|
26
|
+
entry = asObject(JSON.parse(line));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (!entry)
|
|
32
|
+
continue;
|
|
33
|
+
if (entry.kind === 0) {
|
|
34
|
+
state = entry.v;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const path = Array.isArray(entry.k) ? entry.k : undefined;
|
|
38
|
+
if (!path || path.length === 0 || state === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
let target = state;
|
|
41
|
+
let valid = true;
|
|
42
|
+
for (const key of path.slice(0, -1)) {
|
|
43
|
+
const next = target[key];
|
|
44
|
+
if (typeof next !== 'object' || next === null) {
|
|
45
|
+
valid = false;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
target = next;
|
|
49
|
+
}
|
|
50
|
+
if (!valid)
|
|
51
|
+
continue;
|
|
52
|
+
const last = path[path.length - 1];
|
|
53
|
+
if (entry.kind === 1)
|
|
54
|
+
target[last] = entry.v;
|
|
55
|
+
else if (entry.kind === 3)
|
|
56
|
+
delete target[last];
|
|
57
|
+
else if (entry.kind === 2) {
|
|
58
|
+
const list = target[last];
|
|
59
|
+
if (!Array.isArray(list))
|
|
60
|
+
continue;
|
|
61
|
+
if (typeof entry.i === 'number')
|
|
62
|
+
list.splice(entry.i);
|
|
63
|
+
list.push(...(Array.isArray(entry.v) ? entry.v : [entry.v]));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return asObject(state);
|
|
67
|
+
}
|
|
68
|
+
function uriToPath(uri) {
|
|
69
|
+
if (!uri.startsWith('file://'))
|
|
70
|
+
return undefined;
|
|
71
|
+
try {
|
|
72
|
+
return fileURLToPath(uri);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Cartelle di un workspace multi-root. Il file ammette commenti e virgole
|
|
80
|
+
* finali, quindi non si passa da `JSON.parse`: bastano le voci `path`.
|
|
81
|
+
*/
|
|
82
|
+
function workspaceFolders(file) {
|
|
83
|
+
let content;
|
|
84
|
+
try {
|
|
85
|
+
content = readFileSync(file, 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
const folders = [];
|
|
91
|
+
for (const match of content.matchAll(/"path"\s*:\s*"((?:[^"\\]|\\.)*)"/g)) {
|
|
92
|
+
const raw = JSON.parse(`"${match[1]}"`);
|
|
93
|
+
folders.push(isAbsolute(raw) ? raw : resolve(dirname(file), raw));
|
|
94
|
+
}
|
|
95
|
+
return folders;
|
|
96
|
+
}
|
|
97
|
+
/** Cartelle aperte nella finestra a cui appartiene uno storage di workspace. */
|
|
98
|
+
function storageFolders(storageDir) {
|
|
99
|
+
let descriptor;
|
|
100
|
+
try {
|
|
101
|
+
descriptor = asObject(JSON.parse(readFileSync(join(storageDir, 'workspace.json'), 'utf-8')));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
if (typeof descriptor?.folder === 'string') {
|
|
107
|
+
const folder = uriToPath(descriptor.folder);
|
|
108
|
+
return folder ? [folder] : [];
|
|
109
|
+
}
|
|
110
|
+
if (typeof descriptor?.workspace === 'string') {
|
|
111
|
+
const file = uriToPath(descriptor.workspace);
|
|
112
|
+
return file ? workspaceFolders(file) : [];
|
|
113
|
+
}
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
function listDir(path) {
|
|
117
|
+
try {
|
|
118
|
+
return readdirSync(path);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function chatRequest(raw, sessionId, folders, editor) {
|
|
125
|
+
const request = asObject(raw);
|
|
126
|
+
if (!request || typeof request.requestId !== 'string')
|
|
127
|
+
return undefined;
|
|
128
|
+
const metadata = asObject(asObject(request.result)?.metadata) ?? {};
|
|
129
|
+
const rounds = Array.isArray(metadata.toolCallRounds) ? metadata.toolCallRounds : [];
|
|
130
|
+
// In una sessione biforcata le richieste copiate prendono come timestamp il
|
|
131
|
+
// momento del fork: l'orario vero sopravvive solo nei round.
|
|
132
|
+
const started = asNumber(request.timestamp);
|
|
133
|
+
const roundTimes = rounds.map((round) => asNumber(asObject(round)?.timestamp));
|
|
134
|
+
const first = roundTimes.find((time) => time !== null) ?? started;
|
|
135
|
+
if (first === null)
|
|
136
|
+
return undefined;
|
|
137
|
+
const times = (roundTimes.length > 0 ? roundTimes : [first]).map((time, index) => new Date(time ?? first + index));
|
|
138
|
+
const resolved = typeof metadata.resolvedModel === 'string' ? metadata.resolvedModel : undefined;
|
|
139
|
+
const selected = typeof request.modelId === 'string' ? request.modelId : undefined;
|
|
140
|
+
return {
|
|
141
|
+
requestId: request.requestId,
|
|
142
|
+
roundTimes: times,
|
|
143
|
+
folders,
|
|
144
|
+
sessionId,
|
|
145
|
+
model: resolved ?? selected ?? null,
|
|
146
|
+
promptTokens: asNumber(request.promptTokens) ?? asNumber(metadata.promptTokens),
|
|
147
|
+
completionTokens: asNumber(request.completionTokens) ?? asNumber(metadata.outputTokens),
|
|
148
|
+
credits: asNumber(request.copilotCredits),
|
|
149
|
+
editor,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/** Radici degli storage di workspace degli editor della famiglia VS Code. */
|
|
153
|
+
export function defaultStorageRoots() {
|
|
154
|
+
return knownEditors().map((editor) => ({
|
|
155
|
+
editor: editor.name,
|
|
156
|
+
path: join(dirname(editor.settingsFile), 'workspaceStorage'),
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Legge le richieste di Copilot Chat salvate dagli editor.
|
|
161
|
+
*
|
|
162
|
+
* Una stessa richiesta compare in piu' file quando una sessione viene
|
|
163
|
+
* biforcata: si tiene una sola copia, con l'orario piu' antico.
|
|
164
|
+
*/
|
|
165
|
+
export function readChatRequests(roots = defaultStorageRoots(), modifiedSince) {
|
|
166
|
+
const byId = new Map();
|
|
167
|
+
for (const root of roots) {
|
|
168
|
+
for (const storage of listDir(root.path)) {
|
|
169
|
+
const storageDir = join(root.path, storage);
|
|
170
|
+
const sessionsDir = join(storageDir, 'chatSessions');
|
|
171
|
+
const files = listDir(sessionsDir).filter((name) => name.endsWith('.json') || name.endsWith('.jsonl'));
|
|
172
|
+
if (files.length === 0)
|
|
173
|
+
continue;
|
|
174
|
+
const folders = storageFolders(storageDir);
|
|
175
|
+
for (const name of files) {
|
|
176
|
+
const file = join(sessionsDir, name);
|
|
177
|
+
// Un file non toccato dall'inizio del periodo non puo' contenerne richieste.
|
|
178
|
+
if (modifiedSince && statSync(file).mtime < modifiedSince)
|
|
179
|
+
continue;
|
|
180
|
+
let session;
|
|
181
|
+
try {
|
|
182
|
+
const content = readFileSync(file, 'utf-8');
|
|
183
|
+
session = name.endsWith('.jsonl') ? replaySession(content) : asObject(JSON.parse(content));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const requests = Array.isArray(session?.requests) ? session.requests : [];
|
|
189
|
+
const sessionId = typeof session?.sessionId === 'string' ? session.sessionId : name.replace(/\.jsonl?$/, '');
|
|
190
|
+
for (const raw of requests) {
|
|
191
|
+
const request = chatRequest(raw, sessionId, folders, root.editor);
|
|
192
|
+
if (!request)
|
|
193
|
+
continue;
|
|
194
|
+
const known = byId.get(request.requestId);
|
|
195
|
+
if (!known || request.roundTimes[0] < known.roundTimes[0])
|
|
196
|
+
byId.set(request.requestId, request);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return [...byId.values()];
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=vscodeChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscodeChat.js","sourceRoot":"","sources":["../../src/reload/vscodeChat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAmB7C,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAc,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5G,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,IAAI,KAAc,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACvC,IAAI,KAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrB,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,CAAyB,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAEhE,IAAI,MAAM,GAAG,KAAyC,CAAC;QACvD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9C,KAAK,GAAG,KAAK,CAAC;gBACd,MAAM;YACR,CAAC;YACD,MAAM,GAAG,IAAwC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QAEpC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;aACxC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;aAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,SAAS;YACnC,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAW,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAChF,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,UAA4B,CAAC;IACjC,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,UAAU,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,UAAU,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAY,EAAE,SAAiB,EAAE,OAAiB,EAAE,MAAc;IACrF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAErF,4EAA4E;IAC5E,6DAA6D;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC;IAClF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAC9D,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,KAAK,CAAC,CACjD,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnF,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,KAAK;QACjB,OAAO;QACP,SAAS;QACT,KAAK,EAAE,QAAQ,IAAI,QAAQ,IAAI,IAAI;QACnC,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC/E,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;QACvF,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;QACzC,MAAM;KACP,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;KAC7D,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAK,GAAG,mBAAmB,EAAE,EAC7B,aAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACrC,6EAA6E;gBAC7E,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,aAAa;oBAAE,SAAS;gBAEpE,IAAI,OAAyB,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC5C,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC7F,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,MAAM,SAAS,GAAG,OAAO,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAE7G,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAClE,IAAI,CAAC,OAAO;wBAAE,SAAS;oBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAE;wBAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|