opentunnel-cli 1.0.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +284 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +1357 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/client/NgrokClient.d.ts +40 -0
  8. package/dist/client/NgrokClient.d.ts.map +1 -0
  9. package/dist/client/NgrokClient.js +155 -0
  10. package/dist/client/NgrokClient.js.map +1 -0
  11. package/dist/client/TunnelClient.d.ts +47 -0
  12. package/dist/client/TunnelClient.d.ts.map +1 -0
  13. package/dist/client/TunnelClient.js +435 -0
  14. package/dist/client/TunnelClient.js.map +1 -0
  15. package/dist/client/index.d.ts +3 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +8 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/dns/CloudflareDNS.d.ts +45 -0
  20. package/dist/dns/CloudflareDNS.d.ts.map +1 -0
  21. package/dist/dns/CloudflareDNS.js +286 -0
  22. package/dist/dns/CloudflareDNS.js.map +1 -0
  23. package/dist/dns/DuckDNS.d.ts +20 -0
  24. package/dist/dns/DuckDNS.d.ts.map +1 -0
  25. package/dist/dns/DuckDNS.js +109 -0
  26. package/dist/dns/DuckDNS.js.map +1 -0
  27. package/dist/dns/index.d.ts +3 -0
  28. package/dist/dns/index.d.ts.map +1 -0
  29. package/dist/dns/index.js +9 -0
  30. package/dist/dns/index.js.map +1 -0
  31. package/dist/index.d.ts +7 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +35 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/server/CertManager.d.ts +54 -0
  36. package/dist/server/CertManager.d.ts.map +1 -0
  37. package/dist/server/CertManager.js +414 -0
  38. package/dist/server/CertManager.js.map +1 -0
  39. package/dist/server/TunnelServer.d.ts +42 -0
  40. package/dist/server/TunnelServer.d.ts.map +1 -0
  41. package/dist/server/TunnelServer.js +790 -0
  42. package/dist/server/TunnelServer.js.map +1 -0
  43. package/dist/server/index.d.ts +3 -0
  44. package/dist/server/index.d.ts.map +1 -0
  45. package/dist/server/index.js +48 -0
  46. package/dist/server/index.js.map +1 -0
  47. package/dist/shared/types.d.ts +147 -0
  48. package/dist/shared/types.d.ts.map +1 -0
  49. package/dist/shared/types.js +3 -0
  50. package/dist/shared/types.js.map +1 -0
  51. package/dist/shared/utils.d.ts +29 -0
  52. package/dist/shared/utils.d.ts.map +1 -0
  53. package/dist/shared/utils.js +135 -0
  54. package/dist/shared/utils.js.map +1 -0
  55. package/package.json +66 -0
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.CertManager = void 0;
40
+ const acme = __importStar(require("acme-client"));
41
+ const crypto = __importStar(require("crypto"));
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const http = __importStar(require("http"));
45
+ const forge = __importStar(require("node-forge"));
46
+ const cloudflare_1 = __importDefault(require("cloudflare"));
47
+ const utils_1 = require("../shared/utils");
48
+ class CertManager {
49
+ constructor(options) {
50
+ this.accountKey = null;
51
+ this.client = null;
52
+ this.pendingChallenges = new Map();
53
+ this.pendingDnsChallenges = new Map();
54
+ this.cloudflare = null;
55
+ this.cloudflareZoneId = null;
56
+ this.certsDir = options.certsDir || path.join(process.cwd(), ".certs");
57
+ this.email = options.email || "admin@localhost";
58
+ this.isProduction = options.production ?? false;
59
+ this.logger = new utils_1.Logger("CertManager");
60
+ // Ensure certs directory exists
61
+ if (!fs.existsSync(this.certsDir)) {
62
+ fs.mkdirSync(this.certsDir, { recursive: true });
63
+ }
64
+ // Initialize Cloudflare if token provided
65
+ if (options.cloudflareToken) {
66
+ this.cloudflare = new cloudflare_1.default({
67
+ apiToken: options.cloudflareToken,
68
+ });
69
+ }
70
+ }
71
+ async initialize() {
72
+ // Load or create account key
73
+ const accountKeyPath = path.join(this.certsDir, "account.key");
74
+ if (fs.existsSync(accountKeyPath)) {
75
+ const keyPem = fs.readFileSync(accountKeyPath, "utf-8");
76
+ this.accountKey = crypto.createPrivateKey(keyPem);
77
+ this.logger.info("Loaded existing ACME account key");
78
+ }
79
+ else {
80
+ const { privateKey } = crypto.generateKeyPairSync("rsa", {
81
+ modulusLength: 4096,
82
+ });
83
+ this.accountKey = privateKey;
84
+ fs.writeFileSync(accountKeyPath, privateKey.export({ type: "pkcs8", format: "pem" }));
85
+ this.logger.info("Generated new ACME account key");
86
+ }
87
+ // Create ACME client
88
+ const directoryUrl = this.isProduction
89
+ ? acme.directory.letsencrypt.production
90
+ : acme.directory.letsencrypt.staging;
91
+ this.client = new acme.Client({
92
+ directoryUrl,
93
+ accountKey: this.accountKey.export({ type: "pkcs8", format: "pem" }),
94
+ });
95
+ this.logger.info(`ACME initialized (${this.isProduction ? "production" : "staging"})`);
96
+ }
97
+ async findCloudflareZone(domain) {
98
+ if (!this.cloudflare)
99
+ return null;
100
+ try {
101
+ // Extract root domain (e.g., "example.com" from "sub.example.com")
102
+ const parts = domain.split(".");
103
+ const rootDomain = parts.slice(-2).join(".");
104
+ const zones = await this.cloudflare.zones.list({ name: rootDomain });
105
+ if (zones.result && zones.result.length > 0) {
106
+ this.cloudflareZoneId = zones.result[0].id;
107
+ this.logger.info(`Found Cloudflare zone: ${rootDomain} (${this.cloudflareZoneId})`);
108
+ return this.cloudflareZoneId;
109
+ }
110
+ }
111
+ catch (err) {
112
+ this.logger.error(`Cloudflare zone lookup failed: ${err.message}`);
113
+ }
114
+ return null;
115
+ }
116
+ async getCertificate(domains) {
117
+ const primaryDomain = domains[0].replace("*.", "wildcard.");
118
+ const certPath = path.join(this.certsDir, `${primaryDomain}.crt`);
119
+ const keyPath = path.join(this.certsDir, `${primaryDomain}.key`);
120
+ const metaPath = path.join(this.certsDir, `${primaryDomain}.json`);
121
+ // Check if we have a valid cached certificate
122
+ if (fs.existsSync(certPath) && fs.existsSync(keyPath) && fs.existsSync(metaPath)) {
123
+ const meta = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
124
+ const expiresAt = new Date(meta.expiresAt);
125
+ // If certificate is still valid (with 7 day buffer), return it
126
+ const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;
127
+ if (expiresAt.getTime() - Date.now() > sevenDaysMs) {
128
+ this.logger.info(`Using cached certificate for ${domains[0]}`);
129
+ return {
130
+ cert: fs.readFileSync(certPath, "utf-8"),
131
+ key: fs.readFileSync(keyPath, "utf-8"),
132
+ expiresAt,
133
+ domains: meta.domains,
134
+ };
135
+ }
136
+ this.logger.info(`Certificate expiring soon, renewing...`);
137
+ }
138
+ return null;
139
+ }
140
+ async requestCertificate(domains) {
141
+ if (!this.client) {
142
+ throw new Error("CertManager not initialized");
143
+ }
144
+ const hasWildcard = domains.some(d => d.startsWith("*."));
145
+ const primaryDomain = domains[0].replace("*.", "wildcard.");
146
+ this.logger.info(`Requesting certificate for: ${domains.join(", ")}`);
147
+ // Create CSR
148
+ const [key, csr] = await acme.crypto.createCsr({
149
+ commonName: domains[0],
150
+ altNames: domains.length > 1 ? domains.slice(1) : undefined,
151
+ });
152
+ // Determine challenge type based on whether we have wildcard and Cloudflare
153
+ const usesDns01 = hasWildcard && this.cloudflare;
154
+ if (hasWildcard && !this.cloudflare) {
155
+ throw new Error("Wildcard certificates require DNS-01 challenge. " +
156
+ "Please provide --cloudflare-token or use non-wildcard domain.");
157
+ }
158
+ // Request certificate
159
+ const cert = await this.client.auto({
160
+ csr,
161
+ email: this.email,
162
+ termsOfServiceAgreed: true,
163
+ challengeCreateFn: async (authz, challenge, keyAuthorization) => {
164
+ if (challenge.type === "dns-01" && this.cloudflare) {
165
+ await this.createDnsChallenge(authz.identifier.value, keyAuthorization);
166
+ }
167
+ else if (challenge.type === "http-01") {
168
+ this.pendingChallenges.set(challenge.token, {
169
+ token: challenge.token,
170
+ keyAuthorization,
171
+ });
172
+ this.logger.info(`HTTP-01 challenge ready for ${authz.identifier.value}`);
173
+ }
174
+ },
175
+ challengeRemoveFn: async (authz, challenge) => {
176
+ if (challenge.type === "dns-01" && this.cloudflare) {
177
+ await this.removeDnsChallenge(authz.identifier.value);
178
+ }
179
+ else if (challenge.type === "http-01") {
180
+ this.pendingChallenges.delete(challenge.token);
181
+ }
182
+ },
183
+ challengePriority: usesDns01 ? ["dns-01"] : ["http-01"],
184
+ });
185
+ // Parse certificate to get expiry
186
+ const certInfo = await acme.crypto.readCertificateInfo(cert);
187
+ const expiresAt = certInfo.notAfter;
188
+ // Save certificate and key
189
+ const certPath = path.join(this.certsDir, `${primaryDomain}.crt`);
190
+ const keyPath = path.join(this.certsDir, `${primaryDomain}.key`);
191
+ const metaPath = path.join(this.certsDir, `${primaryDomain}.json`);
192
+ fs.writeFileSync(certPath, cert);
193
+ fs.writeFileSync(keyPath, key.toString());
194
+ fs.writeFileSync(metaPath, JSON.stringify({
195
+ domains,
196
+ expiresAt: expiresAt.toISOString(),
197
+ issuedAt: new Date().toISOString(),
198
+ }, null, 2));
199
+ this.logger.info(`Certificate saved, expires: ${expiresAt.toISOString()}`);
200
+ return {
201
+ cert,
202
+ key: key.toString(),
203
+ expiresAt,
204
+ domains,
205
+ };
206
+ }
207
+ async createDnsChallenge(domain, keyAuthorization) {
208
+ if (!this.cloudflare || !this.cloudflareZoneId) {
209
+ throw new Error("Cloudflare not configured");
210
+ }
211
+ // Create DNS TXT record for ACME challenge
212
+ const recordName = `_acme-challenge.${domain.replace("*.", "")}`;
213
+ const digestValue = crypto
214
+ .createHash("sha256")
215
+ .update(keyAuthorization)
216
+ .digest("base64url");
217
+ this.logger.info(`Creating DNS-01 challenge: ${recordName}`);
218
+ try {
219
+ const record = await this.cloudflare.dns.records.create({
220
+ zone_id: this.cloudflareZoneId,
221
+ type: "TXT",
222
+ name: recordName,
223
+ content: digestValue,
224
+ ttl: 120,
225
+ });
226
+ this.pendingDnsChallenges.set(domain, {
227
+ recordId: record.id,
228
+ zoneId: this.cloudflareZoneId,
229
+ });
230
+ // Wait for DNS propagation
231
+ this.logger.info("Waiting for DNS propagation (30s)...");
232
+ await new Promise(resolve => setTimeout(resolve, 30000));
233
+ }
234
+ catch (err) {
235
+ this.logger.error(`DNS challenge creation failed: ${err.message}`);
236
+ throw err;
237
+ }
238
+ }
239
+ async removeDnsChallenge(domain) {
240
+ const challenge = this.pendingDnsChallenges.get(domain);
241
+ if (!challenge || !this.cloudflare)
242
+ return;
243
+ try {
244
+ await this.cloudflare.dns.records.delete(challenge.recordId, {
245
+ zone_id: challenge.zoneId,
246
+ });
247
+ this.pendingDnsChallenges.delete(domain);
248
+ this.logger.info(`Removed DNS challenge for ${domain}`);
249
+ }
250
+ catch (err) {
251
+ this.logger.error(`DNS challenge removal failed: ${err.message}`);
252
+ }
253
+ }
254
+ // Handle HTTP-01 challenge requests
255
+ handleChallengeRequest(token) {
256
+ const challenge = this.pendingChallenges.get(token);
257
+ if (challenge) {
258
+ return challenge.keyAuthorization;
259
+ }
260
+ return null;
261
+ }
262
+ // Create HTTP server for ACME challenges (port 80)
263
+ createChallengeServer() {
264
+ const server = http.createServer((req, res) => {
265
+ const url = req.url || "";
266
+ // Handle ACME HTTP-01 challenge
267
+ if (url.startsWith("/.well-known/acme-challenge/")) {
268
+ const token = url.split("/").pop() || "";
269
+ const keyAuth = this.handleChallengeRequest(token);
270
+ if (keyAuth) {
271
+ this.logger.info(`Serving ACME challenge for token: ${token.substring(0, 10)}...`);
272
+ res.writeHead(200, { "Content-Type": "text/plain" });
273
+ res.end(keyAuth);
274
+ return;
275
+ }
276
+ }
277
+ // Redirect all other HTTP to HTTPS
278
+ const host = req.headers.host || "";
279
+ res.writeHead(301, { Location: `https://${host}${url}` });
280
+ res.end();
281
+ });
282
+ return server;
283
+ }
284
+ // Check if certificate exists
285
+ hasCertificate(domain) {
286
+ const safeDomain = domain.replace("*.", "wildcard.");
287
+ const certPath = path.join(this.certsDir, `${safeDomain}.crt`);
288
+ const keyPath = path.join(this.certsDir, `${safeDomain}.key`);
289
+ return fs.existsSync(certPath) && fs.existsSync(keyPath);
290
+ }
291
+ // Load certificate from disk
292
+ loadCertificate(domain) {
293
+ const safeDomain = domain.replace("*.", "wildcard.");
294
+ const certPath = path.join(this.certsDir, `${safeDomain}.crt`);
295
+ const keyPath = path.join(this.certsDir, `${safeDomain}.key`);
296
+ if (fs.existsSync(certPath) && fs.existsSync(keyPath)) {
297
+ return {
298
+ cert: fs.readFileSync(certPath, "utf-8"),
299
+ key: fs.readFileSync(keyPath, "utf-8"),
300
+ };
301
+ }
302
+ return null;
303
+ }
304
+ hasCloudflare() {
305
+ return this.cloudflare !== null;
306
+ }
307
+ /**
308
+ * Generate a self-signed certificate for local/development use.
309
+ * No external dependencies required.
310
+ */
311
+ generateSelfSignedCertificate(domain, options) {
312
+ const validDays = options?.validDays || 365;
313
+ const org = options?.organization || "OpenTunnel";
314
+ const safeDomain = domain.replace("*.", "wildcard.");
315
+ const certPath = path.join(this.certsDir, `${safeDomain}.crt`);
316
+ const keyPath = path.join(this.certsDir, `${safeDomain}.key`);
317
+ const metaPath = path.join(this.certsDir, `${safeDomain}.json`);
318
+ // Check if we already have a valid self-signed cert
319
+ if (fs.existsSync(certPath) && fs.existsSync(keyPath) && fs.existsSync(metaPath)) {
320
+ try {
321
+ const meta = JSON.parse(fs.readFileSync(metaPath, "utf-8"));
322
+ const expiresAt = new Date(meta.expiresAt);
323
+ // If still valid (with 7 day buffer), use it
324
+ const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;
325
+ if (expiresAt.getTime() - Date.now() > sevenDaysMs) {
326
+ this.logger.info(`Using existing self-signed certificate for ${domain}`);
327
+ return {
328
+ cert: fs.readFileSync(certPath, "utf-8"),
329
+ key: fs.readFileSync(keyPath, "utf-8"),
330
+ expiresAt,
331
+ domains: meta.domains,
332
+ };
333
+ }
334
+ }
335
+ catch {
336
+ // Regenerate if meta is corrupted
337
+ }
338
+ }
339
+ this.logger.info(`Generating self-signed certificate for ${domain}...`);
340
+ // Generate key pair using node-forge
341
+ const keys = forge.pki.rsa.generateKeyPair(2048);
342
+ // Create certificate
343
+ const cert = forge.pki.createCertificate();
344
+ cert.publicKey = keys.publicKey;
345
+ cert.serialNumber = Date.now().toString(16);
346
+ // Set validity
347
+ const now = new Date();
348
+ const expiresAt = new Date(now.getTime() + validDays * 24 * 60 * 60 * 1000);
349
+ cert.validity.notBefore = now;
350
+ cert.validity.notAfter = expiresAt;
351
+ // Set subject and issuer (self-signed, so they're the same)
352
+ const attrs = [
353
+ { name: "commonName", value: domain },
354
+ { name: "organizationName", value: org },
355
+ ];
356
+ cert.setSubject(attrs);
357
+ cert.setIssuer(attrs);
358
+ // Set extensions for proper SSL/TLS usage
359
+ cert.setExtensions([
360
+ {
361
+ name: "basicConstraints",
362
+ cA: false,
363
+ },
364
+ {
365
+ name: "keyUsage",
366
+ critical: true,
367
+ digitalSignature: true,
368
+ keyEncipherment: true,
369
+ },
370
+ {
371
+ name: "extKeyUsage",
372
+ serverAuth: true,
373
+ },
374
+ {
375
+ name: "subjectAltName",
376
+ altNames: [
377
+ { type: 2, value: domain }, // DNS
378
+ { type: 2, value: `*.${domain.replace("*.", "")}` }, // Wildcard DNS
379
+ ],
380
+ },
381
+ ]);
382
+ // Sign the certificate with SHA-256
383
+ cert.sign(keys.privateKey, forge.md.sha256.create());
384
+ // Convert to PEM format
385
+ const certPem = forge.pki.certificateToPem(cert);
386
+ const keyPem = forge.pki.privateKeyToPem(keys.privateKey);
387
+ // Save to files
388
+ fs.writeFileSync(certPath, certPem);
389
+ fs.writeFileSync(keyPath, keyPem);
390
+ // Save metadata
391
+ fs.writeFileSync(metaPath, JSON.stringify({
392
+ domains: [domain, `*.${domain.replace("*.", "")}`],
393
+ expiresAt: expiresAt.toISOString(),
394
+ issuedAt: now.toISOString(),
395
+ selfSigned: true,
396
+ }, null, 2));
397
+ this.logger.info(`Self-signed certificate generated, expires: ${expiresAt.toISOString()}`);
398
+ return {
399
+ cert: certPem,
400
+ key: keyPem,
401
+ expiresAt,
402
+ domains: [domain],
403
+ };
404
+ }
405
+ /**
406
+ * Get or generate a self-signed certificate for the given domain.
407
+ * This is the main entry point for automatic local HTTPS.
408
+ */
409
+ getOrCreateSelfSignedCert(domain) {
410
+ return this.generateSelfSignedCertificate(domain);
411
+ }
412
+ }
413
+ exports.CertManager = CertManager;
414
+ //# sourceMappingURL=CertManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertManager.js","sourceRoot":"","sources":["../../src/server/CertManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { EventEmitter } from "events";
2
+ import { ServerConfig } from "../shared/types";
3
+ export declare class TunnelServer extends EventEmitter {
4
+ private config;
5
+ private httpServer;
6
+ private httpRedirectServer;
7
+ private wss;
8
+ private clients;
9
+ private tunnelsBySubdomain;
10
+ private tunnelsByPort;
11
+ private usedPorts;
12
+ private pendingRequests;
13
+ private logger;
14
+ private keepaliveInterval;
15
+ private certManager;
16
+ private isHttps;
17
+ private dnsProvider;
18
+ constructor(config: Partial<ServerConfig>);
19
+ private setupHttps;
20
+ start(): Promise<void>;
21
+ private setupAutoDns;
22
+ private detectDnsProvider;
23
+ stop(): Promise<void>;
24
+ private startKeepalive;
25
+ private stopKeepalive;
26
+ private handleConnection;
27
+ private handleMessage;
28
+ private handleAuth;
29
+ private handleTunnelRequest;
30
+ private handleTunnelClose;
31
+ private closeTunnel;
32
+ private handleHttpRequest;
33
+ private waitForResponse;
34
+ private handleHttpResponse;
35
+ private handleTcpConnection;
36
+ private handleTcpData;
37
+ private handleApiRequest;
38
+ private send;
39
+ private getTunnelCount;
40
+ private getAllTunnels;
41
+ }
42
+ //# sourceMappingURL=TunnelServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TunnelServer.d.ts","sourceRoot":"","sources":["../../src/server/TunnelServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACH,YAAY,EAUf,MAAM,iBAAiB,CAAC;AA+CzB,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAwC;gBAE/C,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;YAmC3B,UAAU;IAsIlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAuCd,YAAY;IA0D1B,OAAO,CAAC,iBAAiB;IAuBzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BrB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gBAAgB;IA2DxB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,mBAAmB;IAuK3B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,WAAW;YAuCL,iBAAiB;IAqF/B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;CAkBxB"}