@pantheon-systems/nextjs-cache-handler 0.1.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.
Files changed (54) hide show
  1. package/README.md +256 -0
  2. package/dist/edge/edge-cache-clear.d.ts +64 -0
  3. package/dist/edge/edge-cache-clear.d.ts.map +1 -0
  4. package/dist/edge/edge-cache-clear.js +245 -0
  5. package/dist/edge/edge-cache-clear.js.map +1 -0
  6. package/dist/handlers/base.d.ts +69 -0
  7. package/dist/handlers/base.d.ts.map +1 -0
  8. package/dist/handlers/base.js +278 -0
  9. package/dist/handlers/base.js.map +1 -0
  10. package/dist/handlers/file.d.ts +62 -0
  11. package/dist/handlers/file.d.ts.map +1 -0
  12. package/dist/handlers/file.js +332 -0
  13. package/dist/handlers/file.js.map +1 -0
  14. package/dist/handlers/gcs.d.ts +66 -0
  15. package/dist/handlers/gcs.d.ts.map +1 -0
  16. package/dist/handlers/gcs.js +407 -0
  17. package/dist/handlers/gcs.js.map +1 -0
  18. package/dist/handlers/index.d.ts +4 -0
  19. package/dist/handlers/index.d.ts.map +1 -0
  20. package/dist/handlers/index.js +4 -0
  21. package/dist/handlers/index.js.map +1 -0
  22. package/dist/index.d.ts +47 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +73 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/types.d.ts +119 -0
  27. package/dist/types.d.ts.map +1 -0
  28. package/dist/types.js +2 -0
  29. package/dist/types.js.map +1 -0
  30. package/dist/utils/build-detection.d.ts +10 -0
  31. package/dist/utils/build-detection.d.ts.map +1 -0
  32. package/dist/utils/build-detection.js +57 -0
  33. package/dist/utils/build-detection.js.map +1 -0
  34. package/dist/utils/index.d.ts +5 -0
  35. package/dist/utils/index.d.ts.map +1 -0
  36. package/dist/utils/index.js +5 -0
  37. package/dist/utils/index.js.map +1 -0
  38. package/dist/utils/logger.d.ts +34 -0
  39. package/dist/utils/logger.d.ts.map +1 -0
  40. package/dist/utils/logger.js +54 -0
  41. package/dist/utils/logger.js.map +1 -0
  42. package/dist/utils/serialization.d.ts +12 -0
  43. package/dist/utils/serialization.d.ts.map +1 -0
  44. package/dist/utils/serialization.js +137 -0
  45. package/dist/utils/serialization.js.map +1 -0
  46. package/dist/utils/static-routes.d.ts +7 -0
  47. package/dist/utils/static-routes.d.ts.map +1 -0
  48. package/dist/utils/static-routes.js +52 -0
  49. package/dist/utils/static-routes.js.map +1 -0
  50. package/dist/utils/tags-buffer.d.ts +63 -0
  51. package/dist/utils/tags-buffer.d.ts.map +1 -0
  52. package/dist/utils/tags-buffer.js +181 -0
  53. package/dist/utils/tags-buffer.js.map +1 -0
  54. package/package.json +58 -0
@@ -0,0 +1,332 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { promisify } from 'util';
4
+ import { BaseCacheHandler } from './base.js';
5
+ import { getStaticRoutes } from '../utils/static-routes.js';
6
+ import { TagsBuffer } from '../utils/tags-buffer.js';
7
+ import { createLogger } from '../utils/logger.js';
8
+ const fileLog = createLogger('FileCacheHandler');
9
+ const writeFile = promisify(fs.writeFile);
10
+ const readFile = promisify(fs.readFile);
11
+ const mkdir = promisify(fs.mkdir);
12
+ /**
13
+ * File-based cache handler for local development.
14
+ * Stores cache entries in the .next/cache directory.
15
+ */
16
+ export class FileCacheHandler extends BaseCacheHandler {
17
+ constructor(context) {
18
+ super(context, 'FileCacheHandler');
19
+ this.baseDir = path.join(process.cwd(), '.next', 'cache');
20
+ this.fetchCacheDir = path.join(this.baseDir, 'fetch-cache');
21
+ this.routeCacheDir = path.join(this.baseDir, 'route-cache');
22
+ // Store build-meta.json outside .next/ to survive Next.js cache clearing during builds
23
+ this.buildMetaFile = path.join(process.cwd(), '.cache', 'build-meta.json');
24
+ this.tagsDir = path.join(this.baseDir, 'tags');
25
+ this.tagsMapFile = path.join(this.tagsDir, 'tags.json');
26
+ // Create tags buffer for batched writes (improves performance)
27
+ this.tagsBuffer = new TagsBuffer({
28
+ flushIntervalMs: 100, // File system can handle faster flushes than GCS
29
+ readTagsMapping: () => Promise.resolve(this.readTagsMappingDirect()),
30
+ writeTagsMapping: (mapping) => {
31
+ this.writeTagsMappingDirect(mapping);
32
+ return Promise.resolve();
33
+ },
34
+ handlerName: 'FileCacheHandler',
35
+ });
36
+ this.ensureCacheDir();
37
+ // Initialize asynchronously (don't await to avoid blocking constructor)
38
+ this.initialize().catch(() => { });
39
+ }
40
+ ensureCacheDir() {
41
+ try {
42
+ fs.mkdirSync(this.fetchCacheDir, { recursive: true });
43
+ fs.mkdirSync(this.routeCacheDir, { recursive: true });
44
+ fs.mkdirSync(this.tagsDir, { recursive: true });
45
+ }
46
+ catch (error) {
47
+ if (error.code !== 'EEXIST') {
48
+ this.log.error('Error creating cache directories:', error);
49
+ }
50
+ }
51
+ }
52
+ // ============================================================================
53
+ // Tags mapping implementation (buffered for improved performance)
54
+ // ============================================================================
55
+ async initializeTagsMapping() {
56
+ try {
57
+ if (!fs.existsSync(this.tagsMapFile)) {
58
+ fs.writeFileSync(this.tagsMapFile, JSON.stringify({}, null, 2), 'utf-8');
59
+ }
60
+ }
61
+ catch {
62
+ // Silently fail - tags mapping will be created on first write
63
+ }
64
+ }
65
+ /**
66
+ * Read tags mapping, flushing any pending updates first to ensure accuracy.
67
+ */
68
+ async readTagsMapping() {
69
+ // Flush pending updates before reading to ensure we have accurate data
70
+ await this.tagsBuffer.flush();
71
+ return this.readTagsMappingDirect();
72
+ }
73
+ /**
74
+ * Direct read from file system without flushing buffer.
75
+ * Used internally by the buffer.
76
+ */
77
+ readTagsMappingDirect() {
78
+ try {
79
+ if (!fs.existsSync(this.tagsMapFile)) {
80
+ return {};
81
+ }
82
+ const data = fs.readFileSync(this.tagsMapFile, 'utf-8');
83
+ return JSON.parse(data);
84
+ }
85
+ catch (error) {
86
+ this.log.warn('Error reading tags mapping:', error);
87
+ return {};
88
+ }
89
+ }
90
+ /**
91
+ * Write tags mapping directly to file system.
92
+ * Used by the buffer for batched writes.
93
+ */
94
+ async writeTagsMapping(tagsMapping) {
95
+ this.writeTagsMappingDirect(tagsMapping);
96
+ }
97
+ /**
98
+ * Direct write to file system (sync).
99
+ * Used internally by the buffer.
100
+ */
101
+ writeTagsMappingDirect(tagsMapping) {
102
+ try {
103
+ fs.writeFileSync(this.tagsMapFile, JSON.stringify(tagsMapping, null, 2), 'utf-8');
104
+ }
105
+ catch (error) {
106
+ this.log.error('Error writing tags mapping:', error);
107
+ throw error; // Re-throw so buffer can retry
108
+ }
109
+ }
110
+ /**
111
+ * Override to use buffered updates instead of immediate writes.
112
+ */
113
+ async updateTagsMapping(cacheKey, tags, isDelete = false) {
114
+ if (isDelete) {
115
+ this.tagsBuffer.deleteKey(cacheKey);
116
+ }
117
+ else if (tags.length > 0) {
118
+ this.tagsBuffer.addTags(cacheKey, tags);
119
+ }
120
+ // Updates are queued and will be flushed automatically
121
+ this.log.debug(`Queued tags update for ${cacheKey} (pending: ${this.tagsBuffer.pendingCount})`);
122
+ }
123
+ /**
124
+ * Override to use buffered deletes instead of immediate writes.
125
+ */
126
+ async updateTagsMappingBulkDelete(cacheKeysToDelete, _tagsMapping) {
127
+ this.tagsBuffer.deleteKeys(cacheKeysToDelete);
128
+ // Force flush after bulk delete to ensure consistency for revalidation
129
+ await this.tagsBuffer.flush();
130
+ }
131
+ // ============================================================================
132
+ // Cache entry implementation
133
+ // ============================================================================
134
+ getCacheFilePath(cacheKey, cacheType) {
135
+ const safeKey = cacheKey.replace(/[^a-zA-Z0-9-]/g, '_');
136
+ const dir = cacheType === 'fetch' ? this.fetchCacheDir : this.routeCacheDir;
137
+ return path.join(dir, `${safeKey}.json`);
138
+ }
139
+ async readCacheEntry(cacheKey, cacheType) {
140
+ try {
141
+ const filePath = this.getCacheFilePath(cacheKey, cacheType);
142
+ const data = await readFile(filePath, 'utf-8');
143
+ const parsedData = JSON.parse(data);
144
+ return this.deserializeFromStorage({ [cacheKey]: parsedData })[cacheKey] || null;
145
+ }
146
+ catch {
147
+ return null;
148
+ }
149
+ }
150
+ async writeCacheEntry(cacheKey, cacheValue, cacheType) {
151
+ try {
152
+ this.ensureCacheDir();
153
+ const filePath = this.getCacheFilePath(cacheKey, cacheType);
154
+ const serializedData = this.serializeForStorage({ [cacheKey]: cacheValue });
155
+ await writeFile(filePath, JSON.stringify(serializedData[cacheKey], null, 2), 'utf-8');
156
+ }
157
+ catch (error) {
158
+ this.log.error(`Error writing cache entry ${cacheKey}:`, error);
159
+ }
160
+ }
161
+ async deleteCacheEntry(cacheKey, cacheType) {
162
+ try {
163
+ const filePath = this.getCacheFilePath(cacheKey, cacheType);
164
+ await fs.promises.unlink(filePath);
165
+ }
166
+ catch (error) {
167
+ if (error.code !== 'ENOENT') {
168
+ this.log.error(`Error deleting cache entry ${cacheKey}:`, error);
169
+ }
170
+ throw error;
171
+ }
172
+ }
173
+ // ============================================================================
174
+ // Build meta implementation
175
+ // ============================================================================
176
+ async readBuildMeta() {
177
+ const data = await readFile(this.buildMetaFile, 'utf-8');
178
+ return JSON.parse(data);
179
+ }
180
+ async writeBuildMeta(meta) {
181
+ const buildMetaDir = path.dirname(this.buildMetaFile);
182
+ await mkdir(buildMetaDir, { recursive: true });
183
+ await writeFile(this.buildMetaFile, JSON.stringify(meta), 'utf-8');
184
+ }
185
+ async invalidateRouteCache() {
186
+ try {
187
+ await fs.promises.rm(this.routeCacheDir, { recursive: true, force: true });
188
+ await fs.promises.mkdir(this.routeCacheDir, { recursive: true });
189
+ }
190
+ catch {
191
+ // Directory might not exist or can't be created - not critical
192
+ }
193
+ }
194
+ }
195
+ // ============================================================================
196
+ // Standalone functions for API usage
197
+ // ============================================================================
198
+ /**
199
+ * Get cache statistics for the file-based cache.
200
+ */
201
+ export async function getSharedCacheStats() {
202
+ const fetchCacheDir = path.join(process.cwd(), '.next', 'cache', 'fetch-cache');
203
+ const routeCacheDir = path.join(process.cwd(), '.next', 'cache', 'route-cache');
204
+ const keys = [];
205
+ const entries = [];
206
+ try {
207
+ await processCacheDirectory(fetchCacheDir, 'fetch', keys, entries);
208
+ await processCacheDirectory(routeCacheDir, 'route', keys, entries);
209
+ fileLog.debug(`Found ${keys.length} cache entries ` +
210
+ `(${keys.filter((k) => k.startsWith('fetch:')).length} fetch, ` +
211
+ `${keys.filter((k) => k.startsWith('route:')).length} route)`);
212
+ return { size: keys.length, keys, entries };
213
+ }
214
+ catch (error) {
215
+ fileLog.error('Error reading cache directories:', error);
216
+ return { size: 0, keys: [], entries: [] };
217
+ }
218
+ }
219
+ async function processCacheDirectory(dir, cacheType, keys, entries) {
220
+ try {
221
+ const files = await fs.promises.readdir(dir);
222
+ const jsonFiles = files.filter((file) => file.endsWith('.json'));
223
+ for (const file of jsonFiles) {
224
+ await processJsonCacheFile(dir, file, cacheType, keys, entries);
225
+ }
226
+ }
227
+ catch {
228
+ // Directory might not exist
229
+ }
230
+ }
231
+ async function processJsonCacheFile(dir, file, cacheType, keys, entries) {
232
+ const cacheKey = file.replace('.json', '').replace(/_/g, '-');
233
+ const displayKey = `${cacheType}:${cacheKey}`;
234
+ keys.push(displayKey);
235
+ try {
236
+ const filePath = path.join(dir, file);
237
+ const data = await fs.promises.readFile(filePath, 'utf-8');
238
+ const cacheData = JSON.parse(data);
239
+ entries.push({
240
+ key: displayKey,
241
+ tags: cacheData.tags || [],
242
+ lastModified: cacheData.lastModified || Date.now(),
243
+ type: cacheType,
244
+ });
245
+ }
246
+ catch {
247
+ entries.push({
248
+ key: displayKey,
249
+ tags: [],
250
+ type: cacheType,
251
+ });
252
+ }
253
+ }
254
+ /**
255
+ * Clear all cache entries for the file-based cache.
256
+ */
257
+ export async function clearSharedCache() {
258
+ const fetchCacheDir = path.join(process.cwd(), '.next', 'cache', 'fetch-cache');
259
+ const routeCacheDir = path.join(process.cwd(), '.next', 'cache', 'route-cache');
260
+ const tagsFilePath = path.join(process.cwd(), '.next', 'cache', 'tags', 'tags.json');
261
+ const staticRoutes = getStaticRoutes();
262
+ let clearedCount = 0;
263
+ let preservedCount = 0;
264
+ try {
265
+ // Clear fetch cache (data cache - always clearable)
266
+ clearedCount += await clearFetchCache(fetchCacheDir);
267
+ // Clear route cache (skip static routes)
268
+ const routeResult = await clearRouteCache(routeCacheDir, staticRoutes);
269
+ clearedCount += routeResult.cleared;
270
+ preservedCount = routeResult.preserved;
271
+ // Clear tags mapping
272
+ await clearTagsMapping(tagsFilePath);
273
+ fileLog.info(`Total cleared: ${clearedCount} cache entries`);
274
+ return clearedCount;
275
+ }
276
+ catch (error) {
277
+ fileLog.error('Error clearing cache directories:', error);
278
+ return 0;
279
+ }
280
+ }
281
+ async function clearFetchCache(dir) {
282
+ try {
283
+ const files = await fs.promises.readdir(dir);
284
+ const jsonFiles = files.filter((file) => file.endsWith('.json'));
285
+ for (const file of jsonFiles) {
286
+ await fs.promises.unlink(path.join(dir, file));
287
+ }
288
+ fileLog.debug(`Cleared ${jsonFiles.length} fetch cache entries`);
289
+ return jsonFiles.length;
290
+ }
291
+ catch {
292
+ return 0;
293
+ }
294
+ }
295
+ async function clearRouteCache(dir, staticRoutes) {
296
+ let cleared = 0;
297
+ let preserved = 0;
298
+ try {
299
+ const files = await fs.promises.readdir(dir);
300
+ const jsonFiles = files.filter((file) => file.endsWith('.json'));
301
+ for (const file of jsonFiles) {
302
+ const cacheKey = file.replace('.json', '');
303
+ if (staticRoutes.has(cacheKey)) {
304
+ preserved++;
305
+ continue;
306
+ }
307
+ await fs.promises.unlink(path.join(dir, file));
308
+ cleared++;
309
+ }
310
+ fileLog.debug(`Route cache: cleared ${cleared}, preserved ${preserved} static routes`);
311
+ }
312
+ catch {
313
+ // Directory might not exist
314
+ }
315
+ return { cleared, preserved };
316
+ }
317
+ async function clearTagsMapping(tagsFilePath) {
318
+ try {
319
+ const exists = await fs.promises
320
+ .access(tagsFilePath)
321
+ .then(() => true)
322
+ .catch(() => false);
323
+ if (exists) {
324
+ await fs.promises.unlink(tagsFilePath);
325
+ }
326
+ }
327
+ catch {
328
+ // Ignore errors
329
+ }
330
+ }
331
+ export default FileCacheHandler;
332
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/handlers/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { CacheStats, CacheHandlerValue, FileSystemCacheContext } from '../types.js';
2
+ import { BaseCacheHandler, type BuildMeta } from './base.js';
3
+ /**
4
+ * Google Cloud Storage cache handler for production/Pantheon environments.
5
+ * Stores cache entries in a GCS bucket.
6
+ */
7
+ export declare class GcsCacheHandler extends BaseCacheHandler {
8
+ private readonly bucket;
9
+ private readonly fetchCachePrefix;
10
+ private readonly routeCachePrefix;
11
+ private readonly buildMetaKey;
12
+ private readonly tagsPrefix;
13
+ private readonly tagsMapKey;
14
+ private readonly edgeCacheClearer;
15
+ private readonly tagsBuffer;
16
+ constructor(context: FileSystemCacheContext);
17
+ protected initializeTagsMapping(): Promise<void>;
18
+ /**
19
+ * Read tags mapping, flushing any pending updates first to ensure accuracy.
20
+ */
21
+ protected readTagsMapping(): Promise<Record<string, string[]>>;
22
+ /**
23
+ * Direct read from GCS without flushing buffer.
24
+ * Used internally by the buffer.
25
+ */
26
+ private readTagsMappingDirect;
27
+ /**
28
+ * Write tags mapping directly to GCS.
29
+ * Used by the buffer for batched writes.
30
+ */
31
+ protected writeTagsMapping(tagsMapping: Record<string, string[]>): Promise<void>;
32
+ /**
33
+ * Override to use buffered updates instead of immediate writes.
34
+ */
35
+ protected updateTagsMapping(cacheKey: string, tags: string[], isDelete?: boolean): Promise<void>;
36
+ /**
37
+ * Override to use buffered deletes instead of immediate writes.
38
+ */
39
+ protected updateTagsMappingBulkDelete(cacheKeysToDelete: string[], _tagsMapping: Record<string, string[]>): Promise<void>;
40
+ private getCacheKey;
41
+ protected readCacheEntry(cacheKey: string, cacheType: 'fetch' | 'route'): Promise<CacheHandlerValue | null>;
42
+ protected writeCacheEntry(cacheKey: string, cacheValue: CacheHandlerValue, cacheType: 'fetch' | 'route'): Promise<void>;
43
+ protected deleteCacheEntry(cacheKey: string, cacheType: 'fetch' | 'route'): Promise<void>;
44
+ protected readBuildMeta(): Promise<BuildMeta>;
45
+ protected writeBuildMeta(meta: BuildMeta): Promise<void>;
46
+ protected invalidateRouteCache(): Promise<void>;
47
+ private clearEdgeCache;
48
+ protected onRevalidateComplete(tags: string[], deletedKeys: string[]): Promise<void>;
49
+ /**
50
+ * Called when a route cache entry is set (ISR page update).
51
+ * Clears the edge cache for this specific route so users get the fresh version.
52
+ */
53
+ protected onRouteCacheSet(cacheKey: string): void;
54
+ private cacheKeyToRoutePath;
55
+ private extractRoutePaths;
56
+ }
57
+ /**
58
+ * Get cache statistics for the GCS-based cache.
59
+ */
60
+ export declare function getSharedCacheStats(): Promise<CacheStats>;
61
+ /**
62
+ * Clear all cache entries for the GCS-based cache.
63
+ */
64
+ export declare function clearSharedCache(): Promise<number>;
65
+ export default GcsCacheHandler;
66
+ //# sourceMappingURL=gcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcs.d.ts","sourceRoot":"","sources":["../../src/handlers/gcs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAEV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAQ7D;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;gBAE5B,OAAO,EAAE,sBAAsB;cAmC3B,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBtD;;OAEG;cACa,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAMpE;;;OAGG;YACW,qBAAqB;IAiBnC;;;OAGG;cACa,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtF;;OAEG;cACsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7G;;OAEG;cACsB,2BAA2B,CAClD,iBAAiB,EAAE,MAAM,EAAE,EAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC;IAUhB,OAAO,CAAC,WAAW;cAMH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAmBjG,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,iBAAiB,EAC7B,SAAS,EAAE,OAAO,GAAG,OAAO,GAC3B,OAAO,CAAC,IAAI,CAAC;cAeA,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;cAiB/E,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;cAMnC,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;cAO9C,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBrD,OAAO,CAAC,cAAc;cASG,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAenG;;;OAGG;cACgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS1D,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,iBAAiB;CAU1B;AAMD;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CA+B/D;AAmDD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CA2CxD;AAkED,eAAe,eAAe,CAAC"}