apple-numbers-mcp 0.5.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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +709 -0
  3. package/build/index.d.ts +3 -0
  4. package/build/index.d.ts.map +1 -0
  5. package/build/index.js +483 -0
  6. package/build/index.js.map +1 -0
  7. package/build/services/fileConfig.d.ts +7 -0
  8. package/build/services/fileConfig.d.ts.map +1 -0
  9. package/build/services/fileConfig.js +52 -0
  10. package/build/services/fileConfig.js.map +1 -0
  11. package/build/services/numbersManager.d.ts +175 -0
  12. package/build/services/numbersManager.d.ts.map +1 -0
  13. package/build/services/numbersManager.js +357 -0
  14. package/build/services/numbersManager.js.map +1 -0
  15. package/build/tools/doctor.d.ts +22 -0
  16. package/build/tools/doctor.d.ts.map +1 -0
  17. package/build/tools/doctor.js +96 -0
  18. package/build/tools/doctor.js.map +1 -0
  19. package/build/tools/resourcesAndPrompts.d.ts +15 -0
  20. package/build/tools/resourcesAndPrompts.d.ts.map +1 -0
  21. package/build/tools/resourcesAndPrompts.js +77 -0
  22. package/build/tools/resourcesAndPrompts.js.map +1 -0
  23. package/build/tools/respond.d.ts +29 -0
  24. package/build/tools/respond.d.ts.map +1 -0
  25. package/build/tools/respond.js +44 -0
  26. package/build/tools/respond.js.map +1 -0
  27. package/build/types.d.ts +128 -0
  28. package/build/types.d.ts.map +1 -0
  29. package/build/types.js +2 -0
  30. package/build/types.js.map +1 -0
  31. package/build/utils/applescript.d.ts +90 -0
  32. package/build/utils/applescript.d.ts.map +1 -0
  33. package/build/utils/applescript.js +248 -0
  34. package/build/utils/applescript.js.map +1 -0
  35. package/build/utils/python.d.ts +12 -0
  36. package/build/utils/python.d.ts.map +1 -0
  37. package/build/utils/python.js +101 -0
  38. package/build/utils/python.js.map +1 -0
  39. package/package.json +91 -0
  40. package/requirements.txt +1 -0
  41. package/scripts/setup.sh +46 -0
  42. package/src/utils/numbers_reader.py +779 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/build/index.js ADDED
@@ -0,0 +1,483 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { readFileSync } from "node:fs";
6
+ import { fileURLToPath } from "node:url";
7
+ import { dirname, join } from "node:path";
8
+ import { NumbersManager } from "./services/numbersManager.js";
9
+ import { successResponse, withErrorHandling } from "./tools/respond.js";
10
+ import { runDoctor, formatDoctorReport } from "./tools/doctor.js";
11
+ import { registerResourcesAndPrompts } from "./tools/resourcesAndPrompts.js";
12
+ import { loadFileConfig } from "./services/fileConfig.js";
13
+ // Load file-based config FIRST — before anything reads APPLE_NUMBERS_MCP_* env
14
+ // vars — so settings survive a host that strips the MCP env block.
15
+ loadFileConfig();
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
19
+ const version = pkg.version;
20
+ const manager = new NumbersManager();
21
+ // --- Tool Definitions ---
22
+ const server = new McpServer({
23
+ name: "apple-numbers",
24
+ version,
25
+ description: "MCP server for reading and writing Apple Numbers (.numbers) spreadsheet files. " +
26
+ "Provides tools to inspect file structure, read table data, search cells, " +
27
+ "export to CSV/JSON/TSV, read individual cell values, create new spreadsheets, " +
28
+ "update cells, and append rows.",
29
+ });
30
+ // health-check
31
+ server.tool("health-check", "Check that Python 3 and numbers-parser are installed and available", {}, withErrorHandling(() => {
32
+ const result = manager.healthCheck();
33
+ return successResponse(result.ok ? `✓ ${result.message}` : `✗ ${result.message}`, {
34
+ ...result,
35
+ });
36
+ }, "health-check"));
37
+ // doctor
38
+ server.tool("doctor", "Run a full setup diagnostic: numbers-parser (read sidecar), Numbers.app (needed " +
39
+ "for writes), and Automation permission — each reported as ok/warn/fail with " +
40
+ "actionable advice. Use this when a tool returns a permission or setup error.", {}, withErrorHandling(() => {
41
+ const report = runDoctor(manager);
42
+ return successResponse(formatDoctorReport(report), { ...report });
43
+ }, "doctor"));
44
+ // get-file-info
45
+ server.tool("get-file-info", "Get the structure of a .numbers file: sheets, tables, dimensions, and header rows", {
46
+ path: z.string().describe("Absolute or ~-relative path to the .numbers file"),
47
+ }, withErrorHandling(({ path }) => {
48
+ const info = manager.getFileInfo(path);
49
+ const summary = info.sheets
50
+ .map((s) => {
51
+ const tables = s.tables
52
+ .map((t) => ` ${t.name} (${t.numRows}×${t.numCols}) headers: [${t.headerRow.join(", ")}]`)
53
+ .join("\n");
54
+ return ` Sheet: "${s.name}"\n${tables}`;
55
+ })
56
+ .join("\n");
57
+ return successResponse(`File: ${info.path}\nDefault sheet: "${info.defaultSheet}"\n\n${summary}`, { ...info });
58
+ }, "get-file-info"));
59
+ // read-table
60
+ server.tool("read-table", "Read data from a table in a .numbers file. Returns headers and rows. " +
61
+ "Supports optional row range and column filtering. " +
62
+ "Defaults to first sheet and first table if not specified.", {
63
+ path: z.string().describe("Path to the .numbers file"),
64
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
65
+ table: z.string().optional().describe("Table name (default: first table)"),
66
+ startRow: z
67
+ .number()
68
+ .int()
69
+ .min(0)
70
+ .optional()
71
+ .describe("Start row index, 0-based inclusive (default: 1, after header)"),
72
+ endRow: z
73
+ .number()
74
+ .int()
75
+ .min(0)
76
+ .optional()
77
+ .describe("End row index, 0-based inclusive (default: last row)"),
78
+ columns: z
79
+ .array(z.union([z.string(), z.number()]))
80
+ .optional()
81
+ .describe("Column filter: header names or 0-based indices"),
82
+ }, withErrorHandling(({ path, sheet, table, startRow, endRow, columns }) => {
83
+ const data = manager.readTable(path, sheet, table, { startRow, endRow, columns });
84
+ const headerLine = data.headers.join(" | ");
85
+ const separator = data.headers.map(() => "---").join(" | ");
86
+ const dataRows = data.rows
87
+ .map((row) => row.map((v) => (v === null ? "" : String(v))).join(" | "))
88
+ .join("\n");
89
+ return successResponse(`Sheet: "${data.sheetName}" | Table: "${data.tableName}" | ` +
90
+ `${data.numRows} rows × ${data.numCols} cols\n\n` +
91
+ `${headerLine}\n${separator}\n${dataRows}`, { ...data });
92
+ }, "read-table"));
93
+ // search
94
+ server.tool("search", "Search for a text value across all cells in a .numbers file. " +
95
+ "Case-insensitive partial match.", {
96
+ path: z.string().describe("Path to the .numbers file"),
97
+ query: z.string().describe("Text to search for (case-insensitive)"),
98
+ sheet: z.string().optional().describe("Limit search to this sheet"),
99
+ }, withErrorHandling(({ path, query, sheet }) => {
100
+ const { results, count } = manager.search(path, query, sheet);
101
+ if (count === 0) {
102
+ return successResponse(`No results found for "${query}"`, { results, count });
103
+ }
104
+ const lines = results.map((r) => `[${r.sheetName}/${r.tableName}] Row ${r.row}, Col "${r.header}": ${r.value}`);
105
+ return successResponse(`Found ${count} match(es) for "${query}":\n\n${lines.join("\n")}`, {
106
+ results,
107
+ count,
108
+ });
109
+ }, "search"));
110
+ // export-table
111
+ server.tool("export-table", "Export a table from a .numbers file to CSV, TSV, or JSON format.", {
112
+ path: z.string().describe("Path to the .numbers file"),
113
+ format: z.enum(["csv", "tsv", "json"]).describe("Output format"),
114
+ outputPath: z.string().describe("Path for the output file"),
115
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
116
+ table: z.string().optional().describe("Table name (default: first table)"),
117
+ }, withErrorHandling(({ path, format, outputPath, sheet, table }) => {
118
+ const result = manager.exportTable(path, format, outputPath, sheet, table);
119
+ return successResponse(`Exported ${result.rowCount} rows from "${result.sheetName}/${result.tableName}" ` +
120
+ `to ${result.format.toUpperCase()}: ${result.outputPath}`, { ...result });
121
+ }, "export-table"));
122
+ // get-cell
123
+ server.tool("get-cell", "Read a single cell value by row and column index (0-based). " +
124
+ "Set verbose=true to include formula, formatted value, and merge info.", {
125
+ path: z.string().describe("Path to the .numbers file"),
126
+ sheet: z.string().describe("Sheet name"),
127
+ table: z.string().describe("Table name"),
128
+ row: z.number().int().min(0).describe("Row index (0-based)"),
129
+ col: z.number().int().min(0).describe("Column index (0-based)"),
130
+ verbose: z.boolean().optional().describe("Include formula/metadata (default: false)"),
131
+ }, withErrorHandling(({ path, sheet, table, row, col, verbose }) => {
132
+ const cell = manager.getCell(path, sheet, table, row, col, verbose);
133
+ let text = `Cell (${cell.row}, ${cell.col}): ${cell.value} [type: ${cell.type}]`;
134
+ if (verbose) {
135
+ if (cell.formula)
136
+ text += `\nFormula: ${cell.formula}`;
137
+ if (cell.formattedValue)
138
+ text += `\nFormatted: ${cell.formattedValue}`;
139
+ if (cell.isMerged)
140
+ text += `\nMerged: yes`;
141
+ }
142
+ return successResponse(text, { ...cell });
143
+ }, "get-cell"));
144
+ // create-spreadsheet
145
+ server.tool("create-spreadsheet", "Create a new .numbers file with a single sheet and table. " +
146
+ "Provide headers and optionally initial data rows.", {
147
+ path: z.string().describe("Path for the new .numbers file"),
148
+ headers: z.array(z.string()).min(1).describe("Column header names"),
149
+ rows: z
150
+ .array(z.array(z.union([z.string(), z.number(), z.boolean(), z.null()])))
151
+ .optional()
152
+ .describe("Optional data rows (array of arrays)"),
153
+ sheetName: z.string().optional().describe("Sheet name (default: 'Sheet 1')"),
154
+ tableName: z.string().optional().describe("Table name (default: 'Table 1')"),
155
+ }, withErrorHandling(({ path, headers, rows, sheetName, tableName }) => {
156
+ const result = manager.createSpreadsheet(path, headers, { sheetName, tableName, rows });
157
+ return successResponse(`Created ${result.path}\n` +
158
+ `Sheet: "${result.sheetName}" | Table: "${result.tableName}"\n` +
159
+ `${result.numHeaders} columns, ${result.numRows} data rows`, { ...result });
160
+ }, "create-spreadsheet"));
161
+ // set-cell
162
+ server.tool("set-cell", "Write a value to a single cell in an existing .numbers file. " +
163
+ "Row and column are 0-based indices.", {
164
+ path: z.string().describe("Path to the .numbers file"),
165
+ row: z.number().int().min(0).describe("Row index (0-based)"),
166
+ col: z.number().int().min(0).describe("Column index (0-based)"),
167
+ value: z.union([z.string(), z.number(), z.boolean(), z.null()]).describe("Value to write"),
168
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
169
+ table: z.string().optional().describe("Table name (default: first table)"),
170
+ type: z
171
+ .enum(["string", "number", "boolean", "date"])
172
+ .optional()
173
+ .describe("Force value type (default: auto-detect)"),
174
+ }, withErrorHandling(({ path, row, col, value, sheet, table, type }) => {
175
+ const result = manager.setCell(path, row, col, value, { sheet, table, type });
176
+ return successResponse(`Set cell (${result.row}, ${result.col}) = ${result.value} ` +
177
+ `in "${result.sheetName}/${result.tableName}"`, { ...result });
178
+ }, "set-cell"));
179
+ // set-cells-batch
180
+ server.tool("set-cells-batch", "Write values to multiple cells in a single operation. " +
181
+ "More efficient than multiple set-cell calls for bulk updates.", {
182
+ path: z.string().describe("Path to the .numbers file"),
183
+ updates: z
184
+ .array(z.object({
185
+ row: z.number().int().min(0).describe("Row index (0-based)"),
186
+ col: z.number().int().min(0).describe("Column index (0-based)"),
187
+ value: z
188
+ .union([z.string(), z.number(), z.boolean(), z.null()])
189
+ .describe("Value to write"),
190
+ type: z
191
+ .enum(["string", "number", "boolean", "date"])
192
+ .optional()
193
+ .describe("Force value type"),
194
+ }))
195
+ .min(1)
196
+ .describe("Array of cell updates"),
197
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
198
+ table: z.string().optional().describe("Table name (default: first table)"),
199
+ }, withErrorHandling(({ path, updates, sheet, table }) => {
200
+ const result = manager.setCellsBatch(path, updates, { sheet, table });
201
+ return successResponse(`Updated ${result.cellsWritten} cells in "${result.sheetName}/${result.tableName}"`, { ...result });
202
+ }, "set-cells-batch"));
203
+ // add-rows
204
+ server.tool("add-rows", "Append rows of data to an existing table in a .numbers file. " +
205
+ "New rows are added after the last existing row.", {
206
+ path: z.string().describe("Path to the .numbers file"),
207
+ rows: z
208
+ .array(z.array(z.union([z.string(), z.number(), z.boolean(), z.null()])))
209
+ .min(1)
210
+ .describe("Rows to append (array of arrays, one per row)"),
211
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
212
+ table: z.string().optional().describe("Table name (default: first table)"),
213
+ }, withErrorHandling(({ path, rows, sheet, table }) => {
214
+ const result = manager.addRows(path, rows, { sheet, table });
215
+ return successResponse(`Added ${result.rowsAdded} rows to "${result.sheetName}/${result.tableName}" ` +
216
+ `(starting at row ${result.startRow}, new total: ${result.newTotalRows})`, { ...result });
217
+ }, "add-rows"));
218
+ // delete-rows
219
+ server.tool("delete-rows", "Delete a range of rows from a table in a .numbers file. " +
220
+ "Both start and end are 0-based inclusive indices.", {
221
+ path: z.string().describe("Path to the .numbers file"),
222
+ startRow: z.number().int().min(0).describe("First row to delete (0-based, inclusive)"),
223
+ endRow: z.number().int().min(0).describe("Last row to delete (0-based, inclusive)"),
224
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
225
+ table: z.string().optional().describe("Table name (default: first table)"),
226
+ }, withErrorHandling(({ path, startRow, endRow, sheet, table }) => {
227
+ const result = manager.deleteRows(path, startRow, endRow, { sheet, table });
228
+ return successResponse(`Deleted ${result.rowsDeleted} rows from "${result.sheetName}/${result.tableName}" ` +
229
+ `(new total: ${result.newTotalRows})`, { ...result });
230
+ }, "delete-rows"));
231
+ // add-sheet
232
+ server.tool("add-sheet", "Add a new sheet to an existing .numbers file. " +
233
+ "Optionally provide headers for the default table.", {
234
+ path: z.string().describe("Path to the .numbers file"),
235
+ sheetName: z.string().describe("Name for the new sheet"),
236
+ tableName: z.string().optional().describe("Name for the default table"),
237
+ headers: z.array(z.string()).optional().describe("Column headers for the default table"),
238
+ }, withErrorHandling(({ path, sheetName, tableName, headers }) => {
239
+ const result = manager.addSheet(path, sheetName, { tableName, headers });
240
+ return successResponse(`Added sheet "${result.sheetName}" with table "${result.tableName}" ` +
241
+ `(${result.numRows}×${result.numCols})`, { ...result });
242
+ }, "add-sheet"));
243
+ // add-table
244
+ server.tool("add-table", "Add a new table to an existing sheet in a .numbers file.", {
245
+ path: z.string().describe("Path to the .numbers file"),
246
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
247
+ tableName: z.string().optional().describe("Name for the new table"),
248
+ headers: z.array(z.string()).optional().describe("Column headers for the new table"),
249
+ }, withErrorHandling(({ path, sheet, tableName, headers }) => {
250
+ const result = manager.addTable(path, { sheet, tableName, headers });
251
+ return successResponse(`Added table "${result.tableName}" to sheet "${result.sheetName}" ` +
252
+ `(${result.numRows}×${result.numCols})`, { ...result });
253
+ }, "add-table"));
254
+ // import-csv
255
+ server.tool("import-csv", "Import a CSV, TSV, or JSON file into a new .numbers spreadsheet. " +
256
+ "Auto-detects format from file extension, or specify explicitly.", {
257
+ inputPath: z.string().describe("Path to the CSV/TSV/JSON input file"),
258
+ outputPath: z.string().describe("Path for the output .numbers file"),
259
+ format: z
260
+ .enum(["auto", "csv", "tsv", "json"])
261
+ .optional()
262
+ .describe("Input format (default: auto-detect from extension)"),
263
+ sheetName: z.string().optional().describe("Sheet name (default: 'Sheet 1')"),
264
+ tableName: z.string().optional().describe("Table name (default: 'Table 1')"),
265
+ }, withErrorHandling(({ inputPath, outputPath, format, sheetName, tableName }) => {
266
+ const result = manager.importFile(inputPath, outputPath, { format, sheetName, tableName });
267
+ return successResponse(`Imported ${result.numRows} rows (${result.numHeaders} columns) from ${result.format.toUpperCase()}\n` +
268
+ `Input: ${result.inputPath}\nOutput: ${result.path}\n` +
269
+ `Sheet: "${result.sheetName}" | Table: "${result.tableName}"`, { ...result });
270
+ }, "import-csv"));
271
+ // update-rows
272
+ server.tool("update-rows", "Write full rows by index in an existing .numbers file. " +
273
+ "Each update specifies a row index and a complete array of column values.", {
274
+ path: z.string().describe("Path to the .numbers file"),
275
+ updates: z
276
+ .array(z.object({
277
+ row: z.number().int().min(0).describe("Row index (0-based)"),
278
+ values: z
279
+ .array(z.union([z.string(), z.number(), z.boolean(), z.null()]))
280
+ .describe("Column values for the entire row"),
281
+ }))
282
+ .min(1)
283
+ .describe("Array of row updates"),
284
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
285
+ table: z.string().optional().describe("Table name (default: first table)"),
286
+ }, withErrorHandling(({ path, updates, sheet, table }) => {
287
+ const result = manager.updateRows(path, updates, { sheet, table });
288
+ return successResponse(`Updated ${result.rowsUpdated} rows in "${result.sheetName}/${result.tableName}"`, { ...result });
289
+ }, "update-rows"));
290
+ // rename-sheet
291
+ server.tool("rename-sheet", "Rename a sheet in a .numbers file.", {
292
+ path: z.string().describe("Path to the .numbers file"),
293
+ newName: z.string().describe("New name for the sheet"),
294
+ sheet: z.string().optional().describe("Current sheet name (default: first sheet)"),
295
+ }, withErrorHandling(({ path, newName, sheet }) => {
296
+ const result = manager.renameSheet(path, newName, sheet);
297
+ return successResponse(`Renamed sheet "${result.oldName}" → "${result.newName}"`, {
298
+ ...result,
299
+ });
300
+ }, "rename-sheet"));
301
+ // rename-table
302
+ server.tool("rename-table", "Rename a table in a .numbers file.", {
303
+ path: z.string().describe("Path to the .numbers file"),
304
+ newName: z.string().describe("New name for the table"),
305
+ sheet: z.string().optional().describe("Sheet name (default: first sheet)"),
306
+ table: z.string().optional().describe("Current table name (default: first table)"),
307
+ }, withErrorHandling(({ path, newName, sheet, table }) => {
308
+ const result = manager.renameTable(path, newName, { sheet, table });
309
+ return successResponse(`Renamed table "${result.oldName}" → "${result.newName}" in sheet "${result.sheetName}"`, { ...result });
310
+ }, "rename-table"));
311
+ // set-formula
312
+ server.tool("set-formula", "Set a formula on a cell in a .numbers file using AppleScript. " +
313
+ "Requires Numbers.app to be running. The file will be opened if not already open, " +
314
+ "and saved after the formula is set. Row and column are 0-based indices.", {
315
+ path: z.string().describe("Path to the .numbers file"),
316
+ sheet: z.string().describe("Sheet name"),
317
+ table: z.string().describe("Table name"),
318
+ row: z.number().int().min(0).describe("Row index (0-based)"),
319
+ col: z.number().int().min(0).describe("Column index (0-based)"),
320
+ formula: z.string().describe('Formula string (e.g., "=SUM(A2:A10)")'),
321
+ }, withErrorHandling(({ path, sheet, table, row, col, formula }) => {
322
+ const result = manager.setCellFormula(path, sheet, table, row, col, formula);
323
+ return successResponse(`Set formula on ${result.cell} in "${result.sheetName}/${result.tableName}"\n` +
324
+ `Formula: ${result.formula}\nComputed value: ${result.computedValue}`, { ...result });
325
+ }, "set-formula"));
326
+ // set-formulas-batch
327
+ server.tool("set-formulas-batch", "Set formulas on multiple cells in a single operation using AppleScript. " +
328
+ "Requires Numbers.app to be running. More efficient than multiple set-formula calls.", {
329
+ path: z.string().describe("Path to the .numbers file"),
330
+ sheet: z.string().describe("Sheet name"),
331
+ table: z.string().describe("Table name"),
332
+ formulas: z
333
+ .array(z.object({
334
+ row: z.number().int().min(0).describe("Row index (0-based)"),
335
+ col: z.number().int().min(0).describe("Column index (0-based)"),
336
+ formula: z.string().describe("Formula string"),
337
+ }))
338
+ .min(1)
339
+ .describe("Array of formula assignments"),
340
+ }, withErrorHandling(({ path, sheet, table, formulas }) => {
341
+ const result = manager.setCellFormulasBatch(path, sheet, table, formulas);
342
+ return successResponse(`Set ${result.cellsSet} formulas in "${result.sheetName}/${result.tableName}"`, { ...result });
343
+ }, "set-formulas-batch"));
344
+ // --- Formatting tools (AppleScript, requires Numbers.app) ---
345
+ const colorSchema = z.object({
346
+ red: z.number().int().min(0).max(65535).describe("Red component (0-65535)"),
347
+ green: z.number().int().min(0).max(65535).describe("Green component (0-65535)"),
348
+ blue: z.number().int().min(0).max(65535).describe("Blue component (0-65535)"),
349
+ });
350
+ const cellStyleSchema = z.object({
351
+ fontName: z.string().optional().describe('Font name (e.g., "Helvetica-Bold", "HelveticaNeue")'),
352
+ fontSize: z.number().optional().describe("Font size in points"),
353
+ textColor: colorSchema.optional().describe("Text color (RGB, 0-65535 per channel)"),
354
+ backgroundColor: colorSchema.optional().describe("Background color (RGB, 0-65535 per channel)"),
355
+ format: z
356
+ .enum([
357
+ "automatic",
358
+ "number",
359
+ "currency",
360
+ "date and time",
361
+ "duration",
362
+ "fraction",
363
+ "scientific",
364
+ "numeral system",
365
+ "checkbox",
366
+ "star rating",
367
+ "text",
368
+ ])
369
+ .optional()
370
+ .describe("Cell number format"),
371
+ alignment: z
372
+ .enum(["auto align", "left", "center", "right", "justify"])
373
+ .optional()
374
+ .describe("Horizontal alignment"),
375
+ verticalAlignment: z.enum(["top", "center", "bottom"]).optional().describe("Vertical alignment"),
376
+ textWrap: z.boolean().optional().describe("Enable text wrapping"),
377
+ });
378
+ // set-cell-style
379
+ server.tool("set-cell-style", "Set formatting on a cell: font, color, alignment, number format, etc. " +
380
+ "Requires Numbers.app to be running.", {
381
+ path: z.string().describe("Path to the .numbers file"),
382
+ sheet: z.string().describe("Sheet name"),
383
+ table: z.string().describe("Table name"),
384
+ row: z.number().int().min(0).describe("Row index (0-based)"),
385
+ col: z.number().int().min(0).describe("Column index (0-based)"),
386
+ style: cellStyleSchema.describe("Style properties to set"),
387
+ }, withErrorHandling(({ path, sheet, table, row, col, style }) => {
388
+ const result = manager.setCellStyle(path, sheet, table, row, col, style);
389
+ return successResponse(`Styled cell ${result.cell} in "${result.sheetName}/${result.tableName}"`, { ...result });
390
+ }, "set-cell-style"));
391
+ // set-cells-style-batch
392
+ server.tool("set-cells-style-batch", "Set formatting on multiple cells in one operation. " + "Requires Numbers.app to be running.", {
393
+ path: z.string().describe("Path to the .numbers file"),
394
+ sheet: z.string().describe("Sheet name"),
395
+ table: z.string().describe("Table name"),
396
+ entries: z
397
+ .array(z.object({
398
+ row: z.number().int().min(0).describe("Row index (0-based)"),
399
+ col: z.number().int().min(0).describe("Column index (0-based)"),
400
+ style: cellStyleSchema,
401
+ }))
402
+ .min(1)
403
+ .describe("Array of cell style assignments"),
404
+ }, withErrorHandling(({ path, sheet, table, entries }) => {
405
+ const result = manager.setCellsStyleBatch(path, sheet, table, entries);
406
+ return successResponse(`Styled ${result.cellsStyled} cells in "${result.sheetName}/${result.tableName}"`, { ...result });
407
+ }, "set-cells-style-batch"));
408
+ // set-column-width
409
+ server.tool("set-column-width", "Set the width of a column in pixels. Requires Numbers.app to be running.", {
410
+ path: z.string().describe("Path to the .numbers file"),
411
+ sheet: z.string().describe("Sheet name"),
412
+ table: z.string().describe("Table name"),
413
+ col: z.number().int().min(0).describe("Column index (0-based)"),
414
+ width: z.number().min(0).describe("Width in pixels"),
415
+ }, withErrorHandling(({ path, sheet, table, col, width }) => {
416
+ manager.setColumnWidth(path, sheet, table, col, width);
417
+ return successResponse(`Set column ${col} width to ${width}px in "${sheet}/${table}"`, {
418
+ path,
419
+ sheet,
420
+ table,
421
+ col,
422
+ width,
423
+ });
424
+ }, "set-column-width"));
425
+ // set-row-height
426
+ server.tool("set-row-height", "Set the height of a row in pixels. Requires Numbers.app to be running.", {
427
+ path: z.string().describe("Path to the .numbers file"),
428
+ sheet: z.string().describe("Sheet name"),
429
+ table: z.string().describe("Table name"),
430
+ row: z.number().int().min(0).describe("Row index (0-based)"),
431
+ height: z.number().min(0).describe("Height in pixels"),
432
+ }, withErrorHandling(({ path, sheet, table, row, height }) => {
433
+ manager.setRowHeight(path, sheet, table, row, height);
434
+ return successResponse(`Set row ${row} height to ${height}px in "${sheet}/${table}"`, {
435
+ path,
436
+ sheet,
437
+ table,
438
+ row,
439
+ height,
440
+ });
441
+ }, "set-row-height"));
442
+ // merge-cells
443
+ server.tool("merge-cells", "Merge a range of cells. Requires Numbers.app to be running.", {
444
+ path: z.string().describe("Path to the .numbers file"),
445
+ sheet: z.string().describe("Sheet name"),
446
+ table: z.string().describe("Table name"),
447
+ startRow: z.number().int().min(0).describe("Top-left row (0-based)"),
448
+ startCol: z.number().int().min(0).describe("Top-left column (0-based)"),
449
+ endRow: z.number().int().min(0).describe("Bottom-right row (0-based)"),
450
+ endCol: z.number().int().min(0).describe("Bottom-right column (0-based)"),
451
+ }, withErrorHandling(({ path, sheet, table, startRow, startCol, endRow, endCol }) => {
452
+ const result = manager.mergeCells(path, sheet, table, startRow, startCol, endRow, endCol);
453
+ return successResponse(`Merged ${result.range} in "${result.sheetName}/${result.tableName}"`, {
454
+ ...result,
455
+ });
456
+ }, "merge-cells"));
457
+ // unmerge-cells
458
+ server.tool("unmerge-cells", "Unmerge a previously merged range of cells. Requires Numbers.app to be running.", {
459
+ path: z.string().describe("Path to the .numbers file"),
460
+ sheet: z.string().describe("Sheet name"),
461
+ table: z.string().describe("Table name"),
462
+ startRow: z.number().int().min(0).describe("Top-left row (0-based)"),
463
+ startCol: z.number().int().min(0).describe("Top-left column (0-based)"),
464
+ endRow: z.number().int().min(0).describe("Bottom-right row (0-based)"),
465
+ endCol: z.number().int().min(0).describe("Bottom-right column (0-based)"),
466
+ }, withErrorHandling(({ path, sheet, table, startRow, startCol, endRow, endCol }) => {
467
+ const result = manager.unmergeCells(path, sheet, table, startRow, startCol, endRow, endCol);
468
+ return successResponse(`Unmerged ${result.range} in "${result.sheetName}/${result.tableName}"`, { ...result });
469
+ }, "unmerge-cells"));
470
+ // Register read-only resources (numbers://file/{path}, numbers://table/{path})
471
+ // and workflow prompts.
472
+ registerResourcesAndPrompts(server, manager);
473
+ // --- Start Server ---
474
+ async function main() {
475
+ const transport = new StdioServerTransport();
476
+ await server.connect(transport);
477
+ console.error(`apple-numbers-mcp v${version} running on stdio`);
478
+ }
479
+ main().catch((error) => {
480
+ console.error("Fatal error:", error);
481
+ process.exit(1);
482
+ });
483
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,+EAA+E;AAC/E,mEAAmE;AACnE,cAAc,EAAE,CAAC;AAEjB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACrF,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC;AAEpC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;AAErC,2BAA2B;AAE3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO;IACP,WAAW,EACT,iFAAiF;QACjF,2EAA2E;QAC3E,gFAAgF;QAChF,gCAAgC;CACnC,CAAC,CAAC;AAEH,eAAe;AACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,oEAAoE,EACpE,EAAE,EACF,iBAAiB,CAAC,GAAG,EAAE;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,EAAE;QAChF,GAAG,MAAM;KACV,CAAC,CAAC;AACL,CAAC,EAAE,cAAc,CAAC,CACnB,CAAC;AAEF,SAAS;AACT,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,kFAAkF;IAChF,8EAA8E;IAC9E,8EAA8E,EAChF,EAAE,EACF,iBAAiB,CAAC,GAAG,EAAE;IACrB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,eAAe,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AACpE,CAAC,EAAE,QAAQ,CAAC,CACb,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mFAAmF,EACnF;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;CAC9E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM;aACpB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,eAAe,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxF;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,aAAa,CAAC,CAAC,IAAI,MAAM,MAAM,EAAE,CAAC;IAC3C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,eAAe,CACpB,SAAS,IAAI,CAAC,IAAI,qBAAqB,IAAI,CAAC,YAAY,QAAQ,OAAO,EAAE,EACzE,EAAE,GAAG,IAAI,EAAE,CACZ,CAAC;AACJ,CAAC,EAAE,eAAe,CAAC,CACpB,CAAC;AAEF,aAAa;AACb,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,uEAAuE;IACrE,oDAAoD;IACpD,2DAA2D,EAC7D;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,sDAAsD,CAAC;IACnE,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACxC,QAAQ,EAAE;SACV,QAAQ,CAAC,gDAAgD,CAAC;CAC9D,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;SACvB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACvE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,eAAe,CACpB,WAAW,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,SAAS,MAAM;QAC1D,GAAG,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,OAAO,WAAW;QACjD,GAAG,UAAU,KAAK,SAAS,KAAK,QAAQ,EAAE,EAC5C,EAAE,GAAG,IAAI,EAAE,CACZ,CAAC;AACJ,CAAC,EAAE,YAAY,CAAC,CACjB,CAAC;AAEF,SAAS;AACT,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,+DAA+D;IAC7D,iCAAiC,EACnC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACnE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CACpE,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC3C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9D,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,eAAe,CAAC,yBAAyB,KAAK,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE,CACrF,CAAC;IACF,OAAO,eAAe,CAAC,SAAS,KAAK,mBAAmB,KAAK,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;QACxF,OAAO;QACP,KAAK;KACN,CAAC,CAAC;AACL,CAAC,EAAE,QAAQ,CAAC,CACb,CAAC;AAEF,eAAe;AACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kEAAkE,EAClE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;IAChE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC3E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3E,OAAO,eAAe,CACpB,YAAY,MAAM,CAAC,QAAQ,eAAe,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI;QAChF,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,UAAU,EAAE,EAC3D,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,cAAc,CAAC,CACnB,CAAC;AAEF,WAAW;AACX,MAAM,CAAC,IAAI,CACT,UAAU,EACV,8DAA8D;IAC5D,uEAAuE,EACzE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CACtF,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACpE,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,IAAI,GAAG,CAAC;IACjF,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,IAAI,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC;QACvD,IAAI,IAAI,CAAC,cAAc;YAAE,IAAI,IAAI,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;QACvE,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,IAAI,eAAe,CAAC;IAC7C,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC,EAAE,UAAU,CAAC,CACf,CAAC;AAEF,qBAAqB;AACrB,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,4DAA4D;IAC1D,mDAAmD,EACrD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACnE,IAAI,EAAE,CAAC;SACJ,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SACxE,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC5E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAC7E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,OAAO,eAAe,CACpB,WAAW,MAAM,CAAC,IAAI,IAAI;QACxB,WAAW,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,SAAS,KAAK;QAC/D,GAAG,MAAM,CAAC,UAAU,aAAa,MAAM,CAAC,OAAO,YAAY,EAC7D,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,oBAAoB,CAAC,CACzB,CAAC;AAEF,WAAW;AACX,MAAM,CAAC,IAAI,CACT,UAAU,EACV,+DAA+D;IAC7D,qCAAqC,EACvC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC/D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC1F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;SAC7C,QAAQ,EAAE;SACV,QAAQ,CAAC,yCAAyC,CAAC;CACvD,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,OAAO,eAAe,CACpB,aAAa,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,KAAK,GAAG;QAC1D,OAAO,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EAChD,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,UAAU,CAAC,CACf,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,wDAAwD;IACtD,+DAA+D,EACjE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC/D,KAAK,EAAE,CAAC;aACL,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aACtD,QAAQ,CAAC,gBAAgB,CAAC;QAC7B,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;aAC7C,QAAQ,EAAE;aACV,QAAQ,CAAC,kBAAkB,CAAC;KAChC,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,uBAAuB,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC3E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,OAAO,eAAe,CACpB,WAAW,MAAM,CAAC,YAAY,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EACnF,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,iBAAiB,CAAC,CACtB,CAAC;AAEF,WAAW;AACX,MAAM,CAAC,IAAI,CACT,UAAU,EACV,+DAA+D;IAC7D,iDAAiD,EACnD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,IAAI,EAAE,CAAC;SACJ,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC3E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO,eAAe,CACpB,SAAS,MAAM,CAAC,SAAS,aAAa,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI;QAC5E,oBAAoB,MAAM,CAAC,QAAQ,gBAAgB,MAAM,CAAC,YAAY,GAAG,EAC3E,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,UAAU,CAAC,CACf,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,0DAA0D;IACxD,mDAAmD,EACrD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IACtF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IACnF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC3E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,OAAO,eAAe,CACpB,WAAW,MAAM,CAAC,WAAW,eAAe,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI;QAClF,eAAe,MAAM,CAAC,YAAY,GAAG,EACvC,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,aAAa,CAAC,CAClB,CAAC;AAEF,YAAY;AACZ,MAAM,CAAC,IAAI,CACT,WAAW,EACX,gDAAgD;IAC9C,mDAAmD,EACrD;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACxD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACvE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CACzF,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,OAAO,eAAe,CACpB,gBAAgB,MAAM,CAAC,SAAS,iBAAiB,MAAM,CAAC,SAAS,IAAI;QACnE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,GAAG,EACzC,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,WAAW,CAAC,CAChB,CAAC;AAEF,YAAY;AACZ,MAAM,CAAC,IAAI,CACT,WAAW,EACX,0DAA0D,EAC1D;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACrF,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,OAAO,eAAe,CACpB,gBAAgB,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,SAAS,IAAI;QACjE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,GAAG,EACzC,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,WAAW,CAAC,CAChB,CAAC;AAEF,aAAa;AACb,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,mEAAmE;IACjE,iEAAiE,EACnE;IACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACrE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACpE,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;SACpC,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;IACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC5E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAC7E,EACD,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3F,OAAO,eAAe,CACpB,YAAY,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,UAAU,kBAAkB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI;QACpG,UAAU,MAAM,CAAC,SAAS,aAAa,MAAM,CAAC,IAAI,IAAI;QACtD,WAAW,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,SAAS,GAAG,EAC/D,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,YAAY,CAAC,CACjB,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,yDAAyD;IACvD,0EAA0E,EAC5E;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC5D,MAAM,EAAE,CAAC;aACN,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aAC/D,QAAQ,CAAC,kCAAkC,CAAC;KAChD,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,sBAAsB,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC3E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,OAAO,eAAe,CACpB,WAAW,MAAM,CAAC,WAAW,aAAa,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EACjF,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,aAAa,CAAC,CAClB,CAAC;AAEF,eAAe;AACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,oCAAoC,EACpC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CACnF,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,OAAO,eAAe,CAAC,kBAAkB,MAAM,CAAC,OAAO,QAAQ,MAAM,CAAC,OAAO,GAAG,EAAE;QAChF,GAAG,MAAM;KACV,CAAC,CAAC;AACL,CAAC,EAAE,cAAc,CAAC,CACnB,CAAC;AAEF,eAAe;AACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,oCAAoC,EACpC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CACnF,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,OAAO,eAAe,CACpB,kBAAkB,MAAM,CAAC,OAAO,QAAQ,MAAM,CAAC,OAAO,eAAe,MAAM,CAAC,SAAS,GAAG,EACxF,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,cAAc,CAAC,CACnB,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,gEAAgE;IAC9D,mFAAmF;IACnF,yEAAyE,EAC3E;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;CACtE,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7E,OAAO,eAAe,CACpB,kBAAkB,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK;QAC5E,YAAY,MAAM,CAAC,OAAO,qBAAqB,MAAM,CAAC,aAAa,EAAE,EACvE,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,aAAa,CAAC,CAClB,CAAC;AAEF,qBAAqB;AACrB,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,0EAA0E;IACxE,qFAAqF,EACvF;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,QAAQ,EAAE,CAAC;SACR,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC/C,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,8BAA8B,CAAC;CAC5C,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1E,OAAO,eAAe,CACpB,OAAO,MAAM,CAAC,QAAQ,iBAAiB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EAC9E,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,oBAAoB,CAAC,CACzB,CAAC;AAEF,+DAA+D;AAE/D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC9E,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC/D,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACnF,eAAe,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IAC/F,MAAM,EAAE,CAAC;SACN,IAAI,CAAC;QACJ,WAAW;QACX,QAAQ;QACR,UAAU;QACV,eAAe;QACf,UAAU;QACV,UAAU;QACV,YAAY;QACZ,gBAAgB;QAChB,UAAU;QACV,aAAa;QACb,MAAM;KACP,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,oBAAoB,CAAC;IACjC,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;SAC1D,QAAQ,EAAE;SACV,QAAQ,CAAC,sBAAsB,CAAC;IACnC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAChG,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;CAClE,CAAC,CAAC;AAEH,iBAAiB;AACjB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wEAAwE;IACtE,qCAAqC,EACvC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC/D,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CAC3D,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACzE,OAAO,eAAe,CACpB,eAAe,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EACzE,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,gBAAgB,CAAC,CACrB,CAAC;AAEF,wBAAwB;AACxB,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,qDAAqD,GAAG,qCAAqC,EAC7F;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC/D,KAAK,EAAE,eAAe;KACvB,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,iCAAiC,CAAC;CAC/C,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvE,OAAO,eAAe,CACpB,UAAU,MAAM,CAAC,WAAW,cAAc,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EACjF,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,uBAAuB,CAAC,CAC5B,CAAC;AAEF,mBAAmB;AACnB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,0EAA0E,EAC1E;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CACrD,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;IACvD,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,eAAe,CAAC,cAAc,GAAG,aAAa,KAAK,UAAU,KAAK,IAAI,KAAK,GAAG,EAAE;QACrF,IAAI;QACJ,KAAK;QACL,KAAK;QACL,GAAG;QACH,KAAK;KACN,CAAC,CAAC;AACL,CAAC,EAAE,kBAAkB,CAAC,CACvB,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wEAAwE,EACxE;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CACvD,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IACxD,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,eAAe,CAAC,WAAW,GAAG,cAAc,MAAM,UAAU,KAAK,IAAI,KAAK,GAAG,EAAE;QACpF,IAAI;QACJ,KAAK;QACL,KAAK;QACL,GAAG;QACH,MAAM;KACP,CAAC,CAAC;AACL,CAAC,EAAE,gBAAgB,CAAC,CACrB,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,6DAA6D,EAC7D;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACpE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;CAC1E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1F,OAAO,eAAe,CAAC,UAAU,MAAM,CAAC,KAAK,QAAQ,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EAAE;QAC5F,GAAG,MAAM;KACV,CAAC,CAAC;AACL,CAAC,EAAE,aAAa,CAAC,CAClB,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,iFAAiF,EACjF;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACpE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;CAC1E,EACD,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5F,OAAO,eAAe,CACpB,YAAY,MAAM,CAAC,KAAK,QAAQ,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,EACvE,EAAE,GAAG,MAAM,EAAE,CACd,CAAC;AACJ,CAAC,EAAE,eAAe,CAAC,CACpB,CAAC;AAEF,+EAA+E;AAC/E,wBAAwB;AACxB,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7C,uBAAuB;AAEvB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,mBAAmB,CAAC,CAAC;AAClE,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function fileConfigPath(env?: NodeJS.ProcessEnv): string;
2
+ /**
3
+ * Merge a JSON config file's string values into `env` for keys not already set.
4
+ * Returns the keys applied. Tolerates a missing/corrupt file.
5
+ */
6
+ export declare function loadFileConfig(env?: NodeJS.ProcessEnv, path?: string): string[];
7
+ //# sourceMappingURL=fileConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileConfig.d.ts","sourceRoot":"","sources":["../../src/services/fileConfig.ts"],"names":[],"mappings":"AAoBA,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE,MAA4B,GACjC,MAAM,EAAE,CAiBV"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * File-based configuration loader.
3
+ *
4
+ * Some host apps (e.g. Claude Desktop) spawn the MCP server with a scrubbed
5
+ * environment and ignore the `env` block in their server config, so there's no
6
+ * way to pass `APPLE_NUMBERS_MCP_*` settings in. This loads them from a JSON file
7
+ * the host doesn't manage, merging into `process.env` WITHOUT overriding
8
+ * anything already set (so an explicit env still wins).
9
+ *
10
+ * Only non-secret config belongs here.
11
+ *
12
+ * Path: `APPLE_NUMBERS_MCP_CONFIG_FILE`, else
13
+ * `~/Library/Application Support/apple-numbers-mcp/config.json`.
14
+ *
15
+ * @module services/fileConfig
16
+ */
17
+ import { existsSync, readFileSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ import { homedir } from "node:os";
20
+ export function fileConfigPath(env = process.env) {
21
+ const override = env.APPLE_NUMBERS_MCP_CONFIG_FILE;
22
+ if (override && override.trim())
23
+ return override.trim();
24
+ return join(homedir(), "Library", "Application Support", "apple-numbers-mcp", "config.json");
25
+ }
26
+ /**
27
+ * Merge a JSON config file's string values into `env` for keys not already set.
28
+ * Returns the keys applied. Tolerates a missing/corrupt file.
29
+ */
30
+ export function loadFileConfig(env = process.env, path = fileConfigPath(env)) {
31
+ const applied = [];
32
+ try {
33
+ if (!existsSync(path))
34
+ return applied;
35
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
36
+ if (!parsed || typeof parsed !== "object")
37
+ return applied;
38
+ for (const [k, v] of Object.entries(parsed)) {
39
+ if (typeof v !== "string")
40
+ continue;
41
+ if (env[k] === undefined || env[k] === "") {
42
+ env[k] = v;
43
+ applied.push(k);
44
+ }
45
+ }
46
+ }
47
+ catch (e) {
48
+ console.error(`Failed to load apple-numbers-mcp config file ${path}: ${String(e)}`);
49
+ }
50
+ return applied;
51
+ }
52
+ //# sourceMappingURL=fileConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileConfig.js","sourceRoot":"","sources":["../../src/services/fileConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,6BAA6B,CAAC;IACnD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAyB,OAAO,CAAC,GAAG,EACpC,OAAe,cAAc,CAAC,GAAG,CAAC;IAElC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC;QACtC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC;QAC1D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;YACvE,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,SAAS;YACpC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,gDAAgD,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}