chowbea-axios 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 (58) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +162 -0
  3. package/bin/dev.js +13 -0
  4. package/bin/run.js +10 -0
  5. package/dist/commands/diff.d.ts +31 -0
  6. package/dist/commands/diff.d.ts.map +1 -0
  7. package/dist/commands/diff.js +215 -0
  8. package/dist/commands/diff.js.map +1 -0
  9. package/dist/commands/fetch.d.ts +28 -0
  10. package/dist/commands/fetch.d.ts.map +1 -0
  11. package/dist/commands/fetch.js +223 -0
  12. package/dist/commands/fetch.js.map +1 -0
  13. package/dist/commands/generate.d.ts +26 -0
  14. package/dist/commands/generate.d.ts.map +1 -0
  15. package/dist/commands/generate.js +187 -0
  16. package/dist/commands/generate.js.map +1 -0
  17. package/dist/commands/init.d.ts +92 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +738 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/status.d.ts +38 -0
  22. package/dist/commands/status.d.ts.map +1 -0
  23. package/dist/commands/status.js +233 -0
  24. package/dist/commands/status.js.map +1 -0
  25. package/dist/commands/validate.d.ts +27 -0
  26. package/dist/commands/validate.d.ts.map +1 -0
  27. package/dist/commands/validate.js +209 -0
  28. package/dist/commands/validate.js.map +1 -0
  29. package/dist/commands/watch.d.ts +34 -0
  30. package/dist/commands/watch.d.ts.map +1 -0
  31. package/dist/commands/watch.js +202 -0
  32. package/dist/commands/watch.js.map +1 -0
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +6 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/lib/config.d.ts +151 -0
  38. package/dist/lib/config.d.ts.map +1 -0
  39. package/dist/lib/config.js +336 -0
  40. package/dist/lib/config.js.map +1 -0
  41. package/dist/lib/errors.d.ts +77 -0
  42. package/dist/lib/errors.d.ts.map +1 -0
  43. package/dist/lib/errors.js +144 -0
  44. package/dist/lib/errors.js.map +1 -0
  45. package/dist/lib/fetcher.d.ts +115 -0
  46. package/dist/lib/fetcher.d.ts.map +1 -0
  47. package/dist/lib/fetcher.js +237 -0
  48. package/dist/lib/fetcher.js.map +1 -0
  49. package/dist/lib/generator.d.ts +96 -0
  50. package/dist/lib/generator.d.ts.map +1 -0
  51. package/dist/lib/generator.js +1575 -0
  52. package/dist/lib/generator.js.map +1 -0
  53. package/dist/lib/logger.d.ts +63 -0
  54. package/dist/lib/logger.d.ts.map +1 -0
  55. package/dist/lib/logger.js +183 -0
  56. package/dist/lib/logger.js.map +1 -0
  57. package/oclif.manifest.json +556 -0
  58. package/package.json +68 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * OpenAPI spec fetcher with retry logic and caching.
3
+ * Supports graceful fallback to cached spec on network failures.
4
+ */
5
+ import type { Logger } from "./logger.js";
6
+ /**
7
+ * Cache metadata stored in .api-cache.json
8
+ */
9
+ export interface CacheMetadata {
10
+ /** SHA256 hash of the OpenAPI spec content */
11
+ hash: string;
12
+ /** Timestamp when the spec was last fetched */
13
+ timestamp: number;
14
+ /** The endpoint URL used to fetch the spec */
15
+ endpoint: string;
16
+ }
17
+ /**
18
+ * Result of fetching the OpenAPI spec.
19
+ */
20
+ export interface FetchResult {
21
+ /** The raw spec content as a Buffer */
22
+ buffer: Buffer;
23
+ /** SHA256 hash of the content */
24
+ hash: string;
25
+ /** Whether the spec has changed since last fetch */
26
+ hasChanged: boolean;
27
+ /** Whether this was loaded from cache due to network failure */
28
+ fromCache: boolean;
29
+ }
30
+ /**
31
+ * Retry configuration for network operations.
32
+ */
33
+ export interface RetryConfig {
34
+ /** Maximum number of retry attempts (default: 3) */
35
+ maxAttempts: number;
36
+ /** Base delay between retries in ms (default: 1000) */
37
+ baseDelay: number;
38
+ /** Multiplier for exponential backoff (default: 2) */
39
+ backoffMultiplier: number;
40
+ }
41
+ /**
42
+ * Interpolates environment variables in a string.
43
+ * Replaces $VAR_NAME or ${VAR_NAME} with the environment variable value.
44
+ * Throws if a referenced env var is not set.
45
+ */
46
+ export declare function interpolateEnvVars(value: string): string;
47
+ /**
48
+ * Interpolates environment variables in all header values.
49
+ */
50
+ export declare function interpolateHeaders(headers: Record<string, string>): Record<string, string>;
51
+ /**
52
+ * Computes SHA256 hash of a buffer.
53
+ */
54
+ export declare function computeHash(buffer: Buffer): string;
55
+ /**
56
+ * Loads cache metadata from the cache file.
57
+ * Returns null if cache doesn't exist or is corrupted.
58
+ */
59
+ export declare function loadCacheMetadata(cachePath: string): Promise<CacheMetadata | null>;
60
+ /**
61
+ * Saves cache metadata to the cache file.
62
+ */
63
+ export declare function saveCacheMetadata(cachePath: string, metadata: CacheMetadata): Promise<void>;
64
+ /**
65
+ * Loads the cached OpenAPI spec from disk.
66
+ * Returns null if spec doesn't exist.
67
+ */
68
+ export declare function loadCachedSpec(specPath: string): Promise<Buffer | null>;
69
+ /**
70
+ * Fetches the OpenAPI spec from a remote endpoint with retry logic.
71
+ * Falls back to cached spec on network failure.
72
+ */
73
+ export declare function fetchOpenApiSpec(options: {
74
+ endpoint: string;
75
+ specPath: string;
76
+ cachePath: string;
77
+ logger: Logger;
78
+ force?: boolean;
79
+ retryConfig?: RetryConfig;
80
+ headers?: Record<string, string>;
81
+ }): Promise<FetchResult>;
82
+ /**
83
+ * Saves the fetched spec and updates cache metadata.
84
+ */
85
+ export declare function saveSpec(options: {
86
+ buffer: Buffer;
87
+ hash: string;
88
+ endpoint: string;
89
+ specPath: string;
90
+ cachePath: string;
91
+ }): Promise<void>;
92
+ /**
93
+ * Checks if the local spec exists and is valid.
94
+ */
95
+ export declare function hasLocalSpec(specPath: string): Promise<boolean>;
96
+ /**
97
+ * Loads and parses the local OpenAPI spec.
98
+ * Throws SpecNotFoundError if not found.
99
+ */
100
+ export declare function loadLocalSpec(specPath: string): Promise<{
101
+ spec: unknown;
102
+ buffer: Buffer;
103
+ }>;
104
+ /**
105
+ * Loads a spec from a local file and copies it to the cache location.
106
+ * Returns a FetchResult-like object for consistency with remote fetching.
107
+ */
108
+ export declare function loadLocalSpecFile(options: {
109
+ localPath: string;
110
+ specPath: string;
111
+ cachePath: string;
112
+ logger: Logger;
113
+ force?: boolean;
114
+ }): Promise<FetchResult>;
115
+ //# sourceMappingURL=fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/lib/fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * OpenAPI spec fetcher with retry logic and caching.
3
+ * Supports graceful fallback to cached spec on network failures.
4
+ */
5
+ import { createHash } from "node:crypto";
6
+ import { access, readFile, writeFile } from "node:fs/promises";
7
+ import { NetworkError, SpecNotFoundError } from "./errors.js";
8
+ const DEFAULT_RETRY_CONFIG = {
9
+ maxAttempts: 3,
10
+ baseDelay: 1000,
11
+ backoffMultiplier: 2,
12
+ };
13
+ /**
14
+ * Interpolates environment variables in a string.
15
+ * Replaces $VAR_NAME or ${VAR_NAME} with the environment variable value.
16
+ * Throws if a referenced env var is not set.
17
+ */
18
+ export function interpolateEnvVars(value) {
19
+ // Match $VAR_NAME or ${VAR_NAME}
20
+ return value.replace(/\$\{?([A-Z_][A-Z0-9_]*)\}?/gi, (_match, varName) => {
21
+ const envValue = process.env[varName];
22
+ if (envValue === undefined) {
23
+ throw new Error(`Environment variable ${varName} is not set (referenced in: ${value})`);
24
+ }
25
+ return envValue;
26
+ });
27
+ }
28
+ /**
29
+ * Interpolates environment variables in all header values.
30
+ */
31
+ export function interpolateHeaders(headers) {
32
+ const result = {};
33
+ for (const [key, value] of Object.entries(headers)) {
34
+ result[key] = interpolateEnvVars(value);
35
+ }
36
+ return result;
37
+ }
38
+ /**
39
+ * Computes SHA256 hash of a buffer.
40
+ */
41
+ export function computeHash(buffer) {
42
+ return createHash("sha256").update(buffer).digest("hex");
43
+ }
44
+ /**
45
+ * Delays execution for the specified milliseconds.
46
+ */
47
+ function delay(ms) {
48
+ return new Promise((resolve) => setTimeout(resolve, ms));
49
+ }
50
+ /**
51
+ * Loads cache metadata from the cache file.
52
+ * Returns null if cache doesn't exist or is corrupted.
53
+ */
54
+ export async function loadCacheMetadata(cachePath) {
55
+ try {
56
+ await access(cachePath);
57
+ const content = await readFile(cachePath, "utf8");
58
+ const parsed = JSON.parse(content);
59
+ // Validate cache structure
60
+ if (typeof parsed.hash === "string" &&
61
+ typeof parsed.timestamp === "number" &&
62
+ typeof parsed.endpoint === "string") {
63
+ return parsed;
64
+ }
65
+ return null;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Saves cache metadata to the cache file.
73
+ */
74
+ export async function saveCacheMetadata(cachePath, metadata) {
75
+ await writeFile(cachePath, JSON.stringify(metadata, null, 2), "utf8");
76
+ }
77
+ /**
78
+ * Loads the cached OpenAPI spec from disk.
79
+ * Returns null if spec doesn't exist.
80
+ */
81
+ export async function loadCachedSpec(specPath) {
82
+ try {
83
+ await access(specPath);
84
+ return await readFile(specPath);
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /**
91
+ * Fetches the OpenAPI spec from a remote endpoint with retry logic.
92
+ * Falls back to cached spec on network failure.
93
+ */
94
+ export async function fetchOpenApiSpec(options) {
95
+ const { endpoint, specPath, cachePath, logger, force = false } = options;
96
+ const retryConfig = options.retryConfig ?? DEFAULT_RETRY_CONFIG;
97
+ // Interpolate env vars in headers
98
+ const headers = {
99
+ Accept: "application/json",
100
+ };
101
+ if (options.headers) {
102
+ try {
103
+ const interpolated = interpolateHeaders(options.headers);
104
+ Object.assign(headers, interpolated);
105
+ }
106
+ catch (error) {
107
+ throw new Error(`Failed to interpolate headers: ${error instanceof Error ? error.message : String(error)}`);
108
+ }
109
+ }
110
+ // Load existing cache metadata
111
+ const existingCache = await loadCacheMetadata(cachePath);
112
+ // Attempt to fetch with retries
113
+ let lastError = null;
114
+ for (let attempt = 1; attempt <= retryConfig.maxAttempts; attempt++) {
115
+ try {
116
+ logger.debug({ attempt, endpoint }, "Fetching OpenAPI spec...");
117
+ const response = await fetch(endpoint, {
118
+ headers,
119
+ });
120
+ if (!response.ok) {
121
+ throw new NetworkError(endpoint, `HTTP ${response.status}: ${response.statusText}`, response.status);
122
+ }
123
+ const arrayBuffer = await response.arrayBuffer();
124
+ const buffer = Buffer.from(arrayBuffer);
125
+ const hash = computeHash(buffer);
126
+ // Check if content has changed
127
+ const hasChanged = force || !existingCache || existingCache.hash !== hash;
128
+ logger.debug({ hash, hasChanged, bytes: buffer.length }, "Spec fetched successfully");
129
+ return {
130
+ buffer,
131
+ hash,
132
+ hasChanged,
133
+ fromCache: false,
134
+ };
135
+ }
136
+ catch (error) {
137
+ lastError = error instanceof Error ? error : new Error(String(error));
138
+ if (attempt < retryConfig.maxAttempts) {
139
+ const delayMs = retryConfig.baseDelay *
140
+ retryConfig.backoffMultiplier ** (attempt - 1);
141
+ logger.warn({
142
+ attempt,
143
+ maxAttempts: retryConfig.maxAttempts,
144
+ delayMs,
145
+ error: lastError.message,
146
+ }, "Fetch failed, retrying...");
147
+ await delay(delayMs);
148
+ }
149
+ }
150
+ }
151
+ // All retries failed - try to fall back to cached spec
152
+ logger.warn({ attempts: retryConfig.maxAttempts, error: lastError?.message }, "All fetch attempts failed, checking for cached spec...");
153
+ const cachedSpec = await loadCachedSpec(specPath);
154
+ if (cachedSpec && existingCache) {
155
+ logger.info("Using cached OpenAPI spec due to network failure");
156
+ return {
157
+ buffer: cachedSpec,
158
+ hash: existingCache.hash,
159
+ hasChanged: false, // Don't regenerate if using cached
160
+ fromCache: true,
161
+ };
162
+ }
163
+ // No cache available - throw the network error
164
+ throw new NetworkError(endpoint, `Failed to fetch OpenAPI spec after ${retryConfig.maxAttempts} attempts: ${lastError?.message}`);
165
+ }
166
+ /**
167
+ * Saves the fetched spec and updates cache metadata.
168
+ */
169
+ export async function saveSpec(options) {
170
+ const { buffer, hash, endpoint, specPath, cachePath } = options;
171
+ // Write spec file
172
+ await writeFile(specPath, buffer);
173
+ // Update cache metadata
174
+ await saveCacheMetadata(cachePath, {
175
+ hash,
176
+ timestamp: Date.now(),
177
+ endpoint,
178
+ });
179
+ }
180
+ /**
181
+ * Checks if the local spec exists and is valid.
182
+ */
183
+ export async function hasLocalSpec(specPath) {
184
+ try {
185
+ await access(specPath);
186
+ const content = await readFile(specPath, "utf8");
187
+ JSON.parse(content); // Verify it's valid JSON
188
+ return true;
189
+ }
190
+ catch {
191
+ return false;
192
+ }
193
+ }
194
+ /**
195
+ * Loads and parses the local OpenAPI spec.
196
+ * Throws SpecNotFoundError if not found.
197
+ */
198
+ export async function loadLocalSpec(specPath) {
199
+ try {
200
+ await access(specPath);
201
+ }
202
+ catch {
203
+ throw new SpecNotFoundError(specPath);
204
+ }
205
+ const buffer = await readFile(specPath);
206
+ const content = buffer.toString("utf8");
207
+ try {
208
+ const spec = JSON.parse(content);
209
+ return { spec, buffer };
210
+ }
211
+ catch (error) {
212
+ throw new Error(`Failed to parse OpenAPI spec: ${error instanceof Error ? error.message : String(error)}`);
213
+ }
214
+ }
215
+ /**
216
+ * Loads a spec from a local file and copies it to the cache location.
217
+ * Returns a FetchResult-like object for consistency with remote fetching.
218
+ */
219
+ export async function loadLocalSpecFile(options) {
220
+ const { localPath, cachePath, logger, force = false } = options;
221
+ logger.info({ localPath }, "Loading local spec file...");
222
+ // Load existing cache metadata
223
+ const existingCache = await loadCacheMetadata(cachePath);
224
+ // Load and parse the local file
225
+ const { buffer } = await loadLocalSpec(localPath);
226
+ const hash = computeHash(buffer);
227
+ // Check if content has changed
228
+ const hasChanged = force || !existingCache || existingCache.hash !== hash;
229
+ logger.debug({ hash, hasChanged, bytes: buffer.length }, "Local spec loaded");
230
+ return {
231
+ buffer,
232
+ hash,
233
+ hasChanged,
234
+ fromCache: false,
235
+ };
236
+ }
237
+ //# sourceMappingURL=fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../src/lib/fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Core generation logic for TypeScript types and operations.
3
+ * Migrated from scripts/generate-operations.js with atomic writes and rollback.
4
+ */
5
+ import type { InstanceConfig, OutputPaths } from "./config.js";
6
+ import type { Logger } from "./logger.js";
7
+ /**
8
+ * Output paths for generated files.
9
+ * Re-export OutputPaths from config for backwards compatibility.
10
+ */
11
+ export type GeneratorPaths = OutputPaths;
12
+ /**
13
+ * Result of client files generation.
14
+ */
15
+ export interface ClientFilesResult {
16
+ /** Whether api.instance.ts was generated */
17
+ instance: boolean;
18
+ /** Whether api.error.ts was generated */
19
+ error: boolean;
20
+ /** Whether api.client.ts was generated */
21
+ client: boolean;
22
+ }
23
+ /**
24
+ * Result of the generation process.
25
+ */
26
+ export interface GenerationResult {
27
+ /** Number of operations generated */
28
+ operationCount: number;
29
+ /** Duration of generation in milliseconds */
30
+ durationMs: number;
31
+ /** Whether types were generated successfully */
32
+ typesGenerated: boolean;
33
+ /** Whether operations were generated successfully */
34
+ operationsGenerated: boolean;
35
+ /** Client files generated (if any) */
36
+ clientFiles?: ClientFilesResult;
37
+ }
38
+ /**
39
+ * Generates the api.helpers.ts file content.
40
+ * Contains all utility types for extracting request/response types from OpenAPI schema.
41
+ */
42
+ export declare function generateHelpersFileContent(): string;
43
+ /**
44
+ * Generates the api.instance.ts file content.
45
+ */
46
+ export declare function generateInstanceFileContent(config: InstanceConfig): string;
47
+ /**
48
+ * Generates the api.error.ts file content.
49
+ */
50
+ export declare function generateErrorFileContent(): string;
51
+ /**
52
+ * Generates the api.client.ts file content.
53
+ */
54
+ export declare function generateClientFileContent(): string;
55
+ /**
56
+ * Generates client files if they don't exist.
57
+ * Returns which files were generated.
58
+ */
59
+ export declare function generateClientFiles(options: {
60
+ paths: GeneratorPaths;
61
+ instanceConfig: InstanceConfig;
62
+ logger: Logger;
63
+ force?: boolean;
64
+ }): Promise<{
65
+ helpers: boolean;
66
+ instance: boolean;
67
+ error: boolean;
68
+ client: boolean;
69
+ }>;
70
+ /**
71
+ * Main generation function that produces types and operations.
72
+ * Includes atomic writes and rollback on failure.
73
+ */
74
+ /**
75
+ * Dry run result showing what would be written.
76
+ */
77
+ export interface DryRunResult {
78
+ /** Files that would be written */
79
+ files: Array<{
80
+ path: string;
81
+ lines: number;
82
+ action: "create" | "update";
83
+ }>;
84
+ /** Number of operations that would be generated */
85
+ operationCount: number;
86
+ }
87
+ export declare function generate(options: {
88
+ paths: GeneratorPaths;
89
+ logger: Logger;
90
+ dryRun?: boolean;
91
+ skipTypes?: boolean;
92
+ skipOperations?: boolean;
93
+ }): Promise<GenerationResult & {
94
+ dryRunResult?: DryRunResult;
95
+ }>;
96
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,4CAA4C;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,0CAA0C;IAC1C,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,cAAc,EAAE,OAAO,CAAC;IACxB,qDAAqD;IACrD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,sCAAsC;IACtC,WAAW,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAigBD;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAgSnD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAsD1E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA8QjD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAiXlD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAClD,KAAK,EAAE,cAAc,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CAChB,CAAC,CAoED;AAED;;;GAGG;AACH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,kCAAkC;IAClC,KAAK,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B,CAAC,CAAC;IACH,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IACvC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,gBAAgB,GAAG;IAAE,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CA+G9D"}