@gui-chat-plugin/mulmocast 0.0.1

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/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # @gui-chat-plugin/mulmocast
2
+
3
+ [![npm version](https://badge.fury.io/js/%40gui-chat-plugin%2Fmulmocast.svg)](https://www.npmjs.com/package/@gui-chat-plugin/mulmocast)
4
+
5
+ Mulmocast presentation plugin for GUI Chat applications. Create presentations with AI-generated images and optional video output.
6
+
7
+ ## Features
8
+
9
+ - Create presentations from MulmoScript
10
+ - AI-powered image generation for each beat
11
+ - Video generation support (requires server-side implementation)
12
+ - MulmoViewer integration for playback
13
+ - Download MulmoScript and generated videos
14
+ - Inline script editing
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ yarn add @gui-chat-plugin/mulmocast
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ ### Vue Integration
25
+
26
+ ```typescript
27
+ // In src/tools/index.ts
28
+ import MulmocastPlugin from "@gui-chat-plugin/mulmocast/vue";
29
+
30
+ const pluginList = [
31
+ // ... other plugins
32
+ MulmocastPlugin,
33
+ ];
34
+
35
+ // In src/main.ts
36
+ import "@gui-chat-plugin/mulmocast/style.css";
37
+ ```
38
+
39
+ ### Core-only Usage
40
+
41
+ ```typescript
42
+ import { executeMulmocast, TOOL_DEFINITION } from "@gui-chat-plugin/mulmocast";
43
+
44
+ // Create a presentation
45
+ const result = await executeMulmocast(context, {
46
+ title: "Introduction to AI",
47
+ lang: "en",
48
+ beats: [
49
+ {
50
+ text: "Welcome to this presentation about artificial intelligence.",
51
+ imagePrompt: "A futuristic AI robot in a modern office",
52
+ },
53
+ {
54
+ text: "Let's explore how AI is transforming our world.",
55
+ },
56
+ ],
57
+ });
58
+ ```
59
+
60
+ ## API
61
+
62
+ ### MulmocastArgs
63
+
64
+ ```typescript
65
+ interface MulmocastArgs {
66
+ title: string;
67
+ lang: string;
68
+ beats: MulmocastBeat[];
69
+ }
70
+
71
+ interface MulmocastBeat {
72
+ text: string; // Text spoken by presenter
73
+ imagePrompt?: string; // Optional image generation prompt
74
+ }
75
+ ```
76
+
77
+ ### MulmocastToolData
78
+
79
+ ```typescript
80
+ interface MulmocastToolData {
81
+ mulmoScript: MulmoScript;
82
+ images?: Record<string, string>;
83
+ moviePath?: string;
84
+ viewerJsonPath?: string;
85
+ }
86
+ ```
87
+
88
+ ## Requirements
89
+
90
+ This plugin requires:
91
+
92
+ - `mulmocast` npm package for MulmoScript types
93
+ - `mulmocast-viewer` npm package for playback
94
+ - Host application to provide `generateImageWithBackend` function
95
+ - Optional: Server endpoints for video generation (`/api/generate-movie`, `/api/viewer-json`, `/api/download-movie`)
96
+
97
+ ## Development
98
+
99
+ ```bash
100
+ # Install dependencies
101
+ yarn install
102
+
103
+ # Run demo
104
+ yarn dev
105
+
106
+ # Build
107
+ yarn build
108
+
109
+ # Lint
110
+ yarn lint
111
+ ```
112
+
113
+ ## Test Prompts
114
+
115
+ Try these prompts to test the plugin:
116
+
117
+ 1. "Create a short presentation about the history of the internet with 3 slides"
118
+ 2. "Make a presentation explaining how photosynthesis works"
119
+ 3. "Generate a presentation introducing the solar system to children"
120
+
121
+ ## License
122
+
123
+ MIT
@@ -0,0 +1,41 @@
1
+ export declare const TOOL_NAME = "showPresentation";
2
+ export declare const TOOL_DEFINITION: {
3
+ type: "function";
4
+ name: string;
5
+ description: string;
6
+ parameters: {
7
+ type: "object";
8
+ properties: {
9
+ title: {
10
+ type: string;
11
+ description: string;
12
+ };
13
+ lang: {
14
+ type: string;
15
+ description: string;
16
+ };
17
+ beats: {
18
+ type: string;
19
+ items: {
20
+ type: string;
21
+ properties: {
22
+ text: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ imagePrompt: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ };
31
+ required: string[];
32
+ additionalProperties: boolean;
33
+ };
34
+ minItems: number;
35
+ };
36
+ };
37
+ required: string[];
38
+ additionalProperties: boolean;
39
+ };
40
+ };
41
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/core/definition.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,qBAAqB,CAAC;AAE5C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsC3B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type { MulmocastToolData, MulmocastBeat, MulmocastArgs, MulmocastResult, } from "./types";
2
+ export { TOOL_NAME, TOOL_DEFINITION } from "./definition";
3
+ export { pluginCore, showPresentation, executeMulmocast } from "./plugin";
4
+ export { samples } from "./samples";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ToolContext, ToolPluginCore } from "gui-chat-protocol";
2
+ import type { MulmocastArgs, MulmocastToolData, MulmocastResult } from "./types";
3
+ import { TOOL_NAME, TOOL_DEFINITION } from "./definition";
4
+ export declare const showPresentation: (context: ToolContext, args: MulmocastArgs) => Promise<MulmocastResult>;
5
+ export declare const pluginCore: ToolPluginCore<MulmocastToolData, unknown, MulmocastArgs>;
6
+ export { TOOL_NAME, TOOL_DEFINITION };
7
+ export declare const executeMulmocast: (context: ToolContext, args: MulmocastArgs) => Promise<MulmocastResult>;
8
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE1D,eAAO,MAAM,gBAAgB,GAC3B,SAAS,WAAW,EACpB,MAAM,aAAa,KAClB,OAAO,CAAC,eAAe,CAgGzB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,iBAAiB,EAAE,OAAO,EAAE,aAAa,CAQhF,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;AACtC,eAAO,MAAM,gBAAgB,YA/GlB,WAAW,QACd,aAAa,KAClB,OAAO,CAAC,eAAe,CA6GsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolSample } from "gui-chat-protocol";
2
+ export declare const samples: ToolSample[];
3
+ //# sourceMappingURL=samples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samples.d.ts","sourceRoot":"","sources":["../../src/core/samples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,eAAO,MAAM,OAAO,EAAE,UAAU,EAiB/B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ToolResult } from "gui-chat-protocol";
2
+ import type { MulmoScript } from "mulmocast";
3
+ export interface MulmocastToolData {
4
+ mulmoScript: MulmoScript;
5
+ images?: Record<string, string>;
6
+ moviePath?: string;
7
+ viewerJsonPath?: string;
8
+ }
9
+ export interface MulmocastBeat {
10
+ text: string;
11
+ imagePrompt?: string;
12
+ }
13
+ export interface MulmocastArgs {
14
+ title: string;
15
+ lang: string;
16
+ beats: MulmocastBeat[];
17
+ }
18
+ export type MulmocastResult = ToolResult<MulmocastToolData>;
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC"}
package/dist/core.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-Dq4GS0bB.cjs");exports.TOOL_DEFINITION=e.TOOL_DEFINITION;exports.TOOL_NAME=e.TOOL_NAME;exports.executeMulmocast=e.executeMulmocast;exports.pluginCore=e.pluginCore;exports.samples=e.samples;exports.showPresentation=e.showPresentation;
package/dist/core.js ADDED
@@ -0,0 +1,9 @@
1
+ import { T as e, a as o, e as t, p as O, s as p, b as r } from "./index-Cr5DHTE4.js";
2
+ export {
3
+ e as TOOL_DEFINITION,
4
+ o as TOOL_NAME,
5
+ t as executeMulmocast,
6
+ O as pluginCore,
7
+ p as samples,
8
+ r as showPresentation
9
+ };
@@ -0,0 +1,164 @@
1
+ const P = "showPresentation", I = {
2
+ type: "function",
3
+ name: P,
4
+ description: "Let MulmoCast to process a given MulmoScript to generate a presentation of a given topic or story.",
5
+ parameters: {
6
+ type: "object",
7
+ properties: {
8
+ title: { type: "string", description: "The title of the presentation" },
9
+ lang: {
10
+ type: "string",
11
+ description: "The language of the presentation, such as en, ja, etc."
12
+ },
13
+ beats: {
14
+ type: "array",
15
+ items: {
16
+ type: "object",
17
+ properties: {
18
+ text: {
19
+ type: "string",
20
+ description: "The text to be spoken by the presenter, which is also used to generate an image if there is no imagePrompt. Typically 50 to 70 words."
21
+ },
22
+ imagePrompt: {
23
+ type: "string",
24
+ description: "Optional prompt to be used to generate an image. Typically 50 to 70 words. Do not specify the image style."
25
+ }
26
+ },
27
+ required: ["text"],
28
+ additionalProperties: !1
29
+ },
30
+ minItems: 1
31
+ }
32
+ },
33
+ required: ["title", "lang", "beats"],
34
+ additionalProperties: !1
35
+ }
36
+ }, a = [];
37
+ for (let e = 0; e < 256; ++e)
38
+ a.push((e + 256).toString(16).slice(1));
39
+ function f(e, t = 0) {
40
+ return (a[e[t + 0]] + a[e[t + 1]] + a[e[t + 2]] + a[e[t + 3]] + "-" + a[e[t + 4]] + a[e[t + 5]] + "-" + a[e[t + 6]] + a[e[t + 7]] + "-" + a[e[t + 8]] + a[e[t + 9]] + "-" + a[e[t + 10]] + a[e[t + 11]] + a[e[t + 12]] + a[e[t + 13]] + a[e[t + 14]] + a[e[t + 15]]).toLowerCase();
41
+ }
42
+ let g;
43
+ const v = new Uint8Array(16);
44
+ function x() {
45
+ if (!g) {
46
+ if (typeof crypto > "u" || !crypto.getRandomValues)
47
+ throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
48
+ g = crypto.getRandomValues.bind(crypto);
49
+ }
50
+ return g(v);
51
+ }
52
+ const D = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), u = { randomUUID: D };
53
+ function M(e, t, r) {
54
+ var s;
55
+ if (u.randomUUID && !e)
56
+ return u.randomUUID();
57
+ e = e || {};
58
+ const i = e.random ?? ((s = e.rng) == null ? void 0 : s.call(e)) ?? x();
59
+ if (i.length < 16)
60
+ throw new Error("Random bytes length must be >= 16");
61
+ return i[6] = i[6] & 15 | 64, i[8] = i[8] & 63 | 128, f(i);
62
+ }
63
+ const h = async (e, t) => {
64
+ var d, p;
65
+ const { title: r, beats: i } = t, s = (d = e.app) != null && d.loadBlankImageBase64 ? await e.app.loadBlankImageBase64() : "", y = s ? [s] : [], c = i.map((m) => ({
66
+ id: M(),
67
+ speaker: "Presenter",
68
+ text: m.text,
69
+ imagePrompt: m.imagePrompt
70
+ })), l = {};
71
+ if ((p = e.app) != null && p.generateImageWithBackend) {
72
+ const m = c.map(async (n) => {
73
+ const b = n.imagePrompt || `generate image appropriate for the text. <text>${n.text}</text>. Let the art convey the story and emotions without text. Use the last image for the aspect ratio.`;
74
+ try {
75
+ const o = await e.app.generateImageWithBackend(
76
+ b,
77
+ y,
78
+ e
79
+ );
80
+ if (o.success && o.imageData)
81
+ return { id: n.id, imageData: o.imageData };
82
+ } catch (o) {
83
+ console.error("Failed to generate image for beat:", o);
84
+ }
85
+ return { id: n.id, imageData: null };
86
+ });
87
+ (await Promise.all(m)).forEach((n) => {
88
+ n.imageData && (l[n.id] = n.imageData);
89
+ });
90
+ }
91
+ const w = {
92
+ $mulmocast: { version: "1.1" },
93
+ canvasSize: {
94
+ width: 1536,
95
+ height: 1080
96
+ },
97
+ imageParams: {
98
+ provider: "google",
99
+ model: "gemini-2.5-flash-image-preview"
100
+ },
101
+ audioParams: {
102
+ padding: 0.2,
103
+ introPadding: 0.5,
104
+ closingPadding: 0.5,
105
+ outroPadding: 0.5,
106
+ bgmVolume: 0.1,
107
+ audioVolume: 1.5,
108
+ suppressSpeech: !1
109
+ },
110
+ soundEffectParams: {},
111
+ speechParams: {
112
+ speakers: {
113
+ Presenter: {
114
+ voiceId: "shimmer"
115
+ }
116
+ }
117
+ },
118
+ title: r,
119
+ lang: t.lang,
120
+ beats: c
121
+ };
122
+ return {
123
+ message: `Mulmocast has processed the MulmoScript for "${r}" with ${i.length} beats. Movie generation will begin automatically.`,
124
+ title: r,
125
+ instructions: "Acknowledge that all the images were successfully generated and that the movie is being generated.",
126
+ data: {
127
+ mulmoScript: w,
128
+ images: l
129
+ }
130
+ };
131
+ }, k = {
132
+ toolDefinition: I,
133
+ execute: h,
134
+ generatingMessage: "Processing with Mulmocast...",
135
+ waitingMessage: "Tell the user that the script was written and we are generating images and video with Mulmocast.",
136
+ isEnabled: () => !0,
137
+ backends: ["imageGen", "mulmocast"]
138
+ }, A = h, S = [
139
+ {
140
+ name: "Simple Presentation",
141
+ args: {
142
+ title: "Introduction to AI",
143
+ lang: "en",
144
+ beats: [
145
+ {
146
+ text: "Artificial Intelligence is transforming the way we live and work. From voice assistants to self-driving cars, AI is becoming an integral part of our daily lives.",
147
+ imagePrompt: "A futuristic city with AI-powered robots and flying vehicles"
148
+ },
149
+ {
150
+ text: "Machine learning, a subset of AI, enables computers to learn from data without being explicitly programmed. This technology powers recommendation systems and fraud detection."
151
+ }
152
+ ]
153
+ }
154
+ }
155
+ ];
156
+ export {
157
+ I as T,
158
+ P as a,
159
+ h as b,
160
+ A as e,
161
+ k as p,
162
+ S as s,
163
+ M as v
164
+ };
@@ -0,0 +1 @@
1
+ "use strict";const y="showPresentation",w={type:"function",name:y,description:"Let MulmoCast to process a given MulmoScript to generate a presentation of a given topic or story.",parameters:{type:"object",properties:{title:{type:"string",description:"The title of the presentation"},lang:{type:"string",description:"The language of the presentation, such as en, ja, etc."},beats:{type:"array",items:{type:"object",properties:{text:{type:"string",description:"The text to be spoken by the presenter, which is also used to generate an image if there is no imagePrompt. Typically 50 to 70 words."},imagePrompt:{type:"string",description:"Optional prompt to be used to generate an image. Typically 50 to 70 words. Do not specify the image style."}},required:["text"],additionalProperties:!1},minItems:1}},required:["title","lang","beats"],additionalProperties:!1}},a=[];for(let e=0;e<256;++e)a.push((e+256).toString(16).slice(1));function v(e,t=0){return(a[e[t+0]]+a[e[t+1]]+a[e[t+2]]+a[e[t+3]]+"-"+a[e[t+4]]+a[e[t+5]]+"-"+a[e[t+6]]+a[e[t+7]]+"-"+a[e[t+8]]+a[e[t+9]]+"-"+a[e[t+10]]+a[e[t+11]]+a[e[t+12]]+a[e[t+13]]+a[e[t+14]]+a[e[t+15]]).toLowerCase()}let g;const x=new Uint8Array(16);function D(){if(!g){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");g=crypto.getRandomValues.bind(crypto)}return g(x)}const M=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),h={randomUUID:M};function b(e,t,r){var s;if(h.randomUUID&&!e)return h.randomUUID();e=e||{};const i=e.random??((s=e.rng)==null?void 0:s.call(e))??D();if(i.length<16)throw new Error("Random bytes length must be >= 16");return i[6]=i[6]&15|64,i[8]=i[8]&63|128,v(i)}const c=async(e,t)=>{var p,u;const{title:r,beats:i}=t,s=(p=e.app)!=null&&p.loadBlankImageBase64?await e.app.loadBlankImageBase64():"",I=s?[s]:[],l=i.map(m=>({id:b(),speaker:"Presenter",text:m.text,imagePrompt:m.imagePrompt})),d={};if((u=e.app)!=null&&u.generateImageWithBackend){const m=l.map(async n=>{const f=n.imagePrompt||`generate image appropriate for the text. <text>${n.text}</text>. Let the art convey the story and emotions without text. Use the last image for the aspect ratio.`;try{const o=await e.app.generateImageWithBackend(f,I,e);if(o.success&&o.imageData)return{id:n.id,imageData:o.imageData}}catch(o){console.error("Failed to generate image for beat:",o)}return{id:n.id,imageData:null}});(await Promise.all(m)).forEach(n=>{n.imageData&&(d[n.id]=n.imageData)})}const P={$mulmocast:{version:"1.1"},canvasSize:{width:1536,height:1080},imageParams:{provider:"google",model:"gemini-2.5-flash-image-preview"},audioParams:{padding:.2,introPadding:.5,closingPadding:.5,outroPadding:.5,bgmVolume:.1,audioVolume:1.5,suppressSpeech:!1},soundEffectParams:{},speechParams:{speakers:{Presenter:{voiceId:"shimmer"}}},title:r,lang:t.lang,beats:l};return{message:`Mulmocast has processed the MulmoScript for "${r}" with ${i.length} beats. Movie generation will begin automatically.`,title:r,instructions:"Acknowledge that all the images were successfully generated and that the movie is being generated.",data:{mulmoScript:P,images:d}}},T={toolDefinition:w,execute:c,generatingMessage:"Processing with Mulmocast...",waitingMessage:"Tell the user that the script was written and we are generating images and video with Mulmocast.",isEnabled:()=>!0,backends:["imageGen","mulmocast"]},U=c,k=[{name:"Simple Presentation",args:{title:"Introduction to AI",lang:"en",beats:[{text:"Artificial Intelligence is transforming the way we live and work. From voice assistants to self-driving cars, AI is becoming an integral part of our daily lives.",imagePrompt:"A futuristic city with AI-powered robots and flying vehicles"},{text:"Machine learning, a subset of AI, enables computers to learn from data without being explicitly programmed. This technology powers recommendation systems and fraud detection."}]}}];exports.TOOL_DEFINITION=w;exports.TOOL_NAME=y;exports.executeMulmocast=U;exports.pluginCore=T;exports.samples=k;exports.showPresentation=c;exports.v4=b;
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-Dq4GS0bB.cjs");exports.TOOL_DEFINITION=e.TOOL_DEFINITION;exports.TOOL_NAME=e.TOOL_NAME;exports.executeMulmocast=e.executeMulmocast;exports.pluginCore=e.pluginCore;exports.samples=e.samples;exports.showPresentation=e.showPresentation;
@@ -0,0 +1,2 @@
1
+ export * from "./core/index";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ import { T as e, a as o, e as t, p as O, s as p, b as r } from "./index-Cr5DHTE4.js";
2
+ export {
3
+ e as TOOL_DEFINITION,
4
+ o as TOOL_NAME,
5
+ t as executeMulmocast,
6
+ O as pluginCore,
7
+ p as samples,
8
+ r as showPresentation
9
+ };
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-600:oklch(57.7% .245 27.325);--color-green-100:oklch(96.2% .044 156.743);--color-green-600:oklch(62.7% .194 149.214);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-800:oklch(43.2% .095 166.913);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-white:#fff;--spacing:.25rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--font-weight-medium:500;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.relative{position:relative}.m-0{margin:calc(var(--spacing)*0)}.mx-auto{margin-inline:auto}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.block{display:block}.flex{display:flex}.aspect-video{aspect-ratio:var(--aspect-video)}.h-full{height:100%}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-\[200px\]{max-width:200px}.flex-shrink{flex-shrink:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-y{resize:vertical}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-emerald-200{border-color:var(--color-emerald-200)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-indigo-200{border-color:var(--color-indigo-200)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-green-100{background-color:var(--color-green-100)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-white{background-color:var(--color-white)}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.font-mono{font-family:var(--font-mono)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.whitespace-pre-wrap{white-space:pre-wrap}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-green-600{color:var(--color-green-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.hover\:border-indigo-300:hover{border-color:var(--color-indigo-300)}.hover\:bg-indigo-200:hover{background-color:var(--color-indigo-200)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:ring-\[3px\]:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-indigo-500\/10:focus{--tw-ring-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.focus\:ring-indigo-500\/10:focus{--tw-ring-color:color-mix(in oklab,var(--color-indigo-500)10%,transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}.mulmocast-container[data-v-61efea8c]{width:100%;height:100%;display:flex;flex-direction:column;background:#fff}.mulmocast-content-wrapper[data-v-61efea8c]{flex:1;overflow-y:auto;min-height:0}.header-row[data-v-61efea8c]{display:flex;align-items:center;justify-content:space-between;margin-bottom:1em}.document-title[data-v-61efea8c]{font-size:2em;margin:0}.button-group[data-v-61efea8c]{display:flex;gap:.5em}.download-btn[data-v-61efea8c]{padding:.5em 1em;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:.9em;display:flex;align-items:center;gap:.5em}.download-btn-green[data-v-61efea8c]{background-color:#4caf50}.download-btn-orange[data-v-61efea8c]{background-color:#ff9800}.download-btn-blue[data-v-61efea8c]{background-color:#2196f3}.download-btn-disabled[data-v-61efea8c]{background-color:#ccc;cursor:not-allowed}.download-btn .material-icons[data-v-61efea8c]{font-size:1.2em}.beat-container[data-v-61efea8c]{margin-bottom:1em}.error-message[data-v-61efea8c]{margin:1em 0;padding:1em;background:#ffebee;border-radius:4px;color:#c62828}.viewer-container[data-v-61efea8c]{margin:1em 0;position:relative}.video-player[data-v-61efea8c],.beat-image[data-v-61efea8c]{max-width:100%;margin:1em 0}.beat-text[data-v-61efea8c]{margin-bottom:1em}.script-source[data-v-61efea8c]{padding:.5rem;background:#f5f5f5;border-top:1px solid #e0e0e0;font-family:monospace;font-size:.85rem;flex-shrink:0}.script-source summary[data-v-61efea8c]{cursor:pointer;-webkit-user-select:none;user-select:none;padding:.5rem;background:#e8e8e8;border-radius:4px;font-weight:500;color:#333}.script-source[open] summary[data-v-61efea8c]{margin-bottom:.5rem}.script-source summary[data-v-61efea8c]:hover{background:#d8d8d8}.error[data-v-61efea8c]{padding:.5rem;background:#ff000020;color:#f66;font-family:monospace;border-radius:4px;margin-bottom:.5rem}.script-editor[data-v-61efea8c]{width:100%;height:40vh;padding:1rem;background:#fff;border:1px solid #ccc;border-radius:4px;color:#333;font-family:Courier New,monospace;font-size:.9rem;resize:vertical;margin-bottom:.5rem;line-height:1.5}.script-editor[data-v-61efea8c]:focus{outline:none;border-color:#4caf50;box-shadow:0 0 0 2px #4caf501a}.apply-btn[data-v-61efea8c]{padding:.5rem 1rem;background:#4caf50;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:.9rem;transition:background .2s;font-weight:500}.apply-btn[data-v-61efea8c]:hover{background:#45a049}.apply-btn[data-v-61efea8c]:active{background:#3d8b40}.apply-btn[data-v-61efea8c]:disabled{background:#ccc;color:#666;cursor:not-allowed;opacity:.6}.apply-btn[data-v-61efea8c]:disabled:hover{background:#ccc}@keyframes spin-61efea8c{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.animate-spin[data-v-61efea8c]{animation:spin-61efea8c 1s linear infinite}.nav-button[data-v-61efea8c]{position:absolute;top:50%;transform:translateY(-50%);width:48px;height:48px;background:#00000080;color:#fff;border:none;border-radius:50%;font-size:32px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;z-index:10;-webkit-user-select:none;user-select:none}.nav-button[data-v-61efea8c]:hover{background:#000000b3;transform:translateY(-50%) scale(1.1)}.nav-button[data-v-61efea8c]:active{transform:translateY(-50%) scale(.95)}.nav-button-prev[data-v-61efea8c]{left:0}.nav-button-next[data-v-61efea8c]{right:0}
@@ -0,0 +1,8 @@
1
+ import type { ToolResult } from "gui-chat-protocol";
2
+ import type { MulmocastToolData } from "../core/types";
3
+ type __VLS_Props = {
4
+ result: ToolResult<MulmocastToolData>;
5
+ };
6
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=Preview.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Preview.vue.d.ts","sourceRoot":"","sources":["../../src/vue/Preview.vue"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;CACvC,CAAC;;AA0EF,wBAMG"}
@@ -0,0 +1,14 @@
1
+ import type { ToolResult } from "gui-chat-protocol";
2
+ import type { MulmocastToolData } from "../core/types";
3
+ type __VLS_Props = {
4
+ selectedResult: ToolResult<MulmocastToolData> | null;
5
+ setMute?: (muted: boolean) => void;
6
+ pluginConfigs?: Record<string, unknown>;
7
+ };
8
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
9
+ updateResult: (result: ToolResult<MulmocastToolData, unknown>) => any;
10
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
11
+ onUpdateResult?: ((result: ToolResult<MulmocastToolData, unknown>) => any) | undefined;
12
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ export default _default;
14
+ //# sourceMappingURL=View.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"View.vue.d.ts","sourceRoot":"","sources":["../../src/vue/View.vue"],"names":[],"mappings":"AA0sBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAcvD,KAAK,WAAW,GAAG;IACjB,cAAc,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IACrD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC,CAAC;;;;;;AAgnBF,wBAOG"}
@@ -0,0 +1,17 @@
1
+ import "../style.css";
2
+ import type { ToolPlugin } from "gui-chat-protocol/vue";
3
+ import type { MulmocastToolData, MulmocastArgs } from "../core/types";
4
+ import View from "./View.vue";
5
+ import Preview from "./Preview.vue";
6
+ export declare const TOOL_NAME = "showPresentation";
7
+ export declare const SYSTEM_PROMPT = "Call the showPresentation API to display presentations when the user is asking for a presentation.";
8
+ export declare const plugin: ToolPlugin<MulmocastToolData, unknown, MulmocastArgs>;
9
+ export type { MulmocastToolData, MulmocastBeat, MulmocastArgs, MulmocastResult, } from "../core/types";
10
+ export { TOOL_DEFINITION, executeMulmocast, pluginCore, } from "../core/plugin";
11
+ export { samples } from "../core/samples";
12
+ export { View, Preview };
13
+ declare const _default: {
14
+ plugin: ToolPlugin<MulmocastToolData, unknown, MulmocastArgs, import("gui-chat-protocol/vue").InputHandler, Record<string, unknown>>;
15
+ };
16
+ export default _default;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,OAAO,MAAM,eAAe,CAAC;AAEpC,eAAO,MAAM,SAAS,qBAAqB,CAAC;AAE5C,eAAO,MAAM,aAAa,uGAAmG,CAAC;AAE9H,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,iBAAiB,EAAE,OAAO,EAAE,aAAa,CAMxE,CAAC;AAEF,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,GACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;;;AAEzB,wBAA0B"}