@kadi.build/core 0.0.1-alpha.0 → 0.0.1-alpha.10

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 (180) hide show
  1. package/README.md +1387 -214
  2. package/dist/abilities/AbilityCache.d.ts +242 -0
  3. package/dist/abilities/AbilityCache.d.ts.map +1 -0
  4. package/dist/abilities/AbilityCache.js +285 -0
  5. package/dist/abilities/AbilityCache.js.map +1 -0
  6. package/dist/abilities/AbilityContext.d.ts +215 -0
  7. package/dist/abilities/AbilityContext.d.ts.map +1 -0
  8. package/dist/abilities/AbilityContext.js +36 -0
  9. package/dist/abilities/AbilityContext.js.map +1 -0
  10. package/dist/abilities/AbilityLoader.d.ts +177 -0
  11. package/dist/abilities/AbilityLoader.d.ts.map +1 -0
  12. package/dist/abilities/AbilityLoader.js +277 -0
  13. package/dist/abilities/AbilityLoader.js.map +1 -0
  14. package/dist/abilities/AbilityProxy.d.ts +463 -0
  15. package/dist/abilities/AbilityProxy.d.ts.map +1 -0
  16. package/dist/abilities/AbilityProxy.js +511 -0
  17. package/dist/abilities/AbilityProxy.js.map +1 -0
  18. package/dist/abilities/AbilityValidator.d.ts +172 -0
  19. package/dist/abilities/AbilityValidator.d.ts.map +1 -0
  20. package/dist/abilities/AbilityValidator.js +253 -0
  21. package/dist/abilities/AbilityValidator.js.map +1 -0
  22. package/dist/abilities/index.d.ts +26 -0
  23. package/dist/abilities/index.d.ts.map +1 -0
  24. package/dist/abilities/index.js +23 -0
  25. package/dist/abilities/index.js.map +1 -0
  26. package/dist/abilities/types.d.ts +156 -0
  27. package/dist/abilities/types.d.ts.map +1 -0
  28. package/dist/abilities/types.js +10 -0
  29. package/dist/abilities/types.js.map +1 -0
  30. package/dist/api/index.d.ts +92 -0
  31. package/dist/api/index.d.ts.map +1 -0
  32. package/dist/api/index.js +124 -0
  33. package/dist/api/index.js.map +1 -0
  34. package/dist/broker/BrokerConnection.d.ts +253 -0
  35. package/dist/broker/BrokerConnection.d.ts.map +1 -0
  36. package/dist/broker/BrokerConnection.js +434 -0
  37. package/dist/broker/BrokerConnection.js.map +1 -0
  38. package/dist/broker/BrokerConnectionManager.d.ts +216 -0
  39. package/dist/broker/BrokerConnectionManager.d.ts.map +1 -0
  40. package/dist/broker/BrokerConnectionManager.js +305 -0
  41. package/dist/broker/BrokerConnectionManager.js.map +1 -0
  42. package/dist/broker/BrokerProtocol.d.ts +280 -0
  43. package/dist/broker/BrokerProtocol.d.ts.map +1 -0
  44. package/dist/broker/BrokerProtocol.js +466 -0
  45. package/dist/broker/BrokerProtocol.js.map +1 -0
  46. package/dist/broker/index.d.ts +9 -0
  47. package/dist/broker/index.d.ts.map +1 -0
  48. package/dist/broker/index.js +9 -0
  49. package/dist/broker/index.js.map +1 -0
  50. package/dist/client/KadiClient.d.ts +270 -0
  51. package/dist/client/KadiClient.d.ts.map +1 -0
  52. package/dist/client/KadiClient.js +492 -0
  53. package/dist/client/KadiClient.js.map +1 -0
  54. package/dist/client/index.d.ts +7 -0
  55. package/dist/client/index.d.ts.map +1 -0
  56. package/dist/client/index.js +7 -0
  57. package/dist/client/index.js.map +1 -0
  58. package/dist/config/ConfigLoader.d.ts +138 -0
  59. package/dist/config/ConfigLoader.d.ts.map +1 -0
  60. package/dist/config/ConfigLoader.js +226 -0
  61. package/dist/config/ConfigLoader.js.map +1 -0
  62. package/dist/config/ConfigResolver.d.ts +135 -0
  63. package/dist/config/ConfigResolver.d.ts.map +1 -0
  64. package/dist/config/ConfigResolver.js +282 -0
  65. package/dist/config/ConfigResolver.js.map +1 -0
  66. package/dist/config/index.d.ts +8 -0
  67. package/dist/config/index.d.ts.map +1 -0
  68. package/dist/config/index.js +8 -0
  69. package/dist/config/index.js.map +1 -0
  70. package/dist/errors/index.d.ts +9 -0
  71. package/dist/errors/index.d.ts.map +1 -0
  72. package/dist/errors/index.js +8 -0
  73. package/dist/errors/index.js.map +1 -0
  74. package/dist/events/EventHub.d.ts +172 -0
  75. package/dist/events/EventHub.d.ts.map +1 -0
  76. package/dist/events/EventHub.js +333 -0
  77. package/dist/events/EventHub.js.map +1 -0
  78. package/dist/events/index.d.ts +7 -0
  79. package/dist/events/index.d.ts.map +1 -0
  80. package/dist/events/index.js +7 -0
  81. package/dist/events/index.js.map +1 -0
  82. package/dist/index.d.ts +49 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +63 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/messages/index.d.ts +33 -0
  87. package/dist/messages/index.d.ts.map +1 -0
  88. package/dist/messages/index.js +33 -0
  89. package/dist/messages/index.js.map +1 -0
  90. package/dist/schemas/index.d.ts +19 -0
  91. package/dist/schemas/index.d.ts.map +1 -0
  92. package/dist/schemas/index.js +25 -0
  93. package/dist/schemas/index.js.map +1 -0
  94. package/dist/schemas/kadi-extensions.d.ts +231 -0
  95. package/dist/schemas/kadi-extensions.d.ts.map +1 -0
  96. package/dist/schemas/kadi-extensions.js +14 -0
  97. package/dist/schemas/kadi-extensions.js.map +1 -0
  98. package/dist/schemas/mcp/schema.d.ts +1399 -0
  99. package/dist/schemas/mcp/schema.d.ts.map +1 -0
  100. package/dist/schemas/mcp/schema.js +53 -0
  101. package/dist/schemas/mcp/schema.js.map +1 -0
  102. package/dist/schemas/mcp/version.d.ts +37 -0
  103. package/dist/schemas/mcp/version.d.ts.map +1 -0
  104. package/dist/schemas/mcp/version.js +39 -0
  105. package/dist/schemas/mcp/version.js.map +1 -0
  106. package/dist/schemas/schema-builders.d.ts +178 -0
  107. package/dist/schemas/schema-builders.d.ts.map +1 -0
  108. package/dist/schemas/schema-builders.js +258 -0
  109. package/dist/schemas/schema-builders.js.map +1 -0
  110. package/dist/tools/ToolRegistry.d.ts +256 -0
  111. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  112. package/dist/tools/ToolRegistry.js +340 -0
  113. package/dist/tools/ToolRegistry.js.map +1 -0
  114. package/dist/tools/index.d.ts +7 -0
  115. package/dist/tools/index.d.ts.map +1 -0
  116. package/dist/tools/index.js +7 -0
  117. package/dist/tools/index.js.map +1 -0
  118. package/dist/transports/BrokerTransport.d.ts +151 -0
  119. package/dist/transports/BrokerTransport.d.ts.map +1 -0
  120. package/dist/transports/BrokerTransport.js +261 -0
  121. package/dist/transports/BrokerTransport.js.map +1 -0
  122. package/dist/transports/NativeTransport.d.ts +149 -0
  123. package/dist/transports/NativeTransport.d.ts.map +1 -0
  124. package/dist/transports/NativeTransport.js +302 -0
  125. package/dist/transports/NativeTransport.js.map +1 -0
  126. package/dist/transports/StdioTransport.d.ts +172 -0
  127. package/dist/transports/StdioTransport.d.ts.map +1 -0
  128. package/dist/transports/StdioTransport.js +410 -0
  129. package/dist/transports/StdioTransport.js.map +1 -0
  130. package/dist/transports/index.d.ts +10 -0
  131. package/dist/transports/index.d.ts.map +1 -0
  132. package/dist/transports/index.js +9 -0
  133. package/dist/transports/index.js.map +1 -0
  134. package/dist/types/broker.d.ts +301 -0
  135. package/dist/types/broker.d.ts.map +1 -0
  136. package/dist/types/broker.js +46 -0
  137. package/dist/types/broker.js.map +1 -0
  138. package/dist/types/config.d.ts +325 -0
  139. package/dist/types/config.d.ts.map +1 -0
  140. package/dist/types/config.js +17 -0
  141. package/dist/types/config.js.map +1 -0
  142. package/dist/types/errors.d.ts +178 -0
  143. package/dist/types/errors.d.ts.map +1 -0
  144. package/dist/types/errors.js +165 -0
  145. package/dist/types/errors.js.map +1 -0
  146. package/dist/types/events.d.ts +210 -0
  147. package/dist/types/events.d.ts.map +1 -0
  148. package/dist/types/events.js +8 -0
  149. package/dist/types/events.js.map +1 -0
  150. package/dist/types/index.d.ts +32 -0
  151. package/dist/types/index.d.ts.map +1 -0
  152. package/dist/types/index.js +21 -0
  153. package/dist/types/index.js.map +1 -0
  154. package/dist/types/protocol.d.ts +48 -0
  155. package/dist/types/protocol.d.ts.map +1 -0
  156. package/dist/types/protocol.js +11 -0
  157. package/dist/types/protocol.js.map +1 -0
  158. package/dist/types/tools.d.ts +67 -0
  159. package/dist/types/tools.d.ts.map +1 -0
  160. package/dist/types/tools.js +16 -0
  161. package/dist/types/tools.js.map +1 -0
  162. package/dist/types/transport.d.ts +250 -0
  163. package/dist/types/transport.d.ts.map +1 -0
  164. package/dist/types/transport.js +18 -0
  165. package/dist/types/transport.js.map +1 -0
  166. package/dist/validation/SchemaValidator.d.ts +208 -0
  167. package/dist/validation/SchemaValidator.d.ts.map +1 -0
  168. package/dist/validation/SchemaValidator.js +411 -0
  169. package/dist/validation/SchemaValidator.js.map +1 -0
  170. package/dist/validation/index.d.ts +11 -0
  171. package/dist/validation/index.d.ts.map +1 -0
  172. package/dist/validation/index.js +10 -0
  173. package/dist/validation/index.js.map +1 -0
  174. package/package.json +69 -5
  175. package/.prettierrc +0 -6
  176. package/agent.json +0 -18
  177. package/broker.js +0 -214
  178. package/index.js +0 -370
  179. package/ipc.js +0 -220
  180. package/ipcInterfaces/pythonAbilityIPC.py +0 -177
@@ -0,0 +1,270 @@
1
+ /**
2
+ * KADI Client
3
+ *
4
+ * Thin orchestrator that composes specialized modules to provide the
5
+ * complete KADI client functionality.
6
+ *
7
+ * This is dramatically simpler than the old implementation because each
8
+ * concern has been properly separated.
9
+ *
10
+ * @module client/KadiClient
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ import type { KadiConfig, ResolvedConfig, ToolHandler, KadiTool, EventCallback, UnsubscribeFunction, PublishOptions } from '../types/index.js';
14
+ import { BrokerConnectionManager } from '../broker/BrokerConnectionManager.js';
15
+ import { BrokerProtocol } from '../broker/BrokerProtocol.js';
16
+ import { type LoadedAbility, type LoadOptions } from '../abilities/index.js';
17
+ import type { IBrokerClient } from '../transports/BrokerTransport.js';
18
+ /**
19
+ * KADI Client
20
+ *
21
+ * Main client class for KADI framework.
22
+ * Orchestrates tool registry, event hub, broker connections, and ability loading.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * // Create client
27
+ * const client = new KadiClient({
28
+ * name: 'my-service',
29
+ * brokers: { local: 'ws://localhost:8080' },
30
+ * networks: ['global']
31
+ * });
32
+ *
33
+ * // Register a tool
34
+ * client.registerTool('greet', async ({ name }) => {
35
+ * return { message: `Hello, ${name}!` };
36
+ * });
37
+ *
38
+ * // Connect to brokers
39
+ * await client.connect();
40
+ *
41
+ * // Load an ability (explicit transport)
42
+ * const calc = await client.load('calculator', 'broker');
43
+ * const result = await calc.add({ a: 5, b: 3 });
44
+ *
45
+ * // Subscribe to events
46
+ * client.subscribeToEvent('user.*', (data) => {
47
+ * console.log('User event:', data);
48
+ * });
49
+ *
50
+ * // Publish an event
51
+ * client.publishEvent('user.login', { userId: '123' });
52
+ * ```
53
+ */
54
+ export declare class KadiClient extends EventEmitter implements IBrokerClient {
55
+ /**
56
+ * Resolved configuration
57
+ */
58
+ readonly config: ResolvedConfig;
59
+ /**
60
+ * Tool registry
61
+ */
62
+ private readonly tools;
63
+ /**
64
+ * Event hub
65
+ */
66
+ private readonly events;
67
+ /**
68
+ * Broker connection manager
69
+ */
70
+ private readonly brokers;
71
+ /**
72
+ * Broker protocol instances (per broker)
73
+ */
74
+ private readonly protocols;
75
+ /**
76
+ * Ability loader
77
+ */
78
+ private readonly abilityLoader;
79
+ /**
80
+ * Whether client is initialized
81
+ */
82
+ private initialized;
83
+ /**
84
+ * Create a new KADI Client
85
+ *
86
+ * @param config - Client configuration
87
+ */
88
+ constructor(config: KadiConfig);
89
+ /**
90
+ * Connect to configured brokers
91
+ *
92
+ * @throws {KadiError} If connection fails
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * await client.connect();
97
+ * console.log('Connected to brokers');
98
+ * ```
99
+ */
100
+ connect(): Promise<void>;
101
+ /**
102
+ * Connect to all configured brokers
103
+ */
104
+ private connectToBrokers;
105
+ /**
106
+ * Register capabilities with a broker
107
+ *
108
+ * @param protocol - Broker protocol instance
109
+ */
110
+ private registerCapabilitiesWithBroker;
111
+ /**
112
+ * Register a tool (MCP-based)
113
+ *
114
+ * @template TInput - Tool input type
115
+ * @template TOutput - Tool output type
116
+ * @param definition - MCP-compliant tool definition
117
+ * @param handler - Tool handler function
118
+ * @returns this for chaining
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * client.registerTool({
123
+ * name: 'add',
124
+ * description: 'Add two numbers',
125
+ * version: '1.0.0',
126
+ * tags: ['math'],
127
+ * inputSchema: {
128
+ * type: 'object',
129
+ * properties: {
130
+ * a: { type: 'number' },
131
+ * b: { type: 'number' }
132
+ * },
133
+ * required: ['a', 'b']
134
+ * },
135
+ * outputSchema: {
136
+ * type: 'object',
137
+ * properties: {
138
+ * result: { type: 'number' }
139
+ * }
140
+ * }
141
+ * }, async ({ a, b }) => {
142
+ * return { result: a + b };
143
+ * });
144
+ * ```
145
+ */
146
+ registerTool<TInput = unknown, TOutput = unknown>(definition: KadiTool, handler: ToolHandler<TInput, TOutput>): this;
147
+ /**
148
+ * Load an ability
149
+ *
150
+ * **Explicit Transport, Excellent Developer Experience:**
151
+ * - Explicit transport selection (no magic)
152
+ * - Transport-specific options (only relevant fields shown)
153
+ * - Smart caching (avoids duplicate loads)
154
+ * - Runtime validation (optional)
155
+ * - Helpful errors with suggestions
156
+ *
157
+ * @param name - Ability name
158
+ * @param transport - Transport type ('native', 'stdio', or 'broker')
159
+ * @param options - Load options (transport-specific, optional)
160
+ * @returns Proxied ability with dynamic method access
161
+ *
162
+ * @throws {KadiError} If loading fails
163
+ *
164
+ * @example
165
+ * ```typescript
166
+ * // Simple broker load
167
+ * const calc = await client.load('calculator', 'broker');
168
+ * await calc.add({ a: 5, b: 3 });
169
+ *
170
+ * // With options
171
+ * const remote = await client.load('gpu-service', 'broker', {
172
+ * networks: ['global', 'gpu-cluster']
173
+ * });
174
+ *
175
+ * // With runtime validation
176
+ * const validated = await client.load('calculator', 'broker', {
177
+ * validate: true // Runtime check for expected methods
178
+ * });
179
+ *
180
+ * // Native transport
181
+ * const local = await client.load('math-lib', 'native', {
182
+ * path: './abilities/math'
183
+ * });
184
+ * ```
185
+ */
186
+ load(name: string, transport: 'native' | 'stdio' | 'broker', options?: LoadOptions): Promise<LoadedAbility>;
187
+ /**
188
+ * Subscribe to events
189
+ *
190
+ * @template T - Event data type
191
+ * @param pattern - Event pattern (supports wildcards)
192
+ * @param callback - Event callback
193
+ * @returns Unsubscribe function
194
+ *
195
+ * @example
196
+ * ```typescript
197
+ * const unsubscribe = client.subscribeToEvent('user.*', (data) => {
198
+ * console.log('User event:', data);
199
+ * });
200
+ *
201
+ * // Later...
202
+ * unsubscribe();
203
+ * ```
204
+ */
205
+ subscribeToEvent<T = unknown>(pattern: string, callback: EventCallback<T>): UnsubscribeFunction;
206
+ /**
207
+ * Publish an event
208
+ *
209
+ * @template T - Event data type
210
+ * @param eventName - Event name
211
+ * @param data - Event data
212
+ * @param options - Publishing options
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * client.publishEvent('user.login', {
217
+ * userId: '123',
218
+ * timestamp: Date.now()
219
+ * });
220
+ * ```
221
+ */
222
+ publishEvent<T = unknown>(eventName: string, data: T, options?: PublishOptions): void;
223
+ /**
224
+ * Disconnect from all brokers and cleanup
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * await client.disconnect();
229
+ * ```
230
+ */
231
+ disconnect(): Promise<void>;
232
+ /**
233
+ * Get broker manager (implements IBrokerClient)
234
+ */
235
+ getBrokerManager(): BrokerConnectionManager;
236
+ /**
237
+ * Get broker protocol instance (implements IBrokerClient)
238
+ *
239
+ * @param brokerName - Optional broker name (uses default if not specified)
240
+ */
241
+ getBrokerProtocol(brokerName?: string): BrokerProtocol;
242
+ /**
243
+ * Networks (implements IBrokerClient)
244
+ */
245
+ get networks(): string[];
246
+ /**
247
+ * Create minimal configuration for constructor
248
+ * Full resolution happens in connect()
249
+ */
250
+ private createMinimalConfig;
251
+ /**
252
+ * Setup broker event forwarding
253
+ */
254
+ private setupBrokerEventForwarding;
255
+ /**
256
+ * Handle incoming tool invocation requests from broker
257
+ *
258
+ * Flow:
259
+ * 1. Extract id from top-level message (JSON-RPC request id)
260
+ * 2. Look up tool handler by name
261
+ * 3. Execute handler with toolInput
262
+ * 4. Send JSON-RPC response back to broker with matching id
263
+ *
264
+ * @param brokerName - Name of the broker connection to use for response
265
+ * @param message - Full JSON-RPC request message with id, method, and params
266
+ * @private
267
+ */
268
+ private handleIncomingToolRequest;
269
+ }
270
+ //# sourceMappingURL=KadiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KadiClient.d.ts","sourceRoot":"","sources":["../../src/client/KadiClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAEV,UAAU,EACV,cAAc,EACd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAoB,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,UAAW,SAAQ,YAAa,YAAW,aAAa;IACnE;;OAEG;IACH,SAAgB,MAAM,EAAE,cAAc,CAAC;IAEvC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAElC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAElD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAE/D;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C;;OAEG;IACH,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;OAIG;gBACS,MAAM,EAAE,UAAU;IAoB9B;;;;;;;;;;OAUG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB9B;;OAEG;YACW,gBAAgB;IA4C9B;;;;OAIG;YACW,8BAA8B;IAY5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,YAAY,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC9C,UAAU,EAAE,QAAQ,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,IAAI;IAwBP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,EACxC,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,aAAa,CAAC;IAIzB;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,mBAAmB;IAuBtB;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,CAAC,GAAG,OAAO,EACtB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,cAAc,GACvB,IAAI;IAuBP;;;;;;;OAOG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;OAEG;IACH,gBAAgB,IAAI,uBAAuB;IAI3C;;;;OAIG;IACH,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc;IAuBtD;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAwBlC;;;;;;;;;;;;OAYG;YACW,yBAAyB;CAwCxC"}