@happyvertical/email 0.79.0 → 0.80.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT.md +1 -1
- package/dist/chunks/base-sCad2IoJ.js +146 -0
- package/dist/chunks/base-sCad2IoJ.js.map +1 -0
- package/dist/cli/claude-context.js +17 -17
- package/dist/cli/claude-context.js.map +1 -1
- package/dist/index.js +1541 -2140
- package/dist/index.js.map +1 -1
- package/metadata.json +1 -1
- package/package.json +6 -6
package/AGENT.md
CHANGED
|
@@ -7,7 +7,7 @@ Low-level email protocol operations with adapter-based architecture
|
|
|
7
7
|
## Package Map
|
|
8
8
|
- Package: `@happyvertical/email`
|
|
9
9
|
- Hierarchy path: `@happyvertical/sdk > packages > email`
|
|
10
|
-
- Workspace position: `9 of
|
|
10
|
+
- Workspace position: `9 of 32` local packages
|
|
11
11
|
- Internal dependencies: `@happyvertical/logger`, `@happyvertical/utils`
|
|
12
12
|
- Internal dependents: `@happyvertical/messages`
|
|
13
13
|
- Knowledge graph files: `AGENT.md`, `metadata.json`, `ecosystem-manifest.json`
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { createLogger } from "@happyvertical/logger";
|
|
2
|
+
//#region src/shared/errors.ts
|
|
3
|
+
/**
|
|
4
|
+
* Error classes for @happyvertical/email package
|
|
5
|
+
*/
|
|
6
|
+
var EmailError = class extends Error {
|
|
7
|
+
code;
|
|
8
|
+
provider;
|
|
9
|
+
cause;
|
|
10
|
+
constructor(message, code, provider, cause) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "EmailError";
|
|
13
|
+
this.code = code;
|
|
14
|
+
this.provider = provider;
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var ConnectionError = class extends EmailError {
|
|
19
|
+
constructor(message, provider, cause) {
|
|
20
|
+
super(message, "CONNECTION_ERROR", provider, cause);
|
|
21
|
+
this.name = "ConnectionError";
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var TimeoutError = class extends EmailError {
|
|
25
|
+
constructor(message, provider, cause) {
|
|
26
|
+
super(message, "TIMEOUT_ERROR", provider, cause);
|
|
27
|
+
this.name = "TimeoutError";
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var AuthenticationError = class extends EmailError {
|
|
31
|
+
constructor(message, provider, cause) {
|
|
32
|
+
super(message, "AUTHENTICATION_ERROR", provider, cause);
|
|
33
|
+
this.name = "AuthenticationError";
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var AuthorizationError = class extends EmailError {
|
|
37
|
+
constructor(message, provider, cause) {
|
|
38
|
+
super(message, "AUTHORIZATION_ERROR", provider, cause);
|
|
39
|
+
this.name = "AuthorizationError";
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var MessageNotFoundError = class extends EmailError {
|
|
43
|
+
messageId;
|
|
44
|
+
constructor(messageId, provider) {
|
|
45
|
+
super(`Message not found: ${messageId}`, "MESSAGE_NOT_FOUND", provider);
|
|
46
|
+
this.name = "MessageNotFoundError";
|
|
47
|
+
this.messageId = messageId;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var InvalidMessageError = class extends EmailError {
|
|
51
|
+
constructor(message, provider, cause) {
|
|
52
|
+
super(message, "INVALID_MESSAGE", provider, cause);
|
|
53
|
+
this.name = "InvalidMessageError";
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
var FolderNotFoundError = class extends EmailError {
|
|
57
|
+
folder;
|
|
58
|
+
constructor(folder, provider) {
|
|
59
|
+
super(`Folder not found: ${folder}`, "FOLDER_NOT_FOUND", provider);
|
|
60
|
+
this.name = "FolderNotFoundError";
|
|
61
|
+
this.folder = folder;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var FolderExistsError = class extends EmailError {
|
|
65
|
+
folder;
|
|
66
|
+
constructor(folder, provider) {
|
|
67
|
+
super(`Folder already exists: ${folder}`, "FOLDER_EXISTS", provider);
|
|
68
|
+
this.name = "FolderExistsError";
|
|
69
|
+
this.folder = folder;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
var SendError = class extends EmailError {
|
|
73
|
+
accepted;
|
|
74
|
+
rejected;
|
|
75
|
+
constructor(message, accepted, rejected, provider, cause) {
|
|
76
|
+
super(message, "SEND_ERROR", provider, cause);
|
|
77
|
+
this.name = "SendError";
|
|
78
|
+
this.accepted = accepted;
|
|
79
|
+
this.rejected = rejected;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var AttachmentError = class extends EmailError {
|
|
83
|
+
filename;
|
|
84
|
+
constructor(message, filename, provider, cause) {
|
|
85
|
+
super(message, "ATTACHMENT_ERROR", provider, cause);
|
|
86
|
+
this.name = "AttachmentError";
|
|
87
|
+
this.filename = filename;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
//#endregion
|
|
91
|
+
//#region src/shared/base.ts
|
|
92
|
+
/**
|
|
93
|
+
* Base email client adapter class
|
|
94
|
+
*/
|
|
95
|
+
/**
|
|
96
|
+
* Base adapter class providing shared functionality
|
|
97
|
+
*
|
|
98
|
+
* All adapter implementations should extend this class.
|
|
99
|
+
* This is a protocol-only base class - no database persistence.
|
|
100
|
+
* For database sync and AI features, use @happyvertical/smrt-messages.
|
|
101
|
+
*/
|
|
102
|
+
var BaseEmailClient = class {
|
|
103
|
+
config;
|
|
104
|
+
logger;
|
|
105
|
+
connected = false;
|
|
106
|
+
constructor(config) {
|
|
107
|
+
this.config = this.validateConfig(config);
|
|
108
|
+
this.logger = config.logger || createLogger({ level: "info" });
|
|
109
|
+
}
|
|
110
|
+
isConnected() {
|
|
111
|
+
return this.connected;
|
|
112
|
+
}
|
|
113
|
+
validateConfig(config) {
|
|
114
|
+
if (!config.type) throw new EmailError("Email client type is required", "INVALID_CONFIG");
|
|
115
|
+
return config;
|
|
116
|
+
}
|
|
117
|
+
validateEmail(email) {
|
|
118
|
+
if (!email.address) throw new InvalidMessageError("Email address is required", this.getAdapter());
|
|
119
|
+
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.address)) throw new InvalidMessageError(`Invalid email address: ${email.address}`, this.getAdapter());
|
|
120
|
+
}
|
|
121
|
+
validateMessage(message) {
|
|
122
|
+
if (!message.from) throw new InvalidMessageError("Message must have a sender (from)", this.getAdapter());
|
|
123
|
+
this.validateEmail(message.from);
|
|
124
|
+
if (!message.to || message.to.length === 0) throw new InvalidMessageError("Message must have at least one recipient (to)", this.getAdapter());
|
|
125
|
+
for (const recipient of message.to) this.validateEmail(recipient);
|
|
126
|
+
if (message.cc) for (const recipient of message.cc) this.validateEmail(recipient);
|
|
127
|
+
if (message.bcc) for (const recipient of message.bcc) this.validateEmail(recipient);
|
|
128
|
+
if (!message.subject) throw new InvalidMessageError("Message must have a subject", this.getAdapter());
|
|
129
|
+
if (!message.text && !message.html) throw new InvalidMessageError("Message must have either text or HTML content", this.getAdapter());
|
|
130
|
+
}
|
|
131
|
+
mapError(error) {
|
|
132
|
+
if (error instanceof EmailError) return error;
|
|
133
|
+
if (error instanceof Error) return new EmailError(error.message, "UNKNOWN_ERROR", this.getAdapter(), error);
|
|
134
|
+
return new EmailError(String(error), "UNKNOWN_ERROR", this.getAdapter());
|
|
135
|
+
}
|
|
136
|
+
normalizeMessageIds(messageId) {
|
|
137
|
+
return Array.isArray(messageId) ? messageId : [messageId];
|
|
138
|
+
}
|
|
139
|
+
debug(message, data) {
|
|
140
|
+
if (this.config.debug) this.logger.debug(message, data);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
//#endregion
|
|
144
|
+
export { ConnectionError as a, FolderNotFoundError as c, SendError as d, TimeoutError as f, AuthorizationError as i, InvalidMessageError as l, AttachmentError as n, EmailError as o, AuthenticationError as r, FolderExistsError as s, BaseEmailClient as t, MessageNotFoundError as u };
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=base-sCad2IoJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-sCad2IoJ.js","names":[],"sources":["../../src/shared/errors.ts","../../src/shared/base.ts"],"sourcesContent":["/**\n * Error classes for @happyvertical/email package\n */\n\n// ============================================================================\n// Base Error\n// ============================================================================\n\nexport class EmailError extends Error {\n code: string;\n provider?: string;\n cause?: unknown;\n\n constructor(\n message: string,\n code: string,\n provider?: string,\n cause?: unknown,\n ) {\n super(message);\n this.name = 'EmailError';\n this.code = code;\n this.provider = provider;\n this.cause = cause;\n }\n}\n\n// ============================================================================\n// Connection Errors\n// ============================================================================\n\nexport class ConnectionError extends EmailError {\n constructor(message: string, provider?: string, cause?: unknown) {\n super(message, 'CONNECTION_ERROR', provider, cause);\n this.name = 'ConnectionError';\n }\n}\n\nexport class TimeoutError extends EmailError {\n constructor(message: string, provider?: string, cause?: unknown) {\n super(message, 'TIMEOUT_ERROR', provider, cause);\n this.name = 'TimeoutError';\n }\n}\n\n// ============================================================================\n// Authentication Errors\n// ============================================================================\n\nexport class AuthenticationError extends EmailError {\n constructor(message: string, provider?: string, cause?: unknown) {\n super(message, 'AUTHENTICATION_ERROR', provider, cause);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class AuthorizationError extends EmailError {\n constructor(message: string, provider?: string, cause?: unknown) {\n super(message, 'AUTHORIZATION_ERROR', provider, cause);\n this.name = 'AuthorizationError';\n }\n}\n\n// ============================================================================\n// Message Errors\n// ============================================================================\n\nexport class MessageNotFoundError extends EmailError {\n messageId: string;\n\n constructor(messageId: string, provider?: string) {\n super(`Message not found: ${messageId}`, 'MESSAGE_NOT_FOUND', provider);\n this.name = 'MessageNotFoundError';\n this.messageId = messageId;\n }\n}\n\nexport class InvalidMessageError extends EmailError {\n constructor(message: string, provider?: string, cause?: unknown) {\n super(message, 'INVALID_MESSAGE', provider, cause);\n this.name = 'InvalidMessageError';\n }\n}\n\n// ============================================================================\n// Folder Errors\n// ============================================================================\n\nexport class FolderNotFoundError extends EmailError {\n folder: string;\n\n constructor(folder: string, provider?: string) {\n super(`Folder not found: ${folder}`, 'FOLDER_NOT_FOUND', provider);\n this.name = 'FolderNotFoundError';\n this.folder = folder;\n }\n}\n\nexport class FolderExistsError extends EmailError {\n folder: string;\n\n constructor(folder: string, provider?: string) {\n super(`Folder already exists: ${folder}`, 'FOLDER_EXISTS', provider);\n this.name = 'FolderExistsError';\n this.folder = folder;\n }\n}\n\n// ============================================================================\n// Send Errors\n// ============================================================================\n\nexport class SendError extends EmailError {\n accepted: string[];\n rejected: string[];\n\n constructor(\n message: string,\n accepted: string[],\n rejected: string[],\n provider?: string,\n cause?: unknown,\n ) {\n super(message, 'SEND_ERROR', provider, cause);\n this.name = 'SendError';\n this.accepted = accepted;\n this.rejected = rejected;\n }\n}\n\n// ============================================================================\n// Attachment Errors\n// ============================================================================\n\nexport class AttachmentError extends EmailError {\n filename?: string;\n\n constructor(\n message: string,\n filename?: string,\n provider?: string,\n cause?: unknown,\n ) {\n super(message, 'ATTACHMENT_ERROR', provider, cause);\n this.name = 'AttachmentError';\n this.filename = filename;\n }\n}\n","/**\n * Base email client adapter class\n */\n\nimport { createLogger, type Logger } from '@happyvertical/logger';\nimport { EmailError, InvalidMessageError } from './errors';\nimport type {\n AdapterType,\n EmailAddress,\n EmailClient,\n EmailClientCapabilities,\n EmailClientConfig,\n EmailMessage,\n FetchOptions,\n Folder,\n FolderInfo,\n SearchCriteria,\n SendOptions,\n SendResult,\n} from './types';\n\n/**\n * Base adapter class providing shared functionality\n *\n * All adapter implementations should extend this class.\n * This is a protocol-only base class - no database persistence.\n * For database sync and AI features, use @happyvertical/smrt-messages.\n */\nexport abstract class BaseEmailClient implements EmailClient {\n protected config: EmailClientConfig;\n protected logger: Logger;\n protected connected = false;\n\n constructor(config: EmailClientConfig) {\n this.config = this.validateConfig(config);\n this.logger = config.logger || createLogger({ level: 'info' });\n }\n\n // ========================================================================\n // Abstract methods that adapters must implement\n // ========================================================================\n\n abstract send(\n message: EmailMessage,\n options?: SendOptions,\n ): Promise<SendResult>;\n\n abstract fetch(options?: FetchOptions): Promise<EmailMessage[]>;\n\n abstract getMessage(messageId: string): Promise<EmailMessage>;\n\n abstract listFolders(): Promise<Folder[]>;\n\n abstract selectFolder(name: string): Promise<FolderInfo>;\n\n abstract createFolder(name: string): Promise<void>;\n\n abstract deleteFolder(name: string): Promise<void>;\n\n abstract markRead(messageId: string | string[]): Promise<void>;\n\n abstract markUnread(messageId: string | string[]): Promise<void>;\n\n abstract move(messageId: string | string[], folder: string): Promise<void>;\n\n abstract copy(messageId: string | string[], folder: string): Promise<void>;\n\n abstract delete(messageId: string | string[]): Promise<void>;\n\n abstract search(criteria: SearchCriteria): Promise<EmailMessage[]>;\n\n abstract connect(): Promise<void>;\n\n abstract disconnect(): Promise<void>;\n\n abstract getCapabilities(): Promise<EmailClientCapabilities>;\n\n abstract getAdapter(): AdapterType;\n\n // ========================================================================\n // Connection management\n // ========================================================================\n\n isConnected(): boolean {\n return this.connected;\n }\n\n // ========================================================================\n // Validation helpers\n // ========================================================================\n\n protected validateConfig(config: EmailClientConfig): EmailClientConfig {\n if (!config.type) {\n throw new EmailError('Email client type is required', 'INVALID_CONFIG');\n }\n\n return config;\n }\n\n protected validateEmail(email: EmailAddress): void {\n if (!email.address) {\n throw new InvalidMessageError(\n 'Email address is required',\n this.getAdapter(),\n );\n }\n\n // Basic email format validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email.address)) {\n throw new InvalidMessageError(\n `Invalid email address: ${email.address}`,\n this.getAdapter(),\n );\n }\n }\n\n protected validateMessage(message: EmailMessage): void {\n // Validate sender\n if (!message.from) {\n throw new InvalidMessageError(\n 'Message must have a sender (from)',\n this.getAdapter(),\n );\n }\n this.validateEmail(message.from);\n\n // Validate recipients\n if (!message.to || message.to.length === 0) {\n throw new InvalidMessageError(\n 'Message must have at least one recipient (to)',\n this.getAdapter(),\n );\n }\n for (const recipient of message.to) {\n this.validateEmail(recipient);\n }\n\n // Validate CC recipients\n if (message.cc) {\n for (const recipient of message.cc) {\n this.validateEmail(recipient);\n }\n }\n\n // Validate BCC recipients\n if (message.bcc) {\n for (const recipient of message.bcc) {\n this.validateEmail(recipient);\n }\n }\n\n // Validate subject\n if (!message.subject) {\n throw new InvalidMessageError(\n 'Message must have a subject',\n this.getAdapter(),\n );\n }\n\n // Validate content\n if (!message.text && !message.html) {\n throw new InvalidMessageError(\n 'Message must have either text or HTML content',\n this.getAdapter(),\n );\n }\n }\n\n // ========================================================================\n // Error mapping\n // ========================================================================\n\n protected mapError(error: unknown): EmailError {\n if (error instanceof EmailError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new EmailError(\n error.message,\n 'UNKNOWN_ERROR',\n this.getAdapter(),\n error,\n );\n }\n\n return new EmailError(String(error), 'UNKNOWN_ERROR', this.getAdapter());\n }\n\n // ========================================================================\n // Utility methods\n // ========================================================================\n\n protected normalizeMessageIds(messageId: string | string[]): string[] {\n return Array.isArray(messageId) ? messageId : [messageId];\n }\n\n protected debug(message: string, data?: unknown): void {\n if (this.config.debug) {\n this.logger.debug(message, data as Record<string, unknown> | undefined);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { existsSync, mkdirSync
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync } from "node:fs";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
if (existsSync(metaSrc)) {
|
|
18
|
-
copyFileSync(metaSrc, join(targetDir, `have-${pkgName}.meta.json`));
|
|
19
|
-
}
|
|
5
|
+
//#region src/cli/claude-context.ts
|
|
6
|
+
/**
|
|
7
|
+
* CLI script to install agent context for @happyvertical/email
|
|
8
|
+
* Run the published context installer binary for this package.
|
|
9
|
+
*/
|
|
10
|
+
var pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
11
|
+
var targetDir = join(process.cwd(), ".claude");
|
|
12
|
+
if (!existsSync(targetDir)) mkdirSync(targetDir, { recursive: true });
|
|
13
|
+
var pkgName = "email";
|
|
14
|
+
var agentMdSrc = existsSync(join(pkgRoot, "AGENT.md")) ? join(pkgRoot, "AGENT.md") : join(pkgRoot, "CLAUDE.md");
|
|
15
|
+
var metaSrc = existsSync(join(pkgRoot, "metadata.json")) ? join(pkgRoot, "metadata.json") : join(pkgRoot, ".claude-meta.json");
|
|
16
|
+
if (existsSync(agentMdSrc)) copyFileSync(agentMdSrc, join(targetDir, `have-${pkgName}.md`));
|
|
17
|
+
if (existsSync(metaSrc)) copyFileSync(metaSrc, join(targetDir, `have-${pkgName}.meta.json`));
|
|
20
18
|
console.log(`✓ Installed @happyvertical/${pkgName} context to .claude/`);
|
|
21
|
-
//#
|
|
19
|
+
//#endregion
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=claude-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-context.js","sources":["../../src/cli/claude-context.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI script to install agent context for @happyvertical/email\n * Run the published context installer binary for this package.\n */\nimport { copyFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst Dirname = dirname(fileURLToPath(import.meta.url));\nconst pkgRoot = join(Dirname, '../..');\nconst targetDir = join(process.cwd(), '.claude');\n\nif (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n}\n\nconst pkgName = 'email';\nconst agentMdSrc = existsSync(join(pkgRoot, 'AGENT.md'))\n ? join(pkgRoot, 'AGENT.md')\n : join(pkgRoot, 'CLAUDE.md');\nconst metaSrc = existsSync(join(pkgRoot, 'metadata.json'))\n ? join(pkgRoot, 'metadata.json')\n : join(pkgRoot, '.claude-meta.json');\n\nif (existsSync(agentMdSrc)) {\n copyFileSync(agentMdSrc, join(targetDir, `have-${pkgName}.md`));\n}\n\nif (existsSync(metaSrc)) {\n copyFileSync(metaSrc, join(targetDir, `have-${pkgName}.meta.json`));\n}\n\nconsole.log(`✓ Installed @happyvertical/${pkgName} context to .claude/`);\n"],"
|
|
1
|
+
{"version":3,"file":"claude-context.js","names":[],"sources":["../../src/cli/claude-context.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI script to install agent context for @happyvertical/email\n * Run the published context installer binary for this package.\n */\nimport { copyFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst Dirname = dirname(fileURLToPath(import.meta.url));\nconst pkgRoot = join(Dirname, '../..');\nconst targetDir = join(process.cwd(), '.claude');\n\nif (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n}\n\nconst pkgName = 'email';\nconst agentMdSrc = existsSync(join(pkgRoot, 'AGENT.md'))\n ? join(pkgRoot, 'AGENT.md')\n : join(pkgRoot, 'CLAUDE.md');\nconst metaSrc = existsSync(join(pkgRoot, 'metadata.json'))\n ? join(pkgRoot, 'metadata.json')\n : join(pkgRoot, '.claude-meta.json');\n\nif (existsSync(agentMdSrc)) {\n copyFileSync(agentMdSrc, join(targetDir, `have-${pkgName}.md`));\n}\n\nif (existsSync(metaSrc)) {\n copyFileSync(metaSrc, join(targetDir, `have-${pkgName}.meta.json`));\n}\n\nconsole.log(`✓ Installed @happyvertical/${pkgName} context to .claude/`);\n"],"mappings":";;;;;;;;;AAUA,IAAM,UAAU,KADA,QAAQ,cAAc,OAAO,KAAK,GAAG,CAChC,GAAS,OAAO;AACrC,IAAM,YAAY,KAAK,QAAQ,IAAI,GAAG,SAAS;AAE/C,IAAI,CAAC,WAAW,SAAS,GACvB,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAG1C,IAAM,UAAU;AAChB,IAAM,aAAa,WAAW,KAAK,SAAS,UAAU,CAAC,IACnD,KAAK,SAAS,UAAU,IACxB,KAAK,SAAS,WAAW;AAC7B,IAAM,UAAU,WAAW,KAAK,SAAS,eAAe,CAAC,IACrD,KAAK,SAAS,eAAe,IAC7B,KAAK,SAAS,mBAAmB;AAErC,IAAI,WAAW,UAAU,GACvB,aAAa,YAAY,KAAK,WAAW,QAAQ,QAAQ,IAAI,CAAC;AAGhE,IAAI,WAAW,OAAO,GACpB,aAAa,SAAS,KAAK,WAAW,QAAQ,QAAQ,WAAW,CAAC;AAGpE,QAAQ,IAAI,8BAA8B,QAAQ,qBAAqB"}
|