@sonisoft/now-sdk-ext-mcp 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 (102) hide show
  1. package/README.md +393 -0
  2. package/dist/common/connection.d.ts +42 -0
  3. package/dist/common/connection.d.ts.map +1 -0
  4. package/dist/common/connection.js +119 -0
  5. package/dist/common/connection.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +108 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/tools/aggregate.d.ts +20 -0
  11. package/dist/tools/aggregate.d.ts.map +1 -0
  12. package/dist/tools/aggregate.js +271 -0
  13. package/dist/tools/aggregate.js.map +1 -0
  14. package/dist/tools/app-manager.d.ts +50 -0
  15. package/dist/tools/app-manager.d.ts.map +1 -0
  16. package/dist/tools/app-manager.js +756 -0
  17. package/dist/tools/app-manager.js.map +1 -0
  18. package/dist/tools/atf.d.ts +16 -0
  19. package/dist/tools/atf.d.ts.map +1 -0
  20. package/dist/tools/atf.js +246 -0
  21. package/dist/tools/atf.js.map +1 -0
  22. package/dist/tools/attachment.d.ts +20 -0
  23. package/dist/tools/attachment.d.ts.map +1 -0
  24. package/dist/tools/attachment.js +223 -0
  25. package/dist/tools/attachment.js.map +1 -0
  26. package/dist/tools/batch.d.ts +15 -0
  27. package/dist/tools/batch.d.ts.map +1 -0
  28. package/dist/tools/batch.js +159 -0
  29. package/dist/tools/batch.js.map +1 -0
  30. package/dist/tools/cmdb.d.ts +14 -0
  31. package/dist/tools/cmdb.d.ts.map +1 -0
  32. package/dist/tools/cmdb.js +199 -0
  33. package/dist/tools/cmdb.js.map +1 -0
  34. package/dist/tools/codesearch.d.ts +31 -0
  35. package/dist/tools/codesearch.d.ts.map +1 -0
  36. package/dist/tools/codesearch.js +371 -0
  37. package/dist/tools/codesearch.js.map +1 -0
  38. package/dist/tools/discovery.d.ts +15 -0
  39. package/dist/tools/discovery.d.ts.map +1 -0
  40. package/dist/tools/discovery.js +204 -0
  41. package/dist/tools/discovery.js.map +1 -0
  42. package/dist/tools/execute-script.d.ts +9 -0
  43. package/dist/tools/execute-script.d.ts.map +1 -0
  44. package/dist/tools/execute-script.js +106 -0
  45. package/dist/tools/execute-script.js.map +1 -0
  46. package/dist/tools/find-atf-tests.d.ts +9 -0
  47. package/dist/tools/find-atf-tests.d.ts.map +1 -0
  48. package/dist/tools/find-atf-tests.js +152 -0
  49. package/dist/tools/find-atf-tests.js.map +1 -0
  50. package/dist/tools/health.d.ts +9 -0
  51. package/dist/tools/health.d.ts.map +1 -0
  52. package/dist/tools/health.js +137 -0
  53. package/dist/tools/health.js.map +1 -0
  54. package/dist/tools/lookup-app.d.ts +11 -0
  55. package/dist/tools/lookup-app.d.ts.map +1 -0
  56. package/dist/tools/lookup-app.js +242 -0
  57. package/dist/tools/lookup-app.js.map +1 -0
  58. package/dist/tools/lookup-columns.d.ts +10 -0
  59. package/dist/tools/lookup-columns.d.ts.map +1 -0
  60. package/dist/tools/lookup-columns.js +180 -0
  61. package/dist/tools/lookup-columns.js.map +1 -0
  62. package/dist/tools/lookup-table.d.ts +10 -0
  63. package/dist/tools/lookup-table.d.ts.map +1 -0
  64. package/dist/tools/lookup-table.js +150 -0
  65. package/dist/tools/lookup-table.js.map +1 -0
  66. package/dist/tools/query-batch.d.ts +16 -0
  67. package/dist/tools/query-batch.d.ts.map +1 -0
  68. package/dist/tools/query-batch.js +197 -0
  69. package/dist/tools/query-batch.js.map +1 -0
  70. package/dist/tools/query-syslog.d.ts +9 -0
  71. package/dist/tools/query-syslog.d.ts.map +1 -0
  72. package/dist/tools/query-syslog.js +127 -0
  73. package/dist/tools/query-syslog.js.map +1 -0
  74. package/dist/tools/query-table.d.ts +8 -0
  75. package/dist/tools/query-table.d.ts.map +1 -0
  76. package/dist/tools/query-table.js +137 -0
  77. package/dist/tools/query-table.js.map +1 -0
  78. package/dist/tools/schema.d.ts +24 -0
  79. package/dist/tools/schema.d.ts.map +1 -0
  80. package/dist/tools/schema.js +321 -0
  81. package/dist/tools/schema.js.map +1 -0
  82. package/dist/tools/scope.d.ts +25 -0
  83. package/dist/tools/scope.d.ts.map +1 -0
  84. package/dist/tools/scope.js +226 -0
  85. package/dist/tools/scope.js.map +1 -0
  86. package/dist/tools/scriptsync.d.ts +14 -0
  87. package/dist/tools/scriptsync.d.ts.map +1 -0
  88. package/dist/tools/scriptsync.js +167 -0
  89. package/dist/tools/scriptsync.js.map +1 -0
  90. package/dist/tools/task.d.ts +39 -0
  91. package/dist/tools/task.d.ts.map +1 -0
  92. package/dist/tools/task.js +390 -0
  93. package/dist/tools/task.js.map +1 -0
  94. package/dist/tools/updateset.d.ts +46 -0
  95. package/dist/tools/updateset.d.ts.map +1 -0
  96. package/dist/tools/updateset.js +475 -0
  97. package/dist/tools/updateset.js.map +1 -0
  98. package/dist/tools/workflow.d.ts +9 -0
  99. package/dist/tools/workflow.d.ts.map +1 -0
  100. package/dist/tools/workflow.js +164 -0
  101. package/dist/tools/workflow.js.map +1 -0
  102. package/package.json +68 -0
@@ -0,0 +1,159 @@
1
+ import { z } from "zod";
2
+ import { BatchOperations } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the batch_create_records tool on the MCP server.
6
+ *
7
+ * Creates multiple records across one or more tables in a single batch.
8
+ * Supports variable references between operations for chaining.
9
+ */
10
+ export function registerBatchCreateRecordsTool(server) {
11
+ server.registerTool("batch_create_records", {
12
+ title: "Batch Create Records",
13
+ description: "Create multiple records across one or more ServiceNow tables in a single batch. " +
14
+ "Operations execute sequentially, supporting variable references between them: " +
15
+ "use `saveAs` to name an operation's result sys_id, then reference it in later " +
16
+ "operations with `${name}` in data values.\n\n" +
17
+ "Example: Create a parent record with saveAs='parent', then create a child " +
18
+ "record with caller_id set to '${parent}'.\n\n" +
19
+ "IMPORTANT: This creates records on the ServiceNow instance. Review the " +
20
+ "operations before executing.",
21
+ inputSchema: {
22
+ instance: z
23
+ .string()
24
+ .optional()
25
+ .describe("The ServiceNow instance auth alias (e.g., " +
26
+ '"dev224436", "prod"). If not provided, falls back ' +
27
+ "to the SN_AUTH_ALIAS environment variable."),
28
+ operations: z
29
+ .array(z.object({
30
+ table: z.string().describe("Target table name (e.g., 'incident')"),
31
+ data: z
32
+ .record(z.unknown())
33
+ .describe("Field data for the new record"),
34
+ saveAs: z
35
+ .string()
36
+ .optional()
37
+ .describe("Key to save the created sys_id under. " +
38
+ "Later operations can reference it via ${key}."),
39
+ }))
40
+ .describe("Ordered list of create operations to execute."),
41
+ transaction: z
42
+ .boolean()
43
+ .default(true)
44
+ .describe("When true (default), stops on first error. " +
45
+ "When false, continues past errors."),
46
+ },
47
+ }, async ({ instance, operations, transaction }) => {
48
+ try {
49
+ const result = await withConnectionRetry(instance, async (snInstance) => {
50
+ const batchOps = new BatchOperations(snInstance);
51
+ return await batchOps.batchCreate({ operations, transaction });
52
+ });
53
+ const lines = [];
54
+ lines.push("=== Batch Create Results ===");
55
+ lines.push(`Success: ${result.success}`);
56
+ lines.push(`Created: ${result.createdCount}/${operations.length}`);
57
+ lines.push(`Execution Time: ${result.executionTimeMs}ms`);
58
+ if (Object.keys(result.sysIds).length > 0) {
59
+ lines.push("");
60
+ lines.push("Saved sys_ids:");
61
+ for (const [key, sysId] of Object.entries(result.sysIds)) {
62
+ lines.push(` ${key}: ${sysId}`);
63
+ }
64
+ }
65
+ if (result.errors.length > 0) {
66
+ lines.push("");
67
+ lines.push("Errors:");
68
+ for (const err of result.errors) {
69
+ lines.push(` Operation ${err.operationIndex + 1} (${err.table}): ${err.error}`);
70
+ }
71
+ }
72
+ return {
73
+ content: [{ type: "text", text: lines.join("\n") }],
74
+ };
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : String(error);
78
+ return {
79
+ content: [
80
+ { type: "text", text: `Error in batch create: ${message}` },
81
+ ],
82
+ isError: true,
83
+ };
84
+ }
85
+ });
86
+ }
87
+ /**
88
+ * Registers the batch_update_records tool on the MCP server.
89
+ *
90
+ * Updates multiple records across one or more tables in a single batch.
91
+ */
92
+ export function registerBatchUpdateRecordsTool(server) {
93
+ server.registerTool("batch_update_records", {
94
+ title: "Batch Update Records",
95
+ description: "Update multiple records across one or more ServiceNow tables in a single batch. " +
96
+ "Each update specifies a table, sys_id, and the field data to update.\n\n" +
97
+ "IMPORTANT: This modifies records on the ServiceNow instance.",
98
+ inputSchema: {
99
+ instance: z
100
+ .string()
101
+ .optional()
102
+ .describe("The ServiceNow instance auth alias (e.g., " +
103
+ '"dev224436", "prod"). If not provided, falls back ' +
104
+ "to the SN_AUTH_ALIAS environment variable."),
105
+ updates: z
106
+ .array(z.object({
107
+ table: z.string().describe("Target table name"),
108
+ sysId: z.string().describe("sys_id of the record to update"),
109
+ data: z
110
+ .record(z.unknown())
111
+ .describe("Field data to update"),
112
+ }))
113
+ .describe("Ordered list of update operations to execute."),
114
+ stop_on_error: z
115
+ .boolean()
116
+ .default(false)
117
+ .describe("When true, stops on first error. " +
118
+ "When false (default), continues past errors."),
119
+ },
120
+ }, async ({ instance, updates, stop_on_error }) => {
121
+ try {
122
+ const result = await withConnectionRetry(instance, async (snInstance) => {
123
+ const batchOps = new BatchOperations(snInstance);
124
+ return await batchOps.batchUpdate({
125
+ updates,
126
+ stopOnError: stop_on_error,
127
+ });
128
+ });
129
+ const lines = [];
130
+ lines.push("=== Batch Update Results ===");
131
+ lines.push(`Success: ${result.success}`);
132
+ lines.push(`Updated: ${result.updatedCount}/${updates.length}`);
133
+ lines.push(`Execution Time: ${result.executionTimeMs}ms`);
134
+ if (result.errors.length > 0) {
135
+ lines.push("");
136
+ lines.push("Errors:");
137
+ for (const err of result.errors) {
138
+ lines.push(` Update ${err.updateIndex + 1} (${err.table}/${err.sysId}): ${err.error}`);
139
+ }
140
+ }
141
+ return {
142
+ content: [{ type: "text", text: lines.join("\n") }],
143
+ };
144
+ }
145
+ catch (error) {
146
+ const message = error instanceof Error ? error.message : String(error);
147
+ return {
148
+ content: [
149
+ {
150
+ type: "text",
151
+ text: `Error in batch update: ${message}`,
152
+ },
153
+ ],
154
+ isError: true,
155
+ };
156
+ }
157
+ });
158
+ }
159
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/tools/batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the get_cmdb_relationships tool on the MCP server.
4
+ *
5
+ * Returns direct (single-level) upstream and/or downstream relationships for a CI.
6
+ */
7
+ export declare function registerGetCmdbRelationshipsTool(server: McpServer): void;
8
+ /**
9
+ * Registers the traverse_cmdb_graph tool on the MCP server.
10
+ *
11
+ * Performs a multi-level BFS traversal of the CMDB relationship graph.
12
+ */
13
+ export declare function registerTraverseCmdbGraphTool(server: McpServer): void;
14
+ //# sourceMappingURL=cmdb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmdb.d.ts","sourceRoot":"","sources":["../../src/tools/cmdb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqGxE;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwIrE"}
@@ -0,0 +1,199 @@
1
+ import { z } from "zod";
2
+ import { CMDBRelationships } from "@sonisoft/now-sdk-ext-core";
3
+ import { withConnectionRetry } from "../common/connection.js";
4
+ /**
5
+ * Registers the get_cmdb_relationships tool on the MCP server.
6
+ *
7
+ * Returns direct (single-level) upstream and/or downstream relationships for a CI.
8
+ */
9
+ export function registerGetCmdbRelationshipsTool(server) {
10
+ server.registerTool("get_cmdb_relationships", {
11
+ title: "Get CMDB Relationships",
12
+ description: "Get direct relationships of a CMDB Configuration Item (CI). Returns upstream, " +
13
+ "downstream, or both relationship directions. Use this for impact analysis, " +
14
+ "dependency mapping, and understanding CI topology.\n\n" +
15
+ "Provide the CI sys_id (from cmdb_ci or any CI class table). Optionally filter " +
16
+ "by relationship type (e.g., 'Depends on::Used by', 'Contains::Contained by').",
17
+ inputSchema: {
18
+ instance: z
19
+ .string()
20
+ .optional()
21
+ .describe("The ServiceNow instance auth alias (e.g., " +
22
+ '"dev224436", "prod"). If not provided, falls back ' +
23
+ "to the SN_AUTH_ALIAS environment variable."),
24
+ ci_sys_id: z
25
+ .string()
26
+ .describe("The sys_id of the Configuration Item to get relationships for."),
27
+ direction: z
28
+ .enum(["upstream", "downstream", "both"])
29
+ .default("both")
30
+ .describe('Relationship direction: "upstream" (parents/dependencies), ' +
31
+ '"downstream" (children/dependents), or "both". Default is "both".'),
32
+ relation_type: z
33
+ .string()
34
+ .optional()
35
+ .describe('Filter by relationship type name (e.g., "Depends on::Used by", ' +
36
+ '"Contains::Contained by"). If omitted, returns all relationship types.'),
37
+ limit: z
38
+ .number()
39
+ .int()
40
+ .min(1)
41
+ .max(1000)
42
+ .default(100)
43
+ .describe("Maximum number of relationships to return. Default is 100."),
44
+ },
45
+ }, async ({ instance, ci_sys_id, direction, relation_type, limit }) => {
46
+ try {
47
+ const result = await withConnectionRetry(instance, async (snInstance) => {
48
+ const cmdb = new CMDBRelationships(snInstance);
49
+ return await cmdb.getRelationships({
50
+ ciSysId: ci_sys_id,
51
+ direction,
52
+ relationType: relation_type,
53
+ limit,
54
+ });
55
+ });
56
+ const lines = [];
57
+ lines.push("=== CMDB Relationships ===");
58
+ if (result.ci) {
59
+ lines.push(`CI: ${result.ci.name || result.ci.sys_id} (${result.ci.sys_class_name || "unknown class"})`);
60
+ }
61
+ lines.push(`Direction: ${direction}`);
62
+ if (relation_type)
63
+ lines.push(`Relation Type Filter: ${relation_type}`);
64
+ lines.push(`Relationships found: ${result.relationships?.length ?? 0}`);
65
+ if (result.relationships && result.relationships.length > 0) {
66
+ for (const rel of result.relationships) {
67
+ lines.push("");
68
+ lines.push(`--- Relationship ---`);
69
+ lines.push(JSON.stringify(rel, null, 2));
70
+ }
71
+ }
72
+ else {
73
+ lines.push("");
74
+ lines.push("No relationships found.");
75
+ }
76
+ return {
77
+ content: [{ type: "text", text: lines.join("\n") }],
78
+ };
79
+ }
80
+ catch (error) {
81
+ const message = error instanceof Error ? error.message : String(error);
82
+ return {
83
+ content: [
84
+ {
85
+ type: "text",
86
+ text: `Error getting CMDB relationships: ${message}`,
87
+ },
88
+ ],
89
+ isError: true,
90
+ };
91
+ }
92
+ });
93
+ }
94
+ /**
95
+ * Registers the traverse_cmdb_graph tool on the MCP server.
96
+ *
97
+ * Performs a multi-level BFS traversal of the CMDB relationship graph.
98
+ */
99
+ export function registerTraverseCmdbGraphTool(server) {
100
+ server.registerTool("traverse_cmdb_graph", {
101
+ title: "Traverse CMDB Graph",
102
+ description: "Traverse the CMDB relationship graph starting from a Configuration Item using " +
103
+ "breadth-first search. Returns all nodes (CIs) and edges (relationships) discovered " +
104
+ "up to the specified depth.\n\n" +
105
+ "Use this for deep impact analysis, service mapping, and understanding the full " +
106
+ "dependency chain of a CI. Max depth is 5, max nodes is 1000.",
107
+ inputSchema: {
108
+ instance: z
109
+ .string()
110
+ .optional()
111
+ .describe("The ServiceNow instance auth alias (e.g., " +
112
+ '"dev224436", "prod"). If not provided, falls back ' +
113
+ "to the SN_AUTH_ALIAS environment variable."),
114
+ ci_sys_id: z
115
+ .string()
116
+ .describe("The sys_id of the root Configuration Item to start traversal from."),
117
+ direction: z
118
+ .enum(["upstream", "downstream", "both"])
119
+ .default("both")
120
+ .describe('Traversal direction: "upstream", "downstream", or "both". Default is "both".'),
121
+ max_depth: z
122
+ .number()
123
+ .int()
124
+ .min(1)
125
+ .max(5)
126
+ .default(2)
127
+ .describe("Maximum traversal depth (1-5). Higher depth discovers more of the graph " +
128
+ "but makes more API calls. Default is 2."),
129
+ relation_type: z
130
+ .string()
131
+ .optional()
132
+ .describe("Filter traversal to only follow this relationship type."),
133
+ max_nodes: z
134
+ .number()
135
+ .int()
136
+ .min(1)
137
+ .max(1000)
138
+ .default(200)
139
+ .describe("Maximum number of nodes to visit. Traversal stops when this limit is " +
140
+ "reached. Default is 200, max is 1000."),
141
+ },
142
+ }, async ({ instance, ci_sys_id, direction, max_depth, relation_type, max_nodes, }) => {
143
+ try {
144
+ const result = await withConnectionRetry(instance, async (snInstance) => {
145
+ const cmdb = new CMDBRelationships(snInstance);
146
+ return await cmdb.traverseGraph({
147
+ ciSysId: ci_sys_id,
148
+ direction,
149
+ maxDepth: max_depth,
150
+ relationType: relation_type,
151
+ maxNodes: max_nodes,
152
+ });
153
+ });
154
+ const lines = [];
155
+ lines.push("=== CMDB Graph Traversal ===");
156
+ if (result.rootCI) {
157
+ lines.push(`Root CI: ${result.rootCI.name || result.rootCI.sys_id} (${result.rootCI.sys_class_name || "unknown"})`);
158
+ }
159
+ lines.push(`Direction: ${direction}`);
160
+ lines.push(`Max Depth: ${max_depth}`);
161
+ lines.push(`Nodes discovered: ${result.nodes?.length ?? 0}`);
162
+ lines.push(`Edges discovered: ${result.edges?.length ?? 0}`);
163
+ lines.push(`API calls made: ${result.apiCallCount ?? 0}`);
164
+ if (result.truncated) {
165
+ lines.push(`WARNING: Traversal was truncated — ${result.truncationReason || "limit reached"}`);
166
+ }
167
+ if (result.nodes && result.nodes.length > 0) {
168
+ lines.push("");
169
+ lines.push("--- Nodes ---");
170
+ for (const node of result.nodes) {
171
+ lines.push(` [depth=${node.depth}] ${node.name || node.sysId} (${node.className || "unknown"}) — ${node.sysId}`);
172
+ }
173
+ }
174
+ if (result.edges && result.edges.length > 0) {
175
+ lines.push("");
176
+ lines.push("--- Edges ---");
177
+ for (const edge of result.edges) {
178
+ lines.push(` ${edge.parentSysId} --[${edge.typeName || "related"}]--> ${edge.childSysId}`);
179
+ }
180
+ }
181
+ return {
182
+ content: [{ type: "text", text: lines.join("\n") }],
183
+ };
184
+ }
185
+ catch (error) {
186
+ const message = error instanceof Error ? error.message : String(error);
187
+ return {
188
+ content: [
189
+ {
190
+ type: "text",
191
+ text: `Error traversing CMDB graph: ${message}`,
192
+ },
193
+ ],
194
+ isError: true,
195
+ };
196
+ }
197
+ });
198
+ }
199
+ //# sourceMappingURL=cmdb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmdb.js","sourceRoot":"","sources":["../../src/tools/cmdb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Registers the code_search tool on the MCP server.
4
+ *
5
+ * Searches for code across a ServiceNow instance using the Code Search API.
6
+ * This is the primary tool for finding scripts, business rules, and other
7
+ * code artifacts on the platform.
8
+ */
9
+ export declare function registerCodeSearchTool(server: McpServer): void;
10
+ /**
11
+ * Registers the list_code_search_groups tool on the MCP server.
12
+ *
13
+ * Lists available code search groups on a ServiceNow instance.
14
+ * Search groups define which tables and fields are included in code searches.
15
+ */
16
+ export declare function registerListCodeSearchGroupsTool(server: McpServer): void;
17
+ /**
18
+ * Registers the list_code_search_tables tool on the MCP server.
19
+ *
20
+ * Lists the tables associated with a code search group — these are the
21
+ * tables that get searched when using that group in a code search.
22
+ */
23
+ export declare function registerListCodeSearchTablesTool(server: McpServer): void;
24
+ /**
25
+ * Registers the add_code_search_table tool on the MCP server.
26
+ *
27
+ * Adds a new table to an existing code search group, expanding what
28
+ * gets searched when using that group.
29
+ */
30
+ export declare function registerAddCodeSearchTableTool(server: McpServer): void;
31
+ //# sourceMappingURL=codesearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codesearch.d.ts","sourceRoot":"","sources":["../../src/tools/codesearch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgK9D;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6FxE;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0FxE;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+FtE"}