mcp-perforce-server 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.
@@ -0,0 +1,469 @@
1
+ "use strict";
2
+ /**
3
+ * Changelist management tools for MCP Perforce server
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.p4ChangelistCreate = p4ChangelistCreate;
40
+ exports.p4ChangelistUpdate = p4ChangelistUpdate;
41
+ exports.p4ChangelistSubmit = p4ChangelistSubmit;
42
+ exports.p4Submit = p4Submit;
43
+ exports.p4Describe = p4Describe;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const os = __importStar(require("os"));
47
+ const parse = __importStar(require("../p4/parse.js"));
48
+ /**
49
+ * p4 changelist.create - Create a new changelist
50
+ */
51
+ async function p4ChangelistCreate(context, args) {
52
+ if (!args.description || args.description.trim() === '') {
53
+ return {
54
+ ok: false,
55
+ command: 'change',
56
+ args: [],
57
+ cwd: process.cwd(),
58
+ configUsed: {},
59
+ error: {
60
+ code: 'P4_INVALID_ARGS',
61
+ message: 'description parameter is required and must not be empty',
62
+ },
63
+ };
64
+ }
65
+ if (context.serverConfig.readOnlyMode) {
66
+ return {
67
+ ok: false,
68
+ command: 'change',
69
+ args: [],
70
+ cwd: process.cwd(),
71
+ configUsed: {},
72
+ error: {
73
+ code: 'P4_READONLY_MODE',
74
+ message: 'Server is in read-only mode. Set P4_READONLY_MODE=false to enable write operations.',
75
+ },
76
+ };
77
+ }
78
+ const { cwd, env, configResult } = await context.config.setupForCommand(args.workspacePath);
79
+ try {
80
+ // Create changelist spec
81
+ const spec = createChangelistSpec({
82
+ description: args.description,
83
+ files: args.files,
84
+ user: env.P4USER,
85
+ client: env.P4CLIENT,
86
+ });
87
+ // Write spec to temporary file
88
+ const tempFile = path.join(os.tmpdir(), `p4change_${Date.now()}.tmp`);
89
+ await fs.promises.writeFile(tempFile, spec);
90
+ try {
91
+ const result = await context.runner.run('change', ['-i'], cwd, {
92
+ env,
93
+ useZtag: false,
94
+ parseOutput: false,
95
+ });
96
+ // Feed the spec via stdin (simulated by file for now)
97
+ // In a real implementation, you'd pipe the spec to stdin
98
+ result.configUsed = {
99
+ ...result.configUsed,
100
+ p4configPath: configResult.configPath,
101
+ };
102
+ if (result.ok && result.result) {
103
+ // Parse changelist number from output
104
+ const match = result.result.match(/Change (\d+) created/);
105
+ if (match) {
106
+ result.result = {
107
+ changelist: parseInt(match[1], 10),
108
+ description: args.description,
109
+ message: result.result,
110
+ };
111
+ }
112
+ }
113
+ return result;
114
+ }
115
+ finally {
116
+ // Clean up temp file
117
+ try {
118
+ await fs.promises.unlink(tempFile);
119
+ }
120
+ catch {
121
+ // Ignore cleanup errors
122
+ }
123
+ }
124
+ }
125
+ catch (error) {
126
+ return {
127
+ ok: false,
128
+ command: 'change',
129
+ args: ['-i'],
130
+ cwd,
131
+ configUsed: { p4configPath: configResult.configPath },
132
+ error: {
133
+ code: 'P4_COMMAND_FAILED',
134
+ message: `Failed to create changelist: ${error}`,
135
+ },
136
+ };
137
+ }
138
+ }
139
+ /**
140
+ * p4 changelist.update - Update an existing changelist
141
+ */
142
+ async function p4ChangelistUpdate(context, args) {
143
+ if (!args.changelist) {
144
+ return {
145
+ ok: false,
146
+ command: 'change',
147
+ args: [],
148
+ cwd: process.cwd(),
149
+ configUsed: {},
150
+ error: {
151
+ code: 'P4_INVALID_ARGS',
152
+ message: 'changelist parameter is required',
153
+ },
154
+ };
155
+ }
156
+ if (context.serverConfig.readOnlyMode) {
157
+ return {
158
+ ok: false,
159
+ command: 'change',
160
+ args: [],
161
+ cwd: process.cwd(),
162
+ configUsed: {},
163
+ error: {
164
+ code: 'P4_READONLY_MODE',
165
+ message: 'Server is in read-only mode. Set P4_READONLY_MODE=false to enable write operations.',
166
+ },
167
+ };
168
+ }
169
+ const { cwd, env, configResult } = await context.config.setupForCommand(args.workspacePath);
170
+ try {
171
+ // First get the current changelist to preserve existing data
172
+ const describeResult = await context.runner.run('describe', ['-s', args.changelist], cwd, {
173
+ env,
174
+ useZtag: false,
175
+ parseOutput: false,
176
+ });
177
+ if (!describeResult.ok) {
178
+ return describeResult;
179
+ }
180
+ // Parse current changelist info (simplified)
181
+ const currentDescription = args.description || 'Updated changelist';
182
+ // Create updated spec
183
+ const spec = createChangelistSpec({
184
+ changelist: args.changelist,
185
+ description: currentDescription,
186
+ files: args.files,
187
+ user: env.P4USER,
188
+ client: env.P4CLIENT,
189
+ });
190
+ // Write spec to temporary file
191
+ const tempFile = path.join(os.tmpdir(), `p4change_${Date.now()}.tmp`);
192
+ await fs.promises.writeFile(tempFile, spec);
193
+ try {
194
+ const result = await context.runner.run('change', ['-i'], cwd, {
195
+ env,
196
+ useZtag: false,
197
+ parseOutput: false,
198
+ });
199
+ result.configUsed = {
200
+ ...result.configUsed,
201
+ p4configPath: configResult.configPath,
202
+ };
203
+ if (result.ok && result.result) {
204
+ result.result = {
205
+ changelist: parseInt(args.changelist, 10),
206
+ description: currentDescription,
207
+ message: result.result,
208
+ };
209
+ }
210
+ return result;
211
+ }
212
+ finally {
213
+ // Clean up temp file
214
+ try {
215
+ await fs.promises.unlink(tempFile);
216
+ }
217
+ catch {
218
+ // Ignore cleanup errors
219
+ }
220
+ }
221
+ }
222
+ catch (error) {
223
+ return {
224
+ ok: false,
225
+ command: 'change',
226
+ args: ['-i'],
227
+ cwd,
228
+ configUsed: { p4configPath: configResult.configPath },
229
+ error: {
230
+ code: 'P4_COMMAND_FAILED',
231
+ message: `Failed to update changelist: ${error}`,
232
+ },
233
+ };
234
+ }
235
+ }
236
+ /**
237
+ * p4 changelist.submit - Submit a numbered changelist
238
+ */
239
+ async function p4ChangelistSubmit(context, args) {
240
+ if (!args.changelist) {
241
+ return {
242
+ ok: false,
243
+ command: 'submit',
244
+ args: [],
245
+ cwd: process.cwd(),
246
+ configUsed: {},
247
+ error: {
248
+ code: 'P4_INVALID_ARGS',
249
+ message: 'changelist parameter is required',
250
+ },
251
+ };
252
+ }
253
+ if (context.serverConfig.readOnlyMode) {
254
+ return {
255
+ ok: false,
256
+ command: 'submit',
257
+ args: [],
258
+ cwd: process.cwd(),
259
+ configUsed: {},
260
+ error: {
261
+ code: 'P4_READONLY_MODE',
262
+ message: 'Server is in read-only mode. Set P4_READONLY_MODE=false to enable write operations.',
263
+ },
264
+ };
265
+ }
266
+ const { cwd, env, configResult } = await context.config.setupForCommand(args.workspacePath);
267
+ const result = await context.runner.run('submit', ['-c', args.changelist], cwd, {
268
+ env,
269
+ useZtag: false,
270
+ parseOutput: false,
271
+ });
272
+ result.configUsed = {
273
+ ...result.configUsed,
274
+ p4configPath: configResult.configPath,
275
+ };
276
+ if (result.ok && result.result) {
277
+ // Parse submit result
278
+ const match = result.result.match(/Change (\d+) submitted/);
279
+ if (match) {
280
+ result.result = {
281
+ changelist: parseInt(match[1], 10),
282
+ message: result.result,
283
+ };
284
+ }
285
+ }
286
+ return result;
287
+ }
288
+ /**
289
+ * p4 submit - Submit default changelist with description
290
+ */
291
+ async function p4Submit(context, args) {
292
+ if (!args.description || args.description.trim() === '') {
293
+ return {
294
+ ok: false,
295
+ command: 'submit',
296
+ args: [],
297
+ cwd: process.cwd(),
298
+ configUsed: {},
299
+ error: {
300
+ code: 'P4_INVALID_ARGS',
301
+ message: 'description parameter is required for default changelist submission',
302
+ },
303
+ };
304
+ }
305
+ if (context.serverConfig.readOnlyMode) {
306
+ return {
307
+ ok: false,
308
+ command: 'submit',
309
+ args: [],
310
+ cwd: process.cwd(),
311
+ configUsed: {},
312
+ error: {
313
+ code: 'P4_READONLY_MODE',
314
+ message: 'Server is in read-only mode. Set P4_READONLY_MODE=false to enable write operations.',
315
+ },
316
+ };
317
+ }
318
+ const { cwd, env, configResult } = await context.config.setupForCommand(args.workspacePath);
319
+ try {
320
+ // Create submit spec
321
+ const spec = createSubmitSpec({
322
+ description: args.description,
323
+ files: args.files,
324
+ });
325
+ // Write spec to temporary file
326
+ const tempFile = path.join(os.tmpdir(), `p4submit_${Date.now()}.tmp`);
327
+ await fs.promises.writeFile(tempFile, spec);
328
+ try {
329
+ const result = await context.runner.run('submit', ['-i'], cwd, {
330
+ env,
331
+ useZtag: false,
332
+ parseOutput: false,
333
+ });
334
+ result.configUsed = {
335
+ ...result.configUsed,
336
+ p4configPath: configResult.configPath,
337
+ };
338
+ if (result.ok && result.result) {
339
+ // Parse submit result
340
+ const match = result.result.match(/Change (\d+) submitted/);
341
+ if (match) {
342
+ result.result = {
343
+ changelist: parseInt(match[1], 10),
344
+ description: args.description,
345
+ message: result.result,
346
+ };
347
+ }
348
+ }
349
+ return result;
350
+ }
351
+ finally {
352
+ // Clean up temp file
353
+ try {
354
+ await fs.promises.unlink(tempFile);
355
+ }
356
+ catch {
357
+ // Ignore cleanup errors
358
+ }
359
+ }
360
+ }
361
+ catch (error) {
362
+ return {
363
+ ok: false,
364
+ command: 'submit',
365
+ args: ['-i'],
366
+ cwd,
367
+ configUsed: { p4configPath: configResult.configPath },
368
+ error: {
369
+ code: 'P4_COMMAND_FAILED',
370
+ message: `Failed to submit: ${error}`,
371
+ },
372
+ };
373
+ }
374
+ }
375
+ /**
376
+ * p4 describe - Describe a changelist
377
+ */
378
+ async function p4Describe(context, args) {
379
+ if (!args.changelist) {
380
+ return {
381
+ ok: false,
382
+ command: 'describe',
383
+ args: [],
384
+ cwd: process.cwd(),
385
+ configUsed: {},
386
+ error: {
387
+ code: 'P4_INVALID_ARGS',
388
+ message: 'changelist parameter is required',
389
+ },
390
+ };
391
+ }
392
+ const { cwd, env, configResult } = await context.config.setupForCommand(args.workspacePath);
393
+ const result = await context.runner.run('describe', ['-s', args.changelist], cwd, {
394
+ env,
395
+ useZtag: true,
396
+ parseOutput: true,
397
+ });
398
+ if (result.ok && result.result) {
399
+ result.result = parse.parseZtagOutput(result.result);
400
+ }
401
+ result.configUsed = {
402
+ ...result.configUsed,
403
+ p4configPath: configResult.configPath,
404
+ };
405
+ return result;
406
+ }
407
+ /**
408
+ * Create a changelist specification string
409
+ */
410
+ function createChangelistSpec(options) {
411
+ const lines = [
412
+ '# A Perforce Change Specification.',
413
+ '#',
414
+ '# Change: The change number. \'new\' on a new changelist.',
415
+ '# Date: The date this specification was last modified.',
416
+ '# Client: The client on which the changelist was created.',
417
+ '# User: The user who created the changelist.',
418
+ '# Status: Either \'pending\' or \'submitted\'.',
419
+ '# Description: Comments about the changelist.',
420
+ '# Files: What opened files from the default changelist are to be added',
421
+ '#\tto this changelist. You may delete files from this list.',
422
+ '',
423
+ `Change:\t${options.changelist || 'new'}`,
424
+ '',
425
+ `Client:\t${options.client || 'unknown'}`,
426
+ '',
427
+ `User:\t${options.user || 'unknown'}`,
428
+ '',
429
+ 'Status:\tnew',
430
+ '',
431
+ 'Description:',
432
+ `\t${options.description}`,
433
+ '',
434
+ 'Files:',
435
+ ];
436
+ if (options.files && options.files.length > 0) {
437
+ for (const file of options.files) {
438
+ lines.push(`\t${file}`);
439
+ }
440
+ }
441
+ return lines.join('\n');
442
+ }
443
+ /**
444
+ * Create a submit specification string
445
+ */
446
+ function createSubmitSpec(options) {
447
+ const lines = [
448
+ '# A Perforce Submit Specification.',
449
+ '#',
450
+ '# Change: The change number. \'new\' on a new changelist.',
451
+ '# Description: Comments about the changelist.',
452
+ '# Files: What opened files from the default changelist are to be',
453
+ '#\tsubmitted. You may delete files from this list.',
454
+ '',
455
+ 'Change:\tnew',
456
+ '',
457
+ 'Description:',
458
+ `\t${options.description}`,
459
+ '',
460
+ 'Files:',
461
+ ];
462
+ if (options.files && options.files.length > 0) {
463
+ for (const file of options.files) {
464
+ lines.push(`\t${file}`);
465
+ }
466
+ }
467
+ return lines.join('\n');
468
+ }
469
+ //# sourceMappingURL=changelist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelist.js","sourceRoot":"","sources":["../../src/tools/changelist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Export all tool implementations
3
+ */
4
+ export { p4Info, p4Status, p4Add, p4Edit, p4Delete, p4Revert, p4Sync, p4Opened, p4Diff } from './basic.js';
5
+ export { p4ChangelistCreate, p4ChangelistUpdate, p4ChangelistSubmit, p4Submit, p4Describe } from './changelist.js';
6
+ export { p4Filelog, p4Clients, p4ConfigDetect } from './utils.js';
7
+ export type { ToolContext } from './basic.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,EACP,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,SAAS,EACT,SAAS,EACT,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Export all tool implementations
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.p4ConfigDetect = exports.p4Clients = exports.p4Filelog = exports.p4Describe = exports.p4Submit = exports.p4ChangelistSubmit = exports.p4ChangelistUpdate = exports.p4ChangelistCreate = exports.p4Diff = exports.p4Opened = exports.p4Sync = exports.p4Revert = exports.p4Delete = exports.p4Edit = exports.p4Add = exports.p4Status = exports.p4Info = void 0;
7
+ // Export individual functions to avoid ToolContext conflicts
8
+ var basic_js_1 = require("./basic.js");
9
+ Object.defineProperty(exports, "p4Info", { enumerable: true, get: function () { return basic_js_1.p4Info; } });
10
+ Object.defineProperty(exports, "p4Status", { enumerable: true, get: function () { return basic_js_1.p4Status; } });
11
+ Object.defineProperty(exports, "p4Add", { enumerable: true, get: function () { return basic_js_1.p4Add; } });
12
+ Object.defineProperty(exports, "p4Edit", { enumerable: true, get: function () { return basic_js_1.p4Edit; } });
13
+ Object.defineProperty(exports, "p4Delete", { enumerable: true, get: function () { return basic_js_1.p4Delete; } });
14
+ Object.defineProperty(exports, "p4Revert", { enumerable: true, get: function () { return basic_js_1.p4Revert; } });
15
+ Object.defineProperty(exports, "p4Sync", { enumerable: true, get: function () { return basic_js_1.p4Sync; } });
16
+ Object.defineProperty(exports, "p4Opened", { enumerable: true, get: function () { return basic_js_1.p4Opened; } });
17
+ Object.defineProperty(exports, "p4Diff", { enumerable: true, get: function () { return basic_js_1.p4Diff; } });
18
+ var changelist_js_1 = require("./changelist.js");
19
+ Object.defineProperty(exports, "p4ChangelistCreate", { enumerable: true, get: function () { return changelist_js_1.p4ChangelistCreate; } });
20
+ Object.defineProperty(exports, "p4ChangelistUpdate", { enumerable: true, get: function () { return changelist_js_1.p4ChangelistUpdate; } });
21
+ Object.defineProperty(exports, "p4ChangelistSubmit", { enumerable: true, get: function () { return changelist_js_1.p4ChangelistSubmit; } });
22
+ Object.defineProperty(exports, "p4Submit", { enumerable: true, get: function () { return changelist_js_1.p4Submit; } });
23
+ Object.defineProperty(exports, "p4Describe", { enumerable: true, get: function () { return changelist_js_1.p4Describe; } });
24
+ var utils_js_1 = require("./utils.js");
25
+ Object.defineProperty(exports, "p4Filelog", { enumerable: true, get: function () { return utils_js_1.p4Filelog; } });
26
+ Object.defineProperty(exports, "p4Clients", { enumerable: true, get: function () { return utils_js_1.p4Clients; } });
27
+ Object.defineProperty(exports, "p4ConfigDetect", { enumerable: true, get: function () { return utils_js_1.p4ConfigDetect; } });
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,6DAA6D;AAC7D,uCAUoB;AATlB,kGAAA,MAAM,OAAA;AACN,oGAAA,QAAQ,OAAA;AACR,iGAAA,KAAK,OAAA;AACL,kGAAA,MAAM,OAAA;AACN,oGAAA,QAAQ,OAAA;AACR,oGAAA,QAAQ,OAAA;AACR,kGAAA,MAAM,OAAA;AACN,oGAAA,QAAQ,OAAA;AACR,kGAAA,MAAM,OAAA;AAGR,iDAMyB;AALvB,mHAAA,kBAAkB,OAAA;AAClB,mHAAA,kBAAkB,OAAA;AAClB,mHAAA,kBAAkB,OAAA;AAClB,yGAAA,QAAQ,OAAA;AACR,2GAAA,UAAU,OAAA;AAGZ,uCAIoB;AAHlB,qGAAA,SAAS,OAAA;AACT,qGAAA,SAAS,OAAA;AACT,0GAAA,cAAc,OAAA"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Additional utility tools for MCP Perforce server
3
+ */
4
+ import { P4Runner, P4RunResult } from '../p4/runner.js';
5
+ import { P4Config, P4ServerConfig } from '../p4/config.js';
6
+ export interface ToolContext {
7
+ runner: P4Runner;
8
+ config: P4Config;
9
+ serverConfig: P4ServerConfig;
10
+ }
11
+ /**
12
+ * p4 filelog - Show file history
13
+ */
14
+ export declare function p4Filelog(context: ToolContext, args: {
15
+ filespec: string;
16
+ maxRevisions?: number;
17
+ workspacePath?: string;
18
+ }): Promise<P4RunResult>;
19
+ /**
20
+ * p4 clients - List Perforce clients/workspaces
21
+ */
22
+ export declare function p4Clients(context: ToolContext, args?: {
23
+ user?: string;
24
+ workspacePath?: string;
25
+ }): Promise<P4RunResult>;
26
+ /**
27
+ * p4.config.detect - Detect and show Perforce configuration
28
+ */
29
+ export declare function p4ConfigDetect(context: ToolContext, args?: {
30
+ workspacePath?: string;
31
+ }): Promise<P4RunResult>;
32
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG3D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;IACjB,YAAY,EAAE,cAAc,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE,OAAO,CAAC,WAAW,CAAC,CAuCtB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,WAAW,CAAC,CAwBtB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,OAAO,CAAC,WAAW,CAAC,CA6DtB"}