@kenkaiiii/ggcoder 5.20.1 → 5.20.2

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 (43) hide show
  1. package/dist/app-sidecar-sessions.test.js +15 -0
  2. package/dist/app-sidecar-sessions.test.js.map +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +19 -20
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +1 -0
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +43 -5
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/project-discovery.d.ts +1 -1
  11. package/dist/core/project-discovery.d.ts.map +1 -1
  12. package/dist/core/project-discovery.js +105 -53
  13. package/dist/core/project-discovery.js.map +1 -1
  14. package/dist/core/project-discovery.test.js +29 -0
  15. package/dist/core/project-discovery.test.js.map +1 -1
  16. package/dist/core/session-manager.d.ts +27 -7
  17. package/dist/core/session-manager.d.ts.map +1 -1
  18. package/dist/core/session-manager.js +257 -124
  19. package/dist/core/session-manager.js.map +1 -1
  20. package/dist/core/session-storage.d.ts +57 -0
  21. package/dist/core/session-storage.d.ts.map +1 -0
  22. package/dist/core/session-storage.js +568 -0
  23. package/dist/core/session-storage.js.map +1 -0
  24. package/dist/core/session-storage.test.d.ts +2 -0
  25. package/dist/core/session-storage.test.d.ts.map +1 -0
  26. package/dist/core/session-storage.test.js +269 -0
  27. package/dist/core/session-storage.test.js.map +1 -0
  28. package/dist/session.d.ts +4 -4
  29. package/dist/session.d.ts.map +1 -1
  30. package/dist/session.js +38 -101
  31. package/dist/session.js.map +1 -1
  32. package/dist/session.test.d.ts +2 -0
  33. package/dist/session.test.d.ts.map +1 -0
  34. package/dist/session.test.js +35 -0
  35. package/dist/session.test.js.map +1 -0
  36. package/dist/ui/App.d.ts.map +1 -1
  37. package/dist/ui/App.js +0 -2
  38. package/dist/ui/App.js.map +1 -1
  39. package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
  40. package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
  41. package/dist/ui/hooks/useTranscriptHistory.js +2 -30
  42. package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
  43. package/package.json +4 -4
@@ -0,0 +1,568 @@
1
+ import crypto from "node:crypto";
2
+ import { createReadStream, createWriteStream } from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { createGunzip, createGzip } from "node:zlib";
6
+ import { createInterface } from "node:readline";
7
+ import { pipeline } from "node:stream/promises";
8
+ export const MAX_PERSISTED_TOOL_TEXT_CHARS = 40_000;
9
+ export const COLD_SESSION_AGE_DAYS = 7;
10
+ export const SESSION_GZIP_VERSION = 1;
11
+ export const SESSION_REDIRECT_VERSION = 1;
12
+ export const SESSION_MEDIA_MARKER_VERSION = 1;
13
+ export const SESSION_PLAIN_SUFFIX = ".jsonl";
14
+ export const SESSION_ARCHIVE_SUFFIX = ".jsonl.gz";
15
+ export const SESSION_ASSET_SUFFIX = ".jsonl.assets";
16
+ export const SESSION_TEMP_MARKER = ".gg-session-tmp-";
17
+ const REDIRECT_TYPE = "gg_session_redirect";
18
+ const MEDIA_MARKER_PREFIX = `gg-session-asset:v${SESSION_MEDIA_MARKER_VERSION}:`;
19
+ const SHA256_PATTERN = /^[a-f0-9]{64}$/;
20
+ const MAX_REDIRECT_BYTES = 4096;
21
+ export function emptyStorageNormalizationMetrics() {
22
+ return {
23
+ truncatedToolTexts: 0,
24
+ externalizedMedia: 0,
25
+ omittedPathMedia: 0,
26
+ removedDisplayItems: 0,
27
+ };
28
+ }
29
+ export function isSessionPath(filePath) {
30
+ return filePath.endsWith(SESSION_PLAIN_SUFFIX) || filePath.endsWith(SESSION_ARCHIVE_SUFFIX);
31
+ }
32
+ export function isSessionTempPath(filePath) {
33
+ return path.basename(filePath).includes(SESSION_TEMP_MARKER);
34
+ }
35
+ export function plainSessionPath(filePath) {
36
+ return filePath.endsWith(SESSION_ARCHIVE_SUFFIX) ? filePath.slice(0, -3) : filePath;
37
+ }
38
+ export function archiveSessionPath(filePath) {
39
+ const plain = plainSessionPath(filePath);
40
+ return `${plain}.gz`;
41
+ }
42
+ export function sessionAssetDir(filePath) {
43
+ return `${plainSessionPath(filePath)}.assets`;
44
+ }
45
+ export function sessionGroupPaths(filePath) {
46
+ const plainPath = plainSessionPath(filePath);
47
+ return {
48
+ plainPath,
49
+ archivePath: archiveSessionPath(plainPath),
50
+ assetsPath: sessionAssetDir(plainPath),
51
+ };
52
+ }
53
+ export function temporarySiblingPath(filePath) {
54
+ return path.join(path.dirname(filePath), `${path.basename(filePath)}${SESSION_TEMP_MARKER}${process.pid}-${crypto.randomUUID()}`);
55
+ }
56
+ function isSiblingBasename(value) {
57
+ return (value === path.basename(value) &&
58
+ value !== "." &&
59
+ value !== ".." &&
60
+ !value.includes("/") &&
61
+ !value.includes("\\") &&
62
+ isSessionPath(value));
63
+ }
64
+ async function readRedirect(filePath) {
65
+ let stat;
66
+ try {
67
+ stat = await fs.stat(filePath);
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ if (!stat.isFile() || stat.size <= 0 || stat.size > MAX_REDIRECT_BYTES)
73
+ return null;
74
+ try {
75
+ const raw = await fs.readFile(filePath, "utf8");
76
+ const value = JSON.parse(raw);
77
+ if (value.type !== REDIRECT_TYPE ||
78
+ value.version !== SESSION_REDIRECT_VERSION ||
79
+ typeof value.target !== "string" ||
80
+ !isSiblingBasename(value.target)) {
81
+ return null;
82
+ }
83
+ return value;
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ export async function resolveSessionPath(filePath) {
90
+ let current = path.resolve(filePath);
91
+ const seen = new Set();
92
+ for (let hops = 0; hops < 4; hops++) {
93
+ if (seen.has(current))
94
+ throw new Error(`Session redirect loop at ${filePath}`);
95
+ seen.add(current);
96
+ const redirect = await readRedirect(current);
97
+ if (!redirect)
98
+ return current;
99
+ current = path.join(path.dirname(current), redirect.target);
100
+ }
101
+ throw new Error(`Too many session redirects at ${filePath}`);
102
+ }
103
+ export async function isGzipSessionPath(filePath) {
104
+ const resolved = await resolveSessionPath(filePath);
105
+ const handle = await fs.open(resolved, "r");
106
+ try {
107
+ const bytes = Buffer.alloc(2);
108
+ const { bytesRead } = await handle.read(bytes, 0, bytes.length, 0);
109
+ return bytesRead === 2 && bytes[0] === 0x1f && bytes[1] === 0x8b;
110
+ }
111
+ finally {
112
+ await handle.close();
113
+ }
114
+ }
115
+ export async function openSessionReadStream(filePath) {
116
+ const resolved = await resolveSessionPath(filePath);
117
+ const input = createReadStream(resolved);
118
+ if (await isGzipSessionPath(resolved)) {
119
+ return { path: resolved, stream: input.pipe(createGunzip()) };
120
+ }
121
+ return { path: resolved, stream: input };
122
+ }
123
+ async function syncFile(filePath) {
124
+ const handle = await fs.open(filePath, "r");
125
+ try {
126
+ await handle.sync();
127
+ }
128
+ finally {
129
+ await handle.close();
130
+ }
131
+ }
132
+ async function atomicWrite(filePath, content) {
133
+ const tempPath = temporarySiblingPath(filePath);
134
+ try {
135
+ await fs.writeFile(tempPath, content, { encoding: "utf8", flag: "wx" });
136
+ await syncFile(tempPath);
137
+ await fs.rename(tempPath, filePath);
138
+ }
139
+ finally {
140
+ await fs.unlink(tempPath).catch(() => { });
141
+ }
142
+ }
143
+ async function writeRedirect(filePath, targetPath) {
144
+ if (path.dirname(filePath) !== path.dirname(targetPath)) {
145
+ throw new Error("Session redirects must remain in the same directory");
146
+ }
147
+ const target = path.basename(targetPath);
148
+ if (!isSiblingBasename(target))
149
+ throw new Error(`Invalid session redirect target: ${target}`);
150
+ const redirect = {
151
+ type: REDIRECT_TYPE,
152
+ version: SESSION_REDIRECT_VERSION,
153
+ target,
154
+ };
155
+ await atomicWrite(filePath, `${JSON.stringify(redirect)}\n`);
156
+ }
157
+ async function verifyPlainSession(filePath) {
158
+ const handle = await fs.open(filePath, "r");
159
+ try {
160
+ const buffer = Buffer.alloc(8192);
161
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
162
+ const firstLine = buffer.toString("utf8", 0, bytesRead).split("\n", 1)[0];
163
+ const header = JSON.parse(firstLine);
164
+ if (header.type !== "session" || typeof header.id !== "string") {
165
+ throw new Error(`Invalid session header in ${filePath}`);
166
+ }
167
+ }
168
+ finally {
169
+ await handle.close();
170
+ }
171
+ }
172
+ async function verifyGzipSession(filePath) {
173
+ let headerChecked = false;
174
+ let prefix = Buffer.alloc(0);
175
+ const stream = createReadStream(filePath).pipe(createGunzip());
176
+ for await (const chunk of stream) {
177
+ if (!headerChecked) {
178
+ prefix = Buffer.concat([prefix, Buffer.from(chunk)]);
179
+ const newline = prefix.indexOf(0x0a);
180
+ if (newline >= 0) {
181
+ const header = JSON.parse(prefix.subarray(0, newline).toString("utf8"));
182
+ if (header.type !== "session" || typeof header.id !== "string") {
183
+ throw new Error(`Invalid archived session header in ${filePath}`);
184
+ }
185
+ headerChecked = true;
186
+ prefix = Buffer.alloc(0);
187
+ }
188
+ else if (prefix.length > 1024 * 1024) {
189
+ throw new Error(`Session header is too large in ${filePath}`);
190
+ }
191
+ }
192
+ // Fully consuming the iterator forces gzip CRC/trailer verification while
193
+ // retaining only the first-line prefix needed to validate the header.
194
+ }
195
+ if (!headerChecked)
196
+ throw new Error(`Missing archived session header in ${filePath}`);
197
+ }
198
+ export async function thawSessionArchive(filePath) {
199
+ const resolved = await resolveSessionPath(filePath);
200
+ if (!(await isGzipSessionPath(resolved)))
201
+ return resolved;
202
+ const archivePath = resolved;
203
+ const plainPath = plainSessionPath(archivePath);
204
+ const tempPath = temporarySiblingPath(plainPath);
205
+ const before = await fs.stat(archivePath);
206
+ try {
207
+ await pipeline(createReadStream(archivePath), createGunzip(), createWriteStream(tempPath, { flags: "wx" }));
208
+ await syncFile(tempPath);
209
+ await verifyPlainSession(tempPath);
210
+ const after = await fs.stat(archivePath);
211
+ if (after.size !== before.size || after.mtimeMs !== before.mtimeMs) {
212
+ throw new Error(`Session archive changed while thawing: ${archivePath}`);
213
+ }
214
+ await fs.rename(tempPath, plainPath);
215
+ await fs.utimes(plainPath, before.atime, before.mtime);
216
+ await writeRedirect(archivePath, plainPath);
217
+ return plainPath;
218
+ }
219
+ finally {
220
+ await fs.unlink(tempPath).catch(() => { });
221
+ }
222
+ }
223
+ function boundedToolText(text, metrics) {
224
+ if (text.length <= MAX_PERSISTED_TOOL_TEXT_CHARS)
225
+ return text;
226
+ metrics.truncatedToolTexts += 1;
227
+ const notice = "\n\n[Session storage truncated this tool result. Re-run the tool or use read with offset/limit for the omitted content.]\n\n";
228
+ const available = MAX_PERSISTED_TOOL_TEXT_CHARS - notice.length;
229
+ const headLength = Math.ceil(available / 2);
230
+ const tailLength = Math.floor(available / 2);
231
+ return `${text.slice(0, headLength)}${notice}${text.slice(text.length - tailLength)}`;
232
+ }
233
+ function mediaMarker(sha256) {
234
+ return `${MEDIA_MARKER_PREFIX}${sha256}`;
235
+ }
236
+ function parseMediaMarker(value) {
237
+ if (typeof value !== "string" || !value.startsWith("gg-session-asset:"))
238
+ return null;
239
+ if (!value.startsWith(MEDIA_MARKER_PREFIX))
240
+ return { valid: false };
241
+ const sha256 = value.slice(MEDIA_MARKER_PREFIX.length);
242
+ return SHA256_PATTERN.test(sha256) ? { valid: true, sha256 } : { valid: false };
243
+ }
244
+ async function storeMediaAsset(sessionPath, data, metrics) {
245
+ let bytes;
246
+ try {
247
+ bytes = Buffer.from(data, "base64");
248
+ if (bytes.length === 0 && data.length > 0)
249
+ return null;
250
+ }
251
+ catch {
252
+ return null;
253
+ }
254
+ const sha256 = crypto.createHash("sha256").update(bytes).digest("hex");
255
+ const assetsDir = sessionAssetDir(sessionPath);
256
+ const assetPath = path.join(assetsDir, sha256);
257
+ await fs.mkdir(assetsDir, { recursive: true });
258
+ try {
259
+ await fs.writeFile(assetPath, bytes, { flag: "wx" });
260
+ }
261
+ catch (error) {
262
+ if (error.code !== "EEXIST")
263
+ throw error;
264
+ }
265
+ metrics.externalizedMedia += 1;
266
+ return mediaMarker(sha256);
267
+ }
268
+ function mediaSourceCandidates(content) {
269
+ const candidates = [];
270
+ for (const block of content) {
271
+ if (!block || typeof block !== "object")
272
+ continue;
273
+ const text = block.text;
274
+ if (block.type !== "text" || typeof text !== "string")
275
+ continue;
276
+ const patterns = [
277
+ /Read (?:image|video) file (.+?) \[/u,
278
+ /(?:Captured|Generated).*? → (.+?) \[/u,
279
+ /(?:saved|written|output)(?: to| at)?\s+([^\n]+?\.(?:png|jpe?g|webp|gif|mp4|mov|webm|mkv|avi))\b/iu,
280
+ ];
281
+ for (const pattern of patterns) {
282
+ const match = pattern.exec(text);
283
+ if (match?.[1])
284
+ candidates.push(match[1].trim());
285
+ }
286
+ }
287
+ return candidates;
288
+ }
289
+ async function firstDurableMediaSource(content) {
290
+ for (const candidate of mediaSourceCandidates(content)) {
291
+ if (!path.isAbsolute(candidate))
292
+ continue;
293
+ try {
294
+ const stat = await fs.stat(candidate);
295
+ if (stat.isFile())
296
+ return candidate;
297
+ }
298
+ catch {
299
+ // A stale text path is not a durable source; externalize the media below.
300
+ }
301
+ }
302
+ return null;
303
+ }
304
+ function isMediaBlock(value) {
305
+ if (!value || typeof value !== "object")
306
+ return false;
307
+ const block = value;
308
+ return ((block.type === "image" || block.type === "video") &&
309
+ typeof block.mediaType === "string" &&
310
+ typeof block.data === "string");
311
+ }
312
+ async function normalizeMediaBlocks(blocks, sessionPath, metrics, sourcePath) {
313
+ const normalized = [];
314
+ for (const value of blocks) {
315
+ if (!isMediaBlock(value)) {
316
+ normalized.push(value);
317
+ continue;
318
+ }
319
+ if (sourcePath) {
320
+ metrics.omittedPathMedia += 1;
321
+ normalized.push({
322
+ type: "text",
323
+ text: `[Session storage omitted duplicated ${value.type} data; read the source again at ${sourcePath}.]`,
324
+ });
325
+ continue;
326
+ }
327
+ const marker = await storeMediaAsset(sessionPath, value.data, metrics);
328
+ if (!marker) {
329
+ normalized.push({ type: "text", text: "[Session media could not be persisted.]" });
330
+ continue;
331
+ }
332
+ normalized.push({ ...value, data: marker });
333
+ }
334
+ return normalized;
335
+ }
336
+ async function normalizeMessage(message, sessionPath, metrics) {
337
+ if (message.role === "user" && Array.isArray(message.content)) {
338
+ return {
339
+ ...message,
340
+ content: (await normalizeMediaBlocks(message.content, sessionPath, metrics)),
341
+ };
342
+ }
343
+ if (message.role !== "tool")
344
+ return message;
345
+ const content = [];
346
+ for (const result of message.content) {
347
+ if (typeof result.content === "string") {
348
+ content.push({ ...result, content: boundedToolText(result.content, metrics) });
349
+ continue;
350
+ }
351
+ const sourcePath = await firstDurableMediaSource(result.content);
352
+ const blocks = await normalizeMediaBlocks(result.content, sessionPath, metrics, sourcePath);
353
+ content.push({
354
+ ...result,
355
+ content: blocks.map((block) => {
356
+ if (block &&
357
+ typeof block === "object" &&
358
+ block.type === "text" &&
359
+ typeof block.text === "string") {
360
+ return {
361
+ ...block,
362
+ text: boundedToolText(block.text, metrics),
363
+ };
364
+ }
365
+ return block;
366
+ }),
367
+ });
368
+ }
369
+ return { ...message, content };
370
+ }
371
+ export async function normalizeSessionEntryForStorage(entry, sessionPath, metrics = emptyStorageNormalizationMetrics()) {
372
+ if (!entry || typeof entry !== "object")
373
+ return entry;
374
+ const value = entry;
375
+ if (value.type === "custom" && value.kind === "display_item") {
376
+ metrics.removedDisplayItems += 1;
377
+ return null;
378
+ }
379
+ if (value.type !== "message" || !value.message)
380
+ return entry;
381
+ return {
382
+ ...entry,
383
+ message: await normalizeMessage(value.message, sessionPath, metrics),
384
+ };
385
+ }
386
+ async function hydrateMediaBlocks(blocks, sessionPath) {
387
+ const hydrated = [];
388
+ for (const value of blocks) {
389
+ if (!isMediaBlock(value)) {
390
+ hydrated.push(value);
391
+ continue;
392
+ }
393
+ const marker = parseMediaMarker(value.data);
394
+ if (!marker) {
395
+ hydrated.push(value);
396
+ continue;
397
+ }
398
+ if (!marker.valid || !marker.sha256) {
399
+ hydrated.push({
400
+ type: "text",
401
+ text: "[Session media reference was malformed and was ignored.]",
402
+ });
403
+ continue;
404
+ }
405
+ try {
406
+ const data = await fs.readFile(path.join(sessionAssetDir(sessionPath), marker.sha256));
407
+ hydrated.push({ ...value, data: data.toString("base64") });
408
+ }
409
+ catch {
410
+ hydrated.push({
411
+ type: "text",
412
+ text: "[Session media asset is unavailable; attach or read it again.]",
413
+ });
414
+ }
415
+ }
416
+ return hydrated;
417
+ }
418
+ export async function hydrateSessionEntry(entry, sessionPath) {
419
+ if (!entry || typeof entry !== "object")
420
+ return entry;
421
+ const value = entry;
422
+ if (value.type !== "message" || !value.message)
423
+ return entry;
424
+ const message = value.message;
425
+ if (message.role === "user" && Array.isArray(message.content)) {
426
+ return {
427
+ ...entry,
428
+ message: {
429
+ ...message,
430
+ content: (await hydrateMediaBlocks(message.content, sessionPath)),
431
+ },
432
+ };
433
+ }
434
+ if (message.role !== "tool")
435
+ return entry;
436
+ const content = [];
437
+ for (const result of message.content) {
438
+ content.push({
439
+ ...result,
440
+ content: Array.isArray(result.content)
441
+ ? (await hydrateMediaBlocks(result.content, sessionPath))
442
+ : result.content,
443
+ });
444
+ }
445
+ return { ...entry, message: { ...message, content } };
446
+ }
447
+ export async function archiveColdSession(sessionPath) {
448
+ const sourcePath = await resolveSessionPath(sessionPath);
449
+ if (await isGzipSessionPath(sourcePath)) {
450
+ const stat = await fs.stat(sourcePath);
451
+ return {
452
+ archived: false,
453
+ sourceBytes: stat.size,
454
+ archiveBytes: stat.size,
455
+ bytesSaved: 0,
456
+ path: sourcePath,
457
+ ...emptyStorageNormalizationMetrics(),
458
+ };
459
+ }
460
+ const plainPath = plainSessionPath(sourcePath);
461
+ const archivePath = archiveSessionPath(plainPath);
462
+ const normalizedTemp = temporarySiblingPath(plainPath);
463
+ const gzipTemp = temporarySiblingPath(archivePath);
464
+ const before = await fs.stat(plainPath);
465
+ const metrics = emptyStorageNormalizationMetrics();
466
+ try {
467
+ const sourceHandle = await fs.open(plainPath, "r");
468
+ let hadTrailingNewline = false;
469
+ try {
470
+ if (before.size > 0) {
471
+ const finalByte = Buffer.alloc(1);
472
+ await sourceHandle.read(finalByte, 0, 1, before.size - 1);
473
+ hadTrailingNewline = finalByte[0] === 0x0a;
474
+ }
475
+ }
476
+ finally {
477
+ await sourceHandle.close();
478
+ }
479
+ const outputHandle = await fs.open(normalizedTemp, "wx");
480
+ try {
481
+ const rl = createInterface({
482
+ input: createReadStream(plainPath, { encoding: "utf8" }),
483
+ crlfDelay: Infinity,
484
+ });
485
+ let wroteLine = false;
486
+ for await (const line of rl) {
487
+ let outputLine = line;
488
+ if (line) {
489
+ try {
490
+ const parsed = JSON.parse(line);
491
+ if (parsed.type !== "session") {
492
+ const normalized = await normalizeSessionEntryForStorage(parsed, plainPath, metrics);
493
+ outputLine = normalized === null ? null : JSON.stringify(normalized);
494
+ }
495
+ }
496
+ catch {
497
+ // Preserve malformed lines byte-for-byte. A later recovery tool may
498
+ // be able to repair content that this version cannot parse.
499
+ }
500
+ }
501
+ if (outputLine === null)
502
+ continue;
503
+ if (wroteLine)
504
+ await outputHandle.write("\n");
505
+ await outputHandle.write(outputLine);
506
+ wroteLine = true;
507
+ }
508
+ if (wroteLine && hadTrailingNewline)
509
+ await outputHandle.write("\n");
510
+ await outputHandle.sync();
511
+ }
512
+ finally {
513
+ await outputHandle.close();
514
+ }
515
+ await verifyPlainSession(normalizedTemp);
516
+ await pipeline(createReadStream(normalizedTemp), createGzip({ level: 9 }), createWriteStream(gzipTemp, { flags: "wx" }));
517
+ await syncFile(gzipTemp);
518
+ await verifyGzipSession(gzipTemp);
519
+ const after = await fs.stat(plainPath);
520
+ if (after.size !== before.size || after.mtimeMs !== before.mtimeMs) {
521
+ throw new Error(`Session changed while archiving: ${plainPath}`);
522
+ }
523
+ await fs.rename(gzipTemp, archivePath);
524
+ await fs.utimes(archivePath, before.atime, before.mtime);
525
+ await writeRedirect(plainPath, archivePath);
526
+ const archiveStat = await fs.stat(archivePath);
527
+ return {
528
+ archived: true,
529
+ sourceBytes: before.size,
530
+ archiveBytes: archiveStat.size,
531
+ bytesSaved: Math.max(0, before.size - archiveStat.size),
532
+ path: archivePath,
533
+ ...metrics,
534
+ };
535
+ }
536
+ finally {
537
+ await fs.unlink(normalizedTemp).catch(() => { });
538
+ await fs.unlink(gzipTemp).catch(() => { });
539
+ }
540
+ }
541
+ export async function cleanupOldSessionTemps(directory, olderThanMs) {
542
+ const result = { deletedFiles: 0, freedBytes: 0 };
543
+ let entries;
544
+ try {
545
+ entries = await fs.readdir(directory, { withFileTypes: true });
546
+ }
547
+ catch {
548
+ return result;
549
+ }
550
+ for (const entry of entries) {
551
+ if (!entry.isFile() || !isSessionTempPath(entry.name))
552
+ continue;
553
+ const filePath = path.join(directory, entry.name);
554
+ try {
555
+ const stat = await fs.stat(filePath);
556
+ if (stat.mtimeMs >= olderThanMs)
557
+ continue;
558
+ await fs.unlink(filePath);
559
+ result.deletedFiles += 1;
560
+ result.freedBytes += stat.size;
561
+ }
562
+ catch {
563
+ // Maintenance artifacts are best-effort cleanup only.
564
+ }
565
+ }
566
+ return result;
567
+ }
568
+ //# sourceMappingURL=session-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-storage.js","sourceRoot":"","sources":["../../src/core/session-storage.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAmB,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AACpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAEtD,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,mBAAmB,GAAG,qBAAqB,4BAA4B,GAAG,CAAC;AACjF,MAAM,cAAc,GAAG,gBAAgB,CAAC;AACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAuBhC,MAAM,UAAU,gCAAgC;IAC9C,OAAO;QACL,kBAAkB,EAAE,CAAC;QACrB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,CAAC;QACnB,mBAAmB,EAAE,CAAC;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAKhD,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO;QACL,SAAS;QACT,WAAW,EAAE,kBAAkB,CAAC,SAAS,CAAC;QAC1C,UAAU,EAAE,eAAe,CAAC,SAAS,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,IAAI,CAAC,IAAI,CACd,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtB,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,mBAAmB,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CACxF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,CACL,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC9B,KAAK,KAAK,GAAG;QACb,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,aAAa,CAAC,KAAK,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAEpF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;QAC1D,IACE,KAAK,CAAC,IAAI,KAAK,aAAa;YAC5B,KAAK,CAAC,OAAO,KAAK,wBAAwB;YAC1C,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAChC,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,EAChC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAwB,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC;QAC9B,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAI1D,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,GAAe,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,MAAM,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAgB;IACtC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe;IAC1D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,UAAkB;IAC/D,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAoB;QAChC,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,wBAAwB;QACjC,MAAM;KACP,CAAC;IACF,MAAM,WAAW,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAqC,CAAC;QACzE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IAC/C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAGrE,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;gBACpE,CAAC;gBACD,aAAa,GAAG,IAAI,CAAC;gBACrB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,0EAA0E;QAC1E,sEAAsE;IACxE,CAAC;IACD,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1D,MAAM,WAAW,GAAG,QAAQ,CAAC;IAC7B,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,QAAQ,CACZ,gBAAgB,CAAC,WAAW,CAAC,EAC7B,YAAY,EAAE,EACd,iBAAiB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAC7C,CAAC;QACF,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,0CAA0C,WAAW,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACrC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,OAAoC;IACzE,IAAI,IAAI,CAAC,MAAM,IAAI,6BAA6B;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GACV,8HAA8H,CAAC;IACjI,MAAM,SAAS,GAAG,6BAA6B,GAAG,MAAM,CAAC,MAAM,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,GAAG,mBAAmB,GAAG,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAClF,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,WAAmB,EACnB,IAAY,EACZ,OAAoC;IAEpC,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,iBAAiB,IAAI,CAAC,CAAC;IAC/B,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAkB;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,IAAI,GAAI,KAA4C,CAAC,IAAI,CAAC;QAChE,IAAK,KAA4B,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QACxF,MAAM,QAAQ,GAAG;YACf,qCAAqC;YACrC,uCAAuC;YACvC,mGAAmG;SACpG,CAAC;QACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,OAAkB;IACvD,KAAK,MAAM,SAAS,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,MAAM,EAAE;gBAAE,OAAO,SAAS,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAID,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAA4B,CAAC;IAC3C,OAAO,CACL,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAClD,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,MAAiB,EACjB,WAAmB,EACnB,OAAoC,EACpC,UAA0B;IAE1B,MAAM,UAAU,GAAc,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,uCAAuC,KAAK,CAAC,IAAI,mCAAmC,UAAU,IAAI;aACzG,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAgB,EAChB,WAAmB,EACnB,OAAoC;IAEpC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO;YACL,GAAG,OAAO;YACV,OAAO,EAAE,CAAC,MAAM,oBAAoB,CAClC,OAAO,CAAC,OAAO,EACf,WAAW,EACX,OAAO,CACR,CAA2B;SAC7B,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IAE5C,MAAM,OAAO,GAAG,EAA4B,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,MAAM;YACT,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC5B,IACE,KAAK;oBACL,OAAO,KAAK,KAAK,QAAQ;oBACxB,KAA4B,CAAC,IAAI,KAAK,MAAM;oBAC7C,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,EACtD,CAAC;oBACD,OAAO;wBACL,GAAI,KAAwC;wBAC5C,IAAI,EAAE,eAAe,CAAE,KAA0B,CAAC,IAAI,EAAE,OAAO,CAAC;qBACjE,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAA0B;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,KAAQ,EACR,WAAmB,EACnB,UAAuC,gCAAgC,EAAE;IAEzE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAIb,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC7D,OAAO,CAAC,mBAAmB,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO;QACL,GAAG,KAAK;QACR,OAAO,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC;KAChE,CAAC;AACT,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,WAAmB;IACtE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,0DAA0D;aACjE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,gEAAgE;aACvE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAI,KAAQ,EAAE,WAAmB;IACxE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAA8C,CAAC;IAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO;YACL,GAAG,KAAK;YACR,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,OAAO,EAAE,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAA2B;aAC5F;SACG,CAAC;IACT,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,OAAO,GAAG,EAA4B,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,MAAM;YACT,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBACpC,CAAC,CAAE,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAA2B;gBACpF,CAAC,CAAC,MAAM,CAAC,OAAO;SACnB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,EAAO,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,MAAM,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,UAAU;YAChB,GAAG,gCAAgC,EAAE;SACtC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,gCAAgC,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;gBAC1D,kBAAkB,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;YAC7C,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,eAAe,CAAC;gBACzB,KAAK,EAAE,gBAAgB,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACxD,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;YACH,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC5B,IAAI,UAAU,GAAkB,IAAI,CAAC;gBACrC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;wBAC3C,IAAK,MAA6B,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BACtD,MAAM,UAAU,GAAG,MAAM,+BAA+B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;4BACrF,UAAU,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;wBACvE,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,oEAAoE;wBACpE,4DAA4D;oBAC9D,CAAC;gBACH,CAAC;gBACD,IAAI,UAAU,KAAK,IAAI;oBAAE,SAAS;gBAClC,IAAI,SAAS;oBAAE,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACrC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,IAAI,SAAS,IAAI,kBAAkB;gBAAE,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,MAAM,kBAAkB,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,QAAQ,CACZ,gBAAgB,CAAC,cAAc,CAAC,EAChC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EACxB,iBAAiB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAC7C,CAAC;QACF,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAElC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACvC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,MAAM,CAAC,IAAI;YACxB,YAAY,EAAE,WAAW,CAAC,IAAI;YAC9B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YACvD,IAAI,EAAE,WAAW;YACjB,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAAiB,EACjB,WAAmB;IAEnB,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAClD,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,OAAO,IAAI,WAAW;gBAAE,SAAS;YAC1C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;YACzB,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-storage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-storage.test.d.ts","sourceRoot":"","sources":["../../src/core/session-storage.test.ts"],"names":[],"mappings":""}