@treesap/sandbox 0.2.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 (66) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/README.md +495 -0
  3. package/dist/api-server.d.ts +41 -0
  4. package/dist/api-server.d.ts.map +1 -0
  5. package/dist/api-server.js +536 -0
  6. package/dist/api-server.js.map +1 -0
  7. package/dist/auth-middleware.d.ts +31 -0
  8. package/dist/auth-middleware.d.ts.map +1 -0
  9. package/dist/auth-middleware.js +35 -0
  10. package/dist/auth-middleware.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +65 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/client.d.ts +137 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +412 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/file-service.d.ts +94 -0
  20. package/dist/file-service.d.ts.map +1 -0
  21. package/dist/file-service.js +203 -0
  22. package/dist/file-service.js.map +1 -0
  23. package/dist/http-exposure-service.d.ts +71 -0
  24. package/dist/http-exposure-service.d.ts.map +1 -0
  25. package/dist/http-exposure-service.js +172 -0
  26. package/dist/http-exposure-service.js.map +1 -0
  27. package/dist/index.d.ts +59 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +66 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/sandbox-manager.d.ts +76 -0
  32. package/dist/sandbox-manager.d.ts.map +1 -0
  33. package/dist/sandbox-manager.js +161 -0
  34. package/dist/sandbox-manager.js.map +1 -0
  35. package/dist/sandbox.d.ts +118 -0
  36. package/dist/sandbox.d.ts.map +1 -0
  37. package/dist/sandbox.js +303 -0
  38. package/dist/sandbox.js.map +1 -0
  39. package/dist/server.d.ts +7 -0
  40. package/dist/server.d.ts.map +1 -0
  41. package/dist/server.js +240 -0
  42. package/dist/server.js.map +1 -0
  43. package/dist/stream-service.d.ts +35 -0
  44. package/dist/stream-service.d.ts.map +1 -0
  45. package/dist/stream-service.js +136 -0
  46. package/dist/stream-service.js.map +1 -0
  47. package/dist/terminal.d.ts +46 -0
  48. package/dist/terminal.d.ts.map +1 -0
  49. package/dist/terminal.js +264 -0
  50. package/dist/terminal.js.map +1 -0
  51. package/dist/websocket.d.ts +48 -0
  52. package/dist/websocket.d.ts.map +1 -0
  53. package/dist/websocket.js +332 -0
  54. package/dist/websocket.js.map +1 -0
  55. package/package.json +59 -0
  56. package/src/api-server.ts +658 -0
  57. package/src/auth-middleware.ts +65 -0
  58. package/src/cli.ts +71 -0
  59. package/src/client.ts +537 -0
  60. package/src/file-service.ts +273 -0
  61. package/src/http-exposure-service.ts +232 -0
  62. package/src/index.ts +101 -0
  63. package/src/sandbox-manager.ts +202 -0
  64. package/src/sandbox.ts +396 -0
  65. package/src/stream-service.ts +174 -0
  66. package/tsconfig.json +37 -0
@@ -0,0 +1,536 @@
1
+ import { Hono } from 'hono';
2
+ import { serve } from '@hono/node-server';
3
+ import { SandboxManager } from './sandbox-manager';
4
+ import { FileService } from './file-service';
5
+ import { StreamService } from './stream-service';
6
+ import { stream } from 'hono/streaming';
7
+ import { createAuthMiddleware, parseApiKeysFromEnv } from './auth-middleware';
8
+ import { HttpExposureService } from './http-exposure-service';
9
+ /**
10
+ * Create and configure the API server
11
+ */
12
+ export function createServer(config = {}) {
13
+ const app = new Hono();
14
+ const manager = new SandboxManager({
15
+ basePath: config.basePath,
16
+ maxSandboxes: config.maxSandboxes,
17
+ });
18
+ const httpExposure = new HttpExposureService(config.httpExposure || {});
19
+ // CORS middleware if enabled
20
+ if (config.cors) {
21
+ app.use('*', async (c, next) => {
22
+ await next();
23
+ c.header('Access-Control-Allow-Origin', '*');
24
+ c.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
25
+ c.header('Access-Control-Allow-Headers', 'Content-Type, X-API-Key');
26
+ });
27
+ }
28
+ // API key authentication middleware
29
+ const apiKeys = config.apiKeys || parseApiKeysFromEnv();
30
+ if (apiKeys.length > 0) {
31
+ app.use('*', createAuthMiddleware({
32
+ apiKeys,
33
+ excludePaths: ['/'], // Health check doesn't require auth
34
+ }));
35
+ }
36
+ // Health check
37
+ app.get('/', (c) => {
38
+ return c.json({
39
+ status: 'ok',
40
+ service: 'TreeSap Sandbox',
41
+ version: '1.0.0',
42
+ stats: manager.getStats(),
43
+ });
44
+ });
45
+ // ============================================================================
46
+ // Sandbox Management Endpoints
47
+ // ============================================================================
48
+ /**
49
+ * Create a new sandbox
50
+ * POST /sandbox
51
+ */
52
+ app.post('/sandbox', async (c) => {
53
+ try {
54
+ const body = await c.req.json().catch(() => ({}));
55
+ const sandbox = await manager.createSandbox(body);
56
+ return c.json({
57
+ id: sandbox.id,
58
+ workDir: sandbox.workDir,
59
+ createdAt: sandbox.createdAt,
60
+ }, 201);
61
+ }
62
+ catch (error) {
63
+ return c.json({ error: error.message }, 400);
64
+ }
65
+ });
66
+ /**
67
+ * List all sandboxes
68
+ * GET /sandbox
69
+ */
70
+ app.get('/sandbox', (c) => {
71
+ const sandboxes = manager.listSandboxes();
72
+ return c.json({ sandboxes });
73
+ });
74
+ /**
75
+ * Get sandbox info
76
+ * GET /sandbox/:id
77
+ */
78
+ app.get('/sandbox/:id', (c) => {
79
+ const id = c.req.param('id');
80
+ const sandbox = manager.getSandbox(id);
81
+ if (!sandbox) {
82
+ return c.json({ error: 'Sandbox not found' }, 404);
83
+ }
84
+ return c.json(sandbox.getStatus());
85
+ });
86
+ /**
87
+ * Destroy a sandbox
88
+ * DELETE /sandbox/:id
89
+ */
90
+ app.delete('/sandbox/:id', async (c) => {
91
+ try {
92
+ const id = c.req.param('id');
93
+ const cleanup = c.req.query('cleanup') === 'true';
94
+ await manager.destroySandbox(id, { cleanup });
95
+ return c.json({ success: true });
96
+ }
97
+ catch (error) {
98
+ return c.json({ error: error.message }, 404);
99
+ }
100
+ });
101
+ // ============================================================================
102
+ // Command Execution Endpoints
103
+ // ============================================================================
104
+ /**
105
+ * Execute a command
106
+ * POST /sandbox/:id/exec
107
+ */
108
+ app.post('/sandbox/:id/exec', async (c) => {
109
+ try {
110
+ const id = c.req.param('id');
111
+ const sandbox = manager.getSandbox(id);
112
+ if (!sandbox) {
113
+ return c.json({ error: 'Sandbox not found' }, 404);
114
+ }
115
+ const body = await c.req.json();
116
+ const { command, timeout, cwd, env } = body;
117
+ if (!command) {
118
+ return c.json({ error: 'Command is required' }, 400);
119
+ }
120
+ const result = await sandbox.exec(command, { timeout, cwd, env });
121
+ return c.json(result);
122
+ }
123
+ catch (error) {
124
+ return c.json({ error: error.message }, 500);
125
+ }
126
+ });
127
+ /**
128
+ * Execute a command with streaming output
129
+ * GET /sandbox/:id/exec-stream?command=...
130
+ */
131
+ app.get('/sandbox/:id/exec-stream', (c) => {
132
+ const id = c.req.param('id');
133
+ const sandbox = manager.getSandbox(id);
134
+ if (!sandbox) {
135
+ return c.json({ error: 'Sandbox not found' }, 404);
136
+ }
137
+ const command = c.req.query('command');
138
+ if (!command) {
139
+ return c.json({ error: 'Command is required' }, 400);
140
+ }
141
+ const timeout = c.req.query('timeout');
142
+ const options = timeout ? { timeout: parseInt(timeout) } : {};
143
+ return stream(c, async (stream) => {
144
+ const execStream = StreamService.createExecStream(sandbox, command, options);
145
+ // Set SSE headers
146
+ c.header('Content-Type', 'text/event-stream');
147
+ c.header('Cache-Control', 'no-cache');
148
+ c.header('Connection', 'keep-alive');
149
+ // Pipe the readable stream to the response
150
+ for await (const chunk of execStream) {
151
+ await stream.write(chunk);
152
+ }
153
+ });
154
+ });
155
+ // ============================================================================
156
+ // Process Management Endpoints
157
+ // ============================================================================
158
+ /**
159
+ * Start a background process
160
+ * POST /sandbox/:id/process
161
+ */
162
+ app.post('/sandbox/:id/process', async (c) => {
163
+ try {
164
+ const id = c.req.param('id');
165
+ const sandbox = manager.getSandbox(id);
166
+ if (!sandbox) {
167
+ return c.json({ error: 'Sandbox not found' }, 404);
168
+ }
169
+ const body = await c.req.json();
170
+ const { command, cwd, env } = body;
171
+ if (!command) {
172
+ return c.json({ error: 'Command is required' }, 400);
173
+ }
174
+ const processInfo = await sandbox.startProcess(command, { cwd, env });
175
+ return c.json(processInfo, 201);
176
+ }
177
+ catch (error) {
178
+ return c.json({ error: error.message }, 500);
179
+ }
180
+ });
181
+ /**
182
+ * List all processes in a sandbox
183
+ * GET /sandbox/:id/process
184
+ */
185
+ app.get('/sandbox/:id/process', (c) => {
186
+ const id = c.req.param('id');
187
+ const sandbox = manager.getSandbox(id);
188
+ if (!sandbox) {
189
+ return c.json({ error: 'Sandbox not found' }, 404);
190
+ }
191
+ const processes = sandbox.listProcesses();
192
+ return c.json({ processes });
193
+ });
194
+ /**
195
+ * Get process info
196
+ * GET /sandbox/:id/process/:processId
197
+ */
198
+ app.get('/sandbox/:id/process/:processId', (c) => {
199
+ const id = c.req.param('id');
200
+ const processId = c.req.param('processId');
201
+ const sandbox = manager.getSandbox(id);
202
+ if (!sandbox) {
203
+ return c.json({ error: 'Sandbox not found' }, 404);
204
+ }
205
+ const process = sandbox.getProcess(processId);
206
+ if (!process) {
207
+ return c.json({ error: 'Process not found' }, 404);
208
+ }
209
+ return c.json(process);
210
+ });
211
+ /**
212
+ * Kill a process
213
+ * DELETE /sandbox/:id/process/:processId
214
+ */
215
+ app.delete('/sandbox/:id/process/:processId', async (c) => {
216
+ try {
217
+ const id = c.req.param('id');
218
+ const processId = c.req.param('processId');
219
+ const sandbox = manager.getSandbox(id);
220
+ if (!sandbox) {
221
+ return c.json({ error: 'Sandbox not found' }, 404);
222
+ }
223
+ const signal = c.req.query('signal') || 'SIGTERM';
224
+ await sandbox.killProcess(processId, signal);
225
+ return c.json({ success: true });
226
+ }
227
+ catch (error) {
228
+ return c.json({ error: error.message }, 404);
229
+ }
230
+ });
231
+ /**
232
+ * Stream process logs
233
+ * GET /sandbox/:id/process/:processId/logs
234
+ */
235
+ app.get('/sandbox/:id/process/:processId/logs', (c) => {
236
+ const id = c.req.param('id');
237
+ const processId = c.req.param('processId');
238
+ const sandbox = manager.getSandbox(id);
239
+ if (!sandbox) {
240
+ return c.json({ error: 'Sandbox not found' }, 404);
241
+ }
242
+ return stream(c, async (stream) => {
243
+ const logStream = StreamService.createProcessLogStream(sandbox, processId);
244
+ c.header('Content-Type', 'text/event-stream');
245
+ c.header('Cache-Control', 'no-cache');
246
+ c.header('Connection', 'keep-alive');
247
+ for await (const chunk of logStream) {
248
+ await stream.write(chunk);
249
+ }
250
+ });
251
+ });
252
+ // ============================================================================
253
+ // File Operations Endpoints
254
+ // ============================================================================
255
+ /**
256
+ * List files in a directory
257
+ * GET /sandbox/:id/files?path=...&recursive=true
258
+ */
259
+ app.get('/sandbox/:id/files', async (c) => {
260
+ try {
261
+ const id = c.req.param('id');
262
+ const sandbox = manager.getSandbox(id);
263
+ if (!sandbox) {
264
+ return c.json({ error: 'Sandbox not found' }, 404);
265
+ }
266
+ const fileService = new FileService(sandbox.workDir);
267
+ const dirPath = c.req.query('path') || '.';
268
+ const recursive = c.req.query('recursive') === 'true';
269
+ const pattern = c.req.query('pattern');
270
+ const includeHidden = c.req.query('hidden') === 'true';
271
+ const files = await fileService.listFiles(dirPath, {
272
+ recursive,
273
+ pattern,
274
+ includeHidden,
275
+ });
276
+ return c.json({ files });
277
+ }
278
+ catch (error) {
279
+ return c.json({ error: error.message }, 500);
280
+ }
281
+ });
282
+ /**
283
+ * Read a file
284
+ * GET /sandbox/:id/files/*
285
+ */
286
+ app.get('/sandbox/:id/files/*', async (c) => {
287
+ try {
288
+ const id = c.req.param('id');
289
+ const sandbox = manager.getSandbox(id);
290
+ if (!sandbox) {
291
+ return c.json({ error: 'Sandbox not found' }, 404);
292
+ }
293
+ // Get the file path from the wildcard
294
+ const fullPath = c.req.path;
295
+ const filePath = fullPath.replace(`/sandbox/${id}/files/`, '');
296
+ if (!filePath) {
297
+ return c.json({ error: 'File path is required' }, 400);
298
+ }
299
+ const fileService = new FileService(sandbox.workDir);
300
+ const raw = c.req.query('raw') === 'true';
301
+ if (raw) {
302
+ // Return raw file as stream
303
+ const stream = fileService.createReadStream(filePath);
304
+ return c.body(stream);
305
+ }
306
+ else {
307
+ // Return file content as JSON
308
+ const content = await fileService.readFile(filePath);
309
+ return c.json({ content });
310
+ }
311
+ }
312
+ catch (error) {
313
+ return c.json({ error: error.message }, 500);
314
+ }
315
+ });
316
+ /**
317
+ * Write a file
318
+ * POST /sandbox/:id/files/*
319
+ */
320
+ app.post('/sandbox/:id/files/*', async (c) => {
321
+ try {
322
+ const id = c.req.param('id');
323
+ const sandbox = manager.getSandbox(id);
324
+ if (!sandbox) {
325
+ return c.json({ error: 'Sandbox not found' }, 404);
326
+ }
327
+ const fullPath = c.req.path;
328
+ const filePath = fullPath.replace(`/sandbox/${id}/files/`, '');
329
+ if (!filePath) {
330
+ return c.json({ error: 'File path is required' }, 400);
331
+ }
332
+ const body = await c.req.json();
333
+ const { content } = body;
334
+ if (content === undefined) {
335
+ return c.json({ error: 'Content is required' }, 400);
336
+ }
337
+ const fileService = new FileService(sandbox.workDir);
338
+ await fileService.writeFile(filePath, content, { createDirs: true });
339
+ return c.json({ success: true, path: filePath });
340
+ }
341
+ catch (error) {
342
+ return c.json({ error: error.message }, 500);
343
+ }
344
+ });
345
+ /**
346
+ * Delete a file
347
+ * DELETE /sandbox/:id/files/*
348
+ */
349
+ app.delete('/sandbox/:id/files/*', async (c) => {
350
+ try {
351
+ const id = c.req.param('id');
352
+ const sandbox = manager.getSandbox(id);
353
+ if (!sandbox) {
354
+ return c.json({ error: 'Sandbox not found' }, 404);
355
+ }
356
+ const fullPath = c.req.path;
357
+ const filePath = fullPath.replace(`/sandbox/${id}/files/`, '');
358
+ if (!filePath) {
359
+ return c.json({ error: 'File path is required' }, 400);
360
+ }
361
+ const fileService = new FileService(sandbox.workDir);
362
+ const recursive = c.req.query('recursive') === 'true';
363
+ await fileService.deleteFile(filePath, { recursive });
364
+ return c.json({ success: true });
365
+ }
366
+ catch (error) {
367
+ return c.json({ error: error.message }, 500);
368
+ }
369
+ });
370
+ // ============================================================================
371
+ // Environment Variable Endpoints
372
+ // ============================================================================
373
+ /**
374
+ * Set environment variables
375
+ * POST /sandbox/:id/env
376
+ * Body: { variables: { KEY: "value", ... } }
377
+ */
378
+ app.post('/sandbox/:id/env', async (c) => {
379
+ try {
380
+ const id = c.req.param('id');
381
+ const sandbox = manager.getSandbox(id);
382
+ if (!sandbox) {
383
+ return c.json({ error: 'Sandbox not found' }, 404);
384
+ }
385
+ const body = await c.req.json();
386
+ const { variables } = body;
387
+ if (!variables || typeof variables !== 'object') {
388
+ return c.json({ error: 'Variables object is required' }, 400);
389
+ }
390
+ sandbox.setEnvBatch(variables);
391
+ return c.json({
392
+ success: true,
393
+ count: Object.keys(variables).length,
394
+ });
395
+ }
396
+ catch (error) {
397
+ return c.json({ error: error.message }, 500);
398
+ }
399
+ });
400
+ /**
401
+ * Get environment variable names (not values for security)
402
+ * GET /sandbox/:id/env
403
+ */
404
+ app.get('/sandbox/:id/env', (c) => {
405
+ const id = c.req.param('id');
406
+ const sandbox = manager.getSandbox(id);
407
+ if (!sandbox) {
408
+ return c.json({ error: 'Sandbox not found' }, 404);
409
+ }
410
+ const keys = sandbox.getEnvKeys();
411
+ return c.json({ variables: keys, count: keys.length });
412
+ });
413
+ /**
414
+ * Unset an environment variable
415
+ * DELETE /sandbox/:id/env/:key
416
+ */
417
+ app.delete('/sandbox/:id/env/:key', (c) => {
418
+ try {
419
+ const id = c.req.param('id');
420
+ const key = c.req.param('key');
421
+ const sandbox = manager.getSandbox(id);
422
+ if (!sandbox) {
423
+ return c.json({ error: 'Sandbox not found' }, 404);
424
+ }
425
+ const removed = sandbox.unsetEnv(key);
426
+ if (!removed) {
427
+ return c.json({ error: 'Environment variable not found' }, 404);
428
+ }
429
+ return c.json({ success: true, key });
430
+ }
431
+ catch (error) {
432
+ return c.json({ error: error.message }, 500);
433
+ }
434
+ });
435
+ // ============================================================================
436
+ // HTTP Exposure Endpoints
437
+ // ============================================================================
438
+ /**
439
+ * Expose a sandbox port via HTTP
440
+ * POST /sandbox/:id/expose
441
+ * Body: { port: 3000 }
442
+ */
443
+ app.post('/sandbox/:id/expose', async (c) => {
444
+ try {
445
+ const id = c.req.param('id');
446
+ const sandbox = manager.getSandbox(id);
447
+ if (!sandbox) {
448
+ return c.json({ error: 'Sandbox not found' }, 404);
449
+ }
450
+ const body = await c.req.json();
451
+ const { port } = body;
452
+ if (!port || typeof port !== 'number') {
453
+ return c.json({ error: 'Port number is required' }, 400);
454
+ }
455
+ const url = await httpExposure.expose(id, port);
456
+ return c.json({ url, port, sandboxId: id });
457
+ }
458
+ catch (error) {
459
+ return c.json({ error: error.message }, 500);
460
+ }
461
+ });
462
+ /**
463
+ * Get all exposed endpoints for a sandbox
464
+ * GET /sandbox/:id/expose
465
+ */
466
+ app.get('/sandbox/:id/expose', (c) => {
467
+ const id = c.req.param('id');
468
+ const sandbox = manager.getSandbox(id);
469
+ if (!sandbox) {
470
+ return c.json({ error: 'Sandbox not found' }, 404);
471
+ }
472
+ const exposures = httpExposure.getExposures(id);
473
+ return c.json({ exposures });
474
+ });
475
+ /**
476
+ * Remove HTTP exposure for a sandbox port
477
+ * DELETE /sandbox/:id/expose?port=3000
478
+ */
479
+ app.delete('/sandbox/:id/expose', async (c) => {
480
+ try {
481
+ const id = c.req.param('id');
482
+ const sandbox = manager.getSandbox(id);
483
+ if (!sandbox) {
484
+ return c.json({ error: 'Sandbox not found' }, 404);
485
+ }
486
+ const portStr = c.req.query('port');
487
+ const port = portStr ? parseInt(portStr) : undefined;
488
+ await httpExposure.unexpose(id, port);
489
+ return c.json({ success: true });
490
+ }
491
+ catch (error) {
492
+ return c.json({ error: error.message }, 500);
493
+ }
494
+ });
495
+ // Cleanup on process exit
496
+ process.on('SIGINT', async () => {
497
+ console.log('\nShutting down...');
498
+ console.log('Cleaning up sandboxes...');
499
+ await manager.shutdown({ cleanup: true });
500
+ console.log('✅ Shutdown complete');
501
+ process.exit(0);
502
+ });
503
+ process.on('SIGTERM', async () => {
504
+ console.log('\nShutting down...');
505
+ console.log('Cleaning up sandboxes...');
506
+ await manager.shutdown({ cleanup: true });
507
+ console.log('✅ Shutdown complete');
508
+ process.exit(0);
509
+ });
510
+ return { app, manager, httpExposure };
511
+ }
512
+ /**
513
+ * Start the sandbox server
514
+ */
515
+ export async function startServer(config = {}) {
516
+ const port = config.port || 3000;
517
+ const host = config.host || '0.0.0.0';
518
+ const { app, manager } = createServer(config);
519
+ console.log(`🌳 TreeSap Sandbox Server starting...`);
520
+ console.log(`📁 Base path: ${manager.getStats().basePath}`);
521
+ console.log(`🚀 Server listening on http://${host}:${port}`);
522
+ const server = serve({
523
+ fetch: app.fetch,
524
+ port,
525
+ hostname: host,
526
+ });
527
+ return { server, app, manager };
528
+ }
529
+ // Start server if this file is run directly
530
+ if (import.meta.url === `file://${process.argv[1]}`) {
531
+ startServer().catch((error) => {
532
+ console.error('Failed to start server:', error);
533
+ process.exit(1);
534
+ });
535
+ }
536
+ //# sourceMappingURL=api-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-server.js","sourceRoot":"","sources":["../src/api-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAwB9D;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAuB,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAExE,6BAA6B;IAC7B,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,IAAI,EAAE,CAAC;YACb,CAAC,CAAC,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAC7C,CAAC,CAAC,MAAM,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,CAAC;YAC5E,CAAC,CAAC,MAAM,CAAC,8BAA8B,EAAE,yBAAyB,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oCAAoC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC;YAChC,OAAO;YACP,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,oCAAoC;SAC1D,CAAC,CAAC,CAAC;IACN,CAAC;IAED,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,+BAA+B;IAC/B,+EAA+E;IAE/E;;;OAGG;IACH,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAElD,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC;YAElD,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,8BAA8B;IAC9B,+EAA+E;IAE/E;;;OAGG;IACH,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE;QACxC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9D,OAAO,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAChC,MAAM,UAAU,GAAG,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAE7E,kBAAkB;YAClB,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YAC9C,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAErC,2CAA2C;YAC3C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBACrC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,+BAA+B;IAC/B,+EAA+E;IAE/E;;;OAGG;IACH,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAEnC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,CAAC,CAAC,EAAE,EAAE;QAC/C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,MAAM,CAAC,iCAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;YAClD,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAE7C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,sCAAsC,EAAE,CAAC,CAAC,EAAE,EAAE;QACpD,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAChC,MAAM,SAAS,GAAG,aAAa,CAAC,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE3E,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YAC9C,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAErC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;gBACpC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,4BAA4B;IAC5B,+EAA+E;IAE/E;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC;YACtD,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;YAEvD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE;gBACjD,SAAS;gBACT,OAAO;gBACP,aAAa;aACd,CAAC,CAAC;YAEH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,sCAAsC;YACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAE/D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC;YAE1C,IAAI,GAAG,EAAE,CAAC;gBACR,4BAA4B;gBAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAa,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,8BAA8B;gBAC9B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACrD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAE/D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;YAEzB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YAErE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAE/D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC;YAEtD,MAAM,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAEtD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,iCAAiC;IACjC,+EAA+E;IAE/E;;;;OAIG;IACH,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;YAE3B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,GAAG,CAAC,CAAC;YAChE,CAAC;YAED,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAE/B,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;aACrC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;YAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,0BAA0B;IAC1B,+EAA+E;IAE/E;;;;OAIG;IACH,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;YAEtB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEhD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAErD,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEtC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAuB,EAAE;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;IAEtC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI;QACJ,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,4CAA4C;AAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Context, Next } from 'hono';
2
+ export interface AuthConfig {
3
+ /**
4
+ * List of valid API keys
5
+ */
6
+ apiKeys: string[];
7
+ /**
8
+ * Header name to check for API key (default: 'X-API-Key')
9
+ */
10
+ headerName?: string;
11
+ /**
12
+ * Paths to exclude from authentication (default: ['/'])
13
+ */
14
+ excludePaths?: string[];
15
+ }
16
+ /**
17
+ * Create authentication middleware for API key validation
18
+ */
19
+ export declare function createAuthMiddleware(config: AuthConfig): (c: Context, next: Next) => Promise<void | (Response & import("hono").TypedResponse<{
20
+ error: string;
21
+ message: string;
22
+ }, 401, "json">) | (Response & import("hono").TypedResponse<{
23
+ error: string;
24
+ message: string;
25
+ }, 403, "json">)>;
26
+ /**
27
+ * Parse API keys from environment variable
28
+ * Supports comma-separated list of keys
29
+ */
30
+ export declare function parseApiKeysFromEnv(envVar?: string): string[];
31
+ //# sourceMappingURL=auth-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../src/auth-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,IAIvC,GAAG,OAAO,EAAE,MAAM,IAAI;;;;;;kBA0BrC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAA2B,GAAG,MAAM,EAAE,CAMjF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Create authentication middleware for API key validation
3
+ */
4
+ export function createAuthMiddleware(config) {
5
+ const headerName = config.headerName || 'X-API-Key';
6
+ const excludePaths = config.excludePaths || ['/'];
7
+ return async (c, next) => {
8
+ // Skip auth for excluded paths (exact match)
9
+ if (excludePaths.includes(c.req.path)) {
10
+ return next();
11
+ }
12
+ // Get API key from header
13
+ const apiKey = c.req.header(headerName);
14
+ if (!apiKey) {
15
+ return c.json({ error: 'API key required', message: `Missing ${headerName} header` }, 401);
16
+ }
17
+ if (!config.apiKeys.includes(apiKey)) {
18
+ return c.json({ error: 'Invalid API key', message: 'The provided API key is not valid' }, 403);
19
+ }
20
+ // API key is valid, continue to the next middleware/handler
21
+ return next();
22
+ };
23
+ }
24
+ /**
25
+ * Parse API keys from environment variable
26
+ * Supports comma-separated list of keys
27
+ */
28
+ export function parseApiKeysFromEnv(envVar = 'SANDBOX_API_KEYS') {
29
+ const keysString = process.env[envVar] || '';
30
+ return keysString
31
+ .split(',')
32
+ .map((key) => key.trim())
33
+ .filter((key) => key.length > 0);
34
+ }
35
+ //# sourceMappingURL=auth-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../src/auth-middleware.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,CAAC;IAElD,OAAO,KAAK,EAAE,CAAU,EAAE,IAAU,EAAE,EAAE;QACtC,6CAA6C;QAC7C,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,UAAU,SAAS,EAAE,EACtE,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,mCAAmC,EAAE,EAC1E,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,4DAA4D;QAC5D,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,kBAAkB;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO,UAAU;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACrC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}