@react-grab/mcp 0.1.29 → 0.1.30
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.
- package/dist/cli.cjs +5 -25583
- package/dist/cli.d.cts +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +8 -25571
- package/dist/cli.js.map +1 -0
- package/dist/client.cjs +56 -54
- package/dist/client.d.cts +9 -7
- package/dist/client.d.cts.map +1 -0
- package/dist/client.d.ts +9 -7
- package/dist/client.d.ts.map +1 -0
- package/dist/client.global.js +1 -2
- package/dist/client.iife.js +1 -0
- package/dist/client.js +57 -52
- package/dist/client.js.map +1 -0
- package/dist/server-DoDoIQtO.cjs +22377 -0
- package/dist/server-MH3euw4e.js +22371 -0
- package/dist/server-MH3euw4e.js.map +1 -0
- package/dist/server.cjs +3 -25580
- package/dist/server.d.cts +9 -4
- package/dist/server.d.cts.map +1 -0
- package/dist/server.d.ts +9 -4
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1 -25568
- package/package.json +9 -6
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { startMcpServer } from \"./server.js\";\n\nstartMcpServer({\n port: Number(process.env.PORT) || undefined,\n stdio: process.argv.includes(\"--stdio\"),\n});\n"],"mappings":";;;AAGA,eAAe;CACb,MAAM,OAAO,QAAQ,IAAI,KAAK,IAAI,KAAA;CAClC,OAAO,QAAQ,KAAK,SAAS,UAAU;CACxC,CAAC"}
|
package/dist/client.cjs
CHANGED
|
@@ -1,60 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const HEALTH_CHECK_TIMEOUT_MS = 1e3;
|
|
3
|
+
//#endregion
|
|
4
|
+
//#region src/client.ts
|
|
5
|
+
const sendContextToServer = async (contextUrl, content, prompt) => {
|
|
6
|
+
await fetch(contextUrl, {
|
|
7
|
+
method: "POST",
|
|
8
|
+
headers: { "Content-Type": "application/json" },
|
|
9
|
+
body: JSON.stringify({
|
|
10
|
+
content,
|
|
11
|
+
prompt
|
|
12
|
+
})
|
|
13
|
+
}).catch(() => {});
|
|
14
14
|
};
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
};
|
|
15
|
+
const createMcpPlugin = (options = {}) => {
|
|
16
|
+
const contextUrl = `http://localhost:${options.port ?? 4723}/context`;
|
|
17
|
+
return {
|
|
18
|
+
name: "mcp",
|
|
19
|
+
hooks: {
|
|
20
|
+
onCopySuccess: (_elements, content) => {
|
|
21
|
+
sendContextToServer(contextUrl, [content]);
|
|
22
|
+
},
|
|
23
|
+
transformAgentContext: async (context) => {
|
|
24
|
+
await sendContextToServer(contextUrl, context.content, context.prompt);
|
|
25
|
+
return context;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
30
29
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
30
|
+
const isReactGrabApi = (value) => typeof value === "object" && value !== null && "registerPlugin" in value;
|
|
31
|
+
const MCP_REACHABLE_KEY = "react-grab-mcp-reachable";
|
|
32
|
+
const checkIfMcpServerIsReachable = async (port) => {
|
|
33
|
+
const cached = sessionStorage.getItem(MCP_REACHABLE_KEY);
|
|
34
|
+
if (cached !== null) return cached === "true";
|
|
35
|
+
const isReachable = await fetch(`http://localhost:${port}/health`, { signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS) }).then((response) => response.ok).catch(() => false);
|
|
36
|
+
sessionStorage.setItem(MCP_REACHABLE_KEY, String(isReachable));
|
|
37
|
+
return isReachable;
|
|
38
|
+
};
|
|
39
|
+
const attachMcpPlugin = async () => {
|
|
40
|
+
if (typeof window === "undefined") return;
|
|
41
|
+
if (!await checkIfMcpServerIsReachable(4723)) return;
|
|
42
|
+
const plugin = createMcpPlugin();
|
|
43
|
+
const attach = (api) => {
|
|
44
|
+
api.registerPlugin(plugin);
|
|
45
|
+
};
|
|
46
|
+
const existingApi = window.__REACT_GRAB__;
|
|
47
|
+
if (isReactGrabApi(existingApi)) {
|
|
48
|
+
attach(existingApi);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
window.addEventListener("react-grab:init", (event) => {
|
|
52
|
+
if (!(event instanceof CustomEvent)) return;
|
|
53
|
+
if (!isReactGrabApi(event.detail)) return;
|
|
54
|
+
attach(event.detail);
|
|
55
|
+
}, { once: true });
|
|
56
|
+
const apiAfterListener = window.__REACT_GRAB__;
|
|
57
|
+
if (isReactGrabApi(apiAfterListener)) attach(apiAfterListener);
|
|
56
58
|
};
|
|
57
59
|
attachMcpPlugin();
|
|
58
|
-
|
|
60
|
+
//#endregion
|
|
59
61
|
exports.attachMcpPlugin = attachMcpPlugin;
|
|
60
62
|
exports.createMcpPlugin = createMcpPlugin;
|
package/dist/client.d.cts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Plugin, init } from "react-grab/core";
|
|
2
2
|
|
|
3
|
+
//#region src/client.d.ts
|
|
3
4
|
interface McpPluginOptions {
|
|
4
|
-
|
|
5
|
+
port?: number;
|
|
5
6
|
}
|
|
6
7
|
declare const createMcpPlugin: (options?: McpPluginOptions) => Plugin;
|
|
7
8
|
declare global {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
interface Window {
|
|
10
|
+
__REACT_GRAB__?: ReturnType<typeof init>;
|
|
11
|
+
}
|
|
11
12
|
}
|
|
12
|
-
declare const attachMcpPlugin: () => void
|
|
13
|
-
|
|
13
|
+
declare const attachMcpPlugin: () => Promise<void>;
|
|
14
|
+
//#endregion
|
|
14
15
|
export { attachMcpPlugin, createMcpPlugin };
|
|
16
|
+
//# sourceMappingURL=client.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.cts","names":[],"sources":["../src/client.ts"],"mappings":";;;UAGU,gBAAA;EACR,IAAA;AAAA;AAAA,cAeW,eAAA,GAAmB,OAAA,GAAS,gBAAA,KAAwB,MAAA;AAAA,QAqBzD,MAAA;EAAA,UACI,MAAA;IACR,cAAA,GAAiB,UAAA,QAAkB,IAAA;EAAA;AAAA;AAAA,cAoB1B,eAAA,QAA4B,OAAA"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Plugin, init } from "react-grab/core";
|
|
2
2
|
|
|
3
|
+
//#region src/client.d.ts
|
|
3
4
|
interface McpPluginOptions {
|
|
4
|
-
|
|
5
|
+
port?: number;
|
|
5
6
|
}
|
|
6
7
|
declare const createMcpPlugin: (options?: McpPluginOptions) => Plugin;
|
|
7
8
|
declare global {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
interface Window {
|
|
10
|
+
__REACT_GRAB__?: ReturnType<typeof init>;
|
|
11
|
+
}
|
|
11
12
|
}
|
|
12
|
-
declare const attachMcpPlugin: () => void
|
|
13
|
-
|
|
13
|
+
declare const attachMcpPlugin: () => Promise<void>;
|
|
14
|
+
//#endregion
|
|
14
15
|
export { attachMcpPlugin, createMcpPlugin };
|
|
16
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../src/client.ts"],"mappings":";;;UAGU,gBAAA;EACR,IAAA;AAAA;AAAA,cAeW,eAAA,GAAmB,OAAA,GAAS,gBAAA,KAAwB,MAAA;AAAA,QAqBzD,MAAA;EAAA,UACI,MAAA;IACR,cAAA,GAAiB,UAAA,QAAkB,IAAA;EAAA;AAAA;AAAA,cAoB1B,eAAA,QAA4B,OAAA"}
|
package/dist/client.global.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
var ReactGrabMcp=(function(
|
|
2
|
-
exports.attachMcpPlugin=p;exports.createMcpPlugin=a;return exports;})({});
|
|
1
|
+
var ReactGrabMcp=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t=async(e,t,n)=>{await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({content:t,prompt:n})}).catch(()=>{})},n=(e={})=>{let n=`http://localhost:${e.port??4723}/context`;return{name:`mcp`,hooks:{onCopySuccess:(e,r)=>{t(n,[r])},transformAgentContext:async e=>(await t(n,e.content,e.prompt),e)}}},r=e=>typeof e==`object`&&!!e&&`registerPlugin`in e,i=`react-grab-mcp-reachable`,a=async e=>{let t=sessionStorage.getItem(i);if(t!==null)return t===`true`;let n=await fetch(`http://localhost:${e}/health`,{signal:AbortSignal.timeout(1e3)}).then(e=>e.ok).catch(()=>!1);return sessionStorage.setItem(i,String(n)),n},o=async()=>{if(typeof window>`u`||!await a(4723))return;let e=n(),t=t=>{t.registerPlugin(e)},i=window.__REACT_GRAB__;if(r(i)){t(i);return}window.addEventListener(`react-grab:init`,e=>{e instanceof CustomEvent&&r(e.detail)&&t(e.detail)},{once:!0});let o=window.__REACT_GRAB__;r(o)&&t(o)};return o(),e.attachMcpPlugin=o,e.createMcpPlugin=n,e})({});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var ReactGrabMcp=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t=async(e,t,n)=>{await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({content:t,prompt:n})}).catch(()=>{})},n=(e={})=>{let n=`http://localhost:${e.port??4723}/context`;return{name:`mcp`,hooks:{onCopySuccess:(e,r)=>{t(n,[r])},transformAgentContext:async e=>(await t(n,e.content,e.prompt),e)}}},r=e=>typeof e==`object`&&!!e&&`registerPlugin`in e,i=`react-grab-mcp-reachable`,a=async e=>{let t=sessionStorage.getItem(i);if(t!==null)return t===`true`;let n=await fetch(`http://localhost:${e}/health`,{signal:AbortSignal.timeout(1e3)}).then(e=>e.ok).catch(()=>!1);return sessionStorage.setItem(i,String(n)),n},o=async()=>{if(typeof window>`u`||!await a(4723))return;let e=n(),t=t=>{t.registerPlugin(e)},i=window.__REACT_GRAB__;if(r(i)){t(i);return}window.addEventListener(`react-grab:init`,e=>{e instanceof CustomEvent&&r(e.detail)&&t(e.detail)},{once:!0});let o=window.__REACT_GRAB__;r(o)&&t(o)};return o(),e.attachMcpPlugin=o,e.createMcpPlugin=n,e})({});
|
package/dist/client.js
CHANGED
|
@@ -1,57 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
const HEALTH_CHECK_TIMEOUT_MS = 1e3;
|
|
2
|
+
//#endregion
|
|
3
|
+
//#region src/client.ts
|
|
4
|
+
const sendContextToServer = async (contextUrl, content, prompt) => {
|
|
5
|
+
await fetch(contextUrl, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: { "Content-Type": "application/json" },
|
|
8
|
+
body: JSON.stringify({
|
|
9
|
+
content,
|
|
10
|
+
prompt
|
|
11
|
+
})
|
|
12
|
+
}).catch(() => {});
|
|
13
|
+
};
|
|
14
|
+
const createMcpPlugin = (options = {}) => {
|
|
15
|
+
const contextUrl = `http://localhost:${options.port ?? 4723}/context`;
|
|
16
|
+
return {
|
|
17
|
+
name: "mcp",
|
|
18
|
+
hooks: {
|
|
19
|
+
onCopySuccess: (_elements, content) => {
|
|
20
|
+
sendContextToServer(contextUrl, [content]);
|
|
21
|
+
},
|
|
22
|
+
transformAgentContext: async (context) => {
|
|
23
|
+
await sendContextToServer(contextUrl, context.content, context.prompt);
|
|
24
|
+
return context;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
12
28
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
},
|
|
22
|
-
transformAgentContext: async (context) => {
|
|
23
|
-
await sendContextToServer(contextUrl, context.content, context.prompt);
|
|
24
|
-
return context;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
};
|
|
29
|
+
const isReactGrabApi = (value) => typeof value === "object" && value !== null && "registerPlugin" in value;
|
|
30
|
+
const MCP_REACHABLE_KEY = "react-grab-mcp-reachable";
|
|
31
|
+
const checkIfMcpServerIsReachable = async (port) => {
|
|
32
|
+
const cached = sessionStorage.getItem(MCP_REACHABLE_KEY);
|
|
33
|
+
if (cached !== null) return cached === "true";
|
|
34
|
+
const isReachable = await fetch(`http://localhost:${port}/health`, { signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS) }).then((response) => response.ok).catch(() => false);
|
|
35
|
+
sessionStorage.setItem(MCP_REACHABLE_KEY, String(isReachable));
|
|
36
|
+
return isReachable;
|
|
28
37
|
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
{ once: true }
|
|
49
|
-
);
|
|
50
|
-
const apiAfterListener = window.__REACT_GRAB__;
|
|
51
|
-
if (isReactGrabApi(apiAfterListener)) {
|
|
52
|
-
attach(apiAfterListener);
|
|
53
|
-
}
|
|
38
|
+
const attachMcpPlugin = async () => {
|
|
39
|
+
if (typeof window === "undefined") return;
|
|
40
|
+
if (!await checkIfMcpServerIsReachable(4723)) return;
|
|
41
|
+
const plugin = createMcpPlugin();
|
|
42
|
+
const attach = (api) => {
|
|
43
|
+
api.registerPlugin(plugin);
|
|
44
|
+
};
|
|
45
|
+
const existingApi = window.__REACT_GRAB__;
|
|
46
|
+
if (isReactGrabApi(existingApi)) {
|
|
47
|
+
attach(existingApi);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
window.addEventListener("react-grab:init", (event) => {
|
|
51
|
+
if (!(event instanceof CustomEvent)) return;
|
|
52
|
+
if (!isReactGrabApi(event.detail)) return;
|
|
53
|
+
attach(event.detail);
|
|
54
|
+
}, { once: true });
|
|
55
|
+
const apiAfterListener = window.__REACT_GRAB__;
|
|
56
|
+
if (isReactGrabApi(apiAfterListener)) attach(apiAfterListener);
|
|
54
57
|
};
|
|
55
58
|
attachMcpPlugin();
|
|
56
|
-
|
|
59
|
+
//#endregion
|
|
57
60
|
export { attachMcpPlugin, createMcpPlugin };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../src/constants.ts","../src/client.ts"],"sourcesContent":["export const CONTEXT_TTL_MS = 5 * 60 * 1000;\nexport const DEFAULT_MCP_PORT = 4723;\nexport const HEALTH_CHECK_TIMEOUT_MS = 1000;\nexport const POST_KILL_DELAY_MS = 100;\n","import type { init, ReactGrabAPI, Plugin, AgentContext } from \"react-grab/core\";\nimport { DEFAULT_MCP_PORT, HEALTH_CHECK_TIMEOUT_MS } from \"./constants.js\";\n\ninterface McpPluginOptions {\n port?: number;\n}\n\nconst sendContextToServer = async (\n contextUrl: string,\n content: string[],\n prompt?: string,\n): Promise<void> => {\n await fetch(contextUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content, prompt }),\n }).catch(() => {});\n};\n\nexport const createMcpPlugin = (options: McpPluginOptions = {}): Plugin => {\n const port = options.port ?? DEFAULT_MCP_PORT;\n const contextUrl = `http://localhost:${port}/context`;\n\n return {\n name: \"mcp\",\n hooks: {\n onCopySuccess: (_elements: Element[], content: string) => {\n void sendContextToServer(contextUrl, [content]);\n },\n transformAgentContext: async (context: AgentContext): Promise<AgentContext> => {\n await sendContextToServer(contextUrl, context.content, context.prompt);\n return context;\n },\n },\n };\n};\n\nconst isReactGrabApi = (value: unknown): value is ReactGrabAPI =>\n typeof value === \"object\" && value !== null && \"registerPlugin\" in value;\n\ndeclare global {\n interface Window {\n __REACT_GRAB__?: ReturnType<typeof init>;\n }\n}\n\nconst MCP_REACHABLE_KEY = \"react-grab-mcp-reachable\";\n\nconst checkIfMcpServerIsReachable = async (port: number): Promise<boolean> => {\n const cached = sessionStorage.getItem(MCP_REACHABLE_KEY);\n if (cached !== null) return cached === \"true\";\n\n const isReachable = await fetch(`http://localhost:${port}/health`, {\n signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS),\n })\n .then((response) => response.ok)\n .catch(() => false);\n\n sessionStorage.setItem(MCP_REACHABLE_KEY, String(isReachable));\n return isReachable;\n};\n\nexport const attachMcpPlugin = async (): Promise<void> => {\n if (typeof window === \"undefined\") return;\n\n const isReachable = await checkIfMcpServerIsReachable(DEFAULT_MCP_PORT);\n if (!isReachable) return;\n\n const plugin = createMcpPlugin();\n\n const attach = (api: ReactGrabAPI) => {\n api.registerPlugin(plugin);\n };\n\n const existingApi = window.__REACT_GRAB__;\n if (isReactGrabApi(existingApi)) {\n attach(existingApi);\n return;\n }\n\n window.addEventListener(\n \"react-grab:init\",\n (event: Event) => {\n if (!(event instanceof CustomEvent)) return;\n if (!isReactGrabApi(event.detail)) return;\n attach(event.detail);\n },\n { once: true },\n );\n\n // HACK: Check again after adding listener in case of race condition\n const apiAfterListener = window.__REACT_GRAB__;\n if (isReactGrabApi(apiAfterListener)) {\n attach(apiAfterListener);\n }\n};\n\nattachMcpPlugin();\n"],"mappings":"AAEA,MAAa,0BAA0B;;;ACKvC,MAAM,sBAAsB,OAC1B,YACA,SACA,WACkB;AAClB,OAAM,MAAM,YAAY;EACtB,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GAAE;GAAS;GAAQ,CAAC;EAC1C,CAAC,CAAC,YAAY,GAAG;;AAGpB,MAAa,mBAAmB,UAA4B,EAAE,KAAa;CAEzE,MAAM,aAAa,oBADN,QAAQ,QAAA,KACuB;AAE5C,QAAO;EACL,MAAM;EACN,OAAO;GACL,gBAAgB,WAAsB,YAAoB;AACnD,wBAAoB,YAAY,CAAC,QAAQ,CAAC;;GAEjD,uBAAuB,OAAO,YAAiD;AAC7E,UAAM,oBAAoB,YAAY,QAAQ,SAAS,QAAQ,OAAO;AACtE,WAAO;;GAEV;EACF;;AAGH,MAAM,kBAAkB,UACtB,OAAO,UAAU,YAAY,UAAU,QAAQ,oBAAoB;AAQrE,MAAM,oBAAoB;AAE1B,MAAM,8BAA8B,OAAO,SAAmC;CAC5E,MAAM,SAAS,eAAe,QAAQ,kBAAkB;AACxD,KAAI,WAAW,KAAM,QAAO,WAAW;CAEvC,MAAM,cAAc,MAAM,MAAM,oBAAoB,KAAK,UAAU,EACjE,QAAQ,YAAY,QAAQ,wBAAwB,EACrD,CAAC,CACC,MAAM,aAAa,SAAS,GAAG,CAC/B,YAAY,MAAM;AAErB,gBAAe,QAAQ,mBAAmB,OAAO,YAAY,CAAC;AAC9D,QAAO;;AAGT,MAAa,kBAAkB,YAA2B;AACxD,KAAI,OAAO,WAAW,YAAa;AAGnC,KAAI,CADgB,MAAM,4BAAA,KAA6C,CACrD;CAElB,MAAM,SAAS,iBAAiB;CAEhC,MAAM,UAAU,QAAsB;AACpC,MAAI,eAAe,OAAO;;CAG5B,MAAM,cAAc,OAAO;AAC3B,KAAI,eAAe,YAAY,EAAE;AAC/B,SAAO,YAAY;AACnB;;AAGF,QAAO,iBACL,oBACC,UAAiB;AAChB,MAAI,EAAE,iBAAiB,aAAc;AACrC,MAAI,CAAC,eAAe,MAAM,OAAO,CAAE;AACnC,SAAO,MAAM,OAAO;IAEtB,EAAE,MAAM,MAAM,CACf;CAGD,MAAM,mBAAmB,OAAO;AAChC,KAAI,eAAe,iBAAiB,CAClC,QAAO,iBAAiB;;AAI5B,iBAAiB"}
|