imageforge-mcp 0.3.0 → 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.
@@ -0,0 +1,385 @@
1
+ import { z } from "zod";
2
+ import { loadRemoteImage } from "./imageInput.js";
3
+ const OPENAI_DEFAULT_BASE_URL = "https://api.openai.com/v1";
4
+ const OPENAI_DEFAULT_MODEL = "gpt-image-2";
5
+ const ZHIPU_DEFAULT_BASE_URL = "https://open.bigmodel.cn/api/paas/v4";
6
+ const ZHIPU_DEFAULT_MODEL = "glm-image";
7
+ const ZHIPU_MODELS = new Set(["glm-image", "cogview-4-250304", "cogview-4", "cogview-3-flash"]);
8
+ const MINIMAX_DEFAULT_BASE_URL = "https://api.minimaxi.com/v1";
9
+ const MINIMAX_DEFAULT_MODEL = "image-01";
10
+ const MINIMAX_MODELS = new Set(["image-01", "image-01-live"]);
11
+ const MINIMAX_MAX_REFERENCE_BYTES = 10 * 1024 * 1024;
12
+ const zhipuResponseSchema = z.object({
13
+ data: z.array(z.object({ url: z.string().url() })).min(1),
14
+ content_filter: z.array(z.unknown()).optional(),
15
+ });
16
+ const minimaxResponseSchema = z.object({
17
+ data: z.object({
18
+ image_base64: z.array(z.string()).min(1).optional(),
19
+ }).optional(),
20
+ base_resp: z.object({
21
+ status_code: z.number(),
22
+ status_msg: z.string().optional(),
23
+ }),
24
+ });
25
+ export function resolveProvider(value) {
26
+ const provider = value?.trim().toLowerCase();
27
+ if (!provider)
28
+ return "openai";
29
+ if (provider === "openai" || provider === "zhipu" || provider === "minimax")
30
+ return provider;
31
+ throw new Error("provider must be 'openai', 'zhipu', or 'minimax'.");
32
+ }
33
+ function firstValue(...values) {
34
+ return values.map((value) => value?.trim()).find(Boolean);
35
+ }
36
+ function normalizeBaseUrl(value, label) {
37
+ let parsedUrl;
38
+ try {
39
+ parsedUrl = new URL(value);
40
+ }
41
+ catch {
42
+ throw new Error(`${label} must be a valid absolute HTTP(S) URL.`);
43
+ }
44
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
45
+ throw new Error(`${label} must use HTTP or HTTPS.`);
46
+ }
47
+ return value.replace(/\/+$/, "");
48
+ }
49
+ export function resolveConfig(input) {
50
+ const provider = input.provider ?? resolveProvider(process.env.IMAGEFORGE_PROVIDER);
51
+ if (provider === "openai") {
52
+ const apiKey = firstValue(input.apiKey, process.env.OPENAI_API_KEY);
53
+ if (!apiKey)
54
+ throw new Error("Missing OpenAI API key: pass api_key or set OPENAI_API_KEY.");
55
+ const model = firstValue(input.model, process.env.OPENAI_IMAGE_MODEL, OPENAI_DEFAULT_MODEL);
56
+ if (model !== OPENAI_DEFAULT_MODEL) {
57
+ throw new Error(`Unsupported OpenAI model '${model}'. Only ${OPENAI_DEFAULT_MODEL} is supported.`);
58
+ }
59
+ return {
60
+ provider,
61
+ apiKey,
62
+ model,
63
+ baseUrl: normalizeBaseUrl(firstValue(input.baseUrl, process.env.OPENAI_BASE_URL, OPENAI_DEFAULT_BASE_URL), "base_url"),
64
+ };
65
+ }
66
+ if (provider === "minimax") {
67
+ const apiKey = firstValue(input.apiKey, process.env.MINIMAX_API_KEY);
68
+ if (!apiKey)
69
+ throw new Error("Missing MiniMax API key: pass api_key or set MINIMAX_API_KEY.");
70
+ const model = firstValue(input.model, process.env.MINIMAX_IMAGE_MODEL, MINIMAX_DEFAULT_MODEL);
71
+ if (!MINIMAX_MODELS.has(model)) {
72
+ throw new Error(`Unsupported MiniMax model '${model}'. Supported models: ${Array.from(MINIMAX_MODELS).join(", ")}.`);
73
+ }
74
+ return {
75
+ provider,
76
+ apiKey,
77
+ model,
78
+ baseUrl: normalizeBaseUrl(firstValue(input.baseUrl, process.env.MINIMAX_BASE_URL, MINIMAX_DEFAULT_BASE_URL), "base_url"),
79
+ };
80
+ }
81
+ const apiKey = firstValue(input.apiKey, process.env.ZHIPU_API_KEY);
82
+ if (!apiKey)
83
+ throw new Error("Missing Zhipu API key: pass api_key or set ZHIPU_API_KEY.");
84
+ const model = firstValue(input.model, process.env.ZHIPU_IMAGE_MODEL, ZHIPU_DEFAULT_MODEL);
85
+ if (!ZHIPU_MODELS.has(model)) {
86
+ throw new Error(`Unsupported Zhipu model '${model}'. Supported models: ${Array.from(ZHIPU_MODELS).join(", ")}.`);
87
+ }
88
+ return {
89
+ provider,
90
+ apiKey,
91
+ model,
92
+ baseUrl: normalizeBaseUrl(firstValue(input.baseUrl, process.env.ZHIPU_BASE_URL, ZHIPU_DEFAULT_BASE_URL), "base_url"),
93
+ };
94
+ }
95
+ function detectMimeType(data) {
96
+ if (data.length >= 8 && data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {
97
+ return "image/png";
98
+ }
99
+ if (data.length >= 3 && data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff)
100
+ return "image/jpeg";
101
+ if (data.length >= 12 && data.subarray(0, 4).toString("ascii") === "RIFF" && data.subarray(8, 12).toString("ascii") === "WEBP") {
102
+ return "image/webp";
103
+ }
104
+ return undefined;
105
+ }
106
+ function actualMimeType(data) {
107
+ const mimeType = detectMimeType(data);
108
+ if (!mimeType)
109
+ throw new Error("Provider response was not a valid PNG, JPEG, or WebP image.");
110
+ return mimeType;
111
+ }
112
+ export async function requestOpenAIImage(input) {
113
+ if (!["auto", "low", "medium", "high"].includes(input.quality)) {
114
+ throw new Error("OpenAI quality must be auto, low, medium, or high.");
115
+ }
116
+ const fetchImpl = input.fetchImpl ?? fetch;
117
+ const commonFields = {
118
+ model: input.config.model,
119
+ prompt: input.prompt,
120
+ n: 1,
121
+ size: input.size,
122
+ quality: input.quality,
123
+ output_format: input.outputFormat,
124
+ };
125
+ const hasInputImages = Boolean(input.inputImages?.length);
126
+ let body;
127
+ let headers = { authorization: `Bearer ${input.config.apiKey}` };
128
+ if (hasInputImages) {
129
+ const form = new FormData();
130
+ for (const [name, value] of Object.entries(commonFields))
131
+ form.append(name, String(value));
132
+ for (const image of input.inputImages) {
133
+ form.append("image[]", new Blob([new Uint8Array(image.data)], { type: image.mimeType }), image.fileName);
134
+ }
135
+ body = form;
136
+ }
137
+ else {
138
+ headers = { ...headers, "content-type": "application/json" };
139
+ body = JSON.stringify(commonFields);
140
+ }
141
+ const endpoint = hasInputImages ? "edits" : "generations";
142
+ const response = await fetchImpl(`${input.config.baseUrl}/images/${endpoint}`, {
143
+ method: "POST",
144
+ headers,
145
+ body,
146
+ signal: AbortSignal.timeout(120_000),
147
+ });
148
+ if (!response.ok) {
149
+ const detail = (await response.text()).slice(0, 500);
150
+ throw new Error(`OpenAI image request failed (${response.status}): ${detail || response.statusText}`);
151
+ }
152
+ const payload = (await response.json());
153
+ const encodedImage = payload.data?.[0]?.b64_json;
154
+ if (!encodedImage)
155
+ throw new Error("OpenAI image response contained no base64 image data.");
156
+ const normalizedImage = encodedImage.replace(/\s+/g, "");
157
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(normalizedImage)) {
158
+ throw new Error("OpenAI image response contained invalid base64 image data.");
159
+ }
160
+ const image = Buffer.from(normalizedImage, "base64");
161
+ if (image.length === 0 || image.toString("base64").replace(/=+$/, "") !== normalizedImage.replace(/=+$/, "")) {
162
+ throw new Error("OpenAI image response contained invalid base64 image data.");
163
+ }
164
+ return { data: image, mimeType: actualMimeType(image) };
165
+ }
166
+ export async function requestZhipuImage(input) {
167
+ if (!/^\d+x\d+$/.test(input.size))
168
+ throw new Error("size must use the WIDTHxHEIGHT format, for example 1024x1024.");
169
+ const allowedQuality = input.config.model === "glm-image"
170
+ ? new Set(["auto", "hd"])
171
+ : new Set(["auto", "standard", "hd"]);
172
+ if (!allowedQuality.has(input.quality)) {
173
+ throw new Error(`Zhipu model ${input.config.model} quality must be one of ${Array.from(allowedQuality).join(", ")}.`);
174
+ }
175
+ if (input.config.model === "glm-image" && input.prompt.length > 1000) {
176
+ throw new Error("glm-image prompt must be at most 1000 characters.");
177
+ }
178
+ const requestBody = {
179
+ model: input.config.model,
180
+ prompt: input.prompt,
181
+ size: input.size,
182
+ };
183
+ if (input.quality !== "auto")
184
+ requestBody.quality = input.quality;
185
+ if (input.watermarkEnabled !== undefined)
186
+ requestBody.watermark_enabled = input.watermarkEnabled;
187
+ const fetchImpl = input.fetchImpl ?? fetch;
188
+ const response = await fetchImpl(`${input.config.baseUrl}/images/generations`, {
189
+ method: "POST",
190
+ headers: {
191
+ authorization: `Bearer ${input.config.apiKey}`,
192
+ "content-type": "application/json",
193
+ },
194
+ body: JSON.stringify(requestBody),
195
+ signal: AbortSignal.timeout(120_000),
196
+ });
197
+ if (!response.ok) {
198
+ const detail = (await response.text()).slice(0, 500);
199
+ throw new Error(`Zhipu image request failed (${response.status}): ${detail || response.statusText}`);
200
+ }
201
+ let payload;
202
+ try {
203
+ payload = await response.json();
204
+ }
205
+ catch {
206
+ throw new Error("Zhipu image response was not valid JSON.");
207
+ }
208
+ const parsed = zhipuResponseSchema.safeParse(payload);
209
+ if (!parsed.success)
210
+ throw new Error("Zhipu image response contained no valid image URL.");
211
+ const downloaded = await loadRemoteImage(parsed.data.data[0].url, input.downloadFetchImpl ?? fetchImpl, undefined, undefined, false);
212
+ return { data: downloaded.data, mimeType: downloaded.mimeType };
213
+ }
214
+ const MINIMAX_ASPECT_RATIOS = new Set(["1:1", "16:9", "4:3", "3:2", "2:3", "3:4", "9:16", "21:9"]);
215
+ const MINIMAX_LIVE_ASPECT_RATIOS = new Set(["1:1", "16:9", "4:3", "3:2", "2:3", "3:4", "9:16"]);
216
+ function gcd(a, b) {
217
+ return b === 0 ? a : gcd(b, a % b);
218
+ }
219
+ function parseSize(size) {
220
+ const match = /^(\d+)x(\d+)$/.exec(size);
221
+ if (!match)
222
+ throw new Error("size must use the WIDTHxHEIGHT format, for example 1024x1024.");
223
+ const width = Number(match[1]);
224
+ const height = Number(match[2]);
225
+ if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width < 1 || height < 1) {
226
+ throw new Error("size width and height must be positive safe integers.");
227
+ }
228
+ return { width, height };
229
+ }
230
+ function parseMinimaxImage01Size(size) {
231
+ const { width, height } = parseSize(size);
232
+ if (!Number.isInteger(width) || !Number.isInteger(height) || width < 512 || width > 2048 || height < 512 || height > 2048) {
233
+ throw new Error("MiniMax image-01 width and height must each be between 512 and 2048 pixels.");
234
+ }
235
+ if (width % 8 !== 0 || height % 8 !== 0) {
236
+ throw new Error("MiniMax image-01 width and height must each be a multiple of 8.");
237
+ }
238
+ if (width * height < 1024 * 1024) {
239
+ throw new Error("MiniMax image-01 total pixels must be at least 1024x1024.");
240
+ }
241
+ return { width, height };
242
+ }
243
+ function aspectRatioFromSize(size) {
244
+ const { width, height } = parseSize(size);
245
+ const divisor = gcd(width, height);
246
+ return `${width / divisor}:${height / divisor}`;
247
+ }
248
+ function validateMinimaxAspectRatio(model, ratio) {
249
+ const allowed = model === "image-01-live" ? MINIMAX_LIVE_ASPECT_RATIOS : MINIMAX_ASPECT_RATIOS;
250
+ if (!allowed.has(ratio)) {
251
+ throw new Error(`MiniMax model ${model} does not support aspect ratio ${ratio}. Supported ratios: ${Array.from(allowed).join(", ")}.`);
252
+ }
253
+ }
254
+ function minimaxRequestBody(input) {
255
+ const body = {
256
+ model: input.config.model,
257
+ prompt: input.prompt,
258
+ n: 1,
259
+ response_format: "base64",
260
+ };
261
+ if (input.config.model === "image-01-live") {
262
+ const ratio = aspectRatioFromSize(input.size);
263
+ validateMinimaxAspectRatio(input.config.model, ratio);
264
+ body.aspect_ratio = ratio;
265
+ }
266
+ else {
267
+ const { width, height } = parseMinimaxImage01Size(input.size);
268
+ body.width = width;
269
+ body.height = height;
270
+ }
271
+ if (input.watermarkEnabled !== undefined)
272
+ body.aigc_watermark = input.watermarkEnabled;
273
+ if (input.inputImages?.length) {
274
+ const reference = input.inputImages[0];
275
+ if (reference.mimeType === "image/webp") {
276
+ throw new Error("MiniMax subject reference images must be PNG or JPEG.");
277
+ }
278
+ if (reference.data.length >= MINIMAX_MAX_REFERENCE_BYTES) {
279
+ throw new Error("MiniMax subject reference image must be smaller than 10 MB.");
280
+ }
281
+ body.subject_reference = [{
282
+ type: "character",
283
+ image_file: `data:${reference.mimeType};base64,${reference.data.toString("base64")}`,
284
+ }];
285
+ }
286
+ return body;
287
+ }
288
+ function decodeBase64Image(encodedImage, label) {
289
+ const normalizedImage = encodedImage.replace(/\s+/g, "");
290
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(normalizedImage)) {
291
+ throw new Error(`${label} response contained invalid base64 image data.`);
292
+ }
293
+ const image = Buffer.from(normalizedImage, "base64");
294
+ if (image.length === 0 || image.toString("base64").replace(/=+$/, "") !== normalizedImage.replace(/=+$/, "")) {
295
+ throw new Error(`${label} response contained invalid base64 image data.`);
296
+ }
297
+ if (image.length > 50 * 1024 * 1024) {
298
+ throw new Error(`${label} response image exceeds the 50 MB limit.`);
299
+ }
300
+ return image;
301
+ }
302
+ export async function requestMinimaxImage(input) {
303
+ if (input.quality !== "auto") {
304
+ throw new Error("MiniMax quality must be auto; this provider does not expose a quality option.");
305
+ }
306
+ if (input.outputFormat !== undefined && input.outputFormat !== "jpeg") {
307
+ throw new Error("MiniMax output_format must be jpeg; this provider does not support local transcoding.");
308
+ }
309
+ if (input.prompt.length > 1500) {
310
+ throw new Error("MiniMax prompt must be at most 1500 characters.");
311
+ }
312
+ const requestBody = minimaxRequestBody(input);
313
+ const fetchImpl = input.fetchImpl ?? fetch;
314
+ const response = await fetchImpl(`${input.config.baseUrl}/image_generation`, {
315
+ method: "POST",
316
+ headers: {
317
+ authorization: `Bearer ${input.config.apiKey}`,
318
+ "content-type": "application/json",
319
+ },
320
+ body: JSON.stringify(requestBody),
321
+ signal: AbortSignal.timeout(120_000),
322
+ });
323
+ if (!response.ok) {
324
+ const detail = (await response.text()).slice(0, 500);
325
+ throw new Error(`MiniMax image request failed (${response.status}): ${detail || response.statusText}`);
326
+ }
327
+ let payload;
328
+ try {
329
+ payload = await response.json();
330
+ }
331
+ catch {
332
+ throw new Error("MiniMax image response was not valid JSON.");
333
+ }
334
+ const parsed = minimaxResponseSchema.safeParse(payload);
335
+ if (!parsed.success)
336
+ throw new Error("MiniMax image response contained no valid base64 image data.");
337
+ const statusCode = parsed.data.base_resp.status_code;
338
+ if (statusCode !== 0) {
339
+ const detail = parsed.data.base_resp.status_msg?.slice(0, 500) || String(statusCode);
340
+ throw new Error(`MiniMax image request failed (${statusCode}): ${detail}`);
341
+ }
342
+ const encodedImage = parsed.data.data?.image_base64?.[0];
343
+ if (!encodedImage)
344
+ throw new Error("MiniMax image response contained no base64 image data.");
345
+ const image = decodeBase64Image(encodedImage, "MiniMax");
346
+ return { data: image, mimeType: actualMimeType(image) };
347
+ }
348
+ const imageProviders = {
349
+ openai: requestOpenAIImage,
350
+ zhipu: requestZhipuImage,
351
+ minimax: requestMinimaxImage,
352
+ };
353
+ export async function requestImage(input) {
354
+ const provider = input.config.provider;
355
+ if (provider === "zhipu") {
356
+ if (input.inputImages?.length)
357
+ throw new Error("Zhipu image generation does not support reference_images.");
358
+ return imageProviders[provider]({
359
+ prompt: input.prompt,
360
+ config: input.config,
361
+ size: input.size,
362
+ quality: input.quality,
363
+ watermarkEnabled: input.watermarkEnabled,
364
+ fetchImpl: input.fetchImpl,
365
+ downloadFetchImpl: input.downloadFetchImpl,
366
+ });
367
+ }
368
+ if (provider === "minimax") {
369
+ if ((input.inputImages?.length ?? 0) > 1) {
370
+ throw new Error("MiniMax image generation supports at most one reference image.");
371
+ }
372
+ return imageProviders[provider]({
373
+ prompt: input.prompt,
374
+ config: input.config,
375
+ size: input.size,
376
+ quality: input.quality,
377
+ outputFormat: input.outputFormat,
378
+ watermarkEnabled: input.watermarkEnabled,
379
+ inputImages: input.inputImages,
380
+ fetchImpl: input.fetchImpl,
381
+ });
382
+ }
383
+ return imageProviders[provider](input);
384
+ }
385
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AAkBpE,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAC3C,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AACtE,MAAM,mBAAmB,GAAG,WAAW,CAAC;AACxC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAChG,MAAM,wBAAwB,GAAG,6BAA6B,CAAC;AAC/D,MAAM,qBAAqB,GAAG,UAAU,CAAC;AACzC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;AAC9D,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAErD,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACpD,CAAC,CAAC,QAAQ,EAAE;IACb,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAClC,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC7F,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,GAAG,MAAiC;IACtD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,KAAa;IACpD,IAAI,SAAc,CAAC;IACnB,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wCAAwC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAK7B;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACpF,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,oBAAoB,CAAE,CAAC;QAC7F,IAAI,KAAK,KAAK,oBAAoB,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,WAAW,oBAAoB,gBAAgB,CAAC,CAAC;QACrG,CAAC;QACD,OAAO;YACL,QAAQ;YACR,MAAM;YACN,KAAK;YACL,OAAO,EAAE,gBAAgB,CACvB,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,uBAAuB,CAAE,EAChF,UAAU,CACX;SACF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,qBAAqB,CAAE,CAAC;QAC/F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,8BAA8B,KAAK,wBAAwB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpG,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ;YACR,MAAM;YACN,KAAK;YACL,OAAO,EAAE,gBAAgB,CACvB,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,wBAAwB,CAAE,EAClF,UAAU,CACX;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,CAAE,CAAC;IAC3F,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,wBAAwB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAChG,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ;QACR,MAAM;QACN,KAAK;QACL,OAAO,EAAE,gBAAgB,CACvB,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,sBAAsB,CAAE,EAC9E,UAAU,CACX;KACF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IACtG,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;QAC/H,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC9F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAQxC;IACC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,YAAY,GAAG;QACnB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,CAAC,EAAE,CAAC;QACJ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK,CAAC,YAAY;KAClC,CAAC;IACF,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,IAAc,CAAC;IACnB,IAAI,OAAO,GAA2B,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;IACzF,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,WAAY,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAC7D,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,WAAW,QAAQ,EAAE,EAAE;QAC7E,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI;QACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,MAAM,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4C,CAAC;IACnF,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;IACjD,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC5F,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7G,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAQvC;IACC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACpH,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,WAAW;QACvD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,KAAK,2BAA2B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,WAAW,GAAqC;QACpD,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;IACF,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM;QAAE,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAClE,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAAE,WAAW,CAAC,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IAEjG,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,qBAAqB,EAAE;QAC7E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;YAC9C,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;KACrC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,MAAM,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC3F,MAAM,UAAU,GAAG,MAAM,eAAe,CACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,EACxB,KAAK,CAAC,iBAAiB,IAAI,SAAS,EACpC,SAAS,EACT,SAAS,EACT,KAAK,CACN,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACnG,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhG,SAAS,GAAG,CAAC,CAAS,EAAE,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC;QAC1H,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,GAAG,KAAK,GAAG,OAAO,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAa,EAAE,KAAa;IAC9D,MAAM,OAAO,GAAG,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAC/F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,kCAAkC,KAAK,uBAAuB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzI,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAM3B;IACC,MAAM,IAAI,GAA4B;QACpC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,CAAC,EAAE,CAAC;QACJ,eAAe,EAAE,QAAQ;KAC1B,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,eAAe,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvF,IAAI,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QACxC,IAAI,SAAS,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,2BAA2B,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,CAAC;gBACxB,IAAI,EAAE,WAAW;gBACjB,UAAU,EAAE,QAAQ,SAAS,CAAC,QAAQ,WAAW,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;aACrF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAoB,EAAE,KAAa;IAC5D,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,gDAAgD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7G,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,gDAAgD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0CAA0C,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KASzC;IACC,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,mBAAmB,EAAE;QAC3E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;YAC9C,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;KACrC,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,MAAM,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACrG,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;IACrD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,iCAAiC,UAAU,MAAM,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACzD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,cAAc,GAAG;IACrB,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB;IACxB,OAAO,EAAE,mBAAmB;CACpB,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAGlC;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;IACvC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,WAAW,EAAE,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC5G,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;SAC3C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "imageforge-mcp",
3
- "version": "0.3.0",
4
- "description": "Minimal MCP server for gpt-image-2 through the OpenAI Images API",
3
+ "version": "0.5.0",
4
+ "description": "Lightweight MCP image generation server with OpenAI, Zhipu, and MiniMax providers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
@@ -23,6 +23,7 @@
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
25
  "@modelcontextprotocol/sdk": "^1.30.0",
26
+ "undici": "^6.28.0",
26
27
  "zod": "^3.25.76"
27
28
  },
28
29
  "devDependencies": {