@agrhub/engine-pixi 1.4.1 → 1.4.3

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.
@@ -1,5 +1,5 @@
1
- (function(M,et){typeof exports=="object"&&typeof module<"u"?et(exports,require("wrapbox"),require("opfs-tools"),require("wave-resampler"),require("gsap"),require("gsap/PixiPlugin"),require("pixi.js"),require("@agrhub/core"),require("pixi-filters"),require("nanoid"),require("gl-transitions"),require("microdiff")):typeof define=="function"&&define.amd?define(["exports","wrapbox","opfs-tools","wave-resampler","gsap","gsap/PixiPlugin","pixi.js","@agrhub/core","pixi-filters","nanoid","gl-transitions","microdiff"],et):(M=typeof globalThis<"u"?globalThis:M||self,et(M.AgrhubEnginePixi={},M.wrapbox,M.opfsTools,M.waveResampler,M.gsap,M.gsapPixiPlugin,M.pixi.js,M.agrhubCore,M.pixiFilters,M.nanoid,M.glTransitions,M.microdiff))})(this,(function(M,et,it,mi,ht,ye,m,xe,j,qt,bt,gi){"use strict";function we(l){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(l){for(const e in l)if(e!=="default"){const i=Object.getOwnPropertyDescriptor(l,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:()=>l[e]})}}return t.default=l,Object.freeze(t)}const vi=we(mi),yi=we(m),xi={0:"debug",1:"info",2:"warn",3:"error"};function wi(l){if(l instanceof Error)return String(l);if(typeof l=="object"&&l!==null)try{return JSON.stringify(l,(t,e)=>e instanceof Error?String(e):e)}catch{return String(l)}return String(l)}function bi(){const l=new Date,t=i=>i.toString().padStart(2,"0"),e=l.getMilliseconds().toString().padStart(3,"0");return`${t(l.getHours())}:${t(l.getMinutes())}:${t(l.getSeconds())}.${e}`}class Ci{threshold=1;history=[];debug=(...t)=>this.log(0,console.debug,t);info=(...t)=>this.log(1,console.info,t);warn=(...t)=>this.log(2,console.warn,t);error=(...t)=>this.log(3,console.error,t);log(t,e,i){t>=this.threshold&&(e(...i),this.history.push({level:xi[t],time:bi(),args:i}))}setThreshold(t){this.threshold=t}getThreshold(){return this.threshold}createTagged(t){return{debug:(...e)=>this.debug(t,...e),info:(...e)=>this.info(t,...e),warn:(...e)=>this.warn(t,...e),error:(...e)=>this.error(t,...e)}}dump(){return this.history.map(({level:t,time:e,args:i})=>`[${t.toUpperCase()}][${e}] ${i.map(wi).join(" ")}`).join(`
2
- `)}}const ot=new Ci,Q={debug:ot.debug,info:ot.info,warn:ot.warn,error:ot.error,setLogLevel:l=>{const t=l;t===Q.debug?ot.setThreshold(0):t===Q.info?ot.setThreshold(1):t===Q.warn?ot.setThreshold(2):t===Q.error&&ot.setThreshold(3)},create:l=>ot.createTagged(l),dump:async()=>ot.dump()};function Ti(l){const t=new Float32Array(l.map(i=>i.length).reduce((i,s)=>i+s));let e=0;for(const i of l)t.set(i,e),e+=i.length;return t}function Si(l){const t=[];for(let e=0;e<l.length;e+=1)for(let i=0;i<l[e].length;i+=1)t[i]==null&&(t[i]=[]),t[i].push(l[e][i]);return t.map(Ti)}function be(l){if(l.format==="f32-planar"){const t=[];for(let e=0;e<l.numberOfChannels;e+=1){const i=l.allocationSize({planeIndex:e}),s=new ArrayBuffer(i);l.copyTo(s,{planeIndex:e}),t.push(new Float32Array(s))}return t}else if(l.format==="f32"){const t=new ArrayBuffer(l.allocationSize({planeIndex:0}));return l.copyTo(t,{planeIndex:0}),ki(new Float32Array(t),l.numberOfChannels)}else if(l.format==="s16"){const t=new ArrayBuffer(l.allocationSize({planeIndex:0}));return l.copyTo(t,{planeIndex:0}),Ai(new Int16Array(t),l.numberOfChannels)}throw Error("Unsupported audio data format")}function Ai(l,t){const e=l.length/t,i=Array.from({length:t},()=>new Float32Array(e));for(let s=0;s<e;s++)for(let r=0;r<t;r++){const o=l[s*t+r];i[r][s]=o/32768}return i}function ki(l,t){const e=l.length/t,i=Array.from({length:t},()=>new Float32Array(e));for(let s=0;s<e;s++)for(let r=0;r<t;r++)i[r][s]=l[s*t+r];return i}function _t(l){return Array(l.numberOfChannels).fill(0).map((t,e)=>l.getChannelData(e))}function Ce(l){const t=Math.max(...l.map(i=>i[0]?.length??0)),e=new Float32Array(t*2);for(let i=0;i<t;i++){let s=0,r=0;for(let o=0;o<l.length;o++){const a=l[o][0]?.[i]??0,n=l[o][1]?.[i]??a;s+=a,r+=n}e[i]=s,e[i+t]=r}return e}async function Fi(l,t,e){const i=l.length,s=Array(e.chanCount).fill(0).map(()=>new Float32Array(0));if(i===0)return s;const r=Math.max(...l.map(c=>c.length));if(r===0)return s;if(globalThis.OfflineAudioContext==null)return l.map(c=>new Float32Array(vi.resample(c,t,e.rate,{method:"sinc",LPF:!1})));const o=new globalThis.OfflineAudioContext(e.chanCount,r*e.rate/t,e.rate),a=o.createBufferSource(),n=o.createBuffer(i,r,t);return l.forEach((c,h)=>n.copyToChannel(new Float32Array(c),h)),a.buffer=n,a.connect(o.destination),a.start(),_t(await o.startRendering())}function $t(l,t,e){const i=e-t,s=new Float32Array(i);let r=0;for(;r<i;)s[r]=l[(t+r)%l.length],r+=1;return s}function Te(l,t){const e=Math.floor(l.length/t),i=new Float32Array(e);for(let s=0;s<e;s++){const r=s*t,o=Math.floor(r),a=r-o;o+1<l.length?i[s]=l[o]*(1-a)+l[o+1]*a:i[s]=l[o]}return i}function Ct(l,t){const e=Math.max(0,Math.min(1,l));return!t||t==="linear"?e:t==="ease-in"?e*e:t==="ease-out"?e*(2-e):t==="ease-in-out"?e<.5?2*e*e:-1+(4-2*e)*e:e}function Ri(l,t,e,i,s,r){if(!l||l.length===0||l[0].length===0)return;const a=l[0].length/i*1e6,n=t-a,c=s!==void 0&&s.duration>0,h=r!==void 0&&r.duration>0;if(!c&&!h)return;const d=c?s.duration*1e3:0,f=h?r.duration*1e3:0;for(const u of l)for(let p=0;p<u.length;p++){const g=n+p/i*1e6;let v=1;if(c&&g<d){const x=g/d;v*=Ct(x,s.curve)}if(h){const x=e-f;if(g>=x){const T=1-(g-x)/f;v*=Ct(T,r.curve)}}u[p]*=Math.max(0,Math.min(1,v))}}const Mi=[{codec:"mp4a.40.2",codecType:"aac",sampleRate:48e3,channelCount:2},{codec:"opus",codecType:"opus",sampleRate:48e3,channelCount:2}];let Tt=null;async function Oi(l){if(typeof AudioEncoder>"u")return!1;try{return(await AudioEncoder.isConfigSupported({codec:l.codec,sampleRate:l.sampleRate,numberOfChannels:l.channelCount})).supported??!1}catch{return!1}}async function Ei(){if(Tt!==null)return Tt;for(const t of Mi)if(await Oi(t))return Tt={...t},Tt;const l={codec:"opus",codecType:"opus",sampleRate:48e3,channelCount:2};return console.warn("[AudioCodec] No supported codec found, falling back to Opus"),Tt=l,l}function Gt(){return Tt}const Di={aac:"mp4a.40.2",opus:"opus"};async function Pi(l,t,e){if(typeof AudioEncoder>"u")return null;const i=l==="opus"?"opus":"aac",s=[{codecType:i,sampleRate:t},...t!==44100?[{codecType:i,sampleRate:44100}]:[],...i!=="opus"?[{codecType:"opus",sampleRate:48e3}]:[]];for(const r of s)try{const{supported:o}=await AudioEncoder.isConfigSupported({codec:Di[r.codecType],sampleRate:r.sampleRate,numberOfChannels:e});if(o)return(r.codecType!==i||r.sampleRate!==t)&&console.warn(`[AudioCodec] ${i} @ ${t}Hz is not encodable here; using ${r.codecType} @ ${r.sampleRate}Hz`),r}catch{}return console.warn("[AudioCodec] No encodable audio configuration found; audio will be skipped"),null}const Ii=`#version 300 es
1
+ (function(M,it){typeof exports=="object"&&typeof module<"u"?it(exports,require("wrapbox"),require("opfs-tools"),require("wave-resampler"),require("gsap"),require("gsap/PixiPlugin"),require("pixi.js"),require("@agrhub/core"),require("pixi-filters"),require("nanoid"),require("gl-transitions"),require("microdiff")):typeof define=="function"&&define.amd?define(["exports","wrapbox","opfs-tools","wave-resampler","gsap","gsap/PixiPlugin","pixi.js","@agrhub/core","pixi-filters","nanoid","gl-transitions","microdiff"],it):(M=typeof globalThis<"u"?globalThis:M||self,it(M.AgrhubEnginePixi={},M.wrapbox,M.opfsTools,M.waveResampler,M.gsap,M.gsapPixiPlugin,M.pixi.js,M.agrhubCore,M.pixiFilters,M.nanoid,M.glTransitions,M.microdiff))})(this,(function(M,it,st,xi,ut,Ce,m,Te,Q,$t,Tt,wi){"use strict";function Se(l){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(l){for(const e in l)if(e!=="default"){const i=Object.getOwnPropertyDescriptor(l,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:()=>l[e]})}}return t.default=l,Object.freeze(t)}const bi=Se(xi),Ci=Se(m),Ti={0:"debug",1:"info",2:"warn",3:"error"};function Si(l){if(l instanceof Error)return String(l);if(typeof l=="object"&&l!==null)try{return JSON.stringify(l,(t,e)=>e instanceof Error?String(e):e)}catch{return String(l)}return String(l)}function Ai(){const l=new Date,t=i=>i.toString().padStart(2,"0"),e=l.getMilliseconds().toString().padStart(3,"0");return`${t(l.getHours())}:${t(l.getMinutes())}:${t(l.getSeconds())}.${e}`}class ki{threshold=1;history=[];debug=(...t)=>this.log(0,console.debug,t);info=(...t)=>this.log(1,console.info,t);warn=(...t)=>this.log(2,console.warn,t);error=(...t)=>this.log(3,console.error,t);log(t,e,i){t>=this.threshold&&(e(...i),this.history.push({level:Ti[t],time:Ai(),args:i}))}setThreshold(t){this.threshold=t}getThreshold(){return this.threshold}createTagged(t){return{debug:(...e)=>this.debug(t,...e),info:(...e)=>this.info(t,...e),warn:(...e)=>this.warn(t,...e),error:(...e)=>this.error(t,...e)}}dump(){return this.history.map(({level:t,time:e,args:i})=>`[${t.toUpperCase()}][${e}] ${i.map(Si).join(" ")}`).join(`
2
+ `)}}const lt=new ki,Y={debug:lt.debug,info:lt.info,warn:lt.warn,error:lt.error,setLogLevel:l=>{const t=l;t===Y.debug?lt.setThreshold(0):t===Y.info?lt.setThreshold(1):t===Y.warn?lt.setThreshold(2):t===Y.error&&lt.setThreshold(3)},create:l=>lt.createTagged(l),dump:async()=>lt.dump()};function Fi(l){const t=new Float32Array(l.map(i=>i.length).reduce((i,s)=>i+s));let e=0;for(const i of l)t.set(i,e),e+=i.length;return t}function Ri(l){const t=[];for(let e=0;e<l.length;e+=1)for(let i=0;i<l[e].length;i+=1)t[i]==null&&(t[i]=[]),t[i].push(l[e][i]);return t.map(Fi)}function Ae(l){if(l.format==="f32-planar"){const t=[];for(let e=0;e<l.numberOfChannels;e+=1){const i=l.allocationSize({planeIndex:e}),s=new ArrayBuffer(i);l.copyTo(s,{planeIndex:e}),t.push(new Float32Array(s))}return t}else if(l.format==="f32"){const t=new ArrayBuffer(l.allocationSize({planeIndex:0}));return l.copyTo(t,{planeIndex:0}),Oi(new Float32Array(t),l.numberOfChannels)}else if(l.format==="s16"){const t=new ArrayBuffer(l.allocationSize({planeIndex:0}));return l.copyTo(t,{planeIndex:0}),Mi(new Int16Array(t),l.numberOfChannels)}throw Error("Unsupported audio data format")}function Mi(l,t){const e=l.length/t,i=Array.from({length:t},()=>new Float32Array(e));for(let s=0;s<e;s++)for(let r=0;r<t;r++){const o=l[s*t+r];i[r][s]=o/32768}return i}function Oi(l,t){const e=l.length/t,i=Array.from({length:t},()=>new Float32Array(e));for(let s=0;s<e;s++)for(let r=0;r<t;r++)i[r][s]=l[s*t+r];return i}function te(l){return Array(l.numberOfChannels).fill(0).map((t,e)=>l.getChannelData(e))}function ke(l){const t=Math.max(...l.map(i=>i[0]?.length??0)),e=new Float32Array(t*2);for(let i=0;i<t;i++){let s=0,r=0;for(let o=0;o<l.length;o++){const a=l[o][0]?.[i]??0,n=l[o][1]?.[i]??a;s+=a,r+=n}e[i]=s,e[i+t]=r}return e}async function Ei(l,t,e){const i=l.length,s=Array(e.chanCount).fill(0).map(()=>new Float32Array(0));if(i===0)return s;const r=Math.max(...l.map(c=>c.length));if(r===0)return s;if(globalThis.OfflineAudioContext==null)return l.map(c=>new Float32Array(bi.resample(c,t,e.rate,{method:"sinc",LPF:!1})));const o=new globalThis.OfflineAudioContext(e.chanCount,r*e.rate/t,e.rate),a=o.createBufferSource(),n=o.createBuffer(i,r,t);return l.forEach((c,h)=>n.copyToChannel(new Float32Array(c),h)),a.buffer=n,a.connect(o.destination),a.start(),te(await o.startRendering())}function ee(l,t,e){const i=e-t,s=new Float32Array(i);let r=0;for(;r<i;)s[r]=l[(t+r)%l.length],r+=1;return s}function Fe(l,t){const e=Math.floor(l.length/t),i=new Float32Array(e);for(let s=0;s<e;s++){const r=s*t,o=Math.floor(r),a=r-o;o+1<l.length?i[s]=l[o]*(1-a)+l[o+1]*a:i[s]=l[o]}return i}function St(l,t){const e=Math.max(0,Math.min(1,l));return!t||t==="linear"?e:t==="ease-in"?e*e:t==="ease-out"?e*(2-e):t==="ease-in-out"?e<.5?2*e*e:-1+(4-2*e)*e:e}function Di(l,t,e,i,s,r){if(!l||l.length===0||l[0].length===0)return;const a=l[0].length/i*1e6,n=t-a,c=s!==void 0&&s.duration>0,h=r!==void 0&&r.duration>0;if(!c&&!h)return;const d=c?s.duration*1e3:0,u=h?r.duration*1e3:0;for(const f of l)for(let p=0;p<f.length;p++){const g=n+p/i*1e6;let v=1;if(c&&g<d){const x=g/d;v*=St(x,s.curve)}if(h){const x=e-u;if(g>=x){const T=1-(g-x)/u;v*=St(T,r.curve)}}f[p]*=Math.max(0,Math.min(1,v))}}const Pi=[{codec:"mp4a.40.2",codecType:"aac",sampleRate:48e3,channelCount:2},{codec:"opus",codecType:"opus",sampleRate:48e3,channelCount:2}];let At=null;async function Ii(l){if(typeof AudioEncoder>"u")return!1;try{return(await AudioEncoder.isConfigSupported({codec:l.codec,sampleRate:l.sampleRate,numberOfChannels:l.channelCount})).supported??!1}catch{return!1}}async function Bi(){if(At!==null)return At;for(const t of Pi)if(await Ii(t))return At={...t},At;const l={codec:"opus",codecType:"opus",sampleRate:48e3,channelCount:2};return console.warn("[AudioCodec] No supported codec found, falling back to Opus"),At=l,l}function Wt(){return At}const Ni={aac:"mp4a.40.2",opus:"opus"};async function zi(l,t,e){if(typeof AudioEncoder>"u")return null;const i=l==="opus"?"opus":"aac",s=[{codecType:i,sampleRate:t},...t!==44100?[{codecType:i,sampleRate:44100}]:[],...i!=="opus"?[{codecType:"opus",sampleRate:48e3}]:[]];for(const r of s)try{const{supported:o}=await AudioEncoder.isConfigSupported({codec:Ni[r.codecType],sampleRate:r.sampleRate,numberOfChannels:e});if(o)return(r.codecType!==i||r.sampleRate!==t)&&console.warn(`[AudioCodec] ${i} @ ${t}Hz is not encodable here; using ${r.codecType} @ ${r.sampleRate}Hz`),r}catch{}return console.warn("[AudioCodec] No encodable audio configuration found; audio will be skipped"),null}const Li=`#version 300 es
3
3
  layout (location = 0) in vec4 a_position;
4
4
  layout (location = 1) in vec2 a_texCoord;
5
5
  out vec2 v_texCoord;
@@ -7,7 +7,7 @@
7
7
  gl_Position = a_position;
8
8
  v_texCoord = a_texCoord;
9
9
  }
10
- `,Bi=`#version 300 es
10
+ `,Hi=`#version 300 es
11
11
  precision mediump float;
12
12
  out vec4 FragColor;
13
13
  in vec2 v_texCoord;
@@ -47,10 +47,10 @@ void main() {
47
47
  rgba.rgb = mix(vec3(desat, desat, desat), rgba.rgb, spillVal);
48
48
  FragColor = rgba;
49
49
  }
50
- `,Ni=[-1,1,-1,-1,1,-1,1,-1,1,1,-1,1],zi=[0,1,0,0,1,0,1,0,1,1,0,1];function Li(l,t,e){const i=Se(l,l.VERTEX_SHADER,t),s=Se(l,l.FRAGMENT_SHADER,e),r=l.createProgram();if(l.attachShader(r,i),l.attachShader(r,s),l.linkProgram(r),!l.getProgramParameter(r,l.LINK_STATUS))throw Error(l.getProgramInfoLog(r)??"Unable to initialize the shader program");return r}function Se(l,t,e){const i=l.createShader(t);if(l.shaderSource(i,e),l.compileShader(i),!l.getShaderParameter(i,l.COMPILE_STATUS)){const s=l.getShaderInfoLog(i);throw l.deleteShader(i),Error(s??"An error occurred compiling the shaders")}return i}function Hi(l,t,e){l.bindTexture(l.TEXTURE_2D,e),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,l.RGBA,l.UNSIGNED_BYTE,t),l.drawArrays(l.TRIANGLES,0,6)}function Gi(l){const t=l.createTexture();if(t==null)throw Error("Create WebGL texture error");l.bindTexture(l.TEXTURE_2D,t);const e=0,i=l.RGBA,s=1,r=1,o=0,a=l.RGBA,n=l.UNSIGNED_BYTE,c=new Uint8Array([0,0,255,255]);return l.texImage2D(l.TEXTURE_2D,e,i,s,r,o,a,n,c),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),t}function Ui(l){const t="document"in globalThis?globalThis.document.createElement("canvas"):new OffscreenCanvas(l.width,l.height);t.width=l.width,t.height=l.height;const e=t.getContext("webgl2",{premultipliedAlpha:!1,alpha:!0});if(e==null)throw Error("Cant create gl context");const i=Li(e,Ii,Bi);e.useProgram(i),e.uniform3fv(e.getUniformLocation(i,"keyColor"),l.keyColor.map(n=>n/255)),e.uniform1f(e.getUniformLocation(i,"similarity"),l.similarity),e.uniform1f(e.getUniformLocation(i,"smoothness"),l.smoothness),e.uniform1f(e.getUniformLocation(i,"spill"),l.spill);const s=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,s),e.bufferData(e.ARRAY_BUFFER,new Float32Array(Ni),e.STATIC_DRAW);const r=e.getAttribLocation(i,"a_position");e.vertexAttribPointer(r,2,e.FLOAT,!1,Float32Array.BYTES_PER_ELEMENT*2,0),e.enableVertexAttribArray(r);const o=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,o),e.bufferData(e.ARRAY_BUFFER,new Float32Array(zi),e.STATIC_DRAW);const a=e.getAttribLocation(i,"a_texCoord");return e.vertexAttribPointer(a,2,e.FLOAT,!1,Float32Array.BYTES_PER_ELEMENT*2,0),e.enableVertexAttribArray(a),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,1),{canvas:t,gl:e}}function Wi(l){return l instanceof VideoFrame?{width:l.codedWidth,height:l.codedHeight}:{width:l.width,height:l.height}}function Vi(l){const e=new OffscreenCanvas(1,1).getContext("2d");e.drawImage(l,0,0);const{data:[i,s,r]}=e.getImageData(0,0,1,1);return[i,s,r]}const Yi=l=>{let t=null,e=null,i=l.keyColor,s=null;return async r=>{if((t==null||e==null||s==null)&&(i==null&&(i=Vi(r)),{canvas:t,gl:e}=Ui({...Wi(r),keyColor:i,...l}),s=Gi(e)),Hi(e,r,s),globalThis.VideoFrame!=null&&r instanceof globalThis.VideoFrame){const o=new VideoFrame(t,{alpha:"keep",timestamp:r.timestamp,duration:r.duration??void 0});return r.close(),o}return createImageBitmap(t,{imageOrientation:r instanceof ImageBitmap?"flipY":"none"})}},Qi=()=>{let l,t=16.6;self.onmessage=e=>{e.data.event==="start"&&(self.clearInterval(l),l=self.setInterval(()=>{self.postMessage({})},t)),e.data.event==="stop"&&self.clearInterval(l)}},ji=()=>{const l=new Blob([`(${Qi.toString()})()`]),t=URL.createObjectURL(l);return new Worker(t)},St=new Map;let te=1,Ut=null;globalThis.Worker!=null&&(Ut=ji(),Ut.onmessage=()=>{te+=1;for(const[l,t]of St)if(te%l===0)for(const e of t)e()});const Ji=(l,t)=>{const e=Math.max(1,Math.round(t/16.6)),i=St.get(e)??new Set;return i.add(l),St.set(e,i),St.size===1&&i.size===1&&Ut?.postMessage({event:"start"}),()=>{i.delete(l),i.size===0&&St.delete(e),St.size===0&&(te=0,Ut?.postMessage({event:"stop"}))}};function Ae(l){return new Promise(t=>{const e=Ji(()=>{e(),t()},l)})}function Zi(l){return document.createElement(l)}function Ki(l){var t="",e=new Uint8Array(l),i=e.byteLength;for(let s=0;s<i;s++)t+=String.fromCharCode(e[s]);return window.btoa(t)}async function Xi(l,t,e={}){const i=Zi("pre");i.style.cssText=`margin: 0; ${t}; position: fixed;`,i.textContent=l,document.body.appendChild(i),e.onCreated?.(i);const{width:s,height:r}=i.getBoundingClientRect();i.remove();const o=new Image;o.width=s,o.height=r;const a=e.font==null?"":`
50
+ `,Gi=[-1,1,-1,-1,1,-1,1,-1,1,1,-1,1],Ui=[0,1,0,0,1,0,1,0,1,1,0,1];function Wi(l,t,e){const i=Re(l,l.VERTEX_SHADER,t),s=Re(l,l.FRAGMENT_SHADER,e),r=l.createProgram();if(l.attachShader(r,i),l.attachShader(r,s),l.linkProgram(r),!l.getProgramParameter(r,l.LINK_STATUS))throw Error(l.getProgramInfoLog(r)??"Unable to initialize the shader program");return r}function Re(l,t,e){const i=l.createShader(t);if(l.shaderSource(i,e),l.compileShader(i),!l.getShaderParameter(i,l.COMPILE_STATUS)){const s=l.getShaderInfoLog(i);throw l.deleteShader(i),Error(s??"An error occurred compiling the shaders")}return i}function Vi(l,t,e){l.bindTexture(l.TEXTURE_2D,e),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,l.RGBA,l.UNSIGNED_BYTE,t),l.drawArrays(l.TRIANGLES,0,6)}function Yi(l){const t=l.createTexture();if(t==null)throw Error("Create WebGL texture error");l.bindTexture(l.TEXTURE_2D,t);const e=0,i=l.RGBA,s=1,r=1,o=0,a=l.RGBA,n=l.UNSIGNED_BYTE,c=new Uint8Array([0,0,255,255]);return l.texImage2D(l.TEXTURE_2D,e,i,s,r,o,a,n,c),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),t}function Qi(l){const t="document"in globalThis?globalThis.document.createElement("canvas"):new OffscreenCanvas(l.width,l.height);t.width=l.width,t.height=l.height;const e=t.getContext("webgl2",{premultipliedAlpha:!1,alpha:!0});if(e==null)throw Error("Cant create gl context");const i=Wi(e,Li,Hi);e.useProgram(i),e.uniform3fv(e.getUniformLocation(i,"keyColor"),l.keyColor.map(n=>n/255)),e.uniform1f(e.getUniformLocation(i,"similarity"),l.similarity),e.uniform1f(e.getUniformLocation(i,"smoothness"),l.smoothness),e.uniform1f(e.getUniformLocation(i,"spill"),l.spill);const s=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,s),e.bufferData(e.ARRAY_BUFFER,new Float32Array(Gi),e.STATIC_DRAW);const r=e.getAttribLocation(i,"a_position");e.vertexAttribPointer(r,2,e.FLOAT,!1,Float32Array.BYTES_PER_ELEMENT*2,0),e.enableVertexAttribArray(r);const o=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,o),e.bufferData(e.ARRAY_BUFFER,new Float32Array(Ui),e.STATIC_DRAW);const a=e.getAttribLocation(i,"a_texCoord");return e.vertexAttribPointer(a,2,e.FLOAT,!1,Float32Array.BYTES_PER_ELEMENT*2,0),e.enableVertexAttribArray(a),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,1),{canvas:t,gl:e}}function ji(l){return l instanceof VideoFrame?{width:l.codedWidth,height:l.codedHeight}:{width:l.width,height:l.height}}function Ji(l){const e=new OffscreenCanvas(1,1).getContext("2d");e.drawImage(l,0,0);const{data:[i,s,r]}=e.getImageData(0,0,1,1);return[i,s,r]}const Zi=l=>{let t=null,e=null,i=l.keyColor,s=null;return async r=>{if((t==null||e==null||s==null)&&(i==null&&(i=Ji(r)),{canvas:t,gl:e}=Qi({...ji(r),keyColor:i,...l}),s=Yi(e)),Vi(e,r,s),globalThis.VideoFrame!=null&&r instanceof globalThis.VideoFrame){const o=new VideoFrame(t,{alpha:"keep",timestamp:r.timestamp,duration:r.duration??void 0});return r.close(),o}return createImageBitmap(t,{imageOrientation:r instanceof ImageBitmap?"flipY":"none"})}},Ki=()=>{let l,t=16.6;self.onmessage=e=>{e.data.event==="start"&&(self.clearInterval(l),l=self.setInterval(()=>{self.postMessage({})},t)),e.data.event==="stop"&&self.clearInterval(l)}},Xi=()=>{const l=new Blob([`(${Ki.toString()})()`]),t=URL.createObjectURL(l);return new Worker(t)},kt=new Map;let ie=1,Vt=null;globalThis.Worker!=null&&(Vt=Xi(),Vt.onmessage=()=>{ie+=1;for(const[l,t]of kt)if(ie%l===0)for(const e of t)e()});const qi=(l,t)=>{const e=Math.max(1,Math.round(t/16.6)),i=kt.get(e)??new Set;return i.add(l),kt.set(e,i),kt.size===1&&i.size===1&&Vt?.postMessage({event:"start"}),()=>{i.delete(l),i.size===0&&kt.delete(e),kt.size===0&&(ie=0,Vt?.postMessage({event:"stop"}))}};function Me(l){return new Promise(t=>{const e=qi(()=>{e(),t()},l)})}function _i(l){return document.createElement(l)}function $i(l){var t="",e=new Uint8Array(l),i=e.byteLength;for(let s=0;s<i;s++)t+=String.fromCharCode(e[s]);return window.btoa(t)}async function ts(l,t,e={}){const i=_i("pre");i.style.cssText=`margin: 0; ${t}; position: fixed;`,i.textContent=l,document.body.appendChild(i),e.onCreated?.(i);const{width:s,height:r}=i.getBoundingClientRect();i.remove();const o=new Image;o.width=s,o.height=r;const a=e.font==null?"":`
51
51
  @font-face {
52
52
  font-family: '${e.font.name}';
53
- src: url('data:font/woff2;base64,${Ki(await(await fetch(e.font.url)).arrayBuffer())}') format('woff2');
53
+ src: url('data:font/woff2;base64,${$i(await(await fetch(e.font.url)).arrayBuffer())}') format('woff2');
54
54
  }
55
55
  `,n=`
56
56
  <svg xmlns="http://www.w3.org/2000/svg" width="${s}" height="${r}">
@@ -61,7 +61,7 @@ void main() {
61
61
  <div xmlns="http://www.w3.org/1999/xhtml">${i.outerHTML}</div>
62
62
  </foreignObject>
63
63
  </svg>
64
- `.replace(/\t/g,"").replace(/#/g,"%23");return o.src=`data:image/svg+xml;charset=utf-8,${n}`,await new Promise(c=>{o.onload=c}),o}async function qi(l,t,e={}){const i=await Xi(l,t,e),s=new OffscreenCanvas(i.width,i.height);return s.getContext("2d")?.drawImage(i,0,0,i.width,i.height),await createImageBitmap(s)}async function _i(l,t){const e={type:t,data:l},i=new ImageDecoder(e);await Promise.all([i.completed,i.tracks.ready]);const s=i.tracks.selectedTrack?.frameCount??1,r=[];for(let o=0;o<s;o+=1)r.push((await i.decode({frameIndex:o})).image);return r}class ee{all=new Map;on(t,e){const i=this.all.get(t);return i?i.push(e):this.all.set(t,[e]),()=>this.off(t,e)}once(t,e){const i=this.on(t,s=>{i(),e(s)});return i}off(t,e){const i=this.all.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):this.all.set(t,[]))}emit(t,e){let i=this.all.get(t);i&&i.slice().forEach(s=>{s(e)}),i=this.all.get("*"),i&&i.slice().forEach(s=>{s(t,e)})}}const $i={x:{label:"X Position",min:-2e3,max:2e3,step:1,default:0},y:{label:"Y Position",min:-2e3,max:2e3,step:1,default:0},width:{label:"Width",min:-1e3,max:1e3,step:1,default:0},height:{label:"Height",min:-1e3,max:1e3,step:1,default:0},scale:{label:"Scale",min:0,max:3,step:.1,default:1},scaleX:{label:"Scale X",min:0,max:3,step:.1,default:1},scaleY:{label:"Scale Y",min:0,max:3,step:.1,default:1},opacity:{label:"Opacity",min:0,max:1,step:.01,default:1},angle:{label:"Rotation",min:-360,max:360,step:1,default:0},blur:{label:"Blur",min:0,max:100,step:1,default:0},brightness:{label:"Brightness",min:0,max:5,step:.1,default:1},mirror:{label:"Mirror",min:0,max:1,step:1,default:0},motionBlur:{label:"Motion Blur",min:0,max:500,step:1,default:0}},Wt={linear:l=>l,easeInQuad:l=>l*l,easeOutQuad:l=>l*(2-l),easeInOutQuad:l=>l<.5?2*l*l:-1+(4-2*l)*l,easeInCubic:l=>l*l*l,easeOutCubic:l=>--l*l*l+1,easeInOutCubic:l=>l<.5?4*l*l*l:(l-1)*(2*l-2)*(2*l-2)+1,easeInSine:l=>1-Math.cos(l*Math.PI/2),easeOutSine:l=>Math.sin(l*Math.PI/2),easeInOutSine:l=>.5*(1-Math.cos(Math.PI*l)),easeInExpo:l=>l===0?0:Math.pow(2,10*(l-1)),easeOutExpo:l=>l===1?1:1-Math.pow(2,-10*l),easeInOutExpo:l=>l===0?0:l===1?1:(l/=.5)<1?.5*Math.pow(2,10*(l-1)):.5*(2-Math.pow(2,-10*--l)),easeInCirc:l=>1-Math.sqrt(1-l*l),easeOutCirc:l=>Math.sqrt(1-(l-1)*(l-1)),easeInOutCirc:l=>(l/=.5)<1?-.5*(Math.sqrt(1-l*l)-1):.5*(Math.sqrt(1-(l-2)*l)+1),slow:ke(.5,.5,!1)};function ke(l=.7,t=.7,e=!1){const i=Math.min(1,l),s=i<1?t:0,r=(1-i)/2,o=r+i;return a=>{const n=a+(.5-a)*s;if(a<r){const c=1-a/r;return e?1-c*c:n-c*c*c*n}if(a>o){const c=(a-o)/r;return e?a===1?0:1-c*c:n+(a-n)*c*c*c}return e?1:n}}function At(l){return typeof l=="function"?l:typeof l=="string"&&Wt[l]?Wt[l]:Wt.linear}class Fe{id;type;options;params;frames;constructor(t,e,i="keyframes"){this.id=e.id||`keyframe_${Math.random().toString(36).substr(2,9)}`,this.type=i,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"linear",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1},Array.isArray(t)?this.frames=t.map(s=>({progress:s.progress,props:s.props||s,easing:s.easing})):this.frames=Object.entries(t).filter(([s])=>{if(s==="from"||s==="to")return!0;const r=Number(s.replace("%",""));return!isNaN(r)&&r>=0&&r<=100}).map(([s,r])=>{const o={from:0,to:100}[s]??Number(s.replace("%","")),{easing:a,...n}=r;return{progress:o/100,props:n,easing:a}}).sort((s,r)=>s.progress-r.progress),this.frames.length>0&&this.frames[0].progress!==0&&this.frames.unshift({progress:0,props:{}}),this.frames.length>0&&this.frames[this.frames.length-1].progress!==1&&this.frames.push({progress:1,props:{}})}getTransform(t){const{duration:e,delay:i,iterCount:s,easing:r,disableGlobalEasing:o}=this.options,a=t-i;if(a<0)return{};if(s!==1/0&&a>=e)return this.interpolateProps(1);const n=s===1/0?e:e/s;let c=a%n/n;return!o&&r!=="linear"&&(c=At(r)(c)),this.interpolateProps(c)}interpolateProps(t){const e=this.frames.findIndex(d=>d.progress>=t);if(e===-1)return this.frames[this.frames.length-1].props;if(e===0)return this.frames[0].props;const i=this.frames[e-1],s=this.frames[e],r=(t-i.progress)/(s.progress-i.progress),o=s.easing??(this.options.disableGlobalEasing?this.options.easing:"linear"),n=At(o)(r),c={},h=new Set([...Object.keys(i.props),...Object.keys(s.props)]);for(const d of h){const f=d,u=f==="scale"||f==="scaleX"||f==="scaleY"||f==="opacity"?1:0,p=i.props[f]??u,g=s.props[f]??u;c[f]=p+(g-p)*n}return c}}const ie=["scale","scaleX","scaleY","rotation","skewX","skewY","skew","pivotX","pivotY","pivot","anchorX","anchorY","anchor","blur","brightness","contrast","grayscale","hueRotate","invert","saturate","threshold","matrix"],Re=l=>l&&Object.keys(l).some(t=>ie.includes(t)),ft=l=>{if(!l)return l;const t={...l};if(t.keyframes){if(Array.isArray(t.keyframes))t.keyframes=t.keyframes.map(i=>ft(i));else if(typeof t.keyframes=="object"){const i={};for(const[s,r]of Object.entries(t.keyframes))r&&typeof r=="object"?i[s]=ft(r):i[s]=r;t.keyframes=i}}if(!Re(t))return t;const e={};return ie.forEach(i=>{i in t&&(e[i]=t[i],delete t[i])}),t.pixi=e,t};function dt(l,t){if(typeof l=="number")return l;if(typeof l=="string"){if(l.startsWith("+="))return t+parseFloat(l.substring(2));if(l.startsWith("-="))return t-parseFloat(l.substring(2))}const e=parseFloat(l);return isNaN(e)?t:e}function ts(l){const t=new Set;return l&&l.keyframes&&(Array.isArray(l.keyframes)?l.keyframes.forEach(e=>{e&&typeof e=="object"&&Object.keys(e).forEach(i=>t.add(i))}):typeof l.keyframes=="object"&&Object.values(l.keyframes).forEach(e=>{e&&typeof e=="object"&&Object.keys(e).forEach(i=>t.add(i))})),t}function kt(l,t,e,i){const s={},r={},o=new Set([...Object.keys(l||{}),...Object.keys(t||{})]),a=ts(t);for(const n of o){if(["immediateRender","ease","duration","stagger","repeat","yoyo","keyframes"].includes(n)){l&&n in l&&(s[n]=l[n]),t&&n in t&&(r[n]=t[n]);continue}const c=e[n]??0;if(a.has(n)){const h=l?l[n]:void 0;s[n]=h!==void 0?dt(h,c):c;continue}if(i){const h=l?l[n]:void 0,d=t?t[n]:void 0,f=typeof h=="string"&&(h.startsWith("+=")||h.startsWith("-=")),u=typeof d=="string"&&(d.startsWith("+=")||d.startsWith("-="));if(f){s[n]=c;const p=dt(h,0);r[n]=c+p}else if(u){s[n]=h!==void 0?dt(h,c):c;const p=dt(d,0);r[n]=s[n]+p}else s[n]=h!==void 0?dt(h,c):c,r[n]=d!==void 0?dt(d,c):c}else{const h=l?l[n]:void 0,d=t?t[n]:void 0;s[n]=h!==void 0?dt(h,c):c;const f=s[n];r[n]=d!==void 0?dt(d,f):c}}if(t&&t.keyframes){if(Array.isArray(t.keyframes)){if(r.keyframes=t.keyframes.map(n=>{const{resolvedTo:c}=kt(null,n,{...e,...s},i);return c}),r.keyframes.length>0){const n=r.keyframes[r.keyframes.length-1];n&&typeof n=="object"&&Object.keys(n).forEach(c=>{r[c]===void 0&&(r[c]=n[c])})}}else if(typeof t.keyframes=="object"){const n={};for(const[h,d]of Object.entries(t.keyframes))if(d&&typeof d=="object"){const{resolvedTo:f}=kt(null,d,{...e,...s},i);n[h]=f}else n[h]=d;r.keyframes=n;const c=n["100%"];c&&typeof c=="object"&&Object.keys(c).forEach(h=>{r[h]===void 0&&(r[h]=c[h])})}}return{resolvedFrom:s,resolvedTo:r}}function Me(l,t){const e=new Set,i=["immediateRender","ease","duration","stagger","repeat","yoyo","keyframes"];if(l)for(const s of Object.keys(l))i.includes(s)||e.add(s);if(t){for(const s of Object.keys(t))i.includes(s)||e.add(s);if(t.keyframes){if(Array.isArray(t.keyframes))for(const s of t.keyframes)for(const r of Object.keys(s))i.includes(r)||e.add(r);else if(typeof t.keyframes=="object"){for(const s of Object.values(t.keyframes))if(s&&typeof s=="object")for(const r of Object.keys(s))i.includes(r)||e.add(r)}}}return Array.from(e)}function Oe(l,t){if(t==="scale"||t==="scaleX")return l.scale?.x??1;if(t==="scaleY")return l.scale?.y??1;if(t==="anchor"||t==="anchorX")return l.anchor?.x??0;if(t==="anchorY")return l.anchor?.y??0;if(t==="pivot"||t==="pivotX")return l.pivot?.x??0;if(t==="pivotY")return l.pivot?.y??0;if(t==="skew"||t==="skewX")return(l.skew?.x??0)*180/Math.PI;if(t==="skewY")return(l.skew?.y??0)*180/Math.PI;if(t==="rotation")return l.angle??0;const e=ht.getProperty(l,t);if(typeof e=="number")return e;if(e&&typeof e=="object"&&"x"in e&&typeof e.x=="number")return e.x;const i=parseFloat(e);return isNaN(i)?0:i}ht.registerPlugin(ye.PixiPlugin),ye.PixiPlugin.registerPIXI(yi);class Ee{id;type;options;params;timeline=null;lastTarget=null;originalProperties=new Map;constructor(t,e,i="gsap"){this.id=e.id||`gsap_${Math.random().toString(36).substr(2,9)}`,this.type=i,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"none",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){return{}}get isOutAnimation(){return this.options.mode==="out"||this.params.metaMode==="out"||this.params.mode==="out"||this.id.toLowerCase().includes("out")}restoreOriginals(){this.originalProperties.forEach((t,e)=>{if(e&&!e.destroyed)try{const i=ft(t);ht.set(e,i),delete e.__ovAnchorAdjusted}catch{}})}getTargetCount(t){return this.getCurrentTargets(t).length}apply(t,e){const{duration:i,delay:s}=this.options,r=e-s;let o=this.lastTarget!==t||!this.timeline||this.originalProperties.size===0;const a=this.getCurrentTargets(t);if(!o)if(this.originalProperties.size!==a.length)o=!0;else for(const x of a){if(!this.originalProperties.has(x)||x.destroyed||!x.parent){o=!0;break}const w=!!x.anchor,T=!x.anchor&&x.pivot&&x.getLocalBounds;if(w&&!x.__ovAnchorAdjusted&&x.width>0&&x.height>0){o=!0;break}if(T&&!x.__ovAnchorAdjusted){const y=x.getLocalBounds();if(y.width>0&&y.height>0){o=!0;break}}}if(o&&(this.initTimeline(t),this.lastTarget=t),!this.timeline)return;const n=this.options.iterCount===1/0?i:i/this.options.iterCount;let c;if(this.options.iterCount!==1/0&&r>=i)c=1;else if(r<0){if(this.isOutAnimation)return;c=0}else c=r%n/n;this.timeline.progress(c);const h=c*this.timeline.duration(),d=this.getCurrentTargets(t),f=i/1e6,{from:u,to:p,stagger:g}=this.params,v=typeof g=="number"?g:0;d.forEach((x,w)=>{const T=w*v,y=T+f,C=this.isOutAnimation;if(h<T){const k=this.originalProperties.get(x)||{},{resolvedFrom:O}=kt(u,p,k,C),F=ft(O);ht.set(x,F)}else if(h>y){const k=this.originalProperties.get(x)||{},{resolvedTo:O}=kt(u,p,k,C),F=ft(O);ht.set(x,F)}})}getCurrentTargets(t){if(!t)return[];const{type:e}=this.params;let i=t;if(t.children){const s=t.children.find(r=>r.label==="TextOnlyContainer");s&&(i=s)}if(e==="character"||e==="word"){if(!i||!i.children||i.children.length===0)return[];if(e==="character"){const s=(r,o=!1)=>{if(r&&r.label==="LineMask")return[];if(!r.children||r.children.length===0)return o?[]:[r];let a=[];for(const n of r.children)a=a.concat(s(n));return a};return s(i,!0)}else{if(i.children.some(r=>r&&r.label==="LineContainer")){const r=[];for(const o of i.children)o&&o.label==="LineContainer"&&o.children&&r.push(...o.children);return r}return i.children}}return[t]}initTimeline(t){const{from:e,to:i,stagger:s,type:r}=this.params,o=this.options.duration/1e6,a=this.getCurrentTargets(t);if((r==="character"||r==="word")&&a.length===0){this.timeline&&(this.timeline.kill(),this.timeline=null);return}this.timeline&&this.timeline.kill(),this.restoreOriginals(),this.originalProperties.clear(),this.timeline=ht.timeline({paused:!0}),a.forEach(d=>{if(d.anchor){if(!d.__ovAnchorAdjusted&&d.width>0&&d.height>0){if(d.anchor.x!==.5||d.anchor.y!==.5){const f=d.anchor.x,u=d.anchor.y;d.anchor.set(.5,.5);const p=d.width/(d.scale?.x||1),g=d.height/(d.scale?.y||1);d.x+=(.5-f)*p*(d.scale?.x||1),d.y+=(.5-u)*g*(d.scale?.y||1)}d.__ovAnchorAdjusted=!0}}else if(d.pivot&&d.getLocalBounds&&!d.__ovAnchorAdjusted){const f=d.getLocalBounds(),u=f.x+f.width/2,p=f.y+f.height/2;if(f.width>0&&f.height>0){if(d.pivot.x!==u||d.pivot.y!==p){const g=d.pivot.x,v=d.pivot.y;d.pivot.set(u,p),d.x+=(u-g)*(d.scale?.x||1),d.y+=(p-v)*(d.scale?.y||1)}d.__ovAnchorAdjusted=!0}}});const n=Me(e,i);a.forEach(d=>{const f={};d.__ovOriginalProperties=d.__ovOriginalProperties||{},n.forEach(u=>{d.__ovOriginalProperties[u]===void 0&&(d.__ovOriginalProperties[u]=Oe(d,u)),f[u]=d.__ovOriginalProperties[u]}),this.originalProperties.set(d,f)});const c=typeof s=="number"?s:0,h=this.isOutAnimation;a.forEach((d,f)=>{const u=this.originalProperties.get(d)||{},{resolvedFrom:p,resolvedTo:g}=kt(e,i,u,h),v=ft(p),x=ft(g);this.timeline.add(ht.fromTo(d,v,{duration:o,ease:this.options.easing,immediateRender:!h,...x}),f*c)})}destroy(){this.timeline&&(this.timeline.kill(),this.timeline=null),this.restoreOriginals(),this.originalProperties.clear()}}class De{id;type="wipe";options;params;constructor(t,e){this.id=e.id||`wipe_${Math.random().toString(36).substr(2,9)}`,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"linear",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){const{duration:e,delay:i,easing:s,iterCount:r}=this.options,{direction:o,mode:a,angle:n,feather:c}=this.params,h=t-i,d=a!=="conceal",f=r!==1/0&&h>=e;if(d&&f)return{};if(!d&&h<0)return{};let u;if(h<0)u=0;else if(r!==1/0&&h>=e)u=1;else{const x=r===1/0?e:e/r;u=h%x/x}const g=At(s)(u);return{mask:{shape:"rect",progress:a==="reveal"?g:1-g,direction:o,angle:n??0,feather:c??0,...this.params.initialProgress!=null&&{initialProgress:this.params.initialProgress}}}}}function $(l){if(l!=null){if(typeof l=="number")return l;if(typeof l=="string"){if(l==="transparent")return;if(l.startsWith("#")){const e=parseInt(l.slice(1),16);if(!isNaN(e))return e}if(l.startsWith("0x")){const e=parseInt(l,16);if(!isNaN(e))return e}const t=parseInt(l,16);if(!isNaN(t))return t;try{return new m.Color(l).toNumber()}catch{return}}}}const Dt=l=>l==="transparent"||l===""||l===void 0||l===null,Ft=(l,t=16777215)=>Dt(l)?{color:t,alpha:0}:{color:$(l)??t,alpha:1};function Pt(l){try{const e=new m.Color(l).toRgbArray();return{r:Math.round(e[0]*255),g:Math.round(e[1]*255),b:Math.round(e[2]*255)}}catch{return null}}function es(l,t){const e=new m.Container;e.label="InvertTextContainer";for(const i of l.children){if(!(i instanceof m.Container)||i.label!=="LineContainer")continue;const s=new m.Container;s.label="LineContainer";for(const r of i.children){if(!(r instanceof m.SplitBitmapText))continue;const o=r.style,a=new m.TextStyle({fontFamily:o.fontFamily,fontSize:o.fontSize,fontWeight:o.fontWeight,fontStyle:o.fontStyle,align:o.align,wordWrap:o.wordWrap,wordWrapWidth:o.wordWrapWidth,lineHeight:o.lineHeight,letterSpacing:o.letterSpacing,fill:t}),n=new m.SplitBitmapText({text:r.text,style:a});n.x=r.x,n.y=r.y,r.filters&&(n.filters=[...r.filters]),s.addChild(n)}e.addChild(s)}return e}function Pe(l,t,e,i,s){const{x:r,y:o,w:a,h:n}=l;let c=r,h=o,d=0,f=n;if(i==="reveal"){const u=t<=.5,p=u?t*2:(t-.5)*2;e==="left"?(c=u?r:r+p*a,d=u?p*a:a-p*a,h=o,f=n):e==="right"?(c=u?r+a-p*a:r,d=u?p*a:a-p*a,h=o,f=n):e==="top"?(h=u?o:o+p*n,f=u?p*n:n-p*n,c=r,d=a):(h=u?o+n-p*n:o,f=u?p*n:n-p*n,c=r,d=a)}else if(e==="left"){const u=s*a,p=r-u+t*(a+u);c=Math.max(r,p),d=Math.min(r+a,p+u)-c,h=o,f=n}else if(e==="right"){const u=s*a,p=r+a-t*(a+u);c=Math.max(r,p),d=Math.min(r+a,p+u)-c,h=o,f=n}else if(e==="top"){const u=s*n,p=o-u+t*(n+u);h=Math.max(o,p),f=Math.min(o+n,p+u)-h,c=r,d=a}else{const u=s*n,p=o+n-t*(n+u);h=Math.max(o,p),f=Math.min(o+n,p+u)-h,c=r,d=a}return{x:c,y:h,w:d,h:f}}class Ie{id;type="blockReveal";options;params;constructor(t,e){this.id=e.id||`block_reveal_${Math.random().toString(36).substring(2,9)}`,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"easeInOutCubic",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){return{}}apply(t,e){if(!(t instanceof m.Container)||t.destroyed)return;const i=t,{duration:s,delay:r,easing:o}=this.options,a=e-r;if(a<0){this.cleanup(i);return}const n=At(o)(Math.min(a/s,1));if(n>=1){this.cleanup(i);return}const c=t.children.find(S=>S.label==="TextOnlyContainer");if(!c||c.destroyed)return;const h=$(this.params.blockColor)??16777215,d=$(this.params.textColorInside)??0,f=this.params.direction??"right",u=this.params.mode??"reveal",p=this.params.blockSize??.3;let g=i.__blockGraphics,v=i.__invertTextContainer,x=i.__maskGraphics;!g||g.destroyed?(g=new m.Graphics,g.label="BlockReveal_Block",t.addChild(g),i.__blockGraphics=g):t.children.indexOf(g)===-1&&t.addChild(g),!v||v.destroyed?(v=es(c,d),t.addChild(v),i.__invertTextContainer=v):t.children.indexOf(v)===-1&&t.addChild(v),!x||x.destroyed?(x=new m.Graphics,x.label="BlockReveal_Mask",t.addChild(x),i.__maskGraphics=x,v.mask=x):t.children.indexOf(x)===-1&&t.addChild(x);const w=t.children.indexOf(c),T=t.children.indexOf(g),y=t.children.indexOf(v);if(w!==-1&&T!==-1&&y!==-1){T<w&&t.setChildIndex(g,w+1);const S=t.children.indexOf(g);y<S&&t.setChildIndex(v,S+1)}const C=i.__clip,k=t.getLocalBounds(),O=C?._lineRects;g.clear(),x.clear();let F=!1;const b=S=>{S.w>0&&S.h>0&&(g.rect(S.x,S.y,S.w,S.h).fill({color:h}),x.rect(S.x,S.y,S.w,S.h).fill({color:16777215}),F=!0)};if(O&&O.length>0){const S=C?C.width:k.width,A=C?0:k.x;for(const E of O)b(Pe({x:A,y:E.y,w:S,h:E.h},n,f,u,p))}else b(Pe({x:k.x,y:k.y,w:k.width,h:k.height},n,f,u,p));g.visible=F,v.visible=F}cleanup(t){t.__blockGraphics&&(t.__blockGraphics.destroyed||t.__blockGraphics.destroy(),t.__blockGraphics=null),t.__invertTextContainer&&(t.__invertTextContainer.destroyed||t.__invertTextContainer.destroy({children:!0}),t.__invertTextContainer=null),t.__maskGraphics&&(t.__maskGraphics.destroyed||t.__maskGraphics.destroy(),t.__maskGraphics=null)}}class Rt{id;options;params;constructor(t,e){this.id=e.id||`mask_${Math.random().toString(36).substr(2,9)}`,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"linear",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){const{duration:e,delay:i,easing:s,iterCount:r}=this.options,o=t-i,a=this.params.mode!=="conceal",n=r!==1/0&&o>=e;if(a&&n)return{};if(!a&&o<0)return{};let c;if(o<0)c=0;else if(r!==1/0&&o>=e)c=1;else{const p=r===1/0?e:e/r;c=o%p/p}const d=At(s)(c),f=this.params.mode==="conceal"?1-d:d,u=this.buildMask(f);return this.params.initialProgress!=null&&(u.initialProgress=this.params.initialProgress),{mask:u}}}class Be extends Rt{type="circleReveal";constructor(t,e){super(t,e)}buildMask(t){return{shape:"circle",progress:t,origin:this.params.origin??"center",feather:this.params.feather??0}}}class Ne extends Rt{type="rectExpand";constructor(t,e){super(t,e)}buildMask(t){const e=this.params.origin??"center";return{shape:"custom",progress:t,painter:(s,r,o,a)=>{let n=0,c=0;switch(e){case"topLeft":n=-r/2,c=-o/2;break;case"topRight":n=r/2,c=-o/2;break;case"bottomLeft":n=-r/2,c=o/2;break;case"bottomRight":n=r/2,c=o/2;break;default:n=0,c=0}const h=r/2*a,d=o/2*a,f=Math.max(-r/2,n-h),u=Math.max(-o/2,c-d),p=Math.min(r,h*2),g=Math.min(o,d*2);p>0&&g>0&&s.rect(f,u,p,g).fill({color:16777215})}}}}class ze extends Rt{type="centerExpand";constructor(t,e){super(t,e)}buildMask(t){const e=this.params.axis??"vertical";return{shape:"custom",progress:t,painter:(s,r,o,a)=>{let n,c;switch(e){case"horizontal":n=r*a,c=o;break;case"both":n=r*a,c=o*a;break;default:n=r,c=o*a;break}s.rect(-n/2,-c/2,n,c).fill({color:16777215})}}}}class Le extends Rt{type="angleWipe";constructor(t,e){super(t,e)}buildMask(t){return{shape:"rect",progress:t,direction:"left",angle:this.params.angle??0,feather:this.params.feather??0}}}class He extends Rt{type="starReveal";constructor(t,e){super(t,e)}buildMask(t){const{points:e=5,innerRatio:i=.4}=this.params;return{shape:"custom",progress:t,painter:(r,o,a,n)=>{const h=Math.hypot(o,a)/2*n,d=h*i,f=0,u=0,p=e*2,g=[];for(let v=0;v<p;v++){const x=Math.PI/e*v-Math.PI/2,w=v%2===0?h:d;g.push(f+Math.cos(x)*w,u+Math.sin(x)*w)}r.poly(g,!0).fill({color:16777215})}}}}class Ge extends Rt{type="edgeCrop";constructor(t,e){super(t,e)}buildMask(t){const e=this.params;return{shape:"edgeCrop",progress:t,origin:e.origin??"center",xDistance:e.xDistance??100,yDistance:e.yDistance??100,maskBorderRadius:e.maskBorderRadius??0,feather:e.feather??0}}}class is{factories=new Map;constructor(){this.register("keyframes",(e,i)=>new Fe(i,e));const t=(e,i)=>new Ee(i,e,"stagger");this.register("stagger",t),this.register("wipe",(e,i)=>new De(i,e)),this.register("circleReveal",(e,i)=>new Be(i,e)),this.register("rectExpand",(e,i)=>new Ne(i,e)),this.register("angleWipe",(e,i)=>new Le(i,e)),this.register("starReveal",(e,i)=>new He(i,e)),this.register("centerExpand",(e,i)=>new ze(i,e)),this.register("edgeCrop",(e,i)=>new Ge(i,e)),this.register("blockReveal",(e,i)=>new Ie(i,e))}register(t,e){this.factories.set(t,e)}create(t,e,i){const s=this.factories.get(t);if(!s)throw new Error(`Animation "${t}" not found in registry`);return s(e,i)}has(t){return this.factories.has(t)}}const Vt=new is;class ss extends ee{id="";name="";timing={display:{from:0,to:0},trim:{from:0,to:0},duration:0,playbackRate:1};get display(){return this.timing.display}set display(t){this.timing.display=t}get duration(){return this.timing.duration}set duration(t){this.timing.duration=t}get playbackRate(){return this.timing.playbackRate}set playbackRate(t){this.timing.playbackRate=t}get trim(){return this.timing.trim}set trim(t){this.timing.trim=t}constructor(){super()}_left=0;get left(){return this._left}set left(t){const e=this._left!==t;this._left=t,e&&this.emit("propsChange",{left:t})}_top=0;get top(){return this._top}set top(t){const e=this._top!==t;this._top=t,e&&this.emit("propsChange",{top:t})}_width=0;get width(){return this._width}set width(t){const e=this._width!==t;this._width=t,e&&this.emit("propsChange",{width:t})}_height=0;get height(){return this._height}set height(t){const e=this._height!==t;this._height=t,e&&this.emit("propsChange",{height:t})}_angle=0;get angle(){return this._angle}set angle(t){const e=this._angle!==t;this._angle=t,e&&this.emit("propsChange",{angle:t})}get center(){return{x:this.left+this.width/2,y:this.top+this.height/2}}_zIndex=0;get zIndex(){return this._zIndex}set zIndex(t){const e=this._zIndex!==t;this._zIndex=t,e&&this.emit("propsChange",{zIndex:t})}_opacity=1;get opacity(){return this._opacity}set opacity(t){const e=this._opacity!==t;this._opacity=t,e&&this.emit("propsChange",{opacity:t})}_volume=1;get volume(){return this._volume}set volume(t){const e=this._volume!==t;this._volume=t,e&&this.emit("propsChange",{volume:t})}_locked=!1;get locked(){return this._locked}set locked(t){const e=this._locked!==t;this._locked=t,e&&this.emit("propsChange",{locked:t})}_muted=!1;get muted(){return this._muted}set muted(t){const e=this._muted!==t;this._muted=t,e&&this.emit("propsChange",{muted:t})}_trackMuted=!1;get trackMuted(){return this._trackMuted}set trackMuted(t){this._trackMuted!==t&&(this._trackMuted=t,this.onEffectiveVolumeChange())}onEffectiveVolumeChange(){}get effectiveVolume(){return this._muted||this.trackMuted?0:this.volume}flip=null;effects=[];chromaKey;colorAdjustment;_style={};get style(){return this._style}set style(t){this._style=t}animatKeyFrame=null;animatOptions=null;_animations=[];get animations(){return this._animations}set animations(t){if(!Array.isArray(t)){this._animations.forEach(e=>{e&&typeof e.destroy=="function"&&e.destroy()}),this._animations=[];return}this._animations.forEach(e=>{if(e&&e.id){const i=t.find(o=>o&&o.id===e.id),s=i&&typeof i.getTransform!="function";(!i||s)&&typeof e.destroy=="function"&&e.destroy()}}),this._animations=t.map(e=>{if(e&&typeof e.getTransform=="function")return e;if(e&&e.type&&e.options)try{return Vt.create(e.type,e.options,e.params)}catch(i){return console.error(`[BaseSprite] Failed to instantiate animation: ${e.type}`,i),e}return e})}renderTransform={x:0,y:0,width:0,height:0,scale:1,scaleX:1,scaleY:1,opacity:1,angle:0,blur:0,brightness:1,mirror:0,motionBlur:0};_render(t){const{center:e}=this;t.setTransform(this.flip?.x?-1:1,0,0,this.flip?.y?-1:1,e.x,e.y),t.globalAlpha=this.opacity*(this.renderTransform.opacity??1)*(this.renderTransform.brightness??1);const i=this.renderTransform.x??0,s=this.renderTransform.y??0,r=this.renderTransform.angle??0,o=this.renderTransform.scale??1,a=this.renderTransform.scaleX??1,n=this.renderTransform.scaleY??1;t.translate(i,s),t.scale(o*a,o*n),t.rotate((this.flip==null?1:-1)*(r*Math.PI)/180)}setAnimation(t,e){this.animatKeyFrame=Object.entries(t).map(([i,s])=>{const r={from:0,to:100}[i]??Number(i.slice(0,-1));if(isNaN(r)||r>100||r<0)throw Error("keyFrame must between 0~100");return[r/100,s]}),this.animatOptions=Object.assign({},this.animatOptions,{duration:e.duration,delay:e.delay??0,iterCount:e.iterCount??1/0}),this.emit("propsChange",{animations:this.animations})}animate(t,e){this.renderTransform={x:0,y:0,width:0,height:0,scale:1,scaleX:1,scaleY:1,opacity:1,angle:0,blur:0,brightness:1,mirror:0,motionBlur:0,__lastSpriteTime:t};const i=[...this.animations].sort((r,o)=>(r.options?.delay??0)-(o.options?.delay??0));if(e)for(const r of i)r.type==="stagger"&&r.restoreOriginals&&r.restoreOriginals(e);for(const r of i){const o=r.getTransform(t);o.x!==void 0&&(this.renderTransform.x+=o.x),o.y!==void 0&&(this.renderTransform.y+=o.y),o.width!==void 0&&(this.renderTransform.width+=o.width),o.height!==void 0&&(this.renderTransform.height+=o.height),o.angle!==void 0&&(this.renderTransform.angle+=o.angle),o.blur!==void 0&&(this.renderTransform.blur+=o.blur),o.motionBlur!==void 0&&(this.renderTransform.motionBlur+=o.motionBlur),o.scale!==void 0&&(this.renderTransform.scale*=o.scale),o.scaleX!==void 0&&(this.renderTransform.scaleX*=o.scaleX),o.scaleY!==void 0&&(this.renderTransform.scaleY*=o.scaleY),o.opacity!==void 0&&(this.renderTransform.opacity*=o.opacity),o.brightness!==void 0&&(this.renderTransform.brightness*=o.brightness),o.mirror!==void 0&&(this.renderTransform.mirror=Math.max(this.renderTransform.mirror||0,o.mirror)),o.mask!==void 0&&(this.renderTransform.mask=o.mask),e&&r.apply&&r.apply(e,t)}if(this.animatKeyFrame==null||this.animatOptions==null||t<this.animatOptions.delay)return;const s=rs(t,this.animatKeyFrame,this.animatOptions);for(const r in s)switch(r){case"opacity":this.opacity=s[r];break;case"x":this.left=s[r];break;case"y":this.top=s[r];break;case"w":this.width=s[r];break;case"h":this.height=s[r];break;case"angle":this.angle=s[r];break}}addAnimation(t,e,i){const s=Vt.create(t,e,i);return this.animations.push(s),this.emit("propsChange",{animations:this.animations}),s.id}removeAnimation(t){const e=this.animations.find(i=>i.id===t);e&&typeof e.destroy=="function"&&e.destroy(),this.animations=this.animations.filter(i=>i.id!==t),this.emit("propsChange",{animations:this.animations})}clearAnimations(){this.animations.forEach(t=>{t&&typeof t.destroy=="function"&&t.destroy()}),this.animations=[],this.emit("propsChange",{animations:this.animations})}updateAnimation(t,e,i,s){const r=this.animations.findIndex(n=>n.id===t);if(r===-1)return;const o=this.animations[r];o&&typeof o.destroy=="function"&&o.destroy();const a=Vt.create(e,{...i,id:t},s);this.animations[r]=a,this.emit("propsChange",{animations:this.animations})}copyStateTo(t){t.animatKeyFrame=this.animatKeyFrame,t.animatOptions=this.animatOptions,t.zIndex=this.zIndex,t.opacity=this.opacity,t.volume=this.volume,t.flip=this.flip,t.left=this.left,t.top=this.top,t.width=this.width,t.height=this.height,t.angle=this.angle,t.display={...this.display},t.duration=this.duration,t.playbackRate=this.playbackRate,t.trim={...this.trim},this.timing.fadeIn!==void 0&&(t.timing.fadeIn={...this.timing.fadeIn}),this.timing.fadeOut!==void 0&&(t.timing.fadeOut={...this.timing.fadeOut}),t.style=JSON.parse(JSON.stringify(this.style||{})),t.animations=[...this.animations],this.chromaKey!==void 0&&(t.chromaKey={...this.chromaKey}),this.colorAdjustment!==void 0&&(t.colorAdjustment=JSON.parse(JSON.stringify(this.colorAdjustment))),t.locked=this.locked,t.muted=this.muted,"src"in this&&"src"in t&&(t.src=this.src),"metadata"in this&&"metadata"in t&&(t.metadata=JSON.parse(JSON.stringify(this.metadata||{})))}update(t){Object.assign(this,t),this.emit("propsChange",t)}destroy(){this.animations.forEach(t=>{t&&typeof t.destroy=="function"&&t.destroy()}),this.animations=[],this.all.clear()}}function rs(l,t,e){const i=l-e.delay,s=i%e.duration,r=i/e.duration>=e.iterCount||i===e.duration?1:s/e.duration,o=t.findIndex(u=>u[0]>=r);if(o===-1)return{};const a=t[o-1],n=t[o],c=n[1];if(a==null)return c;const h=a[1],d={},f=(r-a[0])/(n[0]-a[0]);for(const u in c){if(!Object.hasOwn(c,u)||typeof u!="string")continue;const p=u;h[p]!=null&&(d[p]=(c[p]-h[p])*f+h[p])}return d}async function os(l){try{const t=await createImageBitmap(l);return l.close(),t}catch{const t=l.displayWidth,e=l.displayHeight;if(t<=0||e<=0)throw l.close(),new Error("VideoFrame has invalid dimensions");const i=new OffscreenCanvas(t,e),s=i.getContext("2d");if(s==null)throw l.close(),new Error("Failed to get 2d context for VideoFrame conversion");return s.drawImage(l,0,0,t,e),l.close(),createImageBitmap(i)}}class X extends ss{lastVf=null;destroyed=!1;src="";metadata={};transition;renderTexturePadding;constructor(){super()}async getFrame(t){const e=t*this.playbackRate,{video:i,audio:s,state:r}=await this.tick(e);let o=s??[];s!=null&&this.playbackRate!==1&&(o=s.map(n=>Te(n,this.playbackRate)));let a=null;if(i!=null)if(i instanceof VideoFrame){this.lastVf?.close();const n=await os(i);this.lastVf=n,a=n}else this.lastVf?.close(),this.lastVf=i,a=i;else this.lastVf!=null&&(a=this.lastVf);return{video:a,audio:o,done:r==="done"}}async offscreenRender(t,e){const i=e*this.playbackRate;this.animate(i),super._render(t);const{width:s,height:r}=this,{video:o,audio:a,state:n}=await this.tick(i);let c=a??[];if(a!=null&&this.playbackRate!==1&&(c=a.map(d=>Te(d,this.playbackRate))),n==="done")return{audio:c,done:!0};const h=o??this.lastVf;if(h!=null){const d=this.style.borderRadius||0,f=this.style.shadow;if(t.save(),f&&(f.blur>0||f.offsetX!==void 0||f.offsetY!==void 0)&&(t.shadowColor=f.color||"#000000",t.shadowBlur=f.blur||0,t.shadowOffsetX=f.offsetX??0,t.shadowOffsetY=f.offsetY??0),d>0){const p=Math.min(d,s/2,r/2);t.beginPath(),t.roundRect(-s/2,-r/2,s,r,p),t.clip()}t.drawImage(h,-s/2,-r/2,s,r),t.restore();const u=this.style.stroke;if(u&&u.width>0){if(t.save(),t.strokeStyle=u.color,t.lineWidth=u.width,d>0){const p=Math.min(d,s/2,r/2);t.beginPath(),t.roundRect(-s/2,-r/2,s,r,p),t.stroke()}else t.strokeRect(-s/2,-r/2,s,r);t.restore()}}return o!=null&&(this.lastVf?.close(),o instanceof ImageBitmap&&(this.lastVf=o)),{audio:c,done:!1}}set(t,e=30){return t.timing&&(t.timing.display&&(t.timing.display.from!==void 0&&(this.timing.display.from=t.timing.display.from),t.timing.display.to!==void 0&&(this.timing.display.to=t.timing.display.to)),t.timing.trim&&(t.timing.trim.from!==void 0&&(this.timing.trim.from=t.timing.trim.from),t.timing.trim.to!==void 0&&(this.timing.trim.to=t.timing.trim.to)),t.timing.duration!==void 0&&(this.timing.duration=t.timing.duration),t.timing.playbackRate!==void 0&&(this.timing.playbackRate=t.timing.playbackRate),t.timing.fadeIn!==void 0&&(this.timing.fadeIn=t.timing.fadeIn),t.timing.fadeOut!==void 0&&(this.timing.fadeOut=t.timing.fadeOut)),t.display&&(t.display.from!==void 0&&(this.display.from=t.display.from),t.display.to!==void 0&&(this.display.to=t.display.to)),t.x!==void 0&&(this.left=t.x),t.y!==void 0&&(this.top=t.y),t.width!==void 0&&(this.width=t.width),t.height!==void 0&&(this.height=t.height),t.duration!==void 0&&(this.duration=t.duration,this.display.from!==void 0&&(this.display.to=this.display.from+this.duration)),this}toJSON(t=!1){const e=this.animatKeyFrame&&this.animatOptions?{keyFrames:this.animatKeyFrame.reduce((r,[o,a])=>{const n=o===0?"from":o===1?"to":`${Math.round(o*100)}%`;return r[n]=a,r},{}),options:this.animatOptions}:void 0,i=this.animations.map(r=>"toJSON"in r&&typeof r.toJSON=="function"?r.toJSON():{type:r.type,options:r.options,params:r.params||{}}),s=this.style?JSON.parse(JSON.stringify(this.style)):void 0;return{type:this.type,id:this.id,name:this.name,src:this.src,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate,fadeIn:this.timing.fadeIn,fadeOut:this.timing.fadeOut},transform:{x:this.left,y:this.top,width:this.width,height:this.height,angle:this.angle,opacity:this.opacity,zIndex:this.zIndex,flip:this.flip},style:s,...e&&{animation:e},...i.length>0&&{animations:i},...t&&{main:!0},...this.chromaKey!==void 0&&{chromaKey:this.chromaKey},...this.colorAdjustment!==void 0&&{colorAdjustment:this.colorAdjustment},locked:this.locked,muted:this.muted,metadata:this.metadata}}getVisibleHandles(){return["tl","tr","bl","br","ml","mr","mt","mb","rot"]}async scaleToFit(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.min(t/i,e/s);this.width=i*r,this.height=s*r}async scaleToFill(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.max(t/i,e/s);this.width=i*r,this.height=s*r}centerInScene(t,e){this.left=(t-this.width)/2,this.top=(e-this.height)/2}destroy(){this.destroyed||(this.destroyed=!0,Q.info("BaseClip destroy"),super.destroy(),this.lastVf?.close(),this.lastVf=null)}static deserializeBaseProperties(t,e){e.transform&&(t.left=e.transform.x??t.left,t.top=e.transform.y??t.top,t.width=e.transform.width??t.width,t.height=e.transform.height??t.height,t.angle=e.transform.angle??t.angle,t.zIndex=e.transform.zIndex??t.zIndex,t.opacity=e.transform.opacity??t.opacity,e.transform.flip!==void 0&&(t.flip=e.transform.flip??null));const i=e.timing||{display:e.display||{from:0,to:0},trim:e.trim||{from:0,to:0},duration:e.duration??0,playbackRate:e.playbackRate??1};if(t.display.from=i.display.from??t.display.from,t.display.to=i.display.to??t.display.to,t.duration=i.duration??t.duration,t.playbackRate=i.playbackRate??t.playbackRate,i.trim&&(t.trim={from:i.trim.from??t.trim.from,to:i.trim.to??t.trim.to}),i.fadeIn!==void 0&&(t.timing.fadeIn=i.fadeIn),i.fadeOut!==void 0&&(t.timing.fadeOut=i.fadeOut),e.style){const s=t.style||{},r={...s,...e.style};JSON.stringify(s)!==JSON.stringify(r)&&(t.style=r)}if(e.animation&&t.setAnimation(e.animation.keyFrames,e.animation.options),e.animations&&Array.isArray(e.animations)){t.clearAnimations();for(const s of e.animations)t.addAnimation(s.type,s.options,s.params)}e.id&&(t.id=e.id),e.name&&(t.name=e.name),e.metadata&&(t.metadata=e.metadata),e.locked!==void 0&&(t.locked=e.locked),e.muted!==void 0&&(t.muted=e.muted),e.transition&&(t.transition=e.transition),e.chromaKey?.enabled&&(t.chromaKey={...t.chromaKey,...e.chromaKey}),e.colorAdjustment?.enabled&&(t.colorAdjustment={...t.colorAdjustment,...e.colorAdjustment})}}let se=null;async function Ue(){return se===null&&(se=Ei()),await se}const L={get codec(){return Gt()?.codec??"mp4a.40.2"},get codecType(){return Gt()?.codecType??"aac"},get sampleRate(){return Gt()?.sampleRate??48e3},get channelCount(){return Gt()?.channelCount??2}};class Yt{static writes=new Map;static async getCacheKey(t){const e=new TextEncoder().encode(t),i=await crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(i)).map(s=>s.toString(16).padStart(2,"0")).join("")}static getPath(t){return`assets/${t}`}static async get(t){const e=this.getPath(await this.getCacheKey(t)),i=this.writes.get(e);i&&await i.catch(()=>{});const s=it.file(e);return await it.file(`${e}.done`).exists()&&await s.exists()?s:null}static async put(t,e){const i=this.getPath(await this.getCacheKey(t)),r=(this.writes.get(i)??Promise.resolve()).catch(()=>{}).then(async()=>{const o=it.file(`${i}.done`);await o.exists()&&await o.remove();const a=it.file(i),n=e instanceof Blob?e.stream():e;return await it.write(a,n),await it.write(o,"1"),a});this.writes.set(i,r);try{return await r}finally{this.writes.get(i)===r&&this.writes.delete(i)}}}const re=l=>l.startsWith("data:")||l.startsWith("blob:");class We{memory=new Map;memoryBytes=0;inflight=new Map;maxMemoryBytes;maxEntryBytes;constructor(t={}){this.maxMemoryBytes=t.maxMemoryBytes??768*1024*1024,this.maxEntryBytes=t.maxEntryBytes??400*1024*1024}configure(t){t.maxMemoryBytes!=null&&(this.maxMemoryBytes=t.maxMemoryBytes),t.maxEntryBytes!=null&&(this.maxEntryBytes=t.maxEntryBytes),this.evict()}key(t){if(re(t))return t;try{return typeof location<"u"?new URL(t,location.href).href:t}catch{return t}}getBlob(t){const e=this.key(t),i=this.memory.get(e);if(i)return this.memory.delete(e),this.memory.set(e,i),Promise.resolve(i.blob);const s=this.inflight.get(e);if(s)return s;const r=this.load(e).finally(()=>this.inflight.delete(e));return this.inflight.set(e,r),r}async getStream(t){return(await this.getBlob(t)).stream()}async getImageBitmap(t){return createImageBitmap(await this.getBlob(t))}async getArrayBuffer(t){return(await this.getBlob(t)).arrayBuffer()}async preload(t){const e=[...new Set(t.filter(i=>i&&!re(i)))];await Promise.allSettled(e.map(i=>this.getBlob(i)))}has(t){return this.memory.has(this.key(t))}release(t){const e=this.key(t),i=this.memory.get(e);i&&(this.memory.delete(e),this.memoryBytes-=i.size)}clearMemory(){this.memory.clear(),this.memoryBytes=0}async load(t){if(re(t)){const r=await(await fetch(t)).blob();return this.remember(t,r),r}const e=await Yt.get(t).catch(()=>null);if(e){const r=await e.getOriginFile().catch(()=>null);if(r&&r.size>0)return this.remember(t,r),r}const i=await fetch(t);if(!i.ok)throw new Error(`Failed to fetch ${t}: ${i.status} ${i.statusText}`);const s=await i.blob();return this.remember(t,s),Yt.put(t,s).catch(r=>console.warn(`[MediaCache] Failed to persist ${t}:`,r)),s}remember(t,e){if(e.size>this.maxEntryBytes)return;const i=this.memory.get(t);i&&(this.memoryBytes-=i.size),this.memory.delete(t),this.memory.set(t,{blob:e,size:e.size}),this.memoryBytes+=e.size,this.evict()}evict(){for(const[t,e]of this.memory){if(this.memoryBytes<=this.maxMemoryBytes)break;this.memory.delete(t),this.memoryBytes-=e.size}}}const Ve=Symbol.for("agrhub.engine.mediaCache"),Ye=globalThis,Qt=Ye[Ve]??(Ye[Ve]=new We);var Qe=(l=>(l.PENDING="pending",l.LOADING="loading",l.COMPLETED="completed",l.FAILED="failed",l))(Qe||{});class yt{resources=new Map;loadingPromises=new Map;async preload(t){const i=[...new Set(t)].filter(s=>s&&!s.startsWith("data:")&&!s.startsWith("blob:")).map(s=>this.loadResource(s));await Promise.allSettled(i)}static async getReadableStream(t){return Qt.getStream(t)}static async getImageBitmap(t){return Qt.getImageBitmap(t)}async loadResource(t){const e=this.loadingPromises.get(t);if(e)return e;if(this.resources.has(t)){const s=this.resources.get(t);if(s.status==="completed")return s}const i=(async()=>{const s={url:t,status:"loading"};this.resources.set(t,s);try{return await Qt.getBlob(t),s.status="completed",s.localFile=await Yt.get(t)??void 0,s}catch(r){return s.status="failed",s.error=r instanceof Error?r:new Error(String(r)),s}finally{this.loadingPromises.delete(t)}})();return this.loadingPromises.set(t,i),i}async resolve(t){if(!t||t.startsWith("data:")||t.startsWith("blob:"))return t;const e=await this.loadResource(t);return e.status==="completed"&&e.localFile?e.localFile:t}getStatus(t){return this.resources.get(t)}clear(){this.resources.clear(),this.loadingPromises.clear()}}class ut extends X{type="Audio";static ctx=null;ready;_meta={duration:0,width:0,height:0};get meta(){return{...this._meta,sampleRate:L.sampleRate,chanCount:2}}chan0Buf=new Float32Array;chan1Buf=new Float32Array;getPCMData(){return[this.chan0Buf,this.chan1Buf]}opts;loop=!1;static async fromUrl(t,e={}){const i=await yt.getReadableStream(t);return new ut(i,e,t)}static async fromObject(t){if(t.type!=="Audio")throw new Error(`Expected Audio, got ${t.type}`);if(!t.src||t.src.trim()==="")throw new Error("Audio requires a valid source URL");const e={};t.loop!==void 0&&(e.loop=t.loop),t.volume!==void 0&&(e.volume=t.volume);const i=await ut.fromUrl(t.src,e);return X.deserializeBaseProperties(i,t),i}constructor(t,e={},i){super(),this.src=i!==void 0?i:"",this.opts={loop:!1,volume:1,...e},this.loop=this.opts.loop??!1,this.volume=this.opts.volume??1,this.ready=this.init(t).then(s=>{const r={width:0,height:0,duration:e.loop?1/0:this._meta.duration};return this.width=this.width===0?r.width:this.width,this.height=this.height===0?r.height:this.height,this.duration=this.duration===0?r.duration:this.duration,this.display.to=this.display.from+this.duration,this.trim.to=this.trim.to===0?this._meta.duration:Math.min(this.trim.to,this._meta.duration),this.trim.from=Math.min(this.trim.from,this.trim.to),r})}async init(t){ut.ctx==null&&(ut.ctx=new AudioContext({sampleRate:L.sampleRate}));const e=t instanceof ReadableStream?await ns(t,ut.ctx):t;this._meta.duration=e[0].length/L.sampleRate*1e6,this.chan0Buf=e[0],this.chan1Buf=e[1]??this.chan0Buf}tickInterceptor=async(t,e)=>e;timestamp=0;frameOffset=0;async tick(t){const e=t+this.trim.from,i=e-this.timestamp;if(e<this.timestamp||i>3e6)return this.timestamp=e,this.frameOffset=Math.ceil(this.timestamp/1e6*L.sampleRate),await this.tickInterceptor(t,{audio:[new Float32Array(0),new Float32Array(0)],state:"success"});this.timestamp=e;const s=Math.ceil(i/1e6*L.sampleRate),r=this.frameOffset+s,o=this.opts.loop?[$t(this.chan0Buf,this.frameOffset,r),$t(this.chan1Buf,this.frameOffset,r)]:[this.chan0Buf.slice(this.frameOffset,r),this.chan1Buf.slice(this.frameOffset,r)],a=this.effectiveVolume;if(a===0)for(const n of o)n.fill(0);else if(a!==1)for(const n of o)for(let c=0;c<n.length;c++)n[c]*=a;return this.frameOffset=r,await this.tickInterceptor(t,{audio:o,state:"success"})}async split(t){throw new Error("Audio.split is not implemented - use core state instead")}async clone(){await this.ready;const t=new ut(this.getPCMData(),this.opts,this.src);return await t.ready,this.copyStateTo(t),t}destroy(){this.chan0Buf=new Float32Array(0),this.chan1Buf=new Float32Array(0),Q.info("---- audioclip destroy ----"),super.destroy()}toJSON(t=!1){return{id:this.id,type:"Audio",name:this.name,src:this.src,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate,fadeIn:this.timing.fadeIn,fadeOut:this.timing.fadeOut},loop:this.loop,volume:this.volume,locked:this.locked,metadata:this.metadata}}async createPlaybackElement(){if(await this.ready,!this.src||this.src.trim()==="")throw new Error("Audio requires a source URL for playback");const t=this.src.startsWith("blob:")?this.src:void 0,e=document.createElement("audio");return e.crossOrigin="anonymous",e.autoplay=!1,e.preload="auto",e.loop=this.opts.loop||!1,e.src=this.src,await new Promise((i,s)=>{const r=()=>{e.removeEventListener("loadeddata",r),e.removeEventListener("error",o),e.pause(),e.currentTime=0,i()},o=()=>{e.removeEventListener("loadeddata",r),e.removeEventListener("error",o),s(new Error("Failed to load audio"))};e.addEventListener("loadeddata",r,{once:!0}),e.addEventListener("error",o,{once:!0}),e.load()}),{element:e,objectUrl:t}}async play(t,e){const i=t,s=e+this.trim.from/1e6;if(Math.abs(i.currentTime-s)>.1&&(i.currentTime=s),i.paused)try{await i.play()}catch{try{await i.play()}catch(o){console.warn("Failed to play audio:",o)}}}pause(t){t.pause()}async seek(t,e){const i=t,s=e+this.trim.from/1e6;return i.pause(),i.currentTime=s,new Promise(r=>{if(Math.abs(i.currentTime-e)<.01){r();return}const o=()=>{i.removeEventListener("seeked",o),r()};i.addEventListener("seeked",o,{once:!0}),setTimeout(()=>{i.removeEventListener("seeked",o),r()},500)})}syncPlayback(t,e,i){const s=t,r=this.duration&&this.duration!==1/0?this.duration/1e6:(this.display.to-this.display.from)/1e6,o=i>=0&&i<r,a=i+this.trim.from/1e6,n=r*1e3,c=i*1e3;let h=1;if(this.timing.fadeIn&&this.timing.fadeIn.duration>0&&c<this.timing.fadeIn.duration&&(h*=Ct(c/this.timing.fadeIn.duration,this.timing.fadeIn.curve)),this.timing.fadeOut&&this.timing.fadeOut.duration>0){const d=n-this.timing.fadeOut.duration;if(c>=d){const f=1-(c-d)/this.timing.fadeOut.duration;h*=Ct(f,this.timing.fadeOut.curve)}}s.volume=Math.max(0,Math.min(1,this.effectiveVolume*h)),e&&o?s.paused&&this.play(s,i).catch(console.warn):(s.paused||s.pause(),o&&Math.abs(s.currentTime-a)>.1&&(s.currentTime=a))}cleanupPlayback(t,e){const i=t;i.pause(),i.removeAttribute("src"),i.load(),e&&e.startsWith("blob:")&&URL.revokeObjectURL(e)}}async function ns(l,t){const e=await new Response(l).arrayBuffer();return _t(await t.decodeAudioData(e))}const as=`precision highp float;
64
+ `.replace(/\t/g,"").replace(/#/g,"%23");return o.src=`data:image/svg+xml;charset=utf-8,${n}`,await new Promise(c=>{o.onload=c}),o}async function es(l,t,e={}){const i=await ts(l,t,e),s=new OffscreenCanvas(i.width,i.height);return s.getContext("2d")?.drawImage(i,0,0,i.width,i.height),await createImageBitmap(s)}async function is(l,t){const e={type:t,data:l},i=new ImageDecoder(e);await Promise.all([i.completed,i.tracks.ready]);const s=i.tracks.selectedTrack?.frameCount??1,r=[];for(let o=0;o<s;o+=1)r.push((await i.decode({frameIndex:o})).image);return r}class se{all=new Map;on(t,e){const i=this.all.get(t);return i?i.push(e):this.all.set(t,[e]),()=>this.off(t,e)}once(t,e){const i=this.on(t,s=>{i(),e(s)});return i}off(t,e){const i=this.all.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):this.all.set(t,[]))}emit(t,e){let i=this.all.get(t);i&&i.slice().forEach(s=>{s(e)}),i=this.all.get("*"),i&&i.slice().forEach(s=>{s(t,e)})}}const ss={x:{label:"X Position",min:-2e3,max:2e3,step:1,default:0},y:{label:"Y Position",min:-2e3,max:2e3,step:1,default:0},width:{label:"Width",min:-1e3,max:1e3,step:1,default:0},height:{label:"Height",min:-1e3,max:1e3,step:1,default:0},scale:{label:"Scale",min:0,max:3,step:.1,default:1},scaleX:{label:"Scale X",min:0,max:3,step:.1,default:1},scaleY:{label:"Scale Y",min:0,max:3,step:.1,default:1},opacity:{label:"Opacity",min:0,max:1,step:.01,default:1},angle:{label:"Rotation",min:-360,max:360,step:1,default:0},blur:{label:"Blur",min:0,max:100,step:1,default:0},brightness:{label:"Brightness",min:0,max:5,step:.1,default:1},mirror:{label:"Mirror",min:0,max:1,step:1,default:0},motionBlur:{label:"Motion Blur",min:0,max:500,step:1,default:0}},Yt={linear:l=>l,easeInQuad:l=>l*l,easeOutQuad:l=>l*(2-l),easeInOutQuad:l=>l<.5?2*l*l:-1+(4-2*l)*l,easeInCubic:l=>l*l*l,easeOutCubic:l=>--l*l*l+1,easeInOutCubic:l=>l<.5?4*l*l*l:(l-1)*(2*l-2)*(2*l-2)+1,easeInSine:l=>1-Math.cos(l*Math.PI/2),easeOutSine:l=>Math.sin(l*Math.PI/2),easeInOutSine:l=>.5*(1-Math.cos(Math.PI*l)),easeInExpo:l=>l===0?0:Math.pow(2,10*(l-1)),easeOutExpo:l=>l===1?1:1-Math.pow(2,-10*l),easeInOutExpo:l=>l===0?0:l===1?1:(l/=.5)<1?.5*Math.pow(2,10*(l-1)):.5*(2-Math.pow(2,-10*--l)),easeInCirc:l=>1-Math.sqrt(1-l*l),easeOutCirc:l=>Math.sqrt(1-(l-1)*(l-1)),easeInOutCirc:l=>(l/=.5)<1?-.5*(Math.sqrt(1-l*l)-1):.5*(Math.sqrt(1-(l-2)*l)+1),slow:Oe(.5,.5,!1)};function Oe(l=.7,t=.7,e=!1){const i=Math.min(1,l),s=i<1?t:0,r=(1-i)/2,o=r+i;return a=>{const n=a+(.5-a)*s;if(a<r){const c=1-a/r;return e?1-c*c:n-c*c*c*n}if(a>o){const c=(a-o)/r;return e?a===1?0:1-c*c:n+(a-n)*c*c*c}return e?1:n}}function Ft(l){return typeof l=="function"?l:typeof l=="string"&&Yt[l]?Yt[l]:Yt.linear}class Ee{id;type;options;params;frames;constructor(t,e,i="keyframes"){this.id=e.id||`keyframe_${Math.random().toString(36).substr(2,9)}`,this.type=i,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"linear",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1},Array.isArray(t)?this.frames=t.map(s=>({progress:s.progress,props:s.props||s,easing:s.easing})):this.frames=Object.entries(t).filter(([s])=>{if(s==="from"||s==="to")return!0;const r=Number(s.replace("%",""));return!isNaN(r)&&r>=0&&r<=100}).map(([s,r])=>{const o={from:0,to:100}[s]??Number(s.replace("%","")),{easing:a,...n}=r;return{progress:o/100,props:n,easing:a}}).sort((s,r)=>s.progress-r.progress),this.frames.length>0&&this.frames[0].progress!==0&&this.frames.unshift({progress:0,props:{}}),this.frames.length>0&&this.frames[this.frames.length-1].progress!==1&&this.frames.push({progress:1,props:{}})}getTransform(t){const{duration:e,delay:i,iterCount:s,easing:r,disableGlobalEasing:o}=this.options,a=t-i;if(a<0)return{};if(s!==1/0&&a>=e)return this.interpolateProps(1);const n=s===1/0?e:e/s;let c=a%n/n;return!o&&r!=="linear"&&(c=Ft(r)(c)),this.interpolateProps(c)}interpolateProps(t){const e=this.frames.findIndex(d=>d.progress>=t);if(e===-1)return this.frames[this.frames.length-1].props;if(e===0)return this.frames[0].props;const i=this.frames[e-1],s=this.frames[e],r=(t-i.progress)/(s.progress-i.progress),o=s.easing??(this.options.disableGlobalEasing?this.options.easing:"linear"),n=Ft(o)(r),c={},h=new Set([...Object.keys(i.props),...Object.keys(s.props)]);for(const d of h){const u=d,f=u==="scale"||u==="scaleX"||u==="scaleY"||u==="opacity"?1:0,p=i.props[u]??f,g=s.props[u]??f;c[u]=p+(g-p)*n}return c}}const re=["scale","scaleX","scaleY","rotation","skewX","skewY","skew","pivotX","pivotY","pivot","anchorX","anchorY","anchor","blur","brightness","contrast","grayscale","hueRotate","invert","saturate","threshold","matrix"],De=l=>l&&Object.keys(l).some(t=>re.includes(t)),gt=l=>{if(!l)return l;const t={...l};if(t.keyframes){if(Array.isArray(t.keyframes))t.keyframes=t.keyframes.map(i=>gt(i));else if(typeof t.keyframes=="object"){const i={};for(const[s,r]of Object.entries(t.keyframes))r&&typeof r=="object"?i[s]=gt(r):i[s]=r;t.keyframes=i}}if(!De(t))return t;const e={};return re.forEach(i=>{i in t&&(e[i]=t[i],delete t[i])}),t.pixi=e,t};function pt(l,t){if(typeof l=="number")return l;if(typeof l=="string"){if(l.startsWith("+="))return t+parseFloat(l.substring(2));if(l.startsWith("-="))return t-parseFloat(l.substring(2))}const e=parseFloat(l);return isNaN(e)?t:e}function rs(l){const t=new Set;return l&&l.keyframes&&(Array.isArray(l.keyframes)?l.keyframes.forEach(e=>{e&&typeof e=="object"&&Object.keys(e).forEach(i=>t.add(i))}):typeof l.keyframes=="object"&&Object.values(l.keyframes).forEach(e=>{e&&typeof e=="object"&&Object.keys(e).forEach(i=>t.add(i))})),t}function Rt(l,t,e,i){const s={},r={},o=new Set([...Object.keys(l||{}),...Object.keys(t||{})]),a=rs(t);for(const n of o){if(["immediateRender","ease","duration","stagger","repeat","yoyo","keyframes"].includes(n)){l&&n in l&&(s[n]=l[n]),t&&n in t&&(r[n]=t[n]);continue}const c=e[n]??0;if(a.has(n)){const h=l?l[n]:void 0;s[n]=h!==void 0?pt(h,c):c;continue}if(i){const h=l?l[n]:void 0,d=t?t[n]:void 0,u=typeof h=="string"&&(h.startsWith("+=")||h.startsWith("-=")),f=typeof d=="string"&&(d.startsWith("+=")||d.startsWith("-="));if(u){s[n]=c;const p=pt(h,0);r[n]=c+p}else if(f){s[n]=h!==void 0?pt(h,c):c;const p=pt(d,0);r[n]=s[n]+p}else s[n]=h!==void 0?pt(h,c):c,r[n]=d!==void 0?pt(d,c):c}else{const h=l?l[n]:void 0,d=t?t[n]:void 0;s[n]=h!==void 0?pt(h,c):c;const u=s[n];r[n]=d!==void 0?pt(d,u):c}}if(t&&t.keyframes){if(Array.isArray(t.keyframes)){if(r.keyframes=t.keyframes.map(n=>{const{resolvedTo:c}=Rt(null,n,{...e,...s},i);return c}),r.keyframes.length>0){const n=r.keyframes[r.keyframes.length-1];n&&typeof n=="object"&&Object.keys(n).forEach(c=>{r[c]===void 0&&(r[c]=n[c])})}}else if(typeof t.keyframes=="object"){const n={};for(const[h,d]of Object.entries(t.keyframes))if(d&&typeof d=="object"){const{resolvedTo:u}=Rt(null,d,{...e,...s},i);n[h]=u}else n[h]=d;r.keyframes=n;const c=n["100%"];c&&typeof c=="object"&&Object.keys(c).forEach(h=>{r[h]===void 0&&(r[h]=c[h])})}}return{resolvedFrom:s,resolvedTo:r}}function Pe(l,t){const e=new Set,i=["immediateRender","ease","duration","stagger","repeat","yoyo","keyframes"];if(l)for(const s of Object.keys(l))i.includes(s)||e.add(s);if(t){for(const s of Object.keys(t))i.includes(s)||e.add(s);if(t.keyframes){if(Array.isArray(t.keyframes))for(const s of t.keyframes)for(const r of Object.keys(s))i.includes(r)||e.add(r);else if(typeof t.keyframes=="object"){for(const s of Object.values(t.keyframes))if(s&&typeof s=="object")for(const r of Object.keys(s))i.includes(r)||e.add(r)}}}return Array.from(e)}function Ie(l,t){if(t==="scale"||t==="scaleX")return l.scale?.x??1;if(t==="scaleY")return l.scale?.y??1;if(t==="anchor"||t==="anchorX")return l.anchor?.x??0;if(t==="anchorY")return l.anchor?.y??0;if(t==="pivot"||t==="pivotX")return l.pivot?.x??0;if(t==="pivotY")return l.pivot?.y??0;if(t==="skew"||t==="skewX")return(l.skew?.x??0)*180/Math.PI;if(t==="skewY")return(l.skew?.y??0)*180/Math.PI;if(t==="rotation")return l.angle??0;const e=ut.getProperty(l,t);if(typeof e=="number")return e;if(e&&typeof e=="object"&&"x"in e&&typeof e.x=="number")return e.x;const i=parseFloat(e);return isNaN(i)?0:i}ut.registerPlugin(Ce.PixiPlugin),Ce.PixiPlugin.registerPIXI(Ci);class Be{id;type;options;params;timeline=null;lastTarget=null;originalProperties=new Map;constructor(t,e,i="gsap"){this.id=e.id||`gsap_${Math.random().toString(36).substr(2,9)}`,this.type=i,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"none",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){return{}}get isOutAnimation(){return this.options.mode==="out"||this.params.metaMode==="out"||this.params.mode==="out"||this.id.toLowerCase().includes("out")}restoreOriginals(){this.originalProperties.forEach((t,e)=>{if(e&&!e.destroyed)try{const i=gt(t);ut.set(e,i),delete e.__ovAnchorAdjusted}catch{}})}getTargetCount(t){return this.getCurrentTargets(t).length}apply(t,e){const{duration:i,delay:s}=this.options,r=e-s;let o=this.lastTarget!==t||!this.timeline||this.originalProperties.size===0;const a=this.getCurrentTargets(t);if(!o)if(this.originalProperties.size!==a.length)o=!0;else for(const x of a){if(!this.originalProperties.has(x)||x.destroyed||!x.parent){o=!0;break}const w=!!x.anchor,T=!x.anchor&&x.pivot&&x.getLocalBounds;if(w&&!x.__ovAnchorAdjusted&&x.width>0&&x.height>0){o=!0;break}if(T&&!x.__ovAnchorAdjusted){const y=x.getLocalBounds();if(y.width>0&&y.height>0){o=!0;break}}}if(o&&(this.initTimeline(t),this.lastTarget=t),!this.timeline)return;const n=this.options.iterCount===1/0?i:i/this.options.iterCount;let c;if(this.options.iterCount!==1/0&&r>=i)c=1;else if(r<0){if(this.isOutAnimation)return;c=0}else c=r%n/n;this.timeline.progress(c);const h=c*this.timeline.duration(),d=this.getCurrentTargets(t),u=i/1e6,{from:f,to:p,stagger:g}=this.params,v=typeof g=="number"?g:0;d.forEach((x,w)=>{const T=w*v,y=T+u,C=this.isOutAnimation;if(h<T){const k=this.originalProperties.get(x)||{},{resolvedFrom:O}=Rt(f,p,k,C),F=gt(O);ut.set(x,F)}else if(h>y){const k=this.originalProperties.get(x)||{},{resolvedTo:O}=Rt(f,p,k,C),F=gt(O);ut.set(x,F)}})}getCurrentTargets(t){if(!t)return[];const{type:e}=this.params;let i=t;if(t.children){const s=t.children.find(r=>r.label==="TextOnlyContainer");s&&(i=s)}if(e==="character"||e==="word"){if(!i||!i.children||i.children.length===0)return[];if(e==="character"){const s=(r,o=!1)=>{if(r&&r.label==="LineMask")return[];if(!r.children||r.children.length===0)return o?[]:[r];let a=[];for(const n of r.children)a=a.concat(s(n));return a};return s(i,!0)}else{if(i.children.some(r=>r&&r.label==="LineContainer")){const r=[];for(const o of i.children)o&&o.label==="LineContainer"&&o.children&&r.push(...o.children);return r}return i.children}}return[t]}initTimeline(t){const{from:e,to:i,stagger:s,type:r}=this.params,o=this.options.duration/1e6,a=this.getCurrentTargets(t);if((r==="character"||r==="word")&&a.length===0){this.timeline&&(this.timeline.kill(),this.timeline=null);return}this.timeline&&this.timeline.kill(),this.restoreOriginals(),this.originalProperties.clear(),this.timeline=ut.timeline({paused:!0}),a.forEach(d=>{if(d.anchor){if(!d.__ovAnchorAdjusted&&d.width>0&&d.height>0){if(d.anchor.x!==.5||d.anchor.y!==.5){const u=d.anchor.x,f=d.anchor.y;d.anchor.set(.5,.5);const p=d.width/(d.scale?.x||1),g=d.height/(d.scale?.y||1);d.x+=(.5-u)*p*(d.scale?.x||1),d.y+=(.5-f)*g*(d.scale?.y||1)}d.__ovAnchorAdjusted=!0}}else if(d.pivot&&d.getLocalBounds&&!d.__ovAnchorAdjusted){const u=d.getLocalBounds(),f=u.x+u.width/2,p=u.y+u.height/2;if(u.width>0&&u.height>0){if(d.pivot.x!==f||d.pivot.y!==p){const g=d.pivot.x,v=d.pivot.y;d.pivot.set(f,p),d.x+=(f-g)*(d.scale?.x||1),d.y+=(p-v)*(d.scale?.y||1)}d.__ovAnchorAdjusted=!0}}});const n=Pe(e,i);a.forEach(d=>{const u={};d.__ovOriginalProperties=d.__ovOriginalProperties||{},n.forEach(f=>{d.__ovOriginalProperties[f]===void 0&&(d.__ovOriginalProperties[f]=Ie(d,f)),u[f]=d.__ovOriginalProperties[f]}),this.originalProperties.set(d,u)});const c=typeof s=="number"?s:0,h=this.isOutAnimation;a.forEach((d,u)=>{const f=this.originalProperties.get(d)||{},{resolvedFrom:p,resolvedTo:g}=Rt(e,i,f,h),v=gt(p),x=gt(g);this.timeline.add(ut.fromTo(d,v,{duration:o,ease:this.options.easing,immediateRender:!h,...x}),u*c)})}destroy(){this.timeline&&(this.timeline.kill(),this.timeline=null),this.restoreOriginals(),this.originalProperties.clear()}}class Ne{id;type="wipe";options;params;constructor(t,e){this.id=e.id||`wipe_${Math.random().toString(36).substr(2,9)}`,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"linear",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){const{duration:e,delay:i,easing:s,iterCount:r}=this.options,{direction:o,mode:a,angle:n,feather:c}=this.params,h=t-i,d=a!=="conceal",u=r!==1/0&&h>=e;if(d&&u)return{};if(!d&&h<0)return{};let f;if(h<0)f=0;else if(r!==1/0&&h>=e)f=1;else{const x=r===1/0?e:e/r;f=h%x/x}const g=Ft(s)(f);return{mask:{shape:"rect",progress:a==="reveal"?g:1-g,direction:o,angle:n??0,feather:c??0,...this.params.initialProgress!=null&&{initialProgress:this.params.initialProgress}}}}}function $(l){if(l!=null){if(typeof l=="number")return l;if(typeof l=="string"){if(l==="transparent")return;if(l.startsWith("#")){const e=parseInt(l.slice(1),16);if(!isNaN(e))return e}if(l.startsWith("0x")){const e=parseInt(l,16);if(!isNaN(e))return e}const t=parseInt(l,16);if(!isNaN(t))return t;try{return new m.Color(l).toNumber()}catch{return}}}}const It=l=>l==="transparent"||l===""||l===void 0||l===null,Mt=(l,t=16777215)=>It(l)?{color:t,alpha:0}:{color:$(l)??t,alpha:1};function Bt(l){try{const e=new m.Color(l).toRgbArray();return{r:Math.round(e[0]*255),g:Math.round(e[1]*255),b:Math.round(e[2]*255)}}catch{return null}}function os(l,t){const e=new m.Container;e.label="InvertTextContainer";for(const i of l.children){if(!(i instanceof m.Container)||i.label!=="LineContainer")continue;const s=new m.Container;s.label="LineContainer";for(const r of i.children){if(!(r instanceof m.SplitBitmapText))continue;const o=r.style,a=new m.TextStyle({fontFamily:o.fontFamily,fontSize:o.fontSize,fontWeight:o.fontWeight,fontStyle:o.fontStyle,align:o.align,wordWrap:o.wordWrap,wordWrapWidth:o.wordWrapWidth,lineHeight:o.lineHeight,letterSpacing:o.letterSpacing,fill:t}),n=new m.SplitBitmapText({text:r.text,style:a});n.x=r.x,n.y=r.y,r.filters&&(n.filters=[...r.filters]),s.addChild(n)}e.addChild(s)}return e}function ze(l,t,e,i,s){const{x:r,y:o,w:a,h:n}=l;let c=r,h=o,d=0,u=n;if(i==="reveal"){const f=t<=.5,p=f?t*2:(t-.5)*2;e==="left"?(c=f?r:r+p*a,d=f?p*a:a-p*a,h=o,u=n):e==="right"?(c=f?r+a-p*a:r,d=f?p*a:a-p*a,h=o,u=n):e==="top"?(h=f?o:o+p*n,u=f?p*n:n-p*n,c=r,d=a):(h=f?o+n-p*n:o,u=f?p*n:n-p*n,c=r,d=a)}else if(e==="left"){const f=s*a,p=r-f+t*(a+f);c=Math.max(r,p),d=Math.min(r+a,p+f)-c,h=o,u=n}else if(e==="right"){const f=s*a,p=r+a-t*(a+f);c=Math.max(r,p),d=Math.min(r+a,p+f)-c,h=o,u=n}else if(e==="top"){const f=s*n,p=o-f+t*(n+f);h=Math.max(o,p),u=Math.min(o+n,p+f)-h,c=r,d=a}else{const f=s*n,p=o+n-t*(n+f);h=Math.max(o,p),u=Math.min(o+n,p+f)-h,c=r,d=a}return{x:c,y:h,w:d,h:u}}class Le{id;type="blockReveal";options;params;constructor(t,e){this.id=e.id||`block_reveal_${Math.random().toString(36).substring(2,9)}`,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"easeInOutCubic",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){return{}}apply(t,e){if(!(t instanceof m.Container)||t.destroyed)return;const i=t,{duration:s,delay:r,easing:o}=this.options,a=e-r;if(a<0){this.cleanup(i);return}const n=Ft(o)(Math.min(a/s,1));if(n>=1){this.cleanup(i);return}const c=t.children.find(S=>S.label==="TextOnlyContainer");if(!c||c.destroyed)return;const h=$(this.params.blockColor)??16777215,d=$(this.params.textColorInside)??0,u=this.params.direction??"right",f=this.params.mode??"reveal",p=this.params.blockSize??.3;let g=i.__blockGraphics,v=i.__invertTextContainer,x=i.__maskGraphics;!g||g.destroyed?(g=new m.Graphics,g.label="BlockReveal_Block",t.addChild(g),i.__blockGraphics=g):t.children.indexOf(g)===-1&&t.addChild(g),!v||v.destroyed?(v=os(c,d),t.addChild(v),i.__invertTextContainer=v):t.children.indexOf(v)===-1&&t.addChild(v),!x||x.destroyed?(x=new m.Graphics,x.label="BlockReveal_Mask",t.addChild(x),i.__maskGraphics=x,v.mask=x):t.children.indexOf(x)===-1&&t.addChild(x);const w=t.children.indexOf(c),T=t.children.indexOf(g),y=t.children.indexOf(v);if(w!==-1&&T!==-1&&y!==-1){T<w&&t.setChildIndex(g,w+1);const S=t.children.indexOf(g);y<S&&t.setChildIndex(v,S+1)}const C=i.__clip,k=t.getLocalBounds(),O=C?._lineRects;g.clear(),x.clear();let F=!1;const b=S=>{S.w>0&&S.h>0&&(g.rect(S.x,S.y,S.w,S.h).fill({color:h}),x.rect(S.x,S.y,S.w,S.h).fill({color:16777215}),F=!0)};if(O&&O.length>0){const S=C?C.width:k.width,A=C?0:k.x;for(const E of O)b(ze({x:A,y:E.y,w:S,h:E.h},n,u,f,p))}else b(ze({x:k.x,y:k.y,w:k.width,h:k.height},n,u,f,p));g.visible=F,v.visible=F}cleanup(t){t.__blockGraphics&&(t.__blockGraphics.destroyed||t.__blockGraphics.destroy(),t.__blockGraphics=null),t.__invertTextContainer&&(t.__invertTextContainer.destroyed||t.__invertTextContainer.destroy({children:!0}),t.__invertTextContainer=null),t.__maskGraphics&&(t.__maskGraphics.destroyed||t.__maskGraphics.destroy(),t.__maskGraphics=null)}}class Ot{id;options;params;constructor(t,e){this.id=e.id||`mask_${Math.random().toString(36).substr(2,9)}`,this.params=t,this.options={duration:e.duration,delay:e.delay??0,easing:e.easing??"linear",iterCount:e.iterCount??1,id:this.id,disableGlobalEasing:e.disableGlobalEasing??!1}}getTransform(t){const{duration:e,delay:i,easing:s,iterCount:r}=this.options,o=t-i,a=this.params.mode!=="conceal",n=r!==1/0&&o>=e;if(a&&n)return{};if(!a&&o<0)return{};let c;if(o<0)c=0;else if(r!==1/0&&o>=e)c=1;else{const p=r===1/0?e:e/r;c=o%p/p}const d=Ft(s)(c),u=this.params.mode==="conceal"?1-d:d,f=this.buildMask(u);return this.params.initialProgress!=null&&(f.initialProgress=this.params.initialProgress),{mask:f}}}class He extends Ot{type="circleReveal";constructor(t,e){super(t,e)}buildMask(t){return{shape:"circle",progress:t,origin:this.params.origin??"center",feather:this.params.feather??0}}}class Ge extends Ot{type="rectExpand";constructor(t,e){super(t,e)}buildMask(t){const e=this.params.origin??"center";return{shape:"custom",progress:t,painter:(s,r,o,a)=>{let n=0,c=0;switch(e){case"topLeft":n=-r/2,c=-o/2;break;case"topRight":n=r/2,c=-o/2;break;case"bottomLeft":n=-r/2,c=o/2;break;case"bottomRight":n=r/2,c=o/2;break;default:n=0,c=0}const h=r/2*a,d=o/2*a,u=Math.max(-r/2,n-h),f=Math.max(-o/2,c-d),p=Math.min(r,h*2),g=Math.min(o,d*2);p>0&&g>0&&s.rect(u,f,p,g).fill({color:16777215})}}}}class Ue extends Ot{type="centerExpand";constructor(t,e){super(t,e)}buildMask(t){const e=this.params.axis??"vertical";return{shape:"custom",progress:t,painter:(s,r,o,a)=>{let n,c;switch(e){case"horizontal":n=r*a,c=o;break;case"both":n=r*a,c=o*a;break;default:n=r,c=o*a;break}s.rect(-n/2,-c/2,n,c).fill({color:16777215})}}}}class We extends Ot{type="angleWipe";constructor(t,e){super(t,e)}buildMask(t){return{shape:"rect",progress:t,direction:"left",angle:this.params.angle??0,feather:this.params.feather??0}}}class Ve extends Ot{type="starReveal";constructor(t,e){super(t,e)}buildMask(t){const{points:e=5,innerRatio:i=.4}=this.params;return{shape:"custom",progress:t,painter:(r,o,a,n)=>{const h=Math.hypot(o,a)/2*n,d=h*i,u=0,f=0,p=e*2,g=[];for(let v=0;v<p;v++){const x=Math.PI/e*v-Math.PI/2,w=v%2===0?h:d;g.push(u+Math.cos(x)*w,f+Math.sin(x)*w)}r.poly(g,!0).fill({color:16777215})}}}}class Ye extends Ot{type="edgeCrop";constructor(t,e){super(t,e)}buildMask(t){const e=this.params;return{shape:"edgeCrop",progress:t,origin:e.origin??"center",xDistance:e.xDistance??100,yDistance:e.yDistance??100,maskBorderRadius:e.maskBorderRadius??0,feather:e.feather??0}}}class ns{factories=new Map;constructor(){this.register("keyframes",(e,i)=>new Ee(i,e));const t=(e,i)=>new Be(i,e,"stagger");this.register("stagger",t),this.register("wipe",(e,i)=>new Ne(i,e)),this.register("circleReveal",(e,i)=>new He(i,e)),this.register("rectExpand",(e,i)=>new Ge(i,e)),this.register("angleWipe",(e,i)=>new We(i,e)),this.register("starReveal",(e,i)=>new Ve(i,e)),this.register("centerExpand",(e,i)=>new Ue(i,e)),this.register("edgeCrop",(e,i)=>new Ye(i,e)),this.register("blockReveal",(e,i)=>new Le(i,e))}register(t,e){this.factories.set(t,e)}create(t,e,i){const s=this.factories.get(t);if(!s)throw new Error(`Animation "${t}" not found in registry`);return s(e,i)}has(t){return this.factories.has(t)}}const Qt=new ns;class as extends se{id="";name="";timing={display:{from:0,to:0},trim:{from:0,to:0},duration:0,playbackRate:1};get display(){return this.timing.display}set display(t){this.timing.display=t}get duration(){return this.timing.duration}set duration(t){this.timing.duration=t}get playbackRate(){return this.timing.playbackRate}set playbackRate(t){this.timing.playbackRate=t}get trim(){return this.timing.trim}set trim(t){this.timing.trim=t}constructor(){super()}_left=0;get left(){return this._left}set left(t){const e=this._left!==t;this._left=t,e&&this.emit("propsChange",{left:t})}_top=0;get top(){return this._top}set top(t){const e=this._top!==t;this._top=t,e&&this.emit("propsChange",{top:t})}_width=0;get width(){return this._width}set width(t){const e=this._width!==t;this._width=t,e&&this.emit("propsChange",{width:t})}_height=0;get height(){return this._height}set height(t){const e=this._height!==t;this._height=t,e&&this.emit("propsChange",{height:t})}_angle=0;get angle(){return this._angle}set angle(t){const e=this._angle!==t;this._angle=t,e&&this.emit("propsChange",{angle:t})}get center(){return{x:this.left+this.width/2,y:this.top+this.height/2}}_zIndex=0;get zIndex(){return this._zIndex}set zIndex(t){const e=this._zIndex!==t;this._zIndex=t,e&&this.emit("propsChange",{zIndex:t})}_opacity=1;get opacity(){return this._opacity}set opacity(t){const e=this._opacity!==t;this._opacity=t,e&&this.emit("propsChange",{opacity:t})}_volume=1;get volume(){return this._volume}set volume(t){const e=this._volume!==t;this._volume=t,e&&this.emit("propsChange",{volume:t})}_locked=!1;get locked(){return this._locked}set locked(t){const e=this._locked!==t;this._locked=t,e&&this.emit("propsChange",{locked:t})}_muted=!1;get muted(){return this._muted}set muted(t){const e=this._muted!==t;this._muted=t,e&&this.emit("propsChange",{muted:t})}_trackMuted=!1;get trackMuted(){return this._trackMuted}set trackMuted(t){this._trackMuted!==t&&(this._trackMuted=t,this.onEffectiveVolumeChange())}onEffectiveVolumeChange(){}get effectiveVolume(){return this._muted||this.trackMuted?0:this.volume}flip=null;effects=[];chromaKey;colorAdjustment;_style={};get style(){return this._style}set style(t){this._style=t}animatKeyFrame=null;animatOptions=null;_animations=[];get animations(){return this._animations}set animations(t){if(!Array.isArray(t)){this._animations.forEach(e=>{e&&typeof e.destroy=="function"&&e.destroy()}),this._animations=[];return}this._animations.forEach(e=>{if(e&&e.id){const i=t.find(o=>o&&o.id===e.id),s=i&&typeof i.getTransform!="function";(!i||s)&&typeof e.destroy=="function"&&e.destroy()}}),this._animations=t.map(e=>{if(e&&typeof e.getTransform=="function")return e;if(e&&e.type&&e.options)try{return Qt.create(e.type,e.options,e.params)}catch(i){return console.error(`[BaseSprite] Failed to instantiate animation: ${e.type}`,i),e}return e})}renderTransform={x:0,y:0,width:0,height:0,scale:1,scaleX:1,scaleY:1,opacity:1,angle:0,blur:0,brightness:1,mirror:0,motionBlur:0};_render(t){const{center:e}=this;t.setTransform(this.flip?.x?-1:1,0,0,this.flip?.y?-1:1,e.x,e.y),t.globalAlpha=this.opacity*(this.renderTransform.opacity??1)*(this.renderTransform.brightness??1);const i=this.renderTransform.x??0,s=this.renderTransform.y??0,r=this.renderTransform.angle??0,o=this.renderTransform.scale??1,a=this.renderTransform.scaleX??1,n=this.renderTransform.scaleY??1;t.translate(i,s),t.scale(o*a,o*n),t.rotate((this.flip==null?1:-1)*(r*Math.PI)/180)}setAnimation(t,e){this.animatKeyFrame=Object.entries(t).map(([i,s])=>{const r={from:0,to:100}[i]??Number(i.slice(0,-1));if(isNaN(r)||r>100||r<0)throw Error("keyFrame must between 0~100");return[r/100,s]}),this.animatOptions=Object.assign({},this.animatOptions,{duration:e.duration,delay:e.delay??0,iterCount:e.iterCount??1/0}),this.emit("propsChange",{animations:this.animations})}animate(t,e){this.renderTransform={x:0,y:0,width:0,height:0,scale:1,scaleX:1,scaleY:1,opacity:1,angle:0,blur:0,brightness:1,mirror:0,motionBlur:0,__lastSpriteTime:t};const i=[...this.animations].sort((r,o)=>(r.options?.delay??0)-(o.options?.delay??0));if(e)for(const r of i)r.type==="stagger"&&r.restoreOriginals&&r.restoreOriginals(e);for(const r of i){const o=r.getTransform(t);o.x!==void 0&&(this.renderTransform.x+=o.x),o.y!==void 0&&(this.renderTransform.y+=o.y),o.width!==void 0&&(this.renderTransform.width+=o.width),o.height!==void 0&&(this.renderTransform.height+=o.height),o.angle!==void 0&&(this.renderTransform.angle+=o.angle),o.blur!==void 0&&(this.renderTransform.blur+=o.blur),o.motionBlur!==void 0&&(this.renderTransform.motionBlur+=o.motionBlur),o.scale!==void 0&&(this.renderTransform.scale*=o.scale),o.scaleX!==void 0&&(this.renderTransform.scaleX*=o.scaleX),o.scaleY!==void 0&&(this.renderTransform.scaleY*=o.scaleY),o.opacity!==void 0&&(this.renderTransform.opacity*=o.opacity),o.brightness!==void 0&&(this.renderTransform.brightness*=o.brightness),o.mirror!==void 0&&(this.renderTransform.mirror=Math.max(this.renderTransform.mirror||0,o.mirror)),o.mask!==void 0&&(this.renderTransform.mask=o.mask),e&&r.apply&&r.apply(e,t)}if(this.animatKeyFrame==null||this.animatOptions==null||t<this.animatOptions.delay)return;const s=ls(t,this.animatKeyFrame,this.animatOptions);for(const r in s)switch(r){case"opacity":this.opacity=s[r];break;case"x":this.left=s[r];break;case"y":this.top=s[r];break;case"w":this.width=s[r];break;case"h":this.height=s[r];break;case"angle":this.angle=s[r];break}}addAnimation(t,e,i){const s=Qt.create(t,e,i);return this.animations.push(s),this.emit("propsChange",{animations:this.animations}),s.id}removeAnimation(t){const e=this.animations.find(i=>i.id===t);e&&typeof e.destroy=="function"&&e.destroy(),this.animations=this.animations.filter(i=>i.id!==t),this.emit("propsChange",{animations:this.animations})}clearAnimations(){this.animations.forEach(t=>{t&&typeof t.destroy=="function"&&t.destroy()}),this.animations=[],this.emit("propsChange",{animations:this.animations})}updateAnimation(t,e,i,s){const r=this.animations.findIndex(n=>n.id===t);if(r===-1)return;const o=this.animations[r];o&&typeof o.destroy=="function"&&o.destroy();const a=Qt.create(e,{...i,id:t},s);this.animations[r]=a,this.emit("propsChange",{animations:this.animations})}copyStateTo(t){t.animatKeyFrame=this.animatKeyFrame,t.animatOptions=this.animatOptions,t.zIndex=this.zIndex,t.opacity=this.opacity,t.volume=this.volume,t.flip=this.flip,t.left=this.left,t.top=this.top,t.width=this.width,t.height=this.height,t.angle=this.angle,t.display={...this.display},t.duration=this.duration,t.playbackRate=this.playbackRate,t.trim={...this.trim},this.timing.fadeIn!==void 0&&(t.timing.fadeIn={...this.timing.fadeIn}),this.timing.fadeOut!==void 0&&(t.timing.fadeOut={...this.timing.fadeOut}),t.style=JSON.parse(JSON.stringify(this.style||{})),t.animations=[...this.animations],this.chromaKey!==void 0&&(t.chromaKey={...this.chromaKey}),this.colorAdjustment!==void 0&&(t.colorAdjustment=JSON.parse(JSON.stringify(this.colorAdjustment))),t.locked=this.locked,t.muted=this.muted,"src"in this&&"src"in t&&(t.src=this.src),"metadata"in this&&"metadata"in t&&(t.metadata=JSON.parse(JSON.stringify(this.metadata||{})))}update(t){Object.assign(this,t),this.emit("propsChange",t)}destroy(){this.animations.forEach(t=>{t&&typeof t.destroy=="function"&&t.destroy()}),this.animations=[],this.all.clear()}}function ls(l,t,e){const i=l-e.delay,s=i%e.duration,r=i/e.duration>=e.iterCount||i===e.duration?1:s/e.duration,o=t.findIndex(f=>f[0]>=r);if(o===-1)return{};const a=t[o-1],n=t[o],c=n[1];if(a==null)return c;const h=a[1],d={},u=(r-a[0])/(n[0]-a[0]);for(const f in c){if(!Object.hasOwn(c,f)||typeof f!="string")continue;const p=f;h[p]!=null&&(d[p]=(c[p]-h[p])*u+h[p])}return d}async function cs(l){try{const t=await createImageBitmap(l);return l.close(),t}catch{const t=l.displayWidth,e=l.displayHeight;if(t<=0||e<=0)throw l.close(),new Error("VideoFrame has invalid dimensions");const i=new OffscreenCanvas(t,e),s=i.getContext("2d");if(s==null)throw l.close(),new Error("Failed to get 2d context for VideoFrame conversion");return s.drawImage(l,0,0,t,e),l.close(),createImageBitmap(i)}}class K extends as{lastVf=null;destroyed=!1;src="";metadata={};transition;renderTexturePadding;constructor(){super()}async getFrame(t){const e=t*this.playbackRate,{video:i,audio:s,state:r}=await this.tick(e);let o=s??[];s!=null&&this.playbackRate!==1&&(o=s.map(n=>Fe(n,this.playbackRate)));let a=null;if(i!=null)if(i instanceof VideoFrame){this.lastVf?.close();const n=await cs(i);this.lastVf=n,a=n}else this.lastVf?.close(),this.lastVf=i,a=i;else this.lastVf!=null&&(a=this.lastVf);return{video:a,audio:o,done:r==="done"}}async offscreenRender(t,e){const i=e*this.playbackRate;this.animate(i),super._render(t);const{width:s,height:r}=this,{video:o,audio:a,state:n}=await this.tick(i);let c=a??[];if(a!=null&&this.playbackRate!==1&&(c=a.map(d=>Fe(d,this.playbackRate))),n==="done")return{audio:c,done:!0};const h=o??this.lastVf;if(h!=null){const d=this.style.borderRadius||0,u=this.style.shadow;if(t.save(),u&&(u.blur>0||u.offsetX!==void 0||u.offsetY!==void 0)&&(t.shadowColor=u.color||"#000000",t.shadowBlur=u.blur||0,t.shadowOffsetX=u.offsetX??0,t.shadowOffsetY=u.offsetY??0),d>0){const p=Math.min(d,s/2,r/2);t.beginPath(),t.roundRect(-s/2,-r/2,s,r,p),t.clip()}t.drawImage(h,-s/2,-r/2,s,r),t.restore();const f=this.style.stroke;if(f&&f.width>0){if(t.save(),t.strokeStyle=f.color,t.lineWidth=f.width,d>0){const p=Math.min(d,s/2,r/2);t.beginPath(),t.roundRect(-s/2,-r/2,s,r,p),t.stroke()}else t.strokeRect(-s/2,-r/2,s,r);t.restore()}}return o!=null&&(this.lastVf?.close(),o instanceof ImageBitmap&&(this.lastVf=o)),{audio:c,done:!1}}set(t,e=30){return t.timing&&(t.timing.display&&(t.timing.display.from!==void 0&&(this.timing.display.from=t.timing.display.from),t.timing.display.to!==void 0&&(this.timing.display.to=t.timing.display.to)),t.timing.trim&&(t.timing.trim.from!==void 0&&(this.timing.trim.from=t.timing.trim.from),t.timing.trim.to!==void 0&&(this.timing.trim.to=t.timing.trim.to)),t.timing.duration!==void 0&&(this.timing.duration=t.timing.duration),t.timing.playbackRate!==void 0&&(this.timing.playbackRate=t.timing.playbackRate),t.timing.fadeIn!==void 0&&(this.timing.fadeIn=t.timing.fadeIn),t.timing.fadeOut!==void 0&&(this.timing.fadeOut=t.timing.fadeOut)),t.display&&(t.display.from!==void 0&&(this.display.from=t.display.from),t.display.to!==void 0&&(this.display.to=t.display.to)),t.x!==void 0&&(this.left=t.x),t.y!==void 0&&(this.top=t.y),t.width!==void 0&&(this.width=t.width),t.height!==void 0&&(this.height=t.height),t.duration!==void 0&&(this.duration=t.duration,this.display.from!==void 0&&(this.display.to=this.display.from+this.duration)),this}toJSON(t=!1){const e=this.animatKeyFrame&&this.animatOptions?{keyFrames:this.animatKeyFrame.reduce((r,[o,a])=>{const n=o===0?"from":o===1?"to":`${Math.round(o*100)}%`;return r[n]=a,r},{}),options:this.animatOptions}:void 0,i=this.animations.map(r=>"toJSON"in r&&typeof r.toJSON=="function"?r.toJSON():{type:r.type,options:r.options,params:r.params||{}}),s=this.style?JSON.parse(JSON.stringify(this.style)):void 0;return{type:this.type,id:this.id,name:this.name,src:this.src,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate,fadeIn:this.timing.fadeIn,fadeOut:this.timing.fadeOut},transform:{x:this.left,y:this.top,width:this.width,height:this.height,angle:this.angle,opacity:this.opacity,zIndex:this.zIndex,flip:this.flip},style:s,...e&&{animation:e},...i.length>0&&{animations:i},...t&&{main:!0},...this.chromaKey!==void 0&&{chromaKey:this.chromaKey},...this.colorAdjustment!==void 0&&{colorAdjustment:this.colorAdjustment},locked:this.locked,muted:this.muted,metadata:this.metadata}}getVisibleHandles(){return["tl","tr","bl","br","ml","mr","mt","mb","rot"]}async scaleToFit(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.min(t/i,e/s);this.width=i*r,this.height=s*r}async scaleToFill(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.max(t/i,e/s);this.width=i*r,this.height=s*r}centerInScene(t,e){this.left=(t-this.width)/2,this.top=(e-this.height)/2}destroy(){this.destroyed||(this.destroyed=!0,Y.info("BaseClip destroy"),super.destroy(),this.lastVf?.close(),this.lastVf=null)}static deserializeBaseProperties(t,e){e.transform&&(t.left=e.transform.x??t.left,t.top=e.transform.y??t.top,t.width=e.transform.width??t.width,t.height=e.transform.height??t.height,t.angle=e.transform.angle??t.angle,t.zIndex=e.transform.zIndex??t.zIndex,t.opacity=e.transform.opacity??t.opacity,e.transform.flip!==void 0&&(t.flip=e.transform.flip??null));const i=e.timing||{display:e.display||{from:0,to:0},trim:e.trim||{from:0,to:0},duration:e.duration??0,playbackRate:e.playbackRate??1};if(t.display.from=i.display.from??t.display.from,t.display.to=i.display.to??t.display.to,t.duration=i.duration??t.duration,t.playbackRate=i.playbackRate??t.playbackRate,i.trim&&(t.trim={from:i.trim.from??t.trim.from,to:i.trim.to??t.trim.to}),i.fadeIn!==void 0&&(t.timing.fadeIn=i.fadeIn),i.fadeOut!==void 0&&(t.timing.fadeOut=i.fadeOut),e.style){const s=t.style||{},r={...s,...e.style};JSON.stringify(s)!==JSON.stringify(r)&&(t.style=r)}if(e.animation&&t.setAnimation(e.animation.keyFrames,e.animation.options),e.animations&&Array.isArray(e.animations)){t.clearAnimations();for(const s of e.animations)t.addAnimation(s.type,s.options,s.params)}e.id&&(t.id=e.id),e.name&&(t.name=e.name),e.metadata&&(t.metadata=e.metadata),e.locked!==void 0&&(t.locked=e.locked),e.muted!==void 0&&(t.muted=e.muted),e.transition&&(t.transition=e.transition),e.chromaKey?.enabled&&(t.chromaKey={...t.chromaKey,...e.chromaKey}),e.colorAdjustment?.enabled&&(t.colorAdjustment={...t.colorAdjustment,...e.colorAdjustment})}}let oe=null;async function Qe(){return oe===null&&(oe=Bi()),await oe}const H={get codec(){return Wt()?.codec??"mp4a.40.2"},get codecType(){return Wt()?.codecType??"aac"},get sampleRate(){return Wt()?.sampleRate??48e3},get channelCount(){return Wt()?.channelCount??2}};class jt{static writes=new Map;static async getCacheKey(t){const e=new TextEncoder().encode(t),i=await crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(i)).map(s=>s.toString(16).padStart(2,"0")).join("")}static getPath(t){return`assets/${t}`}static async get(t){const e=this.getPath(await this.getCacheKey(t)),i=this.writes.get(e);i&&await i.catch(()=>{});const s=st.file(e);return await st.file(`${e}.done`).exists()&&await s.exists()?s:null}static async put(t,e){const i=this.getPath(await this.getCacheKey(t)),r=(this.writes.get(i)??Promise.resolve()).catch(()=>{}).then(async()=>{const o=st.file(`${i}.done`);await o.exists()&&await o.remove();const a=st.file(i),n=e instanceof Blob?e.stream():e;return await st.write(a,n),await st.write(o,"1"),a});this.writes.set(i,r);try{return await r}finally{this.writes.get(i)===r&&this.writes.delete(i)}}}const ne=l=>l.startsWith("data:")||l.startsWith("blob:");class je{memory=new Map;memoryBytes=0;inflight=new Map;maxMemoryBytes;maxEntryBytes;constructor(t={}){this.maxMemoryBytes=t.maxMemoryBytes??768*1024*1024,this.maxEntryBytes=t.maxEntryBytes??400*1024*1024}configure(t){t.maxMemoryBytes!=null&&(this.maxMemoryBytes=t.maxMemoryBytes),t.maxEntryBytes!=null&&(this.maxEntryBytes=t.maxEntryBytes),this.evict()}key(t){if(ne(t))return t;try{return typeof location<"u"?new URL(t,location.href).href:t}catch{return t}}getBlob(t){const e=this.key(t),i=this.memory.get(e);if(i)return this.memory.delete(e),this.memory.set(e,i),Promise.resolve(i.blob);const s=this.inflight.get(e);if(s)return s;const r=this.load(e).finally(()=>this.inflight.delete(e));return this.inflight.set(e,r),r}async getStream(t){return(await this.getBlob(t)).stream()}async getImageBitmap(t){return createImageBitmap(await this.getBlob(t))}async getArrayBuffer(t){return(await this.getBlob(t)).arrayBuffer()}async preload(t){const e=[...new Set(t.filter(i=>i&&!ne(i)))];await Promise.allSettled(e.map(i=>this.getBlob(i)))}has(t){return this.memory.has(this.key(t))}release(t){const e=this.key(t),i=this.memory.get(e);i&&(this.memory.delete(e),this.memoryBytes-=i.size)}clearMemory(){this.memory.clear(),this.memoryBytes=0}async load(t){if(ne(t)){const r=await(await fetch(t)).blob();return this.remember(t,r),r}const e=await jt.get(t).catch(()=>null);if(e){const r=await e.getOriginFile().catch(()=>null);if(r&&r.size>0)return this.remember(t,r),r}const i=await fetch(t);if(!i.ok)throw new Error(`Failed to fetch ${t}: ${i.status} ${i.statusText}`);const s=await i.blob();return this.remember(t,s),jt.put(t,s).catch(r=>console.warn(`[MediaCache] Failed to persist ${t}:`,r)),s}remember(t,e){if(e.size>this.maxEntryBytes)return;const i=this.memory.get(t);i&&(this.memoryBytes-=i.size),this.memory.delete(t),this.memory.set(t,{blob:e,size:e.size}),this.memoryBytes+=e.size,this.evict()}evict(){for(const[t,e]of this.memory){if(this.memoryBytes<=this.maxMemoryBytes)break;this.memory.delete(t),this.memoryBytes-=e.size}}}const Je=Symbol.for("agrhub.engine.mediaCache"),Ze=globalThis,Jt=Ze[Je]??(Ze[Je]=new je);var Ke=(l=>(l.PENDING="pending",l.LOADING="loading",l.COMPLETED="completed",l.FAILED="failed",l))(Ke||{});class wt{resources=new Map;loadingPromises=new Map;async preload(t){const i=[...new Set(t)].filter(s=>s&&!s.startsWith("data:")&&!s.startsWith("blob:")).map(s=>this.loadResource(s));await Promise.allSettled(i)}static async getReadableStream(t){return Jt.getStream(t)}static async getImageBitmap(t){return Jt.getImageBitmap(t)}async loadResource(t){const e=this.loadingPromises.get(t);if(e)return e;if(this.resources.has(t)){const s=this.resources.get(t);if(s.status==="completed")return s}const i=(async()=>{const s={url:t,status:"loading"};this.resources.set(t,s);try{return await Jt.getBlob(t),s.status="completed",s.localFile=await jt.get(t)??void 0,s}catch(r){return s.status="failed",s.error=r instanceof Error?r:new Error(String(r)),s}finally{this.loadingPromises.delete(t)}})();return this.loadingPromises.set(t,i),i}async resolve(t){if(!t||t.startsWith("data:")||t.startsWith("blob:"))return t;const e=await this.loadResource(t);return e.status==="completed"&&e.localFile?e.localFile:t}getStatus(t){return this.resources.get(t)}clear(){this.resources.clear(),this.loadingPromises.clear()}}class mt extends K{type="Audio";static ctx=null;ready;_meta={duration:0,width:0,height:0};get meta(){return{...this._meta,sampleRate:H.sampleRate,chanCount:2}}chan0Buf=new Float32Array;chan1Buf=new Float32Array;getPCMData(){return[this.chan0Buf,this.chan1Buf]}opts;loop=!1;static async fromUrl(t,e={}){const i=await wt.getReadableStream(t);return new mt(i,e,t)}static async fromObject(t){if(t.type!=="Audio")throw new Error(`Expected Audio, got ${t.type}`);if(!t.src||t.src.trim()==="")throw new Error("Audio requires a valid source URL");const e={};t.loop!==void 0&&(e.loop=t.loop),t.volume!==void 0&&(e.volume=t.volume);const i=await mt.fromUrl(t.src,e);return K.deserializeBaseProperties(i,t),i}constructor(t,e={},i){super(),this.src=i!==void 0?i:"",this.opts={loop:!1,volume:1,...e},this.loop=this.opts.loop??!1,this.volume=this.opts.volume??1,this.ready=this.init(t).then(s=>{const r={width:0,height:0,duration:e.loop?1/0:this._meta.duration};return this.width=this.width===0?r.width:this.width,this.height=this.height===0?r.height:this.height,this.duration=this.duration===0?r.duration:this.duration,this.display.to=this.display.from+this.duration,this.trim.to=this.trim.to===0?this._meta.duration:Math.min(this.trim.to,this._meta.duration),this.trim.from=Math.min(this.trim.from,this.trim.to),r})}async init(t){mt.ctx==null&&(mt.ctx=new AudioContext({sampleRate:H.sampleRate}));const e=t instanceof ReadableStream?await hs(t,mt.ctx):t;this._meta.duration=e[0].length/H.sampleRate*1e6,this.chan0Buf=e[0],this.chan1Buf=e[1]??this.chan0Buf}tickInterceptor=async(t,e)=>e;timestamp=0;frameOffset=0;async tick(t){const e=t+this.trim.from,i=e-this.timestamp;if(e<this.timestamp||i>3e6)return this.timestamp=e,this.frameOffset=Math.ceil(this.timestamp/1e6*H.sampleRate),await this.tickInterceptor(t,{audio:[new Float32Array(0),new Float32Array(0)],state:"success"});this.timestamp=e;const s=Math.ceil(i/1e6*H.sampleRate),r=this.frameOffset+s,o=this.opts.loop?[ee(this.chan0Buf,this.frameOffset,r),ee(this.chan1Buf,this.frameOffset,r)]:[this.chan0Buf.slice(this.frameOffset,r),this.chan1Buf.slice(this.frameOffset,r)],a=this.effectiveVolume;if(a===0)for(const n of o)n.fill(0);else if(a!==1)for(const n of o)for(let c=0;c<n.length;c++)n[c]*=a;return this.frameOffset=r,await this.tickInterceptor(t,{audio:o,state:"success"})}async split(t){throw new Error("Audio.split is not implemented - use core state instead")}async clone(){await this.ready;const t=new mt(this.getPCMData(),this.opts,this.src);return await t.ready,this.copyStateTo(t),t}destroy(){this.chan0Buf=new Float32Array(0),this.chan1Buf=new Float32Array(0),Y.info("---- audioclip destroy ----"),super.destroy()}toJSON(t=!1){return{id:this.id,type:"Audio",name:this.name,src:this.src,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate,fadeIn:this.timing.fadeIn,fadeOut:this.timing.fadeOut},loop:this.loop,volume:this.volume,locked:this.locked,metadata:this.metadata}}async createPlaybackElement(){if(await this.ready,!this.src||this.src.trim()==="")throw new Error("Audio requires a source URL for playback");const t=this.src.startsWith("blob:")?this.src:void 0,e=document.createElement("audio");return e.crossOrigin="anonymous",e.autoplay=!1,e.preload="auto",e.loop=this.opts.loop||!1,e.src=this.src,await new Promise((i,s)=>{const r=()=>{e.removeEventListener("loadeddata",r),e.removeEventListener("error",o),e.pause(),e.currentTime=0,i()},o=()=>{e.removeEventListener("loadeddata",r),e.removeEventListener("error",o),s(new Error("Failed to load audio"))};e.addEventListener("loadeddata",r,{once:!0}),e.addEventListener("error",o,{once:!0}),e.load()}),{element:e,objectUrl:t}}async play(t,e){const i=t,s=e+this.trim.from/1e6;if(Math.abs(i.currentTime-s)>.1&&(i.currentTime=s),i.paused)try{await i.play()}catch{try{await i.play()}catch(o){console.warn("Failed to play audio:",o)}}}pause(t){t.pause()}async seek(t,e){const i=t,s=e+this.trim.from/1e6;return i.pause(),i.currentTime=s,new Promise(r=>{if(Math.abs(i.currentTime-e)<.01){r();return}const o=()=>{i.removeEventListener("seeked",o),r()};i.addEventListener("seeked",o,{once:!0}),setTimeout(()=>{i.removeEventListener("seeked",o),r()},500)})}syncPlayback(t,e,i){const s=t,r=this.duration&&this.duration!==1/0?this.duration/1e6:(this.display.to-this.display.from)/1e6,o=i>=0&&i<r,a=i+this.trim.from/1e6,n=r*1e3,c=i*1e3;let h=1;if(this.timing.fadeIn&&this.timing.fadeIn.duration>0&&c<this.timing.fadeIn.duration&&(h*=St(c/this.timing.fadeIn.duration,this.timing.fadeIn.curve)),this.timing.fadeOut&&this.timing.fadeOut.duration>0){const d=n-this.timing.fadeOut.duration;if(c>=d){const u=1-(c-d)/this.timing.fadeOut.duration;h*=St(u,this.timing.fadeOut.curve)}}s.volume=Math.max(0,Math.min(1,this.effectiveVolume*h)),e&&o?s.paused&&this.play(s,i).catch(console.warn):(s.paused||s.pause(),o&&Math.abs(s.currentTime-a)>.1&&(s.currentTime=a))}cleanupPlayback(t,e){const i=t;i.pause(),i.removeAttribute("src"),i.load(),e&&e.startsWith("blob:")&&URL.revokeObjectURL(e)}}async function hs(l,t){const e=await new Response(l).arrayBuffer();return te(await t.decodeAudioData(e))}const ds=`precision highp float;
65
65
  in vec2 vTextureCoord;
66
66
  out vec4 finalColor;
67
67
 
@@ -95,7 +95,7 @@ void main(void) {
95
95
  vec4 outline = vec4(uBorderColor * outlineAlpha, outlineAlpha);
96
96
  finalColor = content + outline;
97
97
  }
98
- `,ls=`in vec2 aPosition;
98
+ `,fs=`in vec2 aPosition;
99
99
  out vec2 vTextureCoord;
100
100
 
101
101
  uniform vec4 uInputSize;
@@ -114,7 +114,7 @@ void main(void) {
114
114
  gl_Position = filterVertexPosition();
115
115
  vTextureCoord = filterTextureCoord();
116
116
  }
117
- `,je=`struct GlobalFilterUniforms {
117
+ `,Xe=`struct GlobalFilterUniforms {
118
118
  uInputSize:vec4<f32>,
119
119
  uInputPixel:vec4<f32>,
120
120
  uInputClamp:vec4<f32>,
@@ -181,7 +181,7 @@ fn mainFragment(@location(0) uv: vec2<f32>) -> @location(0) vec4<f32> {
181
181
  let outline = vec4<f32>(outlineUniforms.uBorderColor * outlineAlpha, outlineAlpha);
182
182
  return content + outline;
183
183
  }
184
- `,cs={thickness:1,borderColor:0};class hs extends m.Filter{constructor(t){const{thickness:e,borderColor:i}={...cs,...t},s=m.GpuProgram.from({vertex:{source:je,entryPoint:"mainVertex"},fragment:{source:je,entryPoint:"mainFragment"}}),r=m.GlProgram.from({vertex:ls,fragment:as,name:"outline-filter"});super({gpuProgram:s,glProgram:r,padding:e*4,resources:{outlineUniforms:new m.UniformGroup({uThickness:{value:e,type:"f32"},uBorderColor:{value:new m.Color(i),type:"vec3<f32>"}})}})}get thickness(){return this.resources.outlineUniforms.uniforms.uThickness}set thickness(t){const e=this.resources.outlineUniforms.uniforms;e.uThickness=t}}const Je=Symbol.for("agrhub.engine.fontManager");class pt{static instance;fonts=new Map;loading=new Map;warnedConflicts=new Set;constructor(){}static getInstance(){const t=globalThis;return pt.instance||(pt.instance=t[Je]??new pt),t[Je]=pt.instance,pt.instance}async addFont(t){const e=this.fonts.get(t.name);if(e){this.warnOnConflict(t,e.url);return}const i=this.loading.get(t.name);if(i)return i;const s=(async()=>{try{const o=await new FontFace(t.name,`url(${t.url})`).load();document.fonts.add(o),this.fonts.set(t.name,{face:o,url:t.url}),m.CanvasTextMetrics.clearMetrics()}catch(r){console.error(`Failed to load font ${t.name}:`,r)}finally{this.loading.delete(t.name)}})();return this.loading.set(t.name,s),s}warnOnConflict(t,e){!t.url||t.url===e||this.warnedConflicts.has(t.name)||(this.warnedConflicts.add(t.name),console.warn(`[FontManager] Font "${t.name}" is already loaded from ${e}; ignoring different URL ${t.url}`))}async loadFonts(t){await Promise.all(t.map(e=>this.addFont(e)))}removeFont(t){const e=this.fonts.get(t);e&&(document.fonts.delete(e.face),this.fonts.delete(t))}clear(){this.fonts.forEach(({face:t})=>{document.fonts.delete(t)}),this.fonts.clear()}getLoadedFonts(){return Array.from(this.fonts.keys())}}const jt=pt.getInstance();function ds(l){if(typeof document>"u"||!document.fonts?.check)return!0;const t=String(l.fontFamily||"Roboto").split(",")[0].trim().replace(/^["']|["']$/g,""),e=Number(l.fontSize)||30,i=`${l.fontStyle||"normal"} ${l.fontWeight||"normal"} ${e}px "${t}"`;try{return document.fonts.check(i)}catch{return!0}}function Ze(l){const t=[];t.push(l.fontFamily||"Roboto"),t.push(String(l.fontSize||30)),t.push(String(l.fontWeight||"normal")),t.push(String(l.fontStyle||"normal")),l.fill!==void 0&&(typeof l.fill=="number"?t.push(`f_${l.fill}`):t.push("f_obj")),l.stroke&&(typeof l.stroke=="object"?t.push(`s_${l.stroke.color}_${l.stroke.width}_${l.stroke.join||""}`):t.push(`s_${l.stroke}`)),l.dropShadow&&t.push(`ds_${l.dropShadow.color}_${l.dropShadow.alpha}_${l.dropShadow.blur}_${l.dropShadow.angle}_${l.dropShadow.distance}`),ds(l)||t.push("pending");const e="installed_font_"+t.join("_").replace(/[^a-zA-Z0-9_]/g,"_");return!m.Cache.has(e)&&!m.Cache.has(e+"-bitmap")&&m.BitmapFont.install({name:e,style:l}),e}class Ke extends X{_meta={duration:1/0,width:0,height:0};get meta(){return{...this._meta}}pixiTextContainer=null;wordTexts=[];textStyle;textStyleBase;renderTexture=null;outlineFilter=null;dropShadowFilter=null;_refreshing=!1;_needsRefresh=!1;_refreshPromise=null;_spaceWidth=0;_text="";externalRenderer=null;pixiApp=null;originalOpts;id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effects=[];setRenderer(t){this.externalRenderer=t}async getRenderer(){if(this.externalRenderer!=null)return this.externalRenderer;if(this.pixiApp?.renderer==null)throw new Error("BaseTextClip: No renderer. Provide one via constructor or setRenderer().");return this.pixiApp.renderer}async getTexture(){return this._refreshPromise&&await this._refreshPromise.catch(()=>{}),this.pixiTextContainer==null||this.renderTexture==null?null:((await this.getRenderer()).render({container:this.pixiTextContainer,target:this.renderTexture}),this.renderTexture)}async tick(t){if(await this.ready,this._refreshPromise&&await this._refreshPromise.catch(()=>{}),this.pixiTextContainer==null||this.renderTexture==null)throw new Error("BaseTextClip not initialized");if(this.renderTexture.width<=0||this.renderTexture.height<=0)throw new Error(`Invalid RenderTexture dimensions: ${this.renderTexture.width}x${this.renderTexture.height}`);const e=await this.getRenderer();e.render({container:this.pixiTextContainer,target:this.renderTexture});const i=this.renderTexture.source?.resource?.source;let s;if(i instanceof HTMLCanvasElement||i instanceof OffscreenCanvas)s=await createImageBitmap(i);else{const o=e.extract.canvas(this.renderTexture);if(o instanceof HTMLCanvasElement||o instanceof OffscreenCanvas)s=await createImageBitmap(o);else throw new Error("Unable to extract canvas from render texture")}return{video:s,state:"success"}}async split(t){await this.ready;const e=await this.clone(),i=await this.clone();return[e,i]}_hasMaskAnim(t){return t.some(e=>e?.params?.mask===!0)}get animations(){return super.animations}set animations(t){const e=this._hasMaskAnim(this.animations);super.animations=t;const i=this._hasMaskAnim(this.animations);e!==i&&this.originalOpts&&this.textStyle&&this.refreshText()}animate(t){super.animate(t,this.pixiTextContainer)}addEffect(t){this.effects.push(t)}editEffect(t,e){const i=this.effects.find(s=>s.id===t);i&&Object.assign(i,e)}removeEffect(t){const e=this.effects.findIndex(i=>i.id===t);e!==-1&&this.effects.splice(e,1)}refreshText(){return this._refreshing&&this._refreshPromise?(this._needsRefresh=!0,this._refreshPromise):(this._refreshing=!0,this._refreshPromise=(async()=>{try{do this._needsRefresh=!1,await this._doRefreshText();while(this._needsRefresh)}finally{this._refreshing=!1,this._refreshPromise=null}})(),this._refreshPromise)}async _doRefreshText(){const t=this._targetWidth??0,e=this.originalOpts.wordWrap,i=this.originalOpts.wordWrapWidth,s=this.originalOpts.background;if(this.originalOpts.fontUrl&&this.originalOpts.fontFamily)try{await jt.addFont({name:this.originalOpts.fontFamily,url:this.originalOpts.fontUrl})}catch(E){console.warn("[BaseTextClip] Failed to load font:",E)}typeof document<"u"&&await document.fonts.ready,this._buildTextStyles();const r=this.textStyle,o=this._applyTextCase(this.text);if(!this.pixiTextContainer)this.pixiTextContainer=new m.Container,this.pixiTextContainer.__clip=this;else{this.pixiTextContainer.__clip=this,this.animations.forEach(E=>{E&&typeof E.destroy=="function"&&E.destroy()});for(const E of this.pixiTextContainer.children)if(E&&!E.destroyed){const P=R=>{if(R&&(ht.killTweensOf(R),R.children))for(const B of R.children)P(B)};if(P(E),E.children)for(const R of E.children)R&&R.label==="LineContainer"&&(R.mask=null);E.destroy({children:!0})}this.pixiTextContainer.removeChildren()}const{textOnlyContainer:a,words:n}=this._buildWordObjects(o),c=this._applyStrokeFilter();this._applyShadowFilter(a),this.pixiTextContainer.addChild(a);const{spaceWidth:h,measuredTextHeight:d}=await this._measureSpaceAndHeight();this._spaceWidth=h;const f=this.originalOpts.lineHeight??1,u=r.fontSize??40,p=u*f;let g;if(e)if(t>0){const E=s?.paddingX??8;g=Math.max(1,t-E*2)}else g=i??100;else g=1e5;const v=this._breakIntoLines(g,p),x=this.originalOpts.background?.color,w=this.originalOpts.background?.opacity??1,T=this.originalOpts.background?.borderRadius??4,y=this.originalOpts.background?.paddingX??8,C=this.originalOpts.background?.paddingY??4,{containerWidth:k,containerHeight:O,contentHeight:F}=this._calculateDimensions(v,d,t,e,i,s,y,C),b=this._positionWords(v,k,O,F,d,y,a),S=this._drawDecoration(v,k,y);S&&this.pixiTextContainer.addChild(S);const A=this._buildBackground(b,x,w,T);A&&this.pixiTextContainer.addChildAt(A,0),this._lineRects=b,this._createRenderTexture(k,O,c),this._meta.width=k,this._meta.height=O,this._width=k,this._height=O,this.duration===0&&this._meta.duration!==1/0&&(this.duration=this._meta.duration,this.display.to=this.display.from+this.duration),this._onAfterRefresh(n,a,h,d,f,u)}_onAfterRefresh(t,e,i,s,r,o){}_applyTextCase(t){const e=this.originalOpts.textCase;return e==="uppercase"?t.toUpperCase():e==="lowercase"?t.toLowerCase():e==="title"?t.replace(/\w\S*/g,i=>i.charAt(0).toUpperCase()+i.substring(1).toLowerCase()):t}_buildTextStyles(){const t=this.createStyleFromOpts(this.originalOpts),{wordWrap:e,wordWrapWidth:i,lineHeight:s,letterSpacing:r,fill:o,...a}=t,n=Ze(t);this.textStyle=new m.TextStyle({...t,fontFamily:n});const c=Ze(a);return this.textStyleBase=new m.TextStyle({...a,fontFamily:c}),{fontName:n,baseFontName:c}}_buildWordObjects(t){const e=t.split(/\s+/).filter(s=>s.length>0),i=new m.Container;return i.label="TextOnlyContainer",this.wordTexts.forEach(s=>{s&&!s.destroyed&&s.destroy()}),this.wordTexts=e.map(s=>{const r=new m.SplitBitmapText({text:s,style:this.textStyle});return i.addChild(r),r}),{textOnlyContainer:i,words:e}}_applyStrokeFilter(){const t=this.originalOpts.stroke,e=(t!==null&&typeof t=="object"&&"width"in t?t.width:void 0)??this.originalOpts.strokeWidth??0,i=t!=null&&e>0;if(i){let s=0;if(typeof t=="object"&&"color"in t){const r=$(t.color);r!==void 0&&(s=r)}else if(typeof t=="string"||typeof t=="number"){const r=$(t);r!==void 0&&(s=r)}if(this.outlineFilter){this.outlineFilter.thickness=e,this.outlineFilter.padding=e*4;const r=this.outlineFilter.resources.outlineUniforms.uniforms;r.uBorderColor=new m.Color(s)}else this.outlineFilter=new hs({thickness:e,borderColor:s});this.wordTexts.forEach(r=>{r.filters=[this.outlineFilter]})}else this.outlineFilter&&(this.wordTexts.forEach(s=>{s.filters=[]}),this.outlineFilter=null);return i?e:0}_applyShadowFilter(t){const e=this.originalOpts.shadow;if(e){const i=e.offsetX??0,s=e.offsetY??0,r=$(e.color??"#000000"),o=e.alpha??1,a=e.blur??4,n=Math.ceil(a*2.5+Math.max(Math.abs(i),Math.abs(s)));r!==void 0&&(this.dropShadowFilter?(this.dropShadowFilter.color=r,this.dropShadowFilter.alpha=o,this.dropShadowFilter.blur=a,this.dropShadowFilter.offset={x:i,y:s},this.dropShadowFilter.padding=n):(this.dropShadowFilter=new j.DropShadowFilter({color:r,alpha:o,blur:a,offset:{x:i,y:s}}),this.dropShadowFilter.padding=n),t.filters=[this.dropShadowFilter])}else this.dropShadowFilter&&(t.filters=[],this.dropShadowFilter=null)}async _measureSpaceAndHeight(){const t=this.originalOpts.fontSize||40,e=this.originalOpts.fontFamily||"Arial",i=String(this.originalOpts.fontWeight||"normal"),s=this.originalOpts.fontStyle||"normal",r=`${s} ${i} ${t}px "${e}"`;if(typeof document<"u")try{await document.fonts.load(r)}catch{}const o=new m.TextStyle({fontFamily:e,fontSize:t,fontWeight:i,fontStyle:s}),a=m.CanvasTextMetrics.measureText(" ",o),n=new m.TextStyle({fontFamily:e,fontSize:t,fontWeight:i,fontStyle:s}),h=m.CanvasTextMetrics.measureText("Hg",n).fontProperties,d=h&&h.ascent>0?Math.ceil(h.ascent+h.descent):t,f=new m.SplitBitmapText({text:" ",style:this.textStyleBase}),u=Math.ceil(f.getLocalBounds().width||f.width||a.width||t*.25);return f.destroy(),{spaceWidth:u,measuredTextHeight:d}}_breakIntoLines(t,e){const i=[];let s=[],r=0,o=0;return this.wordTexts.forEach(a=>{const n=a.getLocalBounds(),c=Math.ceil(n.width||a.width),h=Math.ceil(n.height||a.height),d=r+(r>0?this._spaceWidth:0)+c;d<=t||s.length===0?(s.push(a),r=d,o=Math.max(o,h)):(s.length>0&&i.push({words:s,width:r,height:Math.max(o,e)}),s=[a],r=c,o=h)}),s.length>0&&i.push({words:s,width:r,height:Math.max(o,e)}),i}_calculateDimensions(t,e,i,s,r,o,a,n){const c=e+n*2;t.forEach(T=>{T.height=Math.max(T.height,c)});let h=0,d=0;t.forEach(T=>{h=Math.max(h,T.width),d+=T.height});let f=h;if(s&&i>0){const T=o?.paddingX??8,y=i-T*2;f=Math.max(f,y)}else s&&r!=null&&r>0&&(f=Math.max(f,r));const u=d;f+=a*2;const p=i>0?i:this._width,g=p===0,v=!this._explicitHeight||this.height===0,x=g?f:Math.max(f,p),w=v?u:Math.max(u,this.height||0);return{containerWidth:x,containerHeight:w,contentWidth:f,contentHeight:u}}_positionWords(t,e,i,s,r,o,a){const n=this.originalOpts.verticalAlign||"top";let c=0;n==="center"?c=(i-s)/2:n==="bottom"&&(c=i-s);let h=c;const d=[];return t.forEach(f=>{let u=0;const p=this.textAlign;p==="center"?u=(e-f.width)/2:p==="right"?u=e-f.width-o*2:u=o;const g=u,v=new m.Container;if(v.label="LineContainer",v.x=0,v.y=0,this.animations.some(w=>w?.params?.mask===!0)){const w=new m.Graphics;w.label="LineMask",w.rect(0,h,e,f.height),w.fill(16777215),v.mask=w,a.addChild(w)}a.addChild(v),f.words.forEach((w,T)=>{w.x=Math.round(u),w.y=Math.round(h+(f.height-r)/2-9),u+=(w.getLocalBounds().width||w.width)+(T<f.words.length-1?this._spaceWidth:0),v.addChild(w)}),d.push({x:g-o,y:h,w:f.width+o*2,h:f.height}),h+=f.height}),d}_drawDecoration(t,e,i){const s=this.originalOpts.textDecoration||this.originalOpts.verticalAlign;if(!s||s==="none"||!["underline","overline","strikethrough","line-through"].includes(s))return null;const r=this.textStyle,o=r.fontSize??40,a=s==="strikethrough"?"line-through":s,n=Math.max(1,o/12);let c=16777215;typeof r.fill=="number"&&(c=r.fill);const h=new m.Graphics;let d=0;return t.forEach(f=>{let u=i;const p=this.textAlign;p==="center"?u=(e-f.width)/2:p==="right"&&(u=e-f.width-i*2);let g=0;a==="underline"?g=f.height:a==="line-through"&&(g=f.height/2),h.rect(u,d+g,f.width,n),h.fill(c),d+=f.height}),h}_buildBackground(t,e,i,s){if(!t.length||!e||e==="transparent"||e==="")return null;const r=$(e),o=new m.Graphics;return this.drawRoundedMultilinePath(o,t,s,r??0,i),o}_createRenderTexture(t,e,i){const r=i>0?i*2.1:0;let o=0;if(this.dropShadowFilter){const h=this.dropShadowFilter.blur??0,d=this.dropShadowFilter.offset,f=d?Math.sqrt(d.x**2+d.y**2):0;o=h+f}const a=300+r+o,n=t+a*2,c=e+a*2;this.pixiTextContainer&&(this.pixiTextContainer.x=a,this.pixiTextContainer.y=a),this.renderTexture&&this.renderTexture.destroy(),this.renderTexture=m.RenderTexture.create({width:n,height:c}),this.renderTexturePadding=a}_normalizeStyleOpts(t){let e={...t};e.style&&(e={...e,...e.style},delete e.style),e.fill!==void 0&&(e.color=e.fill,delete e.fill),e.dropShadow!==void 0&&(e.shadow=e.dropShadow,delete e.dropShadow),e.textAlign!==void 0&&(e.align=e.textAlign,delete e.textAlign);const i=e.underline,s=e.overline,r=e.linethrough;return(i!==void 0||s!==void 0||r!==void 0)&&(i?e.textDecoration="underline":s?e.textDecoration="overline":r?e.textDecoration="line-through":e.textDecoration="none",delete e.underline,delete e.overline,delete e.linethrough),e}_cloneColorOpts(t){const e=this.originalOpts;return e.color&&typeof e.color=="object"&&"type"in e.color&&e.color.type==="gradient"?e.color:t(this.textStyle.fill)??16777215}_cloneStrokeOpts(t){const e=this.originalOpts,i=this.textStyle;if(e.stroke&&typeof e.stroke=="object"&&"color"in e.stroke)return{stroke:e.stroke,strokeWidth:0};const s=t(i.stroke),r=e.strokeWidth??i.strokeThickness??0;return{stroke:s!==void 0?s:void 0,strokeWidth:r}}_cloneShadowOpts(t){const e=this.originalOpts,i=this.textStyle;if(e.shadow)return e.shadow;if(i.dropShadow){const s=i.dropShadow,r=t(s.color);if(r!==void 0){const o=s.angle??0,a=s.distance??0;return{color:r,alpha:s.alpha,blur:s.blur,offsetX:Math.cos(o)*a,offsetY:Math.sin(o)*a}}}}createStyleFromOpts(t){const e=t.fontSize??40,i=t.lineHeight??1,s={fontSize:e,fontFamily:t.fontFamily??"Roboto",fontWeight:t.fontWeight??"normal",fontStyle:t.fontStyle??"normal",align:t.align??"left",wordWrap:t.wordWrap??!1,wordWrapWidth:t.wordWrapWidth??100,lineHeight:e*i,letterSpacing:t.letterSpacing??0},r=t.color??"#ffffff";if(r&&typeof r=="object"&&"type"in r&&r.type==="gradient"){const o=new m.FillGradient(r.x0,r.y0,r.x1,r.y1);r.colors.forEach(({ratio:a,color:n})=>{const c=typeof n=="number"?n:$(n)??16777215;o.addColorStop(a,c)}),s.fill={fill:o}}else{const{color:o,alpha:a}=Ft(r);s.fill=o,a<1&&(s.fillAlpha=a)}return s}drawRoundedMultilinePath(t,e,i,s,r=1){if(e.length===0)return;const o=Math.max(i*.8,15);let a=!0,n=0;for(;a&&n<5;){a=!1,n++;for(let f=0;f<e.length;f++)for(let u=f+1;u<e.length;u++){const p=e[f].x+e[f].w,g=e[u].x+e[u].w;if(Math.abs(p-g)>.1&&Math.abs(p-g)<o){const v=Math.max(p,g);e[f].w=v-e[f].x,e[u].w=v-e[u].x,a=!0}if(Math.abs(e[f].x-e[u].x)>.1&&Math.abs(e[f].x-e[u].x)<o){const v=Math.min(e[f].x,e[u].x);e[f].w+=e[f].x-v,e[f].x=v,e[u].w+=e[u].x-v,e[u].x=v,a=!0}}}const c=[];c.push({x:e[0].x,y:e[0].y}),c.push({x:e[0].x+e[0].w,y:e[0].y});for(let f=0;f<e.length-1;f++){const u=e[f],p=e[f+1];if(Math.abs(u.x+u.w-(p.x+p.w))>.1){const g=(u.y+u.h+p.y)/2;c.push({x:u.x+u.w,y:g}),c.push({x:p.x+p.w,y:g})}}c.push({x:e[e.length-1].x+e[e.length-1].w,y:e[e.length-1].y+e[e.length-1].h}),c.push({x:e[e.length-1].x,y:e[e.length-1].y+e[e.length-1].h});for(let f=e.length-1;f>0;f--){const u=e[f],p=e[f-1];if(Math.abs(u.x-p.x)>.1){const g=(u.y+p.y+p.h)/2;c.push({x:u.x,y:g}),c.push({x:p.x,y:g})}}t.clear();const h=c[c.length-1],d=c[0];t.moveTo((h.x+d.x)/2,(h.y+d.y)/2);for(let f=0;f<c.length;f++){const u=c[f],p=c[(f+1)%c.length];t.arcTo(u.x,u.y,(u.x+p.x)/2,(u.y+p.y)/2,i)}t.fill({color:s,alpha:r})}destroy(){if(!this.destroyed){Q.info(`${this.constructor.name} destroy`);try{if(this.pixiTextContainer!=null&&!this.pixiTextContainer.destroyed){for(const t of this.pixiTextContainer.children)if(t&&!t.destroyed){const e=i=>{if(i&&(ht.killTweensOf(i),i.children))for(const s of i.children)e(s)};if(e(t),t.children)for(const i of t.children)i&&i.label==="LineContainer"&&(i.mask=null)}this.pixiTextContainer.destroy({children:!0})}}catch{}finally{this.pixiTextContainer=null}try{this.renderTexture!=null&&!this.renderTexture.destroyed&&this.renderTexture.destroy(!0)}catch{}finally{this.renderTexture=null}if(this.externalRenderer=null,this.pixiApp!=null)try{const t=this.pixiApp;t.destroyed!==!0&&t.renderer!=null&&this.pixiApp.destroy(!0,{children:!0,texture:!0})}catch{}finally{this.pixiApp=null}super.destroy()}}toJSON(t=!1){const e=super.toJSON(t),{chromaKey:i,colorAdjustment:s,...r}=e;return r}}class mt extends Ke{type="Caption";_lastTickTime=0;_isWidthConstrained=!1;_words=[];_activeStyle={};_futureStyle={};_keywordColor="";_keywordPreserveAfterSpoken=!1;_wordAnimation={type:"scale",application:"none",value:1};_wordsPerLine="multiple";_trackCaptionColors;_videoWidth=1280;_videoHeight=720;_bottomOffset=100;get text(){return this._text}set text(t){if(this._text===t)return;const e=this._text;this._text=t,e!==""&&this._words.length>0&&(this._words=xe.redistributeCaptionWords(t,this._words,this.duration||5e6)),this.originalOpts&&this.textStyle&&this.refreshText().then(()=>this.emit("propsChange",{text:t}))}get textAlign(){return this.originalOpts?.align??"left"}get caption(){const t=this.originalOpts??{};return{words:this._words,colors:{active:t.activeStyle,future:t.futureStyle,keyword:t.keywordColor?{color:t.keywordColor,preserveAfterSpoken:t.keywordPreserveAfterSpoken}:void 0},wordAnimation:t.wordAnimation,positioning:{videoWidth:this._videoWidth,videoHeight:this._videoHeight,bottomOffset:this._bottomOffset}}}set caption(t){if(!t)return;t.words&&(this._words=t.words,this.originalOpts&&(this.originalOpts.words=t.words));const e=Array.isArray(t.words),i=t.colors??(e?this._trackCaptionColors??{}:void 0),s=!t.colors&&e;i&&(("active"in i||s)&&(this.originalOpts.activeStyle=i.active??void 0),("future"in i||s)&&(this.originalOpts.futureStyle=i.future??void 0),("keyword"in i||s)&&(i.keyword!=null?(this.originalOpts.keywordColor=i.keyword.color,this.originalOpts.keywordPreserveAfterSpoken=i.keyword.preserveAfterSpoken):(this.originalOpts.keywordColor=void 0,this.originalOpts.keywordPreserveAfterSpoken=void 0))),t.wordAnimation!==void 0&&(this.originalOpts.wordAnimation=t.wordAnimation),t.positioning&&(t.positioning.videoWidth!==void 0&&(this._videoWidth=t.positioning.videoWidth),t.positioning.videoHeight!==void 0&&(this._videoHeight=t.positioning.videoHeight),t.positioning.bottomOffset!==void 0&&(this._bottomOffset=t.positioning.bottomOffset)),this._syncOpts(),(i||t.wordAnimation!==void 0||t.words)&&(this._buildTextStyles(),this.refreshText().then(()=>this.emit("propsChange",{caption:t})))}get words(){return this._words}set words(t){this._words=t,this.originalOpts&&(this.originalOpts.words=t),this.refreshText().then(()=>this.emit("propsChange",{style:this.style}))}get mediaId(){return this.originalOpts?.mediaId}set mediaId(t){this.originalOpts&&(this.originalOpts.mediaId=t)}get wordsPerLine(){return this._wordsPerLine}set wordsPerLine(t){t&&(this._wordsPerLine=t,this.originalOpts&&(this.originalOpts.wordsPerLine=t),this.refreshText())}get style(){const t=this.originalOpts??{};return{fontSize:t.fontSize,fontFamily:t.fontFamily,fontWeight:t.fontWeight,fontStyle:t.fontStyle,color:t.color,align:t.align,stroke:t.stroke,shadow:t.shadow,wordWrap:t.wordWrap,wordWrapWidth:t.wordWrapWidth,lineHeight:t.lineHeight,letterSpacing:t.letterSpacing,textCase:t.textCase}}set style(t){this.updateStyle(t)}async updateStyle(t){const e=this._normalizeStyleOpts(t);this.originalOpts={...this.originalOpts,...e},e.words!==void 0&&(this._words=e.words),this._syncOpts(),this._buildTextStyles(),await this.refreshText(),this.emit("propsChange",t)}get width(){return this._width}set width(t){Math.abs(this.width-t)<.1||(this._width=t,t>0&&(this._isWidthConstrained=!0),this.refreshText())}get height(){return this._height}set height(t){Math.abs(this.height-t)<.1||(this._height=t,this.refreshText())}animate(t){this._lastTickTime=t,super.animate(t)}constructor(t,e={},i){if(super(),this.originalOpts={...e},this._text=t,i&&this.setRenderer(i),e.caption){e.caption.words&&(this._words=e.caption.words);const s=e.caption;s.colors&&"active"in s.colors&&(this.originalOpts.activeStyle=s.colors.active??void 0),s.colors&&"future"in s.colors&&(this.originalOpts.futureStyle=s.colors.future??void 0),s.colors&&"keyword"in s.colors&&(s.colors.keyword!=null?(this.originalOpts.keywordColor=s.colors.keyword.color,this.originalOpts.keywordPreserveAfterSpoken=s.colors.keyword.preserveAfterSpoken):(this.originalOpts.keywordColor=void 0,this.originalOpts.keywordPreserveAfterSpoken=void 0)),s.wordAnimation!==void 0&&(this.originalOpts.wordAnimation=s.wordAnimation),s.positioning?.videoWidth!==void 0&&(this.originalOpts.videoWidth=s.positioning.videoWidth),s.positioning?.videoHeight!==void 0&&(this.originalOpts.videoHeight=s.positioning.videoHeight),s.positioning?.bottomOffset!==void 0&&(this.originalOpts.bottomOffset=s.positioning.bottomOffset)}e.words&&(this._words=e.words),e.initialLayoutApplied,this._syncOpts(),this._buildTextStyles(),this.ready=(async()=>(await this.refreshText(),{...this.meta}))()}createStyleFromOpts(t){const e=super.createStyleFromOpts(t);return e.fill=16777215,e}_syncOpts(){const t=this.originalOpts??{};this._activeStyle=t.activeStyle??{},this._futureStyle=t.futureStyle??{},this._keywordColor=t.keywordColor??"",this._keywordPreserveAfterSpoken=t.keywordPreserveAfterSpoken??!1,this._wordAnimation=t.wordAnimation??{type:"scale",application:"none",value:1},this._wordsPerLine=t.wordsPerLine??"multiple",this._videoWidth=t.videoWidth??1280,this._videoHeight=t.videoHeight??720,this._bottomOffset=t.bottomOffset??100}_buildWordObjects(t){const e=new m.Container;e.label="TextOnlyContainer",this.wordTexts.forEach(o=>o.destroy()),this.wordTexts=[];const i=[],s=this.originalOpts?.textCase,r=(o,a)=>{const n=new m.SplitBitmapText({text:o,style:this.textStyle});n.segmentIndex=a;const c=this.originalOpts?.color,h=typeof c=="object"&&c!==null&&"type"in c?16777215:c,d=$(h);return n.tint=d??16777215,n};return this._words.length>0?this._words.forEach((o,a)=>{let n=o.text||"";s==="uppercase"?n=n.toUpperCase():s==="lowercase"?n=n.toLowerCase():s==="title"&&(n=n.replace(/\w\S*/g,h=>h.charAt(0).toUpperCase()+h.substring(1).toLowerCase())),n.split(/\s+/).filter(h=>h.length>0).forEach(h=>{const d=r(h,a);e.addChild(d),this.wordTexts.push(d),i.push(h)})}):t.split(/\s+/).filter(o=>o.length>0).forEach((o,a)=>{const n=r(o,a);e.addChild(n),this.wordTexts.push(n),i.push(o)}),{textOnlyContainer:e,words:i}}_onAfterRefresh(){this.updateState(this._lastTickTime)}async tick(t){return this.updateState(t),super.tick(t)}updateState(t){this._lastTickTime=t;const e=t/1e3;this.wordTexts.forEach(i=>{const s=this._words[i.segmentIndex];if(!s)return;i.scale.set(1,1);const r=e>=s.from&&e<s.to,o=e>=s.to,a=!r&&!o,n=this._wordAnimation;let c=0,h=!1;if(n&&n.application!=="none"&&((n.application==="active"&&r||n.application==="keyword"&&s.isKeyWord)&&(h=!0),h)){if(n.mode==="dynamic"&&r){const y=s.to-s.from;if(y>0){const C=Math.max(0,Math.min(1,(e-s.from)/y));c=n.value<1?C:Math.sin(C*Math.PI)}else c=1}else c=1;if(n.type==="scale"){const y=n.value<1&&n.mode==="dynamic"&&r?n.value+(1-n.value)*c:1+(n.value-1)*c;i.scale.set(y,y)}}let d=16777215,f=1;if(s.isKeyWord&&!Dt(this._keywordColor)&&(r||o&&this._keywordPreserveAfterSpoken))({color:d,alpha:f}=Ft(this._keywordColor,16776960));else if(r){const y=this._activeStyle.color;y&&!Dt(y)?{color:d,alpha:f}=Ft(y,16777215):(d=16777215,f=1)}else if(a){const y=this._futureStyle.color;y&&!Dt(y)?{color:d,alpha:f}=Ft(y,16777215):(d=16777215,f=1)}else{const y=this.originalOpts?.color,C=typeof y=="object"&&y!==null&&"type"in y?16777215:y;({color:d,alpha:f}=Ft(C))}if(h&&n?.type==="opacity"){const y=n.value<1&&n.mode==="dynamic"&&r?n.value+(1-n.value)*c:1+(n.value-1)*c;f*=y}i.tint=d;const p=y=>{y.label==="bgRect"||y.label==="tiktokBackground"||y.label==="containerBackground"||typeof y.label=="string"&&y.label.startsWith("bgRect_")||("alpha"in y&&(y.alpha=f),y.children&&y.children.forEach(p))};i.children.forEach(p);const g=i.parent,v=`bgRect_${i.segmentIndex}`,x=g?g.getChildByLabel(v):null,w=r?this._activeStyle.background??"":"";if(r&&!!w&&!Dt(w)&&w!=="none"&&g){const{color:y,alpha:C}=Ft(w,16753920),k=15,O=40,F=i.scale.x,b=(i.getLocalBounds().width||i.width)*F,S=(this.originalOpts?.fontSize??40)*F,A=i.x,E=i.y+9,P=x??new m.Graphics;P.label=v,P.clear(),P.roundRect(A-O/2,E-k/2,b+O,S+k,10),P.fill({color:y,alpha:C}),P.tint=16777215,x||g.addChildAt(P,0)}else x&&g&&(g.removeChild(x),x.destroy())})}async clone(){await this.ready;const t=new mt(this.text,{...this.originalOpts,words:[...this._words]});return this.copyStateTo(t),t.id=this.id,t.effects=[...this.effects],t}toJSON(t=!1){const e=super.toJSON(t),i=this.originalOpts??{},s={};i.fontSize!==void 0&&(s.fontSize=i.fontSize),i.fontFamily!==void 0&&(s.fontFamily=i.fontFamily),i.fontWeight!==void 0&&(s.fontWeight=i.fontWeight),i.fontStyle!==void 0&&(s.fontStyle=i.fontStyle),i.color!==void 0&&(s.color=i.color),i.align!==void 0&&(s.align=i.align),i.textCase!==void 0&&(s.textCase=i.textCase),i.fontUrl!==void 0&&(s.fontUrl=i.fontUrl),i.verticalAlign!==void 0&&(s.verticalAlign=i.verticalAlign),i.wordWrapWidth!==void 0&&(s.wordWrapWidth=i.wordWrapWidth),i.wordWrap!==void 0&&(s.wordWrap=i.wordWrap),i.wordAnimation!==void 0&&(s.wordAnimation=i.wordAnimation),i.stroke&&(typeof i.stroke=="object"?s.stroke={color:i.stroke.color,width:i.stroke.width}:s.stroke={color:i.stroke,width:i.strokeWidth??0}),i.shadow&&(s.shadow={color:i.shadow.color??"#000000",alpha:i.shadow.alpha??.5,blur:i.shadow.blur??4,offsetX:i.shadow.offsetX??0,offsetY:i.shadow.offsetY??0});const r={};this._words.length>0&&(r.words=this._words);const o={};i.activeStyle&&(o.active=i.activeStyle),i.futureStyle&&(o.future=i.futureStyle),i.keywordColor&&(o.keyword={color:i.keywordColor,preserveAfterSpoken:i.keywordPreserveAfterSpoken}),Object.keys(o).length>0&&(r.colors=o),i.wordAnimation!==void 0&&(r.wordAnimation=i.wordAnimation);const a={};return i.videoWidth!==void 0&&(a.videoWidth=i.videoWidth),i.videoHeight!==void 0&&(a.videoHeight=i.videoHeight),i.bottomOffset!==void 0&&(a.bottomOffset=i.bottomOffset),Object.keys(a).length>0&&(r.positioning=a),{...e,type:"Caption",text:this.text,style:s,caption:Object.keys(r).length>0?r:void 0,id:this.id,effects:this.effects,mediaId:this.mediaId,wordsPerLine:this.wordsPerLine,fontUrl:i.fontUrl}}static async fromObject(t,e){if(t.type!=="Caption")throw new Error(`Expected Caption, got ${t.type}`);const i=e?.captionConfig,s=t.text||"",r={...i?.style??{},...t.style??{}},o={};r.fontSize!==void 0&&(o.fontSize=r.fontSize),r.fontFamily!==void 0&&(o.fontFamily=r.fontFamily),r.fontWeight!==void 0&&(o.fontWeight=r.fontWeight),r.fontStyle!==void 0&&(o.fontStyle=r.fontStyle),r.color!==void 0?o.color=r.color:r.fill!==void 0&&(o.color=r.fill),r.align!==void 0&&(o.align=r.align),r.textCase!==void 0&&(o.textCase=r.textCase),r.verticalAlign!==void 0&&(o.verticalAlign=r.verticalAlign),r.wordWrapWidth!==void 0&&(o.wordWrapWidth=r.wordWrapWidth),r.wordWrap!==void 0&&(o.wordWrap=r.wordWrap),r.wordAnimation!==void 0&&(o.wordAnimation=r.wordAnimation),r.fontUrl!==void 0?o.fontUrl=r.fontUrl:t.fontUrl!==void 0&&(o.fontUrl=t.fontUrl);const a=h=>h!=null&&h!=="";a(r.wordsPerLine)?o.wordsPerLine=r.wordsPerLine:a(t.wordsPerLine)&&(o.wordsPerLine=t.wordsPerLine);const n=r;if(n.lineHeight!==void 0&&(o.lineHeight=n.lineHeight),n.letterSpacing!==void 0&&(o.letterSpacing=n.letterSpacing),o.textCase===void 0&&t.textCase!==void 0&&(o.textCase=t.textCase),n.background&&typeof n.background=="object")o.background={...n.background};else if(a(n.backgroundColor)&&n.backgroundColor!=="transparent"){const h=Number(n.padding);o.background={color:n.backgroundColor,opacity:n.backgroundOpacity??.7,borderRadius:n.borderRadius??8,paddingX:Number.isFinite(h)?h:10,paddingY:Number.isFinite(h)?Math.round(h*.6):6}}if(t.mediaId&&(o.mediaId=t.mediaId),r.stroke&&(o.stroke=r.stroke.color,o.strokeWidth=r.stroke.width),r.shadow&&(o.shadow={color:r.shadow.color,alpha:r.shadow.alpha,blur:r.shadow.blur,offsetX:r.shadow.offsetX??0,offsetY:r.shadow.offsetY??0}),t.caption){const h={...t.caption};!h.colors&&i?.colors&&(h.colors=i.colors),!h.positioning&&i?.positioning&&(h.positioning=i.positioning),o.caption=h,t.caption.wordAnimation&&(o.wordAnimation=t.caption.wordAnimation)}else i&&(o.caption={colors:i.colors,positioning:i.positioning});o.initialLayoutApplied=!0;const c=new mt(s,o);return c._trackCaptionColors=i?.colors,X.deserializeBaseProperties(c,t),c.wordsPerLine=(a(t.wordsPerLine)?t.wordsPerLine:void 0)??i?.wordsPerLine??"multiple",t.effects&&(c.effects=t.effects),await c.ready,c}getVisibleHandles(){return["mr","mb","br","rot"]}}let It=class vt extends X{type="Image";ready;_meta={duration:0,width:0,height:0};get meta(){return{...this._meta}}img=null;pixiTexture=null;frames=[];id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effects=[];getVisibleHandles(){return["tl","tr","bl","br","rot"]}static async fromUrl(t,e){let i=null,s;if(t.startsWith("blob:"))try{const o=await fetch(t);if(!o.ok)throw new Error(`Failed to fetch image: ${o.status} ${o.statusText}`);const a=await o.blob();s=await createImageBitmap(a);try{i=m.Texture.from(s)}catch(n){Q.warn("Failed to create Pixi texture from bitmap:",n)}}catch(o){throw Q.error(`Failed to load blob image from ${t}`,o),o}else s=await yt.getImageBitmap(t);if(!s)throw new Error(`Failed to load image from ${t}`);const r=new vt(s,e||t);return i&&(r.pixiTexture=i),r}getTexture(){return this.pixiTexture}constructor(t,e){super(),this.src=e!==void 0?e:"";const i=s=>{this.img=s,this._meta.width=s.width,this._meta.height=s.height,this._meta.duration=1/0;const r={...this._meta};return this.width=this.width===0?r.width:this.width,this.height=this.height===0?r.height:this.height,this.duration===0&&r.duration!==1/0&&(this.duration=r.duration,this.display.to=this.display.from+this.duration),r};if(t instanceof ReadableStream)this.ready=new Response(t).blob().then(s=>createImageBitmap(s)).then(i);else if(t instanceof ImageBitmap)this.ready=Promise.resolve(i(t));else if(Array.isArray(t)&&t.every(s=>s instanceof VideoFrame)){this.frames=t;const s=this.frames[0];if(s==null)throw Error("The frame count must be greater than 0");this._meta={width:s.displayWidth,height:s.displayHeight,duration:this.frames.reduce((o,a)=>o+(a.duration??0),0)};const r={...this._meta,duration:1/0};this.width=this.width===0?r.width:this.width,this.height=this.height===0?r.height:this.height,this.duration===0&&r.duration!==1/0&&(this.duration=r.duration,this.display.to=this.display.from+this.duration),this.ready=Promise.resolve(r)}else if("type"in t)this.ready=this.initAnimateImg(t.stream,t.type).then(()=>{const s={width:this._meta.width,height:this._meta.height,duration:1/0};return this.width=this.width===0?s.width:this.width,this.height=this.height===0?s.height:this.height,this.duration===0&&s.duration!==1/0&&(this.duration=s.duration,this.display.to=this.display.from+this.duration),s});else throw Error("Illegal arguments")}async initAnimateImg(t,e){this.frames=await _i(t,e);const i=this.frames[0];if(i==null)throw Error("No frame available in gif");this._meta={duration:this.frames.reduce((s,r)=>s+(r.duration??0),0),width:i.codedWidth,height:i.codedHeight},Q.info("Image ready:",this._meta)}tickInterceptor=async(t,e)=>e;async tick(t){if(this.img!=null)return await this.tickInterceptor(t,{video:await createImageBitmap(this.img),state:"success"});const e=t%this._meta.duration;return await this.tickInterceptor(t,{video:(this.frames.find(i=>e>=i.timestamp&&e<=i.timestamp+(i.duration??0))??this.frames[0]).clone(),state:"success"})}async split(t){if(await this.ready,this.img!=null)return[new vt(await createImageBitmap(this.img),this.src),new vt(await createImageBitmap(this.img),this.src)];let e=-1;for(let r=0;r<this.frames.length;r++){const o=this.frames[r];if(!(t>o.timestamp)){e=r;break}}if(e===-1)throw Error("Not found frame by time");const i=this.frames.slice(0,e).map(r=>new VideoFrame(r)),s=this.frames.slice(e).map(r=>new VideoFrame(r,{timestamp:r.timestamp-t}));return[new vt(i,this.src),new vt(s,this.src)]}async clone(){await this.ready;const t=this.img==null?this.frames.map(i=>i.clone()):await createImageBitmap(this.img),e=new vt(t,this.src);return e.tickInterceptor=this.tickInterceptor,this.copyStateTo(e),e.id=this.id,e.effects=[...this.effects],e.transition=this.transition,e}addEffect(t){this.effects.push(t)}editEffect(t,e){const i=this.effects.find(s=>s.id===t);i&&Object.assign(i,e)}removeEffect(t){const e=this.effects.findIndex(i=>i.id===t);e!==-1&&this.effects.splice(e,1)}destroy(){Q.info("Image destroy"),this.img?.close(),this.frames.forEach(t=>t.close()),this.pixiTexture=null,super.destroy()}toJSON(t=!1){return{...super.toJSON(t),type:"Image",id:this.id,effects:this.effects}}static async fromObject(t){if(t.type!=="Image")throw new Error(`Expected Image, got ${t.type}`);if(!t.src||t.src.trim()==="")throw new Error("Image requires a valid source URL. Generated clips (like text-to-image) cannot be loaded from JSON without their source data.");let e;try{const i=await yt.getImageBitmap(t.src);e=new vt(i,t.src)}catch(i){throw i instanceof Error&&i.message.includes("could not be decoded")?new Error(`Failed to decode image from ${t.src}. The image may be decoded, in an unsupported format, or there may be CORS issues.`):i}return X.deserializeBaseProperties(e,t),t.effects&&(e.effects=t.effects),e}};function oe(l,t){const e={},i=t.videoTracks[0];if(i!=null){const r=fs(l.getTrackById(i.id))?.buffer,o=us(i.codec);o&&(e.videoTrackConf={timescale:i.timescale,duration:i.duration,width:i.video.width,height:i.video.height,brands:t.brands,type:o.type,[o.descKey]:r}),e.videoDecoderConf={codec:i.codec,codedHeight:i.video.height,codedWidth:i.video.width,description:r}}const s=t.audioTracks[0];if(s!=null){const r=ps(l),o=r?ms(r):{};e.audioTrackConf={timescale:s.timescale,samplerate:o.sampleRate??s.audio.sample_rate,channel_count:o.numberOfChannels??s.audio.channel_count,hdlr:"soun",type:s.codec.startsWith("mp4a")?"mp4a":s.codec,description:r};const a=s.codec.startsWith("mp4a")?s.codec:o.codec??(s.codec==="Opus"||s.codec==="opus"?"opus":s.codec);e.audioDecoderConf={codec:a,numberOfChannels:o.numberOfChannels??s.audio.channel_count,sampleRate:o.sampleRate??s.audio.sample_rate,...o.description?{description:o.description}:{}}}return e}function us(l){return l.startsWith("avc1")?{descKey:"avcDecoderConfigRecord",type:"avc1"}:l.startsWith("hvc1")?{descKey:"hevcDecoderConfigRecord",type:"hvc1"}:null}function fs(l){for(const t of l.mdia.minf.stbl.stsd.entries){const e=t.avcC??t.hvcC??t.av1C??t.vpcC;if(e!=null){const i=new et.mp4box.DataStream(void 0,0,void 0);return e.write(i),new Uint8Array(i.buffer.slice(8))}}}function ps(l,t="mp4a"){const e=l.moov?.traks.flatMap(i=>i.mdia.minf.stbl.stsd.entries).find(i=>i.type===t);return e?.esds??e}function ms(l){const t=l.esd?.descs?.[0];if(!t)return{};let e=`mp4a.${t.oti.toString(16)}`;const i=t.descs?.[0];if(!i)return e.endsWith(".40")&&(e+=".2"),{codec:e};const s=i.data;if(!s)return{codec:e};const r=(s[0]&248)>>3;e+=`.${r}`;const o=(s[0]&7)<<1|s[1]>>7,a=(s[1]&120)>>3;return{codec:e,sampleRate:[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350][o],numberOfChannels:a,description:s}}async function gs(l,t,e){const i=et.mp4box.createFile(!1);i.onReady=o=>{t({mp4boxFile:i,info:o}),[o.videoTracks[0],o.audioTracks[0]].forEach(a=>{if(a){const n=a.video?"video":"audio";i.setExtractionOptions(a.id,n,{nbSamples:100})}}),i.start()},i.onSamples=e;let s=0;const r=30*1024*1024;for(;;){const o=await l.read(r,{at:s});if(o.byteLength===0)break;o.fileStart=s;const a=i.appendBuffer(o);if(a==null)break;s=a}i.stop()}function vs(l){if(l?.length!==9)return{};const t=new Int32Array(l.buffer),e=h=>h/65536,i=e(t[0]),s=e(t[1]),r=e(t[3]),o=e(t[4]),a=e(t[6]),n=e(t[7]),c=t[8]/(1<<30);return{scaleX:Math.sqrt(i*i+r*r),scaleY:Math.sqrt(s*s+o*o),rotationRad:Math.atan2(r,i),rotationDeg:Math.atan2(r,i)*180/Math.PI,translateX:a,translateY:n,perspective:c}}function ys(l,t,e){const i=(Math.round(e/90)*90+360)%360;if(i===0)return c=>c;const s=i===90||i===270,r=s?t:l,o=s?l:t,a=new OffscreenCanvas(r,o),n=a.getContext("2d");return n.translate(r/2,o/2),n.rotate(-i*Math.PI/180),n.translate(-l/2,-t/2),c=>{if(!c)return null;n.drawImage(c,0,0);const h=new VideoFrame(a,{timestamp:c.timestamp,duration:c.duration??void 0});return c.close(),h}}let ne=0;function ae(l){return l.kind==="file"&&l.createReader instanceof Function}class nt extends X{type="Video";insId=ne++;logger=Q.create(`Video id:${this.insId},`);ready;_meta={duration:0,width:0,height:0,audioSampleRate:0,audioChanCount:0};get meta(){return{...this._meta}}localFile;headerBoxPos=[];async getFileHeaderBinData(){await this.ready;const t=await this.localFile.getOriginFile();if(t==null)throw Error("Video localFile is not origin file");return await new Blob(this.headerBoxPos.map(({start:e,size:i})=>t.slice(e,e+i))).arrayBuffer()}parsedMatrix={perspective:1,rotationRad:0,rotationDeg:0,scaleX:1,scaleY:1,translateX:0,translateY:0};vfRotater=t=>t;videoSamples=[];audioSamples=[];videoFrameFinder=null;audioFrameFinder=null;onEffectiveVolumeChange(){this.audioFrameFinder?.setVolume(this.effectiveVolume)}decoderConf={video:null,audio:null};opts={audio:!0};audio=!0;id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effects=[];getVisibleHandles(){return["tl","tr","bl","br","rot"]}static async fromUrl(t,e={}){const i=await yt.getReadableStream(t),s=new nt(i,{},t);return await s.ready,e.x!==void 0&&(s.left=e.x),e.y!==void 0&&(s.top=e.y),e.width!==void 0&&(s.width=e.width),e.height!==void 0&&(s.height=e.height),s}constructor(t,e={},i){if(super(),this.src=i!==void 0?i:"",!(t instanceof ReadableStream)&&!ae(t)&&!Array.isArray(t.videoSamples))throw Error("Illegal argument");this.opts={audio:!0,...e},this.audio=typeof this.opts.audio=="boolean"?this.opts.audio:!0,this.volume=typeof e.audio=="object"&&"volume"in e.audio?e.audio.volume:e.volume??1;const s=async r=>(await it.write(this.localFile,r),this.localFile);this.localFile=ae(t)?t:"localFile"in t?t.localFile:it.tmpfile(),this.ready=(t instanceof ReadableStream?s(t).then(r=>Xe(r,this.opts)):ae(t)?Xe(t,this.opts):Promise.resolve(t)).then(async({videoSamples:r,audioSamples:o,decoderConf:a,headerBoxPos:n,parsedMatrix:c})=>{this.videoSamples=r,this.audioSamples=o,this.decoderConf=a,this.headerBoxPos=n,this.parsedMatrix=c;const{videoFrameFinder:h,audioFrameFinder:d}=ws({video:a.video==null?null:{...a.video,hardwareAcceleration:this.opts.__unsafe_hardwareAcceleration__},audio:a.audio},await this.localFile.createReader(),r,o,this.opts.audio!==!1?this.volume:0);this.videoFrameFinder=h,this.audioFrameFinder=d,this.effectiveVolume!==this.volume&&this.audioFrameFinder?.setVolume(this.effectiveVolume);const{codedWidth:f,codedHeight:u}=a.video??{};f&&u&&(this.vfRotater=ys(f,u,c.rotationDeg)),this._meta=xs(a,r,o,c.rotationDeg),this.logger.info("Video meta:",this._meta);const p={...this._meta};this.width=this.width===0?p.width:this.width,this.height=this.height===0?p.height:this.height,this.trim.to=this.trim.to===0?p.duration:Math.min(this.trim.to,p.duration),this.trim.from=Math.min(this.trim.from,this.trim.to);const g=(this.trim.to-this.trim.from)/this.playbackRate;return this.duration=this.duration===0?g:this.duration,Math.abs(this.duration-g)>1&&(this.duration=g),this.display.to=this.display.from+this.duration,this.on("propsChange",v=>{(v.volume!==void 0||v.muted!==void 0)&&this.audioFrameFinder&&this.audioFrameFinder.setVolume(this.effectiveVolume)}),p})}tickInterceptor=async(t,e)=>e;async tick(t){const e=t+this.trim.from;if(e>this.trim.to||e>this._meta.duration)return await this.tickInterceptor(t,{audio:await this.audioFrameFinder?.find(e)??[],state:"done"});const[i,s]=await Promise.all([this.audioFrameFinder?.find(e)??[],this.videoFrameFinder?.find(e).then(this.vfRotater)]);return s==null?await this.tickInterceptor(t,{audio:i,state:"success"}):await this.tickInterceptor(t,{video:s,audio:i,state:"success"})}addEffect(t){this.effects.push(t)}editEffect(t,e){const i=this.effects.find(s=>s.id===t);i&&Object.assign(i,e)}removeEffect(t){const e=this.effects.findIndex(i=>i.id===t);e!==-1&&this.effects.splice(e,1)}async split(t){throw new Error("Video.split is not implemented - use core state instead")}async clone(){await this.ready;const t=new nt({localFile:this.localFile,videoSamples:[...this.videoSamples],audioSamples:[...this.audioSamples],decoderConf:this.decoderConf,headerBoxPos:this.headerBoxPos,parsedMatrix:this.parsedMatrix},this.opts,this.src);return await t.ready,t.tickInterceptor=this.tickInterceptor,this.copyStateTo(t),t.id=this.id,t.effects=[...this.effects],t}destroy(){this.destroyed||(this.destroyed=!0,this.logger.info("Video destroy"),super.destroy(),this.videoFrameFinder?.destroy(),this.audioFrameFinder?.destroy())}toJSON(t=!1){return{...super.toJSON(t),type:"Video",audio:this.audio,volume:this.volume,id:this.id,effects:this.effects}}static async fromObject(t){if(t.type!=="Video")throw new Error(`Expected Video, got ${t.type}`);const e=t.audio!==void 0?{audio:t.audio,volume:t.volume}:{volume:t.volume},i=await yt.getReadableStream(t.src),s=new nt(i,e,t.src);return X.deserializeBaseProperties(s,t),t.effects&&(s.effects=t.effects),t.volume!==void 0&&(s.volume=t.volume),s}async createPlaybackElement(){await this.ready;const e=this.localFile;if(!e||typeof e.getOriginFile!="function")throw new Error("Video does not have a local file for playback");const i=await e.getOriginFile();if(!i)throw new Error("Failed to get origin file from VideoClip");const s=URL.createObjectURL(i),r=document.createElement("video");return r.crossOrigin="anonymous",r.muted=!0,r.autoplay=!1,r.playsInline=!0,r.preload="auto",r.loop=!1,r.src=s,await new Promise((o,a)=>{const n=()=>{r.removeEventListener("loadeddata",n),r.removeEventListener("error",c),r.pause(),r.currentTime=0,o()},c=()=>{r.removeEventListener("loadeddata",n),r.removeEventListener("error",c),a(new Error("Failed to load video"))};r.addEventListener("loadeddata",n,{once:!0}),r.addEventListener("error",c,{once:!0}),r.load()}),{element:r,objectUrl:s}}async play(t,e){const i=t,s=e+this.trim.from/1e6;if(Math.abs(i.currentTime-s)>.1&&(i.currentTime=s),i.muted=!1,i.paused)try{await i.play()}catch{try{await i.play()}catch(o){console.warn("Failed to play video:",o)}}}pause(t){const e=t;e.pause(),e.muted=!0}async seek(t,e){const i=t,s=e+this.trim.from/1e6;i.pause(),i.currentTime=s,i.addEventListener("seeked",()=>{i.__pendingRender?.()},{once:!0})}syncPlayback(t,e,i){const s=t,r=this.duration&&this.duration!==1/0?this.duration/1e6:(this.display.to-this.display.from)/1e6,o=i>=0&&i<r,a=i+this.trim.from/1e6,n=r*1e3,c=i*1e3;let h=1;if(this.timing.fadeIn&&this.timing.fadeIn.duration>0&&c<this.timing.fadeIn.duration&&(h*=Ct(c/this.timing.fadeIn.duration,this.timing.fadeIn.curve)),this.timing.fadeOut&&this.timing.fadeOut.duration>0){const d=n-this.timing.fadeOut.duration;if(c>=d){const f=1-(c-d)/this.timing.fadeOut.duration;h*=Ct(f,this.timing.fadeOut.curve)}}s.volume=Math.max(0,Math.min(1,this.effectiveVolume*h)),e&&o?s.paused?this.play(s,i).catch(console.warn):(s.muted&&(s.muted=!1),(s.ended||s.currentTime>=this.trim.to/1e6)&&(s.currentTime=a,s.play().catch(console.warn))):(s.paused||s.pause(),s.muted=!0,o&&Math.abs(s.currentTime-a)>.1&&(s.currentTime=a))}cleanupPlayback(t,e){const i=t;i.pause(),i.removeAttribute("src"),i.load(),e&&URL.revokeObjectURL(e)}async scaleToFit(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.min(t/i,e/s);this.width=i*r,this.height=s*r}async scaleToFill(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.max(t/i,e/s);this.width=i*r,this.height=s*r}centerInScene(t,e){this.left=(t-this.width)/2,this.top=(e-this.height)/2}}function xs(l,t,e,i){const s={duration:0,width:0,height:0,audioSampleRate:0,audioChanCount:0};if(l.video!=null&&t.length>0){s.width=l.video.codedWidth??0,s.height=l.video.codedHeight??0;const a=(Math.round(i/90)*90+360)%360;(a===90||a===270)&&([s.width,s.height]=[s.height,s.width])}l.audio!=null&&e.length>0&&(s.audioSampleRate=L.sampleRate,s.audioChanCount=L.channelCount);let r=0,o=0;if(t.length>0)for(let a=t.length-1;a>=0;a--){const n=t[a];if(!n.deleted){r=n.cts+n.duration;break}}if(e.length>0){const a=e.at(-1);o=a.cts+a.duration}return s.duration=Math.max(r,o),s}function ws(l,t,e,i,s){return{audioFrameFinder:s===0||l.audio==null||i.length===0?null:new Ts(t,i,l.audio,{volume:s,targetSampleRate:L.sampleRate}),videoFrameFinder:l.video==null||e.length===0?null:new bs(t,e,l.video)}}async function Xe(l,t={}){let e=null;const i={video:null,audio:null};let s=[],r=[],o=[];const a={perspective:1,rotationRad:0,rotationDeg:0,scaleX:1,scaleY:1,translateX:0,translateY:0};let n=-1,c=-1;const h=await l.createReader();await gs(h,async f=>{e=f.info;const u=f.mp4boxFile.ftyp;o.push({start:u.start,size:u.size});const p=f.mp4boxFile.moov;o.push({start:p.start,size:p.size}),Object.assign(a,vs(e.videoTracks[0]?.matrix));let{videoDecoderConf:g,audioDecoderConf:v}=oe(f.mp4boxFile,f.info);if(i.video=g??null,i.audio=v??null,g==null&&v==null&&Q.error("Video no video and audio track"),v!=null){const{supported:x}=await AudioDecoder.isConfigSupported(v);x||Q.error(`Video audio codec is not supported: ${v.codec}`)}if(g!=null){const{supported:x}=await VideoDecoder.isConfigSupported(g);x||Q.error(`Video video codec is not supported: ${g.codec}`)}Q.info("mp4BoxFile moov ready",{...f.info,tracks:null,videoTracks:null,audioTracks:null},i)},(f,u,p)=>{if(u==="video"){n===-1&&(n=p[0].dts);for(const g of p)s.push(qe(g,n,"video"))}else if(u==="audio"&&t.audio){c===-1&&(c=p[0].dts);for(const g of p)r.push(qe(g,c,"audio"))}}),await h.close();const d=s.at(-1)??r.at(-1);if(e==null)throw Error("Video stream is done, but not emit ready");if(d==null)throw Error("Video stream not contain any sample");return Os(s),Q.info("mp4 stream parsed"),{videoSamples:s,audioSamples:r,decoderConf:i,headerBoxPos:o,parsedMatrix:a}}function qe(l,t=0,e){let i=l.offset;const s=e==="video"&&l.is_sync?Rs(l.data,l.description.type):-1;let r=l.size;return s>0&&(i+=s,r-=s),{...l,is_idr:s>=0,offset:i,size:r,cts:(l.cts-t)/l.timescale*1e6,dts:(l.dts-t)/l.timescale*1e6,duration:l.duration/l.timescale*1e6,timescale:1e6,data:e==="video"?null:l.data}}class bs{constructor(t,e,i){this.localFileReader=t,this.samples=e,this.conf=i}localFileReader;samples;conf;decoder=null;timestamp=0;curAborter={abort:!1,st:performance.now()};find=async t=>{(this.decoder==null||this.decoder.state==="closed"||t<this.timestamp||t-this.timestamp>3e6)&&this.reset(t),this.curAborter.abort=!0,this.timestamp=t,this.curAborter={abort:!1,st:performance.now()};const e=await this.parseFrame(t,this.decoder,this.curAborter);return this.sleepCnt=0,e};lastVfDur=0;downgradeSoftDecode=!1;videoDecCursorIdx=0;videoFrames=[];outputFrameCnt=0;inputChunkCnt=0;sleepCnt=0;predecodeErr=!1;_firstPresentableTs=null;firstPresentableTs(){if(this._firstPresentableTs!=null)return this._firstPresentableTs;let t=this.samples.findIndex(i=>i.is_idr&&!i.deleted);t<0&&(t=0);let e=1/0;for(let i=t;i<this.samples.length;i++){const s=this.samples[i];if(i>t&&s.is_idr)break;!s.deleted&&s.cts<e&&(e=s.cts)}return this._firstPresentableTs=Number.isFinite(e)?e:0,this._firstPresentableTs}parseFrame=async(t,e,i)=>{if(e==null||e.state==="closed"||i.abort)return null;if(this.videoFrames.length>0){const s=this.videoFrames[0];return t<s.timestamp?t<=0||s.timestamp<=this.firstPresentableTs()?new VideoFrame(s):null:(this.videoFrames.shift(),t>s.timestamp+(s.duration??0)?(s.close(),await this.parseFrame(t,e,i)):(!this.predecodeErr&&this.videoFrames.length<10&&this.startDecode(e).catch(r=>{throw this.predecodeErr=!0,this.reset(t),r}),s))}if(this.decoding||this.outputFrameCnt<this.inputChunkCnt&&e.decodeQueueSize>0){if(performance.now()-i.st>6e3)throw Error(`Video.tick video timeout, ${JSON.stringify(this.getState())}`);this.sleepCnt+=1,await Ae(15)}else{if(this.videoDecCursorIdx>=this.samples.length)return null;try{await this.startDecode(e)}catch(s){throw this.reset(t),s}}return await this.parseFrame(t,e,i)};decoding=!1;startDecode=async t=>{if(this.decoding||t.decodeQueueSize>600)return;let e=this.videoDecCursorIdx+1;if(e>this.samples.length)return;this.decoding=!0;let i=!1;for(;e<this.samples.length;e++){const s=this.samples[e];if(!i&&!s.deleted&&(i=!0),s.is_idr)break}if(i){const s=this.samples.slice(this.videoDecCursorIdx,e);if(s[0]?.is_idr!==!0)Q.warn("First sample not idr frame");else{const r=performance.now(),o=await ks(s,this.localFileReader),a=performance.now()-r;if(a>1e3){const n=s[0],c=s.at(-1),h=c.offset+c.size-n.offset;Q.warn(`Read video samples time cost: ${Math.round(a)}ms, file chunk size: ${h}`)}if(t.state==="closed")return;this.lastVfDur=o[0]?.duration??0,Fs(t,o,{onDecodingError:n=>{if(this.downgradeSoftDecode)throw n;this.outputFrameCnt===0&&(this.downgradeSoftDecode=!0,Q.warn("Downgrade to software decode"),this.reset())}}),this.inputChunkCnt+=o.length}}this.videoDecCursorIdx=e,this.decoding=!1};reset=t=>{if(this.decoding=!1,this.videoFrames.forEach(i=>i.close()),this.videoFrames=[],t==null||t===0)this.videoDecCursorIdx=0;else{let i=0;for(let s=0;s<this.samples.length;s++){const r=this.samples[s];if(r.is_idr&&(i=s),!(r.cts<t)){this.videoDecCursorIdx=i;break}}}this.inputChunkCnt=0,this.outputFrameCnt=0,this.decoder?.state!=="closed"&&this.decoder?.close();const e={...this.conf,...this.downgradeSoftDecode?{hardwareAcceleration:"prefer-software"}:{}};this.decoder=new VideoDecoder({output:i=>{if(this.outputFrameCnt+=1,i.timestamp===-1){i.close();return}let s=i;i.duration==null&&(s=new VideoFrame(i,{duration:this.lastVfDur}),i.close()),this.videoFrames.push(s)},error:i=>{if(i.message.includes("Codec reclaimed due to inactivity")){this.decoder=null,Q.warn(i.message);return}const s=`VideoFinder VideoDecoder err: ${i.message}, config: ${JSON.stringify(e)}, state: ${JSON.stringify(this.getState())}`;throw Q.error(s),Error(s)}}),this.decoder.configure(e)};getState=()=>({time:this.timestamp,decState:this.decoder?.state,decQSize:this.decoder?.decodeQueueSize,decCursorIdx:this.videoDecCursorIdx,sampleLen:this.samples.length,inputCnt:this.inputChunkCnt,outputCnt:this.outputFrameCnt,cacheFrameLen:this.videoFrames.length,softDecode:this.downgradeSoftDecode,clipIdCnt:ne,sleepCnt:this.sleepCnt,memInfo:_e()});destroy=async()=>{if(this.curAborter.abort=!0,this.videoFrames.forEach(t=>t.close()),this.videoFrames=[],this.decoder&&this.decoder.state!=="closed")try{this.decoder.close()}catch{}this.decoder=null,this.localFileReader.close()}}function Cs(l,t){for(let e=0;e<t.length;e++){const i=t[e];if(l>=i.cts&&l<i.cts+i.duration)return e;if(i.cts>l)break}return 0}class Ts{constructor(t,e,i,s){this.localFileReader=t,this.samples=e,this.conf=i,this.volume=s.volume,this.sampleRate=s.targetSampleRate}localFileReader;samples;conf;volume=1;sampleRate;setVolume(t){this.volume=t,this.reset()}decoder=null;curAborter={abort:!1,st:performance.now()};find=async t=>{const e=t<=this.timestamp||t-this.timestamp>1e5;(this.decoder==null||this.decoder.state==="closed"||e)&&this.reset(),e&&(this.timestamp=t,this.decCursorIdx=Cs(t,this.samples)),this.curAborter.abort=!0;const i=t-this.timestamp;this.timestamp=t,this.curAborter={abort:!1,st:performance.now()};const s=await this.parseFrame(Math.ceil(i*(this.sampleRate/1e6)),this.decoder,this.curAborter);return this.sleepCnt=0,s};timestamp=0;decCursorIdx=0;pcmData={frameCnt:0,data:[]};sleepCnt=0;parseFrame=async(t,e=null,i)=>{if(e==null||i.abort||e.state==="closed"||t===0)return[];const s=this.pcmData.frameCnt-t;if(s>0)return s<L.sampleRate/10&&this.startDecode(e),le(this.pcmData,t);if(e.decoding){if(performance.now()-i.st>6e4)return console.warn("[Video.tick] Audio decode wait exceeded 60s, using the PCM decoded so far",this.getState()),this.pcmData.frameCnt>0?le(this.pcmData,this.pcmData.frameCnt):[];this.sleepCnt+=1,await Ae(15)}else{if(this.decCursorIdx>=this.samples.length-1)return le(this.pcmData,this.pcmData.frameCnt);this.startDecode(e)}return this.parseFrame(t,e,i)};startDecode=t=>{if(t.decodeQueueSize>10)return;const i=[];let s=this.decCursorIdx;for(;s<this.samples.length;){const r=this.samples[s];if(s+=1,!r.deleted&&(i.push(r),i.length>=10))break}this.decCursorIdx=s,t.decode(i.map(r=>new EncodedAudioChunk({type:"key",timestamp:r.cts,duration:r.duration,data:r.data})))};reset=()=>{this.timestamp=0,this.decCursorIdx=0,this.pcmData={frameCnt:0,data:[]},this.decoder?.close(),this.decoder=Ss(this.conf,{resampleRate:L.sampleRate,volume:this.volume},t=>{this.pcmData.data.push(t),this.pcmData.frameCnt+=t[0].length})};getState=()=>({time:this.timestamp,decState:this.decoder?.state,decQSize:this.decoder?.decodeQueueSize,decCursorIdx:this.decCursorIdx,sampleLen:this.samples.length,pcmLen:this.pcmData.frameCnt,clipIdCnt:ne,sleepCnt:this.sleepCnt,memInfo:_e()});destroy=()=>{this.decoder=null,this.curAborter.abort=!0,this.pcmData={frameCnt:0,data:[]},this.localFileReader.close()}}function Ss(l,t,e){let i=0,s=0;const r=h=>{if(s+=1,h.length!==0){if(t.volume!==1)for(const d of h)for(let f=0;f<d.length;f++)d[f]*=t.volume;h.length===1&&(h=[h[0],h[0]]),e(h)}},o=As(r),a=t.resampleRate!==l.sampleRate;let n=new AudioDecoder({output:h=>{const d=be(h);a?o(()=>Fi(d,h.sampleRate,{rate:t.resampleRate,chanCount:h.numberOfChannels})):r(d),h.close()},error:h=>{h.message.includes("Codec reclaimed due to inactivity")||c("Video AudioDecoder err",h)}});n.configure(l);function c(h,d){const f=`${h}: ${d.message}, state: ${JSON.stringify({qSize:n.decodeQueueSize,state:n.state,inputCnt:i,outputCnt:s,decoderConf:l,opts:t})}`;throw Q.error(f),Error(f)}return{decode(h){i+=h.length;try{for(const d of h)n.decode(d)}catch(d){c("decode audio chunk error",d)}},close(){n.state!=="closed"&&n.close()},get decoding(){return i>s&&n.decodeQueueSize>0},get state(){return n.state},get decodeQueueSize(){return n.decodeQueueSize}}}function As(l){const t=[];let e=0;function i(o,a){t[a]=o,s()}function s(){const o=t[e];o!=null&&(l(o),e+=1,s())}let r=0;return o=>{const a=r;r+=1,o().then(n=>i(n,a)).catch(n=>i(n,a))}}function le(l,t){const e=[new Float32Array(t),new Float32Array(t)];let i=0,s=0;for(;s<l.data.length;){const[r,o]=l.data[s];if(i+r.length>t){const a=t-i;e[0].set(r.subarray(0,a),i),e[1].set(o.subarray(0,a),i),l.data[s][0]=r.subarray(a,r.length),l.data[s][1]=o.subarray(a,o.length);break}else e[0].set(r,i),e[1].set(o,i),i+=r.length,s++}return l.data=l.data.slice(s),l.frameCnt-=t,e}async function ks(l,t){const e=l[0],i=l.at(-1);if(i==null)return[];const s=i.offset+i.size-e.offset;if(s<3e7){const r=new Uint8Array(await t.read(s,{at:e.offset}));return l.map(o=>{const a=o.offset-e.offset;return new EncodedVideoChunk({type:o.is_sync?"key":"delta",timestamp:o.cts,duration:o.duration,data:r.subarray(a,a+o.size)})})}return await Promise.all(l.map(async r=>new EncodedVideoChunk({type:r.is_sync?"key":"delta",timestamp:r.cts,duration:r.duration,data:await t.read(r.size,{at:r.offset})})))}function Fs(l,t,e){if(l.state==="configured"){for(let i=0;i<t.length;i++)l.decode(t[i]);l.flush().catch(i=>{if(!(i instanceof Error))throw i;if(i.message.includes("Decoding error")&&e.onDecodingError!=null){e.onDecodingError(i);return}if(!i.message.includes("Aborted due to close"))throw i})}}function Rs(l,t){if(t!=="avc1"&&t!=="hvc1")return 0;const e=new DataView(l.buffer);for(let i=0;i<l.byteLength-4;){if(t==="avc1"){const s=e.getUint8(i+4)&31;if(s===5||s===7||s===8)return i}else if(t==="hvc1"){const s=e.getUint8(i+4)>>1&63;if(s===19||s===20||s===32||s===33||s===34)return i}i+=e.getUint32(i)+4}return-1}const Ms=2e5;function Os(l){let t=null,e=0;for(const i of l)if(!i.deleted){if(i.is_sync&&e++,e>=2)break;i.is_sync&&(t==null||i.cts<t.cts)&&(t=i)}t!=null&&t.cts<Ms&&(t.duration+=t.cts,t.cts=0)}function _e(){try{const l=performance.memory;return{jsHeapSizeLimit:l.jsHeapSizeLimit,totalJSHeapSize:l.totalJSHeapSize,usedJSHeapSize:l.usedJSHeapSize,percentUsed:(l.usedJSHeapSize/l.jsHeapSizeLimit).toFixed(3),percentTotal:(l.totalJSHeapSize/l.jsHeapSizeLimit).toFixed(3)}}catch{return{}}}class at extends Ke{type="Text";get width(){return this._width}set width(t){Math.abs(this.width-t)<.1||(this._width=t,this._targetWidth=t,this.refreshText().then(()=>{this._explicitHeight?this.emit("propsChange",{width:t}):this.emit("propsChange",{width:t,height:this.height})}))}get height(){return this._height}_explicitHeight=!1;get isExplicitHeight(){return this._explicitHeight}resetHeightToAuto(){this._explicitHeight=!1,this._height=0,this.refreshText().then(()=>{this.emit("propsChange",{height:this.height})})}set height(t){if(Math.abs(this.height-t)<.1)return;const e=t;this._height=t,this.refreshText().then(()=>{const i=this.meta.height,r=e-i<-5;this._explicitHeight=e>0&&(r||this._explicitHeight),this.emit("propsChange",{height:this.height})})}get text(){return this._text}set text(t){this._text!==t&&(this._text=t,this.originalOpts&&this.textStyle&&this.refreshText().then(()=>{this.emit("propsChange",{text:t})}))}get style(){return{fontSize:this.originalOpts.fontSize,fontFamily:this.originalOpts.fontFamily,fontUrl:this.originalOpts.fontUrl,fontWeight:this.originalOpts.fontWeight,fontStyle:this.originalOpts.fontStyle,color:this.originalOpts.color,align:this.originalOpts.align,stroke:this.originalOpts.stroke?typeof this.originalOpts.stroke=="object"?{color:this.originalOpts.stroke.color,width:this.originalOpts.stroke.width,join:this.originalOpts.stroke.join,cap:this.originalOpts.stroke.cap,miterLimit:this.originalOpts.stroke.miterLimit}:{color:this.originalOpts.stroke,width:this.originalOpts.strokeWidth??0}:void 0,shadow:this.originalOpts.shadow?{color:this.originalOpts.shadow.color??"#000000",alpha:this.originalOpts.shadow.alpha??.5,blur:this.originalOpts.shadow.blur??4,offsetX:this.originalOpts.shadow.offsetX??0,offsetY:this.originalOpts.shadow.offsetY??0}:void 0,wordWrap:this.originalOpts.wordWrap,wordWrapWidth:this.originalOpts.wordWrapWidth,lineHeight:this.originalOpts.lineHeight,letterSpacing:this.originalOpts.letterSpacing,textCase:this.originalOpts.textCase,textDecoration:this.originalOpts.textDecoration,background:this.originalOpts.background}}set style(t){this.updateStyle(t)}get textAlign(){return this.originalOpts.align||this.originalOpts.textAlign||"left"}set textAlign(t){this.updateStyle({align:t})}get verticalAlign(){return this.originalOpts.verticalAlign||this.originalOpts.textDecoration||"top"}set verticalAlign(t){["underline","overline","strikethrough","line-through"].includes(t)?(this.updateStyle({textDecoration:t==="strikethrough"?"line-through":t}),this.originalOpts.verticalAlign=t):this.updateStyle({verticalAlign:t})}get textCase(){return this.originalOpts.textCase||"none"}set textCase(t){this.updateStyle({textCase:t})}get underline(){return this.originalOpts.textDecoration==="underline"}set underline(t){this.updateStyle({textDecoration:t?"underline":"none"})}get overline(){return this.originalOpts.textDecoration==="overline"}set overline(t){this.updateStyle({textDecoration:t?"overline":"none"})}get linethrough(){return this.originalOpts.textDecoration==="line-through"}set linethrough(t){this.updateStyle({textDecoration:t?"line-through":"none"})}_targetWidth=0;_wordCache=[];_measuredTextHeight=0;_lineHeightMultiplier=1;_fontSize=40;_textOnlyContainer=null;constructor(t,e={},i){super(),this.originalOpts={...e},this._text=t,i&&this.setRenderer(i),this._buildTextStyles(),this.ready=(async()=>(await this.refreshText(),{...this.meta}))()}_onAfterRefresh(t,e,i,s,r,o){this._populateWordCache(t,e,i,s,r,o)}async clone(){await this.ready;const t=this.textStyle,e=this.originalOpts||{},i=n=>{if(n!=null){if(typeof n=="number")return n;if(n instanceof m.Color)return n.toNumber()}},{stroke:s,strokeWidth:r}=this._cloneStrokeOpts(i),o={fontSize:e.fontSize??t.fontSize,fontFamily:e.fontFamily??(Array.isArray(t.fontFamily)?t.fontFamily[0]:typeof t.fontFamily=="string"?t.fontFamily:"Roboto"),fontUrl:e.fontUrl,fontWeight:e.fontWeight??t.fontWeight,fontStyle:e.fontStyle??t.fontStyle,align:e.align??(t.align==="justify"?"left":t.align),textCase:e.textCase,textDecoration:e.textDecoration,color:this._cloneColorOpts(i),stroke:s,strokeWidth:r,shadow:this._cloneShadowOpts(i)};if(e.wordWrap!==void 0?(o.wordWrap=e.wordWrap,o.wordWrapWidth=e.wordWrapWidth):t.wordWrap&&(o.wordWrap=t.wordWrap,o.wordWrapWidth=t.wordWrapWidth),e.background!==void 0&&(o.background=e.background),e.lineHeight!==void 0)o.lineHeight=e.lineHeight;else if(t.lineHeight!==void 0){const n=o.fontSize??t.fontSize??40;o.lineHeight=t.lineHeight/n}e.letterSpacing!==void 0?o.letterSpacing=e.letterSpacing:t.letterSpacing!==void 0&&(o.letterSpacing=t.letterSpacing);const a=new at(this.text,o);return await a.ready,this.copyStateTo(a),a.id=this.id,a.effects=[...this.effects],a}async updateStyle(t){const e=this._normalizeStyleOpts(t);this.originalOpts={...this.originalOpts,...e},this._buildTextStyles(),await this.refreshText(),this.emit("propsChange",t)}_populateWordCache(t,e,i,s,r,o){this._wordCache=this.wordTexts.map((a,n)=>({text:t[n],width:Math.ceil(a.getLocalBounds().width||a.width),height:Math.ceil(a.getLocalBounds().height||a.height),textObj:a})),this._spaceWidth=i,this._measuredTextHeight=s,this._lineHeightMultiplier=r,this._fontSize=o,this._textOnlyContainer=e}updateLayoutForWidth(t){if(!this._wordCache.length||!this._textOnlyContainer||!this.pixiTextContainer)return this._targetWidth=t,this.refreshText(),{width:this.width,height:this.height};const e=this.originalOpts.background?.paddingX??8,i=this.originalOpts.background?.paddingY??4,s=this._lineHeightMultiplier,o=this._fontSize*s,a=this._measuredTextHeight,n=this._spaceWidth,c=Math.max(1,t-e*2),h=[];let d=[],f=0,u=0;for(let A=0;A<this._wordCache.length;A++){const E=this._wordCache[A],P=E.width,R=E.height,B=f+(f>0?n:0)+P;B<=c||d.length===0?(d.push(A),f=B,u=Math.max(u,R)):(d.length>0&&h.push({wordIndices:d,width:f,height:Math.max(u,o)}),d=[A],f=P,u=R)}d.length>0&&h.push({wordIndices:d,width:f,height:Math.max(u,o)});const p=a+i*2;h.forEach(A=>{A.height=Math.max(A.height,p)});let g=0,v=0;h.forEach(A=>{g=Math.max(g,A.width),v+=A.height});const x=g+e*2,w=v,T=Math.max(x,t),y=w,C=this.textAlign,k=this.originalOpts.verticalAlign||"top";let O=0;k==="center"?O=(y-w)/2:k==="bottom"&&(O=y-w);let F=O;h.forEach(A=>{let E=0;C==="center"?E=(T-A.width)/2:C==="right"?E=T-A.width-e*2:E=e,A.wordIndices.forEach((P,R)=>{const B=this._wordCache[P];B.textObj&&(B.textObj.x=Math.round(E),B.textObj.y=Math.round(F+(A.height-a)/2-9)),E+=B.width+(R<A.wordIndices.length-1?n:0)}),F+=A.height}),this._meta.width=T,this._meta.height=y,this._width=T,this._height=y,this._targetWidth=T;const b=T+(this.renderTexturePadding??0)*2,S=y+(this.renderTexturePadding??0)*2;return this.renderTexture&&(Math.abs(this.renderTexture.width-b)>10||Math.abs(this.renderTexture.height-S)>10)&&this.getTexture(),{width:T,height:y}}toJSON(t=!1){const e=super.toJSON(t),i={};return this.originalOpts.fontSize!==void 0&&(i.fontSize=this.originalOpts.fontSize),this.originalOpts.fontFamily!==void 0&&(i.fontFamily=this.originalOpts.fontFamily),this.originalOpts.fontUrl!==void 0&&(i.fontUrl=this.originalOpts.fontUrl),this.originalOpts.fontWeight!==void 0&&(i.fontWeight=this.originalOpts.fontWeight),this.originalOpts.fontStyle!==void 0&&(i.fontStyle=this.originalOpts.fontStyle),this.originalOpts.color!==void 0&&(i.color=this.originalOpts.color),this.originalOpts.align!==void 0&&(i.align=this.originalOpts.align),this.originalOpts.wordWrap!==void 0&&(i.wordWrap=this.originalOpts.wordWrap),this.originalOpts.wordWrapWidth!==void 0&&(i.wordWrapWidth=this.originalOpts.wordWrapWidth),this.originalOpts.lineHeight!==void 0&&(i.lineHeight=this.originalOpts.lineHeight),this.originalOpts.letterSpacing!==void 0&&(i.letterSpacing=this.originalOpts.letterSpacing),this.originalOpts.background!==void 0&&(i.background=this.originalOpts.background),this.originalOpts.stroke&&(typeof this.originalOpts.stroke=="object"?i.stroke={color:this.originalOpts.stroke.color,width:this.originalOpts.stroke.width,join:this.originalOpts.stroke.join,cap:this.originalOpts.stroke.cap,miterLimit:this.originalOpts.stroke.miterLimit}:i.stroke={color:this.originalOpts.stroke,width:this.originalOpts.strokeWidth??0}),this.originalOpts.shadow&&(i.shadow={color:this.originalOpts.shadow.color??"#000000",alpha:this.originalOpts.shadow.alpha??.5,blur:this.originalOpts.shadow.blur??4,offsetX:this.originalOpts.shadow.offsetX??0,offsetY:this.originalOpts.shadow.offsetY??0}),{...e,type:"Text",text:this.text,style:i,id:this.id,effects:this.effects}}static async fromObject(t){if(t.type!=="Text")throw new Error(`Expected Text, got ${t.type}`);const e=t.text||"",i=t.style||{},s={};i.fontSize!==void 0&&(s.fontSize=i.fontSize),i.fontFamily!==void 0&&(s.fontFamily=i.fontFamily),i.fontUrl!==void 0&&(s.fontUrl=i.fontUrl),i.fontWeight!==void 0&&(s.fontWeight=i.fontWeight),i.fontStyle!==void 0&&(s.fontStyle=i.fontStyle),i.color!==void 0&&(s.color=i.color),i.align!==void 0&&(s.align=i.align),i.wordWrap!==void 0&&(s.wordWrap=i.wordWrap),i.wordWrapWidth!==void 0&&(s.wordWrapWidth=i.wordWrapWidth),i.lineHeight!==void 0&&(s.lineHeight=i.lineHeight),i.letterSpacing!==void 0&&(s.letterSpacing=i.letterSpacing),i.background!==void 0&&(s.background=i.background),i.stroke&&(i.stroke.join||i.stroke.cap||i.stroke.miterLimit!==void 0?s.stroke={color:i.stroke.color,width:i.stroke.width,join:i.stroke.join,cap:i.stroke.cap,miterLimit:i.stroke.miterLimit}:(s.stroke=i.stroke.color,s.strokeWidth=i.stroke.width)),i.shadow&&(s.shadow={color:i.shadow.color,alpha:i.shadow.alpha,blur:i.shadow.blur,offsetX:i.shadow.offsetX??0,offsetY:i.shadow.offsetY??0});const r=new at(e,s);return X.deserializeBaseProperties(r,t),t.effects&&(r.effects=t.effects),await r.ready,r}getVisibleHandles(){return["mr","mb","br","rot"]}}function Es(l){return l.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^./,t=>t.toUpperCase())}class lt extends X{type="Effect";ready;_meta={duration:5e6,width:0,height:0};get meta(){return{...this._meta}}id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effectKey;values={};constructor(t){super(),this.effectKey=t,this.name=Es(t),this.ready=Promise.resolve(this._meta),this.duration=this._meta.duration}async clone(){const t=new lt(this.effectKey);return this.copyStateTo(t),t.values={...this.values},t}async tick(t){return{video:void 0,state:"success"}}async split(t){const e=await this.clone(),i=await this.clone();return[e,i]}toJSON(t=!1){return{id:this.id,type:"Effect",name:this.name,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate},effectKey:this.effectKey,values:this.values}}static async fromObject(t){if(t.type!=="Effect")throw new Error(`Expected Effect, got ${t.type}`);const e=t.effectKey;if(!e)throw new Error("Missing effectKey in Effect JSON");const i=new lt(e);return i.values=t.values||{},X.deserializeBaseProperties(i,t),await i.ready,i}}class Bt extends X{type="Placeholder";meta={width:0,height:0,duration:0};constructor(t,e={},i="Placeholder"){super(),this.type=i,this.src=t,this.meta={width:e.width||1280,height:e.height||720,duration:e.duration||5e6},this.width=this.meta.width,this.height=this.meta.height,this.duration=this.meta.duration,this.trim.to=this.duration,this.display.to=this.display.from+this.duration,this.ready=Promise.resolve(this.meta)}canvas=null;ctx=null;animationRafId=null;renderPending=!1;async tick(t){this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.width=this.meta.width,this.canvas.height=this.meta.height,this.ctx=this.canvas.getContext("2d"));const{canvas:e,ctx:i}=this;if(i){const{width:r,height:o}=e;if(r>0&&o>0){i.fillStyle="#1e1e1e",i.fillRect(0,0,r,o);const a=r/2,n=o/2,c=100,h=c/4,d=performance.now()/2e3*Math.PI*2;i.save();const f=i.createConicGradient(d,a,n);f.addColorStop(0,"#ffffff"),f.addColorStop(.2,"#ffffff"),f.addColorStop(.5,"rgba(255, 255, 255, 0.4)"),f.addColorStop(.8,"rgba(255, 255, 255, 0.1)"),f.addColorStop(1,"rgba(255, 255, 255, 0)"),i.strokeStyle=f,i.lineWidth=h,i.lineCap="round",i.beginPath(),i.arc(a,n,c,d,d+Math.PI*1.5),i.stroke(),i.restore(),i.strokeStyle="#333333",i.lineWidth=10,i.strokeRect(0,0,r,o)}}if(this.renderPending=!1,this.animationRafId===null){const r=()=>{if(this.destroyed){this.animationRafId=null;return}this.renderPending||(this.renderPending=!0,this.emit("request-render")),this.animationRafId=requestAnimationFrame(r)};this.animationRafId=requestAnimationFrame(r)}return{video:e.width>0&&e.height>0?await createImageBitmap(e):null,state:"success",audio:[]}}async clone(){const t=new Bt(this.src,this.meta);return this.copyStateTo(t),t.id=this.id,t}async split(t){const e=await this.clone(),i=await this.clone();return e.trim.to=t+this.trim.from,i.trim.from=t+this.trim.from,e.duration=e.trim.to-e.trim.from,i.duration=i.trim.to-i.trim.from,e.display.to=e.display.from+e.duration,i.display.from=e.display.to,i.display.to=i.display.from+i.duration,[e,i]}static async fromObject(t){if(t.type!=="Placeholder")throw new Error(`Expected Placeholder, got ${t.type}`);const e=t.timing||{display:t.display||{},trim:t.trim||{},duration:t.duration??0,playbackRate:t.playbackRate??1},i=t.transform?.width??t.width??0,s=t.transform?.height??t.height??0,r=new Bt(t.src,{width:i,height:s,duration:e.duration});return X.deserializeBaseProperties(r,t),await r.ready,r}}class tt extends X{type="Transition";ready;_meta={duration:2e6,width:0,height:0};get meta(){return{...this._meta}}id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;transitionKey;fromClipId=null;toClipId=null;values={};constructor(t){super(),this.transitionKey=t,this.ready=Promise.resolve(this._meta),this.duration=this._meta.duration}async clone(){const t=new tt(this.transitionKey);return this.copyStateTo(t),t.fromClipId=this.fromClipId,t.toClipId=this.toClipId,t.values=JSON.parse(JSON.stringify(this.values)),t}async tick(t){return{video:void 0,state:"success"}}async split(t){const e=await this.clone(),i=await this.clone();return[e,i]}toJSON(t=!1){return{id:this.id,type:"Transition",name:this.name,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate},transitionKey:this.transitionKey,fromClipId:this.fromClipId,toClipId:this.toClipId,...Object.keys(this.values).length>0&&{values:this.values}}}static async fromObject(t){if(t.type!=="Transition")throw new Error(`Expected Transition, got ${t.type}`);const e=t.transitionKey;if(!e)throw new Error("Missing transitionKey in Transition JSON");const i=new tt(e);return i.fromClipId=t.fromClipId||null,i.toClipId=t.toClipId||null,i.values=t.values||{},X.deserializeBaseProperties(i,t),await i.ready,i}}class Nt extends X{type="Shape";shapeType;graphics;_meta;renderTexture=null;externalRenderer=null;constructor(t){super(),this.shapeType=t.shapeType,this.id=qt.nanoid(),this.name=`${t.shapeType} Shape`,this.src=`shape://${t.shapeType}`,this.externalRenderer=t.renderer??null,this.width=t.width??200,this.height=t.height??200,this.graphics=new m.Graphics,this._meta={width:this.width,height:this.height,duration:0},this.style={fill:t.fill??"#3b82f6",fillOpacity:t.fillOpacity??1,stroke:t.stroke??{color:"#1e40af",width:2},borderRadius:t.borderRadius??0},this.ready=Promise.resolve(this._meta)}async getRenderer(){if(this.externalRenderer!=null)return this.externalRenderer;throw new Error("ShapeClip: No renderer available. Provide a renderer via options.renderer or setRenderer().")}setRenderer(t){this.externalRenderer=t}async getRenderTexture(){return this.renderTexture==null&&(this.renderTexture=m.RenderTexture.create({width:Math.ceil(this.width),height:Math.ceil(this.height)})),(this.renderTexture.width!==Math.ceil(this.width)||this.renderTexture.height!==Math.ceil(this.height))&&this.renderTexture.resize(Math.ceil(this.width),Math.ceil(this.height)),this.renderTexture}get meta(){return this._meta}drawShape(){const t=this.style;if(this.graphics.clear(),this.drawRectangle(t),t.fill){const e=this.hexToNumber(t.fill);this.graphics.fill({color:e,alpha:t.fillOpacity??1})}if(t.stroke){const e=this.hexToNumber(t.stroke.color);this.graphics.stroke({color:e,width:t.stroke.width,alpha:1})}}drawRectangle(t){const e=t.borderRadius??0;e>0?this.graphics.roundRect(-this.width/2,-this.height/2,this.width,this.height,e):this.graphics.rect(-this.width/2,-this.height/2,this.width,this.height)}hexToNumber(t){const e=t.startsWith("#")?t.slice(1):t;return parseInt(e,16)}async tick(t){await this.ready;const e=await this.getRenderTexture();this.drawShape();const i=await this.getRenderer();this.graphics.x=this.width/2,this.graphics.y=this.height/2,i.render({container:this.graphics,target:e});const s=e.source?.resource?.source;let r;if(s instanceof HTMLCanvasElement||s instanceof OffscreenCanvas)r=await createImageBitmap(s);else{const a=i.extract.canvas(e);if(a instanceof HTMLCanvasElement||a instanceof OffscreenCanvas)r=await createImageBitmap(a);else throw new Error("Unable to extract canvas from render texture")}return{video:r,state:"success"}}async clone(){const t=new Nt({shapeType:this.shapeType,width:this.width,height:this.height,fill:this.style.fill,fillOpacity:this.style.fillOpacity,stroke:this.style.stroke,borderRadius:this.style.borderRadius});return t.left=this.left,t.top=this.top,t.angle=this.angle,t.opacity=this.opacity,t.zIndex=this.zIndex,t.display={...this.display},t.duration=this.duration,t.timing={...this.timing},t}async split(t){const e=await this.clone(),i=await this.clone();return[e,i]}toJSON(t=!1){return{...super.toJSON(t),shapeType:this.shapeType}}set style(t){super.style=t,this.graphics&&this.drawShape()}get style(){return super.style}set width(t){super.width=t,this.graphics&&this.drawShape(),this.renderTexture&&this.renderTexture.resize(Math.ceil(this.width),Math.ceil(this.height))}get width(){return super.width}set height(t){super.height=t,this.graphics&&this.drawShape(),this.renderTexture&&this.renderTexture.resize(Math.ceil(this.width),Math.ceil(this.height))}get height(){return super.height}static async fromObject(t){const e=new Nt({shapeType:t.shapeType,width:t.transform?.width,height:t.transform?.height,fill:t.style?.fill,fillOpacity:t.style?.fillOpacity,stroke:t.style?.stroke,borderRadius:t.style?.borderRadius});return X.deserializeBaseProperties(e,t),e}}const Ds=["#6A5AF9","#B14EFF","#FF7A7A"];class zt extends X{type="Backdrop";backdropType;container;_meta;renderTexture=null;externalRenderer=null;bgGraphics=null;meshContainer=null;meshCircles=[];blobsContainer=null;blobCircles=[];noiseSprite=null;noiseTexture=null;constructor(t){super(),this.backdropType=t.backdropType,this.id=qt.nanoid(),this.name=`${t.backdropType} Backdrop`,this.src=`backdrop://${t.backdropType}`,this.externalRenderer=t.renderer??null,this.width=t.width??1280,this.height=t.height??720,this.container=new m.Container,this.container.label="BackdropContainer",this._meta={width:this.width,height:this.height,duration:1/0},this.style={backdropType:t.backdropType,colors:t.colors??Ds,gradientType:t.gradientType??"linear",speed:t.speed??1,scale:t.scale??1,density:t.density??8},this.ready=Promise.resolve(this._meta),this.rebuildBackdrop()}setRenderer(t){this.externalRenderer=t}async getRenderer(){if(this.externalRenderer!=null)return this.externalRenderer;throw new Error("BackdropClip: No renderer available. Provide a renderer via options.renderer or setRenderer().")}async getRenderTexture(){const t=Math.max(1,Math.ceil(this.width)),e=Math.max(1,Math.ceil(this.height));return this.renderTexture==null&&(this.renderTexture=m.RenderTexture.create({width:t,height:e})),(this.renderTexture.width!==t||this.renderTexture.height!==e)&&this.renderTexture.resize(t,e),this.renderTexture}get meta(){return this._meta}rebuildBackdrop(){this.container.removeChildren(),this.bgGraphics=null,this.meshContainer=null,this.meshCircles=[],this.blobsContainer=null,this.blobCircles=[],this.noiseSprite=null;const t=this.style,e=t.backdropType||this.backdropType;this.backdropType=e;const i=t.colors||["#6A5AF9"],s=i.map(o=>$(o)??16777215),r=()=>{this.bgGraphics=new m.Graphics,this.bgGraphics.rect(0,0,this.width,this.height).fill({color:s[0]}),this.container.addChild(this.bgGraphics)};if(e==="solid")r();else if(e==="gradient")if((t.gradientType??"linear")==="radial"){const o=document.createElement("canvas");o.width=Math.max(1,Math.ceil(this.width)),o.height=Math.max(1,Math.ceil(this.height));const a=o.getContext("2d"),n=this.width/2,c=this.height/2,h=Math.min(this.width,this.height)/2,d=a.createRadialGradient(n,c,0,n,c,h);i.forEach((f,u)=>d.addColorStop(u/Math.max(1,i.length-1),f)),a.fillStyle=d,a.fillRect(0,0,this.width,this.height),this.container.addChild(new m.Sprite(m.Texture.from(o)))}else{this.bgGraphics=new m.Graphics;const o=new m.FillGradient(0,0,this.width,this.height);s.forEach((a,n)=>o.addColorStop(n/Math.max(1,s.length-1),a)),this.bgGraphics.rect(0,0,this.width,this.height).fill(o),this.container.addChild(this.bgGraphics)}else if(e==="meshGradient"){r(),this.meshContainer=new m.Container,this.meshContainer.label="MeshContainer";const o=Math.max(3,s.length),a=Math.max(this.width,this.height)*.35;this.meshContainer.filters=[new m.BlurFilter({strength:a})];for(let n=0;n<o;n++){const c=new m.Graphics,h=Math.max(this.width,this.height)*(.35+Math.random()*.15);c.circle(0,0,h).fill({color:s[n%s.length],alpha:.8});const d={graphics:c,baseX:this.width*(.2+Math.random()*.6),baseY:this.height*(.2+Math.random()*.6),phase:Math.random()*Math.PI*2,speedX:.3+Math.random()*.4,speedY:.3+Math.random()*.4,radius:h};c.x=d.baseX,c.y=d.baseY,this.meshContainer.addChild(c),this.meshCircles.push(d)}this.container.addChild(this.meshContainer)}else if(e==="floatingBlobs"){r(),this.blobsContainer=new m.Container,this.blobsContainer.label="BlobsContainer";const o=Math.max(4,t.density??8),a=s.slice(1).length>0?s.slice(1):s,n=Math.max(this.width,this.height)*.08;this.blobsContainer.filters=[new m.BlurFilter({strength:n})];for(let c=0;c<o;c++){const h=new m.Graphics,d=Math.max(this.width,this.height)*(.1+Math.random()*.12);h.circle(0,0,d).fill({color:a[c%a.length],alpha:.6});const f={graphics:h,baseX:this.width*Math.random(),baseY:this.height*Math.random(),phase:Math.random()*Math.PI*2,speedX:.2+Math.random()*.3,speedY:.2+Math.random()*.3,radius:d};h.x=f.baseX,h.y=f.baseY,this.blobsContainer.addChild(h),this.blobCircles.push(f)}this.container.addChild(this.blobsContainer)}else if(e==="noise"){if(r(),!this.noiseTexture){const o=document.createElement("canvas");o.width=256,o.height=256;const a=o.getContext("2d"),n=a.createImageData(256,256),c=n.data;for(let h=0;h<c.length;h+=4){const d=Math.floor(Math.random()*255);c[h]=d,c[h+1]=d,c[h+2]=d,c[h+3]=18}a.putImageData(n,0,0),this.noiseTexture=m.Texture.from(o)}this.noiseSprite=new m.TilingSprite({texture:this.noiseTexture,width:this.width,height:this.height}),this.noiseSprite.tileScale.set(t.scale??1),this.container.addChild(this.noiseSprite)}}async tick(t){await this.ready;const e=await this.getRenderTexture(),i=await this.getRenderer(),s=t/1e6*(this.style.speed??1);if(this.backdropType==="meshGradient"&&this.meshCircles.length>0){const a=this.style.scale??1;for(const n of this.meshCircles){const c=s*n.speedX+n.phase,h=s*n.speedY+n.phase*1.5;n.graphics.x=n.baseX+Math.cos(c)*(this.width*.25*a),n.graphics.y=n.baseY+Math.sin(h)*(this.height*.25*a)}}if(this.backdropType==="floatingBlobs"&&this.blobCircles.length>0){const a=this.style.scale??1;for(const n of this.blobCircles){const c=s*n.speedX+n.phase,h=s*n.speedY+n.phase*1.3;n.graphics.x=(n.baseX+Math.sin(c)*(this.width*.35*a)+this.width)%this.width,n.graphics.y=(n.baseY+Math.cos(h)*(this.height*.35*a)+this.height)%this.height}}this.backdropType==="noise"&&this.noiseSprite&&(this.noiseSprite.tilePosition.x=Math.random()*256,this.noiseSprite.tilePosition.y=Math.random()*256),i.render({container:this.container,target:e});const r=e.source?.resource?.source;let o;if(r instanceof HTMLCanvasElement||r instanceof OffscreenCanvas)o=await createImageBitmap(r);else{const a=i.extract.canvas(e);if(a instanceof HTMLCanvasElement||a instanceof OffscreenCanvas)o=await createImageBitmap(a);else throw new Error("Unable to extract canvas from render texture")}return{video:o,state:"success"}}async clone(){const t=new zt({backdropType:this.backdropType,width:this.width,height:this.height,colors:this.style.colors,gradientType:this.style.gradientType,speed:this.style.speed,scale:this.style.scale,density:this.style.density});return t.left=this.left,t.top=this.top,t.angle=this.angle,t.opacity=this.opacity,t.zIndex=this.zIndex,t.display={...this.display},t.duration=this.duration,t.timing={...this.timing},t}async split(t){return[await this.clone(),await this.clone()]}toJSON(t=!1){return{...super.toJSON(t),backdropType:this.backdropType}}set style(t){super.style=t,this.container&&this.rebuildBackdrop()}get style(){return super.style}set width(t){super.width=t,this.container&&this.rebuildBackdrop(),this.renderTexture?.resize(Math.max(1,Math.ceil(this.width)),Math.max(1,Math.ceil(this.height)))}get width(){return super.width}set height(t){super.height=t,this.container&&this.rebuildBackdrop(),this.renderTexture?.resize(Math.max(1,Math.ceil(this.width)),Math.max(1,Math.ceil(this.height)))}get height(){return super.height}static async fromObject(t){const e=new zt({backdropType:t.backdropType,width:t.transform?.width,height:t.transform?.height,colors:t.style?.colors,gradientType:t.style?.gradientType,speed:t.style?.speed,scale:t.style?.scale,density:t.style?.density});return X.deserializeBaseProperties(e,t),e}}class st{static registry=new Map;static register(t,e){this.registry.set(t,e)}static get(t){return this.registry.get(t)}static getRegisteredTypes(){return Array.from(this.registry.keys())}}st.register("Video",nt),st.register("Audio",ut),st.register("Image",It),st.register("Text",at),st.register("Caption",mt),st.register("Effect",lt),st.register("Transition",tt),st.register("Placeholder",Bt),st.register("Shape",Nt),st.register("Backdrop",zt);function $e(l,t){let e=!1;async function i(){const s=l.getReader();for(;!e;){const{value:r,done:o}=await s.read();if(o){t.onDone();return}await t.onChunk(r)}s.releaseLock(),await l.cancel()}return i().catch(console.error),()=>{e=!0}}class ti{readable;writable;inputBufOffset=0;isStreamCancelled=!1;constructor(){const t=et.mp4box.createFile();this.readable=new ReadableStream({start:e=>this.initMP4Box(t,e),cancel:()=>{this.isStreamCancelled=!0,t.stop()}},{highWaterMark:50}),this.writable=new WritableStream({write:async e=>{if(this.isStreamCancelled)throw new Error("Stream cancelled");const i=e.buffer;i.fileStart=this.inputBufOffset,this.inputBufOffset+=i.byteLength,t.appendBuffer(i)},close:()=>{t.flush(),t.stop(),t.onFlush?.()},abort:e=>{Ps.error("SampleTransform writable aborted:",e),t.stop()}})}initMP4Box(t,e){t.onReady=s=>{[s.videoTracks[0],s.audioTracks[0]].forEach(r=>{r&&t.setExtractionOptions(r.id,r.video?"video":"audio",{nbSamples:100})}),e.enqueue({chunkType:"ready",data:{info:s,file:t}}),t.start()};const i={};t.onSamples=(s,r,o)=>{const a=o.map(n=>({...n}));e.enqueue({chunkType:"samples",data:{id:s,type:r,samples:a}}),i[s]=(i[s]??0)+o.length,t.releaseUsedSamples(s,i[s])},t.onFlush=()=>{e.close()},t.onError=s=>{e.error(new Error(`mp4box error: ${s}`))}}}const Ps={error:(...l)=>console.error("[SampleTransform]",...l)};function Is(l){let t=0;const e=l.boxes,i=[];let s=0;async function r(){const p=u(e,t);t=e.length,i.forEach(({track:g,id:v})=>{const x=g.samples.at(-1);x!=null&&(s=Math.max(s,x.cts+x.duration)),l.releaseUsedSamples(v,g.samples.length),g.samples=[]}),l.mdats=[],l.moofs=[],p!=null&&await h?.write(p)}let o=[];function a(){if(o.length>0)return!0;const p=e.findIndex(g=>g.type==="moov");if(p===-1)return!1;if(o=e.slice(0,p+1),t=p+1,i.length===0)for(let g=1;;g+=1){const v=l.getTrackById(g);if(v==null)break;i.push({track:v,id:g})}return!0}let n=0;const c=it.tmpfile();let h=null;const d=(async()=>{h=await c.createWriter(),n=self.setInterval(()=>{a()&&r()},100)})();let f=!1;return async()=>{if(f)throw Error("File exported");if(f=!0,await d,clearInterval(n),!a()||h==null)return null;l.flush(),await r(),await h?.close();const p=o.find(x=>x.type==="moov");if(p==null)return null;p.mvhd.duration=s;const g=it.tmpfile(),v=u(o,0);return await it.write(g,v.slice()),await it.write(g,c,{overwrite:!1}),await g.stream()};function u(p,g){if(g>=p.length)return null;const v=new et.mp4box.DataStream;for(let x=g;x<p.length;x++)p[x]!==null&&(p[x].write(v),delete p[x]);return new Uint8Array(v.buffer).slice()}}function Bs(l){const t=new ArrayBuffer(l.byteLength);l.copyTo(t);const e=l.timestamp;return{duration:l.duration??0,dts:e,cts:e,is_sync:l.type==="key",data:t}}async function ei(l){const t=et.mp4box.createFile(),e=Is(t);await Ns(l,t);const i=await e();if(i==null)throw Error("Can not generate file from streams");return i}async function Ns(l,t){let e=0,i=0,s=0,r=0,o=0,a=0,n=null,c=null;for(const h of l){let d=null,f=null,u=null,p=null;if(await new Promise(async g=>{$e(h.pipeThrough(new ti),{onDone:g,onChunk:async({chunkType:v,data:x})=>{if(v==="ready"){const{videoTrackConf:w,audioTrackConf:T}=oe(x.file,x.info);e===0&&w!=null&&(e=t.addTrack(w)),r===0&&T!=null&&(r=t.addTrack(T))}else if(v==="samples"){const{type:w,samples:T}=x,y=w==="video"?e:r,C=w==="video"?i:o,k=w==="video"?s:a;T.forEach(F=>{let b,S;w==="video"?(d===null&&(d=F.dts,f=F.cts),b=F.dts-d,S=F.cts-(f??0)):(u===null&&(u=F.dts,p=F.cts),b=F.dts-u,S=F.cts-(p??0)),t.addSample(y,new Uint8Array(F.data),{duration:F.duration,dts:b+C,cts:S+k,is_sync:F.is_sync})});const O=T.at(-1);if(O==null)return;w==="video"?n=O:w==="audio"&&(c=O)}}})}),n!=null&&d!==null&&f!==null){const g=n.dts-d+n.duration,v=n.cts-f+n.duration;i+=g,s+=v}if(c!=null&&n!=null){const g=c.timescale/n.timescale;o=Math.round(i*g),a=Math.round(s*g)}}}async function zs(l){return await ei([l])}function Ls(l){let t=[];const e=new AudioDecoder({output:i=>{t.push(i)},error:Q.error});return e.configure(l),{decode:async i=>{i.forEach(r=>{e.decode(new EncodedAudioChunk({type:r.is_sync?"key":"delta",timestamp:1e6*r.cts/r.timescale,duration:1e6*r.duration/r.timescale,data:r.data}))}),await e.flush();const s=t;return t=[],s},close:()=>{e.close()}}}function Hs(l,t){const e={codec:l.codec,sampleRate:l.sampleRate,numberOfChannels:l.numberOfChannels},i=new AudioEncoder({output:o=>{t(Bs(o))},error:o=>{Q.error("AudioEncoder error:",o,", config:",e)}});i.configure(e);let s=null;function r(o,a){return new AudioData({timestamp:a,numberOfChannels:l.numberOfChannels,numberOfFrames:o.length/l.numberOfChannels,sampleRate:l.sampleRate,format:"f32-planar",data:new Float32Array(o)})}return{encode:async(o,a)=>{s!=null&&i.encode(r(s.data,s.ts)),s={data:o,ts:a}},stop:async()=>{s!=null&&(Gs(s.data,l.numberOfChannels,l.sampleRate),i.encode(r(s.data,s.ts)),s=null),await i.flush(),i.close()}}}function Gs(l,t,e){const i=l.length-1,s=Math.min(e/2,i);for(let r=0;r<s;r++)for(let o=1;o<=t;o++)l[Math.floor(i/o)-r]*=r/s}function Us(l,t){Q.info("mixinMP4AndAudio, opts:",{volume:t.volume,loop:t.loop});const e=et.mp4box.createFile();let i,s=0,r=0;const o=e.boxes;let a=!1;const n=()=>{if(!a)if(o.find(A=>A.type==="moof")!=null)a=!0;else return null;if(r>=o.length)return null;const F=new et.mp4box.DataStream;let b=r;try{for(;b<o.length;)o[b].write(F),delete o[b],b+=1}catch(A){throw A}if(e.moov!=null){for(var S=0;S<e.moov.traks.length;S++)e.moov.traks[S].samples=[];e.mdats=[],e.moofs=[]}return r=o.length,new Uint8Array(F.buffer)};let c=!1,h=!1,d=null;i=new ReadableStream({start(F){s=self.setInterval(()=>{const b=n();b!=null&&!h&&F.enqueue(b)},500),d=b=>{if(clearInterval(s),e.flush(),b!=null){F.error(b);return}const S=n();S!=null&&!h&&F.enqueue(S),h||F.close()}},cancel(){h=!0,clearInterval(s)}});const f=F=>{c||(c=!0,d?.(F))};let u=null,p=null,g=[],v=0,x=0,w=0,T=!0,y=L.sampleRate;$e(l.pipeThrough(new ti),{onDone:async()=>{await p?.stop(),u?.close(),f()},onChunk:async({chunkType:F,data:b})=>{if(F==="ready"){const{videoTrackConf:S,audioTrackConf:A,audioDecoderConf:E}=oe(b.file,b.info);v===0&&S!=null&&(v=e.addTrack(S));const P=A??{timescale:1e6,samplerate:y,channel_count:L.channelCount,hdlr:"soun",name:"SoundHandler",type:"mp4a"};x===0&&(x=e.addTrack(P),y=A?.samplerate??y,T=A!=null);const R=new AudioContext({sampleRate:y});g=_t(await R.decodeAudioData(await new Response(t.stream).arrayBuffer())),E!=null&&(u=Ls(E)),p=Hs(E??{codec:P.type==="mp4a"?L.codec:P.type,numberOfChannels:P.channel_count,sampleRate:P.samplerate},B=>e.addSample(x,new Uint8Array(B.data),B))}else if(F==="samples"){const{id:S,type:A,samples:E}=b;if(A==="video"){E.forEach(P=>e.addSample(S,new Uint8Array(P.data),P)),T||await k(E);return}A==="audio"&&await O(E)}}});function C(F){const b=g.map(S=>t.loop?$t(S,w,w+F):S.slice(w,w+F));if(w+=F,t.volume!==1)for(const S of b)for(let A=0;A<S.length;A++)S[A]*=t.volume;return b}async function k(F){const b=F[0],S=F[F.length-1],A=Math.floor((S.cts+S.duration-b.cts)/b.timescale*y),E=Ce([C(A)]);E.length!==0&&p?.encode(E,b.cts/b.timescale*1e6)}async function O(F){if(u==null)return;const b=(await u.decode(F)).map(be),S=Si(b),A=C(S[0].length),E=F[0];p?.encode(Ce([S,A]),E.cts/E.timescale*1e6)}return i}function Ws(l){const t={...l};if(t.timing?t.timing={display:t.timing.display||{from:0,to:0},trim:t.timing.trim||{from:0,to:0},duration:t.timing.duration??0,playbackRate:t.timing.playbackRate??1,fadeIn:t.timing.fadeIn??l.fadeIn,fadeOut:t.timing.fadeOut??l.fadeOut}:t.timing={display:l.display||{from:0,to:0},trim:l.trim||{from:0,to:0},duration:l.duration??0,playbackRate:l.playbackRate??1,fadeIn:l.fadeIn,fadeOut:l.fadeOut},delete t.fadeIn,delete t.fadeOut,t.transform)t.transform={x:t.transform.x??0,y:t.transform.y??0,width:t.transform.width??0,height:t.transform.height??0,angle:t.transform.angle??0,opacity:t.transform.opacity??1,zIndex:t.transform.zIndex??0,flip:t.transform.flip||null};else{const e=l;t.transform={x:e.left??0,y:e.top??0,width:e.width??0,height:e.height??0,angle:e.angle??0,opacity:e.opacity??1,zIndex:e.zIndex??0,flip:e.flip||null}}return t.style&&(t.style=Vs(t.style,l.type)),t}function Vs(l,t){if(!l)return l;const e={...l};if(e.dropShadow&&(e.shadow=e.dropShadow,delete e.dropShadow),e.shadow){const i={...e.shadow},s=i.offsetX!==void 0||i.offsetY!==void 0;if((i.distance!==void 0||i.angle!==void 0)&&!s){const o=i.distance??0,a=i.angle??0;i.offsetX=Math.cos(a)*o,i.offsetY=Math.sin(a)*o}delete i.distance,delete i.angle,e.shadow=i}return(t==="Text"||t==="Caption")&&e.fill!==void 0&&(e.color=e.fill,delete e.fill),e}function Lt(l,t=!1){return l.toJSON(t)}async function xt(l,t){const e=Ws(l);let i;const s=st.get(e.type);if(s&&typeof s.fromObject=="function")i=await s.fromObject(e,t);else throw new Error(`Unsupported clip type or missing fromObject: ${e.type}`);if(e.animations&&Array.isArray(e.animations)){i.clearAnimations();for(const r of e.animations)i.addAnimation(r.type,r.options,r.params)}return e.id&&(i.id=e.id),e.name&&(i.name=e.name),e.metadata&&(i.metadata=e.metadata),i}const ii=new MessageChannel;function si(){return new Promise(l=>{ii.port1.onmessage=()=>l(),ii.port2.postMessage(null)})}const Ys=20;async function Qs(l){for(;l()>Ys;)await si()}const js=`
184
+ `,us={thickness:1,borderColor:0};class ps extends m.Filter{constructor(t){const{thickness:e,borderColor:i}={...us,...t},s=m.GpuProgram.from({vertex:{source:Xe,entryPoint:"mainVertex"},fragment:{source:Xe,entryPoint:"mainFragment"}}),r=m.GlProgram.from({vertex:fs,fragment:ds,name:"outline-filter"});super({gpuProgram:s,glProgram:r,padding:e*4,resources:{outlineUniforms:new m.UniformGroup({uThickness:{value:e,type:"f32"},uBorderColor:{value:new m.Color(i),type:"vec3<f32>"}})}})}get thickness(){return this.resources.outlineUniforms.uniforms.uThickness}set thickness(t){const e=this.resources.outlineUniforms.uniforms;e.uThickness=t}}const qe=Symbol.for("agrhub.engine.fontManager");class vt{static instance;fonts=new Map;loading=new Map;warnedConflicts=new Set;constructor(){}static getInstance(){const t=globalThis;return vt.instance||(vt.instance=t[qe]??new vt),t[qe]=vt.instance,vt.instance}async addFont(t){const e=this.fonts.get(t.name);if(e){this.warnOnConflict(t,e.url);return}const i=this.loading.get(t.name);if(i)return i;const s=(async()=>{try{const o=await new FontFace(t.name,`url(${t.url})`).load();document.fonts.add(o),this.fonts.set(t.name,{face:o,url:t.url}),m.CanvasTextMetrics.clearMetrics()}catch(r){console.error(`Failed to load font ${t.name}:`,r)}finally{this.loading.delete(t.name)}})();return this.loading.set(t.name,s),s}warnOnConflict(t,e){!t.url||t.url===e||this.warnedConflicts.has(t.name)||(this.warnedConflicts.add(t.name),console.warn(`[FontManager] Font "${t.name}" is already loaded from ${e}; ignoring different URL ${t.url}`))}async loadFonts(t){await Promise.all(t.map(e=>this.addFont(e)))}removeFont(t){const e=this.fonts.get(t);e&&(document.fonts.delete(e.face),this.fonts.delete(t))}clear(){this.fonts.forEach(({face:t})=>{document.fonts.delete(t)}),this.fonts.clear()}getLoadedFonts(){return Array.from(this.fonts.keys())}}const Zt=vt.getInstance();function ms(l){if(typeof document>"u"||!document.fonts?.check)return!0;const t=String(l.fontFamily||"Roboto").split(",")[0].trim().replace(/^["']|["']$/g,""),e=Number(l.fontSize)||30,i=`${l.fontStyle||"normal"} ${l.fontWeight||"normal"} ${e}px "${t}"`;try{return document.fonts.check(i)}catch{return!0}}function _e(l){const t=[];t.push(l.fontFamily||"Roboto"),t.push(String(l.fontSize||30)),t.push(String(l.fontWeight||"normal")),t.push(String(l.fontStyle||"normal")),l.fill!==void 0&&(typeof l.fill=="number"?t.push(`f_${l.fill}`):t.push("f_obj")),l.stroke&&(typeof l.stroke=="object"?t.push(`s_${l.stroke.color}_${l.stroke.width}_${l.stroke.join||""}`):t.push(`s_${l.stroke}`)),l.dropShadow&&t.push(`ds_${l.dropShadow.color}_${l.dropShadow.alpha}_${l.dropShadow.blur}_${l.dropShadow.angle}_${l.dropShadow.distance}`),ms(l)||t.push("pending");const e="installed_font_"+t.join("_").replace(/[^a-zA-Z0-9_]/g,"_");return!m.Cache.has(e)&&!m.Cache.has(e+"-bitmap")&&m.BitmapFont.install({name:e,style:l}),e}class $e extends K{_meta={duration:1/0,width:0,height:0};get meta(){return{...this._meta}}pixiTextContainer=null;wordTexts=[];textStyle;textStyleBase;renderTexture=null;outlineFilter=null;dropShadowFilter=null;_refreshing=!1;_needsRefresh=!1;_refreshPromise=null;_spaceWidth=0;_text="";externalRenderer=null;pixiApp=null;originalOpts;id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effects=[];setRenderer(t){this.externalRenderer=t}async getRenderer(){if(this.externalRenderer!=null)return this.externalRenderer;if(this.pixiApp?.renderer==null)throw new Error("BaseTextClip: No renderer. Provide one via constructor or setRenderer().");return this.pixiApp.renderer}async getTexture(){return this._refreshPromise&&await this._refreshPromise.catch(()=>{}),this.pixiTextContainer==null||this.renderTexture==null?null:((await this.getRenderer()).render({container:this.pixiTextContainer,target:this.renderTexture}),this.renderTexture)}async tick(t){if(await this.ready,this._refreshPromise&&await this._refreshPromise.catch(()=>{}),this.pixiTextContainer==null||this.renderTexture==null)throw new Error("BaseTextClip not initialized");if(this.renderTexture.width<=0||this.renderTexture.height<=0)throw new Error(`Invalid RenderTexture dimensions: ${this.renderTexture.width}x${this.renderTexture.height}`);const e=await this.getRenderer();e.render({container:this.pixiTextContainer,target:this.renderTexture});const i=this.renderTexture.source?.resource?.source;let s;if(i instanceof HTMLCanvasElement||i instanceof OffscreenCanvas)s=await createImageBitmap(i);else{const o=e.extract.canvas(this.renderTexture);if(o instanceof HTMLCanvasElement||o instanceof OffscreenCanvas)s=await createImageBitmap(o);else throw new Error("Unable to extract canvas from render texture")}return{video:s,state:"success"}}async split(t){await this.ready;const e=await this.clone(),i=await this.clone();return[e,i]}_hasMaskAnim(t){return t.some(e=>e?.params?.mask===!0)}get animations(){return super.animations}set animations(t){const e=this._hasMaskAnim(this.animations);super.animations=t;const i=this._hasMaskAnim(this.animations);e!==i&&this.originalOpts&&this.textStyle&&this.refreshText()}animate(t){super.animate(t,this.pixiTextContainer)}addEffect(t){this.effects.push(t)}editEffect(t,e){const i=this.effects.find(s=>s.id===t);i&&Object.assign(i,e)}removeEffect(t){const e=this.effects.findIndex(i=>i.id===t);e!==-1&&this.effects.splice(e,1)}refreshText(){return this._refreshing&&this._refreshPromise?(this._needsRefresh=!0,this._refreshPromise):(this._refreshing=!0,this._refreshPromise=(async()=>{try{do this._needsRefresh=!1,await this._doRefreshText();while(this._needsRefresh)}finally{this._refreshing=!1,this._refreshPromise=null}})(),this._refreshPromise)}async _doRefreshText(){const t=this._targetWidth??0,e=this.originalOpts.wordWrap,i=this.originalOpts.wordWrapWidth,s=this.originalOpts.background;if(this.originalOpts.fontUrl&&this.originalOpts.fontFamily)try{await Zt.addFont({name:this.originalOpts.fontFamily,url:this.originalOpts.fontUrl})}catch(E){console.warn("[BaseTextClip] Failed to load font:",E)}typeof document<"u"&&await document.fonts.ready,this._buildTextStyles();const r=this.textStyle,o=this._applyTextCase(this.text);if(!this.pixiTextContainer)this.pixiTextContainer=new m.Container,this.pixiTextContainer.__clip=this;else{this.pixiTextContainer.__clip=this,this.animations.forEach(E=>{E&&typeof E.destroy=="function"&&E.destroy()});for(const E of this.pixiTextContainer.children)if(E&&!E.destroyed){const P=R=>{if(R&&(ut.killTweensOf(R),R.children))for(const B of R.children)P(B)};if(P(E),E.children)for(const R of E.children)R&&R.label==="LineContainer"&&(R.mask=null);E.destroy({children:!0})}this.pixiTextContainer.removeChildren()}const{textOnlyContainer:a,words:n}=this._buildWordObjects(o),c=this._applyStrokeFilter();this._applyShadowFilter(a),this.pixiTextContainer.addChild(a);const{spaceWidth:h,measuredTextHeight:d}=await this._measureSpaceAndHeight();this._spaceWidth=h;const u=this.originalOpts.lineHeight??1,f=r.fontSize??40,p=f*u;let g;if(e)if(t>0){const E=s?.paddingX??8;g=Math.max(1,t-E*2)}else g=i??100;else g=1e5;const v=this._breakIntoLines(g,p),x=this.originalOpts.background?.color,w=this.originalOpts.background?.opacity??1,T=this.originalOpts.background?.borderRadius??4,y=this.originalOpts.background?.paddingX??8,C=this.originalOpts.background?.paddingY??4,{containerWidth:k,containerHeight:O,contentHeight:F}=this._calculateDimensions(v,d,t,e,i,s,y,C),b=this._positionWords(v,k,O,F,d,y,a),S=this._drawDecoration(v,k,y);S&&this.pixiTextContainer.addChild(S);const A=this._buildBackground(b,x,w,T);A&&this.pixiTextContainer.addChildAt(A,0),this._lineRects=b,this._createRenderTexture(k,O,c),this._meta.width=k,this._meta.height=O,this._width=k,this._height=O,this.duration===0&&this._meta.duration!==1/0&&(this.duration=this._meta.duration,this.display.to=this.display.from+this.duration),this._onAfterRefresh(n,a,h,d,u,f)}_onAfterRefresh(t,e,i,s,r,o){}_applyTextCase(t){const e=this.originalOpts.textCase;return e==="uppercase"?t.toUpperCase():e==="lowercase"?t.toLowerCase():e==="title"?t.replace(/\w\S*/g,i=>i.charAt(0).toUpperCase()+i.substring(1).toLowerCase()):t}_buildTextStyles(){const t=this.createStyleFromOpts(this.originalOpts),{wordWrap:e,wordWrapWidth:i,lineHeight:s,letterSpacing:r,fill:o,...a}=t,n=_e(t);this.textStyle=new m.TextStyle({...t,fontFamily:n});const c=_e(a);return this.textStyleBase=new m.TextStyle({...a,fontFamily:c}),{fontName:n,baseFontName:c}}_buildWordObjects(t){const e=t.split(/\s+/).filter(s=>s.length>0),i=new m.Container;return i.label="TextOnlyContainer",this.wordTexts.forEach(s=>{s&&!s.destroyed&&s.destroy()}),this.wordTexts=e.map(s=>{const r=new m.SplitBitmapText({text:s,style:this.textStyle});return i.addChild(r),r}),{textOnlyContainer:i,words:e}}_applyStrokeFilter(){const t=this.originalOpts.stroke,e=(t!==null&&typeof t=="object"&&"width"in t?t.width:void 0)??this.originalOpts.strokeWidth??0,i=t!=null&&e>0;if(i){let s=0;if(typeof t=="object"&&"color"in t){const r=$(t.color);r!==void 0&&(s=r)}else if(typeof t=="string"||typeof t=="number"){const r=$(t);r!==void 0&&(s=r)}if(this.outlineFilter){this.outlineFilter.thickness=e,this.outlineFilter.padding=e*4;const r=this.outlineFilter.resources.outlineUniforms.uniforms;r.uBorderColor=new m.Color(s)}else this.outlineFilter=new ps({thickness:e,borderColor:s});this.wordTexts.forEach(r=>{r.filters=[this.outlineFilter]})}else this.outlineFilter&&(this.wordTexts.forEach(s=>{s.filters=[]}),this.outlineFilter=null);return i?e:0}_applyShadowFilter(t){const e=this.originalOpts.shadow;if(e){const i=e.offsetX??0,s=e.offsetY??0,r=$(e.color??"#000000"),o=e.alpha??1,a=e.blur??4,n=Math.ceil(a*2.5+Math.max(Math.abs(i),Math.abs(s)));r!==void 0&&(this.dropShadowFilter?(this.dropShadowFilter.color=r,this.dropShadowFilter.alpha=o,this.dropShadowFilter.blur=a,this.dropShadowFilter.offset={x:i,y:s},this.dropShadowFilter.padding=n):(this.dropShadowFilter=new Q.DropShadowFilter({color:r,alpha:o,blur:a,offset:{x:i,y:s}}),this.dropShadowFilter.padding=n),t.filters=[this.dropShadowFilter])}else this.dropShadowFilter&&(t.filters=[],this.dropShadowFilter=null)}async _measureSpaceAndHeight(){const t=this.originalOpts.fontSize||40,e=this.originalOpts.fontFamily||"Arial",i=String(this.originalOpts.fontWeight||"normal"),s=this.originalOpts.fontStyle||"normal",r=`${s} ${i} ${t}px "${e}"`;if(typeof document<"u")try{await document.fonts.load(r)}catch{}const o=new m.TextStyle({fontFamily:e,fontSize:t,fontWeight:i,fontStyle:s}),a=m.CanvasTextMetrics.measureText(" ",o),n=new m.TextStyle({fontFamily:e,fontSize:t,fontWeight:i,fontStyle:s}),h=m.CanvasTextMetrics.measureText("Hg",n).fontProperties,d=h&&h.ascent>0?Math.ceil(h.ascent+h.descent):t,u=new m.SplitBitmapText({text:" ",style:this.textStyleBase}),f=Math.ceil(u.getLocalBounds().width||u.width||a.width||t*.25);return u.destroy(),{spaceWidth:f,measuredTextHeight:d}}_breakIntoLines(t,e){const i=[];let s=[],r=0,o=0;return this.wordTexts.forEach(a=>{const n=a.getLocalBounds(),c=Math.ceil(n.width||a.width),h=Math.ceil(n.height||a.height),d=r+(r>0?this._spaceWidth:0)+c;d<=t||s.length===0?(s.push(a),r=d,o=Math.max(o,h)):(s.length>0&&i.push({words:s,width:r,height:Math.max(o,e)}),s=[a],r=c,o=h)}),s.length>0&&i.push({words:s,width:r,height:Math.max(o,e)}),i}_calculateDimensions(t,e,i,s,r,o,a,n){const c=e+n*2;t.forEach(T=>{T.height=Math.max(T.height,c)});let h=0,d=0;t.forEach(T=>{h=Math.max(h,T.width),d+=T.height});let u=h;if(s&&i>0){const T=o?.paddingX??8,y=i-T*2;u=Math.max(u,y)}else s&&r!=null&&r>0&&(u=Math.max(u,r));const f=d;u+=a*2;const p=i>0?i:this._width,g=p===0,v=!this._explicitHeight||this.height===0,x=g?u:Math.max(u,p),w=v?f:Math.max(f,this.height||0);return{containerWidth:x,containerHeight:w,contentWidth:u,contentHeight:f}}_positionWords(t,e,i,s,r,o,a){const n=this.originalOpts.verticalAlign||"top";let c=0;n==="center"?c=(i-s)/2:n==="bottom"&&(c=i-s);let h=c;const d=[];return t.forEach(u=>{let f=0;const p=this.textAlign;p==="center"?f=(e-u.width)/2:p==="right"?f=e-u.width-o*2:f=o;const g=f,v=new m.Container;if(v.label="LineContainer",v.x=0,v.y=0,this.animations.some(w=>w?.params?.mask===!0)){const w=new m.Graphics;w.label="LineMask",w.rect(0,h,e,u.height),w.fill(16777215),v.mask=w,a.addChild(w)}a.addChild(v),u.words.forEach((w,T)=>{w.x=Math.round(f),w.y=Math.round(h+(u.height-r)/2-9),f+=(w.getLocalBounds().width||w.width)+(T<u.words.length-1?this._spaceWidth:0),v.addChild(w)}),d.push({x:g-o,y:h,w:u.width+o*2,h:u.height}),h+=u.height}),d}_drawDecoration(t,e,i){const s=this.originalOpts.textDecoration||this.originalOpts.verticalAlign;if(!s||s==="none"||!["underline","overline","strikethrough","line-through"].includes(s))return null;const r=this.textStyle,o=r.fontSize??40,a=s==="strikethrough"?"line-through":s,n=Math.max(1,o/12);let c=16777215;typeof r.fill=="number"&&(c=r.fill);const h=new m.Graphics;let d=0;return t.forEach(u=>{let f=i;const p=this.textAlign;p==="center"?f=(e-u.width)/2:p==="right"&&(f=e-u.width-i*2);let g=0;a==="underline"?g=u.height:a==="line-through"&&(g=u.height/2),h.rect(f,d+g,u.width,n),h.fill(c),d+=u.height}),h}_buildBackground(t,e,i,s){if(!t.length||!e||e==="transparent"||e==="")return null;const r=$(e),o=new m.Graphics;return this.drawRoundedMultilinePath(o,t,s,r??0,i),o}_createRenderTexture(t,e,i){const r=i>0?i*2.1:0;let o=0;if(this.dropShadowFilter){const h=this.dropShadowFilter.blur??0,d=this.dropShadowFilter.offset,u=d?Math.sqrt(d.x**2+d.y**2):0;o=h+u}const a=300+r+o,n=t+a*2,c=e+a*2;this.pixiTextContainer&&(this.pixiTextContainer.x=a,this.pixiTextContainer.y=a),this.renderTexture&&this.renderTexture.destroy(),this.renderTexture=m.RenderTexture.create({width:n,height:c}),this.renderTexturePadding=a}_normalizeStyleOpts(t){let e={...t};e.style&&(e={...e,...e.style},delete e.style),e.fill!==void 0&&(e.color=e.fill,delete e.fill),e.dropShadow!==void 0&&(e.shadow=e.dropShadow,delete e.dropShadow),e.textAlign!==void 0&&(e.align=e.textAlign,delete e.textAlign);const i=e.underline,s=e.overline,r=e.linethrough;return(i!==void 0||s!==void 0||r!==void 0)&&(i?e.textDecoration="underline":s?e.textDecoration="overline":r?e.textDecoration="line-through":e.textDecoration="none",delete e.underline,delete e.overline,delete e.linethrough),e}_cloneColorOpts(t){const e=this.originalOpts;return e.color&&typeof e.color=="object"&&"type"in e.color&&e.color.type==="gradient"?e.color:t(this.textStyle.fill)??16777215}_cloneStrokeOpts(t){const e=this.originalOpts,i=this.textStyle;if(e.stroke&&typeof e.stroke=="object"&&"color"in e.stroke)return{stroke:e.stroke,strokeWidth:0};const s=t(i.stroke),r=e.strokeWidth??i.strokeThickness??0;return{stroke:s!==void 0?s:void 0,strokeWidth:r}}_cloneShadowOpts(t){const e=this.originalOpts,i=this.textStyle;if(e.shadow)return e.shadow;if(i.dropShadow){const s=i.dropShadow,r=t(s.color);if(r!==void 0){const o=s.angle??0,a=s.distance??0;return{color:r,alpha:s.alpha,blur:s.blur,offsetX:Math.cos(o)*a,offsetY:Math.sin(o)*a}}}}createStyleFromOpts(t){const e=t.fontSize??40,i=t.lineHeight??1,s={fontSize:e,fontFamily:t.fontFamily??"Roboto",fontWeight:t.fontWeight??"normal",fontStyle:t.fontStyle??"normal",align:t.align??"left",wordWrap:t.wordWrap??!1,wordWrapWidth:t.wordWrapWidth??100,lineHeight:e*i,letterSpacing:t.letterSpacing??0},r=t.color??"#ffffff";if(r&&typeof r=="object"&&"type"in r&&r.type==="gradient"){const o=new m.FillGradient(r.x0,r.y0,r.x1,r.y1);r.colors.forEach(({ratio:a,color:n})=>{const c=typeof n=="number"?n:$(n)??16777215;o.addColorStop(a,c)}),s.fill={fill:o}}else{const{color:o,alpha:a}=Mt(r);s.fill=o,a<1&&(s.fillAlpha=a)}return s}drawRoundedMultilinePath(t,e,i,s,r=1){if(e.length===0)return;const o=Math.max(i*.8,15);let a=!0,n=0;for(;a&&n<5;){a=!1,n++;for(let u=0;u<e.length;u++)for(let f=u+1;f<e.length;f++){const p=e[u].x+e[u].w,g=e[f].x+e[f].w;if(Math.abs(p-g)>.1&&Math.abs(p-g)<o){const v=Math.max(p,g);e[u].w=v-e[u].x,e[f].w=v-e[f].x,a=!0}if(Math.abs(e[u].x-e[f].x)>.1&&Math.abs(e[u].x-e[f].x)<o){const v=Math.min(e[u].x,e[f].x);e[u].w+=e[u].x-v,e[u].x=v,e[f].w+=e[f].x-v,e[f].x=v,a=!0}}}const c=[];c.push({x:e[0].x,y:e[0].y}),c.push({x:e[0].x+e[0].w,y:e[0].y});for(let u=0;u<e.length-1;u++){const f=e[u],p=e[u+1];if(Math.abs(f.x+f.w-(p.x+p.w))>.1){const g=(f.y+f.h+p.y)/2;c.push({x:f.x+f.w,y:g}),c.push({x:p.x+p.w,y:g})}}c.push({x:e[e.length-1].x+e[e.length-1].w,y:e[e.length-1].y+e[e.length-1].h}),c.push({x:e[e.length-1].x,y:e[e.length-1].y+e[e.length-1].h});for(let u=e.length-1;u>0;u--){const f=e[u],p=e[u-1];if(Math.abs(f.x-p.x)>.1){const g=(f.y+p.y+p.h)/2;c.push({x:f.x,y:g}),c.push({x:p.x,y:g})}}t.clear();const h=c[c.length-1],d=c[0];t.moveTo((h.x+d.x)/2,(h.y+d.y)/2);for(let u=0;u<c.length;u++){const f=c[u],p=c[(u+1)%c.length];t.arcTo(f.x,f.y,(f.x+p.x)/2,(f.y+p.y)/2,i)}t.fill({color:s,alpha:r})}destroy(){if(!this.destroyed){Y.info(`${this.constructor.name} destroy`);try{if(this.pixiTextContainer!=null&&!this.pixiTextContainer.destroyed){for(const t of this.pixiTextContainer.children)if(t&&!t.destroyed){const e=i=>{if(i&&(ut.killTweensOf(i),i.children))for(const s of i.children)e(s)};if(e(t),t.children)for(const i of t.children)i&&i.label==="LineContainer"&&(i.mask=null)}this.pixiTextContainer.destroy({children:!0})}}catch{}finally{this.pixiTextContainer=null}try{this.renderTexture!=null&&!this.renderTexture.destroyed&&this.renderTexture.destroy(!0)}catch{}finally{this.renderTexture=null}if(this.externalRenderer=null,this.pixiApp!=null)try{const t=this.pixiApp;t.destroyed!==!0&&t.renderer!=null&&this.pixiApp.destroy(!0,{children:!0,texture:!0})}catch{}finally{this.pixiApp=null}super.destroy()}}toJSON(t=!1){const e=super.toJSON(t),{chromaKey:i,colorAdjustment:s,...r}=e;return r}}class yt extends $e{type="Caption";_lastTickTime=0;_isWidthConstrained=!1;_words=[];_activeStyle={};_futureStyle={};_keywordColor="";_keywordPreserveAfterSpoken=!1;_wordAnimation={type:"scale",application:"none",value:1};_wordsPerLine="multiple";_trackCaptionColors;_videoWidth=1280;_videoHeight=720;_bottomOffset=100;get text(){return this._text}set text(t){if(this._text===t)return;const e=this._text;this._text=t,e!==""&&this._words.length>0&&(this._words=Te.redistributeCaptionWords(t,this._words,this.duration||5e6)),this.originalOpts&&this.textStyle&&this.refreshText().then(()=>this.emit("propsChange",{text:t}))}get textAlign(){return this.originalOpts?.align??"left"}get caption(){const t=this.originalOpts??{};return{words:this._words,colors:{active:t.activeStyle,future:t.futureStyle,keyword:t.keywordColor?{color:t.keywordColor,preserveAfterSpoken:t.keywordPreserveAfterSpoken}:void 0},wordAnimation:t.wordAnimation,positioning:{videoWidth:this._videoWidth,videoHeight:this._videoHeight,bottomOffset:this._bottomOffset}}}set caption(t){if(!t)return;t.words&&(this._words=t.words,this.originalOpts&&(this.originalOpts.words=t.words));const e=Array.isArray(t.words),i=t.colors??(e?this._trackCaptionColors??{}:void 0),s=!t.colors&&e;i&&(("active"in i||s)&&(this.originalOpts.activeStyle=i.active??void 0),("future"in i||s)&&(this.originalOpts.futureStyle=i.future??void 0),("keyword"in i||s)&&(i.keyword!=null?(this.originalOpts.keywordColor=i.keyword.color,this.originalOpts.keywordPreserveAfterSpoken=i.keyword.preserveAfterSpoken):(this.originalOpts.keywordColor=void 0,this.originalOpts.keywordPreserveAfterSpoken=void 0))),t.wordAnimation!==void 0&&(this.originalOpts.wordAnimation=t.wordAnimation),t.positioning&&(t.positioning.videoWidth!==void 0&&(this._videoWidth=t.positioning.videoWidth),t.positioning.videoHeight!==void 0&&(this._videoHeight=t.positioning.videoHeight),t.positioning.bottomOffset!==void 0&&(this._bottomOffset=t.positioning.bottomOffset)),this._syncOpts(),(i||t.wordAnimation!==void 0||t.words)&&(this._buildTextStyles(),this.refreshText().then(()=>this.emit("propsChange",{caption:t})))}get words(){return this._words}set words(t){this._words=t,this.originalOpts&&(this.originalOpts.words=t),this.refreshText().then(()=>this.emit("propsChange",{style:this.style}))}get mediaId(){return this.originalOpts?.mediaId}set mediaId(t){this.originalOpts&&(this.originalOpts.mediaId=t)}get wordsPerLine(){return this._wordsPerLine}set wordsPerLine(t){t&&(this._wordsPerLine=t,this.originalOpts&&(this.originalOpts.wordsPerLine=t),this.refreshText())}get style(){const t=this.originalOpts??{};return{fontSize:t.fontSize,fontFamily:t.fontFamily,fontWeight:t.fontWeight,fontStyle:t.fontStyle,color:t.color,align:t.align,stroke:t.stroke,shadow:t.shadow,wordWrap:t.wordWrap,wordWrapWidth:t.wordWrapWidth,lineHeight:t.lineHeight,letterSpacing:t.letterSpacing,textCase:t.textCase}}set style(t){this.updateStyle(t)}async updateStyle(t){const e=this._normalizeStyleOpts(t);this.originalOpts={...this.originalOpts,...e},e.words!==void 0&&(this._words=e.words),this._syncOpts(),this._buildTextStyles(),await this.refreshText(),this.emit("propsChange",t)}get width(){return this._width}set width(t){Math.abs(this.width-t)<.1||(this._width=t,t>0&&(this._isWidthConstrained=!0),this.refreshText())}get height(){return this._height}set height(t){Math.abs(this.height-t)<.1||(this._height=t,this.refreshText())}animate(t){this._lastTickTime=t,super.animate(t)}constructor(t,e={},i){if(super(),this.originalOpts={...e},this._text=t,i&&this.setRenderer(i),e.caption){e.caption.words&&(this._words=e.caption.words);const s=e.caption;s.colors&&"active"in s.colors&&(this.originalOpts.activeStyle=s.colors.active??void 0),s.colors&&"future"in s.colors&&(this.originalOpts.futureStyle=s.colors.future??void 0),s.colors&&"keyword"in s.colors&&(s.colors.keyword!=null?(this.originalOpts.keywordColor=s.colors.keyword.color,this.originalOpts.keywordPreserveAfterSpoken=s.colors.keyword.preserveAfterSpoken):(this.originalOpts.keywordColor=void 0,this.originalOpts.keywordPreserveAfterSpoken=void 0)),s.wordAnimation!==void 0&&(this.originalOpts.wordAnimation=s.wordAnimation),s.positioning?.videoWidth!==void 0&&(this.originalOpts.videoWidth=s.positioning.videoWidth),s.positioning?.videoHeight!==void 0&&(this.originalOpts.videoHeight=s.positioning.videoHeight),s.positioning?.bottomOffset!==void 0&&(this.originalOpts.bottomOffset=s.positioning.bottomOffset)}e.words&&(this._words=e.words),e.initialLayoutApplied,this._syncOpts(),this._buildTextStyles(),this.ready=(async()=>(await this.refreshText(),{...this.meta}))()}createStyleFromOpts(t){const e=super.createStyleFromOpts(t);return e.fill=16777215,e}_syncOpts(){const t=this.originalOpts??{};this._activeStyle=t.activeStyle??{},this._futureStyle=t.futureStyle??{},this._keywordColor=t.keywordColor??"",this._keywordPreserveAfterSpoken=t.keywordPreserveAfterSpoken??!1,this._wordAnimation=t.wordAnimation??{type:"scale",application:"none",value:1},this._wordsPerLine=t.wordsPerLine??"multiple",this._videoWidth=t.videoWidth??1280,this._videoHeight=t.videoHeight??720,this._bottomOffset=t.bottomOffset??100}_buildWordObjects(t){const e=new m.Container;e.label="TextOnlyContainer",this.wordTexts.forEach(o=>o.destroy()),this.wordTexts=[];const i=[],s=this.originalOpts?.textCase,r=(o,a)=>{const n=new m.SplitBitmapText({text:o,style:this.textStyle});n.segmentIndex=a;const c=this.originalOpts?.color,h=typeof c=="object"&&c!==null&&"type"in c?16777215:c,d=$(h);return n.tint=d??16777215,n};return this._words.length>0?this._words.forEach((o,a)=>{let n=o.text||"";s==="uppercase"?n=n.toUpperCase():s==="lowercase"?n=n.toLowerCase():s==="title"&&(n=n.replace(/\w\S*/g,h=>h.charAt(0).toUpperCase()+h.substring(1).toLowerCase())),n.split(/\s+/).filter(h=>h.length>0).forEach(h=>{const d=r(h,a);e.addChild(d),this.wordTexts.push(d),i.push(h)})}):t.split(/\s+/).filter(o=>o.length>0).forEach((o,a)=>{const n=r(o,a);e.addChild(n),this.wordTexts.push(n),i.push(o)}),{textOnlyContainer:e,words:i}}_onAfterRefresh(){this.updateState(this._lastTickTime)}async tick(t){return this.updateState(t),super.tick(t)}updateState(t){this._lastTickTime=t;const e=t/1e3;this.wordTexts.forEach(i=>{const s=this._words[i.segmentIndex];if(!s)return;i.scale.set(1,1);const r=e>=s.from&&e<s.to,o=e>=s.to,a=!r&&!o,n=this._wordAnimation;let c=0,h=!1;if(n&&n.application!=="none"&&((n.application==="active"&&r||n.application==="keyword"&&s.isKeyWord)&&(h=!0),h)){if(n.mode==="dynamic"&&r){const y=s.to-s.from;if(y>0){const C=Math.max(0,Math.min(1,(e-s.from)/y));c=n.value<1?C:Math.sin(C*Math.PI)}else c=1}else c=1;if(n.type==="scale"){const y=n.value<1&&n.mode==="dynamic"&&r?n.value+(1-n.value)*c:1+(n.value-1)*c;i.scale.set(y,y)}}let d=16777215,u=1;if(s.isKeyWord&&!It(this._keywordColor)&&(r||o&&this._keywordPreserveAfterSpoken))({color:d,alpha:u}=Mt(this._keywordColor,16776960));else if(r){const y=this._activeStyle.color;y&&!It(y)?{color:d,alpha:u}=Mt(y,16777215):(d=16777215,u=1)}else if(a){const y=this._futureStyle.color;y&&!It(y)?{color:d,alpha:u}=Mt(y,16777215):(d=16777215,u=1)}else{const y=this.originalOpts?.color,C=typeof y=="object"&&y!==null&&"type"in y?16777215:y;({color:d,alpha:u}=Mt(C))}if(h&&n?.type==="opacity"){const y=n.value<1&&n.mode==="dynamic"&&r?n.value+(1-n.value)*c:1+(n.value-1)*c;u*=y}i.tint=d;const p=y=>{y.label==="bgRect"||y.label==="tiktokBackground"||y.label==="containerBackground"||typeof y.label=="string"&&y.label.startsWith("bgRect_")||("alpha"in y&&(y.alpha=u),y.children&&y.children.forEach(p))};i.children.forEach(p);const g=i.parent,v=`bgRect_${i.segmentIndex}`,x=g?g.getChildByLabel(v):null,w=r?this._activeStyle.background??"":"";if(r&&!!w&&!It(w)&&w!=="none"&&g){const{color:y,alpha:C}=Mt(w,16753920),k=15,O=40,F=i.scale.x,b=(i.getLocalBounds().width||i.width)*F,S=(this.originalOpts?.fontSize??40)*F,A=i.x,E=i.y+9,P=x??new m.Graphics;P.label=v,P.clear(),P.roundRect(A-O/2,E-k/2,b+O,S+k,10),P.fill({color:y,alpha:C}),P.tint=16777215,x||g.addChildAt(P,0)}else x&&g&&(g.removeChild(x),x.destroy())})}async clone(){await this.ready;const t=new yt(this.text,{...this.originalOpts,words:[...this._words]});return this.copyStateTo(t),t.id=this.id,t.effects=[...this.effects],t}toJSON(t=!1){const e=super.toJSON(t),i=this.originalOpts??{},s={};i.fontSize!==void 0&&(s.fontSize=i.fontSize),i.fontFamily!==void 0&&(s.fontFamily=i.fontFamily),i.fontWeight!==void 0&&(s.fontWeight=i.fontWeight),i.fontStyle!==void 0&&(s.fontStyle=i.fontStyle),i.color!==void 0&&(s.color=i.color),i.align!==void 0&&(s.align=i.align),i.textCase!==void 0&&(s.textCase=i.textCase),i.fontUrl!==void 0&&(s.fontUrl=i.fontUrl),i.verticalAlign!==void 0&&(s.verticalAlign=i.verticalAlign),i.wordWrapWidth!==void 0&&(s.wordWrapWidth=i.wordWrapWidth),i.wordWrap!==void 0&&(s.wordWrap=i.wordWrap),i.wordAnimation!==void 0&&(s.wordAnimation=i.wordAnimation),i.stroke&&(typeof i.stroke=="object"?s.stroke={color:i.stroke.color,width:i.stroke.width}:s.stroke={color:i.stroke,width:i.strokeWidth??0}),i.shadow&&(s.shadow={color:i.shadow.color??"#000000",alpha:i.shadow.alpha??.5,blur:i.shadow.blur??4,offsetX:i.shadow.offsetX??0,offsetY:i.shadow.offsetY??0});const r={};this._words.length>0&&(r.words=this._words);const o={};i.activeStyle&&(o.active=i.activeStyle),i.futureStyle&&(o.future=i.futureStyle),i.keywordColor&&(o.keyword={color:i.keywordColor,preserveAfterSpoken:i.keywordPreserveAfterSpoken}),Object.keys(o).length>0&&(r.colors=o),i.wordAnimation!==void 0&&(r.wordAnimation=i.wordAnimation);const a={};return i.videoWidth!==void 0&&(a.videoWidth=i.videoWidth),i.videoHeight!==void 0&&(a.videoHeight=i.videoHeight),i.bottomOffset!==void 0&&(a.bottomOffset=i.bottomOffset),Object.keys(a).length>0&&(r.positioning=a),{...e,type:"Caption",text:this.text,style:s,caption:Object.keys(r).length>0?r:void 0,id:this.id,effects:this.effects,mediaId:this.mediaId,wordsPerLine:this.wordsPerLine,fontUrl:i.fontUrl}}static async fromObject(t,e){if(t.type!=="Caption")throw new Error(`Expected Caption, got ${t.type}`);const i=e?.captionConfig,s=t.text||"",r={...i?.style??{},...t.style??{}},o={};r.fontSize!==void 0&&(o.fontSize=r.fontSize),r.fontFamily!==void 0&&(o.fontFamily=r.fontFamily),r.fontWeight!==void 0&&(o.fontWeight=r.fontWeight),r.fontStyle!==void 0&&(o.fontStyle=r.fontStyle),r.color!==void 0?o.color=r.color:r.fill!==void 0&&(o.color=r.fill),r.align!==void 0&&(o.align=r.align),r.textCase!==void 0&&(o.textCase=r.textCase),r.verticalAlign!==void 0&&(o.verticalAlign=r.verticalAlign),r.wordWrapWidth!==void 0&&(o.wordWrapWidth=r.wordWrapWidth),r.wordWrap!==void 0&&(o.wordWrap=r.wordWrap),r.wordAnimation!==void 0&&(o.wordAnimation=r.wordAnimation),r.fontUrl!==void 0?o.fontUrl=r.fontUrl:t.fontUrl!==void 0&&(o.fontUrl=t.fontUrl);const a=h=>h!=null&&h!=="";a(r.wordsPerLine)?o.wordsPerLine=r.wordsPerLine:a(t.wordsPerLine)&&(o.wordsPerLine=t.wordsPerLine);const n=r;if(n.lineHeight!==void 0&&(o.lineHeight=n.lineHeight),n.letterSpacing!==void 0&&(o.letterSpacing=n.letterSpacing),o.textCase===void 0&&t.textCase!==void 0&&(o.textCase=t.textCase),n.background&&typeof n.background=="object")o.background={...n.background};else if(a(n.backgroundColor)&&n.backgroundColor!=="transparent"){const h=Number(n.padding);o.background={color:n.backgroundColor,opacity:n.backgroundOpacity??.7,borderRadius:n.borderRadius??8,paddingX:Number.isFinite(h)?h:10,paddingY:Number.isFinite(h)?Math.round(h*.6):6}}if(t.mediaId&&(o.mediaId=t.mediaId),r.stroke&&(o.stroke=r.stroke.color,o.strokeWidth=r.stroke.width),r.shadow&&(o.shadow={color:r.shadow.color,alpha:r.shadow.alpha,blur:r.shadow.blur,offsetX:r.shadow.offsetX??0,offsetY:r.shadow.offsetY??0}),t.caption){const h={...t.caption};!h.colors&&i?.colors&&(h.colors=i.colors),!h.positioning&&i?.positioning&&(h.positioning=i.positioning),o.caption=h,t.caption.wordAnimation&&(o.wordAnimation=t.caption.wordAnimation)}else i&&(o.caption={colors:i.colors,positioning:i.positioning});o.initialLayoutApplied=!0;const c=new yt(s,o);return c._trackCaptionColors=i?.colors,K.deserializeBaseProperties(c,t),c.wordsPerLine=(a(t.wordsPerLine)?t.wordsPerLine:void 0)??i?.wordsPerLine??"multiple",t.effects&&(c.effects=t.effects),await c.ready,c}getVisibleHandles(){return["mr","mb","br","rot"]}}let Nt=class xt extends K{type="Image";ready;_meta={duration:0,width:0,height:0};get meta(){return{...this._meta}}img=null;pixiTexture=null;frames=[];id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effects=[];getVisibleHandles(){return["tl","tr","bl","br","rot"]}static async fromUrl(t,e){let i=null,s;if(t.startsWith("blob:"))try{const o=await fetch(t);if(!o.ok)throw new Error(`Failed to fetch image: ${o.status} ${o.statusText}`);const a=await o.blob();s=await createImageBitmap(a);try{i=m.Texture.from(s)}catch(n){Y.warn("Failed to create Pixi texture from bitmap:",n)}}catch(o){throw Y.error(`Failed to load blob image from ${t}`,o),o}else s=await wt.getImageBitmap(t);if(!s)throw new Error(`Failed to load image from ${t}`);const r=new xt(s,e||t);return i&&(r.pixiTexture=i),r}getTexture(){return this.pixiTexture}constructor(t,e){super(),this.src=e!==void 0?e:"";const i=s=>{this.img=s,this._meta.width=s.width,this._meta.height=s.height,this._meta.duration=1/0;const r={...this._meta};return this.width=this.width===0?r.width:this.width,this.height=this.height===0?r.height:this.height,this.duration===0&&r.duration!==1/0&&(this.duration=r.duration,this.display.to=this.display.from+this.duration),r};if(t instanceof ReadableStream)this.ready=new Response(t).blob().then(s=>createImageBitmap(s)).then(i);else if(t instanceof ImageBitmap)this.ready=Promise.resolve(i(t));else if(Array.isArray(t)&&t.every(s=>s instanceof VideoFrame)){this.frames=t;const s=this.frames[0];if(s==null)throw Error("The frame count must be greater than 0");this._meta={width:s.displayWidth,height:s.displayHeight,duration:this.frames.reduce((o,a)=>o+(a.duration??0),0)};const r={...this._meta,duration:1/0};this.width=this.width===0?r.width:this.width,this.height=this.height===0?r.height:this.height,this.duration===0&&r.duration!==1/0&&(this.duration=r.duration,this.display.to=this.display.from+this.duration),this.ready=Promise.resolve(r)}else if("type"in t)this.ready=this.initAnimateImg(t.stream,t.type).then(()=>{const s={width:this._meta.width,height:this._meta.height,duration:1/0};return this.width=this.width===0?s.width:this.width,this.height=this.height===0?s.height:this.height,this.duration===0&&s.duration!==1/0&&(this.duration=s.duration,this.display.to=this.display.from+this.duration),s});else throw Error("Illegal arguments")}async initAnimateImg(t,e){this.frames=await is(t,e);const i=this.frames[0];if(i==null)throw Error("No frame available in gif");this._meta={duration:this.frames.reduce((s,r)=>s+(r.duration??0),0),width:i.codedWidth,height:i.codedHeight},Y.info("Image ready:",this._meta)}tickInterceptor=async(t,e)=>e;async tick(t){if(this.img!=null)return await this.tickInterceptor(t,{video:await createImageBitmap(this.img),state:"success"});const e=t%this._meta.duration;return await this.tickInterceptor(t,{video:(this.frames.find(i=>e>=i.timestamp&&e<=i.timestamp+(i.duration??0))??this.frames[0]).clone(),state:"success"})}async split(t){if(await this.ready,this.img!=null)return[new xt(await createImageBitmap(this.img),this.src),new xt(await createImageBitmap(this.img),this.src)];let e=-1;for(let r=0;r<this.frames.length;r++){const o=this.frames[r];if(!(t>o.timestamp)){e=r;break}}if(e===-1)throw Error("Not found frame by time");const i=this.frames.slice(0,e).map(r=>new VideoFrame(r)),s=this.frames.slice(e).map(r=>new VideoFrame(r,{timestamp:r.timestamp-t}));return[new xt(i,this.src),new xt(s,this.src)]}async clone(){await this.ready;const t=this.img==null?this.frames.map(i=>i.clone()):await createImageBitmap(this.img),e=new xt(t,this.src);return e.tickInterceptor=this.tickInterceptor,this.copyStateTo(e),e.id=this.id,e.effects=[...this.effects],e.transition=this.transition,e}addEffect(t){this.effects.push(t)}editEffect(t,e){const i=this.effects.find(s=>s.id===t);i&&Object.assign(i,e)}removeEffect(t){const e=this.effects.findIndex(i=>i.id===t);e!==-1&&this.effects.splice(e,1)}destroy(){Y.info("Image destroy"),this.img?.close(),this.frames.forEach(t=>t.close()),this.pixiTexture=null,super.destroy()}toJSON(t=!1){return{...super.toJSON(t),type:"Image",id:this.id,effects:this.effects}}static async fromObject(t){if(t.type!=="Image")throw new Error(`Expected Image, got ${t.type}`);if(!t.src||t.src.trim()==="")throw new Error("Image requires a valid source URL. Generated clips (like text-to-image) cannot be loaded from JSON without their source data.");let e;try{const i=await wt.getImageBitmap(t.src);e=new xt(i,t.src)}catch(i){throw i instanceof Error&&i.message.includes("could not be decoded")?new Error(`Failed to decode image from ${t.src}. The image may be decoded, in an unsupported format, or there may be CORS issues.`):i}return K.deserializeBaseProperties(e,t),t.effects&&(e.effects=t.effects),e}};function ae(l,t){const e={},i=t.videoTracks[0];if(i!=null){const r=vs(l.getTrackById(i.id))?.buffer,o=gs(i.codec);o&&(e.videoTrackConf={timescale:i.timescale,duration:i.duration,width:i.video.width,height:i.video.height,brands:t.brands,type:o.type,[o.descKey]:r}),e.videoDecoderConf={codec:i.codec,codedHeight:i.video.height,codedWidth:i.video.width,description:r}}const s=t.audioTracks[0];if(s!=null){const r=ys(l),o=r?xs(r):{};e.audioTrackConf={timescale:s.timescale,samplerate:o.sampleRate??s.audio.sample_rate,channel_count:o.numberOfChannels??s.audio.channel_count,hdlr:"soun",type:s.codec.startsWith("mp4a")?"mp4a":s.codec,description:r};const a=s.codec.startsWith("mp4a")?s.codec:o.codec??(s.codec==="Opus"||s.codec==="opus"?"opus":s.codec);e.audioDecoderConf={codec:a,numberOfChannels:o.numberOfChannels??s.audio.channel_count,sampleRate:o.sampleRate??s.audio.sample_rate,...o.description?{description:o.description}:{}}}return e}function gs(l){return l.startsWith("avc1")?{descKey:"avcDecoderConfigRecord",type:"avc1"}:l.startsWith("hvc1")?{descKey:"hevcDecoderConfigRecord",type:"hvc1"}:null}function vs(l){for(const t of l.mdia.minf.stbl.stsd.entries){const e=t.avcC??t.hvcC??t.av1C??t.vpcC;if(e!=null){const i=new it.mp4box.DataStream(void 0,0,void 0);return e.write(i),new Uint8Array(i.buffer.slice(8))}}}function ys(l,t="mp4a"){const e=l.moov?.traks.flatMap(i=>i.mdia.minf.stbl.stsd.entries).find(i=>i.type===t);return e?.esds??e}function xs(l){const t=l.esd?.descs?.[0];if(!t)return{};let e=`mp4a.${t.oti.toString(16)}`;const i=t.descs?.[0];if(!i)return e.endsWith(".40")&&(e+=".2"),{codec:e};const s=i.data;if(!s)return{codec:e};const r=(s[0]&248)>>3;e+=`.${r}`;const o=(s[0]&7)<<1|s[1]>>7,a=(s[1]&120)>>3;return{codec:e,sampleRate:[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350][o],numberOfChannels:a,description:s}}async function ws(l,t,e){const i=it.mp4box.createFile(!1);i.onReady=o=>{t({mp4boxFile:i,info:o}),[o.videoTracks[0],o.audioTracks[0]].forEach(a=>{if(a){const n=a.video?"video":"audio";i.setExtractionOptions(a.id,n,{nbSamples:100})}}),i.start()},i.onSamples=e;let s=0;const r=30*1024*1024;for(;;){const o=await l.read(r,{at:s});if(o.byteLength===0)break;o.fileStart=s;const a=i.appendBuffer(o);if(a==null)break;s=a}i.stop()}function bs(l){if(l?.length!==9)return{};const t=new Int32Array(l.buffer),e=h=>h/65536,i=e(t[0]),s=e(t[1]),r=e(t[3]),o=e(t[4]),a=e(t[6]),n=e(t[7]),c=t[8]/(1<<30);return{scaleX:Math.sqrt(i*i+r*r),scaleY:Math.sqrt(s*s+o*o),rotationRad:Math.atan2(r,i),rotationDeg:Math.atan2(r,i)*180/Math.PI,translateX:a,translateY:n,perspective:c}}function Cs(l,t,e){const i=(Math.round(e/90)*90+360)%360;if(i===0)return c=>c;const s=i===90||i===270,r=s?t:l,o=s?l:t,a=new OffscreenCanvas(r,o),n=a.getContext("2d");return n.translate(r/2,o/2),n.rotate(-i*Math.PI/180),n.translate(-l/2,-t/2),c=>{if(!c)return null;n.drawImage(c,0,0);const h=new VideoFrame(a,{timestamp:c.timestamp,duration:c.duration??void 0});return c.close(),h}}let le=0;function ce(l){return l.kind==="file"&&l.createReader instanceof Function}class ct extends K{type="Video";insId=le++;logger=Y.create(`Video id:${this.insId},`);ready;_meta={duration:0,width:0,height:0,audioSampleRate:0,audioChanCount:0};get meta(){return{...this._meta}}localFile;headerBoxPos=[];async getFileHeaderBinData(){await this.ready;const t=await this.localFile.getOriginFile();if(t==null)throw Error("Video localFile is not origin file");return await new Blob(this.headerBoxPos.map(({start:e,size:i})=>t.slice(e,e+i))).arrayBuffer()}parsedMatrix={perspective:1,rotationRad:0,rotationDeg:0,scaleX:1,scaleY:1,translateX:0,translateY:0};vfRotater=t=>t;videoSamples=[];audioSamples=[];videoFrameFinder=null;audioFrameFinder=null;onEffectiveVolumeChange(){this.audioFrameFinder?.setVolume(this.effectiveVolume)}decoderConf={video:null,audio:null};opts={audio:!0};audio=!0;id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effects=[];getVisibleHandles(){return["tl","tr","bl","br","rot"]}static async fromUrl(t,e={}){const i=await wt.getReadableStream(t),s=new ct(i,{},t);return await s.ready,e.x!==void 0&&(s.left=e.x),e.y!==void 0&&(s.top=e.y),e.width!==void 0&&(s.width=e.width),e.height!==void 0&&(s.height=e.height),s}constructor(t,e={},i){if(super(),this.src=i!==void 0?i:"",!(t instanceof ReadableStream)&&!ce(t)&&!Array.isArray(t.videoSamples))throw Error("Illegal argument");this.opts={audio:!0,...e},this.audio=typeof this.opts.audio=="boolean"?this.opts.audio:!0,this.volume=typeof e.audio=="object"&&"volume"in e.audio?e.audio.volume:e.volume??1;const s=async r=>(await st.write(this.localFile,r),this.localFile);this.localFile=ce(t)?t:"localFile"in t?t.localFile:st.tmpfile(),this.ready=(t instanceof ReadableStream?s(t).then(r=>ti(r,this.opts)):ce(t)?ti(t,this.opts):Promise.resolve(t)).then(async({videoSamples:r,audioSamples:o,decoderConf:a,headerBoxPos:n,parsedMatrix:c})=>{this.videoSamples=r,this.audioSamples=o,this.decoderConf=a,this.headerBoxPos=n,this.parsedMatrix=c;const{videoFrameFinder:h,audioFrameFinder:d}=Ss({video:a.video==null?null:{...a.video,hardwareAcceleration:this.opts.__unsafe_hardwareAcceleration__},audio:a.audio},await this.localFile.createReader(),r,o,this.opts.audio!==!1?this.volume:0);this.videoFrameFinder=h,this.audioFrameFinder=d,this.effectiveVolume!==this.volume&&this.audioFrameFinder?.setVolume(this.effectiveVolume);const{codedWidth:u,codedHeight:f}=a.video??{};u&&f&&(this.vfRotater=Cs(u,f,c.rotationDeg)),this._meta=Ts(a,r,o,c.rotationDeg),this.logger.info("Video meta:",this._meta);const p={...this._meta};this.width=this.width===0?p.width:this.width,this.height=this.height===0?p.height:this.height,this.trim.to=this.trim.to===0?p.duration:Math.min(this.trim.to,p.duration),this.trim.from=Math.min(this.trim.from,this.trim.to);const g=(this.trim.to-this.trim.from)/this.playbackRate;return this.duration=this.duration===0?g:this.duration,Math.abs(this.duration-g)>1&&(this.duration=g),this.display.to=this.display.from+this.duration,this.on("propsChange",v=>{(v.volume!==void 0||v.muted!==void 0)&&this.audioFrameFinder&&this.audioFrameFinder.setVolume(this.effectiveVolume)}),p})}tickInterceptor=async(t,e)=>e;async tick(t){const e=t+this.trim.from;if(e>this.trim.to||e>this._meta.duration)return await this.tickInterceptor(t,{audio:await this.audioFrameFinder?.find(e)??[],state:"done"});const[i,s]=await Promise.all([this.audioFrameFinder?.find(e)??[],this.videoFrameFinder?.find(e).then(this.vfRotater)]);return s==null?await this.tickInterceptor(t,{audio:i,state:"success"}):await this.tickInterceptor(t,{video:s,audio:i,state:"success"})}addEffect(t){this.effects.push(t)}editEffect(t,e){const i=this.effects.find(s=>s.id===t);i&&Object.assign(i,e)}removeEffect(t){const e=this.effects.findIndex(i=>i.id===t);e!==-1&&this.effects.splice(e,1)}async split(t){throw new Error("Video.split is not implemented - use core state instead")}async clone(){await this.ready;const t=new ct({localFile:this.localFile,videoSamples:[...this.videoSamples],audioSamples:[...this.audioSamples],decoderConf:this.decoderConf,headerBoxPos:this.headerBoxPos,parsedMatrix:this.parsedMatrix},this.opts,this.src);return await t.ready,t.tickInterceptor=this.tickInterceptor,this.copyStateTo(t),t.id=this.id,t.effects=[...this.effects],t}destroy(){this.destroyed||(this.destroyed=!0,this.logger.info("Video destroy"),super.destroy(),this.videoFrameFinder?.destroy(),this.audioFrameFinder?.destroy())}toJSON(t=!1){return{...super.toJSON(t),type:"Video",audio:this.audio,volume:this.volume,id:this.id,effects:this.effects}}static async fromObject(t){if(t.type!=="Video")throw new Error(`Expected Video, got ${t.type}`);const e=t.audio!==void 0?{audio:t.audio,volume:t.volume}:{volume:t.volume},i=await wt.getReadableStream(t.src),s=new ct(i,e,t.src);return K.deserializeBaseProperties(s,t),t.effects&&(s.effects=t.effects),t.volume!==void 0&&(s.volume=t.volume),s}async createPlaybackElement(){await this.ready;const e=this.localFile;if(!e||typeof e.getOriginFile!="function")throw new Error("Video does not have a local file for playback");const i=await e.getOriginFile();if(!i)throw new Error("Failed to get origin file from VideoClip");const s=URL.createObjectURL(i),r=document.createElement("video");return r.crossOrigin="anonymous",r.muted=!0,r.autoplay=!1,r.playsInline=!0,r.preload="auto",r.loop=!1,r.src=s,await new Promise((o,a)=>{const n=()=>{r.removeEventListener("loadeddata",n),r.removeEventListener("error",c),r.pause(),r.currentTime=0,o()},c=()=>{r.removeEventListener("loadeddata",n),r.removeEventListener("error",c),a(new Error("Failed to load video"))};r.addEventListener("loadeddata",n,{once:!0}),r.addEventListener("error",c,{once:!0}),r.load()}),{element:r,objectUrl:s}}async play(t,e){const i=t,s=e+this.trim.from/1e6;if(Math.abs(i.currentTime-s)>.1&&(i.currentTime=s),i.muted=!1,i.paused)try{await i.play()}catch{try{await i.play()}catch(o){console.warn("Failed to play video:",o)}}}pause(t){const e=t;e.pause(),e.muted=!0}async seek(t,e){const i=t,s=e+this.trim.from/1e6;i.pause(),i.currentTime=s,i.addEventListener("seeked",()=>{i.__pendingRender?.()},{once:!0})}syncPlayback(t,e,i){const s=t,r=this.duration&&this.duration!==1/0?this.duration/1e6:(this.display.to-this.display.from)/1e6,o=i>=0&&i<r,a=i+this.trim.from/1e6,n=r*1e3,c=i*1e3;let h=1;if(this.timing.fadeIn&&this.timing.fadeIn.duration>0&&c<this.timing.fadeIn.duration&&(h*=St(c/this.timing.fadeIn.duration,this.timing.fadeIn.curve)),this.timing.fadeOut&&this.timing.fadeOut.duration>0){const d=n-this.timing.fadeOut.duration;if(c>=d){const u=1-(c-d)/this.timing.fadeOut.duration;h*=St(u,this.timing.fadeOut.curve)}}s.volume=Math.max(0,Math.min(1,this.effectiveVolume*h)),e&&o?s.paused?this.play(s,i).catch(console.warn):(s.muted&&(s.muted=!1),(s.ended||s.currentTime>=this.trim.to/1e6)&&(s.currentTime=a,s.play().catch(console.warn))):(s.paused||s.pause(),s.muted=!0,o&&Math.abs(s.currentTime-a)>.1&&(s.currentTime=a))}cleanupPlayback(t,e){const i=t;i.pause(),i.removeAttribute("src"),i.load(),e&&URL.revokeObjectURL(e)}async scaleToFit(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.min(t/i,e/s);this.width=i*r,this.height=s*r}async scaleToFill(t,e){await this.ready;const{width:i,height:s}=this.meta;if(i===0||s===0)return;const r=Math.max(t/i,e/s);this.width=i*r,this.height=s*r}centerInScene(t,e){this.left=(t-this.width)/2,this.top=(e-this.height)/2}}function Ts(l,t,e,i){const s={duration:0,width:0,height:0,audioSampleRate:0,audioChanCount:0};if(l.video!=null&&t.length>0){s.width=l.video.codedWidth??0,s.height=l.video.codedHeight??0;const a=(Math.round(i/90)*90+360)%360;(a===90||a===270)&&([s.width,s.height]=[s.height,s.width])}l.audio!=null&&e.length>0&&(s.audioSampleRate=H.sampleRate,s.audioChanCount=H.channelCount);let r=0,o=0;if(t.length>0)for(let a=t.length-1;a>=0;a--){const n=t[a];if(!n.deleted){r=n.cts+n.duration;break}}if(e.length>0){const a=e.at(-1);o=a.cts+a.duration}return s.duration=Math.max(r,o),s}function Ss(l,t,e,i,s){return{audioFrameFinder:s===0||l.audio==null||i.length===0?null:new Fs(t,i,l.audio,{volume:s,targetSampleRate:H.sampleRate}),videoFrameFinder:l.video==null||e.length===0?null:new As(t,e,l.video)}}async function ti(l,t={}){let e=null;const i={video:null,audio:null};let s=[],r=[],o=[];const a={perspective:1,rotationRad:0,rotationDeg:0,scaleX:1,scaleY:1,translateX:0,translateY:0};let n=-1,c=-1;const h=await l.createReader();await ws(h,async u=>{e=u.info;const f=u.mp4boxFile.ftyp;o.push({start:f.start,size:f.size});const p=u.mp4boxFile.moov;o.push({start:p.start,size:p.size}),Object.assign(a,bs(e.videoTracks[0]?.matrix));let{videoDecoderConf:g,audioDecoderConf:v}=ae(u.mp4boxFile,u.info);if(i.video=g??null,i.audio=v??null,g==null&&v==null&&Y.error("Video no video and audio track"),v!=null){const{supported:x}=await AudioDecoder.isConfigSupported(v);x||Y.error(`Video audio codec is not supported: ${v.codec}`)}if(g!=null){const{supported:x}=await VideoDecoder.isConfigSupported(g);x||Y.error(`Video video codec is not supported: ${g.codec}`)}Y.info("mp4BoxFile moov ready",{...u.info,tracks:null,videoTracks:null,audioTracks:null},i)},(u,f,p)=>{if(f==="video"){n===-1&&(n=p[0].dts);for(const g of p)s.push(ei(g,n,"video"))}else if(f==="audio"&&t.audio){c===-1&&(c=p[0].dts);for(const g of p)r.push(ei(g,c,"audio"))}}),await h.close();const d=s.at(-1)??r.at(-1);if(e==null)throw Error("Video stream is done, but not emit ready");if(d==null)throw Error("Video stream not contain any sample");return Is(s),Y.info("mp4 stream parsed"),{videoSamples:s,audioSamples:r,decoderConf:i,headerBoxPos:o,parsedMatrix:a}}function ei(l,t=0,e){let i=l.offset;const s=e==="video"&&l.is_sync?Ds(l.data,l.description.type):-1;let r=l.size;return s>0&&(i+=s,r-=s),{...l,is_idr:s>=0,offset:i,size:r,cts:(l.cts-t)/l.timescale*1e6,dts:(l.dts-t)/l.timescale*1e6,duration:l.duration/l.timescale*1e6,timescale:1e6,data:e==="video"?null:l.data}}class As{constructor(t,e,i){this.localFileReader=t,this.samples=e,this.conf=i}localFileReader;samples;conf;decoder=null;timestamp=0;curAborter={abort:!1,st:performance.now()};find=async t=>{(this.decoder==null||this.decoder.state==="closed"||t<this.timestamp||t-this.timestamp>3e6)&&this.reset(t),this.curAborter.abort=!0,this.timestamp=t,this.curAborter={abort:!1,st:performance.now()};const e=await this.parseFrame(t,this.decoder,this.curAborter);return this.sleepCnt=0,e};lastVfDur=0;downgradeSoftDecode=!1;videoDecCursorIdx=0;videoFrames=[];outputFrameCnt=0;inputChunkCnt=0;sleepCnt=0;predecodeErr=!1;_firstPresentableTs=null;firstPresentableTs(){if(this._firstPresentableTs!=null)return this._firstPresentableTs;let t=this.samples.findIndex(i=>i.is_idr&&!i.deleted);t<0&&(t=0);let e=1/0;for(let i=t;i<this.samples.length;i++){const s=this.samples[i];if(i>t&&s.is_idr)break;!s.deleted&&s.cts<e&&(e=s.cts)}return this._firstPresentableTs=Number.isFinite(e)?e:0,this._firstPresentableTs}parseFrame=async(t,e,i)=>{if(e==null||e.state==="closed"||i.abort)return null;if(this.videoFrames.length>0){const s=this.videoFrames[0];return t<s.timestamp?t<=0||s.timestamp<=this.firstPresentableTs()?new VideoFrame(s):null:(this.videoFrames.shift(),t>s.timestamp+(s.duration??0)?(s.close(),await this.parseFrame(t,e,i)):(!this.predecodeErr&&this.videoFrames.length<10&&this.startDecode(e).catch(r=>{throw this.predecodeErr=!0,this.reset(t),r}),s))}if(this.decoding||this.outputFrameCnt<this.inputChunkCnt&&e.decodeQueueSize>0){if(performance.now()-i.st>6e3)throw Error(`Video.tick video timeout, ${JSON.stringify(this.getState())}`);this.sleepCnt+=1,await Me(15)}else{if(this.videoDecCursorIdx>=this.samples.length)return null;try{await this.startDecode(e)}catch(s){throw this.reset(t),s}}return await this.parseFrame(t,e,i)};decoding=!1;startDecode=async t=>{if(this.decoding||t.decodeQueueSize>600)return;let e=this.videoDecCursorIdx+1;if(e>this.samples.length)return;this.decoding=!0;let i=!1;for(;e<this.samples.length;e++){const s=this.samples[e];if(!i&&!s.deleted&&(i=!0),s.is_idr)break}if(i){const s=this.samples.slice(this.videoDecCursorIdx,e);if(s[0]?.is_idr!==!0)Y.warn("First sample not idr frame");else{const r=performance.now(),o=await Os(s,this.localFileReader),a=performance.now()-r;if(a>1e3){const n=s[0],c=s.at(-1),h=c.offset+c.size-n.offset;Y.warn(`Read video samples time cost: ${Math.round(a)}ms, file chunk size: ${h}`)}if(t.state==="closed")return;this.lastVfDur=o[0]?.duration??0,Es(t,o,{onDecodingError:n=>{if(this.downgradeSoftDecode)throw n;this.outputFrameCnt===0&&(this.downgradeSoftDecode=!0,Y.warn("Downgrade to software decode"),this.reset())}}),this.inputChunkCnt+=o.length}}this.videoDecCursorIdx=e,this.decoding=!1};reset=t=>{if(this.decoding=!1,this.videoFrames.forEach(i=>i.close()),this.videoFrames=[],t==null||t===0)this.videoDecCursorIdx=0;else{let i=0;for(let s=0;s<this.samples.length;s++){const r=this.samples[s];if(r.is_idr&&(i=s),!(r.cts<t)){this.videoDecCursorIdx=i;break}}}this.inputChunkCnt=0,this.outputFrameCnt=0,this.decoder?.state!=="closed"&&this.decoder?.close();const e={...this.conf,...this.downgradeSoftDecode?{hardwareAcceleration:"prefer-software"}:{}};this.decoder=new VideoDecoder({output:i=>{if(this.outputFrameCnt+=1,i.timestamp===-1){i.close();return}let s=i;i.duration==null&&(s=new VideoFrame(i,{duration:this.lastVfDur}),i.close()),this.videoFrames.push(s)},error:i=>{if(i.message.includes("Codec reclaimed due to inactivity")){this.decoder=null,Y.warn(i.message);return}const s=`VideoFinder VideoDecoder err: ${i.message}, config: ${JSON.stringify(e)}, state: ${JSON.stringify(this.getState())}`;throw Y.error(s),Error(s)}}),this.decoder.configure(e)};getState=()=>({time:this.timestamp,decState:this.decoder?.state,decQSize:this.decoder?.decodeQueueSize,decCursorIdx:this.videoDecCursorIdx,sampleLen:this.samples.length,inputCnt:this.inputChunkCnt,outputCnt:this.outputFrameCnt,cacheFrameLen:this.videoFrames.length,softDecode:this.downgradeSoftDecode,clipIdCnt:le,sleepCnt:this.sleepCnt,memInfo:ii()});destroy=async()=>{if(this.curAborter.abort=!0,this.videoFrames.forEach(t=>t.close()),this.videoFrames=[],this.decoder&&this.decoder.state!=="closed")try{this.decoder.close()}catch{}this.decoder=null,this.localFileReader.close()}}function ks(l,t){for(let e=0;e<t.length;e++){const i=t[e];if(l>=i.cts&&l<i.cts+i.duration)return e;if(i.cts>l)break}return 0}class Fs{constructor(t,e,i,s){this.localFileReader=t,this.samples=e,this.conf=i,this.volume=s.volume,this.sampleRate=s.targetSampleRate}localFileReader;samples;conf;volume=1;sampleRate;setVolume(t){this.volume=t,this.reset()}decoder=null;curAborter={abort:!1,st:performance.now()};find=async t=>{const e=t<=this.timestamp||t-this.timestamp>1e5;(this.decoder==null||this.decoder.state==="closed"||e)&&this.reset(),e&&(this.timestamp=t,this.decCursorIdx=ks(t,this.samples)),this.curAborter.abort=!0;const i=t-this.timestamp;this.timestamp=t,this.curAborter={abort:!1,st:performance.now()};const s=await this.parseFrame(Math.ceil(i*(this.sampleRate/1e6)),this.decoder,this.curAborter);return this.sleepCnt=0,s};timestamp=0;decCursorIdx=0;pcmData={frameCnt:0,data:[]};sleepCnt=0;parseFrame=async(t,e=null,i)=>{if(e==null||i.abort||e.state==="closed"||t===0)return[];const s=this.pcmData.frameCnt-t;if(s>0)return s<H.sampleRate/10&&this.startDecode(e),he(this.pcmData,t);if(e.decoding){if(performance.now()-i.st>6e4)return console.warn("[Video.tick] Audio decode wait exceeded 60s, using the PCM decoded so far",this.getState()),this.pcmData.frameCnt>0?he(this.pcmData,this.pcmData.frameCnt):[];this.sleepCnt+=1,await Me(15)}else{if(this.decCursorIdx>=this.samples.length-1)return he(this.pcmData,this.pcmData.frameCnt);this.startDecode(e)}return this.parseFrame(t,e,i)};startDecode=t=>{if(t.decodeQueueSize>10)return;const i=[];let s=this.decCursorIdx;for(;s<this.samples.length;){const r=this.samples[s];if(s+=1,!r.deleted&&(i.push(r),i.length>=10))break}this.decCursorIdx=s,t.decode(i.map(r=>new EncodedAudioChunk({type:"key",timestamp:r.cts,duration:r.duration,data:r.data})))};reset=()=>{this.timestamp=0,this.decCursorIdx=0,this.pcmData={frameCnt:0,data:[]},this.decoder?.close(),this.decoder=Rs(this.conf,{resampleRate:H.sampleRate,volume:this.volume},t=>{this.pcmData.data.push(t),this.pcmData.frameCnt+=t[0].length})};getState=()=>({time:this.timestamp,decState:this.decoder?.state,decQSize:this.decoder?.decodeQueueSize,decCursorIdx:this.decCursorIdx,sampleLen:this.samples.length,pcmLen:this.pcmData.frameCnt,clipIdCnt:le,sleepCnt:this.sleepCnt,memInfo:ii()});destroy=()=>{this.decoder=null,this.curAborter.abort=!0,this.pcmData={frameCnt:0,data:[]},this.localFileReader.close()}}function Rs(l,t,e){let i=0,s=0;const r=h=>{if(s+=1,h.length!==0){if(t.volume!==1)for(const d of h)for(let u=0;u<d.length;u++)d[u]*=t.volume;h.length===1&&(h=[h[0],h[0]]),e(h)}},o=Ms(r),a=t.resampleRate!==l.sampleRate;let n=new AudioDecoder({output:h=>{const d=Ae(h);a?o(()=>Ei(d,h.sampleRate,{rate:t.resampleRate,chanCount:h.numberOfChannels})):r(d),h.close()},error:h=>{h.message.includes("Codec reclaimed due to inactivity")||c("Video AudioDecoder err",h)}});n.configure(l);function c(h,d){const u=`${h}: ${d.message}, state: ${JSON.stringify({qSize:n.decodeQueueSize,state:n.state,inputCnt:i,outputCnt:s,decoderConf:l,opts:t})}`;throw Y.error(u),Error(u)}return{decode(h){i+=h.length;try{for(const d of h)n.decode(d)}catch(d){c("decode audio chunk error",d)}},close(){n.state!=="closed"&&n.close()},get decoding(){return i>s&&n.decodeQueueSize>0},get state(){return n.state},get decodeQueueSize(){return n.decodeQueueSize}}}function Ms(l){const t=[];let e=0;function i(o,a){t[a]=o,s()}function s(){const o=t[e];o!=null&&(l(o),e+=1,s())}let r=0;return o=>{const a=r;r+=1,o().then(n=>i(n,a)).catch(n=>i(n,a))}}function he(l,t){const e=[new Float32Array(t),new Float32Array(t)];let i=0,s=0;for(;s<l.data.length;){const[r,o]=l.data[s];if(i+r.length>t){const a=t-i;e[0].set(r.subarray(0,a),i),e[1].set(o.subarray(0,a),i),l.data[s][0]=r.subarray(a,r.length),l.data[s][1]=o.subarray(a,o.length);break}else e[0].set(r,i),e[1].set(o,i),i+=r.length,s++}return l.data=l.data.slice(s),l.frameCnt-=t,e}async function Os(l,t){const e=l[0],i=l.at(-1);if(i==null)return[];const s=i.offset+i.size-e.offset;if(s<3e7){const r=new Uint8Array(await t.read(s,{at:e.offset}));return l.map(o=>{const a=o.offset-e.offset;return new EncodedVideoChunk({type:o.is_sync?"key":"delta",timestamp:o.cts,duration:o.duration,data:r.subarray(a,a+o.size)})})}return await Promise.all(l.map(async r=>new EncodedVideoChunk({type:r.is_sync?"key":"delta",timestamp:r.cts,duration:r.duration,data:await t.read(r.size,{at:r.offset})})))}function Es(l,t,e){if(l.state==="configured"){for(let i=0;i<t.length;i++)l.decode(t[i]);l.flush().catch(i=>{if(!(i instanceof Error))throw i;if(i.message.includes("Decoding error")&&e.onDecodingError!=null){e.onDecodingError(i);return}if(!i.message.includes("Aborted due to close"))throw i})}}function Ds(l,t){if(t!=="avc1"&&t!=="hvc1")return 0;const e=new DataView(l.buffer);for(let i=0;i<l.byteLength-4;){if(t==="avc1"){const s=e.getUint8(i+4)&31;if(s===5||s===7||s===8)return i}else if(t==="hvc1"){const s=e.getUint8(i+4)>>1&63;if(s===19||s===20||s===32||s===33||s===34)return i}i+=e.getUint32(i)+4}return-1}const Ps=2e5;function Is(l){let t=null,e=0;for(const i of l)if(!i.deleted){if(i.is_sync&&e++,e>=2)break;i.is_sync&&(t==null||i.cts<t.cts)&&(t=i)}t!=null&&t.cts<Ps&&(t.duration+=t.cts,t.cts=0)}function ii(){try{const l=performance.memory;return{jsHeapSizeLimit:l.jsHeapSizeLimit,totalJSHeapSize:l.totalJSHeapSize,usedJSHeapSize:l.usedJSHeapSize,percentUsed:(l.usedJSHeapSize/l.jsHeapSizeLimit).toFixed(3),percentTotal:(l.totalJSHeapSize/l.jsHeapSizeLimit).toFixed(3)}}catch{return{}}}class ht extends $e{type="Text";get width(){return this._width}set width(t){Math.abs(this.width-t)<.1||(this._width=t,this._targetWidth=t,this.refreshText().then(()=>{this._explicitHeight?this.emit("propsChange",{width:t}):this.emit("propsChange",{width:t,height:this.height})}))}get height(){return this._height}_explicitHeight=!1;get isExplicitHeight(){return this._explicitHeight}resetHeightToAuto(){this._explicitHeight=!1,this._height=0,this.refreshText().then(()=>{this.emit("propsChange",{height:this.height})})}set height(t){if(Math.abs(this.height-t)<.1)return;const e=t;this._height=t,this.refreshText().then(()=>{const i=this.meta.height,r=e-i<-5;this._explicitHeight=e>0&&(r||this._explicitHeight),this.emit("propsChange",{height:this.height})})}get text(){return this._text}set text(t){this._text!==t&&(this._text=t,this.originalOpts&&this.textStyle&&this.refreshText().then(()=>{this.emit("propsChange",{text:t})}))}get style(){return{fontSize:this.originalOpts.fontSize,fontFamily:this.originalOpts.fontFamily,fontUrl:this.originalOpts.fontUrl,fontWeight:this.originalOpts.fontWeight,fontStyle:this.originalOpts.fontStyle,color:this.originalOpts.color,align:this.originalOpts.align,stroke:this.originalOpts.stroke?typeof this.originalOpts.stroke=="object"?{color:this.originalOpts.stroke.color,width:this.originalOpts.stroke.width,join:this.originalOpts.stroke.join,cap:this.originalOpts.stroke.cap,miterLimit:this.originalOpts.stroke.miterLimit}:{color:this.originalOpts.stroke,width:this.originalOpts.strokeWidth??0}:void 0,shadow:this.originalOpts.shadow?{color:this.originalOpts.shadow.color??"#000000",alpha:this.originalOpts.shadow.alpha??.5,blur:this.originalOpts.shadow.blur??4,offsetX:this.originalOpts.shadow.offsetX??0,offsetY:this.originalOpts.shadow.offsetY??0}:void 0,wordWrap:this.originalOpts.wordWrap,wordWrapWidth:this.originalOpts.wordWrapWidth,lineHeight:this.originalOpts.lineHeight,letterSpacing:this.originalOpts.letterSpacing,textCase:this.originalOpts.textCase,textDecoration:this.originalOpts.textDecoration,background:this.originalOpts.background}}set style(t){this.updateStyle(t)}get textAlign(){return this.originalOpts.align||this.originalOpts.textAlign||"left"}set textAlign(t){this.updateStyle({align:t})}get verticalAlign(){return this.originalOpts.verticalAlign||this.originalOpts.textDecoration||"top"}set verticalAlign(t){["underline","overline","strikethrough","line-through"].includes(t)?(this.updateStyle({textDecoration:t==="strikethrough"?"line-through":t}),this.originalOpts.verticalAlign=t):this.updateStyle({verticalAlign:t})}get textCase(){return this.originalOpts.textCase||"none"}set textCase(t){this.updateStyle({textCase:t})}get underline(){return this.originalOpts.textDecoration==="underline"}set underline(t){this.updateStyle({textDecoration:t?"underline":"none"})}get overline(){return this.originalOpts.textDecoration==="overline"}set overline(t){this.updateStyle({textDecoration:t?"overline":"none"})}get linethrough(){return this.originalOpts.textDecoration==="line-through"}set linethrough(t){this.updateStyle({textDecoration:t?"line-through":"none"})}_targetWidth=0;_wordCache=[];_measuredTextHeight=0;_lineHeightMultiplier=1;_fontSize=40;_textOnlyContainer=null;constructor(t,e={},i){super(),this.originalOpts={...e},this._text=t,i&&this.setRenderer(i),this._buildTextStyles(),this.ready=(async()=>(await this.refreshText(),{...this.meta}))()}_onAfterRefresh(t,e,i,s,r,o){this._populateWordCache(t,e,i,s,r,o)}async clone(){await this.ready;const t=this.textStyle,e=this.originalOpts||{},i=n=>{if(n!=null){if(typeof n=="number")return n;if(n instanceof m.Color)return n.toNumber()}},{stroke:s,strokeWidth:r}=this._cloneStrokeOpts(i),o={fontSize:e.fontSize??t.fontSize,fontFamily:e.fontFamily??(Array.isArray(t.fontFamily)?t.fontFamily[0]:typeof t.fontFamily=="string"?t.fontFamily:"Roboto"),fontUrl:e.fontUrl,fontWeight:e.fontWeight??t.fontWeight,fontStyle:e.fontStyle??t.fontStyle,align:e.align??(t.align==="justify"?"left":t.align),textCase:e.textCase,textDecoration:e.textDecoration,color:this._cloneColorOpts(i),stroke:s,strokeWidth:r,shadow:this._cloneShadowOpts(i)};if(e.wordWrap!==void 0?(o.wordWrap=e.wordWrap,o.wordWrapWidth=e.wordWrapWidth):t.wordWrap&&(o.wordWrap=t.wordWrap,o.wordWrapWidth=t.wordWrapWidth),e.background!==void 0&&(o.background=e.background),e.lineHeight!==void 0)o.lineHeight=e.lineHeight;else if(t.lineHeight!==void 0){const n=o.fontSize??t.fontSize??40;o.lineHeight=t.lineHeight/n}e.letterSpacing!==void 0?o.letterSpacing=e.letterSpacing:t.letterSpacing!==void 0&&(o.letterSpacing=t.letterSpacing);const a=new ht(this.text,o);return await a.ready,this.copyStateTo(a),a.id=this.id,a.effects=[...this.effects],a}async updateStyle(t){const e=this._normalizeStyleOpts(t);this.originalOpts={...this.originalOpts,...e},this._buildTextStyles(),await this.refreshText(),this.emit("propsChange",t)}_populateWordCache(t,e,i,s,r,o){this._wordCache=this.wordTexts.map((a,n)=>({text:t[n],width:Math.ceil(a.getLocalBounds().width||a.width),height:Math.ceil(a.getLocalBounds().height||a.height),textObj:a})),this._spaceWidth=i,this._measuredTextHeight=s,this._lineHeightMultiplier=r,this._fontSize=o,this._textOnlyContainer=e}updateLayoutForWidth(t){if(!this._wordCache.length||!this._textOnlyContainer||!this.pixiTextContainer)return this._targetWidth=t,this.refreshText(),{width:this.width,height:this.height};const e=this.originalOpts.background?.paddingX??8,i=this.originalOpts.background?.paddingY??4,s=this._lineHeightMultiplier,o=this._fontSize*s,a=this._measuredTextHeight,n=this._spaceWidth,c=Math.max(1,t-e*2),h=[];let d=[],u=0,f=0;for(let A=0;A<this._wordCache.length;A++){const E=this._wordCache[A],P=E.width,R=E.height,B=u+(u>0?n:0)+P;B<=c||d.length===0?(d.push(A),u=B,f=Math.max(f,R)):(d.length>0&&h.push({wordIndices:d,width:u,height:Math.max(f,o)}),d=[A],u=P,f=R)}d.length>0&&h.push({wordIndices:d,width:u,height:Math.max(f,o)});const p=a+i*2;h.forEach(A=>{A.height=Math.max(A.height,p)});let g=0,v=0;h.forEach(A=>{g=Math.max(g,A.width),v+=A.height});const x=g+e*2,w=v,T=Math.max(x,t),y=w,C=this.textAlign,k=this.originalOpts.verticalAlign||"top";let O=0;k==="center"?O=(y-w)/2:k==="bottom"&&(O=y-w);let F=O;h.forEach(A=>{let E=0;C==="center"?E=(T-A.width)/2:C==="right"?E=T-A.width-e*2:E=e,A.wordIndices.forEach((P,R)=>{const B=this._wordCache[P];B.textObj&&(B.textObj.x=Math.round(E),B.textObj.y=Math.round(F+(A.height-a)/2-9)),E+=B.width+(R<A.wordIndices.length-1?n:0)}),F+=A.height}),this._meta.width=T,this._meta.height=y,this._width=T,this._height=y,this._targetWidth=T;const b=T+(this.renderTexturePadding??0)*2,S=y+(this.renderTexturePadding??0)*2;return this.renderTexture&&(Math.abs(this.renderTexture.width-b)>10||Math.abs(this.renderTexture.height-S)>10)&&this.getTexture(),{width:T,height:y}}toJSON(t=!1){const e=super.toJSON(t),i={};return this.originalOpts.fontSize!==void 0&&(i.fontSize=this.originalOpts.fontSize),this.originalOpts.fontFamily!==void 0&&(i.fontFamily=this.originalOpts.fontFamily),this.originalOpts.fontUrl!==void 0&&(i.fontUrl=this.originalOpts.fontUrl),this.originalOpts.fontWeight!==void 0&&(i.fontWeight=this.originalOpts.fontWeight),this.originalOpts.fontStyle!==void 0&&(i.fontStyle=this.originalOpts.fontStyle),this.originalOpts.color!==void 0&&(i.color=this.originalOpts.color),this.originalOpts.align!==void 0&&(i.align=this.originalOpts.align),this.originalOpts.wordWrap!==void 0&&(i.wordWrap=this.originalOpts.wordWrap),this.originalOpts.wordWrapWidth!==void 0&&(i.wordWrapWidth=this.originalOpts.wordWrapWidth),this.originalOpts.lineHeight!==void 0&&(i.lineHeight=this.originalOpts.lineHeight),this.originalOpts.letterSpacing!==void 0&&(i.letterSpacing=this.originalOpts.letterSpacing),this.originalOpts.background!==void 0&&(i.background=this.originalOpts.background),this.originalOpts.stroke&&(typeof this.originalOpts.stroke=="object"?i.stroke={color:this.originalOpts.stroke.color,width:this.originalOpts.stroke.width,join:this.originalOpts.stroke.join,cap:this.originalOpts.stroke.cap,miterLimit:this.originalOpts.stroke.miterLimit}:i.stroke={color:this.originalOpts.stroke,width:this.originalOpts.strokeWidth??0}),this.originalOpts.shadow&&(i.shadow={color:this.originalOpts.shadow.color??"#000000",alpha:this.originalOpts.shadow.alpha??.5,blur:this.originalOpts.shadow.blur??4,offsetX:this.originalOpts.shadow.offsetX??0,offsetY:this.originalOpts.shadow.offsetY??0}),{...e,type:"Text",text:this.text,style:i,id:this.id,effects:this.effects}}static async fromObject(t){if(t.type!=="Text")throw new Error(`Expected Text, got ${t.type}`);const e=t.text||"",i=t.style||{},s={};i.fontSize!==void 0&&(s.fontSize=i.fontSize),i.fontFamily!==void 0&&(s.fontFamily=i.fontFamily),i.fontUrl!==void 0&&(s.fontUrl=i.fontUrl),i.fontWeight!==void 0&&(s.fontWeight=i.fontWeight),i.fontStyle!==void 0&&(s.fontStyle=i.fontStyle),i.color!==void 0&&(s.color=i.color),i.align!==void 0&&(s.align=i.align),i.wordWrap!==void 0&&(s.wordWrap=i.wordWrap),i.wordWrapWidth!==void 0&&(s.wordWrapWidth=i.wordWrapWidth),i.lineHeight!==void 0&&(s.lineHeight=i.lineHeight),i.letterSpacing!==void 0&&(s.letterSpacing=i.letterSpacing),i.background!==void 0&&(s.background=i.background),i.stroke&&(i.stroke.join||i.stroke.cap||i.stroke.miterLimit!==void 0?s.stroke={color:i.stroke.color,width:i.stroke.width,join:i.stroke.join,cap:i.stroke.cap,miterLimit:i.stroke.miterLimit}:(s.stroke=i.stroke.color,s.strokeWidth=i.stroke.width)),i.shadow&&(s.shadow={color:i.shadow.color,alpha:i.shadow.alpha,blur:i.shadow.blur,offsetX:i.shadow.offsetX??0,offsetY:i.shadow.offsetY??0});const r=new ht(e,s);return K.deserializeBaseProperties(r,t),t.effects&&(r.effects=t.effects),await r.ready,r}getVisibleHandles(){return["mr","mb","br","rot"]}}function Bs(l){return l.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^./,t=>t.toUpperCase())}class dt extends K{type="Effect";ready;_meta={duration:5e6,width:0,height:0};get meta(){return{...this._meta}}id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;effectKey;values={};constructor(t){super(),this.effectKey=t,this.name=Bs(t),this.ready=Promise.resolve(this._meta),this.duration=this._meta.duration}async clone(){const t=new dt(this.effectKey);return this.copyStateTo(t),t.values={...this.values},t}async tick(t){return{video:void 0,state:"success"}}async split(t){const e=await this.clone(),i=await this.clone();return[e,i]}toJSON(t=!1){return{id:this.id,type:"Effect",name:this.name,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate},effectKey:this.effectKey,values:this.values}}static async fromObject(t){if(t.type!=="Effect")throw new Error(`Expected Effect, got ${t.type}`);const e=t.effectKey;if(!e)throw new Error("Missing effectKey in Effect JSON");const i=new dt(e);return i.values=t.values||{},K.deserializeBaseProperties(i,t),await i.ready,i}}class zt extends K{type="Placeholder";meta={width:0,height:0,duration:0};constructor(t,e={},i="Placeholder"){super(),this.type=i,this.src=t,this.meta={width:e.width||1280,height:e.height||720,duration:e.duration||5e6},this.width=this.meta.width,this.height=this.meta.height,this.duration=this.meta.duration,this.trim.to=this.duration,this.display.to=this.display.from+this.duration,this.ready=Promise.resolve(this.meta)}canvas=null;ctx=null;animationRafId=null;renderPending=!1;async tick(t){this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.width=this.meta.width,this.canvas.height=this.meta.height,this.ctx=this.canvas.getContext("2d"));const{canvas:e,ctx:i}=this;if(i){const{width:r,height:o}=e;if(r>0&&o>0){i.fillStyle="#1e1e1e",i.fillRect(0,0,r,o);const a=r/2,n=o/2,c=100,h=c/4,d=performance.now()/2e3*Math.PI*2;i.save();const u=i.createConicGradient(d,a,n);u.addColorStop(0,"#ffffff"),u.addColorStop(.2,"#ffffff"),u.addColorStop(.5,"rgba(255, 255, 255, 0.4)"),u.addColorStop(.8,"rgba(255, 255, 255, 0.1)"),u.addColorStop(1,"rgba(255, 255, 255, 0)"),i.strokeStyle=u,i.lineWidth=h,i.lineCap="round",i.beginPath(),i.arc(a,n,c,d,d+Math.PI*1.5),i.stroke(),i.restore(),i.strokeStyle="#333333",i.lineWidth=10,i.strokeRect(0,0,r,o)}}if(this.renderPending=!1,this.animationRafId===null){const r=()=>{if(this.destroyed){this.animationRafId=null;return}this.renderPending||(this.renderPending=!0,this.emit("request-render")),this.animationRafId=requestAnimationFrame(r)};this.animationRafId=requestAnimationFrame(r)}return{video:e.width>0&&e.height>0?await createImageBitmap(e):null,state:"success",audio:[]}}async clone(){const t=new zt(this.src,this.meta);return this.copyStateTo(t),t.id=this.id,t}async split(t){const e=await this.clone(),i=await this.clone();return e.trim.to=t+this.trim.from,i.trim.from=t+this.trim.from,e.duration=e.trim.to-e.trim.from,i.duration=i.trim.to-i.trim.from,e.display.to=e.display.from+e.duration,i.display.from=e.display.to,i.display.to=i.display.from+i.duration,[e,i]}static async fromObject(t){if(t.type!=="Placeholder")throw new Error(`Expected Placeholder, got ${t.type}`);const e=t.timing||{display:t.display||{},trim:t.trim||{},duration:t.duration??0,playbackRate:t.playbackRate??1},i=t.transform?.width??t.width??0,s=t.transform?.height??t.height??0,r=new zt(t.src,{width:i,height:s,duration:e.duration});return K.deserializeBaseProperties(r,t),await r.ready,r}}class tt extends K{type="Transition";ready;_meta={duration:2e6,width:0,height:0};get meta(){return{...this._meta}}id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;transitionKey;fromClipId=null;toClipId=null;values={};constructor(t){super(),this.transitionKey=t,this.ready=Promise.resolve(this._meta),this.duration=this._meta.duration}async clone(){const t=new tt(this.transitionKey);return this.copyStateTo(t),t.fromClipId=this.fromClipId,t.toClipId=this.toClipId,t.values=JSON.parse(JSON.stringify(this.values)),t}async tick(t){return{video:void 0,state:"success"}}async split(t){const e=await this.clone(),i=await this.clone();return[e,i]}toJSON(t=!1){return{id:this.id,type:"Transition",name:this.name,timing:{display:{from:this.timing.display.from,to:this.timing.display.to},trim:{from:this.timing.trim.from,to:this.timing.trim.to},duration:this.timing.duration,playbackRate:this.timing.playbackRate},transitionKey:this.transitionKey,fromClipId:this.fromClipId,toClipId:this.toClipId,...Object.keys(this.values).length>0&&{values:this.values}}}static async fromObject(t){if(t.type!=="Transition")throw new Error(`Expected Transition, got ${t.type}`);const e=t.transitionKey;if(!e)throw new Error("Missing transitionKey in Transition JSON");const i=new tt(e);return i.fromClipId=t.fromClipId||null,i.toClipId=t.toClipId||null,i.values=t.values||{},K.deserializeBaseProperties(i,t),await i.ready,i}}class Lt extends K{type="Shape";shapeType;graphics;_meta;renderTexture=null;externalRenderer=null;constructor(t){super(),this.shapeType=t.shapeType,this.id=$t.nanoid(),this.name=`${t.shapeType} Shape`,this.src=`shape://${t.shapeType}`,this.externalRenderer=t.renderer??null,this.width=t.width??200,this.height=t.height??200,this.graphics=new m.Graphics,this._meta={width:this.width,height:this.height,duration:0},this.style={fill:t.fill??"#3b82f6",fillOpacity:t.fillOpacity??1,stroke:t.stroke??{color:"#1e40af",width:2},borderRadius:t.borderRadius??0},this.ready=Promise.resolve(this._meta)}async getRenderer(){if(this.externalRenderer!=null)return this.externalRenderer;throw new Error("ShapeClip: No renderer available. Provide a renderer via options.renderer or setRenderer().")}setRenderer(t){this.externalRenderer=t}async getRenderTexture(){return this.renderTexture==null&&(this.renderTexture=m.RenderTexture.create({width:Math.ceil(this.width),height:Math.ceil(this.height)})),(this.renderTexture.width!==Math.ceil(this.width)||this.renderTexture.height!==Math.ceil(this.height))&&this.renderTexture.resize(Math.ceil(this.width),Math.ceil(this.height)),this.renderTexture}get meta(){return this._meta}drawShape(){const t=this.style;if(this.graphics.clear(),this.drawRectangle(t),t.fill){const e=this.hexToNumber(t.fill);this.graphics.fill({color:e,alpha:t.fillOpacity??1})}if(t.stroke){const e=this.hexToNumber(t.stroke.color);this.graphics.stroke({color:e,width:t.stroke.width,alpha:1})}}drawRectangle(t){const e=t.borderRadius??0;e>0?this.graphics.roundRect(-this.width/2,-this.height/2,this.width,this.height,e):this.graphics.rect(-this.width/2,-this.height/2,this.width,this.height)}hexToNumber(t){const e=t.startsWith("#")?t.slice(1):t;return parseInt(e,16)}async tick(t){await this.ready;const e=await this.getRenderTexture();this.drawShape();const i=await this.getRenderer();this.graphics.x=this.width/2,this.graphics.y=this.height/2,i.render({container:this.graphics,target:e});const s=e.source?.resource?.source;let r;if(s instanceof HTMLCanvasElement||s instanceof OffscreenCanvas)r=await createImageBitmap(s);else{const a=i.extract.canvas(e);if(a instanceof HTMLCanvasElement||a instanceof OffscreenCanvas)r=await createImageBitmap(a);else throw new Error("Unable to extract canvas from render texture")}return{video:r,state:"success"}}async clone(){const t=new Lt({shapeType:this.shapeType,width:this.width,height:this.height,fill:this.style.fill,fillOpacity:this.style.fillOpacity,stroke:this.style.stroke,borderRadius:this.style.borderRadius});return t.left=this.left,t.top=this.top,t.angle=this.angle,t.opacity=this.opacity,t.zIndex=this.zIndex,t.display={...this.display},t.duration=this.duration,t.timing={...this.timing},t}async split(t){const e=await this.clone(),i=await this.clone();return[e,i]}toJSON(t=!1){return{...super.toJSON(t),shapeType:this.shapeType}}set style(t){super.style=t,this.graphics&&this.drawShape()}get style(){return super.style}set width(t){super.width=t,this.graphics&&this.drawShape(),this.renderTexture&&this.renderTexture.resize(Math.ceil(this.width),Math.ceil(this.height))}get width(){return super.width}set height(t){super.height=t,this.graphics&&this.drawShape(),this.renderTexture&&this.renderTexture.resize(Math.ceil(this.width),Math.ceil(this.height))}get height(){return super.height}static async fromObject(t){const e=new Lt({shapeType:t.shapeType,width:t.transform?.width,height:t.transform?.height,fill:t.style?.fill,fillOpacity:t.style?.fillOpacity,stroke:t.style?.stroke,borderRadius:t.style?.borderRadius});return K.deserializeBaseProperties(e,t),e}}const Ns=["#6A5AF9","#B14EFF","#FF7A7A"];class Ht extends K{type="Backdrop";backdropType;container;_meta;renderTexture=null;externalRenderer=null;bgGraphics=null;meshContainer=null;meshCircles=[];blobsContainer=null;blobCircles=[];noiseSprite=null;noiseTexture=null;constructor(t){super(),this.backdropType=t.backdropType,this.id=$t.nanoid(),this.name=`${t.backdropType} Backdrop`,this.src=`backdrop://${t.backdropType}`,this.externalRenderer=t.renderer??null,this.width=t.width??1280,this.height=t.height??720,this.container=new m.Container,this.container.label="BackdropContainer",this._meta={width:this.width,height:this.height,duration:1/0},this.style={backdropType:t.backdropType,colors:t.colors??Ns,gradientType:t.gradientType??"linear",speed:t.speed??1,scale:t.scale??1,density:t.density??8},this.ready=Promise.resolve(this._meta),this.rebuildBackdrop()}setRenderer(t){this.externalRenderer=t}async getRenderer(){if(this.externalRenderer!=null)return this.externalRenderer;throw new Error("BackdropClip: No renderer available. Provide a renderer via options.renderer or setRenderer().")}async getRenderTexture(){const t=Math.max(1,Math.ceil(this.width)),e=Math.max(1,Math.ceil(this.height));return this.renderTexture==null&&(this.renderTexture=m.RenderTexture.create({width:t,height:e})),(this.renderTexture.width!==t||this.renderTexture.height!==e)&&this.renderTexture.resize(t,e),this.renderTexture}get meta(){return this._meta}rebuildBackdrop(){this.container.removeChildren(),this.bgGraphics=null,this.meshContainer=null,this.meshCircles=[],this.blobsContainer=null,this.blobCircles=[],this.noiseSprite=null;const t=this.style,e=t.backdropType||this.backdropType;this.backdropType=e;const i=t.colors||["#6A5AF9"],s=i.map(o=>$(o)??16777215),r=()=>{this.bgGraphics=new m.Graphics,this.bgGraphics.rect(0,0,this.width,this.height).fill({color:s[0]}),this.container.addChild(this.bgGraphics)};if(e==="solid")r();else if(e==="gradient")if((t.gradientType??"linear")==="radial"){const o=document.createElement("canvas");o.width=Math.max(1,Math.ceil(this.width)),o.height=Math.max(1,Math.ceil(this.height));const a=o.getContext("2d"),n=this.width/2,c=this.height/2,h=Math.min(this.width,this.height)/2,d=a.createRadialGradient(n,c,0,n,c,h);i.forEach((u,f)=>d.addColorStop(f/Math.max(1,i.length-1),u)),a.fillStyle=d,a.fillRect(0,0,this.width,this.height),this.container.addChild(new m.Sprite(m.Texture.from(o)))}else{this.bgGraphics=new m.Graphics;const o=new m.FillGradient(0,0,this.width,this.height);s.forEach((a,n)=>o.addColorStop(n/Math.max(1,s.length-1),a)),this.bgGraphics.rect(0,0,this.width,this.height).fill(o),this.container.addChild(this.bgGraphics)}else if(e==="meshGradient"){r(),this.meshContainer=new m.Container,this.meshContainer.label="MeshContainer";const o=Math.max(3,s.length),a=Math.max(this.width,this.height)*.35;this.meshContainer.filters=[new m.BlurFilter({strength:a})];for(let n=0;n<o;n++){const c=new m.Graphics,h=Math.max(this.width,this.height)*(.35+Math.random()*.15);c.circle(0,0,h).fill({color:s[n%s.length],alpha:.8});const d={graphics:c,baseX:this.width*(.2+Math.random()*.6),baseY:this.height*(.2+Math.random()*.6),phase:Math.random()*Math.PI*2,speedX:.3+Math.random()*.4,speedY:.3+Math.random()*.4,radius:h};c.x=d.baseX,c.y=d.baseY,this.meshContainer.addChild(c),this.meshCircles.push(d)}this.container.addChild(this.meshContainer)}else if(e==="floatingBlobs"){r(),this.blobsContainer=new m.Container,this.blobsContainer.label="BlobsContainer";const o=Math.max(4,t.density??8),a=s.slice(1).length>0?s.slice(1):s,n=Math.max(this.width,this.height)*.08;this.blobsContainer.filters=[new m.BlurFilter({strength:n})];for(let c=0;c<o;c++){const h=new m.Graphics,d=Math.max(this.width,this.height)*(.1+Math.random()*.12);h.circle(0,0,d).fill({color:a[c%a.length],alpha:.6});const u={graphics:h,baseX:this.width*Math.random(),baseY:this.height*Math.random(),phase:Math.random()*Math.PI*2,speedX:.2+Math.random()*.3,speedY:.2+Math.random()*.3,radius:d};h.x=u.baseX,h.y=u.baseY,this.blobsContainer.addChild(h),this.blobCircles.push(u)}this.container.addChild(this.blobsContainer)}else if(e==="noise"){if(r(),!this.noiseTexture){const o=document.createElement("canvas");o.width=256,o.height=256;const a=o.getContext("2d"),n=a.createImageData(256,256),c=n.data;for(let h=0;h<c.length;h+=4){const d=Math.floor(Math.random()*255);c[h]=d,c[h+1]=d,c[h+2]=d,c[h+3]=18}a.putImageData(n,0,0),this.noiseTexture=m.Texture.from(o)}this.noiseSprite=new m.TilingSprite({texture:this.noiseTexture,width:this.width,height:this.height}),this.noiseSprite.tileScale.set(t.scale??1),this.container.addChild(this.noiseSprite)}}async tick(t){await this.ready;const e=await this.getRenderTexture(),i=await this.getRenderer(),s=t/1e6*(this.style.speed??1);if(this.backdropType==="meshGradient"&&this.meshCircles.length>0){const a=this.style.scale??1;for(const n of this.meshCircles){const c=s*n.speedX+n.phase,h=s*n.speedY+n.phase*1.5;n.graphics.x=n.baseX+Math.cos(c)*(this.width*.25*a),n.graphics.y=n.baseY+Math.sin(h)*(this.height*.25*a)}}if(this.backdropType==="floatingBlobs"&&this.blobCircles.length>0){const a=this.style.scale??1;for(const n of this.blobCircles){const c=s*n.speedX+n.phase,h=s*n.speedY+n.phase*1.3;n.graphics.x=(n.baseX+Math.sin(c)*(this.width*.35*a)+this.width)%this.width,n.graphics.y=(n.baseY+Math.cos(h)*(this.height*.35*a)+this.height)%this.height}}this.backdropType==="noise"&&this.noiseSprite&&(this.noiseSprite.tilePosition.x=Math.random()*256,this.noiseSprite.tilePosition.y=Math.random()*256),i.render({container:this.container,target:e});const r=e.source?.resource?.source;let o;if(r instanceof HTMLCanvasElement||r instanceof OffscreenCanvas)o=await createImageBitmap(r);else{const a=i.extract.canvas(e);if(a instanceof HTMLCanvasElement||a instanceof OffscreenCanvas)o=await createImageBitmap(a);else throw new Error("Unable to extract canvas from render texture")}return{video:o,state:"success"}}async clone(){const t=new Ht({backdropType:this.backdropType,width:this.width,height:this.height,colors:this.style.colors,gradientType:this.style.gradientType,speed:this.style.speed,scale:this.style.scale,density:this.style.density});return t.left=this.left,t.top=this.top,t.angle=this.angle,t.opacity=this.opacity,t.zIndex=this.zIndex,t.display={...this.display},t.duration=this.duration,t.timing={...this.timing},t}async split(t){return[await this.clone(),await this.clone()]}toJSON(t=!1){return{...super.toJSON(t),backdropType:this.backdropType}}set style(t){super.style=t,this.container&&this.rebuildBackdrop()}get style(){return super.style}set width(t){super.width=t,this.container&&this.rebuildBackdrop(),this.renderTexture?.resize(Math.max(1,Math.ceil(this.width)),Math.max(1,Math.ceil(this.height)))}get width(){return super.width}set height(t){super.height=t,this.container&&this.rebuildBackdrop(),this.renderTexture?.resize(Math.max(1,Math.ceil(this.width)),Math.max(1,Math.ceil(this.height)))}get height(){return super.height}static async fromObject(t){const e=new Ht({backdropType:t.backdropType,width:t.transform?.width,height:t.transform?.height,colors:t.style?.colors,gradientType:t.style?.gradientType,speed:t.style?.speed,scale:t.style?.scale,density:t.style?.density});return K.deserializeBaseProperties(e,t),e}}class rt{static registry=new Map;static register(t,e){this.registry.set(t,e)}static get(t){return this.registry.get(t)}static getRegisteredTypes(){return Array.from(this.registry.keys())}}rt.register("Video",ct),rt.register("Audio",mt),rt.register("Image",Nt),rt.register("Text",ht),rt.register("Caption",yt),rt.register("Effect",dt),rt.register("Transition",tt),rt.register("Placeholder",zt),rt.register("Shape",Lt),rt.register("Backdrop",Ht);function si(l,t){let e=!1;async function i(){const s=l.getReader();for(;!e;){const{value:r,done:o}=await s.read();if(o){t.onDone();return}await t.onChunk(r)}s.releaseLock(),await l.cancel()}return i().catch(console.error),()=>{e=!0}}class ri{readable;writable;inputBufOffset=0;isStreamCancelled=!1;constructor(){const t=it.mp4box.createFile();this.readable=new ReadableStream({start:e=>this.initMP4Box(t,e),cancel:()=>{this.isStreamCancelled=!0,t.stop()}},{highWaterMark:50}),this.writable=new WritableStream({write:async e=>{if(this.isStreamCancelled)throw new Error("Stream cancelled");const i=e.buffer;i.fileStart=this.inputBufOffset,this.inputBufOffset+=i.byteLength,t.appendBuffer(i)},close:()=>{t.flush(),t.stop(),t.onFlush?.()},abort:e=>{zs.error("SampleTransform writable aborted:",e),t.stop()}})}initMP4Box(t,e){t.onReady=s=>{[s.videoTracks[0],s.audioTracks[0]].forEach(r=>{r&&t.setExtractionOptions(r.id,r.video?"video":"audio",{nbSamples:100})}),e.enqueue({chunkType:"ready",data:{info:s,file:t}}),t.start()};const i={};t.onSamples=(s,r,o)=>{const a=o.map(n=>({...n}));e.enqueue({chunkType:"samples",data:{id:s,type:r,samples:a}}),i[s]=(i[s]??0)+o.length,t.releaseUsedSamples(s,i[s])},t.onFlush=()=>{e.close()},t.onError=s=>{e.error(new Error(`mp4box error: ${s}`))}}}const zs={error:(...l)=>console.error("[SampleTransform]",...l)};function Ls(l){let t=0;const e=l.boxes,i=[];let s=0;async function r(){const p=f(e,t);t=e.length,i.forEach(({track:g,id:v})=>{const x=g.samples.at(-1);x!=null&&(s=Math.max(s,x.cts+x.duration)),l.releaseUsedSamples(v,g.samples.length),g.samples=[]}),l.mdats=[],l.moofs=[],p!=null&&await h?.write(p)}let o=[];function a(){if(o.length>0)return!0;const p=e.findIndex(g=>g.type==="moov");if(p===-1)return!1;if(o=e.slice(0,p+1),t=p+1,i.length===0)for(let g=1;;g+=1){const v=l.getTrackById(g);if(v==null)break;i.push({track:v,id:g})}return!0}let n=0;const c=st.tmpfile();let h=null;const d=(async()=>{h=await c.createWriter(),n=self.setInterval(()=>{a()&&r()},100)})();let u=!1;return async()=>{if(u)throw Error("File exported");if(u=!0,await d,clearInterval(n),!a()||h==null)return null;l.flush(),await r(),await h?.close();const p=o.find(x=>x.type==="moov");if(p==null)return null;p.mvhd.duration=s;const g=st.tmpfile(),v=f(o,0);return await st.write(g,v.slice()),await st.write(g,c,{overwrite:!1}),await g.stream()};function f(p,g){if(g>=p.length)return null;const v=new it.mp4box.DataStream;for(let x=g;x<p.length;x++)p[x]!==null&&(p[x].write(v),delete p[x]);return new Uint8Array(v.buffer).slice()}}function Hs(l){const t=new ArrayBuffer(l.byteLength);l.copyTo(t);const e=l.timestamp;return{duration:l.duration??0,dts:e,cts:e,is_sync:l.type==="key",data:t}}async function oi(l){const t=it.mp4box.createFile(),e=Ls(t);await Gs(l,t);const i=await e();if(i==null)throw Error("Can not generate file from streams");return i}async function Gs(l,t){let e=0,i=0,s=0,r=0,o=0,a=0,n=null,c=null;for(const h of l){let d=null,u=null,f=null,p=null;if(await new Promise(async g=>{si(h.pipeThrough(new ri),{onDone:g,onChunk:async({chunkType:v,data:x})=>{if(v==="ready"){const{videoTrackConf:w,audioTrackConf:T}=ae(x.file,x.info);e===0&&w!=null&&(e=t.addTrack(w)),r===0&&T!=null&&(r=t.addTrack(T))}else if(v==="samples"){const{type:w,samples:T}=x,y=w==="video"?e:r,C=w==="video"?i:o,k=w==="video"?s:a;T.forEach(F=>{let b,S;w==="video"?(d===null&&(d=F.dts,u=F.cts),b=F.dts-d,S=F.cts-(u??0)):(f===null&&(f=F.dts,p=F.cts),b=F.dts-f,S=F.cts-(p??0)),t.addSample(y,new Uint8Array(F.data),{duration:F.duration,dts:b+C,cts:S+k,is_sync:F.is_sync})});const O=T.at(-1);if(O==null)return;w==="video"?n=O:w==="audio"&&(c=O)}}})}),n!=null&&d!==null&&u!==null){const g=n.dts-d+n.duration,v=n.cts-u+n.duration;i+=g,s+=v}if(c!=null&&n!=null){const g=c.timescale/n.timescale;o=Math.round(i*g),a=Math.round(s*g)}}}async function Us(l){return await oi([l])}function Ws(l){let t=[];const e=new AudioDecoder({output:i=>{t.push(i)},error:Y.error});return e.configure(l),{decode:async i=>{i.forEach(r=>{e.decode(new EncodedAudioChunk({type:r.is_sync?"key":"delta",timestamp:1e6*r.cts/r.timescale,duration:1e6*r.duration/r.timescale,data:r.data}))}),await e.flush();const s=t;return t=[],s},close:()=>{e.close()}}}function Vs(l,t){const e={codec:l.codec,sampleRate:l.sampleRate,numberOfChannels:l.numberOfChannels},i=new AudioEncoder({output:o=>{t(Hs(o))},error:o=>{Y.error("AudioEncoder error:",o,", config:",e)}});i.configure(e);let s=null;function r(o,a){return new AudioData({timestamp:a,numberOfChannels:l.numberOfChannels,numberOfFrames:o.length/l.numberOfChannels,sampleRate:l.sampleRate,format:"f32-planar",data:new Float32Array(o)})}return{encode:async(o,a)=>{s!=null&&i.encode(r(s.data,s.ts)),s={data:o,ts:a}},stop:async()=>{s!=null&&(Ys(s.data,l.numberOfChannels,l.sampleRate),i.encode(r(s.data,s.ts)),s=null),await i.flush(),i.close()}}}function Ys(l,t,e){const i=l.length-1,s=Math.min(e/2,i);for(let r=0;r<s;r++)for(let o=1;o<=t;o++)l[Math.floor(i/o)-r]*=r/s}function Qs(l,t){Y.info("mixinMP4AndAudio, opts:",{volume:t.volume,loop:t.loop});const e=it.mp4box.createFile();let i,s=0,r=0;const o=e.boxes;let a=!1;const n=()=>{if(!a)if(o.find(A=>A.type==="moof")!=null)a=!0;else return null;if(r>=o.length)return null;const F=new it.mp4box.DataStream;let b=r;try{for(;b<o.length;)o[b].write(F),delete o[b],b+=1}catch(A){throw A}if(e.moov!=null){for(var S=0;S<e.moov.traks.length;S++)e.moov.traks[S].samples=[];e.mdats=[],e.moofs=[]}return r=o.length,new Uint8Array(F.buffer)};let c=!1,h=!1,d=null;i=new ReadableStream({start(F){s=self.setInterval(()=>{const b=n();b!=null&&!h&&F.enqueue(b)},500),d=b=>{if(clearInterval(s),e.flush(),b!=null){F.error(b);return}const S=n();S!=null&&!h&&F.enqueue(S),h||F.close()}},cancel(){h=!0,clearInterval(s)}});const u=F=>{c||(c=!0,d?.(F))};let f=null,p=null,g=[],v=0,x=0,w=0,T=!0,y=H.sampleRate;si(l.pipeThrough(new ri),{onDone:async()=>{await p?.stop(),f?.close(),u()},onChunk:async({chunkType:F,data:b})=>{if(F==="ready"){const{videoTrackConf:S,audioTrackConf:A,audioDecoderConf:E}=ae(b.file,b.info);v===0&&S!=null&&(v=e.addTrack(S));const P=A??{timescale:1e6,samplerate:y,channel_count:H.channelCount,hdlr:"soun",name:"SoundHandler",type:"mp4a"};x===0&&(x=e.addTrack(P),y=A?.samplerate??y,T=A!=null);const R=new AudioContext({sampleRate:y});g=te(await R.decodeAudioData(await new Response(t.stream).arrayBuffer())),E!=null&&(f=Ws(E)),p=Vs(E??{codec:P.type==="mp4a"?H.codec:P.type,numberOfChannels:P.channel_count,sampleRate:P.samplerate},B=>e.addSample(x,new Uint8Array(B.data),B))}else if(F==="samples"){const{id:S,type:A,samples:E}=b;if(A==="video"){E.forEach(P=>e.addSample(S,new Uint8Array(P.data),P)),T||await k(E);return}A==="audio"&&await O(E)}}});function C(F){const b=g.map(S=>t.loop?ee(S,w,w+F):S.slice(w,w+F));if(w+=F,t.volume!==1)for(const S of b)for(let A=0;A<S.length;A++)S[A]*=t.volume;return b}async function k(F){const b=F[0],S=F[F.length-1],A=Math.floor((S.cts+S.duration-b.cts)/b.timescale*y),E=ke([C(A)]);E.length!==0&&p?.encode(E,b.cts/b.timescale*1e6)}async function O(F){if(f==null)return;const b=(await f.decode(F)).map(Ae),S=Ri(b),A=C(S[0].length),E=F[0];p?.encode(ke([S,A]),E.cts/E.timescale*1e6)}return i}function js(l){const t={...l};if(t.timing?t.timing={display:t.timing.display||{from:0,to:0},trim:t.timing.trim||{from:0,to:0},duration:t.timing.duration??0,playbackRate:t.timing.playbackRate??1,fadeIn:t.timing.fadeIn??l.fadeIn,fadeOut:t.timing.fadeOut??l.fadeOut}:t.timing={display:l.display||{from:0,to:0},trim:l.trim||{from:0,to:0},duration:l.duration??0,playbackRate:l.playbackRate??1,fadeIn:l.fadeIn,fadeOut:l.fadeOut},delete t.fadeIn,delete t.fadeOut,t.transform)t.transform={x:t.transform.x??0,y:t.transform.y??0,width:t.transform.width??0,height:t.transform.height??0,angle:t.transform.angle??0,opacity:t.transform.opacity??1,zIndex:t.transform.zIndex??0,flip:t.transform.flip||null};else{const e=l;t.transform={x:e.left??0,y:e.top??0,width:e.width??0,height:e.height??0,angle:e.angle??0,opacity:e.opacity??1,zIndex:e.zIndex??0,flip:e.flip||null}}return t.style&&(t.style=Js(t.style,l.type)),t}function Js(l,t){if(!l)return l;const e={...l};if(e.dropShadow&&(e.shadow=e.dropShadow,delete e.dropShadow),e.shadow){const i={...e.shadow},s=i.offsetX!==void 0||i.offsetY!==void 0;if((i.distance!==void 0||i.angle!==void 0)&&!s){const o=i.distance??0,a=i.angle??0;i.offsetX=Math.cos(a)*o,i.offsetY=Math.sin(a)*o}delete i.distance,delete i.angle,e.shadow=i}return(t==="Text"||t==="Caption")&&e.fill!==void 0&&(e.color=e.fill,delete e.fill),e}function Gt(l,t=!1){return l.toJSON(t)}async function bt(l,t){const e=js(l);let i;const s=rt.get(e.type);if(s&&typeof s.fromObject=="function")i=await s.fromObject(e,t);else throw new Error(`Unsupported clip type or missing fromObject: ${e.type}`);if(e.animations&&Array.isArray(e.animations)){i.clearAnimations();for(const r of e.animations)i.addAnimation(r.type,r.options,r.params)}return e.id&&(i.id=e.id),e.name&&(i.name=e.name),e.metadata&&(i.metadata=e.metadata),i}const ni=new MessageChannel;function ai(){return new Promise(l=>{ni.port1.onmessage=()=>l(),ni.port2.postMessage(null)})}const Zs=20;async function Ks(l){for(;l()>Zs;)await ai()}const Xs=`
185
185
  in vec2 vTextureCoord;
186
186
  in vec4 vColor;
187
187
 
@@ -211,7 +211,7 @@ void main(void)
211
211
  vec4 fg = texture2D(uTexture, uvs);
212
212
  gl_FragColor = fg;
213
213
  }
214
- `,Js={uTime:{value:0,type:"f32"},rotationCount:{value:4,type:"f32"}},Zs=`
214
+ `,qs={uTime:{value:0,type:"f32"},rotationCount:{value:4,type:"f32"}},_s=`
215
215
  in vec2 vTextureCoord;
216
216
  in vec4 vColor;
217
217
 
@@ -235,7 +235,7 @@ void main(void)
235
235
 
236
236
  gl_FragColor = color;
237
237
  }
238
- `,Ks={uTime:{value:0,type:"f32"},maxIntensity:{value:1,type:"f32"}},Xs=`
238
+ `,$s={uTime:{value:0,type:"f32"},maxIntensity:{value:1,type:"f32"}},tr=`
239
239
  in vec2 vTextureCoord;
240
240
  in vec4 vColor;
241
241
 
@@ -273,7 +273,7 @@ void main(void)
273
273
 
274
274
  gl_FragColor = vec4(col, 1.0);
275
275
  }
276
- `,qs={uTime:{value:0,type:"f32"},intensity:{value:.5,type:"f32"},sliceCount:{value:12,type:"f32"},rgbShift:{value:.01,type:"f32"}},ri=`
276
+ `,er={uTime:{value:0,type:"f32"},intensity:{value:.5,type:"f32"},sliceCount:{value:12,type:"f32"},rgbShift:{value:.01,type:"f32"}},li=`
277
277
  in vec2 vTextureCoord;
278
278
  in vec4 vColor;
279
279
 
@@ -304,7 +304,7 @@ void main(void)
304
304
 
305
305
  gl_FragColor = color;
306
306
  }
307
- `,oi={pixelSize:{value:.02,type:"f32"},uTime:{value:0,type:"f32"},jitterStrength:{value:.8,type:"f32"}},_s=`
307
+ `,ci={pixelSize:{value:.02,type:"f32"},uTime:{value:0,type:"f32"},jitterStrength:{value:.8,type:"f32"}},ir=`
308
308
  precision highp float;
309
309
 
310
310
  varying vec2 vTextureCoord;
@@ -364,7 +364,7 @@ void main(void)
364
364
 
365
365
  gl_FragColor = vec4(col, base.a);
366
366
  }
367
- `,$s={uTime:{value:0,type:"f32"},glitchStrength:{value:.02,type:"f32"},glitchSpeed:{value:2,type:"f32"}},tr=`
367
+ `,sr={uTime:{value:0,type:"f32"},glitchStrength:{value:.02,type:"f32"},glitchSpeed:{value:2,type:"f32"}},rr=`
368
368
  precision highp float;
369
369
 
370
370
  varying vec2 vTextureCoord;
@@ -404,7 +404,7 @@ void main(void)
404
404
 
405
405
  gl_FragColor = vec4(r, g, b, base.a);
406
406
  }
407
- `,er={shiftAmount:{value:.01,type:"f32"},angle:{value:0,type:"f32"},uTime:{value:0,type:"f32"},wobbleAmount:{value:.003,type:"f32"},wobbleSpeed:{value:20,type:"f32"}},ir=`
407
+ `,or={shiftAmount:{value:.01,type:"f32"},angle:{value:0,type:"f32"},uTime:{value:0,type:"f32"},wobbleAmount:{value:.003,type:"f32"},wobbleSpeed:{value:20,type:"f32"}},nr=`
408
408
  in vec2 vTextureCoord;
409
409
  in vec4 vColor;
410
410
 
@@ -444,7 +444,7 @@ void main(void)
444
444
 
445
445
  gl_FragColor = texColor;
446
446
  }
447
- `,sr={dotSize:{value:.03,type:"f32"},intensity:{value:1,type:"f32"},angle:{value:0,type:"f32"},uTime:{value:0,type:"f32"},vibrateStrength:{value:.2,type:"f32"}},rr=`
447
+ `,ar={dotSize:{value:.03,type:"f32"},intensity:{value:1,type:"f32"},angle:{value:0,type:"f32"},uTime:{value:0,type:"f32"},vibrateStrength:{value:.2,type:"f32"}},lr=`
448
448
  in vec2 vTextureCoord;
449
449
  in vec4 vColor;
450
450
 
@@ -470,7 +470,7 @@ void main(void)
470
470
  vec4 color = texture2D(uTexture, uv + offset);
471
471
  gl_FragColor = color;
472
472
  }
473
- `,or={uTime:{value:0,type:"f32"},amplitude:{value:.02,type:"f32"},frequency:{value:3,type:"f32"},speed:{value:.5,type:"f32"},direction:{value:0,type:"i32"}},nr=`
473
+ `,cr={uTime:{value:0,type:"f32"},amplitude:{value:.02,type:"f32"},frequency:{value:3,type:"f32"},speed:{value:.5,type:"f32"},direction:{value:0,type:"i32"}},hr=`
474
474
  in vec2 vTextureCoord;
475
475
  in vec4 vColor;
476
476
 
@@ -504,7 +504,7 @@ void main(void)
504
504
 
505
505
  gl_FragColor = color;
506
506
  }
507
- `,ar={uTime:{value:0,type:"f32"},shineColor:{value:[1,1,1],type:"vec3<f32>"},rayWidth:{value:.05,type:"f32"},rayCount:{value:12,type:"f32"},rotationSpeed:{value:.5,type:"f32"}},lr=`
507
+ `,dr={uTime:{value:0,type:"f32"},shineColor:{value:[1,1,1],type:"vec3<f32>"},rayWidth:{value:.05,type:"f32"},rayCount:{value:12,type:"f32"},rotationSpeed:{value:.5,type:"f32"}},fr=`
508
508
  in vec2 vTextureCoord;
509
509
  in vec4 vColor;
510
510
 
@@ -525,7 +525,7 @@ void main(void)
525
525
 
526
526
  gl_FragColor = color;
527
527
  }
528
- `,cr={uTime:{value:0,type:"f32"},blinkSpeed:{value:2,type:"f32"},minIntensity:{value:.3,type:"f32"},maxIntensity:{value:1,type:"f32"}},hr=`
528
+ `,ur={uTime:{value:0,type:"f32"},blinkSpeed:{value:2,type:"f32"},minIntensity:{value:.3,type:"f32"},maxIntensity:{value:1,type:"f32"}},pr=`
529
529
  in vec2 vTextureCoord;
530
530
  in vec4 vColor;
531
531
 
@@ -549,7 +549,7 @@ void main(void)
549
549
 
550
550
  gl_FragColor = color;
551
551
  }
552
- `,dr={uTime:{value:0,type:"f32"},frequency:{value:2,type:"f32"},damping:{value:.8,type:"f32"},strength:{value:.04,type:"f32"}},ur=`
552
+ `,mr={uTime:{value:0,type:"f32"},frequency:{value:2,type:"f32"},damping:{value:.8,type:"f32"},strength:{value:.04,type:"f32"}},gr=`
553
553
  in vec2 vTextureCoord;
554
554
  in vec4 vColor;
555
555
 
@@ -568,7 +568,7 @@ void main(void)
568
568
  tex.rgb = mix(tex.rgb, duo, intensity);
569
569
  gl_FragColor = tex;
570
570
  }
571
- `,fr={colorA:{value:[.1,.1,.5],type:"vec3<f32>"},colorB:{value:[1,.8,.2],type:"vec3<f32>"},intensity:{value:1,type:"f32"}},pr=`
571
+ `,vr={colorA:{value:[.1,.1,.5],type:"vec3<f32>"},colorB:{value:[1,.8,.2],type:"vec3<f32>"},intensity:{value:1,type:"f32"}},yr=`
572
572
  in vec2 vTextureCoord;
573
573
  in vec4 vColor;
574
574
 
@@ -593,7 +593,7 @@ void main(void)
593
593
 
594
594
  gl_FragColor = tex;
595
595
  }
596
- `,mr={colorShadow:{value:[.1,0,.3],type:"vec3<f32>"},colorMid:{value:[.2,.8,.8],type:"vec3<f32>"},colorHighlight:{value:[1,.9,.4],type:"vec3<f32>"},intensity:{value:1,type:"f32"}},gr=`
596
+ `,xr={colorShadow:{value:[.1,0,.3],type:"vec3<f32>"},colorMid:{value:[.2,.8,.8],type:"vec3<f32>"},colorHighlight:{value:[1,.9,.4],type:"vec3<f32>"},intensity:{value:1,type:"f32"}},wr=`
597
597
  in vec2 vTextureCoord;
598
598
  in vec4 vColor;
599
599
 
@@ -632,7 +632,7 @@ void main(void)
632
632
 
633
633
  gl_FragColor = tex;
634
634
  }
635
- `,vr={uTime:{value:0,type:"f32"},amount:{value:1,type:"f32"}},yr=`
635
+ `,br={uTime:{value:0,type:"f32"},amount:{value:1,type:"f32"}},Cr=`
636
636
  in vec2 vTextureCoord;
637
637
  in vec4 vColor;
638
638
 
@@ -659,7 +659,7 @@ void main(void)
659
659
 
660
660
  gl_FragColor = color;
661
661
  }
662
- `,xr={uTime:{value:0,type:"f32"},uStrength:{value:.8,type:"f32"},swirl:{value:.3,type:"f32"}},wr=`
662
+ `,Tr={uTime:{value:0,type:"f32"},uStrength:{value:.8,type:"f32"},swirl:{value:.3,type:"f32"}},Sr=`
663
663
  in vec2 vTextureCoord;
664
664
  in vec4 vColor;
665
665
 
@@ -684,7 +684,7 @@ void main(void)
684
684
 
685
685
  gl_FragColor = color;
686
686
  }
687
- `,br={uTime:{value:0,type:"f32"},uStrength:{value:.2,type:"f32"},direction:{value:0,type:"i32"}},Cr=`
687
+ `,Ar={uTime:{value:0,type:"f32"},uStrength:{value:.2,type:"f32"},direction:{value:0,type:"i32"}},kr=`
688
688
  in vec2 vTextureCoord;
689
689
  in vec4 vColor;
690
690
 
@@ -732,7 +732,7 @@ void main(void)
732
732
 
733
733
  gl_FragColor = vec4(texR.r, texG.g, texB.b, 1.0);
734
734
  }
735
- `,Tr={uTime:{value:0,type:"f32"},uStrength:{value:.2,type:"f32"},uNoise:{value:.05,type:"f32"},direction:{value:0,type:"i32"}},Sr=`
735
+ `,Fr={uTime:{value:0,type:"f32"},uStrength:{value:.2,type:"f32"},uNoise:{value:.05,type:"f32"},direction:{value:0,type:"i32"}},Rr=`
736
736
  in vec2 vTextureCoord;
737
737
  in vec4 vColor;
738
738
 
@@ -751,7 +751,7 @@ void main(void)
751
751
 
752
752
  gl_FragColor = color;
753
753
  }
754
- `,Ar={uTime:{value:0,type:"f32"},maxPixelSize:{value:.05,type:"f32"}},kr=`
754
+ `,Mr={uTime:{value:0,type:"f32"},maxPixelSize:{value:.05,type:"f32"}},Or=`
755
755
  in vec2 vTextureCoord;
756
756
  in vec4 vColor;
757
757
 
@@ -788,7 +788,7 @@ void main(void)
788
788
 
789
789
  gl_FragColor = color;
790
790
  }
791
- `,Fr={uTime:{value:0,type:"f32"},maxBlur:{value:.01,type:"f32"}},Rr=`
791
+ `,Er={uTime:{value:0,type:"f32"},maxBlur:{value:.01,type:"f32"}},Dr=`
792
792
  precision highp float;
793
793
 
794
794
  varying vec2 vTextureCoord;
@@ -809,7 +809,7 @@ void main(void)
809
809
 
810
810
  gl_FragColor = tex;
811
811
  }
812
- `,Mr={amount:{value:1,type:"f32"}},Or=`
812
+ `,Pr={amount:{value:1,type:"f32"}},Ir=`
813
813
  in vec2 vTextureCoord;
814
814
  in vec4 vColor;
815
815
 
@@ -827,7 +827,7 @@ void main(void)
827
827
 
828
828
  gl_FragColor = tex;
829
829
  }
830
- `,Er={amount:{value:1,type:"f32"}},Dr=`
830
+ `,Br={amount:{value:1,type:"f32"}},Nr=`
831
831
  in vec2 vTextureCoord;
832
832
 
833
833
  uniform sampler2D uTexture;
@@ -846,7 +846,7 @@ void main(void)
846
846
 
847
847
  gl_FragColor = color;
848
848
  }
849
- `,Pr={uIntensity:{value:.5,type:"f32"},uSoftness:{value:.2,type:"f32"}},Ir=`
849
+ `,zr={uIntensity:{value:.5,type:"f32"},uSoftness:{value:.2,type:"f32"}},Lr=`
850
850
  in vec2 vTextureCoord;
851
851
 
852
852
  uniform sampler2D uTexture;
@@ -864,7 +864,7 @@ void main(void)
864
864
 
865
865
  gl_FragColor = color;
866
866
  }
867
- `,Br={uIntensity:{value:.005,type:"f32"},uDirection:{value:[1,0],type:"vec2<f32>"}},Nr=`
867
+ `,Hr={uIntensity:{value:.005,type:"f32"},uDirection:{value:[1,0],type:"vec2<f32>"}},Gr=`
868
868
  in vec2 vTextureCoord;
869
869
  in vec4 vColor;
870
870
 
@@ -957,7 +957,7 @@ void main(void)
957
957
  gl_FragColor = color;
958
958
  }
959
959
 
960
- `,zr={uTime:{value:0,type:"f32"},rotationCount:{value:4,type:"f32"},swirlStrength:{value:.9,type:"f32"},swirlRadius:{value:1,type:"f32"},rainbowIntensity:{value:.25,type:"f32"}},Lr=`
960
+ `,Ur={uTime:{value:0,type:"f32"},rotationCount:{value:4,type:"f32"},swirlStrength:{value:.9,type:"f32"},swirlRadius:{value:1,type:"f32"},rainbowIntensity:{value:.25,type:"f32"}},Wr=`
961
961
  in vec2 vTextureCoord;
962
962
 
963
963
  uniform sampler2D uTexture;
@@ -980,7 +980,7 @@ void main() {
980
980
 
981
981
  gl_FragColor = texture2D(uTexture, p + offset);
982
982
  }
983
- `,Hr={uTime:{value:0,type:"f32"},amplitude:{value:30,type:"f32"},speed:{value:30,type:"f32"}},Gr=`
983
+ `,Vr={uTime:{value:0,type:"f32"},amplitude:{value:30,type:"f32"},speed:{value:30,type:"f32"}},Yr=`
984
984
  precision mediump float;
985
985
 
986
986
  uniform sampler2D uTexture;
@@ -1045,7 +1045,7 @@ void main() {
1045
1045
  gl_FragColor = baseColor;
1046
1046
  }
1047
1047
 
1048
- `,Ur={uTime:{value:0,type:"f32"},persp:{value:.7,type:"f32"},unzoom:{value:.3,type:"f32"},reflection:{value:0,type:"f32"},floating:{value:3,type:"f32"}},Wr=`
1048
+ `,Qr={uTime:{value:0,type:"f32"},persp:{value:.7,type:"f32"},unzoom:{value:.3,type:"f32"},reflection:{value:0,type:"f32"},floating:{value:3,type:"f32"}},jr=`
1049
1049
  in vec2 vTextureCoord;
1050
1050
 
1051
1051
  uniform sampler2D uTexture;
@@ -1080,7 +1080,7 @@ void main() {
1080
1080
 
1081
1081
  gl_FragColor = texture2D(uTexture, uv);
1082
1082
  }
1083
- `,Vr={uTime:{value:0,type:"f32"},radius:{value:1,type:"f32"},spinPower:{value:18,type:"f32"},speed:{value:4,type:"f32"}},Yr=`
1083
+ `,Jr={uTime:{value:0,type:"f32"},radius:{value:1,type:"f32"},spinPower:{value:18,type:"f32"},speed:{value:4,type:"f32"}},Zr=`
1084
1084
  in vec2 vTextureCoord;
1085
1085
 
1086
1086
  uniform sampler2D uTexture;
@@ -1131,7 +1131,7 @@ void main() {
1131
1131
  }
1132
1132
  gl_FragColor = texture2D(uTexture, tiled);
1133
1133
  }
1134
- `,Qr={uTime:{value:0,type:"f32"},speed:{value:2,type:"f32"},intensity:{value:1.5,type:"f32"},endx:{value:2,type:"i32"},endy:{value:-1,type:"i32"}},jr=`
1134
+ `,Kr={uTime:{value:0,type:"f32"},speed:{value:2,type:"f32"},intensity:{value:1.5,type:"f32"},endx:{value:2,type:"i32"},endy:{value:-1,type:"i32"}},Xr=`
1135
1135
  precision highp float;
1136
1136
 
1137
1137
  in vec2 vTextureCoord;
@@ -1170,7 +1170,7 @@ void main() {
1170
1170
 
1171
1171
  gl_FragColor = tex;
1172
1172
  }
1173
- `,Jr={uTime:{value:0,type:"f32"}},Zr=`
1173
+ `,qr={uTime:{value:0,type:"f32"}},_r=`
1174
1174
  precision highp float;
1175
1175
 
1176
1176
  in vec2 vTextureCoord;
@@ -1194,7 +1194,7 @@ void main(void)
1194
1194
 
1195
1195
  gl_FragColor = vec4(color, tex.a);
1196
1196
  }
1197
- `,Kr={uTime:{value:0,type:"f32"},speed:{value:10.2,type:"f32"},intensity:{value:1.5,type:"f32"}},Xr=`
1197
+ `,$r={uTime:{value:0,type:"f32"},speed:{value:10.2,type:"f32"},intensity:{value:1.5,type:"f32"}},to=`
1198
1198
  precision highp float;
1199
1199
 
1200
1200
  in vec2 vTextureCoord;
@@ -1275,7 +1275,7 @@ void main() {
1275
1275
 
1276
1276
  gl_FragColor = vec4(color, 1.0);
1277
1277
  }
1278
- `,qr={uTime:{value:0,type:"f32"},framesPerScreen:{value:2,type:"f32"},scrollSpeed:{value:.35,type:"f32"},gateWeave:{value:.6,type:"f32"}},_r=`
1278
+ `,eo={uTime:{value:0,type:"f32"},framesPerScreen:{value:2,type:"f32"},scrollSpeed:{value:.35,type:"f32"},gateWeave:{value:.6,type:"f32"}},io=`
1279
1279
  precision highp float;
1280
1280
 
1281
1281
  in vec2 vTextureCoord;
@@ -1309,7 +1309,7 @@ void main(void)
1309
1309
  gl_FragColor = vec4(color.rgb * mask, color.a);
1310
1310
  }
1311
1311
 
1312
- `,$r={uTime:{value:0,type:"f32"},feather:{value:.03,type:"f32"}},to=`
1312
+ `,so={uTime:{value:0,type:"f32"},feather:{value:.03,type:"f32"}},ro=`
1313
1313
  precision highp float;
1314
1314
 
1315
1315
  in vec2 vTextureCoord;
@@ -1342,7 +1342,7 @@ void main(void)
1342
1342
  gl_FragColor = vec4(tex.rgb * mask, tex.a);
1343
1343
  }
1344
1344
 
1345
- `,eo={uTime:{value:0,type:"f32"}},io=`
1345
+ `,oo={uTime:{value:0,type:"f32"}},no=`
1346
1346
  precision highp float;
1347
1347
 
1348
1348
  in vec2 vTextureCoord;
@@ -1401,7 +1401,7 @@ void main(void)
1401
1401
  gl_FragColor = vec4(blurred.rgb * mask, blurred.a);
1402
1402
  }
1403
1403
 
1404
- `,so={uTime:{value:0,type:"f32"}},ro=`
1404
+ `,ao={uTime:{value:0,type:"f32"}},lo=`
1405
1405
  precision highp float;
1406
1406
 
1407
1407
  in vec2 vTextureCoord;
@@ -1428,7 +1428,7 @@ void main(void)
1428
1428
 
1429
1429
  gl_FragColor = color;
1430
1430
  }
1431
- `,oo={uTime:{value:0,type:"f32"},strength:{value:.015,type:"f32"},frequency:{value:10,type:"f32"}},no=`
1431
+ `,co={uTime:{value:0,type:"f32"},strength:{value:.015,type:"f32"},frequency:{value:10,type:"f32"}},ho=`
1432
1432
  precision highp float;
1433
1433
 
1434
1434
  in vec2 vTextureCoord;
@@ -1462,7 +1462,7 @@ void main(void)
1462
1462
 
1463
1463
  gl_FragColor = base;
1464
1464
  }
1465
- `,ao={uTime:{value:0,type:"f32"},uIntensity:{value:1.8,type:"f32"},neonR:{value:.1,type:"f32"},neonG:{value:.9,type:"f32"},neonB:{value:1,type:"f32"}},lo=`
1465
+ `,fo={uTime:{value:0,type:"f32"},uIntensity:{value:1.8,type:"f32"},neonR:{value:.1,type:"f32"},neonG:{value:.9,type:"f32"},neonB:{value:1,type:"f32"}},uo=`
1466
1466
  precision highp float;
1467
1467
 
1468
1468
  in vec2 vTextureCoord;
@@ -1489,7 +1489,7 @@ void main(void)
1489
1489
 
1490
1490
  gl_FragColor = color;
1491
1491
  }
1492
- `,co={uTime:{value:0,type:"f32"},uStrength:{value:.02,type:"f32"},uSpeed:{value:20,type:"f32"}},ho=`
1492
+ `,po={uTime:{value:0,type:"f32"},uStrength:{value:.02,type:"f32"},uSpeed:{value:20,type:"f32"}},mo=`
1493
1493
  precision highp float;
1494
1494
 
1495
1495
  in vec2 vTextureCoord;
@@ -1562,7 +1562,7 @@ void main(void)
1562
1562
 
1563
1563
  gl_FragColor = color;
1564
1564
  }
1565
- `,uo={uTime:{value:0,type:"f32"}},fo=`
1565
+ `,go={uTime:{value:0,type:"f32"}},vo=`
1566
1566
  precision highp float;
1567
1567
 
1568
1568
  in vec2 vTextureCoord;
@@ -1661,7 +1661,7 @@ void main(void)
1661
1661
 
1662
1662
  gl_FragColor = result;
1663
1663
  }
1664
- `,po={uTime:{value:0,type:"f32"},uCutPos:{value:.28,type:"f32"}},mo=`
1664
+ `,yo={uTime:{value:0,type:"f32"},uCutPos:{value:.28,type:"f32"}},xo=`
1665
1665
  precision highp float;
1666
1666
 
1667
1667
  varying vec2 vTextureCoord;
@@ -1699,7 +1699,7 @@ void main() {
1699
1699
 
1700
1700
  gl_FragColor = vec4(color, baseColor.a);
1701
1701
  }
1702
- `,go={uTime:{value:0,type:"f32"},uColor:{value:[1,0,.2],type:"vec3<f32>"},uThickness:{value:.02,type:"f32"},uIntensity:{value:1.5,type:"f32"}},vo=`
1702
+ `,wo={uTime:{value:0,type:"f32"},uColor:{value:[1,0,.2],type:"vec3<f32>"},uThickness:{value:.02,type:"f32"},uIntensity:{value:1.5,type:"f32"}},bo=`
1703
1703
  precision highp float;
1704
1704
 
1705
1705
  varying vec2 vTextureCoord;
@@ -1730,7 +1730,7 @@ void main() {
1730
1730
 
1731
1731
  gl_FragColor = color;
1732
1732
  }
1733
- `,yo={uTime:{value:0,type:"f32"},uStrength:{value:.02,type:"f32"},uFrequency:{value:20,type:"f32"},uSpeed:{value:4,type:"f32"}},xo=`
1733
+ `,Co={uTime:{value:0,type:"f32"},uStrength:{value:.02,type:"f32"},uFrequency:{value:20,type:"f32"},uSpeed:{value:4,type:"f32"}},To=`
1734
1734
  precision highp float;
1735
1735
 
1736
1736
  varying vec2 vTextureCoord;
@@ -1783,7 +1783,7 @@ void main() {
1783
1783
 
1784
1784
  gl_FragColor = vec4(colorValue, max(base.a, sparkAlpha));
1785
1785
  }
1786
- `,wo={uTime:{value:0,type:"f32"},uDensity:{value:30,type:"f32"},uSpeed:{value:2.5,type:"f32"},uSize:{value:.15,type:"f32"}},bo=`
1786
+ `,So={uTime:{value:0,type:"f32"},uDensity:{value:30,type:"f32"},uSpeed:{value:2.5,type:"f32"},uSize:{value:.15,type:"f32"}},Ao=`
1787
1787
  precision highp float;
1788
1788
 
1789
1789
  varying vec2 vTextureCoord;
@@ -1815,7 +1815,7 @@ void main() {
1815
1815
 
1816
1816
  gl_FragColor = vec4(colorValue, tex.a);
1817
1817
  }
1818
- `,Co={uTime:{value:0,type:"f32"},uLineThickness:{value:2,type:"f32"},uLineIntensity:{value:.6,type:"f32"},uNoiseIntensity:{value:.05,type:"f32"},uLineColor:{value:[.8,1,.8],type:"vec3<f32>"}},To=`
1818
+ `,ko={uTime:{value:0,type:"f32"},uLineThickness:{value:2,type:"f32"},uLineIntensity:{value:.6,type:"f32"},uNoiseIntensity:{value:.05,type:"f32"},uLineColor:{value:[.8,1,.8],type:"vec3<f32>"}},Fo=`
1819
1819
  precision highp float;
1820
1820
 
1821
1821
  varying vec2 vTextureCoord;
@@ -1849,7 +1849,7 @@ void main() {
1849
1849
 
1850
1850
  gl_FragColor = vec4(color, tex.a);
1851
1851
  }
1852
- `,So={uExposure:{value:1.2,type:"f32"},uSaturation:{value:4.3,type:"f32"},uContrast:{value:2.2,type:"f32"}},Ao=`
1852
+ `,Ro={uExposure:{value:1.2,type:"f32"},uSaturation:{value:4.3,type:"f32"},uContrast:{value:2.2,type:"f32"}},Mo=`
1853
1853
  precision highp float;
1854
1854
 
1855
1855
  varying vec2 vTextureCoord;
@@ -1872,7 +1872,7 @@ void main() {
1872
1872
 
1873
1873
  gl_FragColor = vec4(color, base.a);
1874
1874
  }
1875
- `,ko={uTime:{value:0,type:"f32"},uIntensity:{value:.7,type:"f32"},uDuration:{value:.2,type:"f32"}},Fo=`
1875
+ `,Oo={uTime:{value:0,type:"f32"},uIntensity:{value:.7,type:"f32"},uDuration:{value:.2,type:"f32"}},Eo=`
1876
1876
  precision highp float;
1877
1877
 
1878
1878
  varying vec2 vTextureCoord;
@@ -1910,7 +1910,7 @@ void main() {
1910
1910
 
1911
1911
  gl_FragColor = colorValue;
1912
1912
  }
1913
- `,Ro={uTime:{value:0,type:"f32"},uPulseScale:{value:.2,type:"f32"},uBlurStrength:{value:.02,type:"f32"},uGlowBoost:{value:2,type:"f32"}},Mo=`
1913
+ `,Do={uTime:{value:0,type:"f32"},uPulseScale:{value:.2,type:"f32"},uBlurStrength:{value:.02,type:"f32"},uGlowBoost:{value:2,type:"f32"}},Po=`
1914
1914
  precision highp float;
1915
1915
 
1916
1916
  varying vec2 vTextureCoord;
@@ -1942,7 +1942,7 @@ void main() {
1942
1942
  gl_FragColor = color;
1943
1943
  }
1944
1944
 
1945
- `,Oo={uTime:{value:0,type:"f32"},uIntensity:{value:1,type:"f32"},uSpeed:{value:1,type:"f32"}},Eo=`
1945
+ `,Io={uTime:{value:0,type:"f32"},uIntensity:{value:1,type:"f32"},uSpeed:{value:1,type:"f32"}},Bo=`
1946
1946
  precision highp float;
1947
1947
 
1948
1948
  varying vec2 vTextureCoord;
@@ -1980,7 +1980,7 @@ void main() {
1980
1980
 
1981
1981
  gl_FragColor = vec4(hdrColor, tex.a);
1982
1982
  }
1983
- `,Do={uExposure:{value:1,type:"f32"},uBloom:{value:1.5,type:"f32"},uContrast:{value:2,type:"f32"}},Po=`
1983
+ `,No={uExposure:{value:1,type:"f32"},uBloom:{value:1.5,type:"f32"},uContrast:{value:2,type:"f32"}},zo=`
1984
1984
  precision highp float;
1985
1985
 
1986
1986
  varying vec2 vTextureCoord;
@@ -2024,7 +2024,7 @@ void main() {
2024
2024
 
2025
2025
  gl_FragColor = color;
2026
2026
  }
2027
- `,Io={uTime:{value:0,type:"f32"},uZoomSpeed:{value:5,type:"f32"},uMaxZoom:{value:2,type:"f32"},uBlurStrength:{value:.01,type:"f32"}},ni=`
2027
+ `,Lo={uTime:{value:0,type:"f32"},uZoomSpeed:{value:5,type:"f32"},uMaxZoom:{value:2,type:"f32"},uBlurStrength:{value:.01,type:"f32"}},hi=`
2028
2028
  precision highp float;
2029
2029
 
2030
2030
  varying vec2 vTextureCoord;
@@ -2080,7 +2080,7 @@ void main() {
2080
2080
 
2081
2081
  gl_FragColor = vec4(color.rgb, color.a * alpha);
2082
2082
  }
2083
- `,ce=`
2083
+ `,de=`
2084
2084
  in vec2 vTextureCoord;
2085
2085
  in vec4 vColor;
2086
2086
  uniform sampler2D uTexture;
@@ -2152,7 +2152,7 @@ void main() {
2152
2152
  vec3 resultColor = mix(src.rgb, adjusted, mask);
2153
2153
  finalColor = vec4(resultColor, src.a);
2154
2154
  }
2155
- `,Bo=`
2155
+ `,Ho=`
2156
2156
  in vec2 vTextureCoord;
2157
2157
 
2158
2158
  uniform sampler2D uTexture;
@@ -2172,7 +2172,7 @@ void main(void)
2172
2172
 
2173
2173
  gl_FragColor = color;
2174
2174
  }
2175
- `,No={uTime:{value:0,type:"f32"},uDuration:{value:1,type:"f32"}},zo=`
2175
+ `,Go={uTime:{value:0,type:"f32"},uDuration:{value:1,type:"f32"}},Uo=`
2176
2176
  in vec2 vTextureCoord;
2177
2177
 
2178
2178
  uniform sampler2D uTexture;
@@ -2192,7 +2192,7 @@ void main(void)
2192
2192
 
2193
2193
  gl_FragColor = color;
2194
2194
  }
2195
- `,Lo={uTime:{value:0,type:"f32"},uDuration:{value:1,type:"f32"}},Mt=`
2195
+ `,Wo={uTime:{value:0,type:"f32"},uDuration:{value:1,type:"f32"}},Et=`
2196
2196
  in vec2 aPosition;
2197
2197
  out vec2 vTextureCoord;
2198
2198
 
@@ -2220,7 +2220,7 @@ void main(void)
2220
2220
  gl_Position = filterVertexPosition();
2221
2221
  vTextureCoord = filterTextureCoord();
2222
2222
  }
2223
- `;function _(l,t,e){return Math.min(e,Math.max(t,l))}function Jt(l,t){if(!l||l.length===0)return t;const e=[...l].sort((i,s)=>i.x-s.x);if(t<=e[0].x)return e[0].y;if(t>=e[e.length-1].x)return e[e.length-1].y;for(let i=0;i<e.length-1;i++){const s=e[i],r=e[i+1];if(t>=s.x&&t<=r.x){const o=(t-s.x)/Math.max(r.x-s.x,1e-6);return s.y+(r.y-s.y)*o}}return t}function he(l){return!l||l.enabled===!1?!1:!!(l.basic||l.hsl||l.curves)}function Ho(l){const t=Zt(l);return t.length>0?t[0]:null}function Zt(l){if(!l||l.enabled===!1)return[];const t=l.hsl;if(!t)return[];const e=t.byColor??{},i=Object.entries(e).map(([a,n])=>({targetColor:a,hue:n?.hue??0,saturation:n?.saturation??0,lightness:n?.lightness??0})).filter(a=>a.hue!==0||a.saturation!==0||a.lightness!==0);if(i.length>0)return i;if(!t.selectedColor)return[];const s=t.hue??0,r=t.saturation??0,o=t.lightness??0;return s===0&&r===0&&o===0?[]:[{targetColor:t.selectedColor,hue:s,saturation:r,lightness:o}]}function de(l,t,e=1){l.reset();const i=t?.basic??{},s=t?.hsl??{},r=t?.curves,o=Ho(t),a=(i.saturation??0)+(o?0:s.saturation??0);a!==0&&l.saturate(_(a/100,-1,2),!0);const n=(i.hue??0)+(o?0:s.hue??0);n!==0&&l.hue(n,!0);const c=i.brightness??0,h=i.shine??0,d=i.highlight??0,f=i.shadow??0,u=o?0:s.lightness??0,p=c+u+h*.25+d*.25-f*.25,g=_(1+p/100,0,5)*e;g!==1&&l.brightness(g,!0);const v=_(1+(i.contrast??0)/100,0,5);v!==1&&l.contrast(v,!0);const x=i.sharpness??0;if(x!==0){const k=_(1+x/300,0,5);l.contrast(k,!0)}const w=i.fade??0;if(w!==0){const k=_(w/100,0,1),O=_(1-k*.35,0,5),F=_(-k*.45,-1,2);l.contrast(O,!0),l.saturate(F,!0)}const T=Math.abs(i.vignette??0);if(T!==0){const k=_(T/100,0,1),O=_(1-k*.2,0,5);l.brightness(O,!0)}const y=i.grain??0;if(y!==0){const k=_(y/100,0,1),O=_(1+k*.08,0,5),F=_(-k*.05,-1,2);l.contrast(O,!0),l.saturate(F,!0)}const C=_((i.temperature??0)/100,-1,1);if(C!==0){const k=l.matrix,O=1+C*.2,F=1-C*.2;k[0]*=O,k[6]*=1,k[12]*=F}if(r){const k=Jt(r.rgb,.5),O=Jt(r.red,.5),F=Jt(r.green,.5),b=Jt(r.blue,.5),S=_((k-.5)*1.8,-.6,.6);S!==0&&l.contrast(1+S,!0);const A=l.matrix;A[0]*=_(1+(O-.5)*.8,.6,1.4),A[6]*=_(1+(F-.5)*.8,.6,1.4),A[12]*=_(1+(b-.5)*.8,.6,1.4)}}function Go(l,t){const{opacity:e,zIndex:i,flip:s,left:r,top:o,width:a,height:n,angle:c}=l;t.x=r,t.y=o,t.width=Math.abs(a),t.height=Math.abs(n),t.angle=c,t.alpha=e,t.zIndex=i,s?.x?t.scale.x=-Math.abs(t.scale.x):t.scale.x=Math.abs(t.scale.x),s?.y?t.scale.y=-Math.abs(t.scale.y):t.scale.y=Math.abs(t.scale.y)}class ue{constructor(t,e,i=null){this.sprite=e,this.targetContainer=i,!i&&t&&(this.targetContainer=t.stage),this.resolution=t?.renderer?.resolution??1,this.root=new m.Container,this.root.label="RootContainer",this.root.visible=!1,this.animationContainer=new m.Container,this.animationContainer.label="AnimationContainer",this.root.addChild(this.animationContainer),this.targetContainer&&this.targetContainer.addChild(this.root)}sprite;targetContainer;pixiSprite=null;mirrorSprites=[];mirrorContainer=null;isMirrorActive=!1;texture=null;root=null;strokeGraphics=null;maskGraphics=null;shadowGraphics=null;shadowContainer=null;animationContainer=null;resolution=1;destroyed=!1;lastFrame=null;async updateFrame(t){if(this.destroyed)return;if(t===this.lastFrame){this.root!=null&&(this.root.visible=t!=null,this.applySpriteTransforms());return}if(this.lastFrame=t,t==null){this.root!=null&&(this.root.visible=!1,this.applySpriteTransforms());return}if(t instanceof m.Texture||t&&typeof t.source<"u"&&!(t instanceof VideoFrame)){if(t.width===0||t.height===0){console.warn("PixiSpriteRenderer: Texture has zero dimensions",t.width,t.height);return}this.pixiSprite==null?(this.pixiSprite=new m.Sprite(t),this.pixiSprite.label="MainSprite",this.animationContainer.addChild(this.pixiSprite),this.applySpriteTransforms()):this.pixiSprite.texture=t,this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms());return}const i=t.width,s=t.height;if(typeof i!="number"||typeof s!="number"||i<=0||s<=0){console.warn("PixiSpriteRenderer: Invalid frame dimensions",i,s),t instanceof VideoFrame&&t.close();return}if(this.texture!=null&&(this.texture.destroy(!0),this.texture=null),this.texture=m.Texture.from(t),!this.texture||!this.texture.source){console.error("PixiSpriteRenderer: Failed to create valid texture"),t instanceof VideoFrame&&t.close();return}this.pixiSprite==null?(this.pixiSprite=new m.Sprite(this.texture),this.pixiSprite.label="MainSprite",this.animationContainer.addChild(this.pixiSprite),this.applySpriteTransforms()):this.pixiSprite.texture=this.texture,t instanceof VideoFrame&&t.close(),this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms())}applySpriteTransforms(){if(this.pixiSprite==null||this.root==null||this.destroyed)return;const{flip:t,center:e,width:i,height:s,angle:r,opacity:o,zIndex:a,renderTransform:n}=this.sprite,c=n?.x??0,h=n?.y??0,d=n?.angle??0,f=n?.scale??1,u=n?.scaleX??1,p=n?.scaleY??1,g=n?.opacity??1,v=n?.blur??0,x=n?.motionBlur??0,w=n?.brightness??1,T=(n?.mirror??0)>.5;this.root.renderTexturePadding=this.sprite.renderTexturePadding??0,this.root.x=e.x,this.root.y=e.y,this.root.angle=(t?.x||t?.y?-1:1)*r,this.root.alpha=o,this.root.zIndex=a,this.root.scale.set(1,1),this.animationContainer&&(this.animationContainer.x=c,this.animationContainer.y=h,this.animationContainer.angle=(t?.x||t?.y?-1:1)*d,this.animationContainer.alpha=g,this.animationContainer.scale.set(f*u,f*p),this.applyBlur(v),this.applyMotionBlur(x),this.applyBrightness(w),this.applySelectiveHsl(),this.applyChromaKey()),this.pixiSprite.anchor.set(.5,.5),this.pixiSprite.position.set(0,0);const y=this.pixiSprite.texture?.width??1,C=this.pixiSprite.texture?.height??1,k=this.sprite.type==="Caption",O=this.sprite.type==="Text",F=this.sprite.renderTexturePadding??0,b=k||O||F>0?1:i&&i!==0?Math.abs(i)/y:1,S=k||O||F>0?1:s&&s!==0?Math.abs(s)/C:1;if(T){if(!this.isMirrorActive){if(this.isMirrorActive=!0,this.mirrorContainer=new m.Container,this.mirrorContainer.label="MirrorContainer",this.animationContainer){const R=this.animationContainer.getChildIndex(this.pixiSprite);this.animationContainer.removeChild(this.pixiSprite),this.mirrorContainer.addChild(this.pixiSprite),this.animationContainer.addChildAt(this.mirrorContainer,R)}this.mirrorSprites=[];for(let R=0;R<8;R++){const B=new m.Sprite(this.pixiSprite.texture);B.label=`MirrorSprite_${R}`,B.anchor.set(.5,.5),this.mirrorContainer.addChild(B),this.mirrorSprites.push(B)}}for(const R of this.mirrorSprites)R.texture=this.pixiSprite.texture;const A=y*b,E=C*S;this.pixiSprite.position.set(0,0),this.pixiSprite.scale.set(b,S);const P=[[A,0,-b,S],[-A,0,-b,S],[0,E,b,-S],[0,-E,b,-S],[A,E,-b,-S],[-A,E,-b,-S],[A,-E,-b,-S],[-A,-E,-b,-S]];for(let R=0;R<8;R++){const[B,W,I,D]=P[R];this.mirrorSprites[R].position.set(B,W),this.mirrorSprites[R].scale.set(I,D)}if(t?.x){this.pixiSprite.scale.x=-b;for(let R=0;R<8;R++)this.mirrorSprites[R].scale.x=-P[R][2]}if(t?.y){this.pixiSprite.scale.y=-S;for(let R=0;R<8;R++)this.mirrorSprites[R].scale.y=-P[R][3]}}else{if(this.isMirrorActive&&(this.isMirrorActive=!1,this.mirrorContainer&&this.animationContainer)){const A=this.animationContainer.getChildIndex(this.mirrorContainer);this.mirrorContainer.removeChild(this.pixiSprite),this.animationContainer.addChildAt(this.pixiSprite,A);for(const E of this.mirrorSprites)E.destroy();this.mirrorSprites=[],this.animationContainer.removeChild(this.mirrorContainer),this.mirrorContainer.destroy(),this.mirrorContainer=null}this.pixiSprite.scale.x=t?.x?-b:b,this.pixiSprite.scale.y=t?.y?-S:S}this.applyStyle(),this.applyContainerAnimations()}applyContainerAnimations(){if(!this.animationContainer||this.destroyed)return;const e=this.sprite.renderTransform??{},i=e.mask;if(!i){if(this.animationContainer.mask){this.animationContainer.mask=null;const x=this.animationContainer.__maskGraphics;x&&(x.visible=!1)}return}const{progress:s,shape:r,direction:o,angle:a,origin:n,feather:c}=i;if(s>=1){this.animationContainer.mask=null;const x=this.animationContainer.__maskGraphics;x&&(x.visible=!1);return}const h=this._getMaskDimensions();if(h.width<=0||h.height<=0)return;const{width:d,height:f}=h;let u=this.animationContainer.__maskGraphics;u||(u=new m.Graphics,u.label="MaskGraphics",this.animationContainer.addChild(u),this.animationContainer.__maskGraphics=u),u.visible=!0,u.clear(),u.scale.set(1,1);const p=c??0,g=i.initialProgress??0,v=g+(1-g)*s;if(v<=0&&r!=="edgeCrop"){this.animationContainer.mask=u;return}if(r==="custom"&&i.painter)i.painter(u,d,f,v);else if(r==="edgeCrop"){const x=Math.max(.001,(e.scale??1)*(e.scaleX??1)),w=Math.max(.001,(e.scale??1)*(e.scaleY??1));u.scale.set(1/x,1/w),this._drawEdgeCropMask(u,d,f,v,n??"center",i.xDistance??100,i.yDistance??100,i.maskBorderRadius??0)}else if(r==="circle"||r==="ellipse")this._drawExpandMask(u,d,f,v,n??"center",r,p);else{const x=a??0;x!==0?this._drawAngleWipeMask(u,d,f,v,x,p):this._drawRectWipeMask(u,d,f,v,o??"left",p)}this.animationContainer.mask=u}_drawEdgeCropMask(t,e,i,s,r,o,a,n){const c=o*(1-s),h=a*(1-s);let d=-e/2,f=-i/2,u=e,p=i;switch(r){case"topLeft":u=e-c,p=i-h;break;case"topRight":d+=c,u=e-c,p=i-h;break;case"bottomLeft":f+=h,u=e-c,p=i-h;break;case"bottomRight":d+=c,f+=h,u=e-c,p=i-h;break;default:d+=c,f+=h,u=e-2*c,p=i-2*h}u<=0||p<=0||(n>0?t.roundRect(d,f,u,p,n).fill({color:16777215}):t.rect(d,f,u,p).fill({color:16777215}))}_getMaskDimensions(){const t=this.animationContainer,i=t.parent?.renderTexturePadding??0;if(t.children){for(const s of t.children)if(!(!s||s.label==="MaskGraphics"||s.label==="WipeMask")){if(s.label==="MainSprite"){const r=Math.abs(s.width??0)-i*2,o=Math.abs(s.height??0)-i*2;if(r>0&&o>0)return{width:r,height:o}}if(s.children){for(const r of s.children)if(r?.label==="MainSprite"){const o=Math.abs(r.width??0)-i*2,a=Math.abs(r.height??0)-i*2;if(o>0&&a>0)return{width:o,height:a}}}}}try{const s=t.getLocalBounds();if(s.width>0&&s.height>0)return{width:s.width-i*2,height:s.height-i*2}}catch{}return{width:0,height:0}}_drawRectWipeMask(t,e,i,s,r,o){let a=-e/2,n=-i/2,c=e,h=i;switch(r){case"left":c=e*s,a=-e/2;break;case"right":c=e*s,a=e/2-c;break;case"top":h=i*s,n=-i/2;break;case"bottom":h=i*s,n=i/2-h;break}c<=0||h<=0||(o>0?t.rect(a,n,c,h).fill({color:16777215,alpha:1}):t.rect(a,n,c,h).fill({color:16777215}))}_drawAngleWipeMask(t,e,i,s,r,o){const a=Math.sqrt(e*e+i*i),n=a*s;t.rotation=r*Math.PI/180,t.rect(-a/2,-a/2,n,a).fill({color:16777215}),t.rotation=0}_drawExpandMask(t,e,i,s,r,o,a){let n=0,c=0;switch(r){case"topLeft":n=-e/2,c=-i/2;break;case"topRight":n=e/2,c=-i/2;break;case"bottomLeft":n=-e/2,c=i/2;break;case"bottomRight":n=e/2,c=i/2;break;default:n=0,c=0}const h=[{x:-e/2,y:-i/2},{x:e/2,y:-i/2},{x:-e/2,y:i/2},{x:e/2,y:i/2}],f=Math.max(...h.map(u=>Math.hypot(u.x-n,u.y-c)))*s;if(o==="circle")t.circle(n,c,f).fill({color:16777215});else{const u=e/2*s,p=i/2*s;t.ellipse(n,c,u,p).fill({color:16777215})}}applyStyle(){if(this.pixiSprite==null||this.destroyed)return;const t=this.sprite.style||{},e=this.pixiSprite.texture?.width??0,i=this.pixiSprite.texture?.height??0;if(e===0||i===0)return;const s=Math.abs(this.sprite.width??0),r=Math.abs(this.sprite.height??0),o=t.borderRadius||0;o>0?(this.maskGraphics==null&&(this.maskGraphics=new m.Graphics,this.maskGraphics.label="MaskGraphics",this.maskGraphics._calculateBounds=()=>{},this.animationContainer.addChild(this.maskGraphics)),this.maskGraphics.clear(),this.maskGraphics.roundRect(-s/2,-r/2,s,r,Math.min(o,s/2,r/2)),this.maskGraphics.fill({color:16777215,alpha:1}),this.maskGraphics.visible=!0,this.pixiSprite.mask=null,this.pixiSprite.mask=this.maskGraphics):this.maskGraphics&&(this.maskGraphics.visible=!1,this.pixiSprite.mask=null),this.sprite.type!=="Text"&&this.sprite.type!=="Caption"&&this.sprite.type!=="Shape"?this.applyStroke(t):this.strokeGraphics&&(this.strokeGraphics.visible=!1),this.sprite.type!=="Text"&&this.sprite.type!=="Caption"&&this.sprite.type!=="Shape"?this.applyShadow(t):this.shadowContainer&&(this.shadowContainer.visible=!1,this.shadowContainer.filters=[])}applyStroke(t){const e=t.stroke;if(e&&e.width>0){this.strokeGraphics==null&&(this.strokeGraphics=new m.Graphics,this.strokeGraphics.label="StrokeGraphics",this.strokeGraphics._calculateBounds=()=>{},this.animationContainer.addChild(this.strokeGraphics)),this.strokeGraphics.clear();const i=$(e.color)??16777215,s=e.width,r=t.borderRadius||0,o=Math.abs(this.sprite.width??0),a=Math.abs(this.sprite.height??0);let n=1;if(e.alignment!==void 0&&(typeof e.alignment=="number"?n=e.alignment:e.alignment==="center"||e.alignment==="middle"?n=.5:e.alignment==="inside"?n=0:e.alignment==="outside"&&(n=1)),this.strokeGraphics.setStrokeStyle({width:s,color:i,alignment:n}),r>0){const c=Math.min(r,o/2,a/2);this.strokeGraphics.roundRect(-o/2,-a/2,o,a,c)}else this.strokeGraphics.rect(-o/2,-a/2,o,a);this.strokeGraphics.stroke(),this.strokeGraphics.visible=!0}else this.strokeGraphics!=null&&(this.strokeGraphics.visible=!1)}applyShadow(t){const e=t.shadow,i=Math.abs(this.sprite.width??0),s=Math.abs(this.sprite.height??0);if(e&&i>0&&s>0&&(e.blur>0||(e.offsetX??0)!==0||(e.offsetY??0)!==0)){this.shadowContainer==null&&(this.shadowContainer=new m.Container,this.shadowContainer.label="ShadowContainer",this.shadowContainer._calculateBounds=()=>{},this.shadowGraphics=new m.Graphics,this.shadowGraphics.label="ShadowGraphics",this.shadowGraphics._calculateBounds=()=>{},this.shadowContainer.addChild(this.shadowGraphics),this.animationContainer.addChildAt(this.shadowContainer,0));const r=$(e.color)??0,o=e.alpha??.5,a=e.blur??0,n=e.offsetX??0,c=e.offsetY??0;this.shadowContainer.position.set(n,c),this.shadowGraphics.clear();const h=t.borderRadius||0;if(h>0){const d=Math.min(h,i/2,s/2);this.shadowGraphics.roundRect(-i/2,-s/2,i,s,d)}else this.shadowGraphics.rect(-i/2,-s/2,i,s);if(this.shadowGraphics.fill({color:r,alpha:o}),a>0){(!this.shadowContainer.filters||this.shadowContainer.filters.length===0)&&(this.shadowContainer.filters=[new m.BlurFilter]);const d=this.shadowContainer.filters[0],f=this.root?Math.sqrt(this.root.worldTransform.a**2+this.root.worldTransform.b**2):1;d.strength=a*f,d.resolution=this.resolution,d.padding=Math.max(a*2*f,20)}else this.shadowContainer.filters=[];this.shadowContainer.visible=!0}else this.shadowContainer!=null&&(this.shadowContainer.visible=!1,this.shadowContainer.filters=[])}applyBlur(t){if(!this.animationContainer||this.destroyed)return;if(typeof t!="number"||!isFinite(t)||t<=0){this.animationContainer.filters&&this.animationContainer.filters.length>0&&(this.animationContainer.filters=[]);return}let e=this.animationContainer.filters?.find(r=>r instanceof m.BlurFilter);if(!e){e=new m.BlurFilter;const r=this.animationContainer.filters||[];this.animationContainer.filters=[...r,e]}const i=this.root?Math.sqrt(this.root.worldTransform.a**2+this.root.worldTransform.b**2):1,s=Math.max(i,.001);e.strength=t*s,e.resolution=this.resolution,e.padding=Math.max(t*2*s,20),e.quality=4,e.repeatEdgePixels=!0}applyMotionBlur(t){if(!this.animationContainer||this.destroyed)return;if(typeof t!="number"||!isFinite(t)||t<=0){this.animationContainer.filters&&(this.animationContainer.filters=this.animationContainer.filters.filter(i=>!(i instanceof j.ZoomBlurFilter)));return}let e=this.animationContainer.filters?.find(i=>i instanceof j.ZoomBlurFilter);if(!e){e=new j.ZoomBlurFilter;const i=this.animationContainer.filters||[];this.animationContainer.filters=[...i,e]}if(e.strength=t/200,this.pixiSprite){const i=this.pixiSprite.getBounds();e.center={x:i.width/2,y:i.height/2}}e.innerRadius=0,e.radius=-1}applyBrightness(t){if(!this.animationContainer||this.destroyed)return;const e=he(this.sprite.colorAdjustment);if(t===1&&!e){this.animationContainer.filters&&(this.animationContainer.filters=this.animationContainer.filters.filter(s=>s.label!=="ColorAdjustmentFilter"));return}let i=this.animationContainer.filters?.find(s=>s.label==="ColorAdjustmentFilter");if(!i){i=new m.ColorMatrixFilter,i.label="ColorAdjustmentFilter";const s=this.animationContainer.filters||[];this.animationContainer.filters=[...s,i]}de(i,this.sprite.colorAdjustment,t)}applySelectiveHsl(){if(!this.animationContainer||this.destroyed)return;const t=Zt(this.sprite.colorAdjustment),e=(this.animationContainer.filters||[]).filter(s=>!s.label?.startsWith("SelectiveHslFilter"));if(t.length===0){this.animationContainer.filters=e;return}const i=[];for(let s=0;s<t.length;s++){const r=t[s],o=new m.UniformGroup({uTargetColor:{value:[1,1,0],type:"vec3<f32>"},uHueShift:{value:r.hue,type:"f32"},uSatShift:{value:r.saturation/100,type:"f32"},uLightShift:{value:r.lightness/100,type:"f32"},uTolerance:{value:.22,type:"f32"},uSoftness:{value:.12,type:"f32"}}),a=Pt(r.targetColor);a&&(o.uniforms.uTargetColor[0]=a.r/255,o.uniforms.uTargetColor[1]=a.g/255,o.uniforms.uTargetColor[2]=a.b/255);const n=new m.Filter({glProgram:new m.GlProgram({vertex:Mt,fragment:ce,name:`SelectiveHslShader_${s}`}),resources:{hslUniforms:o}});n.label=`SelectiveHslFilter_${s}`,i.push(n)}this.animationContainer.filters=[...e,...i]}applyChromaKey(){if(!this.animationContainer||this.destroyed)return;const{chromaKey:t}=this.sprite;if(!t||!t.enabled){this.animationContainer.filters&&(this.animationContainer.filters=this.animationContainer.filters.filter(r=>r.label!=="ChromaKeyFilter"));return}let e=this.animationContainer.filters?.find(r=>r.label==="ChromaKeyFilter");if(!e){const r=new m.GlProgram({vertex:Mt,fragment:ni,name:"ChromaKeyShader"}),o=new m.UniformGroup({uKeyColor:{value:[0,1,0],type:"vec3<f32>"},uSimilarity:{value:.1,type:"f32"},uSpill:{value:0,type:"f32"}});e=new m.Filter({glProgram:r,resources:{chromaUniforms:o}}),e.label="ChromaKeyFilter";const a=this.animationContainer.filters||[];this.animationContainer.filters=[...a,e]}const i=e.resources.chromaUniforms.uniforms,s=Pt(t.color);s&&(i.uKeyColor[0]=s.r/255,i.uKeyColor[1]=s.g/255,i.uKeyColor[2]=s.b/255),i.uSimilarity=t.similarity,i.uSpill=t.spill}updateTransforms(){this.root!=null&&!this.destroyed&&this.applySpriteTransforms()}getSprite(){return this.pixiSprite}getRoot(){return this.root}destroy(){this.destroyed||(this.destroyed=!0,this.root!=null&&(this.root.parent&&this.root.parent.removeChild(this.root),this.root.destroy({children:!0}),this.root=null,this.pixiSprite=null),this.strokeGraphics!=null&&(this.strokeGraphics.destroy(),this.strokeGraphics=null),this.maskGraphics!=null&&(this.maskGraphics.destroy(),this.maskGraphics=null),this.shadowGraphics!=null&&(this.shadowGraphics.destroy(),this.shadowGraphics=null),this.shadowContainer!=null&&(this.shadowContainer.destroy({children:!0}),this.shadowContainer=null),this.texture!=null&&(this.texture.destroy(),this.texture=null))}}const Uo=`
2223
+ `;function q(l,t,e){return Math.min(e,Math.max(t,l))}function Kt(l,t){if(!l||l.length===0)return t;const e=[...l].sort((i,s)=>i.x-s.x);if(t<=e[0].x)return e[0].y;if(t>=e[e.length-1].x)return e[e.length-1].y;for(let i=0;i<e.length-1;i++){const s=e[i],r=e[i+1];if(t>=s.x&&t<=r.x){const o=(t-s.x)/Math.max(r.x-s.x,1e-6);return s.y+(r.y-s.y)*o}}return t}function fe(l){return!l||l.enabled===!1?!1:!!(l.basic||l.hsl||l.curves)}function Vo(l){const t=Xt(l);return t.length>0?t[0]:null}function Xt(l){if(!l||l.enabled===!1)return[];const t=l.hsl;if(!t)return[];const e=t.byColor??{},i=Object.entries(e).map(([a,n])=>({targetColor:a,hue:n?.hue??0,saturation:n?.saturation??0,lightness:n?.lightness??0})).filter(a=>a.hue!==0||a.saturation!==0||a.lightness!==0);if(i.length>0)return i;if(!t.selectedColor)return[];const s=t.hue??0,r=t.saturation??0,o=t.lightness??0;return s===0&&r===0&&o===0?[]:[{targetColor:t.selectedColor,hue:s,saturation:r,lightness:o}]}function ue(l,t,e=1){l.reset();const i=t?.basic??{},s=t?.hsl??{},r=t?.curves,o=Vo(t),a=(i.saturation??0)+(o?0:s.saturation??0);a!==0&&l.saturate(q(a/100,-1,2),!0);const n=(i.hue??0)+(o?0:s.hue??0);n!==0&&l.hue(n,!0);const c=i.brightness??0,h=i.shine??0,d=i.highlight??0,u=i.shadow??0,f=o?0:s.lightness??0,p=c+f+h*.25+d*.25-u*.25,g=q(1+p/100,0,5)*e;g!==1&&l.brightness(g,!0);const v=q(1+(i.contrast??0)/100,0,5);v!==1&&l.contrast(v,!0);const x=i.sharpness??0;if(x!==0){const k=q(1+x/300,0,5);l.contrast(k,!0)}const w=i.fade??0;if(w!==0){const k=q(w/100,0,1),O=q(1-k*.35,0,5),F=q(-k*.45,-1,2);l.contrast(O,!0),l.saturate(F,!0)}const T=Math.abs(i.vignette??0);if(T!==0){const k=q(T/100,0,1),O=q(1-k*.2,0,5);l.brightness(O,!0)}const y=i.grain??0;if(y!==0){const k=q(y/100,0,1),O=q(1+k*.08,0,5),F=q(-k*.05,-1,2);l.contrast(O,!0),l.saturate(F,!0)}const C=q((i.temperature??0)/100,-1,1);if(C!==0){const k=l.matrix,O=1+C*.2,F=1-C*.2;k[0]*=O,k[6]*=1,k[12]*=F}if(r){const k=Kt(r.rgb,.5),O=Kt(r.red,.5),F=Kt(r.green,.5),b=Kt(r.blue,.5),S=q((k-.5)*1.8,-.6,.6);S!==0&&l.contrast(1+S,!0);const A=l.matrix;A[0]*=q(1+(O-.5)*.8,.6,1.4),A[6]*=q(1+(F-.5)*.8,.6,1.4),A[12]*=q(1+(b-.5)*.8,.6,1.4)}}function Yo(l,t){const{opacity:e,zIndex:i,flip:s,left:r,top:o,width:a,height:n,angle:c}=l;t.x=r,t.y=o,t.width=Math.abs(a),t.height=Math.abs(n),t.angle=c,t.alpha=e,t.zIndex=i,s?.x?t.scale.x=-Math.abs(t.scale.x):t.scale.x=Math.abs(t.scale.x),s?.y?t.scale.y=-Math.abs(t.scale.y):t.scale.y=Math.abs(t.scale.y)}class pe{constructor(t,e,i=null){this.sprite=e,this.targetContainer=i,!i&&t&&(this.targetContainer=t.stage),this.resolution=t?.renderer?.resolution??1,this.root=new m.Container,this.root.label="RootContainer",this.root.visible=!1,this.animationContainer=new m.Container,this.animationContainer.label="AnimationContainer",this.root.addChild(this.animationContainer),this.targetContainer&&this.targetContainer.addChild(this.root)}sprite;targetContainer;pixiSprite=null;mirrorSprites=[];mirrorContainer=null;isMirrorActive=!1;texture=null;root=null;strokeGraphics=null;maskGraphics=null;shadowGraphics=null;shadowContainer=null;animationContainer=null;resolution=1;destroyed=!1;lastFrame=null;async updateFrame(t){if(this.destroyed)return;if(t===this.lastFrame){this.root!=null&&(this.root.visible=t!=null,this.applySpriteTransforms());return}if(this.lastFrame=t,t==null){this.root!=null&&(this.root.visible=!1,this.applySpriteTransforms());return}if(t instanceof m.Texture||t&&typeof t.source<"u"&&!(t instanceof VideoFrame)){if(t.width===0||t.height===0){console.warn("PixiSpriteRenderer: Texture has zero dimensions",t.width,t.height);return}this.pixiSprite==null?(this.pixiSprite=new m.Sprite(t),this.pixiSprite.label="MainSprite",this.animationContainer.addChild(this.pixiSprite),this.applySpriteTransforms()):this.pixiSprite.texture=t,this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms());return}const i=t.width,s=t.height;if(typeof i!="number"||typeof s!="number"||i<=0||s<=0){console.warn("PixiSpriteRenderer: Invalid frame dimensions",i,s),t instanceof VideoFrame&&t.close();return}if(this.texture!=null&&(this.texture.destroy(!0),this.texture=null),this.texture=m.Texture.from(t),!this.texture||!this.texture.source){console.error("PixiSpriteRenderer: Failed to create valid texture"),t instanceof VideoFrame&&t.close();return}this.pixiSprite==null?(this.pixiSprite=new m.Sprite(this.texture),this.pixiSprite.label="MainSprite",this.animationContainer.addChild(this.pixiSprite),this.applySpriteTransforms()):this.pixiSprite.texture=this.texture,t instanceof VideoFrame&&t.close(),this.root!=null&&(this.root.visible=!0,this.applySpriteTransforms())}applySpriteTransforms(){if(this.pixiSprite==null||this.root==null||this.destroyed)return;const{flip:t,center:e,width:i,height:s,angle:r,opacity:o,zIndex:a,renderTransform:n}=this.sprite,c=n?.x??0,h=n?.y??0,d=n?.angle??0,u=n?.scale??1,f=n?.scaleX??1,p=n?.scaleY??1,g=n?.opacity??1,v=n?.blur??0,x=n?.motionBlur??0,w=n?.brightness??1,T=(n?.mirror??0)>.5;this.root.renderTexturePadding=this.sprite.renderTexturePadding??0,this.root.x=e.x,this.root.y=e.y,this.root.angle=(t?.x||t?.y?-1:1)*r,this.root.alpha=o,this.root.zIndex=a,this.root.scale.set(1,1),this.animationContainer&&(this.animationContainer.x=c,this.animationContainer.y=h,this.animationContainer.angle=(t?.x||t?.y?-1:1)*d,this.animationContainer.alpha=g,this.animationContainer.scale.set(u*f,u*p),this.applyBlur(v),this.applyMotionBlur(x),this.applyBrightness(w),this.applySelectiveHsl(),this.applyChromaKey()),this.pixiSprite.anchor.set(.5,.5),this.pixiSprite.position.set(0,0);const y=this.pixiSprite.texture?.width??1,C=this.pixiSprite.texture?.height??1,k=this.sprite.type==="Caption",O=this.sprite.type==="Text",F=this.sprite.renderTexturePadding??0,b=k||O||F>0?1:i&&i!==0?Math.abs(i)/y:1,S=k||O||F>0?1:s&&s!==0?Math.abs(s)/C:1;if(T){if(!this.isMirrorActive){if(this.isMirrorActive=!0,this.mirrorContainer=new m.Container,this.mirrorContainer.label="MirrorContainer",this.animationContainer){const R=this.animationContainer.getChildIndex(this.pixiSprite);this.animationContainer.removeChild(this.pixiSprite),this.mirrorContainer.addChild(this.pixiSprite),this.animationContainer.addChildAt(this.mirrorContainer,R)}this.mirrorSprites=[];for(let R=0;R<8;R++){const B=new m.Sprite(this.pixiSprite.texture);B.label=`MirrorSprite_${R}`,B.anchor.set(.5,.5),this.mirrorContainer.addChild(B),this.mirrorSprites.push(B)}}for(const R of this.mirrorSprites)R.texture=this.pixiSprite.texture;const A=y*b,E=C*S;this.pixiSprite.position.set(0,0),this.pixiSprite.scale.set(b,S);const P=[[A,0,-b,S],[-A,0,-b,S],[0,E,b,-S],[0,-E,b,-S],[A,E,-b,-S],[-A,E,-b,-S],[A,-E,-b,-S],[-A,-E,-b,-S]];for(let R=0;R<8;R++){const[B,U,I,D]=P[R];this.mirrorSprites[R].position.set(B,U),this.mirrorSprites[R].scale.set(I,D)}if(t?.x){this.pixiSprite.scale.x=-b;for(let R=0;R<8;R++)this.mirrorSprites[R].scale.x=-P[R][2]}if(t?.y){this.pixiSprite.scale.y=-S;for(let R=0;R<8;R++)this.mirrorSprites[R].scale.y=-P[R][3]}}else{if(this.isMirrorActive&&(this.isMirrorActive=!1,this.mirrorContainer&&this.animationContainer)){const A=this.animationContainer.getChildIndex(this.mirrorContainer);this.mirrorContainer.removeChild(this.pixiSprite),this.animationContainer.addChildAt(this.pixiSprite,A);for(const E of this.mirrorSprites)E.destroy();this.mirrorSprites=[],this.animationContainer.removeChild(this.mirrorContainer),this.mirrorContainer.destroy(),this.mirrorContainer=null}this.pixiSprite.scale.x=t?.x?-b:b,this.pixiSprite.scale.y=t?.y?-S:S}this.applyStyle(),this.applyContainerAnimations()}applyContainerAnimations(){if(!this.animationContainer||this.destroyed)return;const e=this.sprite.renderTransform??{},i=e.mask;if(!i){if(this.animationContainer.mask){this.animationContainer.mask=null;const x=this.animationContainer.__maskGraphics;x&&(x.visible=!1)}return}const{progress:s,shape:r,direction:o,angle:a,origin:n,feather:c}=i;if(s>=1){this.animationContainer.mask=null;const x=this.animationContainer.__maskGraphics;x&&(x.visible=!1);return}const h=this._getMaskDimensions();if(h.width<=0||h.height<=0)return;const{width:d,height:u}=h;let f=this.animationContainer.__maskGraphics;f||(f=new m.Graphics,f.label="MaskGraphics",this.animationContainer.addChild(f),this.animationContainer.__maskGraphics=f),f.visible=!0,f.clear(),f.scale.set(1,1);const p=c??0,g=i.initialProgress??0,v=g+(1-g)*s;if(v<=0&&r!=="edgeCrop"){this.animationContainer.mask=f;return}if(r==="custom"&&i.painter)i.painter(f,d,u,v);else if(r==="edgeCrop"){const x=Math.max(.001,(e.scale??1)*(e.scaleX??1)),w=Math.max(.001,(e.scale??1)*(e.scaleY??1));f.scale.set(1/x,1/w),this._drawEdgeCropMask(f,d,u,v,n??"center",i.xDistance??100,i.yDistance??100,i.maskBorderRadius??0)}else if(r==="circle"||r==="ellipse")this._drawExpandMask(f,d,u,v,n??"center",r,p);else{const x=a??0;x!==0?this._drawAngleWipeMask(f,d,u,v,x,p):this._drawRectWipeMask(f,d,u,v,o??"left",p)}this.animationContainer.mask=f}_drawEdgeCropMask(t,e,i,s,r,o,a,n){const c=o*(1-s),h=a*(1-s);let d=-e/2,u=-i/2,f=e,p=i;switch(r){case"topLeft":f=e-c,p=i-h;break;case"topRight":d+=c,f=e-c,p=i-h;break;case"bottomLeft":u+=h,f=e-c,p=i-h;break;case"bottomRight":d+=c,u+=h,f=e-c,p=i-h;break;default:d+=c,u+=h,f=e-2*c,p=i-2*h}f<=0||p<=0||(n>0?t.roundRect(d,u,f,p,n).fill({color:16777215}):t.rect(d,u,f,p).fill({color:16777215}))}_getMaskDimensions(){const t=this.animationContainer,i=t.parent?.renderTexturePadding??0;if(t.children){for(const s of t.children)if(!(!s||s.label==="MaskGraphics"||s.label==="WipeMask")){if(s.label==="MainSprite"){const r=Math.abs(s.width??0)-i*2,o=Math.abs(s.height??0)-i*2;if(r>0&&o>0)return{width:r,height:o}}if(s.children){for(const r of s.children)if(r?.label==="MainSprite"){const o=Math.abs(r.width??0)-i*2,a=Math.abs(r.height??0)-i*2;if(o>0&&a>0)return{width:o,height:a}}}}}try{const s=t.getLocalBounds();if(s.width>0&&s.height>0)return{width:s.width-i*2,height:s.height-i*2}}catch{}return{width:0,height:0}}_drawRectWipeMask(t,e,i,s,r,o){let a=-e/2,n=-i/2,c=e,h=i;switch(r){case"left":c=e*s,a=-e/2;break;case"right":c=e*s,a=e/2-c;break;case"top":h=i*s,n=-i/2;break;case"bottom":h=i*s,n=i/2-h;break}c<=0||h<=0||(o>0?t.rect(a,n,c,h).fill({color:16777215,alpha:1}):t.rect(a,n,c,h).fill({color:16777215}))}_drawAngleWipeMask(t,e,i,s,r,o){const a=Math.sqrt(e*e+i*i),n=a*s;t.rotation=r*Math.PI/180,t.rect(-a/2,-a/2,n,a).fill({color:16777215}),t.rotation=0}_drawExpandMask(t,e,i,s,r,o,a){let n=0,c=0;switch(r){case"topLeft":n=-e/2,c=-i/2;break;case"topRight":n=e/2,c=-i/2;break;case"bottomLeft":n=-e/2,c=i/2;break;case"bottomRight":n=e/2,c=i/2;break;default:n=0,c=0}const h=[{x:-e/2,y:-i/2},{x:e/2,y:-i/2},{x:-e/2,y:i/2},{x:e/2,y:i/2}],u=Math.max(...h.map(f=>Math.hypot(f.x-n,f.y-c)))*s;if(o==="circle")t.circle(n,c,u).fill({color:16777215});else{const f=e/2*s,p=i/2*s;t.ellipse(n,c,f,p).fill({color:16777215})}}applyStyle(){if(this.pixiSprite==null||this.destroyed)return;const t=this.sprite.style||{},e=this.pixiSprite.texture?.width??0,i=this.pixiSprite.texture?.height??0;if(e===0||i===0)return;const s=Math.abs(this.sprite.width??0),r=Math.abs(this.sprite.height??0),o=t.borderRadius||0;o>0?(this.maskGraphics==null&&(this.maskGraphics=new m.Graphics,this.maskGraphics.label="MaskGraphics",this.maskGraphics._calculateBounds=()=>{},this.animationContainer.addChild(this.maskGraphics)),this.maskGraphics.clear(),this.maskGraphics.roundRect(-s/2,-r/2,s,r,Math.min(o,s/2,r/2)),this.maskGraphics.fill({color:16777215,alpha:1}),this.maskGraphics.visible=!0,this.pixiSprite.mask=null,this.pixiSprite.mask=this.maskGraphics):this.maskGraphics&&(this.maskGraphics.visible=!1,this.pixiSprite.mask=null),this.sprite.type!=="Text"&&this.sprite.type!=="Caption"&&this.sprite.type!=="Shape"?this.applyStroke(t):this.strokeGraphics&&(this.strokeGraphics.visible=!1),this.sprite.type!=="Text"&&this.sprite.type!=="Caption"&&this.sprite.type!=="Shape"?this.applyShadow(t):this.shadowContainer&&(this.shadowContainer.visible=!1,this.shadowContainer.filters=[])}applyStroke(t){const e=t.stroke;if(e&&e.width>0){this.strokeGraphics==null&&(this.strokeGraphics=new m.Graphics,this.strokeGraphics.label="StrokeGraphics",this.strokeGraphics._calculateBounds=()=>{},this.animationContainer.addChild(this.strokeGraphics)),this.strokeGraphics.clear();const i=$(e.color)??16777215,s=e.width,r=t.borderRadius||0,o=Math.abs(this.sprite.width??0),a=Math.abs(this.sprite.height??0);let n=1;if(e.alignment!==void 0&&(typeof e.alignment=="number"?n=e.alignment:e.alignment==="center"||e.alignment==="middle"?n=.5:e.alignment==="inside"?n=0:e.alignment==="outside"&&(n=1)),this.strokeGraphics.setStrokeStyle({width:s,color:i,alignment:n}),r>0){const c=Math.min(r,o/2,a/2);this.strokeGraphics.roundRect(-o/2,-a/2,o,a,c)}else this.strokeGraphics.rect(-o/2,-a/2,o,a);this.strokeGraphics.stroke(),this.strokeGraphics.visible=!0}else this.strokeGraphics!=null&&(this.strokeGraphics.visible=!1)}applyShadow(t){const e=t.shadow,i=Math.abs(this.sprite.width??0),s=Math.abs(this.sprite.height??0);if(e&&i>0&&s>0&&(e.blur>0||(e.offsetX??0)!==0||(e.offsetY??0)!==0)){this.shadowContainer==null&&(this.shadowContainer=new m.Container,this.shadowContainer.label="ShadowContainer",this.shadowContainer._calculateBounds=()=>{},this.shadowGraphics=new m.Graphics,this.shadowGraphics.label="ShadowGraphics",this.shadowGraphics._calculateBounds=()=>{},this.shadowContainer.addChild(this.shadowGraphics),this.animationContainer.addChildAt(this.shadowContainer,0));const r=$(e.color)??0,o=e.alpha??.5,a=e.blur??0,n=e.offsetX??0,c=e.offsetY??0;this.shadowContainer.position.set(n,c),this.shadowGraphics.clear();const h=t.borderRadius||0;if(h>0){const d=Math.min(h,i/2,s/2);this.shadowGraphics.roundRect(-i/2,-s/2,i,s,d)}else this.shadowGraphics.rect(-i/2,-s/2,i,s);if(this.shadowGraphics.fill({color:r,alpha:o}),a>0){(!this.shadowContainer.filters||this.shadowContainer.filters.length===0)&&(this.shadowContainer.filters=[new m.BlurFilter]);const d=this.shadowContainer.filters[0],u=this.root?Math.sqrt(this.root.worldTransform.a**2+this.root.worldTransform.b**2):1;d.strength=a*u,d.resolution=this.resolution,d.padding=Math.max(a*2*u,20)}else this.shadowContainer.filters=[];this.shadowContainer.visible=!0}else this.shadowContainer!=null&&(this.shadowContainer.visible=!1,this.shadowContainer.filters=[])}applyBlur(t){if(!this.animationContainer||this.destroyed)return;if(typeof t!="number"||!isFinite(t)||t<=0){this.animationContainer.filters&&this.animationContainer.filters.length>0&&(this.animationContainer.filters=[]);return}let e=this.animationContainer.filters?.find(r=>r instanceof m.BlurFilter);if(!e){e=new m.BlurFilter;const r=this.animationContainer.filters||[];this.animationContainer.filters=[...r,e]}const i=this.root?Math.sqrt(this.root.worldTransform.a**2+this.root.worldTransform.b**2):1,s=Math.max(i,.001);e.strength=t*s,e.resolution=this.resolution,e.padding=Math.max(t*2*s,20),e.quality=4,e.repeatEdgePixels=!0}applyMotionBlur(t){if(!this.animationContainer||this.destroyed)return;if(typeof t!="number"||!isFinite(t)||t<=0){this.animationContainer.filters&&(this.animationContainer.filters=this.animationContainer.filters.filter(i=>!(i instanceof Q.ZoomBlurFilter)));return}let e=this.animationContainer.filters?.find(i=>i instanceof Q.ZoomBlurFilter);if(!e){e=new Q.ZoomBlurFilter;const i=this.animationContainer.filters||[];this.animationContainer.filters=[...i,e]}if(e.strength=t/200,this.pixiSprite){const i=this.pixiSprite.getBounds();e.center={x:i.width/2,y:i.height/2}}e.innerRadius=0,e.radius=-1}applyBrightness(t){if(!this.animationContainer||this.destroyed)return;const e=fe(this.sprite.colorAdjustment);if(t===1&&!e){this.animationContainer.filters&&(this.animationContainer.filters=this.animationContainer.filters.filter(s=>s.label!=="ColorAdjustmentFilter"));return}let i=this.animationContainer.filters?.find(s=>s.label==="ColorAdjustmentFilter");if(!i){i=new m.ColorMatrixFilter,i.label="ColorAdjustmentFilter";const s=this.animationContainer.filters||[];this.animationContainer.filters=[...s,i]}ue(i,this.sprite.colorAdjustment,t)}applySelectiveHsl(){if(!this.animationContainer||this.destroyed)return;const t=Xt(this.sprite.colorAdjustment),e=(this.animationContainer.filters||[]).filter(s=>!s.label?.startsWith("SelectiveHslFilter"));if(t.length===0){this.animationContainer.filters=e;return}const i=[];for(let s=0;s<t.length;s++){const r=t[s],o=new m.UniformGroup({uTargetColor:{value:[1,1,0],type:"vec3<f32>"},uHueShift:{value:r.hue,type:"f32"},uSatShift:{value:r.saturation/100,type:"f32"},uLightShift:{value:r.lightness/100,type:"f32"},uTolerance:{value:.22,type:"f32"},uSoftness:{value:.12,type:"f32"}}),a=Bt(r.targetColor);a&&(o.uniforms.uTargetColor[0]=a.r/255,o.uniforms.uTargetColor[1]=a.g/255,o.uniforms.uTargetColor[2]=a.b/255);const n=new m.Filter({glProgram:new m.GlProgram({vertex:Et,fragment:de,name:`SelectiveHslShader_${s}`}),resources:{hslUniforms:o}});n.label=`SelectiveHslFilter_${s}`,i.push(n)}this.animationContainer.filters=[...e,...i]}applyChromaKey(){if(!this.animationContainer||this.destroyed)return;const{chromaKey:t}=this.sprite;if(!t||!t.enabled){this.animationContainer.filters&&(this.animationContainer.filters=this.animationContainer.filters.filter(r=>r.label!=="ChromaKeyFilter"));return}let e=this.animationContainer.filters?.find(r=>r.label==="ChromaKeyFilter");if(!e){const r=new m.GlProgram({vertex:Et,fragment:hi,name:"ChromaKeyShader"}),o=new m.UniformGroup({uKeyColor:{value:[0,1,0],type:"vec3<f32>"},uSimilarity:{value:.1,type:"f32"},uSpill:{value:0,type:"f32"}});e=new m.Filter({glProgram:r,resources:{chromaUniforms:o}}),e.label="ChromaKeyFilter";const a=this.animationContainer.filters||[];this.animationContainer.filters=[...a,e]}const i=e.resources.chromaUniforms.uniforms,s=Bt(t.color);s&&(i.uKeyColor[0]=s.r/255,i.uKeyColor[1]=s.g/255,i.uKeyColor[2]=s.b/255),i.uSimilarity=t.similarity,i.uSpill=t.spill}updateTransforms(){this.root!=null&&!this.destroyed&&this.applySpriteTransforms()}getSprite(){return this.pixiSprite}getRoot(){return this.root}destroy(){this.destroyed||(this.destroyed=!0,this.root!=null&&(this.root.parent&&this.root.parent.removeChild(this.root),this.root.destroy({children:!0}),this.root=null,this.pixiSprite=null),this.strokeGraphics!=null&&(this.strokeGraphics.destroy(),this.strokeGraphics=null),this.maskGraphics!=null&&(this.maskGraphics.destroy(),this.maskGraphics=null),this.shadowGraphics!=null&&(this.shadowGraphics.destroy(),this.shadowGraphics=null),this.shadowContainer!=null&&(this.shadowContainer.destroy({children:!0}),this.shadowContainer=null),this.texture!=null&&(this.texture.destroy(),this.texture=null))}}const Qo=`
2224
2224
  in vec2 aPosition;
2225
2225
  out vec2 _uv;
2226
2226
  uniform mat3 projectionMatrix;
@@ -2251,7 +2251,7 @@ void main(void)
2251
2251
  vec2 absolute = aPosition * uOutputFrame.zw + uOutputFrame.xy;
2252
2252
  _uv = absolute / uOutputTexture.xy;
2253
2253
  }
2254
- `,J={custom:l=>{const t=l.defaultParams||{},e=l.paramsTypes||{};return Object.fromEntries(Object.entries(t).map(([i,s])=>[i,{value:s,type:Wo(e[i])}]))},basics:{_fromR:{value:1,type:"f32"},_toR:{value:1,type:"f32"},ratio:{value:1,type:"f32"},progress:{value:0,type:"f32"},customUniform:{value:0,type:"f32"},center:{value:[.5,.5],type:"vec2<f32>"}}},Wo=l=>l==="f32"||l==="i32"?l:l==="float"?"f32":`${l}<f32>`,Vo=l=>`
2254
+ `,j={custom:l=>{const t=l.defaultParams||{},e=l.paramsTypes||{};return Object.fromEntries(Object.entries(t).map(([i,s])=>[i,{value:s,type:jo(e[i])}]))},basics:{_fromR:{value:1,type:"f32"},_toR:{value:1,type:"f32"},ratio:{value:1,type:"f32"},progress:{value:0,type:"f32"},customUniform:{value:0,type:"f32"},center:{value:[.5,.5],type:"vec2<f32>"}}},jo=l=>l==="f32"||l==="i32"?l:l==="float"?"f32":`${l}<f32>`,Jo=l=>`
2255
2255
  precision highp float;
2256
2256
  in vec2 vTextureCoord;
2257
2257
  in vec2 _uv; // Normalized [0,1] coordinates with center at (0.5, 0.5) for canvas-centered transitions
@@ -2293,7 +2293,7 @@ void main(void)
2293
2293
  vec2 uv = _uv;
2294
2294
  gl_FragColor = transition(uv);
2295
2295
  }
2296
- `,Yo=`
2296
+ `,Zo=`
2297
2297
  const float PI = 3.141592653589;
2298
2298
 
2299
2299
  vec4 transition(vec2 p) {
@@ -2303,7 +2303,7 @@ vec4 transition(vec2 p) {
2303
2303
  float mix_factor = smoothstep(0.0, 0.1, angle - threshold);
2304
2304
  return mix(getToColor(p), getFromColor(p), mix_factor);
2305
2305
  }
2306
- `,Qo=`
2306
+ `,Ko=`
2307
2307
  uniform vec2 gridSize;
2308
2308
  uniform float pause;
2309
2309
  uniform float dividerWidth;
@@ -2369,7 +2369,7 @@ vec4 transition(vec2 p) {
2369
2369
  }
2370
2370
  return mix(bgColor, getToColor(p), a);
2371
2371
  }
2372
- `,jo={gridSize:{value:[4,4],type:"vec2<f32>"},pause:{value:.1,type:"f32"},dividerWidth:{value:.05,type:"f32"},bgColor:{value:[0,0,0,1],type:"vec4<f32>"},randomness:{value:.1,type:"f32"}},Jo=`
2372
+ `,Xo={gridSize:{value:[4,4],type:"vec2<f32>"},pause:{value:.1,type:"f32"},dividerWidth:{value:.05,type:"f32"},bgColor:{value:[0,0,0,1],type:"vec4<f32>"},randomness:{value:.1,type:"f32"}},qo=`
2373
2373
  uniform vec3 backColor;
2374
2374
 
2375
2375
  vec4 transition(vec2 uv) {
@@ -2383,7 +2383,7 @@ vec4 transition(vec2 uv) {
2383
2383
  else return getToColor(uv);
2384
2384
  }
2385
2385
  }
2386
- `,Zo=`
2386
+ `,_o=`
2387
2387
  uniform vec2 direction;
2388
2388
 
2389
2389
  vec4 transition(vec2 uv) {
@@ -2395,7 +2395,7 @@ vec4 transition(vec2 uv) {
2395
2395
  step(0.0, p.y) * step(p.y, 1.0) * step(0.0, p.x) * step(p.x, 1.0)
2396
2396
  );
2397
2397
  }
2398
- `,Ko={direction:{value:[0,1],type:"vec2<f32>"}},Xo=`
2398
+ `,$o={direction:{value:[0,1],type:"vec2<f32>"}},tn=`
2399
2399
  uniform float smoothness;
2400
2400
  uniform vec3 color;
2401
2401
 
@@ -2438,7 +2438,7 @@ vec4 transition(vec2 p) {
2438
2438
  vec4 cto = getToColor(p);
2439
2439
  return mix(mix(cfrom, cto, m), mix(cfrom, vec4(color, 1.0), 0.75), step(m, -2.0));
2440
2440
  }
2441
- `,qo={smoothness:{value:.1,type:"f32"},center:{value:[.5,.5],type:"vec2<f32>"},color:{value:[1,.5,0],type:"vec3<f32>"}},_o=`
2441
+ `,en={smoothness:{value:.1,type:"f32"},center:{value:[.5,.5],type:"vec2<f32>"},color:{value:[1,.5,0],type:"vec3<f32>"}},sn=`
2442
2442
  uniform ivec2 squares;
2443
2443
  uniform vec2 direction;
2444
2444
  uniform float smoothness;
@@ -2455,7 +2455,7 @@ vec4 transition (vec2 p) {
2455
2455
  float a = (1.0 - step(progress, 0.0)) * step(squaremin.x, squarep.x) * step(squaremin.y, squarep.y) * step(squarep.x, squaremax.x) * step(squarep.y, squaremax.y);
2456
2456
  return mix(getFromColor(p), getToColor(p), a);
2457
2457
  }
2458
- `,$o={squares:{value:[10,10],type:"vec2<i32>"},direction:{value:[1,-.5],type:"vec2<f32>"},smoothness:{value:1.6,type:"f32"}},tn=`
2458
+ `,rn={squares:{value:[10,10],type:"vec2<i32>"},direction:{value:[1,-.5],type:"vec2<f32>"},smoothness:{value:1.6,type:"f32"}},on=`
2459
2459
  #define PI 3.14159265359
2460
2460
 
2461
2461
  uniform float rotations;
@@ -2483,7 +2483,7 @@ vec4 transition (vec2 uv) {
2483
2483
 
2484
2484
  return mix(getFromColor(rotatedUv), getToColor(rotatedUv), progress);
2485
2485
  }
2486
- `,en={center:{value:[.5,.5],type:"vec2<f32>"},rotations:{value:1,type:"f32"},scale:{value:8,type:"f32"},backColor:{value:[.15,.15,.15,1],type:"vec4<f32>"}},sn=`
2486
+ `,nn={center:{value:[.5,.5],type:"vec2<f32>"},rotations:{value:1,type:"f32"},scale:{value:8,type:"f32"},backColor:{value:[.15,.15,.15,1],type:"vec4<f32>"}},an=`
2487
2487
  uniform ivec2 size;
2488
2488
  uniform float smoothness;
2489
2489
 
@@ -2496,7 +2496,7 @@ vec4 transition(vec2 p) {
2496
2496
  float m = smoothstep(0.0, -smoothness, r - (progress * (1.0 + smoothness)));
2497
2497
  return mix(getFromColor(p), getToColor(p), m);
2498
2498
  }
2499
- `,rn={size:{value:[10,10],type:"vec2<i32>"},smoothness:{value:.5,type:"f32"}},on=`
2499
+ `,ln={size:{value:[10,10],type:"vec2<i32>"},smoothness:{value:.5,type:"f32"}},cn=`
2500
2500
  #define PI 3.14159265359
2501
2501
 
2502
2502
  uniform int segments;
@@ -2513,7 +2513,7 @@ vec4 transition (vec2 uv) {
2513
2513
  else
2514
2514
  return getToColor(uv);
2515
2515
  }
2516
- `,nn={segments:{value:5,type:"i32"}},an=`
2516
+ `,hn={segments:{value:5,type:"i32"}},dn=`
2517
2517
  uniform ivec2 squaresMin;
2518
2518
  uniform int steps;
2519
2519
 
@@ -2525,7 +2525,7 @@ vec4 transition(vec2 uv) {
2525
2525
  vec2 p = dist>0.0 ? (floor(uv / squareSize) + 0.5) * squareSize : uv;
2526
2526
  return mix(getFromColor(p), getToColor(p), progress);
2527
2527
  }
2528
- `,ln={squaresMin:{value:[20,20],type:"vec2<i32>"},steps:{value:50,type:"i32"}},cn=`
2528
+ `,fn={squaresMin:{value:[20,20],type:"vec2<i32>"},steps:{value:50,type:"i32"}},un=`
2529
2529
  uniform float scale;
2530
2530
  uniform float smoothness;
2531
2531
  uniform float seed;
@@ -2582,7 +2582,7 @@ vec4 transition (vec2 uv) {
2582
2582
  1.0 - q
2583
2583
  );
2584
2584
  }
2585
- `,hn={scale:{value:4,type:"f32"},smoothness:{value:.01,type:"f32"},seed:{value:12.9898,type:"f32"}},dn=`
2585
+ `,pn={scale:{value:4,type:"f32"},smoothness:{value:.01,type:"f32"},seed:{value:12.9898,type:"f32"}},mn=`
2586
2586
 
2587
2587
  #define PI 3.14159265358979323846
2588
2588
 
@@ -2614,7 +2614,7 @@ vec4 transition(vec2 uv) {
2614
2614
  }
2615
2615
 
2616
2616
 
2617
- `,un={spiralTurns:{value:1.5,type:"f32"},spiralWidth:{value:.02,type:"f32"}},fn=`
2617
+ `,gn={spiralTurns:{value:1.5,type:"f32"},spiralWidth:{value:.02,type:"f32"}},vn=`
2618
2618
  //direction of movement : 0 : up, 1, down
2619
2619
  uniform float direction; // = 1.0 (using float instead of bool for WebGPU)
2620
2620
 
@@ -2729,7 +2729,7 @@ vec4 transition(vec2 uv) {
2729
2729
  return mix(getFromColor(p), getToColor(p), m);
2730
2730
  }
2731
2731
  }
2732
- `,pn={direction:{value:1,type:"f32"},l_threshold:{value:.8,type:"f32"},above:{value:0,type:"f32"}},mn=`
2732
+ `,yn={direction:{value:1,type:"f32"},l_threshold:{value:.8,type:"f32"},above:{value:0,type:"f32"}},xn=`
2733
2733
  uniform int steps; // = 50
2734
2734
  uniform float horizontalHexagons; // = 20.0
2735
2735
 
@@ -2794,7 +2794,7 @@ vec4 transition (vec2 uv) {
2794
2794
 
2795
2795
  return mix(getFromColor(point), getToColor(point), progress);
2796
2796
  }
2797
- `,gn={steps:{value:50,type:"i32"},horizontalHexagons:{value:20,type:"f32"}},vn=`
2797
+ `,wn={steps:{value:50,type:"i32"},horizontalHexagons:{value:20,type:"f32"}},bn=`
2798
2798
  float inHeart (vec2 p, vec2 center, float size) {
2799
2799
  if (size==0.0) return 0.0;
2800
2800
  vec2 o = (p-center)/(1.6*size);
@@ -2810,7 +2810,7 @@ vec4 transition (vec2 uv) {
2810
2810
  inHeart(uv, vec2(0.5, 0.5), progress)
2811
2811
  );
2812
2812
  }
2813
- `,yn={},xn=`
2813
+ `,Cn={},Tn=`
2814
2814
  uniform sampler2D displacementMap;
2815
2815
  uniform float strength; // = 0.5
2816
2816
 
@@ -2826,7 +2826,7 @@ vec4 transition (vec2 uv) {
2826
2826
  progress
2827
2827
  );
2828
2828
  }
2829
- `,wn={strength:{value:.5,type:"f32"}},bn=`
2829
+ `,Sn={strength:{value:.5,type:"f32"}},An=`
2830
2830
  uniform vec2 direction; // = vec2(1.0, -1.0)
2831
2831
  uniform float smoothness; // = 0.5
2832
2832
 
@@ -2841,7 +2841,7 @@ vec4 transition (vec2 uv) {
2841
2841
  (1.0 - smoothstep(-smoothness, 0.0, v.x * uv.x + v.y * uv.y - (d-0.5+progress*(1.+smoothness))));
2842
2842
  return mix(getFromColor(uv), getToColor(uv), m);
2843
2843
  }
2844
- `,Cn={direction:{value:[1,-1],type:"vec2<f32>"},smoothness:{value:.5,type:"f32"}},Tn=`
2844
+ `,kn={direction:{value:[1,-1],type:"vec2<f32>"},smoothness:{value:.5,type:"f32"}},Fn=`
2845
2845
  uniform vec2 direction; // = vec2(-1.0, 1.0)
2846
2846
 
2847
2847
  const float smoothness = 0.5;
@@ -2854,7 +2854,7 @@ vec4 transition (vec2 uv) {
2854
2854
  float m = 1.0 - smoothstep(-smoothness, 0.0, v.x * uv.x + v.y * uv.y - (d - 0.5 + progress * (1.0 + smoothness)));
2855
2855
  return mix(getFromColor((uv - 0.5) * (1.0 - m) + 0.5), getToColor((uv - 0.5) * m + 0.5), m);
2856
2856
  }
2857
- `,Sn={direction:{value:[-1,1],type:"vec2<f32>"}},An=`
2857
+ `,Rn={direction:{value:[-1,1],type:"vec2<f32>"}},Mn=`
2858
2858
  uniform float threshold; // = 3.0
2859
2859
  uniform float fadeEdge; // = 0.1
2860
2860
 
@@ -2869,7 +2869,7 @@ vec4 transition(vec2 p) {
2869
2869
  float r = progress - min(rand(vec2(p.y, 0.0)), rand(vec2(0.0, p.x)));
2870
2870
  return mix(getFromColor(p), getToColor(p), mix(0.0, mix(step(dist, r), 1.0, smoothstep(1.0-fadeEdge, 1.0, progress)), smoothstep(0.0, fadeEdge, progress)));
2871
2871
  }
2872
- `,kn={threshold:{value:3,type:"f32"},fadeEdge:{value:.1,type:"f32"}},Fn=`
2872
+ `,On={threshold:{value:3,type:"f32"},fadeEdge:{value:.1,type:"f32"}},En=`
2873
2873
  uniform float smoothness; // = 0.3
2874
2874
  uniform float opening; // = 1.0 (using float instead of bool for WebGPU: 1.0 = true, 0.0 = false)
2875
2875
 
@@ -2881,7 +2881,7 @@ vec4 transition (vec2 uv) {
2881
2881
  float m = smoothstep(-smoothness, 0.0, SQRT_2*distance(center, uv) - x*(1.0+smoothness));
2882
2882
  return mix(getFromColor(uv), getToColor(uv), opening > 0.5 ? 1.0 - m : m);
2883
2883
  }
2884
- `,ai={smoothness:{value:.3,type:"f32"},opening:{value:1,type:"f32"}},Rn=`
2884
+ `,di={smoothness:{value:.3,type:"f32"},opening:{value:1,type:"f32"}},Dn=`
2885
2885
  vec4 transition (vec2 uv) {
2886
2886
  if(progress == 0.0){
2887
2887
  return getFromColor(uv);
@@ -2893,7 +2893,7 @@ vec4 transition (vec2 uv) {
2893
2893
  float o = atan(leaf_uv.y, leaf_uv.x);
2894
2894
  return mix(getFromColor(uv), getToColor(uv), 1.0-step(1.0 - length(leaf_uv)+r*(1.0+sin(o))*(1.0+0.9 * cos(8.0*o))*(1.0+0.1*cos(24.0*o))*(0.9+0.05*cos(200.0*o)), 1.0));
2895
2895
  }
2896
- `,Mn={},On=`
2896
+ `,Pn={},In=`
2897
2897
  uniform float zoom; // = 0.88
2898
2898
  uniform float corner_radius; // = 0.22
2899
2899
 
@@ -3053,7 +3053,7 @@ vec4 transition(vec2 uv) {
3053
3053
  return getToColor(p);
3054
3054
  }
3055
3055
  }
3056
- `,En={zoom:{value:.88,type:"f32"},corner_radius:{value:.22,type:"f32"}},Dn=`
3056
+ `,Bn={zoom:{value:.88,type:"f32"},corner_radius:{value:.22,type:"f32"}},Nn=`
3057
3057
  float random(vec2 co) {
3058
3058
  float a = 12.9898;
3059
3059
  float b = 78.233;
@@ -3122,7 +3122,7 @@ vec4 transition(vec2 uv) {
3122
3122
  color2 = mix(color2, dColor1, smoothstep(1.0, 0.5, progress));
3123
3123
  return mix(color1, color2, val);
3124
3124
  }
3125
- `,Pn=`
3125
+ `,zn=`
3126
3126
  uniform float strength; // = 0.4
3127
3127
 
3128
3128
  const float PI = 3.141592653589793;
@@ -3179,7 +3179,7 @@ vec4 transition(vec2 uv) {
3179
3179
  }
3180
3180
  return vec4(color / total, 1.0);
3181
3181
  }
3182
- `,In={strength:{value:.4,type:"f32"}},Bn=`
3182
+ `,Ln={strength:{value:.4,type:"f32"}},Hn=`
3183
3183
  uniform float a; // = 4
3184
3184
  uniform float b; // = 1
3185
3185
  uniform float amplitude; // = 120
@@ -3194,7 +3194,7 @@ vec4 transition(vec2 uv) {
3194
3194
  vec2 offset = dir * vec2(sin(progress * dist * amplitude * x), sin(progress * dist * amplitude * y)) / smoothness;
3195
3195
  return mix(getFromColor(p + offset), getToColor(p), smoothstep(0.2, 1.0, progress));
3196
3196
  }
3197
- `,Nn={a:{value:4,type:"f32"},b:{value:1,type:"f32"},amplitude:{value:120,type:"f32"},smoothness:{value:.1,type:"f32"}},zn=`
3197
+ `,Gn={a:{value:4,type:"f32"},b:{value:1,type:"f32"},amplitude:{value:120,type:"f32"},smoothness:{value:.1,type:"f32"}},Un=`
3198
3198
  // License: MIT
3199
3199
 
3200
3200
  vec2 bottom_left = vec2(0.0, 1.0);
@@ -3313,7 +3313,7 @@ vec4 transition (vec2 uv) {
3313
3313
  return getFromColor(uv);
3314
3314
  }
3315
3315
  }
3316
- `,Ln=`
3316
+ `,Wn=`
3317
3317
 
3318
3318
  const float SQRT_2 = 1.414213562373;
3319
3319
  uniform float dots;// = 20.0;
@@ -3322,7 +3322,7 @@ vec4 transition(vec2 uv) {
3322
3322
  bool nextImage = distance(fract(uv * dots), vec2(0.5, 0.5)) < ( progress / distance(uv, center));
3323
3323
  return nextImage ? getToColor(uv) : getFromColor(uv);
3324
3324
  }
3325
- `,Hn={radialSwipe:{label:"Radial Swipe",fragment:Yo}},Kt={};function Gn(l,t){Kt[l]=t}function Un(l){delete Kt[l]}function Ot(){return{...bt.reduce((l,t)=>(l[t.name]={label:t.name,fragment:t.glsl,uniforms:t.defaultParams,previewDynamic:""},l),{}),...Hn,...Kt}}Ot();function li(){const l=Object.keys(Kt);return Object.entries(Ot()).map(([t,e])=>{const i=xe.getTransitionByKey(t);return{key:t,label:i?.name??e.label,description:i?.description,category:i?.category,isCustom:l.includes(t)||(i?.isCustom??!1),previewStatic:e.previewStatic||`https://cdn.subgen.co/previews/static/transition_${t}_static.webp`,previewDynamic:e.previewDynamic||`https://cdn.subgen.co/previews/dynamic/transition_${t}_dynamic.webp`}})}const Wn=li();function fe({name:l,renderer:t}){let e=bt.find(G=>G.name===l);if(!e){const G=Ot(),H=Object.keys(G).find(Y=>Y.toLowerCase()===l.toLowerCase());H&&(e=G[H])}if(e||(e=bt.find(G=>G.name.toLowerCase()===l.toLowerCase())),!e){const G=[l,l.toLowerCase(),l.charAt(0).toUpperCase()+l.slice(1).toLowerCase(),l.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,""),l.replace(/_/g,"")],H=Ot();for(const Y of G){if(e=bt.find(wt=>wt.name.toLowerCase()===Y.toLowerCase()),e)break;const q=Object.keys(H).find(wt=>wt.toLowerCase()===Y.toLowerCase());if(q){e=H[q];break}}}if(!e){const G=bt.length,H=bt.slice(0,5).map(wt=>wt.name).join(", "),Y=Ot(),q=Object.keys(Y).slice(0,3).join(", ");throw console.error(`Transition not found: "${l}". Available in gl-transitions (${G} total):`,H+"..."),console.error("Available locally:",q+"..."),new Error(`Transition "${l}" not found in gl-transitions library or local definitions`)}const i=new m.Sprite(m.Texture.WHITE),s=m.RenderTexture.create({width:t.width,height:t.height}),r=new m.ImageSource({}),o=new m.ImageSource({}),a=e.name==="displacement"||l.toLowerCase()==="displacement"||e.label==="displacement",n=a?new m.ImageSource({}):void 0;let c=null;if(a){c=document.createElement("canvas"),c.width=256,c.height=256;const G=c.getContext("2d");if(G){const H=G.createImageData(256,256);for(let Y=0;Y<H.data.length;Y+=4){const q=Math.random();H.data[Y]=q*255,H.data[Y+1]=q*255,H.data[Y+2]=q*255,H.data[Y+3]=255}G.putImageData(H,0,0)}}let h=e.glsl||e.fragment;if(!h)throw new Error(`Transition "${l}" has no glsl or fragment code`);let d={...J.basics,...J.custom(e)};Object.entries(d).forEach(([,G])=>{G.type==="int<f32>"&&(G.type="i32",typeof G.value=="number"&&(G.value=Math.trunc(G.value))),G.type==="ivec2<f32>"&&(G.type="vec2<f32>")});const f=e.name==="GridFlip"||l.toLowerCase()==="gridflip"||e.label==="gridflip",u=e.name==="circle"||l.toLowerCase()==="circle"||e.label==="circle",p=e.name==="directional"||l.toLowerCase()==="directional"||e.label==="directional",g=e.name==="UndulatingBurnOut"||l.toLowerCase()==="undulatingburnout"||e.label==="undulatingBurnOut",v=e.name==="SquaresWire"||l.toLowerCase()==="squareswire"||e.label==="squaresWire",x=e.name==="rotate_scale_fade"||l.toLowerCase()==="rotatescalefade"||e.label==="rotateScaleFade",w=e.name==="RandomSquares"||l.toLowerCase()==="randomsquares"||e.label==="randomSquares",T=e.name==="polar_function"||l.toLowerCase()==="polar_function"||e.label==="polar_function",y=e.name==="pixelate"||l.toLowerCase()==="pixelate"||e.label==="pixelate",C=e.name==="perlin"||l.toLowerCase()==="perlin"||e.label==="perlin",k=e.name==="luma"||l.toLowerCase()==="luma"||e.label==="luma",O=e.name==="luminance_melt"||l.toLowerCase()==="luminance_melt"||l.toLowerCase()==="luminancemelt"||e.label==="luminance_melt",F=e.name==="hexagonalize"||l.toLowerCase()==="hexagonalize"||e.label==="hexagonalize",b=e.name==="heart"||l.toLowerCase()==="heart"||e.label==="heart",S=e.name==="displacement"||l.toLowerCase()==="displacement"||e.label==="displacement",A=e.name==="directionalwipe"||l.toLowerCase()==="directionalwipe"||l.toLowerCase()==="directional_wipe"||e.label==="directionalwipe",E=e.name==="directionalwarp"||l.toLowerCase()==="directionalwarp"||l.toLowerCase()==="directional_warp"||e.label==="directionalwarp",P=e.name==="crosshatch"||l.toLowerCase()==="crosshatch"||e.label==="crosshatch",R=e.name==="circleopen"||l.toLowerCase()==="circleopen"||l.toLowerCase()==="circle_open"||e.label==="circleopen",B=e.name==="cannabisleaf"||l.toLowerCase()==="cannabisleaf"||l.toLowerCase()==="cannabis_leaf"||e.label==="cannabisleaf",W=e.name==="StereoViewer"||l.toLowerCase()==="stereoviewer"||l.toLowerCase()==="stereo_viewer"||e.label==="StereoViewer",I=e.name==="GlitchDisplace"||l.toLowerCase()==="glitchDisplace"||e.label==="GlitchDisplace",D=e.name==="CrossZoom"||l.toLowerCase()==="crosszoom"||e.label==="CrossZoom",z=e.name==="CrazyParametricFun"||l.toLowerCase()==="crazyparametricfun"||e.label==="CrazyParametricFun",U=e.name==="BowTieHorizontal"||l.toLowerCase()==="bowtiehorizontal"||e.label==="BowTieHorizontal",Z=e.name==="PolkaDotsCurtain"||l.toLowerCase()==="polkadotscurtain"||e.label==="PolkaDotsCurtain",N=e.name==="Pixelize"||l.toLowerCase()==="pixelize"||e.label==="Pixelize";f&&(h=Qo,d={...J.basics,...jo}),u&&(h=Jo,d={...J.basics,...ai}),p&&(h=Zo,d={...J.basics,...Ko}),g&&(h=Xo,d={...J.basics,...qo}),v&&(h=_o,d={...J.basics,...$o}),x&&(h=tn,d={...J.basics,...en}),w&&(h=sn,d={...J.basics,...rn}),T&&(h=on,d={...J.basics,...nn}),y&&(h=ri,d={...J.basics,...oi}),C&&(h=cn,d={...J.basics,...hn}),k&&(h=dn,d={...J.basics,...un}),O&&(h=fn,d={...J.basics,...pn}),F&&(h=mn,d={...J.basics,...gn}),b&&(h=vn,d={...J.basics,...yn}),S&&(h=xn,d={...J.basics,...wn}),A&&(h=bn,d={...J.basics,...Cn}),E&&(h=Tn,d={...J.basics,...Sn}),P&&(h=An,d={...J.basics,...kn}),R&&(h=Fn,d={...J.basics,...ai}),B&&(h=Rn,d={...J.basics,...Mn}),W&&(h=On,d={...J.basics,...En}),I&&(h=Dn),D&&(h=Pn,d={...J.basics,...In}),z&&(h=Bn,d={...J.basics,...Nn}),U&&(h=zn),Z&&(h=Ln),N&&(h=an,d={...J.basics,...ln});const V={from:r,to:o,uniforms:d};a&&n&&(V.displacementMap=n,c&&(n.resource=c,n.update()));const K=new m.Filter({glProgram:new m.GlProgram({vertex:Uo,fragment:Vo(h)}),resources:V});return i.filters=[K],{render({width:G,height:H,from:Y,to:q,progress:wt,values:pi}){if((i.width!==G||i.height!==H)&&(i.setSize({width:G,height:H}),s.resize(G,H)),pi){const Et=K.resources.uniforms.uniforms;for(const[ct,gt]of Object.entries(pi))ct!=="progress"&&Et[ct]!==void 0&&(Et[ct]=gt)}if(Y instanceof m.Texture?K.resources.from=Y.source:(r.resource=Y,r.update(),K.resources.from=r),q instanceof m.Texture?K.resources.to=q.source:(o.resource=q,o.update(),K.resources.to=o),a&&n&&c){if(c.width!==G||c.height!==H){c.width=G,c.height=H;const Et=c.getContext("2d");if(Et){const ct=Et.createImageData(G,H);for(let gt=0;gt<ct.data.length;gt+=4){const ve=Math.random();ct.data[gt]=ve*255,ct.data[gt+1]=ve*255,ct.data[gt+2]=ve*255,ct.data[gt+3]=255}Et.putImageData(ct,0,0)}}n.resource=c,n.update()}return K.resources.uniforms.uniforms.progress=wt,t.render({container:i,target:s,clear:!0,width:G,height:H}),s},destroy(){s.destroy(),i.destroy({children:!0})}}}function Vn(l){const{clip:t,tex:e,rootContainer:i,tempSprite:s,pooled:r,scaleX:o,scaleY:a}=l,n=t.style||{},{renderTransform:c}=t,h=(c?.mirror??0)>.5,d=c?.x??0,f=c?.y??0,u=c?.angle??0,p=c?.scale??1,g=c?.scaleX??1,v=c?.scaleY??1,x=c?.opacity??1,w=c?.blur??0,T=c?.brightness??1,y=e.width||1,C=e.height||1,k=t.type==="Caption",O=!k&&t.width&&t.width!==0?Math.abs(t.width)/y:1,F=!k&&t.height&&t.height!==0?Math.abs(t.height)/C:1,b=O*p*g*o,S=F*p*v*a;if(i.x=(t.center.x+d)*o,i.y=(t.center.y+f)*a,i.rotation=(t.flip==null?1:-1)*((t.angle+u)*Math.PI)/180,i.alpha=t.opacity*x,s.texture=e,h){const I=b,D=S,z=y*I,U=C*D;s.position.set(0,0),s.scale.set(I,D);const Z=[[z,0,-I,D],[-z,0,-I,D],[0,U,I,-D],[0,-U,I,-D],[z,U,-I,-D],[-z,U,-I,-D],[z,-U,-I,-D],[-z,-U,-I,-D]];for(;r.mirrors.length<8;){const N=new m.Sprite;N.anchor.set(.5,.5),i.addChild(N),r.mirrors.push(N)}for(let N=0;N<8;N++){const[V,K,G,H]=Z[N],Y=r.mirrors[N];Y.texture=e,Y.visible=!0,Y.position.set(V,K),Y.scale.set(G,H)}if(t.flip?.x){s.scale.x=-I;for(let N=0;N<8;N++)r.mirrors[N].scale.x=-Z[N][2]}if(t.flip?.y){s.scale.y=-D;for(let N=0;N<8;N++)r.mirrors[N].scale.y=-Z[N][3]}}else{for(const I of r.mirrors)I.visible=!1;t.flip?.x?(s.scale.x=-b,s.scale.y=S):t.flip?.y?(s.scale.x=b,s.scale.y=-S):(s.scale.x=b,s.scale.y=S)}const A=[];if(w>0){const I=new m.BlurFilter;I.strength=w,I.quality=4,I.repeatEdgePixels=!0,A.push(I)}const E=he(t.colorAdjustment);if(T!==1||E){const I=new m.ColorMatrixFilter;de(I,t.colorAdjustment,T),A.push(I)}const P=Zt(t.colorAdjustment);for(let I=0;I<P.length;I++){const D=P[I],z=new m.UniformGroup({uTargetColor:{value:[1,1,0],type:"vec3<f32>"},uHueShift:{value:D.hue,type:"f32"},uSatShift:{value:D.saturation/100,type:"f32"},uLightShift:{value:D.lightness/100,type:"f32"},uTolerance:{value:.22,type:"f32"},uSoftness:{value:.12,type:"f32"}}),U=Pt(D.targetColor);U&&(z.uniforms.uTargetColor[0]=U.r/255,z.uniforms.uTargetColor[1]=U.g/255,z.uniforms.uTargetColor[2]=U.b/255);const Z=new m.Filter({glProgram:new m.GlProgram({vertex:Mt,fragment:ce,name:`SelectiveHslShader_${I}`}),resources:{hslUniforms:z}});A.push(Z)}if(t.chromaKey&&t.chromaKey.enabled){const I=new m.UniformGroup({uKeyColor:{value:[0,1,0],type:"vec3<f32>"},uSimilarity:{value:.1,type:"f32"},uSpill:{value:0,type:"f32"}}),D=Pt(t.chromaKey.color);D&&(I.uniforms.uKeyColor[0]=D.r/255,I.uniforms.uKeyColor[1]=D.g/255,I.uniforms.uKeyColor[2]=D.b/255),I.uniforms.uSimilarity=t.chromaKey.similarity,I.uniforms.uSpill=t.chromaKey.spill;const z=new m.Filter({glProgram:new m.GlProgram({vertex:Mt,fragment:ni,name:"ChromaKeyShader"}),resources:{chromaUniforms:I}});A.push(z)}i.filters=A;const R=n.borderRadius||0;R>0?(r.maskGfx==null&&(r.maskGfx=new m.Graphics,s.addChild(r.maskGfx)),r.maskGfx.clear(),r.maskGfx.roundRect(-y/2,-C/2,y,C,Math.min(R,y/2,C/2)),r.maskGfx.fill({color:16777215,alpha:1}),s.mask=null,s.mask=r.maskGfx):r.maskGfx!=null&&(s.mask=null);const B=n.stroke;if(B&&B.width>0){r.strokeGfx==null&&(r.strokeGfx=new m.Graphics,s.addChild(r.strokeGfx)),r.strokeGfx.clear();const I=$(B.color)??16777215;let D=1;if(B.alignment!==void 0&&(typeof B.alignment=="number"?D=B.alignment:B.alignment==="center"||B.alignment==="middle"?D=.5:B.alignment==="inside"?D=0:B.alignment==="outside"&&(D=1)),r.strokeGfx.setStrokeStyle({width:B.width,color:I,alignment:D}),R>0){const z=Math.min(R,y/2,C/2);r.strokeGfx.roundRect(-y/2,-C/2,y,C,z)}else r.strokeGfx.rect(-y/2,-C/2,y,C);r.strokeGfx.stroke(),r.strokeGfx.visible=!0}else r.strokeGfx!=null&&(r.strokeGfx.visible=!1);const W=n.shadow;if(W&&(W.blur>0||(W.offsetX??0)!==0||(W.offsetY??0)!==0)){r.shadowGfx==null&&(r.shadowGfx=new m.Graphics,i.addChildAt(r.shadowGfx,0)),r.shadowGfx.clear();const I=$(W.color)??0,D=W.alpha??.5,z=W.offsetX??0,U=W.offsetY??0;if(R>0){const Z=Math.min(R,y/2,C/2);r.shadowGfx.roundRect(-y/2+z,-C/2+U,y,C,Z)}else r.shadowGfx.rect(-y/2+z,-C/2+U,y,C);r.shadowGfx.fill({color:I,alpha:D}),r.shadowGfx.visible=!0}else r.shadowGfx!=null&&(r.shadowGfx.visible=!1)}class Yn{pixiApp;scaleX;scaleY;transitionRenderers=new Map;transitionSprites=new Map;transFromTexture;transToTexture;transBgGraphics;transClipPool=new Map;constructor(t,e,i){this.pixiApp=t,this.scaleX=e,this.scaleY=i,this.transFromTexture=m.RenderTexture.create({width:t.renderer.width,height:t.renderer.height}),this.transToTexture=m.RenderTexture.create({width:t.renderer.width,height:t.renderer.height}),this.transBgGraphics=new m.Graphics().rect(0,0,t.renderer.width/e,t.renderer.height/i).fill({color:0})}resetFrame(){for(const t of this.transitionSprites.values())t.visible=!1}getTransitionSprite(t){return this.transitionSprites.get(t)}getTransClipObjects(t){let e=this.transClipPool.get(t);if(e==null){const i=new m.Container,s=new m.Sprite;s.anchor.set(.5,.5),i.addChild(s),e={root:i,mainSprite:s,mirrors:[],maskGfx:null,strokeGfx:null,shadowGfx:null},this.transClipPool.set(t,e)}return e}async getClipFrameAtTimestamp(t,e,i){const s=Math.max(0,Math.min(e-t.display.from,t.duration));t.animate(s*t.playbackRate);const{video:r}=await i(t,s);return r}renderClipToTransitionTexture(t,e,i){const s=e instanceof m.Texture,r=s?e:m.Texture.from(e),o=this.getTransClipObjects(t.id),{root:a,mainSprite:n}=o;Vn({clip:t,tex:r,rootContainer:a,tempSprite:n,pooled:o,scaleX:this.scaleX,scaleY:this.scaleY}),this.pixiApp.renderer.render({container:a,target:i,clear:!0}),s||r.destroy(!0)}async renderTransition(t){const{sprite:e,timestamp:i,fromClip:s,toClip:r,getFrameCached:o,clipsNormalContainer:a,clipsClaimedByTransition:n,onVideoState:c}=t,h=i-e.display.from;if(h>=e.duration){e.expired=!0;const T=this.transitionSprites.get(e.id);return T&&(T.visible=!1),!1}const d=await this.getClipFrameAtTimestamp(s,i,o),f=await this.getClipFrameAtTimestamp(r,i,o);if(!d||!f)return!1;const u=Math.min(Math.max(h/e.duration,0),1);this.renderClipToTransitionTexture(s,d,this.transFromTexture),this.renderClipToTransitionTexture(r,f,this.transToTexture);let p=this.transitionRenderers.get(e.id);p||(p=fe({name:e.transitionKey,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(e.id,p));const g=p.render({width:this.pixiApp.renderer.width,height:this.pixiApp.renderer.height,from:this.transFromTexture,to:this.transToTexture,progress:u,values:e.values});let v=this.transitionSprites.get(e.id);v||(v=new m.Sprite,v.label=`TransitionSprite_${e.id}`,this.transitionSprites.set(e.id,v),a.addChild(v));const x=this.pixiApp.renderer.width/this.scaleX,w=this.pixiApp.renderer.height/this.scaleY;return v.texture=g,v.visible=!0,v.x=0,v.y=0,v.width=x,v.height=w,v.anchor.set(0,0),v.zIndex=e.zIndex,c(),n.add(s.id),n.add(r.id),!0}cleanup(){this.transFromTexture&&this.transFromTexture.destroy(!0),this.transToTexture&&this.transToTexture.destroy(!0),this.transBgGraphics&&this.transBgGraphics.destroy(!0);for(const t of this.transitionSprites.values())t.destroy();this.transitionSprites.clear(),this.transitionRenderers.clear();for(const t of this.transClipPool.values())t.root.destroy({children:!0});this.transClipPool.clear()}}const Xt={};function Qn(l,t){Xt[l]=t}function jn(l){delete Xt[l]}const Jn={rotationMovement:{label:"Rotation Movement",fragment:js,uniforms:Js},sepia:{label:"Sepia",fragment:Zs,uniforms:Ks},glitch:{label:"Glitch",fragment:Xs,uniforms:qs},pixelate:{label:"Pixelate",fragment:ri,uniforms:oi},rgbGlitch:{label:"RGB Glitch",fragment:_s,uniforms:$s},rgbShift:{label:"RGB Shift",fragment:tr,uniforms:er},halftone:{label:"Halftone",fragment:ir,uniforms:sr},sinewave:{label:"Sinewave",fragment:rr,uniforms:or},shine:{label:"Shine",fragment:nr,uniforms:ar},blink:{label:"Blink",fragment:lr,uniforms:cr},spring:{label:"Spring",fragment:hr,uniforms:dr},duotone:{label:"Duotone",fragment:ur,uniforms:fr},tritone:{label:"Tritone",fragment:pr,uniforms:mr},hueShift:{label:"Hue Shift",fragment:gr,uniforms:vr},warpTransition:{label:"Warp Transition",fragment:yr,uniforms:xr},slitScan:{label:"Slit Scan",fragment:wr,uniforms:br},slitScanGlitch:{label:"Slit Scan Glitch",fragment:Cr,uniforms:Tr},pixelateTransition:{label:"Pixelate Transition",fragment:Sr,uniforms:Ar},focusTransition:{label:"Focus Transition",fragment:kr,uniforms:Fr},invert:{label:"Invert",fragment:Rr,uniforms:Mr},grayscale:{label:"Grayscale",fragment:Or,uniforms:Er},vignette:{label:"Vignette",fragment:Dr,uniforms:Pr},chromatic:{label:"Chromatic",fragment:Ir,uniforms:Br},swirlMovement:{label:"Swirl Movement",fragment:Nr,uniforms:zr},distort:{label:"Distort",fragment:Lr,uniforms:Hr},perspectiveSingle:{label:"Perspective Single",fragment:Gr,uniforms:Ur},distortSpin:{label:"Distort Spin",fragment:Wr,uniforms:Vr},distortGrid:{label:"Distort Grid",fragment:Yr,uniforms:Qr},mirrorTile:{label:"Mirror Tile",fragment:jr,uniforms:Jr},flashLoop:{label:"Flash Loop",fragment:Zr,uniforms:Kr},filmStripPro:{label:"Film Strip Pro",fragment:Xr,uniforms:qr},inverseAperture:{label:"Inverse Aperture",fragment:_r,uniforms:$r},curtainOpen:{label:"Curtain Open",fragment:to,uniforms:eo},curtainBlur:{label:"Curtain Blur",fragment:io,uniforms:so},distortV2:{label:"Distort V2",fragment:ro,uniforms:oo},neonFlash:{label:"Neon Flash",fragment:no,uniforms:ao},waveDistort:{label:"Wave Distort",fragment:lo,uniforms:co},scaleMoveBlur:{label:"Scale Move Blur",fragment:ho,uniforms:uo},paperBreakReveal:{label:"Paper Break Reveal",fragment:fo,uniforms:po},laser:{label:"Laser",fragment:mo,uniforms:go},wave:{label:"Wave",fragment:vo,uniforms:yo},sparks:{label:"Sparks",fragment:xo,uniforms:wo},tvScanlines:{label:"TV Scanlines",fragment:bo,uniforms:Co},hdr:{label:"HDR",fragment:To,uniforms:So},blackFlash:{label:"Black Flash",fragment:Ao,uniforms:ko},brightPulse:{label:"Bright Pulse",fragment:Fo,uniforms:Ro},cameraMove:{label:"Camera Move",fragment:Mo,uniforms:Oo},hdrV2:{label:"HDR V2",fragment:Eo,uniforms:Do},fastZoom:{label:"Fast Zoom",fragment:Po,uniforms:Io},fadeIn:{label:"Fade In",fragment:Bo,uniforms:No},fadeOut:{label:"Fade Out",fragment:zo,uniforms:Lo}};function pe(){return{...Jn,...Xt}}function ci(){const l=Object.keys(Xt);return Object.entries(pe()).map(([t,e])=>({key:t,label:e.label,isCustom:l.includes(t),previewStatic:e.previewStatic||`https://cdn.subgen.co/previews/effects/static/effect_${t}_static.webp`,previewDynamic:e.previewDynamic||`https://cdn.subgen.co/previews/effects/dynamic/effect_${t}_dynamic.webp`}))}const Zn=ci(),Kn={adjustmentFilter:j.AdjustmentFilter,advancedBloomFilter:j.AdvancedBloomFilter,backdropBlurFilter:j.BackdropBlurFilter,bloomFilter:j.BloomFilter,colorMapFilter:j.ColorMapFilter,colorOverlayFilter:j.ColorOverlayFilter,convolutionFilter:j.ConvolutionFilter,dotFilter:j.DotFilter,dropShadowFilter:j.DropShadowFilter,glitchFilter:j.GlitchFilter,glowFilter:j.GlowFilter,godrayFilter:j.GodrayFilter,grayscaleFilter:j.GrayscaleFilter,hslAdjustmentFilter:j.HslAdjustmentFilter,kawaseBlurFilter:j.KawaseBlurFilter,motionBlurFilter:j.MotionBlurFilter,oldFilmFilter:j.OldFilmFilter,pixelateFilter:j.PixelateFilter,radialBlurFilter:j.RadialBlurFilter,reflectionFilter:j.ReflectionFilter,rgbSplitFilter:j.RGBSplitFilter,tiltShiftFilter:j.TiltShiftFilter},me={adjustmentFilter:{gamma:1.5,saturation:.5,contrast:1.2,brightness:1.5,red:1.5,green:1.5,blue:1.5,alpha:1},advancedBloomFilter:{threshold:.2,bloomScale:1,brightness:1,blur:20,quality:1},backdropBlurFilter:{blur:10,quality:4},bloomFilter:{kernelSize:5,quality:2,resolution:3,strength:{x:10,y:10}},colorMapFilter:{mix:1,nearest:!0},colorOverlayFilter:{color:"#ffffff",alpha:1},convolutionFilter:{width:3,height:3,matrix:[1,0,0,0,1,0,0,0,1]},dotFilter:{scale:1,angle:1,grayscale:!0},dropShadowFilter:{blur:1,quality:3,alpha:.5,offset:{x:4,y:4},color:"#000000",shadowOnly:!0},glitchFilter:{seed:.5,slices:10,offset:.1,direction:0,fillMode:0,red:{x:2,y:2},green:{x:10,y:-4},blue:{x:-10,y:4}},glowFilter:{distance:10,outerStrength:2,innerStrength:0,color:"#ffffff",quality:1,alpha:1,knockout:!1},godrayFilter:{time:0,gain:.6,lacunarity:2.75,alpha:1,parallel:!0,angle:30,center:{x:426,y:-100}},grayscaleFilter:{},hslAdjustmentFilter:{hue:100,saturation:1,lightness:0,colorize:!1,alpha:1},kawaseBlurFilter:{strength:4,quality:3,pixelSize:{x:1,y:1}},motionBlurFilter:{velocity:{x:40,y:40},kernelSize:5,offset:0},oldFilmFilter:{sepia:.3,noise:.3,noiseSize:1,scratch:.5,scratchDensity:.5,scratchWidth:1,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3},pixelateFilter:{size:10},radialBlurFilter:{angle:20,center:{x:0,y:0},radius:300,kernelSize:15},reflectionFilter:{mirror:!0,boundary:.5,amplitude:[20,50],waveLength:[30,100],alpha:[1,1],time:0},rgbSplitFilter:{red:{x:2,y:2},green:{x:10,y:-4},blue:{x:-10,y:4}},tiltShiftFilter:{blur:100,gradientBlur:600,start:{x:0,y:0},end:{x:853,y:414}}},Xn={adjustmentFilter:{gamma:{min:0,max:5,step:.07},saturation:{min:0,max:5,step:.07},contrast:{min:0,max:5,step:.07},brightness:{min:0,max:5,step:.07},red:{min:0,max:5,step:.07},green:{min:0,max:5,step:.07},blue:{min:0,max:5,step:.07},alpha:{min:0,max:5,step:.07}},advancedBloomFilter:{threshold:{min:.1,max:.9,step:.009},bloomScale:{min:.5,max:1.5,step:.015},brightness:{min:.5,max:1.5,step:.015},blur:{min:0,max:20,step:.2},quality:{min:1,max:20,step:1}},backdropBlurFilter:{blur:{min:0,max:100,step:2.3},quality:{min:1,max:10,step:.1}},bloomFilter:{kernelSize:{min:0,max:15,step:1},quality:{min:0,max:10,step:1},resolution:{min:0,max:10,step:1},strength:{x:{min:0,max:20,step:.5},y:{min:0,max:20,step:.5}}},colorMapFilter:{mix:{min:0,max:1,step:.013}},colorOverlayFilter:{alpha:{min:0,max:1,step:.013}},convolutionFilter:{width:{min:0,max:500,step:1},height:{min:0,max:500,step:1},matrix:[{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01}]},dotFilter:{scale:{min:.3,max:1,step:.01},angle:{min:0,max:5,step:.01}},dropShadowFilter:{blur:{min:0,max:20,step:.5},quality:{min:1,max:20,step:1},alpha:{min:0,max:1,step:.013},offset:{x:{min:-50,max:50,step:2.5},y:{min:-50,max:50,step:2.5}}},glitchFilter:{seed:{min:0,max:1,step:.01},slices:{min:2,max:20,step:.01},offset:{min:-400,max:400,step:.1},direction:{min:-180,max:180,step:.1},red:{x:{min:-50,max:50,step:1},y:{min:-50,max:50,step:1}},green:{x:{min:-50,max:50,step:1},y:{min:-50,max:50,step:1}},blue:{x:{min:-50,max:50,step:1},y:{min:-50,max:50,step:1}}},glowFilter:{distance:{min:0,max:20,step:.013},outerStrength:{min:0,max:20,step:.013},innerStrength:{min:0,max:20,step:.013},quality:{min:0,max:1,step:.013},alpha:{min:0,max:1,step:.013}},godrayFilter:{time:{min:0,max:1,step:.013},gain:{min:0,max:1,step:.013},lacunarity:{min:0,max:5,step:.013},alpha:{min:0,max:1,step:.013},angle:{min:-60,max:60,step:.1},center:{x:{min:-100,max:960,step:14},y:{min:-1e3,max:-100,step:14}}},grayscaleFilter:{},hslAdjustmentFilter:{hue:{min:-180,max:180,step:.013},saturation:{min:-1,max:1,step:.013},lightness:{min:-1,max:1,step:.013},alpha:{min:0,max:1,step:.013}},kawaseBlurFilter:{strength:{min:0,max:20,step:.013},quality:{min:1,max:20,step:.013},pixelSize:{x:{min:0,max:10,step:.013},y:{min:0,max:10,step:.013}}},motionBlurFilter:{velocity:{x:{min:-90,max:90,step:.013},y:{min:-90,max:90,step:.013}},kernelSize:{min:0,max:25,step:3},offset:{min:-150,max:150,step:.1}},oldFilmFilter:{sepia:{min:0,max:1,step:.01},noise:{min:0,max:1,step:.01},noiseSize:{min:1,max:20,step:1},scratch:{min:-1,max:1,step:.01},scratchDensity:{min:0,max:1,step:.01},scratchWidth:{min:1,max:20,step:1},vignetting:{min:0,max:1,step:.01},vignettingAlpha:{min:0,max:1,step:.01},vignettingBlur:{min:0,max:1,step:.01}},pixelateFilter:{size:{min:4,max:40,step:.013}},radialBlurFilter:{angle:{min:-180,max:180,step:.1},center:{x:{min:0,max:2e3,step:.1},y:{min:0,max:2e3,step:.1}},radius:{min:-1,max:860,step:.1},kernelSize:{min:0,max:25,step:3}},reflectionFilter:{boundary:{min:0,max:1,step:.01},amplitude:[{min:0,max:50,step:.013},{min:0,max:50,step:.013}],waveLength:[{min:0,max:200,step:.013},{min:0,max:200,step:.013}],alpha:[{min:0,max:1,step:.01},{min:0,max:1,step:.01}],time:{min:0,max:20,step:.01}},rgbSplitFilter:{red:{x:{min:-20,max:20,step:.013},y:{min:-20,max:20,step:.013}},green:{x:{min:-20,max:20,step:.013},y:{min:-20,max:20,step:.013}},blue:{x:{min:-20,max:20,step:.013},y:{min:-20,max:20,step:.013}}},tiltShiftFilter:{blur:{min:0,max:200,step:.1},gradientBlur:{min:0,max:1e3,step:1},start:{x:{min:0,max:2e3,step:.1},y:{min:0,max:2e3,step:.1}},end:{x:{min:0,max:2e3,step:.1},y:{min:0,max:2e3,step:.1}}}},qn="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAAQCAIAAAB2sTYeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF6GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxOC0wMS0yM1QwMjo0NToyMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTgtMDEtMjNUMDQ6MzQ6NTUrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTgtMDEtMjNUMDQ6MzQ6NTUrMDg6MDAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDk0MTcyNTUtZDRlNS00YjRiLTlhNGUtYjVhOGQ4MjIzMDgzIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkQ2NDI4MEY0RjY2MjExRTdCOTdGOENCMTc0MEREQUYxIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RDY0MjgwRjRGNjYyMTFFN0I5N0Y4Q0IxNzQwRERBRjEiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENjQyODBGMUY2NjIxMUU3Qjk3RjhDQjE3NDBEREFGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENjQyODBGMkY2NjIxMUU3Qjk3RjhDQjE3NDBEREFGMSIvPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTQxNzI1NS1kNGU1LTRiNGItOWE0ZS1iNWE4ZDgyMjMwODMiIHN0RXZ0OndoZW49IjIwMTgtMDEtMjNUMDQ6MzQ6NTUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz51hjvPAAAUu0lEQVRogYXa648dd5oX8M+vqk6dW1/cbXe7Hd+SOL52fIkvncsk2SwZRoM0I8QiVgjBCiHBSxDafwFerMQ7VghegIS0aHeE0CAYwTIww04SPEwymcQza09uTuIkdtqXbruvp/v0qVO8qKru0207PDq2+pz61q9+l+9zrSfYkieY4Vtc4AjjNIibQpMGw+BDYTv+Rc5zbBNvC1DIIP45XuUST7Hn0fjxANmQhZFq/EuD89mJfyVI2Zi08Iwvxyy/pnvhm8b/w+LrAS764ohrk9YvWT6iM67T0H0I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",_n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAFloklEQVR4AeyaB45jMQxDxdz/zlxAP8SDphdhPc1pVvdvlGxH9bCpyvX2hsluU397Ie7hA6kDIzxwRIn10YiSuO6yShdh9VdErVm2JEwVoVFqI7lKspurS9pcj9Emaui2kivWbSGOi2MkaJvFh5G2hq2S5fbT0ijHsCX9atoR4SFH/oYLTf9pBcjzD8j+GA6Pn0CvRXy7CHL9CuqdTlE4f+HP+9+PC7l/LPCPHiCIDQEtyVUKTmsCfYsGkqs0XFlWgf4MwVhU1dAa+SM/tKC/VDamPbzKV+wb3C3JTibAH84MsiPqF6Rx3RR8Jdzhexu3P7/SWq6PFzysQLcm+aTImyeOPpwDZ+crZjKkeyNH+WPShREGs4PU0iWHwEoqlxS6JIp5pgX4miFJHyQTwPvJGaZCA+Yl2VYPpc3VLpyRzGMzFb9aloiX5BKZ2t2kDo98AIMASTi+d+zXksi5R+x8CfjzUwKGa/61MBl5O5TQ/2vavwmQnp/mA/K6XQisOwMwD8TPRKAJ8KIPSQxYYUhyoUFHFPOxkCN9vbnVnZJIuEMHRI48gO3Y0uyWkUVcT5X89CNvT8ww8EQIf1ks3ivIzk9zV4qnsyvh2rrY5/cP9mNh9TMTzP7RAcYTxiWNxR/4aDIeCQITaQSCJJzRdNjGdkwOyumyWtNqTbZt0LsYsh23xI6WpbIB/iQNpgJNBuxnMT+zQvpMJtBxOQw2J2LWPBvPi9ix/3SvaC5YHfMGxJ966vUDSuOY/E0OVsol+G8fjDQK9rYJl9pfkl26Xbglzf1cibwhqy6rQLc0K352eRP6TqW+pyFhM3iKqc9Z5WHTVfk1a/2ayN92LPTY97RCXZ/fS8rUwThqCTvCd198kTaSsUgRYbF4ReKI6UJNcNbwbyFhv2nFyx/s/t9tj72JNgUI0rd7k0qgeZWbvksC5FWw5k6ASwJ0rW6uavomPZdkYgplhUVYEgGDZ7SguIeik1eExqjmFatL6CsUGvEgw7ZS9UOEg3uQmoSAzIrQzAMo+eHNqUM+Hr5+7sMLubCOumD4hoEdnbJod9dxwfBn3osLDs//HxQsZ89WdQuiJwEomv3CBnAWEAywzynA1YEA6KsIr3FseFUlkSjy6bBsQYLKd3Vq+DKG2U+2nZgzbYD0geGo9Rd+IZlYgPkt7hC4uhjG0FEPzQZzQttkBKYEM3Ns/avi/Brm/pA2csl+9N3JkL4PoI+qbc/hogiFL7Tss/B4z3V9kQNmR25SSQMuCdvr9Y+9O9CNHOeRAHzy+7/y2QfwKh/qb+GCBjIndHbHg7QlkqI7wW5RKlJyxZB4yiAxhCPhACUEsh9tgSAXpy8G2rVFYLA3QOnJzxMjs32wyolZf2NPs/8xBuAk08USeTDDAnXA7tMCIw2d4oBuNuQKlcZPPaCM2J4tPfje4SeD8gHW+ozD9YO/+2fnMw8Q5ed/5UPzNYQJuAyCg/9C9woDcBvt3swPFbua32cAnz2j90iP8rTkF1hVNriYHU2Rw6Viv/C70wnz1PQxK1sxT8w38LevLEadyMU+xW23Tc8Lr6PC4TSxX4HFqAo+GcPTXZRRPE9AqRT3cSQ6D0RNgR74hp+5wW0deeT51dznczgfOykAvZA3ghXJtQYuL/i6Bt4H4K61EhpWZuZbBVD5jjrcCRODqjS/5/raErji1FzytkUumXCvr81e12tVv9iB7Eljm+Em16o208IByo66CZsMtKKIY9qi5rW3uTtXmtHGKVqIgQFR3WGWRst6tIlU9/1fTBoiz1NDhyH+5xCs8YuqyddBnuHA4usH5PiJicOH76NWlNP51mZ8ljr+YHxMmtZ5wfYlQqCJLpN9QG8AloYrgyMy1GgsPs3rNmKBhEmHB9f7YIeEma8GsqmK7TGhX1DdT2dyY7/lah/2G/uP4rmTIi6myD/RIxaJFBu99KCOPOme8ccg6fw6+OMORDmPIesXVtGehMgD6f79Os9mQuL611nckk+BTq0Oyr6BWbe9GKHh5Ieu4qHqzV0UnY0e1ZYIQObkyV1pFF3knRPo6b+pPUAmq/Axvd7jxZpd5Q9kaeP/Hvs1vgCxhkQugK7QwBfuH5brm/h3PWhLu4NEEmBWnMlFv42wH7o/6wAoH6QW/tjYRXQ+XB+Hy8+PMecfAVuhvo8if8YEr9LZACsAVtz+Z9b3AvHQfKo909zyB+h9oaiCw54iqMywEIOOH7uxjlXP//sK5udTty951QVsUUWjyWhBqLFVIqB7AfuWEOTeaQMt+F19whLdT7LD7XA0+fHRJJKv9Dz3RCJB4rfOAvfl3fHlfqk+BFvWh9DoJ5movxsX9uk3+BUHpnPFYNSPYCA2ZPY8siuAjZu/xBIjBJpmjUYxdf9V9NPhxPqASIAQJfbTgaJqQfbrigxCA64Gm/RQF6f0HzI2W7FPMzG9RFCto8VVl2kidCI3ozdsY4d62k5tbi8YcLIvB2pkMUf9RJkGQ7fr1x1O9/da51cfJyPEgZK1k6ziD1dXANQ9H5BbOnfg+1klfaJL9nSu8T1xAnT3DN4iIXd+cutKz4L3VGMu6eEOIXtY0HhGuoL0zMB3lxrtCwWUfR7+JLA8vSAYO5caHELSCgn7wc4tH9NNzYqbh2XvC9vw/u5yoHanTnS6HPOQ8CHs+Gd9UMuE1bHjN8+fPq3+4vxOhfXNgL/z8UNFYAeO3DID1169i4tgLfqdCGJvej7ixAORhA/T8ioZElN0fL+N/pc23mIV2l94FEu4iSlpHlU2ynWyx7d2eS3ngAarO4oUopvRr94BYOLMdJ5wfzVYDqy2BPXTpZ9Q905t0Zd5pQe0O4K0TPSgMW6+mmEZcpfF5stSwbDzaeG35cfoDV2Nzz8mZ2l9QFHtD1mzowcKsvn8912s1az7urpov9odA5rTf52dQ2eE0BUleJ+7hQMqaE8Cd3wRIOgjL6mBLWKg7aczxQ38JvhVy89EQNk3+urXX1uZf1V3csvgpfC/DmtjyWaeNhLqKBndT+8DGwEohuEjnyKh0dz/+41vQYWRz5eugqKSTd8jpsXVLyl721U/P5vz50TI6SCkMuLkdSBmnq9A/dD13Wpc3yj4iFtW7L5OQTluP+3NqpmeuDb3r1oe9sCc2x48KMwg9aPxD/KNNNl/ON3eHlbb2uJ/ewXMd1dAHucfJ2Xg57GRAFSub+b7cF0OII7uxJNH4BBJGqqBOUcj7mk8N2UD9FNIarrffp9bRRDzsqo1gDGfvV30o7/Yee5k7Y859dqzf+67GDfj82Qljt7EHfT616iNsulAEE36TzD7CgCb+BvWkSVut3m+xwHxAvMeo6kl8Xv1SyJ7OfK0KO12oXqTkWu0HSbsBvPRkcDD1HZO1+ybZURdEUQOSLcep32Ez0SGJnPqY7TpZTouDt0VQmJpxt4+IklDazXuc05vVXTPJrPJQqx7rP4BR3idp47b5gAdsg78EY+kZT7/7aAH3jWKpl//x1S9Wflm+ke3IfSWFuAhPRYoedDfdmFdmlGi3ZmojeRh/ujnwNCe8lNXR2du87Fdcf18+fEC3wz4OmBZWSi+38zepLqQHqib8kN55Z7sRQcicN7ZWopGb3b3wD2E3+fr1fXguarcH7yje25BxWhxaWeB+nnkv71g+sze0p1iOoGc6zhyfehq7mQmwCjtHxNNxd1cNY9veMXJANXIrkFljP0MLH2Bf4uFBuhNPx+X2fpIIPsF0A3skNEZ6ae/ASZHlEDowPtcLL1mUu2n8ODYZ7b7ZUTwMF/PyuCbV/j2G7vgPd6/rZ8ODuCU8wbkti76JQb3o3/PJ4fMPft1lDAz3aaM8ENz4a9iZkkQEb/zc1cIOJYRPYAJZ8nk9aezqoR/PgD0wN+/efjTVyfQ7IWw3/E9gg2ha3FQPRGjZ+aeIcbUhN6Qi6zJJx2SPRNwKfB5DTJV46OnBDSeXNVTCRR3ZvYJFtuRoUB/un2aT/FDbIrDHzXIZ1xHQNRMOGOEgLA9lBEVMYODYZCQcqsi7fm3kx/uZ1sJGJ9uQ75PwaXNKXyxr/SyZUJGdRDbEwYHXir+i8s6zz93/X2XyxvplwNH4L1voIvkL7iuWfbI/LBfbj2ME8GgRsVKaOHkqgqfmAotzOhbUt+yZObynYzG3lcO2FrBAJPzBbDjg2FAKY4w+ysmelUUZB8C4B4rlxpRLXvBdL7aexAwgoZRzfBFE2e53faKbcgtIRBf/PA3TnTFBENHnUKj9twkVI9rhqjlfin+rTi+5zbn860YcAABDp/9dR421/lf6fyLj/9JaWd41inYC6FyQdTMkacdTIbOYzhnslXYEC6uysdyPh3RYF8uNKdzrSk3lYPIQgRwX9N+iQIjx/SgiUQidURfPR8JHFmA2NtVFUJPU0TkToR4cwYgQMBrk31xosBesOhEb+8YKO6FXTxUKw0tMDr2C0lvNGCf9pbhZUHGLxjPvjP0UKs6kWxowgq7WBlmYNUmfcIJyQfScu+rdA+8YoR2fSREnudYPr/SwCy107yB98JiJD4pDJ8bRYxCv4D4WiCwvaqdm1Z8yixH+2RxILw0AUXMLX2UsfIvZL6uv0TM0ETN6eitRIEyjklX/Ky5P/YJjMh7YxzwU4AdxmcVZ56Y4NpO6icNLtMwZbheoJMPsrSkZO0XHjROwT/zBvF4usF0mXkIpCeY+z2WNBkrCBgkwHhQB6j0PnimRX4+Q3DuJWXL5zYNP8DWnfnrfGQko33/m29J1873FtL2vP8aD1eOVViXdcMFcLV6bp+YEPcdGi5g7RsYOY3Sd2IBg1PfVfgax/3iGcGGXS8COMXbODWiCz6L/aGcAQqD2vD7C1f09BsA1OlXTlix6VOq4n2aI2IUR4WNdng5xv95aidBRsLmXhn4gLcGxKin8cwrBCgrspWAh7KqqELImOGdR9KUJU/np2gfHBIMPFChtN7Ho5b/fXP/uf8IQLNCS7C/Gn5roq1lem5kCdmFzh871mXkuf2EsUAqRZVmE/4VDzhHTxEyG9F+hFwvAjBC5NuZc7GW080TqSoOeJswsPZ6r+lJD8RdX+aw35zv1usA0okRDIKBa4P/hlzA3kNQ643hmf+b6BtybyhPFUHjvd/uZkwpjmRQ54J5iX+RI51yuzr4HELk89Giux/EhPN4pjbWkE/G3I+LWD2pBuP5pHmBXcuCGnKZj1coaPbmui5PGesY9U+vAHQzt28KaS8BIjUKRW+VwH46oBxFVVuDm/Sp+s5yMsb9Msmih6KdLrO5qEWGvmIeeh8htJ8J1+wO+TT2FUB9GAYMt4n1junRMYO0YfE95+a7i0QD4jxaFHA8ojtjSv8aBvA8ZOJA14red05Fqtjg3wg/7f/i86+fPLREoD5/nY8iv3Bx0Jt1ITdGPqnWyZsGZseO8XUVXyQIdJ1OBECzmx07OqZ0eOAUZQSAcTbCikMZaBkHxONqegC+f3sfoov5PXiPMaveGsz6dY0gjEgbpJ1zQXuuP7Y7r5OuN3vFVh0pYXWeLgKNnhhMj8v7ias61tM0e9u9FaPx26QQHav511BeIpT+eOHnSQEoiPfVI+e5YgMvY5FWXj/ZOWPtv0TCxx4H/bds9EDao6mbxkq94tiVY74YoGSY173zB5YQ0xoJK8z9dWXws66MMvXv5K8v0rBdD8wbIdfaAoYXtOtWLVPhfNX/OFe6zw01ZHtpDIm5eecFXDPeIGhP32mAkj0kBe+mfDTu4HZ7J1fg2IvamdWQItWjgtiCR+H7zsYYNvZ6JvnoGlc/KUNIN5OdTpoR7bWU/TQb2X5SNvPzbVZUB94JeGjJQtXddShlceD6/eeHQCcovu3cnQs2MsoHAZE5O29VsgNnKfU95Bpv42QQXBlnjejHeLSmhxSlT1ykFUVO+7mC6BmfR/erih/0PjupgWjncifpv7dpPng3uEO5Ah8bv3aoL7o/Yxvj4Xu/D/ImRfRXu5mdlqv1NwXHodxs5y4udMq2QZ958/mv3bFnCdLH8Tbj33PBpepnzvA7MisERmNz8sXr78eS07mEAzmAj8vCW7ifjYq76lCmQUI3b2LJYQowFmg2xHeVZppsqoW+z1IhI4QONzgfoL8sI1SLNo0jezygO97HTnE/w+sC2B7oJfFpAnaRoub+uUddHFnCBQ9G9kKgyZs+AcK237H3zl6Jgblj7Zs0sgHsdRmwvdad1MhtTh/pMw8OqkoJNz++hYTmcNya399hu9G6wsFoBtStR7KXuDyZvbdfsUKs2UKJlt4eHvYFQf+ZPgCUD7DW5/e9ng8AB4ufPr6uwBPxKYC7gLRVMBVekg8CazfVHyd4mBkoTWBIgzxmCIZ3JNqpnhESVT8WPcSurd4qvAE8Xd9kAATM7rpZHgTzN+o/E38xoq+1newfL3WBc1gfo6eyvXQo/h4I5Cew3FGC+pUsbsnV+xewQ9oSyMbWxB3s9lQb9O/ozO8EhML+UcZtuXL5aiXS58ZVb5+h5iLVr/fOCJ0/au18IvMMMq/z57gx0/goDud4AFtbXY8u8FZyXxcoZ1ZzfaMD5YPfYPhC2rCKGa4nBhWV8iW8KHjsYilweLivLLJE4peMrrtRtoQddCfkirFo0KJ975dzHuaDurAcViRQjCnmnzaMUKcDpjXDGrSqUkczfU3yqr+pQ6EbgcWPLsCkxQXFt1RtcfyTVr6N8nM3oWMhgcHJIqFKjTxKcMjgqKINjLflfBHwvy9W6vt6yHsQfwCCz2DXAX5+/djR0RewHDim9dgxIJj8/JhiiwRqd3I1/x6dWb+IkSFwvRGaUKAZCZYmCA7cG6Q3ykjI6ARCeVhPstNClUdVgVLtTjZ4P+fITq91zY3TPva6J/i9WLDXK12hpNP1Xw8gGFTvFcFYON3TuQ7rq+ZekmANxR/bCIrQAPi9Lqi2vELwj/+nYsJ093P8Y4W9Gal1QLM00xjBngrmqif3cTTDt4ggrBSnBND5nyazUVlfxPSeOOH36KjXqfLjrMuxUy9P/xbrs6toz8XSI+l+VzM4AsFWe+kUHh9bwrbLQnu6/pW3Tc9zgDBVu76K38lTekwkGS1nIUzt1FAtNEh6j/CF5KffT4ebruVRRYdicLrStMJA/a2f14VBBM3yaEn1Cv/jUnsMInyA/Zi0Wsm/t7rrv+x/gqq9LOjiyN4aBvP1FWFC3I4L3XOZ5uN6Xuj7iQ8CxDMmN4bpyU0MmI+HuZAyjsoZ3Bdeps/Sd+1H7ecRnc7Wtudj1MKBsevwuxQOHAvx+TGm8RGWq8FEpVS2dpubTzdDG8pHJDc7jXZRXI4W5xehYEIzDcuPDkFp+U4Gg35OR9K1/Z3VTolpaS0LVHOOP4Avm6sY1CBGDe+6LTTC1ZFBb25eHr8nfovD2Ur+4VXDu2SBd/R2iUwk/WKY1zQwezesfobf9z33bAezNwt6Q27lOD17jxjB09U/BtVlfj8Lghqi0yMEiGfbYnBvPFB9HYHi23fN7GH7/HK/VZ+7MlifR6OfZ6LOXUWRVxW9n55EN+eTD0ag1cV6TRS50riU9vQMnuNOG3cqIFohaE8y84Sg2XchkHl1fJvWnq/pNd7n2VE9HpNdBFEWR9RTfqreJlxB4iGRuo13p4ZOC40EElR1QhdVoKOZUdOA8AviE8H/QBjI7iodu8J6qr8fwxmxe7M4DLRr1i0W3IzIsDmQH1/Ue3hdxfwbhBDiI2LLDUCfC201HZpOT/TRQmvGz7gfXH+vdS5Vch6pP2k/IUTcT99Zbqbng/AdCvAmcrQgG2oLFleiCFNwLUpEdglJbKPZYtFVvFGRNzGefm8wa87J1wP7Rg5Cz3cF5hVW4Hu/lrgn9nPwdEZSiALGe8V8zwljG2Y/L21P/7GfzMEPj5GuPtZhZXhpHOlpS4B/bPa3gI2zosm345pVztCPsGfnQkUU4ga3dweJBugxKgQWGKJNo6G9zXi1e/gew7ZkvS0w/FYZtJW0bsdPkB3GgQOAdqQwfa1/4Xz8fBGYOXtP9wmbZr8I4Pp0WwyDRx60TgXPVfP+/WIcMMftBP6VjZZxbSmmguHXVTsC9u93eRFAifO5n2gknZtDgqQEWBayN+av3gomUjQTtG9/VNrD7A1CwAEPVE+/H8yLg/uYt6omEg/kf/2TJFDao7zHtjFoBz23AiCArkNV+C6PC2yTA5iPQmOz/geKNytvxu4KqSQUjHc7gdl2O5qxwhL5YopcC/uFTH6sxM5WCepq/L5jctb5olqr52Nv4jXk3ON6cBf5dOVMx4Ce/mdtMB9guC+T+xb1FRYeYLvqqRdE7zBgQIeKcTk3aC5VUMyTkXK6uhPZDK2yp21tJEZkfk8VIWVFAmIRogkgwj0BwN1G+XfX3dsb0ynjgnrY31TPInjEiui2M90a3WGewSWIHRRutFRfiWZvph/Rr9C/j/sH9mMkeqS5X+JFRqffrejlD7qSdPckAIhu/etpqh9i9ef+r4dvB14XcyAI0Z45C+hAzDxfgfoD2qfP44RxFGpponUfJkitJ7Bm4hrd3t8V+8Wu6zvDEZnkc8FqIsyent53EDTb01i/pv+sCYeQf0bNz5hi/IUcGL+Av7cjJEu8V/w84y/gvYoVigeF/XNPUtdLw2ZIvxJ+O+V5pXDRi4cLjPoeRb0NEqEv95uEwHNPexRjAPIWxO9ayZ5Qw0YGrs6z9vx9bgX8o+09YvTPGxfQdwktaCq7Dvi9e4uyYR1dql1mQqDf+DeWF54vYNU68NqzX/ouxh8YF7EReMT5S+1Kzs5PJLFvFN5ZnL27X6B/F3x/Yf9N8KE5H0IaWXkX6tgVCRZJRUHTeyLdyRw3lc9mXwS00ct7HvWlgl3qPge7R+u4iMzmIzWLd5mlVyzYToYj37sZ+6j1Xw+jeAbK6dcUPj+Vs61KmYyB8Yz7qgXAuPiq+bz36p+N5SkHM+KbIHC/s37oMRpdoNoGlhA2I28h4AcvYjpJHW825/mJ48U/59Ozp98O2iXwexnn3MEmfn272KxEEYuBEVyR7/C/I7I4wyJPqKwyeXol7bMm1uX34iXxrXcY9y/rFxXn+o+jKWyMzEcKOJ0XF9uGfg1A383V8/lO+RaDs6wPRvH0xrAYfE3wM2bnnIkC4YSyxct0vo0buAUEdY9556+RVSxT0YAeQw8saUtkJKzfLouC3gLQPt6/OpRUP+nquArKb5au6Mz2O0+QtvrWDrb/nwdzsj9Pof8xZFvnNn99wILgQKR95cCb41+tFAls44K3XymAL0zNRHzGyPTavBtl7PrqS4IXcI/9zO49cNK2UgG2EhiwRSj62tVGH13KP2n9+OCjcwC1NzgS/1i4s/CasDoAYp/59ztlvv9/sgmiHet1x66Z/ioBeqKujEAd7r8dCpch1BB6FczfosUdOqTBvhHSEJBJ7bJe8OqXe6zYjSbD72ceVSTO/U1EqFLQcZrww37udyJMxaUwRU80iYr93Xt1pLu/1/iHmHCWTF5/Oqvawj8fAAw8FD8+v3i0XqACooE+UuiK2hba94ga+rDtF9vpjLf2UZj/Jb9EjULwnv3TSzV3MRJaCLfVRT/NWeF5uisbEPs+C7pSw+x699d0HiYgX1eNZx0Vl7J+YgFhAfuOE99fzv0JZEsDz9fqYs9VtT3bemB6JvaRUVWlZ+F1aH/iqLZ6GLtuwSSAbNg0Crg3uLpK0F4Hle/pDUbj5NFI87nFBACfn6wwRBv23ek9BRkUN8qWtmNMXU2mfT7+eO7fF8IcOwr1D5FaZpiAdcPGQm/QWqzKSKYVlRn/RvLA9YSWMWCxWeY5cLy1QP9Ftm0OIy5L0aK2IFD30RRd6STi1WGgAH1UeQnAFRlnosIMpwTuYYoY9pnOGzHUu4PFA+GhLnvDQPV4Da7vNf/TNrKrgdzJp9EglQ5Ai9Xt3P9Ru5ng3/HW1078dEV+T8v7aqoHuf4d3TNI3/nkEYymo0ibjShqpmNG9shLTHiyYhibPVYJCre/oODH5fswYm7w7ziYYL0/5tRbMX/hTg253n1v7M6DhLZRYZPuDvLZ/nsFDlPjD7Uvo67LxL1x3On/pSq1LC/nnVjoFQCGaVqoqr1qqV9Q0H7T9leC5PtrYyLy59KO59k3luxwMW5N+qS9cT/8uGLtuIfVrwaYcXOD7j1yhDb/mtjXtH4BfCKCR6kQpdywMf0Cxu2Ezs55Ng5WN0PECkVC94ht1Norfb4Qe+5oGtP3eEx46GHjtwD+v9MN9oetCcI3wTSjx2uenhH8ST4TSAn7HRInM3hU/dc6UtP5vkp3tzm3V2m1xfnr92eAg4l7UeQFOYlx+FK7mf8XCVO8/0uJTabzFQR2aB+dcQJDqyUZorAr+Psa0h4tQjh1oqf5HRO6KjSDHiEv1j29rw1hBfo2Az8xa5ZngpwusBcXegmAKXqmk3Gp9FH3Y20QkJ9uTJvMIScTFWwQa1qHpgEfZm/HQW+vSOxjcDamX/kPrKfMLBwY0rkY3t8meSNOIBifm2l8jLbJn+m+BIyYm+/fMdsu5gkxPbunEyOEuWls58h9zMvJeTi69Xc+/4e880CWJIZBaD+4/5k3qKDYnPPqB0tIwp6EJ/fOB39h22fx+vzC56b4vc9o7TmcqjPA+RJPhVgCRao7CN3QEfvagsnHUV/4EJqpUc6BCLdtZh2/vbqWHH8KzjUFL5IOMVlF2LiMKMNWSwA6kWyQCuCuzYcuh1pR/HjkkpLOtATc7CRdbrW6gXeWu9lQQMi6IvccQJiLd1kmdU5a2ET0p2TdPVfdhSTIVQZW9HDuarb1p45l27lhz/5RsC/8P+0594ZOTaKrCom6Vc/2+DC9zxL5164hV7v2/CPLyH59ARnfOVZEp0ryMJpJuC+FPT+JFfLlyvYr31H5M/j5kpS/41z4z4/cv+fJIe+brwwEiKn3xCvZVDeCom0QmHMLqnZIOmd2lDmhKmgzRwxhih38Qmhz07OZM50gfg1hRp2x0j+RJMn0aEaHJaPhE+ggrMdpZWesZUijTetmAMaMaOQ9h4zS2ZHVJHQEdEjTIsEEvpKPZB4m+HHrX+OCNrHgQdsKisICIsvbIarRLatVSWf64Ms8+T+tllZz1J3zQUzz92VX3Q9gUYVdiryrX/vdzO0J4rw03chDhnqhrVg1k4ikgKZ//Jvm+Uql5stqfqaV3z9nZ+P5dcYv66oxGa8XPeAppke1JHMjGbg7mEhMzKaD4FT7Mq7oxdyOGv64jBecik/LS9aCTKeicxCevJ+Lx1Khp12BunzSKjcXg61vRF3mtJUkHH5EGbdJOFBbMTBBpxNuzjlzZ2w9WAaW0SKq2cGXgFUGXikira18cvqe0EzQEWV6yd4Z6Max40q0Dyv//8t+wAvVpwsYLC5ix5PNXgF2WhKlNpxxFVWkpIv+8JnodTNEeyBwnS/gziS77wd1/x+7Rng69zr2hnLsUAfVbj34nbmWAuL8oHh4D8HrJjzLoz35qcv+2QSxg/bKs7v5e/eDKxX+ZtTia2f7fZiWPxim+bNdfxgsqIa7PNfqeICiwjaK+ZR3zZRkIycMQd8eyHle7GPmR5R4QkZ7+cVSok6hsqg6MkvKqFx4SGJDBE2nGkiShb7+iYTs4LJB2F6FaRct9dtLLw14RUWUspYc1mUE9e2vJ734oINfShpzSdT0ugIkCpDIRr9cZNenxzGXctiuIGxfYB8K9dWKrv+Q/4WsgQd5QAP7jPEZuzTACqOL7u690zjG/uk7L3p3yDaoFD3XFrKJUIthH1ljMwC4tuZFQapK/5Zcf3nhq8F/BkFdF4xLrWBQ9i/X8G5FRYPR5vSJqIrj4jliMxPXCJCIbxP/JRl+DlQtiqpPxGs7lk1SCn8p/Y48/Vrr+iaR6VYTQog/NLDtLi/E+zijhGgFkV/sZXmnzPGtA5BRd9FulG+2M2c1RpgydrmXmWNE+f0DykS2oDR0MQjxUoKxBSMAo7B05BhZY3svLNPf3KKxmF8ZwoK0vPNEdKDrW3T96d19TmefyV7TeL9dzqpX/7FVhG7W9nSzAf418mHt3dT3PCXcrs/EGnkTHPGPu/iMBNTlf5Q4222qJbjRPPwrrZhvKmSnujvr0VNu6hNlDOv6nDuCmujBa1QonAFxWxXoBqpEKF55I+wywtCrceS7EiQK3+drsM3IrAL7QqYa0lPviaS5dnryrL0ESfvaO0jh5Sl9JcK9M248lywgbnVYNayCAQp2gBOhgdX2+5fhLtBsLdEzaFnHzw+9XNgig7iz27EazSbiboDq/ABXRau2CSUfj+8YoXrkgNKAKvtLvrFXejCyIB/0lvLn/XbHdL906IUkQf/6QBvKiJPje99D4SRdeIdXyvfDbN4N6Hy1ZMYXd9WGpEHB1HidJQOI8kLAsRUiTX5ZTBeGiZBqMZy7Zo7RRz3Y6egE9sG5nQ4QgpMTIHB5UflIFlssBzIHSFutNuV0pSfBS71ltaC1cwXlc24Oa8WHSLKTQcCVDo2r+3IIuWX5SIcgKxt1qBXeTunLXq8AbbdNCjgQTU6veUJ68lIFqkJiuA9bsViEaxgdcnd6KCA9Mn4c6c6OaUlnS19xLdqv0GSy0bKK5udnUO05L5EWVGLPu/0ztto0odXdindA8ybV+hsm5A0E8NbIxhdneqlvznXnfZ6tuObmmAjIJaLBrQwM0Q51E/EFBxkDZeu9OEgp+89MHh8VeJLstGrxUcPZ/jWwrPjPyTRK6TVPLYmRfaoIuV0EyeWvZpV9m/aCr3oVN+STYXuJ2rz4q5zm79dZY0h4UjCdSNtbtqr774MfgrXT2HeKzir9NmMCp4tJoR8H2r4tr5T+FfbvY56GRWCP9Zg9qfbVFRI+274wbL/ofaFeL5MczcXdH7LDqyvgFv19mT1u7TAOUHPivXG3qbtErg+4+Ni66YsyBm8NZL5hd3G6ym9E8PcvNX7hlwu0Z6U6vBLpXMq19Te/RbBDDV2LrfqdMdk/4uH68mIpr+K3EIO0i9pqPD8rpfqHIP4aTF6TmDYqv6xHn1tVMUiRUlbWVsCfxJiuU5vU42Qt79O5mhisuAFXd1/L2ltQJKJe8wreLeADqORgvAEwmhzfChpYLeoB/X6xXnu/ZBwFn04PWqvLlWkVff61fHFqbJ1kZY+nFXbMt3B3cAWwl8EhyjvRWWtQZ4G7AHEaBX98m7k+aAZPEUFW2C7uY6HkEHorp8d9/BnYxbcNTNUsfKMuxm/Y4cWXJG/BcJ+QMJcu14Del1UT+MUle7Y1jUxE/UB5J+hWdsZjy9eVZNOeu41qQJa0tV74SkC9NtiOl8qPXMMt90gMmlgHkonPR1FRyMGJn+NlmkbtuCgwxLrjfXI6dlgQiRVhLNvbwWUqrMyGEMRuBsUf1Hf8VrrNczlhWHaXmSevE0Zx3kHbvJ692tC5XZQ1E/lvBcUeFfhhuAaP7jNIMKCCYw2kgAbpEoJ8nDrNqYag5COwV6NDAa9YNf3/SSojEtA5P7y+Ou4fKNV/y5lsvjR/+7ly/OKai8vUTnPkRs/IqJnLgqc6ILAIIGXzzGEUh0nLJoI1q9SL5Sm7YBb/cyiqQU4Xu836vxvGFJ+KKOvzhxCCKtEZzxq9loEklcHnQnOfKa5JRRoUQYwQgO9VK6vxTbW9xogriG0W9oVxEV7dzo0IOKTkodb6dezN7lfyuUCxiIP94w6wff3WdEQsfka9+tMdidcFyvfTCaBrXbuGld23+KzLLgdwhgF8VFqQ6s2FwO9Wr9aXNsPHXFIpqHz9Yy+vbE+5+0UAcE79kIqWBfiURs2bIJRfs8mn5/2Ggxn4ftJQ8jlSqoevGawcQPdLKRdRRDBi1JgbXpQCTPKPSgatw5QotPCeRZw0b8SmKPBwcL2NjZkaMjaMYEZ+k4c6+lgwwfR49hZDIGo2vgqVJ238Pe2rZJS0UFPqF75tkIb9kbYDkXnUdwalel1+4xcu5UTrYybL+62+45LQZgdF8UeVRzvc1TXVLS10GfyQDiNB9JF/l8zSO7xcOxT6i8t1IKK918xsug3CfTNAx3UrPrCMMaCk72iDBXejUWT9fj4kiMcVcR+KP54g3rrQ5xNJ/nzoy+dk9N9deMsvhSqeuD+uzgc2hCZCEXQTFYCWAYxTimt6rPEonqfWnigBmacvlKJS/2Oxb8cMrhPkAwRNp0w0aE3Hd06SI+trNF0K8lXes6YVxH4p9T/9/AJcfW0ZFG7Jya/SaFI5UmOBuwFfLLyz4hDY6QTbLuvIaFszIECl/KtEXadXvA9K/VejvrBvmOBqOlDSf1b0ZLqYnD+M6EvDvESxkLvN1j3pT+1eM+OyRhZEaW+Qdqpng0p+7wEok22cxXWjBhgDBk/2Bq90AK8F+v8mhSC3CPztJV+6+uDPOBCCz8zin5v+0W6bP0tqQ4ETWmbWGVRX6N0/50mxfxGqDhxw0+/osOvx3kntG8YVQBe9Fu/J3AINbjTITPS8TSVSTHfzb5dUMBqjDPKW6pFl2YjTF3j2OVVKhycdLs55NiqxBo33I5LfBAYVMuj324UwPpatPbV9X4GyEI5HLoLex/vEcr2K6yYWVZ0407r7qjkHbH0cShS69p3K8XWvg+Du59xdYiN+jxAtjpd6U3e3DSK9J7u1s+/Ilnw0c/onjCPRKPGsH8/0GbDm+Z+xggMfH543a14QrQbzbkD7hrPh8rL1/dcGvKes7Lnwbpb1hXoBveh2Hf7M9Y9ikPmfdXDldN5+CBmUxKOscyOsZU2Pp24Adu3P2kEFR1R/FQbw2S5LEowKdIltVcCTi9yk6wIhrZUL0Ka0CrLC7yCA54gwIWve0VER/RomuvQXM0mnVLou8K1FMNhKZyf5Jo1tKWGwzcDUf6oRWONnYHd7V78/UV6R3evaeFGcqOX+l+fAeXuFsDtP6N+Kx3i2vr/DToPLBxaZNb1ehQLwrp5eOfiM/8ziumZqUNd6+x9AhQ4Ka7qK+aHvAiv+PQriu9cNM251qVIrbcbsCxWdkgtEEgR8QaODlMgBCwHBDvkAN29l+YD242N0OPnZV278VvzKbnyKI2eccxt+TPCY0Z2vT4uTGcRDW6nHfRUMcRiO0jJAYr8Ud8CXTK8YYixkQTUspVz7a/T/6JpReTM0sF+Ym79GyESGfNTzzHMCTdR+1isfO8CIsD6Eh4vLZjYYYLXZam3qrdwfa2Jx3UVRKZ+oyjBTIg3t69fhP2bsjMYN4GtBx2pnL/x8MsYgt3Bp26lEKAz1sXElJLnfa/+1aG61Txf9L8OxLyCAv3nhY7EcT6Y9pFeJPmLNxYxL6j7eTTyLzxY9+1shV/TXV25/OGopT3n+h9g9adNsPbGdsondckSV/2Pv3JbkyI1lC0/w/z/54Dx0YNmSWz20errYHG1CxipcAsgsDekRiOsmF4Qbk3tv7LlOTZ1sb+kiAUl75jcDiasSBK8k8Bc/oFLOd2IlrSBRjyWCjTK67ud2Qr6mDX+POD0GG+v8wsgmADh7nteGX/MD65M0P4vogrQs9Q3bunz0otAnNwk3ofisIEabdbBvqGQ3ttyNnsd1glao9TOr3uVo+3LvvxL+kfkXVsIMZ8A0lEzonFkvjdOsv1RqsHySeO39WJffaWTeNf6NcRD5Q0LjyHfC/ZtSLtb2tK531trf/M5bQYDmB2IB4PTIX4+SPIAz7jxKAzSKfZplf7n6bHAcRkKaB5ZJpbCt6W+tPuokvjkaJf3Mlhk2Cv4a7rCBTjEGqq5cphE/uWJ4O/y2VPsZXgmHCWtg8WawZA3mcPTzTE5+1tfuPqDv5ihMvZdkep5heoX1nWdVuDAPMhPIguxBWQMz6OY5CMBPjdfDERw56Zedr8cxBBx51nj7O20PXY9hSZbVSdYM/s+szhDsG50rXpgjT/IsTMTAzqFyjCKKCxfOB7uaAqE/1/LtaQ7Qcu3ve7l8/YTPMqHz/dcUzHHTQ/WJgrb8EOET6GAs+pEUEwxTEBOrg6IGdB7D974LoBgqmI71cswWX1L/G/vx6eFUQ7mOL+ndNwGyQkDOOweN/rxG7M5ZTCuBfTj4eM8ajkOgMJwR47OZAHBsU65FfaCUMe776HjgQ048xMic3vK+Zzqxm2cexhiEp/HCSsNZ0gRnAvJMh4oxWdBQ+yu0RQ5QkvGUP//kMoF0Sc/PEVBzVZiutfQkFz0rD8iNslWYjzmYRyHD01V/nSF6pfiHzYzS/7ZniM2JILwaosR1Yw5dEsj9ppY/Nh10fsqJ8z2aHxyJr6qBql4kwn1YRQe0pF9eiM5I+SLGnx8b55ZddOYUcdVfSOa4/HMZcMPqPAS+L4DZ7gXWMf7+EMAr4Aj48KihT+Id4YV01BKsEbh13rcAM02ONI/OfuYhsYMnOI3i39Q402A9t74Gt83S9rkmgZ9795T/F8/FMQDW4whAbo84EW9LFc7+xp7WBXlS+WfVcPnnMLwy7Qdk5Gdxhs56xepiXRYA8wRU8rbokmDuzLEceABiDkSjb+Ox7bEZe+8HcdeS5CpQGvxZhR/As9hzabt2fDjhHPb/RHuTv/5+G8gSWfcdAWxvaHUvpqt/qcvBQ8RSSlhTIpeq+GoP8hBTJblyB/GcORByb3qgu8Gd0gCQ0pkhGh+OaKI4TmDDF9hnlyG7ivJAt2roc64CyVsu+qfombDKKGKsBnUtbi+xnDrcNoMJob5AvOAnbrHKv5M7SGYQJ+FocZH7sXyHMNwT2OxA4LCMlA8P6IQ/wD1R60A1DbDuhre/k4NiZyY9HGmCzCw6UU9niav0DmyAlA30m22goPE+Q7dm2WDV7ok3gugI/nAKKYmYVFGZwyTLf5I4ny9T7re9fb6qss/7Y4mdyBwWkFLgW3TzHf3qa33vv6vABSogTeJjs1uYNehCiwMQBoDOidAcAfhnFjOvQ8rEMngNDNAwK9sCaGj8t5KJUi4+/GrZbGkaMUFh97YexBtyo+yGbFQjLLLLt4lKwoOFxXzAyZblWsN+uq7qYj5PRa5V6f384KWHKD7A9oNVnj76Yh7blPmCAB6jMJLKmIcJDxDqtxJ/aB9RLqeKs7/Pw4zlfXZyQWAeXOcD13zJ5ww61KsepH/Athook4TNBswFAgrDzFYeAy2OQMmZHKJnEol+7PmbC4gjuuVt9XvzXTmlXdDFfuDlo8diWvwbyEI+xfhr0GfJeEewE1YA4zVTl4ts4H8m4lsCKn0mRi9Ddh4AfG8U9kMl3I/SRae0QLIDg/jd/OrdHBIAsFt0Z0xPrfztK743WpOcfv2S0pjPEKtxgfvGuQh4B9JhTFboMAKUpW5CMOgEQXgc9d81LpMW/9ddpAHqudmdKVIhImjRAal0pIJ4g7NOqlQXhuBZwDgM9isLaJsFnLy/PHysuGcrwI2npibxxpk5NEiamUTPD0xjvngO+zyPVH9CWPGsjQH4RKmCiA5b+d7CL/mpGgP79zKcs366hRJHeW1YcyQwIEMxWNkHjFJtKdYM+mLcVMB+jteGLaAWvoLkaPZZ2XmRsA360ivhLj8Vv1jPLirsAl1JvhbUxB+4BBAk7ARIMCGXjkkiZX9XAoN5GknhD6BqlXWEZNat0wvrzJbDJ89ecAyiA2yvv6uu6cnYSh+ooTOvYW5GPAjVjvlA1yYlvagV+jTmGHCfMB0Q/EAGoo8OCLh1ZS/hfJV9hI5U/bYWUC1MYj4qnsuKDjgv1uKwAs9gtB27s9/2oNCfkDRMCzMPQM3bnXOQ+GEjGJg/4RfzaR5wfmMRmHh1/8Al5Uetvis3BihS58wUEhhiv/oCdNDHKSkBepsJ0cVTSBcKozu6Glb2AJ517tteocL6X0kmJRxLUvPwABH4u0jtWMSKVDXM4pREotJNOMC+k7LEQvDhH7mBfFCxFPl82+kT7I30NDtewYAKM/cuWxuc/w0msZXkAy/ODag76KNURuh5dDVYs49QP96gasHPJKkHldhhrXnXtUgJKibgCf+JlPZDuRaEZgkAJg1xWR6eWQ92Azo5dwOHl1cnE3Tb+QewP4tjltFdteU5Zjru+VnWMvEsmZgPZcA4DNYJmgR1EX+Os0f8VKbP9xeEyXsqETP5DoNzNzWlGKdQNQW9ELgQwwwendzREG7Xx+CIAhGxQsEYrIYmRtDvwr54RWp9Bojq4PCep8IlYrTfthZDk5mcrBFdiMtqftB/k8pBp8EGqpU9GPvoPF0qfhq5gF7XFU5lZLZWDkr2hSkkevvvwyjAXJshlst5diiY3z7iMZ30jQHPgfqOA5kDzFdXBh7Zfqsi3RLbQGX/yaYAW5qkfy7KWIOHoZTVV0qgDuwK1JA6yfMBmWE88iHCQ8iZgO6sUJ1HDK3WmYIJOcb3wKwM/Z0OOiie8AjNOnysxff725uqH+53sp38UOhvvMupHm7BbAdNttSPWMZqHnsbCheuiW/jNWh1Dn0Df4v89thBHw+07K3sOWA0p+CmgwF3s4K0Dr3Cje0aJMWQeQtty2tI0WaotPa2gB+e2Q6Uzvbs0vBAMfSoj7Jc0DfsMpBztNyvFgV1ErYzmFNk9285XDUcSm3DORxQxXsR2mFQvsGwop9LN6/rwgPDrwv+gvowCk/TwbWHovDMOw74Y/N0n4+UmM+aTdb1m+V0dd4YlCuU64DO4D/ozKFjBoikf/GHmnOt31rTeqxrP1iIqRo2yUDJAwqTkIPQcAKYz2SUO+d8GcF+niXsP6lQWd4UIJeVe7VG3EgpdO+kpcsBNsTVEb226xNSQ5ZWoKdZwlxJdQCQTw/ApQLvBrx3MrSl0ClEb3/PgX9SAwHvcw4nqdNRYT6/m7JGawZuaW6gAxJ6fPMUNG326Jl1aVpswWUFTmEew3kF/jzc4b1ywxRzkJPYrtpfQRsFC6rSv53PEzYxkGzVP5jvsZC8HPkfwnD5nHkKxpDfZyVuoLub4LrdRUWABbgKsMAFOrsbK7YXj2Ip4Do6n8Nu8LsgHcXQEAfno8X+pd3qyTZsrQ7vAFsoh9DxBSIswAVr3iik/wk1gfOlOOOfZYzyGNNV34KWR+hMgRan+3FZlqw8VwR+qQfaZRa2qkaIpwUgbdx12HmHwc3HBRBR+TRMa+ZlBNkcNssc5BU3djGM0tM5DGzb3mGdFUM0YsJnuEMCkXUpu60u9vP0oGNvV7IDPUxdOG/jcPtxYl3myXNWq939AmlfUf4s+jI2rfjNIB/ChZ8P4O+ikIA3PGN2GGnhDuR6lou/vPwvP4CQ/TwGPCVJ7jK6aoo+Aj1aFhC/IgD4WE8CspNANEsUDPQM2QFI5HCZDWvmDTwbLgXd7aPrn+vAuRMfozmPaGG396u+u72pItjXIf4nrwg0pWurf10Y89oBfLa46qsUAfdKALAsTJvghZz5mx9clx3FCVjsVxMeR96bwLZ0R57iaoBOiKWhnyWyxZG7DXbRfKBfWQvI+BBkhyAAWtcFSyajddVZCdSI49ywypPTuZpR84dfi4iu5JztyHlXmYHBrIdtnBvmwmNLb1MWo+Ib8u7kk6OyEEEQSayHLDUPoI+2hlmSRaOH+ZhxnhOnzwznS1gSaPNBZ5YQ7mUO7rzMAvewlOCEv5IHc4AcNzn36v7FWwrxp19XAXMWqEM6UN8mHrZwVtKQA/XMnFkLJ+W8ObDpbzroL/CoaYjzcIGKzfdQV3lJlwAIn1QXNIwbph9Wgc5mDvLxJ+nyxUj8a35ZnWLnf4bS6CCeb1sbZhmeYe6SWSIeeIdNHO9GJcpCdLXoajA+NKyr5iI/OXEhsliuH3OAzPL3MLLgb/FvNCGcIBX/7IeSoLK4Ohe0YhLsNV/BZguYQ7ga+2d+aG2zuBjdsjuMYr75bQPZAn3onCx6aBHamcLBEkrAEfBfLA6t4d/8YDgXbkRFCHA/KzhdgviQM5L9F5d7MQ3QGZCHbzCEUOkgHoEvJGyDLcGHzprv5gaCesR/wOZdORto+d6ccTCAfF/1x/xQGrwaomKk0WZW/3oqj8uEuyL7W+MPP3DmM4l94hluLJFbM9sOMiq9GEK8UMyA0Aj0H2Pr8p3Ef+/X14MBdpx7xLBE22HCJplvbMIDl5ukodFLR/mS4YFwUN6ayadLK/gmABnC/MsqXa3nA7BZVb79zWL77A+ylyYQBpHIMPuBqLwIb19uPPHhxY14UxFvifWTXGiE9dJAMQgNbvFxOVhKIFGqoTkctgG2Q0N/tKmkFQI5Kc/bhd5hEWj/LbaLElL4AFL9kBGLxQ7jOLMZKtgCFwK6fp7k+o9dHCz3z8xx0/wbmKBRd+ANOTTfkld/v//xP3AbyvV2aL0phdzlJAJ4iw8IcORkOHDkoGAbhIeAAX6WMpYiC29Q+dKQzFM+pQjvbMdyMNPbSp+N0G7ewPky8/IsvwMBXzAgMj+88vnUihsSus2ratL3329mZ6sqs0sdh7XVPvVaStXdcWyXhXXYhk3CaUsCO8F0Nomt4LJZ+cML/p0wrjP4WCXENzjvhVHhL5ydjOH3OrR4RNsA5h6whqHhB8opiyJgtgsoxf8DAD4za896asBYuSKwpwPuwwFGeSRo5+Qco3f7+lSKCL2OoL0vBbc3UV6BklfH/XNWvFlRYcx9U8bi/F53oLwnG+gPHJgaZaXaksnPbnwagPeCjz2flf5RympZOgOMov13Pmjw03puURNX5Q6mXiE/Xj0acbBm7f2/Ra7vZ6M1VzlKrZXih+PDLGSoeTZXDPKEzkf2du4es4uFATzrdSSvS25mPzNurLf7DpoPx+zdNfgGcgGjQl16BAC4hlc0k6r+xSk6iTemF46hy9k8xhM+VLC/PEeqiFs8ElFexX4hZ5GIXrJFP0+crHPWblcV3rPCIhI9VwzjspU+pkVaZ8KT1tuwH4HvWB1PFmdA3DZib+TzyToHluFNZAMlF8TKyblZoqecfFcQznvBM99lVd69/H4Ef3+BF3syPC1dEWvZIfe+xFepDit+rF120d5BN2uFQt0TLJNAud3/hdgb6mx0O4ZtiFVOwNcE6YS0okOpJjxRxA9148NTcDXNBvJpXBFkBpHvD+TkABIzQOSfPqoZuCWcZAtvhxYmYF+rdtKxsoUjnTzfqd+ExfSd4n9KMHbCZjToTFAtK1BPcrVR3wD+DiHH8axzvK05YqYWK+hwcCtdzQywKSyVisdn8/4gF4QE7+/DNBs7/2h25mybhRROIahHt+8DF1G1z9T8usszfxLzAeAZNx+I552gEnKPRj/EoGkLrKkwVUwCRyCm5sXOhIHZQShvhfg3IPD+IfN03rPRsj+BX2YDCIlboqFxxKKmxXwIxQwA/wFKXwicO4Eivhd9gX42EDCMVgbRem+iAbS2OUBID/aD70D1pozYLxjRPEK+OLgBtadnhkkMODPnqOFwCvNOkRFN8M1CglOQ1DsLh9vYG0cxAN2xNcAM48It9LltYH62l0um6rfANDjXzREH9jjASLzQPc4C+AzOT/dR1gliF8n0OYO+pEyxLhrLMBHfAIzuOoepaZT2/QiBuYoaWAS4r21GaqAbyqM7ALtZ1lYeYOLpW37PROfyXHptEx7o5vk6A2H04Q0rG+mBePlRHIjR4EQodf7YZPi0YgD5V9e4odop8hNB8+lKfBgUHaAjvT9AAgAgdNZyYxtKnBfTV/TmnC0JnS1I+ejlwXEsvIGCz+f11SIswAuYYI54M16ZQzsJqDgZRduB+WEzlDlw+8+xeYLV8awoLDgMZYh1sk0w/QGrny7gye0M5fsjHJeDDROdf7MtRq4KwQrAy8nAOkeyvkJIQBWk01vB/fw6L1X+pAuaSinRetkLFr0ZlGv+dRVdzRbOik9wNZYPn85D0ghHX+ELJIstX56Tq6bwtkF/8VwpgXjaOStkFuqUP0A3nMcHLQM/5mKdkrEWT1CYywmcOftQQuyPRU5O3r9dIfWu6IEQNxMl5LI0JlES/Y0hfobYGMntLMW+Uc0qFgiEvWAj3Qto0oygVJfzvs9hAuAO1wLDukBett+wcYj5Cphv71C9NfyKr7ZivA4IoIHdbrjq480ZG0xgxJxQqT7hAiyURde0KyC0YLOxmoaA3/YhkSwL00F1xAQzeWzk1RoTd336TCOKtJK+bci+xdyEzyh6WHvdlrTzmhyuBfrnVZQvKwGe57oCgkOjnU7JRbjuk3V8+CHxj+A7lqqDzB+oIyi2Xyh/dAzfnQiU3ylUs5I6dxhIDzWvCAbrh3LAP0fXvAOW97c4k/4J/M32L5SZ80+jMCSvQ3bIDYqDJniPPvtlMoMdZfIH+FTHcUYUxU2c+lO6GDJBz/PAaSromr3wuAfFEofRFHJm96Bf0vZXRBpBYrR0ZogqEHOtvJi7pVSStZdxgj2CJA6K+7UGf+dZ81ogKJ/p20Oq2Ipw19hpxKXJOoSsr4brJ3zGkbLQZ4ru1hWFh6+Hz+IsQD56fWK40IhxmZBgj/mXhiMRZeOp026KqgC2OkXELEnar1Iro16dWRyBHnhEZW17lo6Y448dNV8XDFACaOanZLuOPwf0bowHv8HnvmfkxMQwFF7df2gHp88zMQNMmCW8HwP/BoKlG2UcpdfXfd89EKOcMIVY9IDiAEoCp72rIjobXkvKeOZnjLHUfZS7JrW/0Mjvcv1UZAD4bnMwFDFZbD8Y0l+joHLAcQgMe5kJoqKDE1s2HOsLdGIfn4mEqZcp2Er3j/V9Mz/wCWFe1VSZeQJ9EZOR+V0ZbjEOSwHmOUmlupgbpGNmgNyYu2ARdvXkSTAOdDjYFXQM7aHj+8Jias0pRIHN5CJftOrD2F9HWn5K8Cox0KM0za/1OroGeP85h/EsA89sJrM/miAzCZBbpj/j7qptVRtMKzoDGq4YkIUBpwzZLM0LYTH+fFHcny2YuN/Oi97vFRu1SpmFTOhAHudj7JqNQI7HizTNQevdjEGSt1Q52AMYUWFrk4QBX6Fsa3aw3MJYmE8hN5+/Nm+QLg4pFkVSUCZgC2j8Lyf0y0QMhmaQVwtQ7zhm81U0bfLmfwH4MHIIXpZOF4enI38vMqq50AoYT65Ao2oHj9lTEt6CExCESBRUlW5XTn2ZddgZ/1noeeBe7KASPFnNsR2syfzGjK4JNefsDwj2mIWZkOQP1ar4gFXG3sb+Z1gK+TTB4JS4nsOQA7ElUFDmHAhmnzXudeiSxkb1HJH/j3BeP4Bt0dHYDZDsx3v0wAKs81Hv5xPD5eVwM37rs9/mIYpFihs3fS7CILxtA8iPoBoSJF/OZRagPFs6oWmW+dkijcqsCZ2Hft+6I3jqI3CPB73AP6X9cTpPALwSv/HHJgHMAIA/eecg78QP9w9zhDUH59BnO2dz53VDw0OQl/2qyBGXlfmmgsAQxq6jcBKrhiSIU03rwddyllkvey/2I2cLBWCj0io0oF5KR0iJqboouTr+HHxni96eVenqzUJ4F54ovZA7PIUzBOQ4tS49EKmqEvqL+yGlUxJGHvp9BwCF20MHpKcAbwjF5YSlvP4D9RwpTfvMciRdXH8GzRfKfembTr8c+H47nf5BJHM2maNpQVV0PmkTzhu4BWzpqyqg72MS+dzwswF1XFsd55P56tLgZIjhY2igBaU6TbC82TdrNDQdiNtDTcMEQCwAx1CMPbIYMz2gC3MA+jcGBXRJQdWz2Yz6h9TW8umkS65p2xAYttYfC0XGXx+3JmrDvyz//iqjBnMMUeybb9CvXPu64ZWOBy0Loj6PXTMlpPQtgJV52sK5Xsp6WIQOwHEmPQ1wk2UT9VGrmtC2UM59Yda1skl2AlIAPeYLK0g/ADlgjuIHQh5EmgeSToDFGMBH8Q+KwxtdCpItFber2F/pfrKcA/rMHhkJWB6CNX0xC1pQAg25tUFOFLrOnM66WlDyi88oV9yhwDw7pnw8R5xzqIGQM35CP28AeEdBmPxe4wZcnqQtnfOtiuw5J/u0eE19ylI1lGXTs233VSVD6+OV5HmWOIE5xHVamFN8mU5JJ/GPJHs9iC6MRUyDIQtJx/66v8lazft0S7IzB3Ef6LqOwzjisslge8wkpid1DkRZi0OsZVHGCKKwDMLWoNhBWOYC9dvMipsN4It1F7vyQk7mLJx+1KDw2bx0gNEhwt8GpyAiydxyM59xLgHRrf5BXXQ/s1jj2mETsQlK7cMK8j9kVquw6vqMd/YZ1IVNldd9tNsKAKO4eQktruzrQzueYJYhmGCzwINYjwEuVJo5iz4Xk8slzu28X7Hz+ba/ryJjfnPUA/KOs18pp7+8th3uS0fYBO7NFNs86pAm9Dxq6M/l1TgSs9P0k7Y5e3O9MEvARrD3Va6MZD8JpR3jBRuQPog2ROVbCg+Br7HQxeCdJCKPmynUfGkKzMCmlaDNiTO6mU9sODUMgMX2/gxHNA8ATYduZ5qT/aiBtGSIYB5MNMnMs2+wWPcIASOEy8ZlpodW0H4JOz80BgKl9/eJTDGPZSE8zdxhOIFf2K6h7vANxpM8dL7hHV3GPdGAKcDdN4fXQC3wP87+76hh6Cj4LiNwEy18kPoht3MWwWt6Fju18TDAO/RM8UgREor89ZbvpdzfIbCjY/qNFu2Xbnpgu6V/kOJVJW5wGxAi/Rt4BEIL/bXL2h15/jMbVDhI8ICtUzwTA2z45TBQv+27CPNVHRJT8+M3If0PK5wGkfRcfDfPwzKwneDBLWKk8UlW/kuroz3Yji0c7ymKO+to9aip1UncUp6SuitqHuTlUXajt3sMhtXHxDNcCylb23UWy21r5TBrt/DFfKHZ1NUBTHTWcxptkSpOmXm4Z4D5XDp4OPcYS+J5BfE2FjCnnVCEebYhr8/ccBN5BLl71i3LYmuCU/jAWQIKQwogF9w7OuyY8cyABt0A3lGO0WtU5hmUjMES8KcVhlz7HxyRt1TA+YRCCTnM/8pAdWuFEaUUYISiZ4+oyhfqfxQVzG/Ec+DN8buGdqrB44EZwJdLAISxmO5nuDELasNTxp/nFydgnmUXVoPJBvTL0VeYlV8FAJD+oVlcNnCF+gZdFQ3XHCV9gyLKCUSE72C67b53DVCHADneExDjuuNoXYhgO8SKo/R+HjB8Zod1AI9qeNE7JkAJ7DXvDkjOaD3aAC07wGKAflacnoKNKLl0USaXKCI/Y57VPj4fJxAWMPSvvPyN+LFHv6nMLthIvh8vJmj2gW1qsXMAEI7Gn4Z+nukZLjYy58oDnAPUz2MZ4knktENKFXFcMObFW83q+fFUm+9OB33exsuUIJ1cK9b5P+h4rSAG0rkkoAoh+7w1HXYykX6e5aG1Pj3YVE27Setm3Tx6+907uAxsyMNTgGejeuwnSvn4zWvvX/pdwnNUSIGD7ZL1GZCfbeMPBAsDxXlAXN1l/r+2pG/3UDntqCAL1X3XM5/W7TuPGx6/MAcg1iFTdhNghkY+kBWOnc6Cm4CSdpZxCJjwFIkbeIdVCOkZ85P8jJk3aOJ+c3+bMvnzw7EEoCOisCKHe6DYZgppoIxxVLDFfL7ygIzYcPHYdDzwCh3QKQycMTqSu0XK1g6+DaS0MI+HKF9okFrzwwhKMr7JFH3mtXEJdQzaiU9F7s86HGUjwvuLpuQLDCDrj231L2uAnps2/47RBpFNHj3AVR3YFX3cMlN23xQSgnSjm7G3Zna2k0Kg2xHWO1xrP1bp7O3CAMMYLO7fTYlywaW4Rsq1vyzLKin8yxqpCuMC8Gk48lPM0amaW6xnPtL7g/5ketMeQn6lvqsaKizwbc+f1xK+3ICs4H9wZmFXt86o7AagPhb80+j7gNYRRD8N+8sGAMbl5LnmWU4QB1rjA8qBZH9bd56nAOCq8+7cP7IJSP7G2w5+YeXTOrk71gP28jq8KuFd866odyqtmhDYnjuVaE2wDNKyipImUfJOdPUJqXto7ROUTPI4TNGsYAIYu+7lC8MO2EmbJe4OvMf5OewNDCDvKMj1pjrIqVb/3GVilHTJOlp9GIK09nw7RadE2RF87cDpQFgn8HST16a8O2nbKdzCrOwQtDkAMR89kLhK6JFows9FbMdtNLviE0wD2whsxaK9fyBLjv9NnDmVJG5mGh47xWfgC+W5f7tM2f3fWwdloTAIEhkum6h0JMniC4iclcqpICVKa9wl8y+EcQEw6hSOX3oKz2KOncT5UifMGYqo0KjoN72YhjxjzR4txqp1MbKZJJyLdYi60jtlHqHhJ1Qqf5iKcSDCeGEwn7AReIAboj9bW8FzahbFEQewCsfIZKIww0Dr7+xBfs/2//l8kPBbg8j2N7Gd/IbQXzl3L4Xh2M8D2WmPbki6XsR9IMnFaHMHKDDsxFnpjtVCoBgieDXX43qRp4enDABXGBcU3ro3SqJgJ0bCR5VDyJjakAxowy0IASZ/EauBlZpXdouwG2N5BfyG3XLmv2tdxHGZE4hgJmd+oI8ZR3ihAGqBHryH6gMzKbIO9HOYL544xI//pPCSCQGuDcdoquRPCSIyojHkTPMDu/yQCc7Gg4da8K9bPQje1vXAwH/e1FhuRsCFAXHtZVbmkv1zpoNSCDLgk6YKvIdPZmeNEQ1NPVcAmj2GPNZO5m2KRuXPeVWz/uDvc45fCMVQIKD9ZpYw6Vn/+U2EE/IJGpO9JujmdLJZubJlyPu2QgMosLEB+vzrbClynEtAVNDMmupO/3DBjhRvXbMdKlT48u800Z286XCA38L62U0aoYxo74Lvw4WUVGiWVWyAZUcVKG1c+A0wSoLF2l7her97kzsUAin+d+B2gXVWjXUHR9tTdwi8spMMVw6MDqMvH62W6qXJluZi7bzSmgRssy9QhJ++CDHkd4iS950qxDwajknjd8ScckPcqrgZ+9pYLYEVm9TNjg8yJhEnTu7x3YnB954dCBWT6BwC/OGcrXBvJaYNseuQ+c768gY85DjXbXzgEv8knzSpy1kcOjs2sCiRsHWPD+tVBQ45Aq7IFsUCLmn0HAC9vqud/2Y+ZgBu+TSgQ5BPPqzJ/ot2JuMi5eKI3RgDwFN+fciSKGVjjUTW8j9BB5PxX36TM4L88kznxtNmg3E72ZEtmYbo7r9pkrSrbRf3kg16g+4VCwZ6MMvTgA76PGC7gDtUl0fhxg936jgGXhFjNyna7sVjZtSkcXMQ80yJPbgcP7jtiD2+nNdHsOZvS/ueJNeElU3m/5fO5R75s3gPikWDD/yWVnYttHv81IH4fXubN+ZGhdaPR2wrIq3YdOMOaG9lt5nNlU3kGHHdfPdWlhM7g7kFE5b4w7gkb8siFC+FNW5+1qzBHvovzwghm1tp+AlKr+ufJtDOzVtLqYoS7YZDS9DokHPQQepGpl31ATiSAPpYNVZeXs8btP/5JLd4Xi942BDf9Gz5uuzfrcnkSmCGy2h6YD8+I04GX56CDwuuEwiDV/3f7aK3xhhuDmCn0hQzuxExIkX+DGKpHLkrTKE7clFhlErZygbNyUN0t8MmmAM6qNnrYIQIOgKZ0QV4VjBEsF8LrKCIcRnIA7XQvQXi5aI9DikzYGO7hi6p/546pSmhVul5iQCW+tjKi1OXGNlDYAJESF01y5sJphwQ4VNoMSNjfStsjgN27aRQzxzzWv840nxgFdw0d3DXQtpW/YggyW/+34Ds4wScqYefiDV1/Wr+Zqev0WSb4g5oCQe25ZYU5yDXomNTxCeq3I8MgAl/4SEzjEx9fmr7LKvnEFiVp6Ny8n1D2YAvS9jP5846v/vNTNZBl/Kzw39uJmHCum2xWyrkxn9Vg58Ox0jS3PMdUF2YWIFeLCJRke4ARRPuNOxCAIu98xOt6ZGo8hUaFjnws8Vd54LbQzo0YD5whDTGMQ3qxLKlSgikmSULUgexAHNFUK//CLiOGpelz+PgCN/R3gjQp8q5PZAszpk1tMiwOHqOYWkiCeAGm7cpcXJqT0I5J7IgwQOIspCKpCHOEXob5gejBsELJXVH2vsmHI/TwRIzWLmrKE26Vbx6ViS/6xAy26JFHEmBgHYGKKF8SeSYnbGijV4zsWz0sklZq7qve+aI8bFs4qxTT4PHxHITkz3fskwtiFaWRYpX3mIYnb4lyuoLG5+vZ5N4852FWfsRywkbm14lbCcbO0usKjZYjqLML+EKOoadC9Sl2Z45JrV2VzaqGRJ1UjUlk9RBKnonBZpcOUA2aM+/jdlr5b/ZBKS0kT6lNkUI0v1IzMgOrxH+8GWtaz5eOJa5JIRCv4Q8/Z9mlmbmRVwfmdiMvjw5syqIXs+zOGEQfC2LabwAD0N5yCIgAAAkRnYQ3v5CO+Z6l5LcbXd+PTrgWdZucJPYJDDhTtbyCkPUcc661LIKIyE2UoerW89yqhZoBNZyN4tSkbBLJqndNe+gY4YLAxOSYJKd8FeSwBdO6UaDIKFfBegyn7uiFcWsS6HYBSiexNHTpOGrCPBnetTQcY4LtfNVnQpLtNRqMYDzJQkdynxTmofzelZezg9B4uXPRj1XF11SMUCcf6rwxp7OZP3FtMg/oLL60HRX9l92qOSNA4UBepL63GuztZ3ZbB/7LsqVPauwBKdYzg1DC/8+tnkPaSKk4anC8jbGOewsz1YkNLYGNASWOi3XgiEIVfNCxrjNPbuQz5WBR8amG2p9MoL1Bk4BOSVYeMojRrIUKyhQWB/u6jY3KI2PbcIjcxhVHsJ0Hf9lqR6WQoY7vYXWBdc8dY1i0rhsGYVVWAvKPcnAYt53iisEij5g0gI98fFRKaS6r1gS2X4gj4LI/zAsfaiboVBiXN6ex9Q/QvoRL9rIZ7eX9I4WQjhBsUd8UrO/1I/IF50kfIUPIIvVb9KpcA4E+YIKKN9nej5fuzFY7eOoeXT8uIzlUaZzS3UJVcLxA0dwXZWVGFiRVwnEOwz2HqhN4RhWWAYlm1gcRy4b7eSuqF9GYYLvONUP4cBWsOJ/qdFDg0dY9TzMQbwPrQjXbFxZYAnbOmhs4JaVMKVL38Z67HvBeuAkUruqW/7/Yv4AWoZU8WVDTtDu2HG5Y0o20Kst1e2S1A+5+ABUYB2SJQPKxVNgCGay42Av9j9cJwB9nJrnpEWaVsu30lxz+duANvwZON9PbJ+HJeAXhFyQC8WUksBnDb80jhjNHdWN0BqiYfLfHl9gg9/b3jaXmDVsELwUlXjnbVsLiFknfhNmlo4UWlLibbEBszKcDwaU1iRV5aY3KUZm0kpsGALtdUzzV30y8wkm8YV6AL8vOQRXqix7esBvgWip7mz+o2fPude5y9DzKOs/HvGbnEDz6Xz8FATedgR101a5zCB/D3Y/9g6loUDlKDSwbZNFjgo+mfNabJXmnT8iEPybUc2JFOnFsxEgiU2sW9diiU4iMUYDz6lIDk7BTx+wXShaKfUCWQBm5a/h073gcR67ltHioKOhlZ+3j1XJ3InZZZmBAgXugJgvBwYTn+vcyk6w7JQLD2ctowrNYbRxFG4eQqzY7zwPlry6u1TdZi1vdBjvpeJ8KMjmzw4dtEJaBdL8JOMwT+pnGtsjpHPGHeKEERWp6MIJjOKikjmZgl9Jx4mFZD5EAtN3argXAQx8Hp96OPCNCEznN9cEzndU+SXJgwtioHnt0KKbWSC3cFeAu9LlX91JNbCaHigKmha8k4EnKvfOUsvwXX0riQlA+CtlQR226YYhlA8BbRSg55F1EedCz1SkVqZEMXbv8Ku2NaIcYNNp2Ngl1hiOtg4DPvupjw7b31pbs6v0fiCqwdN5Z97YOD0gpNPuO6UONdopl1LpNsNbe3fV5kr/PjmbCHZXCGmj5Bae01mq/P7MDP8nw55gWrgvihWoPjwEZJ5w/A44OjSVfofNAY/5IA/cx+uD6TQX25qFg/Y4H9vOOmQCJaPEJxovRw6gs45w3udMrWNtnGAvWMEiFbTzhVbs2vtbvngD+J3GYaIqnasFMAlfQePGVVrQTLVx6/TRQTfUixjFBmmgB4tB9252nNQXZxBU3DzAuSK4QCfAPJ7PXGRtGXuRSK6doPW+YlV4l9tuYQ98uIIzu1VMsJWjisKFnwH3VrpjWGVFihz584dG114VN6MxS+DCH9QsgvOeRkiAfMKQK/saWMsQDlG1HIc4YLqowW8WrI7uegDuXle7xRBR3q9YqaIDaFaaUM1Tk/dZAQYLxnnIwL/ig2keH2Rwku8c5oD/lZW7kCE+WSyfdaAMfT9BLa+7lwMdTlEU8rqMBJLj44dn/GHpoGl5v5sQiW5HVkLRhsivwC2c87qaoNFrSIFywEt1bLcS6Vhg9kxjutrGQ247GnaHE5jkeuC9s7tTQFiqhwp+sjkaB2rem5MIVOJnoViWi/SDGhhddJ5qq+zirwvtGObz4js2x2ZlcQhZKB9yMhuzhqyz1P+LGknFaCRNq+LqM2D2g+BMDwlpZpxh327nTnFsdNVLrNfpJ+aMh5OUT5RHKe/D8IrO+8yA1+H+EUA61hwZYlSGK6VdKUAG4kcOHx0OejyK/tLIA2Sdj2oSU3QgV3I/l0zHsLfwf9760FtnkSHu8p/JG3dKaR8o3gXLtLxmAD9eGj40C49O5wLSqwvkv0g6g/R9+QCk3YaUQWtdNsA7oSLk7zE51ITOoKyBTg2PO4eIwSiIeFcsMn5BO+2YZELIcZWLrczMxT9ecZgdXVp+jWyN0qpWKYYpySibrNOg2bNikaoT9YVjLFUt/H+nVQ0AtEiPUfym3IQIlLZ3NIzgdF33rg+G2J5p9QrUo3SS6IcPs5xIoSS1PtBvBRH4GYB0FiFskB4MRsvTLdVDmg8MpnH0kM+HxM5cEkydIXXzGrWNz8D6rTR81U/r3AuFtFIrA/w8EcE/9M4P1gT++aYydU8l2hDe84XFM88ipVvjfhz9MYvYA4ZgY9OVkA2AMt58k7pHOhZ2sfjgLINTgluHuZCKQa4/KUe5eNMMOrxmh48Z82b69knmiNlyfRjH2FS6NjhJh81Lq3N7lGYBjFzR0Ul4WtjH9vq/3/KfCqEqmitAHV3+gxIHxTroC6XT7zONvD6T8SuMEr81SX65ITpKF7eQ64X/uZjI63PKSPU8k6z5brOe1vK4eRrFjhKJQo/+vyvz+pCF6ugjff+1XaAIEmKrMTRZNF+j5NwHcIPJefVj3l8r5vcwgHyeAOygZp1cN4GGnQh4+Iq9f8Zbk0QDmzhEFrrGIQPitiy10y6f4FLQq7jgEKtl8R+2MC2chUP11rF3E2OheZTd01TZfDiumTGZKxRAGuU2gITaLNqLaQWoBv3t1d5hUuOQW4VZ1vx3Hg22hf3/k01Qa91/wgKS/2PsnUmSjPEBJltdY9eeUDQM+68WKYsm2f8Z4FI2M4AdRhTmL6nl/Laf5gDyUmaFnJlUfplNXXL3hDdfI4dLfodgoZZJhNo61CJ4Xgv/WgyORhEzO3MmjGN2nYQkoSt1L1EnQeH0jkrxcWf/vAXY/6c6dM6mQ5yA+Ab8HTkf4mVDNgKGbqhGEjRC2VqhEfq+p+whyfAdbruxE9PsIgpSc3o9YZgCb+srANn5XxQctqnByd50M0EjBP/TlNRHkNz/QQCpI2aZxxkfEvvTs+iqKEHxvya4ysmR/zZagHyy4QKTuV2phqwdOiA4a8j1yyvcLlbZ1HnEfdAzNOXXZM8l31o4WVUduaKA5+DmGlKAHNedOKP/osyvgB8l0bkIDj34P6gK2oC2lrdtU5gvF3g/h7rBItZD4FewHOwNUPleyw/iqR/OREtb1PLt5dn3551G38OFzFLL5wN3T9iB9f7+smLanXb6ATTpVcHDWR1Lrm2yZNhBQcQU8VjMsiQFzKiaRGWmgE5/8wCdxD7M1v41NlA47pasjmHndKy+LwsAunzqJY8iCNBnL2jvZMmdPpGoSFlymEpKifC30WidPxIhX0p3z/iiMBMyDhjvoV0PwHznny7V+ExhG+CeJVEMhFEE5qG6o1kCrMicLnZQPJz8It0w+4TSK7EKHZpRwlPuC+kcG0Ap3dEkHUvxpaUo5BqyRIcPw+EBYR8CP7yH35LD486RM9PbbQD5xzJ+vqXWIzneXlZytbTvpL3Ory4oI3yPNomKyccW4rcspEuNY4d9pjvfjktpscRoX75iJoGbPpRkSCcNnOs0MuIVWLJBG+C/KSHSmUVDLkcFRHchR57i0osLo8vMjcpgoyMC4C8hAVnKYYAIKtH00+1vs+Ben0AsKD/4Qo9bBPJ+V3WZc2aWhiZpIhhAa56N5SAmgBsJ9rXpKMYqPpNav7NeFgI6WFTR389DzB0Eqg4c8AQ77AlUDSvxCdeMxO46xH/FdmJ8fyzwh+AvFuJXJKCgf65b3mQEzifUNfn2AmHpRjluV/cNBcbhDTidz4oTYiU2pJY2fbNkvUmm741bgeai3XddafXbx4cs6RQFvi+5955+Ne4crLjvVglJ72H+lZWFeXohJI4Ga5wN8qjVYN/4eEVtqTqViv1GTfUYHIP7t329vbgQWBUjmLUJd30o85HSHxQUhnMPOT2u9cg31mqeXo4/fMgP8xWDYreLKLr2ltC/ACg51JsUGh+4RyLYsjk4kKIlKnZxu8nVAFVIMDFeFB0+wwHu5SLQ0wn4PyXlsR2fQf+35+XMP4wDOP9MI+S+whbx7FloHNZag+TOAVHmypDqFenepmDHg1lXpMS1tK0U56lsytNB8ePK7ey1jF8lXsisCxlpG5QNxa+EgbejvfhSUml0PY7kCtSt8Hc8FklNuA0QIhySG8Nj7dc/T4IS+RSDPEkb3izv/70QrFLBZz2jiY4lc+tjLPFPkUvXgZdthhlxl0eMQv79RPou+gY+azUA/UjdEUnOV+UOcMMCULeD725YHcJS7qZFSPHcLfDOhx000J9z0Cat0fKfk2CyPexB2zOeRLRxF82di8LMuFiM/v/OwJvexwz2547IO5I98PlC7HeO3jhbzDhwogJaQsA82fj8wArQltBan4NfDsBrQ2rwBiJGGDLsB+xFvK8nDdDfQ7SQevTu4OFtjrYhTZi3bw48aMdi/00h3/lzrbfveghmufbO4lGyDLtKMxlZSab5Xuj/2+ACfFnhcxDY7dtPZh12BveY+EDnZAfr89BX+JrNC3mk9aECu4MAFHiFIRgmQT8XxytBxFiSTzigwZJSvLAMR97O2aUfApNpMA3J/Y16PtOxXwxlwcbfnxdYH9eOFN/570wA+ak4gH9aywYRo6HGKmi5mEtIHacgYEjVCXNNr3jvkNmG7GYEhU2DxvohNDtI/oSBUYk3O1CQn8HeQjOHXWHbc4i4K1gSrSdAbka7rwRKeqfy9iyrJs6uZyHQk54Sz03c/bk7rDXfk4qD/0gzI3eS39T+tgi2Uc60ueCR/oYkP0TaPh1zgD6JpBM8gO5zZul+AH3mCo4fxjowhLNueR9WgtSNI2gHztLAI+OnZ2UFBouVOQ61EJr42eAp/HuOwrp4deK+jq4UsR9QXpof+OASQt8MI98eDLzXT7ebw/khi2plgiTtJJN70CpUlUb3gdSvyGCA1g14xWFTRCjtgf3S65eMz4jd+x7sNtI/jGCH0ni6RrAtKgNPw6+/mcW2ggei6bCLi0HKV5PD1lpO0c96SIKscgvKamnX/kmK+xPtb2s2YLyVfkVepgZrUwYeYLedMh2fYQ7wH/Y5SZwigTmUt+F40N84rlsGgv+Hel1XikLoFdiQ0u9w9pDR0PkAu1IL2bNzuTEcVZUOopE4tB1CD4ejDgrskHxAWAp40jflAaXtz9QYe5sXkJPp8iF/Qjn5dIVtUNDeK66T0U24/uRpE6zV86rEWzRbH5CqMB66HBfmdds2MDhRW0RSLXTgSTrB8c3OwMZeyfsuhTlDUeJqu5W+eT1OyJc1jrkoeKZLDaQ/TO7/qxQCzz2KGYFCjgXejxAcs73D0/D2YdscR2QUh3H+eIaC820RaCBhQr6wsr9CTDuwJUvQhd7wDvCa1QDX0dZo60AyO7o21+tHMTSr0vZzkODnHnJwHjUj+pagq3+qAsp30Dh6/Mr5QeZ3TRfivWQKBvNLbwLcoWqnXhEZcQBugJjYLlBb4F4J9UFgRpDJ4dLkEUqzN0rnuWUUoI07qBZQW7l+7u743vCJYyx8Mhs6OmHomIuUOw98hGVr/Ing+Iv7f1jTFW0pZSiQPEAmvX6bCuiusPTYeowADiOR3G8mALznQKZrgSMAGk8Zgr3MCOZLYROUOLSZgeysGJybUCmcwWvTK2EQ+aYJLru+omn2QNeXDAWjEUlsDsdrc9Z3WQL2t4V6fYEsRpQsZZRHmhQ+Bd30Jo09NXeTSuIfmU3ddsdjofGn1DUyfPEAlEUhcRvlBhwy7EeF3Rwr/RNf1SYjkFbobXRawZhrMnMAFnyH4gZgf/093VH4U/+cWoYE7XaUL931t/2ZTe5BVs84OyeuNBf4McgGEuUUVd0BRrMIW5h0ReI2cyTPxb3Tf7IuIALnpoDbuPHeH99MEvmrxg2ikenwhxOVvlkDHIe8wPXAPKUaZt7gErQWyS6M9319yfn27AzM7/82zvj7jNF55WKCgL8U24VOqARkh7Ki/C+bbnvhmCfsStOwOxBspu9h0HGYbQW9za6hrXCKKSpQLWQTYi1hL3yPJReZJSoshn9TLxdrhE9QbB0GwZDUD9bzkxfmr3PnvymrBLD7n56jgQD5G7073WC0G9JlxRBeouxkwTogGyEcMqCYMAF1p4nrBvra47PTRRieGZzxjPp/OAex6craV7F/OLDsyEA4gN2NdQKCE8F+a6d8kLX/LLL3GyPC9muIf39eoFL1l/snILQwA6Colsl3JgWLuG4ys18leBbcW8rHTciz9gyqZM18sLQ5V0wlr0wC8B2yw2F4qFRxwu/KP8RTQvgvXvvO0Cahn7ounrWDFeo4IrgUv/WwlOevsv9f2MBqC+e2/NqFfrpJyN9pbY5vCHARAz/KHfgBp5a+pzLtjzAvC69jAQzomXqRQ+b5DxUMrGXqUFKPBdvtPVIIX2YAHoqZWYwAaqzF3GG4yODbr4sCxzG52D/+rXYC0lPflg5ab6n2liwRMcgMxHcxKKv5rzfQTgoXhY4oh3Ys8QuHM/3Gfbt8eo80P+o7MCwW/M0lFPoFcOMvih2ZIIOxBMBtpqX6kfM+lLEd13miqfM+8VuuvMtHdhjjwI/9ePRCqsdAW3/bvzrhaCmGnMlYFzuQ/VHGBhW9BMyB65lG8A99dkIsHkBGffRNIgS5HSXl5Dlu5GJQRIFooM/R9AAsShzZYScWDFdU+f6Q01lIPYscM0tWQSnYl+xF4D1Lt8dvNIP7kXoA+dbED67yi0u5NEFOM48pEwbgbjfabivnVhyvAX7wn3Wp/xNS+mz5ARn1PYoSfM64fYV2OMVqIoM/wO5CvPotJHHGjBCzRF+B7OVJeiTF3KFiY/qOF/4+K7S/Op//hWbHfaGyCqhfhT3Eh67tAvCMSgHRIO5ntQMQu7ANGN/yKq/amb5OA7w/FFTgqYD0lP+OJXDQO20WtuKfiwP2XoUdQM8WjXl9Go/ImUIF3JVgOXzBRs67ksHxWS3fzwxuUSI3EgcAZQHD3GsrAPAdKf6B+M6vI9gH6CGUUoc/ewy5H72ws716EPDL5gsXCHAPK6gSj9UU0jA9Hklsg+N7Z+AIOoVPSMGDYn8WmHsWmbdJ7nNdPZn7C/3/Q81JeZD9XfM3I96GIomodmJ3oi4yI7/2ygoU1XlxXEB5htokoNYsxFZTcJ92KL0b4rFYIutmLLVXMlBHFsAjnC9CeExI770pwDECetvQC7s7TJiMeDKRq51v8cbE3Zef160nez6Mmf//7J2JkuzIjmNxoPn/T56YNWHHaN398i619RPLKjIk1xKRN0UnAZD+rwhkSNx5UJByoEAK0AYaBaVRU+FM6AP1MaFtXL46iXvaVhFxSthi52WSerSUDDzPKhLkT8t0n/AsW7H6UsiUIH3NaDxuZ4o5XtzQeTj9s4Vb9Gms6HFrPIFGdAofir+OdfwFGtwrgIrtzWv/7YxgC4E9Lokjh1XkOCv3C4zWu8mo1ARm7h6etqE8PoE+paWX/Npl/ZOvXluUq4Oeps2ndd2uVODI9vd5MOVoFAHiX8jtrk7TQpg7gJJFt2JRWiAhbSytI4QZLUBSDKqFEpvdPX/VkpB8p2QM7vcji+4FRlcYEK12+J9RR58W+wf7V/B+udgO+WEhOiroNVXgNOJ51l1513R7ZxeG1Z2HfKSJ68KKEHq/0agNKX+eTRus2Bn/svzknsbZYCHQkf8LEwq8zv/fwFw2dsU6ThYSvcjlIKQfAhpxn1FTwjszM4yzG69BaDqBIfJ8pMn3ArvmhG+5wNdbFGxfvIWPr/DZ6I4EtmfUgUJ+rSyZtZVAgb4yGL0OTxrdrNse+/y1awLzc+QTuJp0LwfoAXBb54v7z+NZFmlyd75RZV+Xyr29/QXgGAva6Z5WoP0fj49Ye0+piSi+V0f02lYsZlv/0lyqW3W9avDs0ogiShg7+pYsBAttLcjFKRh52d5/KwP2uhlgxl3uV6AMJHwIHybHDDQJn+v9L1fgmeWqg0bjsjY7qMuyJZFu8xAZ8+l7b1B9JcVG/Icq3bUa4+qy7deZc9//Gq9hLz54Ew3TGaEhfcA1yPuVFb1ofsz4hfnnA67mtoYMwOtc2x+F2V1wfHvKXZgwpQZX6PAkx8Za4uRW1EKzkDiCaTat+JZfLSZ8McrjbHa3LV/YPYOd/AF22KAii6Oe3dMH48YPBLCcCiBj2oemJWnblJOBttCEvPbvZJj/CQDmjrqEECjCSCA1miImb9sjnabhZiM42ffZNaSKINcHA6ZiCyWulkMwpAS731NaCF4gyYQa/vBgPKsWR1etcAVygSm02I0FIu8HTcguk5Cvvbc4Wwu+EZns800v3XzffLnvI1Da77pwoBkZnL2Gwln4aHsaAL+B3h6iJFUTif22jGGyjqIPh3KeHLIPfVRNjHEbSnkARsgChT4PbsmA56EvM8YYrFMypsUegYwU5gGQigcOr9AS0buoiUZozzRaEkIG9rxU72sA11+53XedUzp2mM9TC8fbQGSudXuN3e+R+WrSLjqMbtQxVh+t8EGFHCiqex4Rgku8n5N9A2CNeWpxNLoiNPMM4iirF6Hah6ms26DRPckpQ9Gqfq7QwK29hF9eKezz5LvGr0JAUIhcs922Z8tB3A08fYDOwEufeB2wPp1XH21kmad3M/DmMdwvWmAD8vx7s8qudYUTfKQW0T5jh/C1tO9TnudhcFavsVdvnx24Rzbgzs7Z1u3hoGkwpVHox4v6vMZZUFj1tjPRfhfZIWjtXUIIG2d1X6fy2MJ/7U/Ukj9YUfPJsQ83/IXPiq8+kbjyHPj5ENyn7YMKhw33bPR/jkeIMaJd0+QBSfj/mqIP7HaqHEvMMqwc2BLQsQlb/Ti/ZP12JfDnlygIUpJsIiMGG0KQFYAPFOL2syFCZhYsh7vQVdGETkhRrwR6M00OlUB5UA1VJ7o0dZuva3JY6RQ3qdilMeRkZasPMFR0hK9fAxf4Mh0OB0ayldIb3zUFbvD/2mswaadUKkDphV9R/uqSzq0/7SA/p295KVLrVNJkrAGCGr3htsuFfo3Q0iKwCQQLaZUkK6Zj5MoSwu7AHZDl8ZMFAtFzvvrWlqQaTNijaAq97o28Lh0NSbNDtYTzT2uB+H476N+gCMJ4Ym8c6tzLNa9gd8u0MDw80D7rfmN7zntc1mUhkOL354Eu+l+vhZo6ds7QZ4p+X/r0E90PsdFMSERHCENXLaAVDqAbo17Dhcdte3rxK0f99TNGk1BaZMvqk9hee41LzI7RZVp5E8enqxBwOjtzBUYf94ZThqEKBO09tnA4CQT1T9NSL6qjggXwpxSMK8m3xmeX3XWy4+550v8kbPijd24xlBks7v+w1j9nBTEVpn0rFOcbGcDv7ACh7MfDTUjgA/mQzV9lpplw80U2I5654xJUYMB8u6gOaUo58TXPaq2u9NfMVPt1nJuQUq4+STc2lP/wXKjzoeYgYEfgI58HaJsi+DXFkE5Eb7SmwxNgkUXSlgzRdRPHme2116QLC7NA00LbhOLgF0ocRteoo+tcvPyEuVQtUt2HYqTYPMSz5waA3hYpa9iC83pDAH2i2EmJtC9TSiHbBmUtjBDed0zDicyyT6mdhPELSVaIEyplTMldiWHHAfA91pZfJIF/To6qhCVhm644DCRtjU4HSlNAC07FTLzp9UNxlrj4pPoPur0EnstyOQU5HRJqrWV6ChPgZqXbZKNc+uzRsbjURvNRvl43g6U0Eit4KqSq6mkx0pWwm6d8w/u/9hqBQOfnQhPr9IQt9jb4MugJLkXBqX+42T+4gksiuKcU467xkwk6RZDoMmiWW7ul/BTnFB493IBkH232jROehjml/aAT0pXmsMJQiDUsaQO0inezGSCJirZR3JZewib8kKPuN9B/8mvGBfkDTCccmkAZ/VNR3XB7z19T3VjGapY2AClmTwW8i9F3OfBShKdFO9R7FFKAHeAQRluwTVjZLz74dl1+yoT/yPTotDT0SbnKoTBLoZYNKDILxeFDXnvtX5rjfwlerGpUcCUcfCa9Mo0E0Usl5CEn63EAtx+HH9uIgrtTqmuAeWerrjlK2csuIh0rDw9l6pIRjBV7wGgAdoAfvyDzviwMlhzynBtilCRs/WXb54ekQfWZO/o31pvdXoD7AvY/DSmQBmqvj52Vzeh1CIEUWiSDV/R76wta4ngjzlIpBExJxDF+aU+ntcfRvx34UPuC1oABylEp69l5zrzVHRqcGxjS38dxwrIhIv1oww+C/q+9Roy8ltSb/5E02yJ/V59bMHEAGbbRmsIqi/zt2hF8S4HC83TThK/xUKAp1tEdLTV+8lBK3pheE1J8561qAw0f63lzmnEQwzx6s52BxDA6CuU/3/DhJHnyhxopTaBZYNyEtpAeEtPAjjA85jVl24V4WKDdlg7UG40hTed234W8JAs1F6xzHjouueMLdCvw3Vv8nj5f3Ha1c0eeshLvbGgfauSnkD0Nsm03/fn2Dq+9xhYKsNbTfCVulHmrR/GuEO6a8daB7lhUZesfbqPA9XYSdGrHxkfoJqwf/475/P8fO2QdIbZio+hcX3b/b1S3IyalE+/bkfto8DVOcr8x2W0Yg/0t002bP8qwwpWghaNLjEMEzprVLQSaLugIsrk/oFkw7Pn4si0GeCyQsXreP6TvNL3axlGCAxKr1B6hTYMad5GHYsXOhSxNBYN2mykIOYsz6tj8Rymm+zaS1177WYNkLCU26iRUexW+uFx2I1ZcpBs332oISKX00I1bRbrzhu/CkVvHT5mpt1tqY3bSYKwb3mmYxs4H2HkbEmsSDHeQpiVACfEi/paAaqe85Pd1Oj9BApMfNOCWrwF8AhDSyGctHSNkr5RrLUD01+J8tD7Dv20QJsQt0gX/KdgzN4Vt8wAWK1iJ7z/w8oCRyZ1T9w508wf/BU9PXUFMgIcx9gog1ldWt/r8DcjPa69N0TFK9Fgpabl4kCtlA6SxXs9gvmO4qOzHz0nK6ajrxqKGdEURb2jbLhr2Bc0Amz2wrIPskMvtAsEhJ5HUYzshlyJISjB/CiGoF0egdFtJEn5Yp9Pf6vHPLeFDQmDrvBFBXKSxDoiQQNWIpITbkoS0ifZgepWmtGaB0j7QpkHxtt/ff/EqRHl46h2PU4I46LBGTV3aTvNl3RerUo3ht/P+hRJ2QxJ2KwOOxWYjhBf2f+2PKBYepnhMUjxPCtbpgWXTjZ5oiYP2FDzu37Vnccva9dGTpQCdx6wZbQO7FicNmTWbFu5scZ/fjU1rR7TDahMgJDTJbigbMaKhjr5zWoBa7SVLFX5wnYB+Q9+JN7+/ACQkjvuDOsMSCxFLwyw0oPlUXSyRllFpU8RMUTtEYgGyQ3wH/9jhW/4p5xrnrjrWOgSqy1wqqFKZWhIdTrcqVmfIAwFOIKOCS8lgQ+98KclG+c3lfq+9xvwZM1uBeJh68C5RdIN/MIPclIa2fjR32i3eiTDeMW9zBDELyCOXYQSYBvADTi+BWy5CVB7qEZLE/oiki+ewJTROBSDuDwSZXsaKyULSEH5MuN9vHf2N/d7pFX8+BqmgGSK9/hgxG9AENJ1hmCyeJz1UO8kplXH/BVP6IXPATa0fA6NER0VGe5CfHa5p4Ljz7VjDfijleXjYei9UoE4byhps+UvbStKN6Ou7QoRdlbz22u82oA0JM1uiZ8xO25gQOS0CJotmuHmZEh87e7n+jegONLobTDMivPSI+6TzbGqHT1p4lFe4lwplrnnP8fxGYyCMBpqUaxDUMsk3JzmLK0gLFGDO9humCt0/hAYgMMhZi0RvWpMqJYlj+aYU29Dt5EzAPf+Eyg4ZTuY/Mkom6z8ltLcdELh9iHs9A3u7GyPvP8DGSn0kPs7+fNMbzGjmUmDTBFxogLEhwrXsd0r+QHvtNehoPmZhqbvxDrnqG9BZuklH8vFw23SKbzVghF8KnXj/8mFSXU9hCGYNTCj4WQ8gwMpwQYqXNSNOyXPVeKk9vKyQltAsKQgWeIRZQj4R3BL4fgFvjfN885zvmfCo8UQNYEgIiFmNzRfhWhqg8ZiaU8kaK2ysPB6kuD0qCPHMg2eAiXgCjbvyOzNcUcuD01Zfz/qjB5dsFZm2nHRuIomqL/2bs8XLupA/2F57DXs5P5WZbI2cPsBpe8oc2ZXsrm/pv+vG1jYay/wu5XyLxgD9zO5y9HhsKJ6cNjW12cHdiCsuTU9WDisNVDRnmaUgmVWIPd8o+OBOL26eKuNu/gG9gK7ts0ADfAiwT/yhE4beaYBjsqUULnxQYO0I2wQ+g9RhAbNOM79sZaXCfTGu60edHn4HSPGf0d7BqXUI4Raa9Go4S++77D6FOf50Y2okUnij/9f+dDho7evN/M0fJ/r7bTIhX1OchOPHzvMA1mLv0MYhW+eY18FXEwGaGx4aZyPrI/P0Ueio8cIz5hlWud9IiWhrrAU9CUE3GmYukaWpm+nAWiiQyG82vgrXsV9alx+XgX6fAbb6PEkBkRUlAfYmgbbWOM1kJS0ywYoOOCikrpiVJPgWjuNW+sF1vLi1W+soIp7sAzxcBSeEAmosgrMRV6w35Vms1Mdgllq/HeYJN4lz4oM8P/nT7LXXCFD5t0Hw1kdGz2oSljN3IAAcVw91QvE4uLaMqIU9RdUhYu8OliTd91QZeLJQ8GapqoUswvkbohsYITIhniK1+ywE4s2Qkhxij+wiXpD5e+1d1KyzP4j18y8ZYILFSHy9deoCWCUEIRfsIcgucVDLCOJ4uGqCFl2mfi3lP3Tud630ep2V05hk/ppbFI8W6cUXiGVBYsNiStmsczCxvctrSUdy6+yyjhr50+2110w/4YebgLMEP5PZEx1hnFCopwErRuNSTkO+FdgkN+6YUWPVkbh9oxGlNOJ5geZwdXG+Mpu7n5OJ79YUG2XMQRByXpDoamD0gnnY9icJEL6zbmO/sd7vN/bL9AEjCMtM8CEzumO2B3YBW0Nj7AdToCaBra60v3XMcBM7ccLqq9yYGnJj/UIB1Brq9q9aWLPzwZjP7iJMKfpQngeazOkbcWKtoslKCENee+2vMUKkaCyEAAcKiVLldOhmcx7bACDn39rTujC3eyKluQaeum7Y6lOzfjgNOGXKpSfbcL8tx3Xxh5HtRsP0vdvW0LhsoFdqW/gMTmNCoM9nN7B7tn2uDPTbck++QwgbfpBsqSQOx9mRDQRZPF5mhvG8P4TiQD5NIRjrF9/uKP32BO1zpMc7FK825NJ06/vZUGtI8ZR5lZmb6Zb4GEim/QF/e+Km4SRVk40Cee21v9LUq4wmNKXU0AaeCoTFRqIdV3mmbez5e7hiF4il2SZq1dm40daZQ3RhmVeqt+uvDmCgEMMempVsdl5fJ9BmX/xaAnFTULDe06L6keshlK9+S99l//pTTf/v1b15MH/YRrYvTg5nCZLWEnJXzA8xQGM0yKR9405/Th23Gp2su63wvdsu9iHaRatTInrJAbyaHQI7684AFBMCuN308oJd9+hgU0rjqRfyt7LXXlVQLHqBQLotM3g2CmGx+JHj35Vdc7t8tZCGS/iVUIInDJr2ggTolG1XLyr/VT+IgJAIkXP76ppw5OhnWTJEYgJYbjLsWSdp+HwIfDJnCQF+1wTAf8AhyLapxd1IjE6rA+WZD4YTtSRJCoG0UJ0cc0u3uDANwz9GiBtaP7UhSGiAy4yddiJ8/kFATwQ8Uk378GzHdfaFWnzkC8QUw44Mx9o9OUS/OR2av4e99hoxjg3J4YIN74RsLQ9TAu55zK2/jPEBjNmcsk0DpY7gUiAtT3fS0RcZ3mH3i1GeoOzAqwaXDWqCGZ6/Uaj8fOmW3EkzTsC1sqoHW3ZBnAFwZKH86ATAD8v/HewrC+EjFtj+fFtphIYkNDTTAIRlbSkyVfSlkCWaBu5rz8vom2h9LWPzOU0jeKzIWR/r48uBx1jg1XIuIPBunayRuIqmxClulu8hU3nd38dee00P+cdPfkMs6QtukyC+wMANQ1/Y0CNhHXdVx17IZRf3CmUWflitrYvtRE81DRjzlQLK37OUGs6BJge/kFg9lnU6cswcvQnio7HRgs18COHz8xmAT/3OwvNDH9TuM5b621+Jtg7szPUsKMGg2WTGvlSTyGk+JYXc5mtkzlxqsGcSLgN1buPRCt6LhA2lKeFx4a/d/QIKmgmgIaGW+RAIlv83ocyY9x/yR7viD9nb4vnvaa/hKCV0fjKGToWkhjZXriGuLVBrvmmH4nqZMdKOBObppedcIqZ8PJLc1RFkH3ZqgBvgyQv4ojqlpJ5pyMgCO/2SEjIUYLF18aSJyU0XXWzCNSCcz/cnAL4BAeVekZBPyEqXEwP+WvJfPEdSyP1ac48RV17AnADgVYDdUjOmiPyzNDTuLUFpSx4ME/rTILI4SN1ppT+5kFS7oxraXYCUCOrxn26MUvH1I8RtsG+T7QAlf1977TUtV0QS2qUFJERIOhJLn6RZj0Hda7R0MAGBWOF3MV+vtOcUpE8K5ajBn0LNPFg/bgSf1B91X2m4lnxT6G2AUIP8J7MnVlRmrvEz79oEyEAf4nfHxOP2e7H/57v5XgiBDx8KhIZ9sorhlgbG+aGwDI4zLtMInJayqL04KS0lZf4d6r+ES8k6e/wyDYjKnnT3Vg2YUBCef0kkU1rxzMRRCYS5/imnjfRA2iShNH9ne+01oI5iSxJj//J7C/cD0fMja4TbGifxo5vboCEx+QapddkxIgXeir0ODeWRbkhLfmQY8de72fx/BwOR0rn+EGNhjD+1WVr/MeKezxxrwC6ZkMSGedzmF21az137Q9I0YS2K+NirJ1kUbmFjqEoFxA7Ms0MJnhi7t5h8ATYJmC5QZ9n6FJ4oDRX20woQKg3h8VTuzlP0dpngLB9xxKHG89om6xroyoJA0guliW0hf3N77TXcxfJ2rLKKJ72LqiDN/TrlmjWgcLo1p16dySu139YuxfCvcQOBxtZxd7dLKLdvL0VPtxGOQN29p5AEl5gZXLIKPBtBItvP10jazBnsSDt82Sey/koHiM0kJMaxwmfbIfApqKm1JypWIlDP+LIEm4W/6U7ZwYNOGrSGuk81hKj1xGoyycSvJ5cK+an0xdCjDNaupownshXA3YuSxQPBiFiWJ9yGz/lH2Guv4XTatGjs40j2BN0Wc01DiTlZsLwup1uuH/5V79OqrRbNsGOvE192doIpaeJKzRC66wZomIc/fbDP49zCVcrORpUnFSkcAxbhy41rWa0LERN+QQb6DSzoQwinKtnwWI7rtwCzTVOa6jcwi4EY1GFO/jOnaQhNo46xLpvyed0/wVXmd7eRWEeOf7dl+6I4RMh+O9xz99Vf0rU28c2iNtpNQl7f/8+114ZPlAbzeqZPVeOenmGyw6CJO8JEKzu5HSnboYw8ztlJb+stfTD1Ir1yVAwzWL8aF4CWjQBiwYNR7h4NYCAktCFpYuBsfm2Xmvc9OVdCZHi7iY1fav+ZEMFSWrE4Q3O2w7XCQVlAii0NCWp+31sStbNa7IO77duMzeebSpZrb5dk2O0rUxmNI1RHLI9M3WPbSLmWtvgqVzXRtE2BS5a/3X7+cfYaZIg/VQsrdwvw4oaqpDq08KK+WeVWQ5WgE/0kEPd6Ad+jxYIhExU5upLtEFAj5aHIztvpfp68QYxoALttWntQAOdSfIYU4N1zrK4F4D8u22pyBn7YYB+yiHTYWzenXF1DsEkLSpdImI+d7Zq1CMZ5ITEXQAqhWzBRCGN3lpVgFwN8sE08pKYiGlHGea0QVkCiOU0rJdwTTy1dGXD2T7TXXoP4yQWC8gEM+9Oz4l3OkvItNntwCM0aAR2pxtII2DtbtVyjKgbgIE7qUKpMZDvpBE6KI3dioIZ75JvuyimA33TLeZk1Jfa4SbJ6gNPHc+/728C9AmoHqv+TuLWpOSDk6X1OenD97Oem5mDlPW6Mz74zBhGT9v5712sDhZsKtBMmb0ALIN3lgDF7JUzqBik5wlcdk55sILQdwDfLP9Ree+1WujREWa3HtuUU2LtPCGbkVixexcqWpq1OaKftAVqXGByBepAAXHOFMgvNBuarp0WyZdtzFLkTg7yiG4LuUIHsO+lDa9g8RCZrfoORTz75JMEBa/ZenKZVK2yUhoYU/hd7Z5Tc2K3E0NPY/577fZk8UL3U2PPpYVclsWTZuqObAUkAjb6RDmoBQDfFbjIvI/FoXDt0OI96BsBnTAN4aWhPUMQsKUha2lRMU94XogOgr42OB6fPlX11OBuKX4H+r17dM62gK/QJuiQ/KacSa20TQvkLPWK3Y+Tb4nEz6WJEMGvsHymgCXG2qGcf5j/XMIZ0IvEnK0L98WGwcSYA0ygbJzGEPeyPTJrfXwCG71XxU8ouFfJb+D3pFRPbpBjiB8zHSLTAdLCndwo9ag0ZwlRhyH1rLQq6kQ6PUAyHpRrM8WgoNHfyGDcBCunAM6RPBrHPyzkjjlHRmJs33/HV7yhBFwRraUw0NUTnd3tKclcLpiP3Bzn05Ag82T/xUBZvCBW7olKkjOwr4iDU3PWZYBEhEW5aQg4Q2t/vmAf3jClND9FKclHtiMsfZnbk0/9DFtDwlzVhQO++MMPKgDSY0eqzAZpiCJDUau0NNL5t3d7LyQS8E1YIJdJngjfWyIdzFmPSCB3OKYIS9QOjS/dgF464w2QI1/Zr6ss/KPV5uLuGoJk5R/d59eoX1HS+pTLvmYRRnd05pn/OZFVyWJxAfIw2woP7ADxYKdwBxW7m8dFf7tDKj0FTANAPur1TmmVtRx0VKuQxSlzA2xl2rm2eQlVAq8gH0tDCoSv/Efq/3zgQnGzP1eVqlRbDVY2sYM6/Ge/UvNDWZENKD5/72UUts3NuytVbM1aKwyQSYnsLHvExxMYxPS39yIx/bfNzuavhv+kdx2WcJzXgV+IQr+3r99QrE9qKEjuhlybFMzCY7hF9Azm75XuuR1jYkZAgykWW6zt5NoIFcxjuXzvqQf+FFqQwmkzC2RXq73T/ViOBd4Lchjcg+lioi6QjIDBvbBZIFar2J/b/tdMUdp1y2n7QDoDO1+bYaoYtox0hZ7toke/5ZNY0f5ph4sUog9R6GY3QCBiv36Jw8POktISgS5JfzatFcrjLbmGGM0c0HYHxaQGARwD9wnpVZmq8k9WYC4kA7RsMVyZgiFE4+fRmWHC9c8LF+6q4fcJkdDrATnJO+2bsJOzChlVBF22E6eunBycCWubmTApgR8uneZYFZtlRCBuzP4mD/k5pnc3x7y7zVV6c4nkA4B23F2t8kzNjNZ0IZVEOkLbjytisFCbdwh7JeMqDY2zaOW9C5pZfEuDmQ1Xl+I5ta75DsTO5un6s/YfB3uHhd9WrV8UHEJydEEO9o4MzSBEMQ+3DxdlKS1SLkLPfGXV/SUXoUAZjtww/xNMNaAaBz/6wPmaUqM0MIXCt4spJIheJut8r4oSmUzctGOwN54b5+zho170Y89ItYIId7LTls/f4Qd8IXvlsio+N/m4y6yyIDORsEDzQE7oLt9urLPeco5fiaqObehoLvp6PepxVxP/vtmpuDwQ+dN7LwLf91avfVkOLnx4nIvAwLcsJXwkoFFTcQbRBo8/0Uf9BxkOkbo4knv84ibKa7Tp3eoxx3xqtDHzxVlktEF8wT2TyPxogBJybPwfLxVAJYEwV1/lgYYaq8Nc1y+wsmP7fIn4G30wQpNPs0KAtspVj25t8F8HhPbloGjN7xvd+NOgIkUMOCYqd8adAD8qMlPuU36eJPSwqmS5qIVz/oHX+1ye+vXorQMzjmtVxZNCkj/ugFCEn5Nyiknfvv83DJBPvIf0SMn5/ZjrVvYApijX1hMGQYTQvjGBr3zmnZMVUwZDc7Z/7mAk6YTivGO4DDpaYeOnKXwXAeWUJnItc3PwrGYYMeDHUSKD4pQBMlR/qFokkacOubuAN/YQwSepdj+2HxL2/inEKc3JCo/1DoqUmEBP7fV5M0gEPASVGSTYChnM5zC1evfrFNRix5pCfaRgg3hMpvKFfqMrcwroeSm00cHCMgOfv/H0NsSBLZUAmA3pLEFtk1l+rA+g5M/ntjGEIjoQvsMSzd4FWVFkdFACYRRWYP+H+QpfmTuq0sTLnnA4Bz7HXTWuo9+SXRtC2fTGRm6kDptFBocen9G0yzzMTwkxCS79eWREYR+HlZ/Gxv1c+Yd9b6xVgpt9mA84r4TwB/H72/9WrQcjO2UAiv4b6xuSb5LhDVHyifn/L3WKEYSYkB+ajQZSaQqKNpsmfFg5J7htoQ2+1G9xYTHPCU2FvYA6kFzjTx0EJq7BHOGaG+DMtzA/sN+YAD11Wnz3ZB3EXOgnsUENtCEjIPoAqRUiHBXM2UvhvLo9MvRlZ8oO8w+Z37h3KZHI9xgMyJssEjGUdbztMELVJwSGj9p2FSwzZ9jMx/SkbLf9GvXqe0OX6yYMQ9CIdFJfLJEGPDfja8aWey/jrHgnpEdvdwOWdaRt2WuvtuMbe3DZfo7eTcZXOfO5NvcPWONvFlZay5c5nDObL7Brbg6q7AVyL6+KSQ+ecOzHYEEqYXgy0mEm70L21/nNfxNSJTLwLmgTQ4JtMwqX5w0kS/BCOlNKUGTcnG/kvTt9lHy1cqr67bgIIEx8GAOL4on/M9/PqlfGkm71Ebxtvqd209NUqxklf2oFFvg2MArmrBpr3god/H74n2lIbUJwfP+a6e1bBDf1FcZVmhcwGYdLA+RAKhDa8Im24zZdeAFyGe98Sl6fQ71XrQdGV/u9QXQrCwg6yvjN7GcYkYDuwAokbfb3gd/BEkysWZ8LEXFEtOYR8vQyTceEag7gTfpiEugxH/UnlLo5PKr/Zq0xvQfg36tWrOQXiE4TiVhcLtAdiEgWfvDmbR8u+ziNtBGjK3uogmuIntVDopI0falfThQ7nVMB63xwJpu0eYtAsxF3bK/G/ogSIig/m6xufkJJvzH9fqpaBAZFUsIqta/156N5krQLShS/b3ZZZdLuF0NgxKouVFlftpX34M7Im4z5tcqT309ydaJEIZ5Q8o/nzTovAlzlD0KWkVpRTqYXa+a68evVPlTaSxehAB7lzntXZ+hQRfZRDBcNhjXH0WyKg9oiuKHnIaGIZudIf/PWnHKEfkNNQlFAaD/taGs0yIwDPlH4Sj1tcGYSChGMvAPOjkQCzHgBzphGvOKRZH0/c8CtLuwN11O56VXT+U8VBcaDYue+7pX13dASTqQv5xNJj4CFfzIxOZkm+yB/3sYF5PPE/TLUc9C5HPM9Rs+acgHn16p8rDYPxCbizw+CLLHaZKnc+s0mfRuTmm4txVs+oyCNrB6QT7Zkmk271DGS93lMHoduIbKgxOg4w2twuFKTqFQzAsHvod6+wXgAWl0tLhp8LvqLOLWg3OyJhoG9nEyLmwzkIjREZnNwH3FlZeKK0k4KM334fnMUad/zCOKONgUkn/YDmPrQTNADDaUiL9HeHZOgrpiXyJ/6++ndrnBtW1j6Ui+M8acqNTQ6rbhnSPpo055Oj9QUPdPSLvHfUri4Mt1NUvLbg65I7TRT3gUJ7xAPS8WuJ8VWxym4H27svR/QGoLgl94n9mQLSv/2ShXXcz4gVQignQ8sl9Undwmg6gJUdPYXPe1xUr2A5qIzQXnWHiW+/DWf6CNND3sh9FJ3RVIcGDJCbLARaj8RCaa08GxlIr/nh1at/tGYYwIloJJ6bx5yhUBjPGa53I54OKUBPyNcioSxnQUYmQ6BN6Da38IW7Ie3n1/SZpLNfsHLh9F9z49Y1etQ7Ri1F6PlxBmZ2ZgbWZvzx2uqJYD9MgBhg/atWsK+164J+B16vBznaMBQosV7m2+iDOScDlNVjjUWxUk5bO3Pbe7qEiT/LFDcgEPP5hv3+mji2FPwygNEz/r/IbL/OCMurV/9qSRFUJDowTLEZDg7wOQBmMrFKeYl2tNEnFuRATn/GPaIaFkw5fRzgrPXIbAK5lL/Axlhu97+4nemJsJhiwmH/K9CD1rdhZs3muPJjgUZvzQJh1mKw+Dr9kPKe73Z/792TwVU3qxWEwaSQYz3OxvsUySR3RgPuNzjSDvoi7unLnO9oAH0HQ6kyuasGvdCcIRQwQ9NM26nYBIA8/+erf70yYYKwAMOhYrJECzs82oyPBNXUNrindXlPbrpY21MCxnB38uTkhZn4RmnFBBo9oiRqfytUoDXsIPhjIMosQ8S5aPldhsGAagyfn6aBLiyDfikca9GabpHguXO/vXfrz7R/vqUTP4ZrxkevgXPsSVtrJPAqEfqw+rl3zBRgtNlvzk+vdQOIXqbQkpa7kZrlsWZX1aAisJm3++fVK6lhAObiI/VPKMDcUpZQkTOEJPU6zxIbrmhIHddJcO9+knSfAUNwUiQzYRIl4YvNMdVdT0i8FNjp7S87voN97vM5D+DuO+dC+rBXmf1pGqjEBBxKylLAb+4q936QUvhJnYYGPRSu5uQoAEyv7lMqq4QUh4W6Tc8HKjF0tHkHjQ9j8mkUFgn4UaBIH/1QR4Eq/CRfNzQ3TfVt/3n16u7JhfPTh2YzNph5NYxKH/BxXmsFHqseOBvCkLSbx/4XewuTEK60R8QfccLD9N4How0TuRt6v+3imZhMm2/OZto2w6bmBdizM8v8TRroAuP3WRArV/iWFn/RPSx+KpUQd4kfDPvSs+93nP7mU2Dk94x+1KwMjoPIoRqZE/dHTDkWERc9Gd8vjlc0ngJxmCjqBIaJqeGkqfLq1as7VdabZ/SVIfDyy8ZTp65kkuKTj3nHqXIIhDLemdu034k1Oeia4n3uhjmBspxyyOE9AulByig6De3775Ng8scyb3P9xaETBoYmwfhJ2aVpmuhyF59mT62VIqKEf33LMp2ivZcyiqk5/xF0U5iOE4Sj0fjxDfOWBhOJNtRlKH9CK9J5lgmT5PQFg++nm9xCe4f1Lj69vXr1yvGWdG+NN+zt0LHVEsIYDU42Qx0n0jOpbm5EzEokxqjIvC3eGO6e31FxdySheCQmZzZlbq4EGV0bQxggX9t8c8wLYRqElcxwvjMK8NxhlsAejf1n1bFvjn0uK6gjgBhW3IgWyNsKZszcg8m5t8vrZ9y17TOJ1GSz7eL6QHkg9hEczn/PaSFlSJYCUVp+j29OlAyrs6IlDS9w4w+WV69eqab2mjvTbQKFOUkJb0yUsxMOHC2HDXaTasbAeW2iaqONCaia7OG0YWxNKgyid7HyI4kf1kmiFOtZhgIbH1FkeAreVbbuyw6zw8IoDvrUfMOfu/Trpx8N/f6WQRHqOTXa+Oi7CzfkzWFD+vdnTCxx4qrkX+tEZwn29j/6DjexbWqJEXibzfKBShjv2w1is7g9Bn0I4NWrV7dGIKasdA+UT9pEiWFaHLv4AeOAhwC6O0tjhhvR4fr6LL/6DHDeXZq0ROFe3YY1rST4O4+VLgRn3746+Vw3yTJC7AWYo/1+7tnTgL4Uh9Q1u15xZx3SCdwEDkYUt1Zaid7Od0YXNOoPmDo3ZZQDfhZnH0NaJko7N6lwf/Da0I1gvn26XF9MOOZPl26XyS1fWsxPAmjKBV2vXr3SvBAwwiNEhM/EnFNq4LFpx7hjqlZRPaChA06OdIh7mp7yrs+MNqR0jO4mq6ajgaZKLkCBAXWMvtuRn3UpF/zp6OidDV3V/ds1zPgRqYOZR86bwANlRbeEv/TAcwvWkoXV4hAEweL+NTZeQX26x4Ny/UGhrmEShmb1dAPaQpsef5+6QgbmPJupnsb4j0nHHcLgevXqlZBnm2MGkja5dG5091bu3OgYIMi4c2yFWC3sCDeE4PrGPX8wQbZGCrWKj4kaRY8vvLyVE6DIJEdJekPZTIlYBvlXRd3ou/eDDaofKsF7wHUH4fwgbmc/o6tnz2UfOG+rK0N0dpBjNE5NW03o8v8CwdN3gpB39rYVXJ1/oCfJaFjPORjESa9rUT1QazppCyyVV0GvCvMH7u3Vq1dDIMTb9T3ZxmkCQaCZ+xz2lDpl83j8g1lebfVUigqjLes7VdRCJF6fM79LSKQZmGdW7ppO91xfjKFC0OUzdG1AYFNTvO6K+JM5wAzjDX7uBd1o55Vfss8iy2AQVIyFtYDPQL+cP4Wj+vr01nt2FLVHEXkZ1bk269pmn8wpIWGGPmd2AoX8sOAzXCeiWu+w/bPr1atXlmsF4gx36q0BkVHUfncPm5QNPbkwRm6jkwLVlFGWIorPnHiFxSXu7103Zgm0mQ/aYihUAxAp7vg1cyaqg6i65GuJWn0DgkrPL10zd+f7pUizsyDoZYHpjjGLwfqWDbnWSAOlEMT6B8WrR8cNAyqtp/Q8BxDym9txManX5LaXMeuVxFT/jp5LtLTl3FQ+ibF3Anj16ht12lwXAKdsGhA4bkG33Nuyf1uM1j6Pbh3LMDaAAplkXNiDCoaXmS0K6h4BOuPfBwxjdZsXU4tRx8JF0ZsAu6KAtNgJfIfV+eQHYXB7aG63JDTn5I88RTH57BUNhjQvlZnPoM5drnR7Cls7mbZn3bZfbBpmVJkpZ3DKEZbBqznm/XyqA4+ticive2bTEtZehSkzg6vr1atXwyr5ss/PDqdJgGEIFQgQAChOKECgnSIGTyHHBYjiDnLF4cikxFlBzhfxueI2jsZiBZPMNsIBq8mQwnS9RIuQDaOf4m3J5Ts/6gTes3VfNXr57ojst0O0TyWg+zUA9rQudS7wHW4TZbodDHzEsQweqw+yhPXANLeQ1E0SUDMuMVhy+MLHKqSBbK3HhF7TXV2vXr3yDltUaiNhuQ738rr29rUmIJKHLz1xWySI23lOeUtqM34D1qVemGoTZvxr/XYQATVoHrlm8Sr/vp7ZEw2Kp2rKkamHyzCTP5pwG85XXk4BeWDY9YgA4ZvuYcRdCeh9dkNvcFRj4o+45XHiw8ME+NDdUZw0nQ1qeml6lEziu3PPkND53k0q+dC3WjkA8WFjDvLVq1d/KucDLwA7eN9O0NwOPkx8rpbyjCua8Su/xpVp729WbpeWIrWw+tpiwTFFXDMMFnFNEln+tZo6oym/ZkWwEwi0CV8CO4NeMGzo6tq2Yh1E+zQwXvqn0y33Argw8HMUix8gUxQ5KZq0tR5sLk1JwNACAHuGsGxBtbqx6ASKAL3k33Xb160bqaXfbjGRXPTD27QxvHr16o+1zGBrSYRFnUugFQF02vbpvmPjIKQ9GnVwGLzXP7nvwLgysSwK4c4kYxWF4zfPRbswIKnCoRfebtrZxAKzlGtlTQldEg1b0ZfJt8w/M7OzgFcVqzF4keXUbU0ODd1eD2IvK5hgqQRsf25aUzQLhwh7FRbxeZH+pYitQ+9rAalakHU9IvE6JEm2WD6HcPYfn1evXn2nplhsbDO/jkT/zXOEtIcLekMZ07mY1xB7m04fAvYQAvmk4hNFOoQZ1nAPGNrDfNo106eP3mfWf5mBhQx4aYF75tg6bjStM5DvKMDL7iWWxsuxrmwA6M/dgX5eLT0BcmGQDI9C2czb+I+ip9Xvd8eqdINwD3KWvpuKyujJo30UI3C/NGGkK2gmS1sRXwZtV+LVq1ffLkNx2y16vngbRzopWl+xWA7AY7+PB0chYhV2YEyDMnFmSLx/PCqAMeBuI7s1ofTRKFXzXqktogOOeJAD1hJA/feoAOFbdaDXD3UVu7DWf9drQW36W5JwNoTOJt7HR8FxcoxmwF4rf54D6XOAB1JilZdrjT3383ypj51I1LC+7JXPrelfDB3EgsjXKjarH3316tU3GwJYOdk9G9GBOMuh1DtnV/S3AppFImCWZ1qhrB065tO1a7Q1tJ+ZtYLpgS1C7F7HmspgFasv2FONDUDTnPnlcfZIKOEbNRjlDniZUJp6N2kSCzvXwFvtDe35LGJE+rb3/IJ+LMJbTO4P059qSy8a3Rg+uwDs3dQJpYxJfo0jZxmtQgwrPYaspZMf1KtXr2wEEvUfxeoPt6mrKffePTtH4MC6UMJ73MZkI3iT+dX/5KXJPFULjkO/DIf2+0ro0Tg7BY8Y3DDdBJIv6B5cyHfBf6fGNAi9vHv2k+sGCV9Ph97B0PZV/0AH/3e8s9m0tuHE2kSzNTLqlmlfYg+r/298EpRW0EZX8Baj0+0UIddWNmb5Sb169WpHmcemiI1Y2pkLfmTRx2zJ0EOj2qF5q7r76ecs2grAengxZ9nZwaPR+fSamvUxlnmDiYH+Pn8wTcvawifafXso/F592Tt3/wfEn8PE1xwGYHaGSQaqMzgyEXnMc5qr8w1lbczH5qKmcI77M0p4sD+3Y6jt5sEjnOnzC9sxUTQZeJezchCMroB9AsCrV39Tw/I5+2prn70luMEO3sXbySEuP7LzCZBsTTTEtJ0lnsXS5xOnljZVrcv0ZdFD1Zl8AfiKizD3BGaCPEj5/MyulVrzafke8bZyuVoG8O53Z3fODVotxmLAm59yQ4OhG9M/n3xRortrMqUn73bqtcKw/XzN429YV4arUR58qz+Xe3TRPhicrQb7kP/Vq78tIb/ZmDLN+DiuIBYrhJovsv5FDQaJ9niqCom5QHqakEKEB8kBqfTCkgGGCAct4VqlVPDa/x+UKR7jHjFswxl2P82es5MfBHHMmpXauwTuwNy+hN0y3Z/X63LlFz0gGtNYYvDNp13914xYKucf6FHzdg07GY6Iw7EAYJXegr/W+cMhhUrrWx1w1h9gaJvo8OrVq7+p+WR6ViiN9+n6EanFGei9Y1HU9yxxf08k9iJAHwLTlharg3UgMIzIjbPTgANNltugaubZm3CDin6RBOO1wMqJ0cv3Pm2AvdJx6b7ngTR2G1wtxrL3ElbivG27Td77s+rtex2ZtqC/tQZdBRsGsFFIDqeFgeHm+61/T238TTt593BfEM8z6isDhp/Xq1evrikcABrZUqRN/sfeGyTHrua8tkDOf8xnvdbPWAg16saL7d6Hho8znZZk7SqQAkFyhZXv7Eh3f3Z3NZ0EnCEkfRLLNzYcEtOzaUwVht9QWNp0ItU823DnRQb6tmY608o2JLme3O4Mh0P/V/G9q82sxlG6UbVZ2utI7hrWrYnP1L+XQpZqXYXRTxz7b+kP0Zl3NFOT+7ln682wVQ+YnbL1xvv6rruvgOkl2KJx8/Dw8P8XXU3aIcAqCeb4Rmth1ztzIr4F4B1bMI1JPs12hrIqcs0R9/oE5vhDM8vAU5nb9Dc+xHux7D2RjrTlyEZHpd6bvN79Lz5u90QLelYvKWNgEmdvbST5xcGDu8kKluVqJ07YFW2z30vx2VL9xGk/1mXm/V1AHH2qu5f6O60IxyGVN/qrxbKGShH7J3h4eBOiVwTPNeKOEoIZXjn+b2u7rkz+kmoGfNabIgnqROKbZ68fF4eqhUhKQeyuYb6IW0gc9SyJZC06U8RG9+20nN//YH8Ru6/xl2wRvtxgBM8f7TQmsFuwJnOniXSipv25JO4c2vflaPe0+vv4PBTgXMHl9HYtWPk2nEejPGSj6m/mz6Xpjra4FW+qxvyL/Y8PD08FUllVo9EUDMTDKt+pgXZT/lyZ0sbF5krGTZgKdHdu2VWdrfRMk8C5yLd4ja0yVteRjKPrcK9C3RXQrBfoGsdAMUuqPfl9J0AYLYVR/XsXddbIUJrQwLZiXTlafRjMQWDcO7tVcpfh7DiNFGoS/9YcNLTujnFbPOexYcsQNOsu1Sf0wY1j2y+nrx6/VJ76//Dwb9AEp8HzAL5zCyzrkh3QJdM8aWaRvKub1ZbJVYX7me3JpYm4U2FnRmxJF6nLw3dbll7LZMKWjflOR3CmvhXj/xcb6N1iIFcLJv2lDS0kvzPUhLTLewcXbukQtwP7toHt6IiOmfeX/CyqdVWvpgouzgJw+1qzOtyWFZDgM9X6s/bo3q+85n/dnzOKh4eHfwEX+rKjBGol2NYhOTSKo4ZIRK77DoFDlpVXstFPvtJwu7P+d4HJcd7K5+4m2KFlWz++hSdxeYBdJ9N+VP3/GQBqmf7eOKP/Gvt3tkSzwSaXAJemaVklq2lgNs98MmvzcXYiRbfovmm+q/Ket9d5ptEduqByrXy+dXIIuSdQA4J2F7M9rXl4+Ad4FYB6waG1IVfpbK6hjZmw6/yh96uSlFqNnv+tcST1marfvXySI7iQXgCRomx94XfHc2HY9eA0fAj6tPPPzDa/9m4qaG5lY/OFdky61qDzcqkyoSXd1JsbY3SXok+wrHypcu9NF3+ZPt9YvFGXb3+z9WYGv07hptcT7uzBV1+nC7Pjpf5jrPNYPbw/ZWo/NA8PD/8CdNf9mfq8Myydj9SEZul5zTVTZRSZ+GgahSzGExOMN4XGJh+mu/TGBJHaCroVjG7sOyK0vMGOnNmpw119huAawMKliQs83PWTlrCXlCAC/iwP6NDyiWRpwoxgyify7uC/X1obuC7Pvpsp/eyXuM5wtxeFw1+L4rfDSrZJozpZm8r96tJ6r5Zte9o/mgH38PAwnZkJm1YnDSibU5XUvpoR1O3VHw3DhYZN250bd8mq7kawju16BDdfRt0A946igaLKMRI51AGKqwGXpfeuNP+/awBNKOX+AtpTlpoSmv4f4U1dVVdNftsmN2WZcbAi8eSIk125X86YUzH0+USZLUE0v2YDy8V29YbblbUzJE4pKw2WoPZ46QqEIvvH+w8PfwP+r7sXl93EFs6ZPQVu/ZzF1j/PGZiSqvTq39HXL1nd91LaX5uimu5uhOovLXUkMaX/Uiy8O3Cpoqowdq8U79THIPqy19UwWpoiOey6ZYsCMNJDNOxeirpeYSdWur27/NLh/rbsErNV+lYa2qGgNsnaOKX7ezeKLSR0nxm4Wz3Go1Hc+PT5Egdt8o/GAD08PLgwiPToaYoSNVmrtTcGEURvYv9BM21MVtaUTDTHWG0mFFk5j0vFOcng9IspOeqvomaUbP0ybJl0DI6EMiOINQ2UGEYR8WIRuyFXjIB0Thd01J9v6LimArrQbvE9M0N1ZXxr+Wiy9WcESIslp95HTtS/YPXLL+Meq4Kv6+1tS7d24OJ+FZVkO74c5R/h4eFhJjs3+SbiPQkBLTOkbXffK+4GmMnz2z218actGiWzxWDRQLq7wLaWXUqtNvtnrTcA0Eu/2Tr2T8R8rOeZ/Cv+tGFMO4tGTD+upJ1Tvd4r0hAmAwe1t5Gk5UT3SmaDLJPmsx8Nh94m04OFLnOWKCsmqHlD59HeztZWrC327kazrZ5Tleh1KSoFcTHln+Dh4aEp4+hRjmp7J2i1h0uN6zmh5+QLqy/sJMvfbzdX2XFazDj2h0x76M7uN0tJhz4ozJi4kgMiJlqdGX+m9x2ygQo62ux55L4Eq03GjqigZXykKoSAfa6ljlKKY+bdps7naVBQ21lI7W5oR8yvTr8R+0ax+j42rp8U3YLbSsbsHp1x3dy1/BM8PDw0Gb7dKUFLDiLsrznv3pyMt93xEEu75qX0ZzO7WkbxIGPHlF1pvLmieWcVkKN4LMjbzagr63Jhu3XJ3QjWfLH2ofsUBXoKEb7jYzaFoMx7CuBdNxe5ij13f5DAZj9v0dUhUf83w0NVSb6rR729mwQM+48P1ybbLfyeAOndYYq5jSYn/Ws8PDyIj7Pij4t/GrqmXHiFETNXZkpDjopcgN0FtyybJzcsPilbod1EXn59/+TCUSn3pFO6awzVknRNBnxz2UZsfDEJBQBi+M1+l8/8GlIkxZdEcTRgveW4nkiZalc9v3Ay1XYS0p9bdici2qLFRTtc8KgVH9dH7AcdJ7AeTMIUcrsSkEOBBTbVIkaafHh4+AM0mPRHimizY1l++cllYhrrMeR5yHt2nF0hqA8vz7WNlg7oo+K11BmpdQLPJbrd5dSjJcgMqyTpyD1Auw8gpOWiH3dZFwCMju7kau3H+3pw0o5LHS3uz96Q22a4mf6uALtGyrtheKwGFa87+FWqnIsG+4S0E0rRabyi+CKD6j732fRbFm8Od3Ty8PDwr0G6fkAPEmjdNWvGYZP+6nt/sIoqCg+wHxap33hI7H2565uqZnFnQi6lhtF58DCfO7KV9lSOoiNOUHr7EbTBO4EXzIhovJDXP0YPYJS78LVA3VfyS+iNj3Cg/l3Em4sF/+t81horfvlf/1NJ5/+KxcVZwQ4FtUxlfc6jQnSJXG2+O7ZjSw276D4PDw//EN51ZW4dYm41uSCVuV0WFnf7myJu9UqYFttmagOKQASlux3lJt7VtQ7LRnNEZ429DDenuNvttCS1dVC/9tseX71Y+OMkJJCQhrQkJddS1voc6Dv1c3noxv2Qo801248dShFHleUjalpHByq+zmk39L5RFSmO1h7hL06nW2T+9e49TbbGOx3H/En59+HhoUEDa/D/mY/IYau+bgsaIYhyHV5q+s3ZiCDFdht569vElYZu4fB3nKkP29GzBlKP/hGwT2jVhy//CE2CK6Thf3QCH60i+xJZcnbNmqofm8716eM+eMjIZyZ2t4rhkZ2O0Xcx48zkmwm027FtW9d363v2kMVXf+Zfvksp51M0MyT24eHh36MVT5pxWDlg/d8RhqnghjdOvOjWCHc9ywk320/qIcQU0dX9SFx6wP2p7g+wlQZMpr7WtoVi2iEzO4KjKweAb8hoL3aAJ8/hU1ZD6BR0l0nbBJJd2rwndhnXHs7uvCcHhO6R4gcvs7kh7ecePVC81i3vlEJy35wABKFp2p+rQkoIwKH74eHhD9DpMhULoKmhLdJmRpfFk33rvtXVUjrzKMF2UUvKGz5Yo08bo+chX02Kpk3YXeoc5a2R5jN6hiYjSkP34aHBAYB8XsCqTDAf2D6HHbixhF5wqeWep2ahy71SPCBCHZGZyGlf1NdaReLFAIz6v81efm4IdZS/KO4qdq1gtXsnidcTPDw8/Gsc5RNy3A9NQL4Np7RS0dmngCZoZLIMHCRp1e4qhtEoGe49naBM1pngTJELAwSCY9OmtD5EynHSSg8XARBhfq52ngAWrldssf1CB4ztldyEOOYY3Rcnp7S7AHKEHzzCbxnXR5SYV4V5ki0I57MVsl9ORg+Hex352nXnXt7v4CVpcwP4988ADw8Pw2aiSbaTh2ys6MfL3+4Mt5OnmUWEXCGxlnLud62L1D6fX0LKjpOGtReGXm5LOJ/oiPbdqZ7XEEtYx9BViyEL1T+3BiBApBgdLYrB2T3DLs86f68KyByn48J1h8ovmHMRtN/eNAUN2oaVgPD87m8JwuF4dstv8HP9u36LkGaLxtxn1iPqp7OHh4d/jFZ8HD4LazH1Iz/55p4lpNFoH0Rn/I57vr/s6b8uOpjO7PZvGJnaix13FBo7P/+r1pu5qk85++y9Ny5UJgB8QWhGROoeOMxA0lVonNpz9QOsqQ+LF4249lRtZeIuZvsGfMvlO7iudFulVyejLUlBkwJd4dB1Ypmu2kpAr2KzVRl1Tj88PPwBjqe26kg9kRd7dPiOR76v2x9kVUAjZH4zTrJVms6S8NhLzjGE+Qh1pcnseBVKvLBsa5rFLVt7tq5k0mwE/J820NbyTm/Cp59OQiEEF2dRbWJnZFZ/NqPGUdjTJkWL+kG8yw760Ohqn1C/MYe9o3/dws0uorwvfthz6CHYYbXxZcM0eXh4+BPA8VOH8TrfM7PyaVvSwqd9k6XMrnAQyj1ssBac6Qv6TPjH5Lw2nn5qGr54xgQacV01B8K73/evWhrEE/EXvgXyVdItsIePvk9SJetr5ucjQjHVlYlXenqpLa4cOU8RYWvDfihAUXNX0GiCBxGagGZFzN9HIQK0oT2JjmRK7tv3/fDw8AdwHu/Uclwn5thtDf4aNdjsldE+zJ2d8TI0qOYHTEWUnf82G+E/IQsFgqtoVHy5k0+VGdftB3RUmT3NtwjcfGD64mj4ePjONwLZ3UQiVOS7Ve2PaT9rMXJjLvvH69uLXLhE2y3raBYTag/wbdzwFqDNTf2rn+y2IaQlZE9EHh4e/hSN64B8pmHe6x1wOc1k85xP+RjTIaTLIWx+re0yOyj/6wxtl2O6IxZmb2QgNNUChAMx7ysiQO56QrnLdemDXwbksAVUAiJq7iDavEPLmP8lh6mJ+FJ26fx0qxUe7hNomH9fteV2xboLmT7OPkl1H4egDlA7E0iK1Z2ccoX34Acm4iAII+89PDz8ISi000kVUpUQSQolSRuKN5l3NSBp/KHV1AiQvVIEj7JlbfhdU85s2cWqErqAahob3MWxRMLq23f6OQhi2M5v3/SJwYIURhyhKZ6XsO0ORs2s2/F7KgtuUWuATz/fPirFlWTaFdnLjHzr0Tmp/xW2guBvaNq9o9NpTQgNMn3VEcbSUnXwh4eHP0W/G5g0fUGMqk/ewIGR+ltNL242zbYSs4NIm+/wA76+lR1Gc+5Q14FN4T1mu8NLu26Za2GGNSAn4wY3/l+XwiP6u4KDtywnoE9uD1lVzd2Hilrt0Rk++boCFm22SgB7z7+Tj1ZdajPqDrOWLffrZW9BvUmy3h6XBoUZlYP3ieLh4c/xesFkhidlGOVUkhJC9/+966G3ZNNNEOG84bYOnTCCrDPF6wksNle7ZukqEpirv01lehqQdOQ6wCoty0CtlKqTgJrFogphEMTNUkv2bvjMpTs9aTxO6YyHqxU80j2a6d9V+vuPANO6lW9laOZX0Avypb7SKgUgSBW6j25FBBI69W3y8PDwR8BdUSLIqj246upvTrHmftRjGA3dtLzR3k5eNxQM1+2W2yXDY2XzGdtsuwPz8UfZyXPN7DP24OpPOTkH1s+ZnyOE4ccRfca0K5oU7JF0Ql249rKLzUS13V654m7hlln2WsCeXRdsrw0vIHtO2UqQhf3dcHl30xYDRa5EOURJUN3Ih7jySfPw8PA3sEg7lA05kQG8NcWWccQwqhT6XSxcB1KlhjbzCOj1haKWjxtn/UfHhkdw6OCl9YepnEwjuBy63x1d8r9cQCTA3SzCnQb7Ng96g+4WY0Lv5peGBG4Gq7YsNEXWeapL3m3OvasMjPk0kBnZnZ+i0qE14Rd9P4OPaDx0tvMFyWHsbcTR8OHh4c9QMjPTikliJ9Mv64GSQawzHEUgfV9cC8WHlVJuo6LTezUiLMnQFE4vKHfBKjBrer5FibUb4oXDXwCuGPtWLDve2dUCe6cp20/1xdyVbQLDfXWhn/OXOzkObZaPQvW63xOTQykbZgk3RmKCvA1JGk7Xlq3qfo1HdyUXwXzWh4eHPwKttGE8xXKcnpLSBfPeuMSPLuvUb5WCI/BwYjIQ3EHqoZ2b7B+p6JgrJ9T/vcsa60tSuRtLKYWwxNniA30bwZibgse1abxeM7kvvnsSfjiVBRTpmLjKVGjuBdUhCzvgQw1vfruOJP0Wen3Lfzb4OPJcp4azf18eXhfzQXWpVHIieXh4+CPUqfQlbPfe9kSd7O+a5Fco8eAF1GxLgol9l/zKLOLGUsIIHA2rrjvlb0pN+B4ZihR+uNB2wUenaA7FnOYk+Ke/3GCHFZ1NplNdgFl3AqodkB3QV3zl5mldwY6w3tOrFI+cmkezez+jLybwBkJbr7HRbAyC04JtE+He7qfH7f6zTiJoIA8PD3+LG1RMCd2JDrUwWwjhUkk38KeUqyNL44E0pDMRh+zUer5FV9IWa+Ei9qsbC6hxzUKJi6vMJLx84b+v4TOoQlvvieEDuFx8AEdIgBDssQTk64RdjEAMcrfkUyHBHQU4NvnS5lfrZH8P8LHqpzoL/U7xrppJ9qfZegAJNCm4N8QupYeHh78CgebLstnpBJPRe1uru4fY6ZfNV3Mws6RLP5WavEOnnUES7siw9N5xTy4dmkDNQz6X6Aer4ZAMoxcPg/uCa5tDxOyO4r0J4LilMRai+m5a/tXwq7Lu6uuAy/n91htoGJNS6w8oZiLqb6eCW8d1R6f7aZGtl7nqFspnONUrAj88/Bm0BTxoOKfCg22CFqZN7IBWgfj9WhGhWQF5HIsFDzv2ShmjNBB7Hq0/UBnTubXGYq3RGz5/iviz9afLWjcdABai6uNUifJBrcsODtuwPCQICYVs3JY+BqFttUXAd6sRobIxoDOIyfF9VxqEUDasnlw4nyfVRKaxrdJOIGo25oFDGuTh4eFvQc8iwyXV20i0q2iLG5m05IWwnydpkAJ9v9sUn3kIwzUEvzP9qCR8NjmKtNg5RiwZubiKe8Q4PQtFK6gYMv0GgJoxcaOxWd0iiX/kqcdbFYW0fhsx6pmfWgKrwbvjwmFl6RpHOy48VT3MYLOmKioK/MUbyzz3aMdJkLMZs86jxusq/Vc8PDz8EQiNyKqkqNQZ1IkFkgPMSZweTEs2qS5qCUobLgpwEeAYjysSAMyKEkoIQ+aof/hs/JLM8VC0VLwsfzzwWRRAz+SOc3pUBDYsXpkrd/0X3caqesaRKFoxpOTbk0vVQ42cMziqSA8rySo2X2Hv/KrURQxcHNDA7fv4jJYmcTDhVuHfDeW7eX6FJNgHtYeHhz+CyapjJtltKfu1U1qcsc+k99JmkGuEQu97jDHl2KOqLtSF4+/suU2lt3QrZyRdIk64TJx6Ih36GzSUiHVSbgBoBEhgZRU4I1P98AJkFXPojupOZ0LCqfuWr3rV3gJkP4WOirvQHF3v9FPYBUzOinaqi6y5B7a0ch+ioQr1evwaDW4mSJCHh4e/Agkwajcrl4Mtgz1CtVRbmq3fYXoShW7SBz4JTTlK4VszPnhysCxEQ08wOWTDih8OVYCGNFSmnJQUcvp6zii1fQCDShqZXjro9frqHvXT/eW7B70HqrvgWXHQS/H9ao7W7I2ypcrX1s425Kotj62Nb5PHTtTmozxVKh2Tf8CWv1trcs3Dw5/itQFX+WLFRt1mX7W1yn+z1pzRGAjeM9LgbiCf4BpwS4dV6xc69vZL6S/oeuhXbXed867ns7YMKOtIMu+R/m8X0EUp3T/VPAzsfiyFWNxpfSt0ReDIsqK55ZtvCaR+p4GAbi33B3gAEu4H2UXDku1E2wRdOb3KTDdkNlfZwE8rlIY8PDz8HTz2bT086hG2Y3SN57va6wh57KDQlBY14OqDl/xzDkvLMg5VDdTX2pap35KjWjRHSJXl4dMVkDR+rKT1aFTC/11QoeEbABbVJIVNbTXwp53wUtYEMzZcfNysFEPVaOwIW7hU3IMXmMI0q8CoilFJdSqPoOX+hc5eN4oqMVKXjust7WtvNBdNPO6PPDw8/BkgmyJTpZjl23xEm8DKPiTOSpkcEDwSzKRsmYhmuqBoDkXD/BHTlW10msQUSkeEP0mebURTdbOYFmXSgd55+w0AOoFJfdvcuHooTaAN9KgxBG/nXPntGwjK9GvzrYzsDU9vSRhyS9VeTOz3vCHgELawjVqpcW8DulL0jcygeh34jJIiF1hoHh4e/g43R95+ja+DpeLhU3L4btgdPVvKMhqDI7ZRjBDEIdLuGVmloHYpoUOg6HhAXBGmx0fIEltUxWDtkw3YBmo4YByLTX/wid4w7EdQ05tJW7+M/agkILOTWjHu6MCnlaNBBlNCfTJSugEDbiDFrTbjygOp1sNfdWhWqh26pfGpAxXsz50izMPDw9+AUAgiW9adWbX8q020OBX8VkLrMf7EQAw0I2C+5nDW6l8AV34Jw5Q67gQOTUnD5wsxS0OpN+O2uFl11DIHgEUDx6zdLgauzroD5jRsR+Ms4NNK5R08TUs3xfbtqO43gTakbtMoZavnVHFEZZcSlMAHgJQLbNkdvzq1D595zUaL9Jts0Dw8PPwN6jQf0TCNCGX5AKYNq+Wy5JKQnQAvPrDvhxONZuELZ7Q/rjrQyZJX79+0Gapnmhx6KSakaqyymFFdzJQ30xkFcWgMTijfje58XUo7Hom0F7so+kfQ0DQ16wW83SBsk8Su/uo9QhB8z4eCy8fTWhQUmSXOF8q5ew65sNc2JYJRBfJ1fKms3Dw8PPwdSs1ctBkWYXltLTlAMYs0nuwe2G5X+21UkNQseLG+GY6TJ+CzqpHGMFBQkrjDae6VGcidcHymPM+SLL420EHraNNtDu4GDTM1d8mRMFc1NGiPAtqSTBacMi+Na1oTrpwCLluUXji6t4739yChd4WkRVvloIG7bNgIzVzMHJekIW8t8MPDn6ME80xD/ktrryXBDJIqWAQPiulm9fRsimtroeX4kRMSvDgXPUCUbttQNzJBDt7ru07EfXCR1GEnO5uKHmSnaZvmpyRbMP/iLcbAkbE9m8uo+/xx/w0QGuoe7WbrCfFIJsrGeJpOXJzzAuUcPg3XIH1vWtK5bY7S4rjdPIX0qt4ltNWkHzIyE3d73UH432sDeHj4W4C1Ho4gN1GrHPYeSlN2nMEtQrTkcJVPcNsSPXL2oOHl/qOHOva0biiAnaPzZfaSj6MI0ZZoeONKiEBqZfsnDj/UTyXtDahg5e3103RyYY2pdvBsjtjLqD3oRxdOOpVfz9r4YucrfXQ7PkvjIHSiR5jHDi7Os6OjfM88WVQ3hRGmmoeHhz+BS3Y0iC40WuzCRC9IAKTV4Hv1D1cOlYZzdII2CpJQoJfgYsP7esVpsPEFqsrjikWqCoN0h348rbtGnQxDqgl4P88FkV/yBTtR1F3A/VRFLYBZ/lBMWjqGBKCSjKylVF6e+9tbPLQVEf1y9t7LLarvty0FEs0M+rbuwgx04IouqJENnaco6jVXk354ePgrkFh2r4bQsJrtLec9+d8tXdAEWrOFWUUjRzUfztgGpvWdb7bIcj1JEX8rerEcZsnlv29zMM3OsfGUTcCPIt8AUP3XypOLvi1Nj72Fu3z2R/iZxTfTDAr6TQrq8nICPqEh/3lehGOO8V1QA0SKTTtRumyLCfvgdrvhDKpkY89LHh4e/gSmUjkOsZayq9fZ2uh/AWnSVBXhA905NtZ/lgokW8xC2NPCW+xZp2d25yytYYeV1l8OzTFYVTBlyTSgesOu8/qOgyYD4EorrZ+z2GclApC0loJwOq72sbpsq7NP35YiSScy1fehhDXfUioOpswGt7WC7beQdB8gKl0JfYl+UVIgXLCmBCAPDw9/jpI214l63xG62VzXuk8jFLIu0TuOi7XULN4LIQAmz7PsNHDMUupcnjazXISucQhC7rq6dtHmwMgy5NtFsOOTfp8Bmc2iHYVliwHfyfxBgfii3/6cb+Pz+PQLZGrrYRu10aYBeqETQujaiVAw6a7xbHewP7sJgeH99D8nDvf81dLoetuk88D58PDwdzjebSAtO8pgSgP3DeS/fCWKIRmsAGxTGYRN9t1vRECkQjyr7C7AYrNtQ3Cfsgg9bAlZEuamKftmBGbYHFmdhJ/Dhr+H79NPk9IbpAeQ+1G5CdhiPcrk8vV5VlTbN3fg6gXOOyMTYVW1pgqRZE/PlpRhXcMNaUnzH7l3IGnxX+UBIU7/v/X4kpKHh4e/NYG2MVWv2n7Vuy8ZQYrzQ8ZMSrPmTP7TwADMBbtQxPFBcoGoFRcAdvmVRw53pQ5HPJEZBfKdQVcvh9Sx/kcncDuhSXKKLrnrnDkVrk1gydzKCeiVjEzoGQTV6tOJzuf8oqneA1LueD4DcAEVyFatyX9wCxD+C7ivEC0GVQm8XGmarQLMgFLcY/7w8PCPsWZxWb2DtfD26gFX6/UcmlU0Tq0RQZmfCQX7V5a01ID85ciul9Plh0yFgo4K0ZQETNDoi9YbInpz9FK37nYCG2LlO/UUbOuLzwcAVGHD0eC6sSrVTNdbDdnwla+e5dY3Lu4oykB9ob1nPNoLCVbE1lG8ZXfHkU0qJrxBkHlUwyqA5wV9ePgLUOQTafuRsmU+LOcFJV3Z2l2n9z2OATuyoTPlgA1I3Pc+rOuGXkO1va0Xw+rRDh++2ST6zCkpSPa2gxRItfQQB4CFO5ubmYTcuvhgsHeBnsDSas4CxP1UM0EJPUkda3cjCATPn2MEs8qh89/YeAgXdKgjIhKgzgc0XXyrY1Vmz6mv3E27KI6P8vDw8K9Bru52hdYdmWmtIUPPIVnHtjw4Z//X1GICBQKW6x1BZBrfAdX7xLBJowLPqvSeCmcu80SzXqcqAeqzr+TeOUO/AUDoKigz/qifJx3CZ/kJ0FyxoPdh87llJtiFCABgAceKOke0E7Q8oKgBdnaQZowmAJ5IpMji8JAN2Bes9FsrR/6nPoxG4fwf4+HhoUHSz9BuOAbA2vs2bYLys+LxoiQFgE+7GMc3d0bxgi8FhZo15bT1oIKRgzbPp+Ovr5fOl7vyku7lrI1+tRU2ACwgosPV0zb5p72t6mjO3jZewaXzqaR4YAsj1tXVk0x1YBRfFMlF8vf5tW5d5zft/GnzwFcdz3eNe8e2/24jMBH0kvxzPDw8EKfHMyNBHpUOU6BCao9ozez/OQkfVeiov5yjUxIJVotZQsCLXCBAqtwT2s9K4ilIuCXL9EeIZQ/vhCe0ojX54j8B4MPsguBu10u6tYQSHJ9bTdJglHVQacb3+wLER0QjUFz7xqUUOtNSgwvI1ztGP87Pq8jgjzbYLpDScIGKFO5/L+zG47+n/oeHB48KPskVe0Mnky3LUCjvQzb7Yapvjg624wNc1GCWiNyECKR+1OOLaO9sqARgR441md1r4LWN9tB0Ahr6XYeiXxYL8tnlK87Tw1WqYuxh+BSlzOrB1ZYZ0G+5YwvrYytNFVnyQ7iYtI9QDi4bQMmdmr2kjHFoAjroCek/cqMBR+MiyR+7gB4eHtjpzpP8uUtzR8bgDt2SALTcb7LWj6+24ErCPHBUllO4s9AlVv4/9s4mS44d18HC3f+agZ6UUB9cA+dx11A89nv5G3Ezog1SIAh9N6BVodLI9W/2WM4cWiGBiyLgVqmPlEEEVEgBMcInvXhsHKxFNvsZjCzvFVx885p1qZKjhNjr64INyS2YI6RjD42X41J/Pdz+XcEXb7IorQ3Wewfn91ysvs35aM7qBfPTL168+MVYpSYHPpU/C3+iKAq6/hGIiCGmqSRSq+fY5yQioXTP6rRTXEYA+hWb2hK2JV2VCnfmWklpBGboJ+eyGiBcJLwThXMADIborbQrE0EIik3X6Hi3phGCg3YveNptydzGbS+rGZCZHhNo7TxMJlomri+NFWynh/HZbBuDhnzCljFIqmwvMYfRCuhNhL148cuxbHJWLbiDr3RuwH7dw2VE2VZnoN0p3lHuQy7gFofb9C25z7wDWSDxDRu/ZDoTiNxOamA5ecYxlPwEI52ZKOPS/QAQiCRCLqrB3Gaubg/wTUYlcH0QRVBRcoWfjqanHOQnJt9M/yA5ieGVmmP22tn0nvmKgNAJZqz733Q/wZHuERXjtu+2b5NtdiAlSX1Zz+/FixcvgH2abQqj1qFFjWFdxF5rH5pFeRJVfXjL+9v/ZR7A9vIR27SIJAEshQdIm6Agqp3RmV+wg/sYi97aL5dVAaLt2of74HQ/gAaCFEqIz/DraTucGZgW/6y/qblKePN66AK0pv/t9HC43vOLo9MNG9g3DiyAVpdEeSeOB0PSkOLC/Z5ryRIDPqHrlxcktd+JFy9eRHzS8rlN2D4fMmRBle+Ru+7OUGCTKyK5Z+vogM90n1mfLvwRlElMCOdBJb8yx8KieND1fVsjfoFF101e6iTUUkAbGOYNXwkpMYH/5vIK32Jvopor5OSwm3yioZsKxFIg36ImSzfhmkucJuHgcf+PemduwyAleJiGN2tXKIBkqCSJcnwrBZhPi7nQ51fjxYsXVG0scwxsb0twK3BlS2JYel2MxZcSgYGAYCfHdf4tZgGTe37Y1yejVLoV/yhMlFykIlaWWtegPQ2BRG8DlMJL0edvMtBeWpxgM+p2Xvil4eX11RnHJWK3lRxL4H+aIc3iqbtxjftIbDVnhaTKwdkT5AIYBHL+O7NzQB/f3yX8j+wKS5UdSukBsQT53Xjx4qWAALfp+DU+8ULhSUuytXVREu/U7f5pFzaKv9IAE5GWXti2czrJSmTejQSzHkAuSn2dqSiH72tnTdmUZqZMMnyTsCPYstyka3i1dtev3WTgZ8HdpNQDVFWfyZKAXiqwZoF2U6FR3ePRekjvJKAA5uvQ4D7iPvbpi1zC3Zd8IX+qiQ5EqK9di9bEZel+hwV68eIFcDtAK+nkcBgoukgaMP0nbN0Fy4YW83ABiL/0i8UQQ0H4Y/PhQgi9DABWEPAM971ERQ/YMwGLxqPSgTVnU5okHAo7Dfu75/ofcZ8BoUzJH/H4StQktHY6kN4GsIw8XGKE01NNAvdWoLXb1B1KengCrs3q8DmIP0Phu3lQl2FIFT3LCoR0FLTpcRy8Uh+SMXvV720O8OLFi7Xgvw8y7vHomt7iU0oA3YNipJNyTAyY5cXyTS7S97DAkNUp8QlBLRgw3R29hoZhozH9bTwXtENtUoQw32//TQYKX00U3KjGZ8O1rPG+1hb5qAmb2TBKX1vzOm4f4xNMPrPzPaou3ijxViYCkPc+2FhmCCOAwd1pWu1TJ2fTNMk8hPocmrLfiRcvXkACQsQAHS3U31zSI8C35CjZcVIQvUnPBRCffuHq9ckTZ8vRyWEL7maiUQ9VMJOK6d1HuC7Q4c8f+Cnw7qDbf59YLVXl2WE2MksJr0MjBUypn9xNlSnXGu+73U3HfbvXQeH1V05OjH65gcjJLBtwOp0kK+KdMys70jt5ud8NF6BsZ3MCGw2lX40XL14OgMwkCuDmAqS2gOWM7RljYVfivnpugtryRgUlsgUuEXBD5B7IApWYiIvTw1kAYAnsIRD2dR2mKvxiWu5H0dXuMwEwthXcfLHGmMmY5uyNYNptQsTSqMlVZOLYd8EuwnEocYJxa779GJR1COKp2qyffIrLGWRsZRaTwS8j+EutF3p4dRivt+/+QGxP+Svx4sWLKFmsYhkMep/VMolilq/9aN0EXAf/7DKfWBi+W9qc3cHjHHjyF8JEPNysZvUhPOeT42TmkseDwWiY6tL3Wet8UNfaBIAIH9BgQjDJaEil43oyLWKDSlqb/GNopHKf9bu8Nk62VbJWGc4W++FuZuGVSL+JOZGiuHzYwP9zUsF3kWKD/+lHcKXhBR1qlc7/Fy9evMjiLskdYmKWxDnGrA+R5STEFHqyAZ4CiSEFH2Sbk0PSp/Ow4dKCveC+wTP1qFCxKgcNXP7S1EIiGfeLqLZw+MFA679RQKC4hGQKhB29PjMYPaRJCm1SoW5z2XJeyjVw2rE6Dsn1Wb/s9IDOd3/6TKcoc8yeMDvOMe3gpQEzSba/O863vgxX7VfixYs3A5ZCYLQ4QrKe8AoxCFEKYv0y1OnjdSFbuid9vCgAZQoR5lLU9aEBxPQ4cWmqfkZ0qC4jDaPiP7l03x/IHZIJlJ/0APS1r2FPBuYefYfhwH445zMR7LUKbh2uwDFcmA0mqZBP/N1uCnxWeyXcxVKyu3BS859NB2TrqDxF6vNkPUWVoGaTNNPd/x8vXrzYocuoVO/qw2cx7+PR3YtfYbVNgih/NngHFL54mREOhsyUyQ9wr/Ntnk6PUgrnStk3JZqAXMmWyIDcAJZxIuWDJnA20/RJj4HxgGQbrYrYUImYcJGJlYN5sXacFeZw4HZmFOD4nPib9nd628aIM5ch6mJsVxibn1adNTIf9F24hoNDUSk/iKawDnpJ4MWL3/IARTXZ8g9+AB61zq3RUkz3GlGi5PPS/AXOflXsI6spAlSM74uAFIFAqJG9UYkKiGTiFHMBB9m0Yvf2BjAaJy4NoFH6WwJgkuTwLvmwpp9DA2TkvJ0VYN9VRfacpMc02LG+QV6GavsVSkEG5h40Jvoer4kTOST2pvdUlIK5uYFp0sEWlNzJLd3E3r1f/94GePHiBVEp/TMbbzhjZOnZuncJC2P4iAfENwxgKEPAmWNPgQr9eAo4a9W2PqPhZ75ylK8AhpRXVlWTfpuIlKziiamDStd80ANYg7saMEdH1xoZHqlBRhoFUtApCe1I+4vXmiEGyZ8UYcPEf3U9Zrm+lh/pL44TzzrM7Z583xjTgKK3eYmi3ucVweLtsQ/fIzVF/2O8ePGiWAmX57V1XkugRKiNkwiLe2GvWRoSOLG76k/MIaIx/EndQBtAI24jklxfgCVzZphA6YbmCxvk0odO3j1tU9YeakdKYzCQqtpB62ywcTkiT6Wn6usp7c1coH4OnXe21uvL6u8btQNlQS4VMXey2fZic8v004tNPp5OTg7t/nMsish6WN0x4XXtWIuggBc0E8PXY0bOP8WLFy8A1USN2Xscf9N/u6thAToDxlE+V7fZR4d+limF1Cf9i/qRKaGDWvh6Vyw9yE0CWd6eRx56JMFGAhrupVpEmmGbPkT5j40BRl9UHwXJl2UtPTLZTfe135DA7Zytk7NdXY+Octmh5tGCM8p+QUEFQ1GRQQvUojlxhOG+KwhubIbGIdIg86Yv7Ke/3OoB2Ej45z7AixcvEinacV/mgPULTracZm1WCDEJHicJEOPEF+1sej6sVpDLhDU7Rpeg4IeC2B7FPFC2iO+v3+XCiloTgwgvHbKO1BXC90voASC0jyeLiWmCHHgUzs7puvU38Tjr3J2Q96JXXKiVQhufGVUA/iJsi3mSbik9FGSRXUMmgPndXR9nXXYNnQMf2xhGmCxBv6JBfL1FwL/HixcamAsJdIALCKH4HKPiLJ63PbAeMCoauEBBTPcIUMHH9H24D+diEo2KZ5pYV0DCZYlPR6eG5ykLs0qf9Xxbleg1iA5a5V0BMPLzsbhg6G8Q1D1QxCjre3dEUj0AYI5StGHurMbWNIdwqm4NW+OwGHJPHGR69znwHEssLBCdr6cZHN8ZC+5n0KbOziootTxFoJ/xEsC/xYsX+BdKdAT3zx5sVo8/vv2tphOXFC7AX+7nRtcFX7gG5tnoxPpsW3ZV+9lnmBKF6Wi8kwkBR8Fs11+M7ReJV9P1vo+mj6kPVECoV7kHL/X9bHtysoI3ab34dyPF9aPeT7u3PCvtVXj3m1RdpF+qiZCfppd2kpNjX7lAAphfg/FpAXiOiA0byn71DuNnc6vnFy9efB6UQAJ0Zq6okKT73PhCYUCsMPPnnFh8UZ/+msUso584JPPy4OQG+tTxScv+kXTuvrIzF3UiOizwQzW62XSztkK4eMyM/312xbUkyfqcErzL/UShhMjot2dWLfidzY6G5Y6c2vSB6UNX27sU6625qZyp+bCh7mYBXFGMaGz26iN3ogCng9leq3ywVsjE1azpvHjx4vOgpyR9n1Fyb7mZQeDd3cNJIcJJtmYN/107RlFP0jhGZiF2ENIM95nVojQlALymeQCGBxxRsEjp+zq7HxlbAdRc1p3y0wRQsN6Oh7JJc+cpxidCB4TIdkJ5HZBqnZofdU1WMRXdt0No7UvTE8gyWEXzrdyNg2Xb+b2BdRKZHz3fI/2VpA5OaFD0Uvmf9EAvXrzYLmqrzqIBwBh0OVCazMDPf/dEKM+IKGGEMhCjvcwKmWU6m4Wtf5F4TFjs+9uzLipJQzitBdoskdbnLhlHuk8SAIC7J5Bg2l9fO2xUv2KlzUbdrMBzKdnVvcsvcTHV1IA86kp6kpwYh+PFA0NkCFNxub9RnsB/THpxFUDoIKVpgY17tO95caIc0TbwxYsXH0SWSU4SVIprRQw6yCjnnXiA332L6aQmw9WVewQdjrtccLJYc8Oxc9IewaLw9W9bu2CcY62RC8E80Jf5jJkTSYhhT8YGXQnWDVRnY94Q8H9yglV46+vKHRHTvaxlfzA5R3MM/A1+NodxRSf+0joVagWHw+oMPtzONAxOO89MMaHe1uZicpZcTG0dNvlJCTIR4hLiB7948eLz+OqxhXZrO5MF6n0gAE1ECOKRMkwpf+4TAaiMMbGTg7qe8EHlv7MN3fZy3SkCYzRtFxgFkBksIs5De0M74qWy1jWO/MUkgCzm79w1WipgU4DUkOI712PV1PSwdJ/VVKD7wZVssuVWnsu8NGbFBCnPUjf38LcSyHGzWfNSxhgU38dsILrtBXYoiUETzTgw1iic63vx4sUHkbjeNrvxeD0XxhXt8vf3n7Yx7OP0X/tS9Fm2P/FXugHyo7PYL9MX2rlBV3sQ1IDNrNMoi1dSQiN9XF8JjKhOkQnZKxkrxCaAfYfB4bg+7wshAzcDdVEREumJE3cGku4tBY3ez+VnHe3E/ero/sOHmL/euWjsP5xNIci/TL1o7CD7oYGdE+vnRj6dKakgGQ30v8eLF4/27+g/HmUnfLeon6Gl+8xcFMTEaUI354qVbSIn05FGCuEqgq9nlPBJVrpuWo+NgHFM5idjlaUGUBa+GshNLE4/UgGJh7k8UIpaAWDjL+WpbEkoYWYTfs1wX3gRCx83kxoaLXyOZttkdQ675hg3aDlPdn/dgnj3eFvdo6LZS32uj29jCokriXRizfy5zsfx4sXzf16NBvF1IYPgy+bdVIgEVLK3TAbo8UI7VGa/zMUxlTL9CkBoGWW0m10fgSwJQa0PMg94r3rQIwsuO5E466La6AoAWI+nwdMk2JgRxkOryeqz7cKvH9/o/S+dh3ztIxpqzNSHR0d1Ud3ubzbwNue4iwyv3wbbCyaI95aKn28T2uzw3otir6gXabvE0tKPeOVv8eLFiyI7ZIioIfn/F3oAR/uec2yWd7QTTqE32bYyug/mWC+PHZPZMcwNhEN1ZBjGZfflw94mQkmy9TxPjAvR0xGV1kkJFFAO4ufTSOoWh8A3MlvIs2ShvEU6e8FmxuBMt51aOmMogzdw1wDqBLYxJdcU0MwOXUBTOq7ZNoXtL7hGNt6iY2fNj41sNvnfP+/PDDW/ePFigwGBTv0HRiWjgiZXBAV4FwQDNELbbvGgnD87w/Hqj1ZgeBzG4lPScIo9vm1JqCR7XCo86QHqhLT8KFOcXix9dYbd5InuCTYM+O9z843tAyg7UrD8PbJpeBP5375d9E209fHPcjTME1wHlMjrd3gTSCy1ZVCcR0soJ27/2JcwzJmx382x9zQS85OxT2WNkPiFimH/6gv34sUL4ma2qF/mJp66VCIUAH45GpCl/hu1qWFfwe6HSRwTpx10avlwp8Uoyl9LMsAbhpN9z2ES596d3kckeuqhfNSzzyfzaQIItgDrhO8McPVjEdw5mxp7DecXMqdvKxysUPZKbAbNLr9oBsTBMPt81+Fnkop5f0ie7RJhyUUnYTo+3vXJ+l54kkFIT3ZkvfHixQtG2ABg8UUYXpc1BfYuJCpK6u9oMOvR9e4nd9vkwn4A4NRmC3gSlotc2yBm+5fgY/cn+pv7N6YT8B2N0Sjbjn19gfd0hOvDBAANI1gyorjBNME8f6rftSet89Ei/6ystp/T1oyTQX7dZwhkm9JySk6/3pvtjm1whJfVfmxXJHB7wH3i7RmdlW15OyMh1M8AXOPFixeMZB9PtbxGMpf5iA+Qw8cZzqCpYfd/hJ5zO8BxW44s93cJAq6KpSofmNQT1gE2inxg+Q6mzbiDkjP70q8KdDu169eGueFuCMNAjmB0F0fkAForiRIa5YR4upftcJYW+lusdpq5meZJL6E970Rtz89cr6fl4JyyPIX8sdhg679BQyUWBhAdoZbAPmV0k/jBH4IQY6f/xYsX/2Pv7ZbcSpKcW+z3f+a91rmrABhmR/mpNTNdVYSNVf5RVGuSdI8A4PCBt9g41IDGXYSOF1Wffr+vSUgDLNXcrSXFErH2o605rRlwXDMqwzxtQn0+bZ+UXrD1umsTJpf3NdrPadE99zXAeBbC3EXfZPH41EP6o9EEfZ7dheaSYAzrRZYX2Q09nx5Mut8KaPyc807aDBqNhUxfn8kw7wESI4kNSqGZP5lubEY1FemKThvofk4iJvpk8cUXX9TBCTVKn7jXNykgHq+NnzbCoHBCxRgDDYqqQc5fCjRVzZJJqPR1IVu5tX0nRdDsyBIuY+CORH2Kj4loK67PedZ1ip5lk2Fp9eczDtrcKMbI1cz76Np5+k+WMl/n0camub21rf19KO/L1efIFrC12O3O3ISSFPOjANEIqjB/foVf1YuVQkElrsJtSA/8TqA3Rp+6wn7xxRcFlyyNmQpak73U49feoUKGNzYIMcdITsuqysZ0biiBohR97/Hw91NRViBGqCiGQOljKtGQfmxbYDd0R5sQ66z5ziXrO9Rjntn2tQ2gfrRwxwiibm9d52crvpuas75P6RX8Fd9jWOqvyRmxn9MkgqpK+YDYdTwaDgtHOpe6R+vUCe/rVc7bfNa9tf9U3ZDUmhvZMNR54ebgiy++sMfsfZbEHoKoUDUeNbMvcX0iRnoIOBpViiViLYcm7vu+F3+VEXCPtnqGC2jr5yO3RUgth1IyhWwjPVUtJblqVczZa3yUA9UeBPvxrkL7Y7H7j+UyIiaPZgrcTX5Fks5L20sGEkU830qkV4wRW2Sph+wMhug8tLJ7OJ26mpJe3jBQIYioJhLBYC/7Ac14hJHeD8Qaftc3kC+++OI6cTaZ3IyIPmqQ3s3oBPSiBqa4BhNVxIS6HLTAqzLnTgJdEVQEd7BApUpk2wETzTUWVAV/pdN+8GNCax3qJmN7RWNLdCV06/OLAup7wI3HGF1tvp0uQ+PvbrDnnsPuwzL7453cQ6JP/cQgzewlJoyTEyGXXxd6xRsp/qgJvX6JSd/DjusnoaaPt4nYqXzZkCjmKpD2vMZ88cUXV0jbviOrlKHydBLAYipGCKoYRXtreY3mNhJVMud5FC+PT094lUIZidI/PyQDzuhqYlM+HN44okYTWNtrNFnZ9dm4Ni+viXn8VRjc89kP1v6TpHev1d8/v62dVtt+3mWwbZfJmukNkagJRjD6GFR6JkI7qSMUr5MjJiCQhGjQCDbzJtJNmCb44v7X3A7Qfkm0clDjeI+lQ8eI3xbwxRdJvO39tyaqwJj4P9VVnTqZENayp4KRKsmIRsFC5k3caZ2YawAYh94nrnMxAZvSsZH6i2YeOLGTl6/gT7MpGNlPN3hhs4BuxLsfuD+I6SG3E9t/5S9lR3O1HjY/PXX7FG23uZNEImMTMmJa9Q3kaPVhUyUilI5SJn+Z6cHO/AiYyoWmRwGR1ZwNw/jsC7IdsLvP9Isv/t14fHzc/YgiSUxEdwJgj+SSNuN8zut6HkafrbFYdip8oUIdEJWihLwWCod01NtdKIppJsq6ay6HqUQusXGd+K5rqqeiLSqqQ4+mAfhDQu45818be5oHkydxfT59CakvM5evaELMc5Nfq5GfuboYQzFOolJn8LJ5UVU9rJgMpHs9lwup/uIjoYDzEJcaPAJAELVEH6PixtnGKCT5zoV98Q3+R5o80Bgf966tiYYVGI0YNMKGDUuR+jflrEq1AMTOiqkazYTKxABtHinPeWu8oAGj2lNQU/lrvgs1JoSspF3VbqNyjLU1MiXEdql/nr8awJNfoYxD8Wlx96/If5/HkK1eE7G3lJ4BiKo7upWRR4Ik93iweuLZoLtpNdww7URBUWU5exJTgj0o4Vi/plPQ6yh7lLtbYv3LSXI8wyk7Wb86S2j44ot/MZ5ijCHZsPtaSV4ev7pYk2gMSTBo2M0h6I53ITSBTJw7PkZdEkEFRineJ1LGZxI8mmlxDHQWQiS7BMxNPyWJ8a/SW+XG2dJip8w4zSJaNwDza7SS3DmjtfScyTUYYbWm9zgCbvKoyWdFp3/XJKnpi+6/RETdvCQZ8hC5aRfdHxtZESFWT0ElHtaG/Z+MKfXi3BKD3SV2t02mpfVjvn6gL/7FcIeghBqyKt4+a/Cb5DEwBvnM9LTN/JyhWhLxpn03iA6M5r4zaJ3eVmiIn5lzKOVATQxjZrTIjHrKxGDUkFDu0j4Zt4J+Pn2KfUluG+jiSWPxlAf15G/EJnBQvSaVta1areVbUxkkrIN2pZ2+iVWTiH2ojj3SFVAjR0/nXhHB0W7M8EWkXw1d2SUgioKEoyuLdDI1DNMPxrXUJvrVAb74N8N0+MIcnNoDf4unIUiMop3WdSzjKFJVAhUDn9nDqfd6wpYKWo6UJZbCzBEBeyoNSVQh53GZf1bMNhpJSuQuQ2kmgKfF89NLH9uK3/jZSshtCUafmW0tY+gsou9s0jVwrbiz2/0jHWakWiotrqNfGGZva380KAkGNYCwapCoJoQ0vQNaHY1EokJKSajga1qnwSQonL4YVDhje8jnLmvy3Rj/xb8TzsBkjZ1apyrFqDIJncx01+5ihKA9KNUqYKivFFQCJ2tAQrl7NChjUgl7m7/WT10RxfWNO0emBtF6jHajZ7b8thl04sswl1hQDeBnMI2muPva1vaq0FbPHeduBr0YHk6/WHv+kmymJINEJ+Kb+oODcoyWkydLBPXrR6W+rmsZ/be0zlsoOp9jUer190ASMaKmg8z9GkL/vfhGP6ff2L1D3F2NaCf205xr2zuZCMhLS6QI66vS1CPLImhwlFucfGCVT7JA+gPHr4Lbj2Km8twpNAnFFq+RKJUfPRzDMXM+id0Afg91W3osDcLuRS47Vv89uwWIybiyUj160z+TRDEzw+fF3rGne0x9S04PBzWGQKQZJvTT7BOUme1WkPSvdwFq+kVqBB2yLq5vWL8d4N+FL8YRkc/EtKhEg2qEGtnk9IZrgoujDqDn8g6gS6J7uKAdBQC03vwYzmAwKuUnmbQwIjYyRtVaPxDjeXRmXHnvEd0RcgIfyDBDHpuOaceUTQH9Dg6x5ONj1gVT41ttVm3H0AFj54qV0BSTatuJ1elWoDkTHtK8/b3vPyXPRk1A9NNIjJvftLU9e6FYReG2/saczybIEK/575aEIf8afPHFxQ4nQbeoGPctLp3cu4gRpR6sOTO1qiAimhVwNSpXtD9ThFhRkqgGQ43paogtYKNJihoWqXngVnUnwnl7ABogpyTPgi416e88eWwN4LdhnntB8IgBSi0wUAxGZXTgNki5Km7pHZH5RztkjspM80m4E+Ta15OIKHULRFSBTXP65KPCjAajpL+5+hQCNUU+p/2kXzWfmUj5V+CLL8yoghjjXe6UTcqP0NM9N+D4vhn6ObBHNNn4eWQKbT8l7HsdRGqDFGeWABSCks6WQDEYk0yH613DoZUEpql0b+gpqEmWmX2TxQX9rAF0IETB4MoY/ddJHf5LmH6iyXJazpeJsFMaXS/5DPdHSbpls2Ne7JndYOomqQR6kkDOXPlScZ4P7Ih5PpsTrr69Kq9eQ94d9rECkOYfjS++qMUpnV68pbDIEs2wwGhUcYCQJOEQIAScYg+RHQmAmhRgXH9Kx8bd7QE64q0u/e3r3Pp3kwdsDn2QqC7D0/ckOl8nqT+8Bk4q3+FnDaD+QKHyy55nqnpMnjHxjANoWSJRKmQZMHMYiKxIaz6zeqDO4vGGqFL/J0GcMTRMjRAgUoMcgBjukEDhNBpjodoGVHlfwaL4ocsmkH+6H+iLL64a2Cns5KJGJ0EG9iBaiAkiUWEdnIKy88EQ5ihXwgM4qaKktAERY3piTMoS70rD+FnfVJjEij1jXpFEplz/5jmJbB1AOpvIyGIbwPM7bbtaUf4KhdCxb1Y8EZsk0QFPEDTJjEoY+RSFcER7YmqHAwZNqu5jpDM1EIlRqSU+YDi/1CCRyhUlNgnE3ipw0Uh3IEacVpb4z84dkJiYfyS++MJ8WiETV4ytCklM1dxMVVU84IwHWE58mtXdua/UIgEC0x2kz2zxzoAuooC6XrQckahiYjoA1G1/j9SX0gkKZZTaYKOeJb0iZaz/uxrAb4yDlargdoSwu2qSu60bb+zGHDPCLN6IkdQPiYkEMUrAQ9CJ06px2jKoVHI3SbBAUKBGvJnx74CFenS/Dsg4iI1GYc82M/HGP7oFfPFl/0c/3BlRmQQxZhsXGhNUYwOjaCjuFoloWp3roU+IiiGYYn6tgoRQRkVWZOTWHm5iWPpACewhf/Pw3TPwfR86CaXraH3OsNKjT6gqcmkA/mAcbLDbKrPBn3k+Z1pHDHA2GKSHCK61/+fpoYyzSCCIEUUFUWJg27INqIlroZkZAAvr52V/A7kedvt/dCSC9gRBFBPSQX+bIWUFb/yj8MUX9/toM/g1Tc9kk8Ngrf03ooguH6AGNKYu5c3t9H0dI7oyX7pSTK0Z+v+A/mamIyTHffTs7cLMRvypDVP8nzXS1g2jzUYDNwyuP/kpKVRN6doRiSmKPvqc+8lxxwZC1cgyvB6kkvh6PFcM0c57wBi4B7rY6M4dGUBFltoXqB7PdRUBA1xzIogKk03ETJ70jU7Z4h+lwsBJffkPwxffhV8SNNGto2QLp6QmLzsiB8QGqADgAfuZRzycPx/0nCoxMFND7HP1PJBpHXip/q5IDD8OpyZwi8OldlasJklyDa9V+s6TaJ76f/STWwPYNZBmYH4EnycbD3SSo40mBmUqesUrx22vsidluVWZlYWprGgRg5+tP2iGJQzMHe3+oECUeb4orscIX2NQAsk0J0J7ivbvyz1iENMPoFr6Pw9ffMn/kASy5IZhjIbo7ooiQJAO3lkWJRY6LBJcQ7mCHAUw+xCiHE5Xs/9NnfJaGazctx5gq83yl/QdvVeMh9021T9uPbgH52p5/LO7RqYB+CsN4Mmi8KgZX1J8TBKNJE8tc55M6Gf8LlYSdO47QFjnJBPh1vkhucTjrqygmDmfo8KGO+Pc9KZOo3A+SRLB8YtxfueI+Qy8Jrj1P6kv1Bp3Z2xxav7++OILu1p17YvBLMXvORVC1PX9xSBw3uNAVWwEwCh06ehukDBhL8vcQ/k+65gKn/TC5+k/QawnHKGjPpQFvP79ZXFvHFm3poAzWcwYd2QgP3EB1ZfmFyiOnqQn9U5X3FxTnDUBt7fVc7nD4/VFE5YRqt5b47wGwbeN9rh1nc2LUkGBFQfsax9qzZMTKB4QP1NCiagEaBF6hxvZieZFdb165vz98cUXionJzMpncjGJG82MKJnSGc4BDhOaPtClAuptvrQ+AHIegSbCJfJRSoL9vEJMPRRAIWPyEwHKyo4HYRLuU9V0x6Ell1pobrLgKMN6l/oVgQem+KNfQZ/ZEWZGnjCuXrAjTzPlNRN4aGIshH6M9NWL8XeBL4fInwFhUAWQmfZGQBRlOMGNk93Nn2SoHEJCDDVwtog71Lh+t/0FS+glauZvjC++UBjvTgiaZnjxms8N0bHdoTLpCihl0h53DXiAdSjjGv81XTrQ1qOroSSy5AFXlhwlGQbleHVwpU9JSIcNQ8C/aiiwMZvJ6sIkLmsQdxosP84CsttFf96otNLn8D+xRAHUlTnvVWwZfitKGf/TRbP/85pccrsxKLmSXjfWm2kk9lk+UC080I8QVCST9ActEXG/wOrw0GLzun1XDOtw8L0M5osv/p7QzLBnTG/j7d0o4+XLkKn5FOtujVdmtwjuRl8UhPq6EWRDAAjdOjAKJCicoyNeVEXllfZwQ/P0dUFQXKpHNAY3OM8wz59sKoKPiXHneQ+eH08Cd+tYaE4gXC08qQb1ZJcRGI0ucnKwoRI5EKVZllZAgHLoSw1PaRAj4HI5CNeysPoaDE3OB4H1lI7bh5bvufy+mzLCaMgIUI/eOKHsc+vXD/TF3xXtawfcYBeUDTkbMh39dO+Dg6LlRbov9Meeylda510S4Nj+LyMpTUKASmL6rNdsDkUix4yXFGHOuXRyfp+dHxNF2unZcfxaJdvUAfIIugV/0AB+sCXG4vBSFUrFmlim5fHCla45YQn1QlASEEbah0qTC6jAmelI2sOZ5eTT2U4EBPUVEAA8wj26c+TQ9R3mDsvafuu7M0jQ7TysOrxBgxJNjAFjvvji74Sas8y+/pOtjFFSOQwxgl5m0aZ0UDASWc2v2aMikV6Y1sGdGjnlYmeOCbQlh7KYQwcWYQ6bgRJ1Vz4inR0k1ATcHgwzi8LsVLhDoOz2mLg1/D9PA+2ne/pmEiqC9Jkczt0DmXTlJ67vt3p0JH1ojrMAIhEiiNw+X0HvQzYoAe+8ICFDMb6t+1CqU5d1sEwHazcLInRvW2OptQppscmgRpQcfeiLL/4mmBPNFjZsAJhgMIgJXYDrs1CZ/4GWYUHJZP1wJjBFknm6DEW0UsTaQbq5NMc0LtDllC/CQRkmOKZHgNOGxZgktFtkLwAxVPhn1NzIzxvAkzw/DAptMj9avUCTp3XqmQZ2coSICTZQth9PeR9KjXVt1q8FA+pN9eE9EZK6vmVinMLxjOJOgAcJFiJFUhGyc4mASQlaRkTksgQsVjn54m+H79BvzMTo98x+aOenvfUp5rPmQvAwKXEyfAJBtI+ALyioxd0LEoRmdrvGs+c9UmHwiKFlvh7/iWBneiJEcfZddmpFFYSYYlOiI4nX17OyYBkkf6MBmPirwWD381QLW/5qfEDpJO4KMXIQUyseIzH0DSkxumy9iJgy2+PWfOLw9VKlltilHQHqWYBNAJy/JfB5kbBvBX0NwQSubNFrxwzRtSCUhTpfNeCLvwMu2a/XHsYGRMQEA2q/y9hLwwp5LfXRQzmr3C1nFFDfEX3TcqEoYeQHukyQfVpTq8BAMUYkCcc4iNUCo0GxcSombipQv/vH3vK0K+eq3teA13+kAfTTddHe/b/t9KfDTm+Lixp3vnn6CXNxYoanAZFj38pKN9cVALrpoyBCk3mQNofKeoe2RwgRwt74WMvqqgeTSwhtF4iJ5h6Hk8hlFvqvxRdfaEg6zh+s/HcLqfXrmA3kbHWVTd9qgCnaRwKgIF0uTBWFUwiklWHsP1jbbWl/oJ0TTLoxNSXBpPwuQ9xu/20By6+YTYxbMgaTmLZjtn+nPncbwO/De3ZgjqaH73kSqmiV8jPgDBOw32sl3tzuTtdAFpiwT9olHAGZ8V4N7MvtFYz2n2aO9ypKvxowKOkDAEbRCJtEiwoXMwiEPgnk6CVBCOmXxX8hvviiyhqVDJOqqKnXP3TaDzVNy/rqkprbigggCB7Qbh0kjAzYjDEREQFDtMs7Cr7nc1CS8wR4CwPMJYWh+bX+jmFFlqIwmcT7Xe6VqZmZXTRPNF5UzZUF9OeglE196zLHpTS7NZke5/lhpk4GZbRhkP5De8CuZ900cRDFFyNyqzLgtgUQq7rrvNbAl1aFzw8SCaCG+kE/bAUPYHcCEQPcEkCc+L//Tnzx5f2Xv4CYs//7dmpmvga9RrPMDOXkDmXm/ye5ncMXAOviyGGEmy2GgKGPeip2DWq/eTtaiDIdxygz41Q7w9yyrkDI8uS7Amf9/y3DmsVPsoCe/BjLAiXxMSYRteVojSwDqLk04FqwefEflZvQvH+Q8XZh+jeN3pvaCVGQrvQggqK+tS2SV5TtJzMt3BKBqr6qb6sBVK+m+UIwbn6HUQMSJPFznYDeyH8ZvvhCjY1kdDITVENiUf7Z6Z+SiAFXbEMscI5x7zms1fPtvf8VImrcca5RAjKdBRWDCgGWg2g+qbrDFU+m5LNdGE5Exgqhup01V3qcmaWa/o4LyN9lgT6FyRYrxrC07D9V7vpADhX0ppCoRd0tV9cfTjePOzgA9MUuRwGmR+uAiARoZggBMzMgdPLsy/l3YIF+cUr6pJ+ItPxkRxtFTE+LU0999dL/CnzxxRVwW4jzTtUY8GQAgVuzyz2TQ48iKX5XmUv8SMYITKVlRokESuJLF3oBRBOR4ZauI54oZe2kOG0l1b08ow4yWyxPsA+auGSZMfFRo5PCFs1v2ED/JIybd/90CFrW7xKNvRx/Vx1Qo17pqP0oCq7DB1t1V/acAMPmY/3YF5RhjHq0GHkRBQ6Vz3Xy8JVWlQBwVClwRwuBeoLmgiDHnjoJsbtDj9LYv/ji/xrDwW54WlOvCUn6NY/H5odr8LAKbYgQomC431gI1NOWnMth+2HEvBz7ELT5LwrCWxeXVheUKLSGyHBPO5egnOh6nr44ZFpmk0RFe8RJh0lMnlnC+/iHG8Dzy/mAU4Aeo8GnSX2jMXaTwmg6wFm8M6F7JoPJwKh5iwTN5uyxVn+PFOzahzBKOYP7vwKq9VOqHQG6DgK2PwC4bCeAAKJN8w/jY1jqqbRkFQmCiea/ISbiiy/0vN1NyD31zqa0K9n5zebg23GzAhpyWTbXI0TZ7QBkox3GH4KM6yfQ3woab81gKxRKqjMsAquNjrBt3MRpiJpOybanfl2mfAax4p9qAB0LauIvHmYwJkYSYxI209QDIrEQcVFZErhtEVzTFbL3LFTW7lOdGpDTvIW1b+Y4Nl9H9+3Qt/proHt/YAYDOjlk9d9Vfa4BZZCZoOtrZRmbYgxqvvji/wIb8osSohYHjkl2ZpZQxRAgxa6ebwfT7r3K/MEl++fMBcwFwvVoQsfDde2AVhihJg1yvlVnwTWN7v9G+5+OSFYRkHh7GrOxEW6AZom+O2118PywATz1ScOfKwExFhFVsnZnBg1PZdISyqXZJiEiZoLYspSbbHwzRj6HgynPEfJqbu8N3ilvcFu74AqdYh077NYIBIM9RrKjLAFAjN5DJtXKDjBhrMN8LwJf/F9BYxCTRBKi63wxbXW+0hryOfyf8HmgRy7S50po9HP8UljaFYDzZOejMC5DYKlrUIbj6iLNpxp9X3iKvygQC1HdeaDL3dgycDnCl//xhw3AH8x8/eI75smnR7FVyvONVs4rFHWR4nGisEth7lBAENe9SRBAlnwZ804fGADBpYzqc0C276/Dk3qIwNiD3rl2Ctcq4tBbxrbNjZ+UoAYzmkCOuJIvvvjfQ+cfFmJMrz+F4AGq8/OhbyGmj/dLFXW5lyhMbPNad4rC7Sa0Z7Kli2G5JKn1324dgv4qw3dEmGcPRONBvBClC7x11k8MqakvE82vbOHPb4vA/uQ7PnMDcZdWphtDvWRIIN5oRSWVBRJMsAEYUSFQ8TpJTfUViceavSK+TLQgCnX3w5reuIVbsZ62/hjMsaMmw1oO6DvMOkWHL4wm6RC9BphzE8gXX/wvwMAl3V3rctGdnWpDDxvPgwaZwft6RzojmcBKbwQBYV0WARBXA8ZeCVxNqtkbGUlB9GWSAArs8bHk7Q4OY60xK/Xumt/mBUparRLbIusP0A3gyZ/BMzagzXwwalbL5vQDjIumi1Tcwb1x4FbNjeu22t8tuJsfEVx+focD3uYC8QUU3nlCAP568EUM6U3lKC/glTbEW+2DpXyWoFTFxkYsJeSLL/6noVlXOjpcLSbtW1lWCJWIcyImiAjLlO6HLfoic8DPxQTxufQ1yFtODLA9QOwykVdhD4gy5lM+rwblc0WAGFWXpV7VD5PMdpkyhGpiDCZKlNS3vff7DrwbgPlP0UJxHt0VBZnA774OcAwDVLXvc0QTMqMEbw6o5HpJtG0gM3k7h+6yb1rzX8UEkjV3TrZcECUQARTfvmXAisucf7Y3QWk0qCZWS9oobBWzPaFJNefzfPHF/wyMgyxH3fM3WNdi6jAL7m0bCYCor6zg1pcE1Hu8tyVg9moBvAJ97g+CL2Q4HNjp4e1CfGYUE0AomyupRKKoJgJozE6x7aF398JEtpz2rheTWEjMwFvl/eM3AO8o0Q5OOvLk84Qu9+avLzL1XXCR2sMA9H0TVNhfTB/BXzkuXzbnQQHibTk+n8zTVQt51RcEwVeZ/KkeWlwDKdOmAOvbLwCKkv43tZRs9L433sDEmD+OL77QeO373lcl7Fkuhp5+FDI+jsicfCITzdWM6zaD84wtEzcDC7vcG/6qDkRfvd+YM5qzfINmF06GVDGi9Q3AaXq42K0ghNTjZ051x+vuOLAnFzYSzj9+A7gw0Z6JO+PV+aAxaUtLSccL5k4VUWcNkNBK6a5tU2mqccP+FNaFDMp8ZOgk5FUBwzErB4TxoNZEy5KXOwYmrNpbhoQoIkJQbzkM9j10S2wxfxJffKEJNuLVBxJL3Ypvvw0t0//6s8+sJaTP4NIl+DLbNfP03s5v4dOVB3VIVDm4BtGuCU3mb+8t9cwYchUdDmV/IRLSFu9o02fp3b89+9uxb+ZG/KUG8PxEOP7ZYyoU+umVkWvf2US4Oi1k1c09UexQtJGZKVfd6+GYeExrs+X+oap9v7D6ucG3hr3ksEeUamwcYUqW7n91r5WIov3cviJrhpolM7sgaTMiii1K27L+GL74Qu336bLeKb4mWgJugkGJQvb8NYcvm4V9XQoW5EWhz1b7Lg4BhX2npGJ6EPStE1QLBNssvPTgILJ3BNioYpjF7eUjSVx83uyjnJKfaHBrIWa4txR+6AJ6En93GUDDuw10Flyvh4lmHWKJqmZGeqMmDqikDxx6aW1kpcis9Uf1tcWd+aLI/xckvAoC1NNCfUCUl/UX63YUo9DZIm1JkD7Jr1Wh6KgXjdw5WCEkuRK0Vq8w/zG++EJKrbpAW9a72uEe1uNW2KsLKNoEqZP7vDpxK28iL4AtEvf3EYAXMbx1qINXFAn25YRX60ou73keZXdDyZhHZWXLJYH6QL9RwN1EktmIZZInPkkS/eHB/RKBbQn3D4oB5fHvKTFN21qJIw33hLBE4Rogjyy3M9dCCJvm17J+9/A+efefGKn29PkXxSMk9e2ircUv7zzhGpDWWYyCuz9m7549xiYm6noHcPhBvFGiETG/jS++cJWxWEDUzCQuWgOO2FP0zEUehFUBARTpxK45t2MTPVo8q4i8IgL4CkE5xV+DgEhe3lWAmZMfDJszw2GRnnYWye4ICHVkvRAxoDERFQ0xRiNuyHLUtBrwxLv6+0MbqPfasD/WDMYdHI2zIzSySxJQA2E8Mq/3AQNj0Eum2WlvwPkuwxbOV+9bns762R5XmHMGn6+RJCj4Iv3gphT7PbJjaNErbgLmxrppJ5k91CTqPfFuevo85jfxxTflrQyJAzQ4GQfX9iOEcHufsd9crCcS5lwEZg5dvAovCgRlBnr7wyvo1PSS7KLvzAZgUT0pfuClyJ2V/XSX0hKqisc7A8YVNIxmxn3zFMujZN313CE9++Xz40ngah3/OYw+RmPEqJr2e46ejdc+3NzxEFvNE3Nb7L0DPfs+kNaD2iuQQB9d6BDwU89tuaienHIhj5ONV3nlBQWwrhABlIigO50u6296VZiMOfofGkEk5bRGjSgaIpFo/l/wxRf2UZTgOmo0ccckUYR3I9d8FddOE2Xv80N+UhKAWpVceaGVhJLhfK8zVlDQAPIZCfG2TYh3wgPWkLoOUSBEFDrHAsPmA+x6qrjljVyn5b3ER3HU3p36b0G3YH4eBvdntsSsFlzhP30hqAFykx5oCwluh0SsScI2GKcsQlkLMIz4C7JnApjfj4nge6Slt0VchpFEfPvbSvmNwS7QdTOFnNfUZEwUn5S0sgQAUkTqAT2CQgwEoXlakrDh7PkBvvjClAORyiSEjqoEysZ+BzwAusW/52268NsPfFFAGta2JtS33ib9NPt3gKDN4L6yei/Vo2yNLm7s7yT049g/UTBrXbSRHYobgu0+z6Yc/pb/lhjvIB/zR/cBmMXP24P2HphodkxpFOBiQIJ7DZK/HoDBAQh3Rj+id1CgAPIGwZ0VwRfUuNRf1BZ+u/oLvv3ife9FMHxeLXDbFLjdQl8ENidI4ZNtVGRHwuj3IWFnz1ANiprF4osvTDI5lWAZvClJzaha74ClWNZfD2FJftBSagXh3uzozeGsW1uAzztITYMSoE1Icg/sXNZSXwX1bfkZmzNKqYjLgc1bNBFR9od0yn1Jp4mf5+fUts2Y30C5gJ78As9/4hGq0d9uZRMTEvFOxIP6JComkDLSMKPB2ZOE3slSCruPHWziJQirxFI3hFesT86Ntmp129Je3hd9gT2GlJCMsNKAAAEB7GdWrwMUrlJOhYbUzQkRmG2thu9VYPFFQ+WTiw2uFYEEdTyP8u4YjHsYm0RnHNtPUAR5FUQqkwVARN5XlRGQixsCORf0w+K+vn1R8NNBej8pY9hIW0o23ZmimBWuoYgyA+1ReDN9k2NtJJ2j5AwB5LfRLiB/Ve7Nf4Cx8EfzuGbWZoDSxpZEg5ogQcUEr9SEua3dUkEJLi8yfntH8YWZJ6/vNu33IiIuO1NQcU/kwX21zTwL9iSxyyrJnGleEEDuf71oZkIsmnCuYoAqZl51GXzxhSrGQpT7ALKVDquUJudL+1Qua/Bc2/YQmgAgg9Rb8xWB0YvxhX0XF99TdtL2ZXCnRQKV76Ki7ODZ9QmaT8qr1yEUWX18fomm7kp3DKh4UJX1rt63HvD7GsBvj4Pd3zHqY9DOi4i2OlyeRYhEoxqyiU0KSLbm61b8wPL9k94MkABoxn8sZM4AAn2N2Ksqbl2nIedAhPKedvLiq2IAeQV4RYSI7PN3MxKRppfebmhjLjj9J2bkdD7nSL74opha4p1B2B9ymfR7yv5t+tSV5jbH80huviB9Wq/C27zSeC58wXdNeQIyzC/vMAs7JwryAqMpOuLzLQK0BzUq6lsRcBEuAyi5plt3vDcx9hhwzfu2i/Kyfl6f+6d2AvvbkdElARBN+t/eBT6y+T7tk4V4A0IAAjRpY7oQwi70mnqO/n/snYuSIysIhrHn/R/Z4VQF/6++pM5eM3sPu+lWRLRTE0AEe+qzAbwbGY67R9C+1KxTsVtOTQx8dCjiuS22b5+Y4zOJTbvTBTLlKfjxZDXIzmBKU6TtIdIAFvVaCtQLMDrlj9AbGrnfC8Mi7h3r1nuiadj74Hd+PUhVjn67t+eR4xbu71v9hpJhbnTSArTL/Ns76mbbxhLBe6ew4TGz9aDInJCPsHDYYr1bnum1taGajhj7SLniYxxBQDL/AaqUgfWTXgr//4ORgkT0avmkVGH4TkLL91P6ExOwq5JQTq0xvUzlu/Tb3frR5XNkJw4W7PJh4wVC0yNDbFv/7aQy0NI74kDHvfcog/sQO9RZeGOYePXJyoHOKFdUBADiHbyWY/WCfxK6CglvM/ngQVMc0wsyW2Cy+MuZV/4NYX9j9Q8f75H5F5WiCjsGluhGWQCbobw8yGVn5rHoRIfrKqWyYtqOWEd3FKzYFL7PX8LKtZYoepA6Jaj24Zo0P2e+r+9QAOv71wo+/eEogyXJ42AnfGjNK6WLPCyAMqs6Mzmt8jpuLzsHWzsJ5IPHYr9PWR9cxtgxUBxkvFE6dk4i9fUZ6mESFnI29f/81R/YU3UqyuO779mlerSi6nzIWSDd0Kt9XjA/+vcF/xL4VHafuthysz4uz8eKtVfWqboYNjtYLbfldtGqeHdMaK3B4Yn9tB9TfrfCRTWfkOw9pa157mzlNVdW+8yW6RU17VWX9ocdY+e1uOr4lP73BcBak3sTdCxnuYA+zEjr6zv6PDXgXKT7eN48YSr1XqQ9yMynGCy2fYoO86eeXiEyNW67HUQsEvaL5bPZe0+t9+aPu7eM/L2b4b3brGWJ6v6rIpDZviJ0gMJXmWeI+J/nk7HiHOkoKLLspsCucQ2pQoReauAfgUY8ScTnjmxDuuKqdBgyBglLAXG4c8B4Wby9WE6oplycu/dNlWzCfnZEuU7RKkWFpskncsnQw5YiYqhBMHuvSarvF/YO/pATwbJIVO9RqqDy80vPafQZ+mKD9wSorv6YPK23+jWwVtVaq1atVbdi7lWVpmviU9chpDZU1/A4eBhO9ykP5bCa2jRfGvPW3iszYkpwHXTfeIhJqVTVVKZXr6Ja1FZ1LqsM09wLdA/FKu7NF7TCxJABzHyd8dZa3T18gFAP9NS6yg+SQc/AL/iLPf7O1CzeOmrPj23VsjVlkJ3BhXd37EhSrQAkJr1xZgmsIEwtpEFsguLwMmE+RcOkuNNiBXSWB92hgBmP44UCbLcUndKQNedOGBQDsfBGNcS2/7/tuSoZYv1O8lfR/ixcKhuQbOtHbAl0KeG5yllgD+ecvj9qQoqlIMaSJd1VdQrO8nXwllHKwrJ3kbPoaHRmcNtHMw1Q0eCQ/p3gHi7OYShq+JG6dyLdNimOwTorBpMp3Bw7mvqO69Gjes+4KydNw9PpalV/f4DQ62wfh8OwhKxUJbXSqJQUmijZ9ZpSjR+mnWH/6Cu1zLccR7T7t6YOyd3Vz3Pf6GX80+K4U0dXS8yXVs5JHPbTZ0+8vDVYo+qmVU+O3x45PzWu+maHAr+ajvvJGmFk28cszd++18W/ntQGC7tSxmsM9jXGdgiC1roB450qhQ7Nab4yVHUVxBq5rhtnZrSYEBNM82JeMrdZEciGz1xmNtGzENYK9WqZ2CFpiJhV80RMb6pd8O3gmKXXDhUYrqBXdfWa6UtDU1nd2AOvpcBfBR0x4lDDEVZAYjfIJBycZX85AxINoNQoVUtOzXhuLOZxawqBnS0qQ2Hnp3fI6GPhDtMUUtrbCD7RZ9S8XbiDqS4/zrABnDLEdlsKCHznRCkTjNeDieaZSH2TvVH6ySDROjDVa0Qd8pZ/I7dTikdncNyHQoUaPHpEOgJJiKSUT4hqhaFELoVpv+AkId4ZhY6lwfTsvbrWNDR0dhitlvC1Ap1W5vsonXvByg4fBjKo3jOdzEQ+rOBeKuCvAL+PlUor8BzrUzD1CLwkmMv5Uz7OQIW5pildCSxF3EKmoG2dqNWUnOS5tebeezjvqSP5pSMc2clgjtfbcSiBYY0TjnSoYLiWZT/PznS9NJeurHKKb6mPI2eatcBH2eJv35fP9X1jm/7RlkaGtySpXPvHYrWpf+GJDxeUQ8Tzxboh/NkRiBRH+iPW80GSI18hAsUnSgUyugStxQmWtQYaxRemXLsCyyI9vCvdJaNr0VzNhEoTBNl9qHrNfII802XPnkcdLp2RX/BHQiNTyA+3pK9y/HAj8yW7qxCYUz1lZBfSnKq9/H7b1gAVbTT7NV07Yjfhl7vPnrAyZLDU71PN9m6xnX84XiHfzgLWXPoh4p95SLwPrcLQGYggUMQ5PCLOH4+KIz0APT2FiP41TV8H6zfdBD5Xm+Y2flc+cvJUimf/tzHZrxH8a/gO9mIRUTVtZR+RJXFRQoSik+gnu33JlKfblKQ0AHRWGdvhMRVL72art6o0cjVfkySyUI1TCH4a1LMCVnqpJpiqZsnUV6MDX/CnbfZynufUvK9GdRxEbA2x5XZv3U6fuM0LN0fZ5XIuvmkTS36XIfVm24h+RDkQiS67nfbA1okUvadKn4fMgRbSVBonvGpYezfE0YM+xCJ1vi2/RLLTXuerDpTfHQiSEKFno/YXhScVwPoYJWDfQtnRcxptFsvcT5FgoGmkQ0+1aJA/J8i5IlChxmDvaYSZomuGC7NEdKfqOfeQC8yu3FhhPaNMczXE8sVkIsU0K4sM+NFQ3UM602wN35QM1TU7GGiF6dUzxWOVLGZSvzG8oPVyVoX2ByWZ77pBZ78RLDwVhVkH1cHiQyGkh+o+RNOitAGkeUsaT5k6NY5bHJbQ7UxMSoBNYhxBXgI0NccHbTXwwiiEeGYzYN9UMzxNxW45UZ2jh+cqJdG297vLuuGL+b3rJ4SBrg/RBwRk/q9ng0Ku3KaXPPSBUQRXeUe3rrqWyehZjwy86xDtgtaJTpnKNZg+daiw66ckZWLnvcqS6NBE+vpLsDE/w3bXQkCrK0YC/Tr6KtIfvj0U3SDQQVIRjf5YN1J6acrw/b3gBf9zCK8xI34Gqx1f4uBkiRK0AiDnHk1aOuA1mcvBNP9uQNHnL3AULnD/mm7DYKcfG7mcHLER9dyZsRWEW7fkuSasQCIrLba4ywucNpSOfSPUR67/SQwoEqJ0YgIfbLKvhOWC8T/TBbT+twx4xxbD3oIvJNIAdQpBS7LP58JPhGJJJ2axsIPdgmfjUiRPSvLtzKVPGzOXRBy7H61iW5/VArS0iBvbAl1uT1NlcNqx85DD1kje+hbtF98InT5td9Gw1Ihd/VtmC7wAiV5VTUWGv7w9zkGtBtKgE9cf5L2Ljq4W2rqgvDfbMr/tCjJGW71zR8BDCr0wjNhaTtiltMPctITyOIFSKQF0YQ94rqgUGEmxuOdAtZXskf8k5WeXRfqjbsZ/9deb4/07J4J57iWLvFsit2iVJY3/Jy3XOqL4qlXZCaB97uiLwFBfBSGyeu6Wn4NrYoRChA+ISflxungaVALOfusNGdCIcAANllpMulWH/xTulQuzz+OPhPaGr/fiZc+zrqhcMqtcgWHCAqJDxbf2gl8KztpK/d7Hw71b0mdKseC7jl+nZLiiCiQiQUpU4tNpJKYUQUrcUvZneuxmIIzvnivnseD68TmKeqEfuJYPqNXV6WedBu1Fpy5/ULYrrPeauyP+DTo+6b2sEbRGw/FPeRrvjednhC4K4GPOfH6iy8TLKwjfm5z6N834hC7IZf5TT85vaMvKgPAZCpmgk42R24NEgrI7AIGjgMLU0t/Lm9XlRQzkq6u1A8GEenUt2dvMrDDuGyXUeiB5o5D3Lc7NRvMX94tE1vkg/eEd35XjZX86vKAVzFld/7F3NjqO5LiyJrvf/5FTcQFc6cMHCoWpwdjVnj2Ti7bT+suss3uCUpAMSk+Yvby0hJEAia7CVFDtMIp3B/G5MeYXJmBWQX0k1KIuR9kPbYU8G/1JGVO2L0APcYRuI/eMH2WaYrOhuXolsz58+83preAdzkF2LnnZHfxZqmTOkFop+hDLpCDYP4B7/8w0AH/QD8w6Z/POhtge2b2/B48dUi+wP6NBfPHvdBj0z7O4kW9gD2cDDkrLHnQxoH5JFkJ2ys5gguyz12JyBeMQBveBWbl0xWAFcN7O3bAp330d5b/VsEb6Kk5eyeadwHmFnGleIn7Zfbg/0qnkv2jRn7sC9kMWxztHwB5oUdj5AuOraqsBwmsXZ4KM8nL8yGI8LdaEY/ZR4y8E89e5uJc9IAGXgqtSanyA6WAMSM+CzfHlAjF6Nj6MJye6h2azSM4Dc1n4Zy9Gkx7haNIC6iW8pONWLfifPYrCfRUD90tSwDAAf/wSkrbC2cVlBDQF1c8EbgHm2rt+8z32BCgHQG6FME/eARPvPliAw47wUc7w+APYmO97JwTAChFyhI0wQSQUPV1+BysT+asI2W9PjDMWvCqjGKgIUCcIAzk+BcgE2dGc+i9g9P3Q79yuyIuovriqVOWWHdaeVPcZYYz3dnZxM/KcROM8AadzelzMVL5dbgjOfLaa89Fmex6MAwMH0iPlyHVEHNUQXkrBRo8DkHyHD2K3GffN71NYFqcGfSMZgrPaWkmt4mwGG1fHanxva//9q3/MAPQ3x8S0lin/vgFbKWJCf9y+fINF7VigInbUIaW2Nulq6SRdCVpXKoChuLh4RtiJ7yENAQNTb+DMl7v1EmTL1oiENxrDFiXlJGiLxcE/IUeXbOAndnSfDriSdPO82mcGTq4t3zAvK0/0q67/LlHDzusNZpkiGLW4JwSUAH+pwi7R/0V+b8EArZLQgdkRVcQF+C7enw7qOFpglEtq0s8THx0k+Qz00scKrGnHAkSUCRyWiSdSP4DjAEuFz6qFTXQ4kIWU8P5eRrYYt5PxzNzV0e6y6MNbZNl+08rNi9SB+m8MNrAZ3FHYKbUoPcwG4devpoudtDl/XL2MgzYKE00OOS1B7XrFWyOnK8bzImEquq/Ys2vxTYCSdYF2ZtgkxBR92jkKmgDTldToYf52a9Dwqyo31pA+XE4S5nXAfbroDcYp/yxx4L9Lfhhjf/gXdSvXy21VW7RgVdWCdOArUZYv0O4uNJdzqxz4E/gU56+bSh4286ZkEH3Og3aDFtM+nOUwDPiDxSCNOKGr4N4TZD9njpp9HHZTgPxTjJ3BfA459qRUmRVl7RBlVVXUCA7n75duwb+fCNa+//tBSP23qCDQegKrGXlYH2VpgckoRVvV5pejS2mm7YZWmxBx5XI/yEPtvf8OIWWK/LvVHV7qvvS35vaQeFFuHDeq9IOkMDtc4dMvwKCpF8QUXsjNTbIBo8YBpFN0qSMZucnfvf67wAEcvOcLcOcgQLKRSP5S6I+q4xUcNMcBa/xwYQWc8mWsBwCfkCjlIEg1BFiFVWFTzj+8AJYHNckzPcJ5lnD+NKl8hkyHJZyXbjenz7DhoZCpE+TzifVwiUduyKoIUZ9rJcN40ykC7/sb61f7AECjl11iO+6r798BFTODLe343UBbvzYAk8nFiCM1RAqwjhqYAJrSdIiE5zgwSR43KZVZ8Uug87zgVPDccgDQR5zm1XBHFYbqwrtQ0SI4FsB1X35SpErKF4pB+YqE7hNK3joF6PAQOYmZaG/DF9d/F0LAVStpbfLL2V0FdNeSttu5A9G5P1Ena6FKU1norHtzT/VH3VXyLKqaUGfO+2dII8PordfvLkglOCPBPFf8i+BPVYLUUmSE6RWeh/rEeWbQKG4Ltu9XqGtmikG5KhrVwSSlwQa/EAg6ev/TWa+KMN9O8vqzBWH6hXViBMMAr7y9sUSzMdj8ztGUrp2za9j3w/ho+Y/3YlcMp3q8Lwcjx/Yc9yzQrV5dcO9H4AjGx1/y+gLivJs37DSmoQsM/wwZkbjAMgvZO+DLycEF0geb4fwArECgf76WNPkveNQXwl/gvNE+cgAI0icdpEb2owT4M4JRpqsvqedZJcIymb5RQKWQ9KRLMcncvJzA5xHwNM8K5cDmZeT2q6iPJ+bZmkC00w3FL7aGd/YpR4cFWs9DKYUPoO+bM4zQKqIpkhXXyi3SNIqTXb+afp8G4OOuNo/tRkBQm/ezffzVndp1BBxVdL4Eo9OsgKJYCqj07pzlfG7BAgWlHzqxTDkJYYy40T8Bz1F/lodAOKAZrMR0ZjqBK0xB7qH3r/3EtI1SzACFn+l0NY7hwP4YojgGHBdBIkIoUQApUaTGM7/u/20ngcUeze6AGLrThxrw8vINtle+vkpRPkAV4GXTYPqHdC9MxXKwv3ys3GfWXzLzw+RnwduffboRnzuZjWc9d10BLrR9HKk6vMBPns0AzYrGWAcCh/LMLOFRTUeG00I/PlQRfYsWnC3Bj8Tm/P626ejvM1AvOK30DAeyeYAycCBoJPXjPTNDsArUdgwuBeOzHQK0TcvU+lSiGOOC8xpTU0ZzHxfkJY603WIAJ9KmQXN5hiI3bO/uSfW0w3IwYsoj4EqkGpEU0kSwzspYgPDx24JImIAyRDWHAODe54reliJVhY/+/4ZiTznU9uwAh2RnUgW0n+GjmEtv8IZVPsH9sQ8YTroqxP7XYW0yhd1K+VCmhJZqqjMgz5HG0W6bMwDOXTsBuHLK4CHc4CFc4D5VxPhxokaDebHpoEwfQZvYoNr+AgZFCK/51nrjb4fLsQDoGetKYNZdrZT/Wy1a6u9v/38gD6DfNniAvyh6WQMsAX0gvTK13N1chJL6A+MwPRTYCB5uSaFxDfM02Yx0uLWOji0Nibw37QJCs5whH/1P2y5F5PvkdHtsrwSxkDtsFl8XUM4jY7+wBgBp+lc+n7SNA/velnuzoiH/a+kEnJrMjh0LCblTgLz8v7WieP873mfRWCU+nwwwX3RvwNqwDZo5DObcFJv6om/oOTjP11m0uGePBn+J9XEdL7bzz6z4K0QHr8/ePXro4/MFs/A3MIJ+Nv404/i1qHVs80SkAfvQ+qkES4uLlxIAxSiCQ1nth6j43/WZF3LMUBS0gfhkNLXwHvjfmcVMd4QoUf7AtVzFeBtE/IdGe0elAuf68cOfC3DRZri9RTxbrUJMrgCrth9pDU3TCyHvKYCvV4QAuvLO8cEzTjM7HQ3XPbgFiVGdma0As8273vZPL113PZt/XeC+7+VAmfx+ue6rEH7HkexG9SS3kAyX2rnoOsH9tghG7Dj7d+h8qpQWQMkk4FU0D1qaT8DchyFg7gO3lIc0AIl77vAesDkijVz+XcaG53Ptd9vPibwBovhhf0Rk0Xc5iOUh9pgwRJfSMbg4/tWPXL9fKOn2lqNA/xI9v0v4guom1n/96iuHAEUgdCRuaaHyhyMqx16eO0f+gNd4IwqvQEupn2to6vCMxP6ImZKL7DNrGBhTYOYg2xkcEPf+QxIa54ZfVA/qdrw9173JT3IWDjtXi8rF9iH2eyFdFEwh0Fi+4kNHN6/5UVfwACWpBCu6/x5sLZGayH/xy05dYnqq1vbndrLgERDwGWVd6tTzchs7WgL9ofrZ3vIT7+ZV5OWm/ROhunyydMIBWXANa2EmyG5aVCBmzZaT5huHAiWW/WH89ZBcFSiD4P+sQyAuR4MgfeQiqFHvXScy/y77iku6Qf/A0/uCegD9s4UBvr5UIrIKFAQmuRu122GP2OurguRu1Raf8FL6tC5I6JeyUlFwRBOFb2pKUK9Lf82s1JsLPUz6MEyvpM4uPw9gBRsZyWoybQlLKYGYR+CnTkKC87AYcgebHFKfjQJEDxVngL7SGG//owblyAe05CLt7ue29hxa000aT9L26prSMX2Pn3c5v9duXWf4rqoGXbCQITYHuBG9ww1VqYz2tcp71dMrH67dvBUSg9ejc4D03hZWBfiU4D9puXs6WM0l+M6iUO89wqyOMH5jPoVnKA/GiUAnE65AcLHdd3jQsviFvmGOUnhOcB+4yNdaK8grDdQvfn4PePPCTOB+h8bzSxZC70BxlgT+QKioeBg3EsHBCCidTCFAv4AJa/DLQayqMBAP3YyKo4ZOIE/a79sJZwGwAoCKUtEYtBfCVEG4mBwSgXBuUYBjmPy8nY6wWjNSwQnNtP1HRqFFwU+d4LS9k4Z1m2OSwDgP6DCGZVq0EFui0786gCPJaedPELFlCWSntAXhpdq7czlpZHVp2lZLjB0ucX8oHnN4wQXlnUqU43lCaRcTwXtM2irwnLUs58M8hljUn0SwFSo8FuUbqUulMP5FC3FBXNAiBdfh1mQjbjl1Cg/tAV36uAuuYB8EQrqXVdwudzA/6XnWE1V6d7gnK+KrPuaKb72ubBumIzJm4e8qboF/YD1L/ywPykBHTOT9QflA9ItOAP26EjHzsnonl1HZ6brWBXKD7YOZFotCc9siizpF4WHCIbtViQveXEI6xH9O53BwH6BVhLoCb+PtfxtcI8u/LUM6cSxQ2Mun8auKY8JWuBwNj5wpwUySVeA5Ad4bYsNw6ZywqpjjYWOs+HZ2umaMwFNnD+hRjE9T6oRebtItgwBdtjfmfZr21A5wD46DsF0K3IjRvzKfDr+P6wP83jOpw1spmlc5mvP02YvLWmvt56xlXiFS+hSd47MBHdxQJT2cDvZHqbYvrgKMA8UenQCgmBnwEq8u+Dt27XTszuew/nz5uLDDRB9cCVs14oRtZvsIAHQ4Ifj5M2UXmTeBP48Fwu44w2HfyRxoUK3jSq+6qm+uqEiP84R/uiTX7zdwOP06vohu0n5nrci4uCTlxDSMZi3Rv4YcvzbvrUYU4VyuPjM4lIeMwvIqpchIqv06qiesyIU6Myy+9qD6yZ4eqNcmGuaMDavPFozTjlrvfvt7tULu0sEguY3R/ROKKg7yWYwwAcTiYClzte4icrVAebOoHTxtNh/zKMMDKwrDk5+2maPDxaHEZNkqJY0enq/n8pezzoH0im2MfbxMWwg7sxrlfUUr81uCD+CPsV+XohohgBireP8A4YwX8FfWs4jJLHqdA/Y8HBf2wJilZ0HR7xBCeInxHQQzArJjSkTl8w4uJmyaiwExnrMGfwbek0GtuRGv+bGiAn0dysrRn7fqw4c5gbt+/gIw8ZkCznK+IhEUQFjHATboQmfv+jEZZGOp8gBXf1e/Ih7bPNJkghQueH4EqfNh9HOBQ5BIiAm2kVAhQzHGpq0n09rbM77OkPsCj7ENThAD2fyeZQiOt9d+aBjZDnPXi7BbdnwMNo/VPJtmeCVm2p+QpmWPlMtWVqjC+sqCw1w7tCeNCTFNI+gup/lKnJNX8NHBVznCsGCFamWtVcMcLPb+4qcN+z4HJJP1L1TVTI0QwOkd8ePqiDYV/B4CzqMVin5v5vERP4vBeZQrkNyOXf+8+jLug3tZUU1h3ZG6HGD+LmtZKY4RBNzq4LZnFVY/nPFSlR/FVAzAKyp89ftfGCxX0AdCC7BElvLhHiaIAWZ6moF0Ge+DabGn9tYFZQpfQJoYeVYF+UEOZlDhyyITN9EThsOCDBvE8PZDeJU0a5w7/wmAWtq0jy/ZK5446SB6ld7CaOscSsTAoUNaP4FcMllu2yE4HV6OOxstUbadEZfl+IzYqGFIwhMKvPVyWYrqiby1tSklaGH9/TOkk7kr+6tg+XfDCrRQSjZiLclO3gkA4wvk5gL+cO16U0yTgnvopC0ZnmDuaKRlcz7gri8GPpR09Aj7BuadL7B7P+4OTD2T/OdK4VM276ySXGXDfC5zXlhxPCOybXEC/k7wz2uZ+d8vjeTpNxssUJwiVvEmGqVl+XkF+YrYpMYMhwCmdWRqEAeaIf8cNUhm8mUrYR0gANcam6URCs/XJQm2XbmLFR2mJFqsySo4P0wCAfw0NH0cG3AZhJj9r2MQbGqwNiZdUJK48wPE+mAhaGIZVmSSXzYRgA9s5ubOuGVXzfsnjYXopLpOXI+Yf809Pb2E3Dq08Ic4ZIkRenTQYAD27fW1c9e9gpkK0TmcEHbnyl9eBDTiAnD+17zh0+H+nBIGkbM38IJI4P5ZQKc2/FbpBNWhgBD0nIH9YawvWnhooJCo6AVpjzU4nXbruiP4Q3DIc5HsNcOqMP/2z7O3uLH+B9AVA/B9mv7nbQNgKkFJgTsGACNxa/0c1iWEaaIjzVASB2QVIriuqOhLaw2rso0re9B5A8eDajhPSA8fwpbhAWLPkoCcHJu5Q0n1+sDf8VzHYCkUP4OtQZHytWxH6IzCjFhZQqfgNBFBshRgNFiOLzkNuDMsw8/KdkoLiQ4DeXFOg+lFzyx4vAcvPA1gvNAcScd5RvBPAvcrKed/strRBmA3GF8Uc1mYSAAFRYiB92sFrX+wimv5xkgGOAO5/AMSCyAE5EX82MVL71mYDm4e/MMutbUQgnjw6MIQaavN0MdkkKggmpiUHVUURroUMNUJtMtf4eH+vxbFf0um0Rf52qUjWVbxXzj/vf/89W456DfYA5CUXbjztEDgjvbCsg5Cfo4AtCKkED/OPgbnFxTFvaxS4cdx2Xqku5mmCzPB7ehhmdAMqIL+gCl0SGuOyQnwPg5Vnd2iYoYM2ZcXY3gA2Ih8xIXFRdcocIX1SNZOlQKkeYxLnRAUq0NLVi1en0Ygnvnp8CM0YrCAa2gaFh0+Xlb0+hUytrJ8KJg4nzUpf2KBFhH/pBq5+NRawQ8QhsqNy/jLCqBkU+AqpoTNOHz7DPGXzTi4Sst++gN+j8OCa73b8BjI46MAHafx4QVkAu5KAXrv8CgPDbAvHweDZW+G4qdrKSxyMWSbpe9A2rX8T1n1/esdXNDv78/5BFKojfg0omlDPV97AFLdvyJe6FdVyDCWP4BZI6Cn7WZOLqxv7M59RYHtWCimMwws1gW4A3sMmQ5aVuNhnAXCO7QIpzT7bIZRzdeNUapBjydCcwB2enKjS1aIRbAv56umb8Cf5Vm0kTHLgwXSZmGGuVNWVfigZ/o5WBiwXzJOleJ+sZz1mMM9vP4C86nJwhjSFdZ4RfsscBhcwp6wFyyMDlmR3+q0JdkGUl/3OorwZCF/eFMPRvPAB/hfzFkeOJFeBoDdPCI9hH5KDBpzQMgmdSNvyyGFUZ7EFcwW74zBwxeMcL//IInEpVzZnTw721dZZp38oPNeDbD9riigTzAJKO64CQcvZL5lJJ0kfDDQixxD8IuKXRLzx2w46F9OATQXMBN0y1ec7VmQv2IUXDG2327dUcglDIUwSmXCawPIwJmB646mnwQGbeG1uMLLE+UuKB+4a7APkzOPG4a74oN7LTRV783kiFsywBow/SA6fet7Lme1LSE+b2vpTd4iDFy8OSS9B4AUhIhAIijCnO08hBFYszwQd4HLUxWkjJAMIkOAqIidYCi4RTzHiM6m/jkNh/t/VoHGYnOSiNcB3/etftqfLJvh+5wVaCbjOKo4iRkS+stx4AJfNmFFlbOw05c/ZP93K6NbdZayv0am3NqtP399nQjWnyQL2l939LAG4DqfoPAvV24c5qBbVqDtO6ZVy9vZPF+iy0FB6jQNH2rDxL1NOEob7qNxGBmwXTlRgL3siR+wOxPbFNaHZ+c5ooTsHAZavfV3qPtMs4J2iooImDzh6bZadMThl+qptdJVq+xDXVgElqo4/KeBfSM29JZ9tIwqfo5cHftq1UmgDkaHf7WC/Vq8tVU61xkGxq/ETxscwtmF0noUn1WVpaR0rHVPkd+Vkxa87AOwExTJ5ysa5jnB8Exxlq83+BgNerllRGi+o4X4Tc6Xg412spc6eAx1wEJ3nC5wrEzUxiLYVOzgZrwKl4iKfvEulaxiu88uZZ1/teTtSV4i7POSE0C/aNH+mWMBZA+MTWfYBb6bhC728QD4mS1vMd+AukAeGsfZvNq7756eumv7RSf2R+8R5esyaO7Q1eeISLBSH0rycnKZLMH5kkToaWXPP9MTwUCeKtDEoCT8LQ0aDjcBzmJjKDJydy2BtWwd7DbWhl/WoFKr2HQzOnZMiFda5wix4vPJ2mRN0WfLggN45N+C03SUva54bPfa6itVi60UQHLps/EQHJNVJ2J/MRyzkFyu2JTgGbfCgcEaSpeDGmexEfzJsBNn42iem+3Pc04Cte9nsM4Zgolg1Drkj5TfaMd58fBT9ujoevI0570Z0GdNY7uA49Exw7OKxn1Lbl4VBd8rLwDbfrcTuOtjr6EQNMCbIcEV4ChS2wHsQbYw0CgT2cW4pm/bABzIDqGJHsgOHisibr+nkk6i1SKNibrrrzPMET5OWfXhY49fepo4E/10hA7O2Vs/TlNZ/kzM9GALdmXNwtxNZTQDOkljN/Q5GrxQkuj2CCzEeG6annvX37NV2feHunfCzvLOfK1C9W33ms8xD0wgiNEcYqEwDiskCK0wsoCWjd0YAwfnG6ASKH3J9e9aMAR7spDpbUfsgPemyBljFojfwD2DfHP6t5WAgT880MOTn1EJDMsy04btZyas/5KktjuiKEEgZkungscqGHW+sXozOIpfhRQovl7/ryWcAN6m8PMKA/B+x/SLntRAv3+S12VXgP3Hre5Y56H4dOkZb6GjVqUeF3NCa9uXqySyjfu7eg2tMC96cI6SDOoR2iUbRdue3ITU4bGTRr/aeC7YBFi5a2va5ArdT/sMwMV8kJQ3h7Q6Sza8/46T0c6+E+4ndV+Bi3cWFs9bxC9x9rbgrowmF526Wn1w+RXTTFl+A//faPk8YKjnTflzbSoAeFCHCKJDJ0iXpoqas3WUOkF/3MSicPD2KvJzxAzJjGAVpihCFPDpD5ocI4ScjxTXFmMexf/nInP0W5UbPYbD0Swy7yMFAK9xmDaYq+nsDTUQvKtf+NxE9WOo7fmV7T/fnfeD5HdLNP6++15dg7hfqA3nCzm1wesMKQbv2yXj5oDRGum+GAluKRvm+vJVhlShtp29/IhPAG2dfTP/M/6HZQWhh7dXYhkWJ9x4ImV4RzoUajuMjKBbsZjM5l4gPy7viNM2W6KqdofsjlbftsDO7TCdYdw4KTj84J/i6jW3Ei1Mn0QUBnejVlh7fi+vJgHhcrMCeQz2xWhg5mB6iSva77aUocvIKeXgp4w9q88OcD2bTDfEM1GpvDxhebWTnwXmG6mn8pvBPgyWR9gBo3zTBXfP8GCKHqX3hjwxX8GIYee4ZR2RQWVrBqLLJRJLxDFK11JIBAbh/VLP32+/DYDvv2tPwv1PBwhFyV3WjCsbAC2unwSLigiqNFkDoZ3JnBviaCDp/0tj7Da3LtIbMhCYxEiXZcdcpHG2uhwwM4FiBQXRxj12BiStJpRk/wyTwO9UnTcOig88HafrnU0sBR//CwujIAQeM0Z1sngW78lw3zlSny/qr57wyd2yDMwkzqrULr4EA31YiB9WaC7G8FUx9hO2Y2J/NCxlhQV4AV8YFAyBIA2hfia5V1t1F0BMtDyADxACmd6Un24zLrIexuy4GUjFhXsasQI8gGZR/5YDosHVZVzNXc5fWb2HsbeJE+R7A6/Z+76QSpoxuzOvI2wsXoCHL6dbfr8v58te1PeVOFAAe+wMbnyv0P+8EXGgv4BUgjQrLJCWLo/dDgV7vxcF2PFI+zLXQhIXSx7Nf5mmsEDmdp7WTBUGvsIswLQNw4ksYdLpPbyDgRC9j2RE7IJV7BDKzqZXMg4EI8Lnlu104A1cFnQRaMx/QiFzGwewnxuebEPCCF3g+iiquOY4/kIvob2gb4TKK6VRIDH+wbUYDLFcpzpVCcQ5rCgdt1a0+110A1tQ43XgjQvaPOUAelkH0F4bYH4L1Vcx0OlTrEb9x7D+rLTuQmC5qH/edQzgB1doE9EvSemVUBqGm9hu8pfXOqYbj0JlTxglNI+D36V6qtaSdfg0ybXf79+nv3tlPLQoRBirsQGT3LkyB063/AV0Ac/HquyBKUayhmgne4HbghS8J0VocNgKnece/k4QmPivHbi5xoCnkFRTGNMhPczigbHg/VKfeJzQnLIMAgZCOO9TCu3Uwe1AxpQDj8LHEou+d8p0TJ+vLYBoLOE+lz25OGJtUojCh7whqYsR/PRekRfAlSirtAMyycgNldk37LDEATa+ynwEdiADYuvULPHRwEcEvoCyS9UNtKPB2gt2HQP9N8eTjZyXfyCT/HH7VJRj8pwUxvIUhu5nY/4eQlwRuLAnO4fX2mAfzHUV/6VeTKE3FinMgNEfjHjNpr7fbwA+/rqpGteKoQvo56a/KCmJqbCLIG5GlGdI5nPZHvju0Djeszs5GMm0uEqAwK9n6XVTTk7HVXHdSyTN+pgKotwTE9uEqczAHR9+Q17TWVI8AEPBQAlpsl3Xb6G13wC3MKuvpKNaKWGq8V/kykgA8xAeLhlOe1OJ7mFTz+A9hCmTjqdZnsXL7VqLd2avXQCpxNr0zTKrFKYj4gbNM4cxGnAf8J5GDIai/dkBP1Md2cD/eDX8ruMwAIjbBWAGiZ/jzjZozjBvJUPIAngi8ugMRTEcGizyUGrCWnLpNuvsQbi4/6MA+XXj76/7+p/4l3/670nmAApKxikCCvKJzQdGIH3Hi54+/L8g9dn8N52jGFVJOYhiMjPwp4OackO5qA4kE4T09LXIEa60gZqWhLn0JrdVEFp3NXDkYH6rrAk5JSo0GCBXxi3rYXaY21mDqdmhQSmaVqHklqIP/CULzIQsE4tfoDT81E0HMUEXIX6MAbvB/1XijYUeQ03Mu3cufjNGupNYFGcViJXhJLBX3+TFwuHrrTQKNhaBAwOBazbUcgtgUhwS6gHCan3zcAL3+b6KxdP0RKFDzitjWSf0Sl6IP0iBssyhbKVQv8yagfTLgF/TGZOF3x4lVfpc9es1ITD9ck7l97tzfd+A/vmyr/XV7Oc9oKWv1hLn+dWtCgMqNOy5gCcZBna/wsXg8XUEP6guqAaIySATvrerACeVDv1cAdy1mCDYv0BkkB7EB5L9Cl0sE7u4ORHYePhvo8mcUhJG8BDWCwE7tkRJ2w7sDsVX8ERz/AA4P+QrphsHncecbn/7OkxNDdgm3hM9Hdo3J7/NQG3cwWCxdRbqwwbtxgJSKx6pFCmH99jUrID0Zv+pu+IduYBv/8JCGTsjy2Cr8bgkO5160O5FNNrBmkB3Tq2wZwM5vfBfzILksvm4nQPh/S5xoCSmpZIb/30cYLky1WfEX0qetBb4O/fB/1FAXBGJ41ifwQulyhiPkWAoJoB6MKw+UoxzlYIJZkHPDl+8HFm/wK239UMXQg2G+dDlyTAkSNnzeBDXVgKIT294BteHFkICPSXFez2We4J9FFEKeuvs0ZXlV+DVwWsVycUkpHmnaPDOb8o0AsWosTlDnhdA58B/X7j1Shv+cWk1kB2iCHg+K5xuZ3FpW45kAxOdihWawH5weRwsHvbVLA2plEcOAOwAOK9HsI1nFbD2yYNN2sRKgOkyZJMAwE6chfMFd28iS3t7ullOrY8OWj5T2KXNoqgtWeNuFLnkkiulkhpuYOSbBmH5sRcG4HVV4PvPWrkc7TWQPUC+Kgkg4KkMLh0KjjzQVIXG/wriI01Ne+RuFlPPuhAh2J3gmFU6sTTYxNpIzsH/1BBrtaG5cElFX3L6PIBbKyGfm8vPa1SHtPdgs/V+O8wXneVquPzWPaB9jMeijjr/wVDwiHMhJcQ5gMq6hHpUQeMiw1aFHKQT/imWSOxLwuzlbOFy5KaOD+wlNdxHAKmT0YN0c0S5FOcBhlsPf0kY2jv9MNYRoU6JHRXcWWX3SZcf5YXDMynGUkMgasLSzt2i4FdY2kJCnsEzuMNoyfzEsL9yM1U2wO6w2s/KIglsq5JgqBUqipafFWJvavoFiVavBNv+/f2hnx8RNJ3CYTt/bgLaxyQPN3SbTWr6u8ukDvUeJ9EUbkXokKyLpXKFXIVs8ozQTH3Kk9fFKnzOSoigr+Ad9A9TGJlbSIJqLEwjAYE5XmvWc+eXh2Bk5rHZOcPL4aBI45AX4OwA24zpfmtAmEYmcQH7tUJQpsI7yu8bb/g4bwC9Oh7cLlpgF6ixd8A9tJP6G+/JkaQfqB+nOkFuCHUToD0RHQJWwzYJLEd2FHCLhQGsaSQ2H+I+FHJMnguvDe1YB5qYlVg5IpQAsDvaZA/2kudxz3HP/XeKF471U1c/RbNwPo4JcuLIi0pp5X1i0b9fJSv6OVfzRvA9XEoGpiES+ByVX2iok3+LRcHKZMQUdSLI5iG8F+zTbo+MVVVPlnwWbI9vlAYhG8Ao4JoZJwIJ6NQNJDv4RzaWk2u1z249kQdQngUNrLtQ+9j6G8v11FobZJ0mYMROlWqgyATYHvBz8VN7cqN6pdioFzd0blocBYqs2yLErwNVoFDDCgjr/CukGgr0B4QeYfsUdBYXg42Av9/Hl60delYGCbWFNcrCpPhjsjBeajEmzHQfDgLPAfhZmpdgKLaLudzYI8xD6ZNFMNo/K8XjZThg25LbmXJOmRwKLwtRXzmNfgbt/hlE9+93Yn37/kedG+n+YrW7hCQZro4Ncr1Hh/W37UGy08nixRULFFfszdjWYwlIrx2vTCXdWWrRAC9oZrPOMw4Sg+zYl1hv3zhuty49OiaESYchAQuB9ixHixremc6TZ/kX9+tP0wsfXV1rK8dKbrpdaxuKOA2X/rWYsKB86msHgCh6jRIkkvaTxKivC7WGemgSFPODrhJO01vwFErPck7wY4w+K59JsDu00l7bUwuMP9Z3WGtnmonKnzA+IH6yK8J3J/E+jELMJ7c+KN+0ysrsVdTn7tL6cViVRiZX3BAfDvlfqXK5Ni4GvgHo3oK3GICfkJ7onzSJocavugBj1ZMnb9gJA9SXv6u4bLPQWqxmFrGXKld8yelzIAxjpb+v68T/sNm3T/gWC+0Urtx2VFB7Ez9Eo0ULSQvTB5MriddUTLwwLFZiu3HR/glay6eDRYZfgOMATzwI7r/nLriBQPuqlijQCheugSryfGAGojJZNYL6QVr9LH6KnKkaYYZcJTIDVLQRMGiGuNAAjUUzr8CU4lEsQswO75ZHJImsxYyaB7dBVy/J+OPHpTEGahqsBqc1NJQW5jAXe4OmKO/J8pmrxO9hVwDlNMuGF3FWTCzUHueFM2ZckKrv3/W+1wn8/hd6/3MR5bQ3V6h9fsL72B6AqAxlbMseCOztb/iqhAwAb1+A5X04F8QxpX6PVFsr+Ux0jUPK6FpeP/YAjzJWolOwTOpZtUQ3OWfLacp84lg9oG43M9R+YKL4SvPL6nNUA/ZxYn6cY8FinGI+HbKNiITLubK08JRfvuALVKCLWh+KE3m4BfwJFjW1klUiIQz+lHLBQIBg4vTtUAXpFPko2QSG4zEAB336OGtdfBJTMAgMwY6RUmY3r48E7mE1YbeYfcJVz4P8YJ99WGLoAulP1mtM4X/MHMc79zjdj591ob5zW/I+8HyDG+D3z+tR/KjxCOJwIx+4DfTM3yWDS7V/PRrcj4GfFfDU0gN0I8Ls4fFG/FLK1zAWEgfE40zT1CKxYFYIQ2va8UZnBA7fW7XHAL4U+tMyOhbGmYw9VsCBRnZCEJAvjka1lJihHZeJIr699ooifXSm4ADP2QH0lraj6V3ggWwyXxRUhD4pUf+MIIocrBX26Kd5CWOcdKAN9QWSZohYUvLrcEiI9RjfCRPNFPi/8ohB8NAKsHqXLnFQcJpnyqj4gTzOvazqZfn10OwJ1zmCWC27tPVfFn8p5tfcv27M9ikC2XuM0/6P/L1vKPv+Fwv+ftG7fgLuG1vdHSh4fLWu+oXkAh3yJDMWWPcIzXRYJxDMI4XCu98zbK1cQsXY3iB6Zey6WTrMojUo7WtVYJs2cTjNurQyy1udFScenITcA+jyCRutVy3muGp8RVR9Gq5F7wjGrx2Lb5ELOwCE1XXu4PZZJL7wGu/CAQspr7UwPTh3BfNcy/03EeSfamVzv99xQOrjgjCeVUiZWbKHsVbiidgWU+WMiawKwfkPzaD949MH7yJg5yX4ZCjf3KL6xnigfYt5FnkFRc2vWFO69hOZroPIVeGGFitrRAG8mCu8PdJc3ffsU3RGnMTmd7fe/X3of6uT4Pcb3qM/8+ADcruUGGLSfY9z0YG0uwT79g5XHDbKWdDKDoQNJWQlAOXYie5QRfiOrLQF8H2Ke0Df3D2w7OGzWBdCNFRYZKsP8ePg/gaaFbgpLp+lWMRovR+Yi98pLTocDoToTEU1HUG8L9MI/1KsJjNXcjlsEXegnJYoAWOHwf1s10UlAEkFN7S/DVSRNzTB1zvywILmvTa/Ds88d9ynOAPYFfx4e86DuGftoQkNs2KbYOWIs2Qxvq70rlzOAVwIj5sZhoiELaXx362Y4WmbQHm+nNx7a3wWd4cJjU+iFPupfDIe/rwc9I8VCv7+WgC9aqiIoNcDN5j/gsyfNV8wH4R5uiNs/JmGfziamvgFfe3lcKo6nqcpmQISmw7yvh6UbYXze8PCTyoz0gHOc1kfXxnCZJkthPbJmY0p/yV95xFPBJ2/0OFUfCoDTEHF/YmGzzhQxsakkC+euGkcpIAWyPBVyOdSI0he008MsDKae8MptdyRo5RHU2Bno4Ehgw7iCaL7n+HSLV6BN+SykgOgb9vgNnActLa7dboB7Dtg8BOvMb0ZfHrZZ6WWFBxu7/H9KZvgyvtew7U0VaHfHOPif2e2AG+++n1Rmr/fXH7so9zIaAHhzeU3oG5TGGaA6IkYJPb6lps76A9+OpR0lgBT/JDTwODusS7JpP4DPmMg4PhbT0gLZM3Az4gfwoQAXatH2Mu8vDUn3Qpw5zmKCuVhmAc8zHEqQOiuTG+ucH4xQQqgZzHBOxMyI4C8nJv9e16cF4B0yGT6l+6mrDxwY+CxW/J8AL9lt+lAfgGs44TsxdW9/pnY1+r4IaixC6Dfqv8LYmh5j2+vrR3SLMM6M+CIWgZM3vkPtxtg2pTb2kTvzZCp6UlvxUr+RAQlqH7jy8oSrSkK8g/lxvaHawH1e/7gF3BBne6KpCDMxwC7yH5iBmZNsUPmEEQUnSX8rSq9jOM4knBsWDoC+K61DtCHyFoYrvggAPXKFWYJFjldS97nVO6IUMAUFNUI4j2Z7HJ4B55ZJEuOZ1bE/1ssz8WjPNZdqeXfGrcYsmqdFi6MxRFrw/8MWtsOEN5vDtkeRIZZ4gf0AYMccRri1ReYmccGg4FCOG7pWqC77QAQfEdTOr3XYvqnh6kOn5whQ7XyrGeVOJpLWMfIT4vlJR4bQs4ERnZWm6FFdZ8YiN5kIX8Mek6XdX1Q/yCuAIkqhZt99NX6dONlAP6cLGj/3Ej0lzujTEz6ZIQJ7OX7ndJxUzuo+VJnAfJ02CWQqIkBo0bLCd7pigsKc0jYtwGkl2h49ckG+LvE4fMlyyAfgtgjMVtKHF5yDpieMSBD3Ot9coV0IqiPbrMth/ppUljGYij6P+EVY4dukcvmqt+z0tdZEckgeuwQMEJbz7NKoec3/Dz22xqiwEimGE6XqpoQqZ9jMhjNw6aG6MMcDMbMwsWE0MVyYC84/+SxIMWN/j5IiHOiGy1nLc4UGSmYn/Cgy1hcYVQ2YHVWYv9PIK6k39iwrBMOTJjCCDb+2wxM/yhy/n0piP5AZh/kfkk6XLoacE+1dPulCO1VTqDKL14C93DlOH8TXMAqLCBnsoNHAWxGxhWArQIHih+hOVXchQ5a1PmCvwqPcdg/TA80DeLP0Shu4ZqWvAq5jwBAuX4g9QNQk73FENsHmtdZhTTjolH+N4bldAHoHgLvy4W2m1rLWp164gz8DPQwGAL/tKkQBY6A3KL3QeUzuhgzNDWFU3wtTXeZwhXg0N+LT18U48Uy6ClcdqECwaXTBLOelRrhQLy+cZlb9Uk5yE/08xn2Na0Tnm3jY6PrKKqb2qvpCGYv4f/JDSmr99fsZVi/2wnc9T9/TdvQxNs0uI0ARNB5s/+AGzoaOsiEEGOJ9alUOFtQUZhBxQuFksHRJyjeCSxSFDeU7K60N9MWj1bqAe3qkx4FQGvxT5YE4eUoWAmrwcWfCFSWWYT8ANg8LSOo359Fc6GlHI3g1Y7BoTr6ThBbbNicEeagIVgdNvoK2llJEQAEUN+GwV4BGtXH3aqRAWDygw2/MlQ5DEDPYCh4A5qR+9cGnAv83li+HjA8dgeoPosJJxh+GxYG3yyNFfx1RmEXf4WJIgIx1op3/fRh/0yuybvLjdPylLSBPfdJTpU+FTtMZDCpLX9c4ef9ctDvt28/42Zo3zjq3nDtbLFwMKBz3/KPsbBJtU8JiXf7aZejxLvsUr01QzdtGOiVqINLfEXhPUeAn6gkuY4Bf7Mz+GX1KcQWH4Ibedm0ZLoFvNbi/13CGl60BKhVjMSxEVeMQdWYv8H+X72BNdlhdNjSayYR9SJ7GMEPvlGH4ItRg/XWPT5TmZRbSg0M4xMwpddDwrARHAp0a+dcQDUjSZjFccAOXuDPF74DBmgCXZFO2yr8F3HIZ5SZMDftA9Pjs4yPHLTkjv8Mc67+VfbeMPzK7EsV4QJW9SR53I65F3gr3xmD8403/P3S5LTv9/b7qoN934q6xosQntqQld0NZOtQwA+EoeOU44vzD8QRNoU6w5nlXvg3ncDgP6+keFAKuN9Fem9t6N0C2MsGiGppVp7Fe21EkrsCO508Enh2TV7lmDFnZdCsXn4+qWh2Nj9hoxpqFgrVfS6xOm65SX7zRKC5Yz/BHn6WpsJl4Le8v2b2kpFZbH2JzI65niHVAPoyyhGVwkyqqSCTYym5gbC3Y5ZuEzbDBUC/y86znPs0gHxev4fjOP0kW4SydMfX1X6YS8VPOEEHTJ9f38el14x8gy/BBuD7Fsyv2x8QM9r/8BFw7h5PpZju7iTNjj+yA2y2IXokIY3H9pBF2AVxO0oZSCIns13G2CbAl6hQBvBT1Vb8AWvZuHKTqS9BaV7WpR668J6pig+lCZwnVjR1Ef+wSZeGHLr6jIh5J+5lYFB5xlOwsCwm9gvbAAkER7Uc7e8tfDF3LSCfix5+TaIHivoCfZBJQFf6JWCdavV4fq2Pw8Ur0CHnsQuQ+aShYevZtXIpIf8A0Q9ZZAeDucEGVNZzmjWCZ0jjmXnnhnUoVzwD+BlBHz/jY0lScoBjZ+uu/IUTmNNnlfKA/T9AdFDetMHtn6JbGJzXhoH23/SDpz7nCuKeud9xCsSFpj5tmbKjzEu0aVfIUM5aQQcBV7BfBGRE1Q6mR9prHlodm4XT0wlDxBkB46AwM+00sN+Vp9Ka8DCXRicg1Oopjg8CtwtHnLC/qJPlPJwY/P0S+i6m5EB8b8wlP7d5sHbowDf/bh1nUESDFkOIhme6/ZZMEptTAcYQ8aSASinKReXSVdNX5gFgIz6/2P7rgtx59o2LMFboJLksMFgO7FHg/Z315R5vy1kwrC0jOgNVb3E7eu5wfl7ueONpoCCzeSDX9FWwgXVO4pJApKb8kJ5zf0hJyI8s+PUmus0icW403YMLWNoRPWJJgz1QCFD8dGF9V58cgO0+Buyh+zUN/E8swxkWhdGx2rQDgWQzBP/2EAhHrQV000MqfsSyOkToXcJzrb/swwggvvaE822Sx1Q97zml4JiABaBbF2m+NkykGhsmvsoGw+XrLT2vx/cgReqiy+m7dQum4v2znjozXQ/mYT05a5EAMiFuHv4qigJke2fNUBZ/MoqAMamMzlN1uRzN+uiprMGaF6Wf8fJr8m9XQh6rOKaHOr6cE0Y2iUMKCBsguz0vzc7tl2rD/VcU/gUWAlD/a1NBpphLCCSnB7ynDwDvzlEMjfT+vW4S6oqxo4+SyEB7njBI/BA6Ooun19ThIdIUhTWZBj02F6OEFUGymbk7PlGQT2inCRx2XhVXo98DQWoh/aXyXCGcU8aA/h0FBJqrPoCxv6pA8Snl76mgNLWCd7t6OFKAWdTlHaiHgRgMSBn5YkuQudsG5QB/ii9C8IPSz7OyDrHjkwn+hExtn2ctWB2eZSEg+xgejh+cLsB0/w23j4CGkkXyoJIZO+14KOjgl091SDktKrmfFSt/cTno7d+Mdf2XBWH6pf5lrn+fvET3qA6D7A6/i1jR6pA8jJ9AAaJMqXhuYH/k/1VN4G6+gMlq76aBYov7ANrG9EQzOCqwZ3dgP/pCQLVIfJM2+hYlA56SUiyM5QFScSACz+Kdt792PGjfI61fS48GoskUK6Vu2UewBOqkgXmRFbsPUOkJUzeuY4JQfAa6wDp66PAndW5B9pnpaufp80V0PLNi2sjOYb/JQrR5P/lcDp7na6Qcg8U+LkB+xZZtuoejtykGov2wlttiRefJ9twBUefSHXqftdZTlPXVRaHHeeH+Wo7D+MlyXf0zUIkB+BRQ/rPidIn1fwT2nWsFeqntG2d9sUSbSKJJLL+rzV9YjomYZYZTswK80JPFzyh4f/cRt98k356CZ0A3Q3OT/izCADoN3ko4DpXTKRwje8JFFGlcFKDE1HjaVOiKAzUd2+OQUFS+gMxxjSYwno0nv8PDgCZwUcWkgGxT2AxlF0vzRRJxZ44F0Hw0rpai7nd+7XOq8/IYxpm7Au+Rats4POoC2JvAy2QE7jwx7VUMIruA51ka1OUMkG/mXpWWZ0itWTq79eFzZNzx85YLgfq4x/boY4Pd/6OA3nA5gKccAJr0Rnvkmh0IukUiQFN8A7msmQJGbVd0q8BUOjtoRpP6JRtwmsPrgd5oj5aRGzIHDAfJF29jWDfwg7Znn1+LvAH8viP3SmYh1qneDgEcxzyT4J1iLWB7H+pvbU+syknQlWmQJWDrf8d93r98ea/vQsAMFKrVnek1kp6SS/JgqGliHxjBGoteYTMsUJKHu93GsJ0CILh1wI4/rC/kyJ8rQ03hOXiNsSR+Y59U+IXpg6JhVszLeepMzYDdxybfgVtFNldqwf0VNf9xKFFb6X/8+v0P9EX7Y93C/6gdZOdnE35JuyrK3znDFKUXHySbwC+SfpnHjXy21N8i5F+E0eUq6FgRmucwS3ZBOIz3lnWl5z+1oL3/p9E5Amc41sGQ6soAtxt3rWLfzzFcow/kd6jbjYCo1toWoBB25qpsUog2yH5qkwVOh3qwOAHAfIDfLk5H9jjS0G7Niwzy7fgZw/SskctoGwPSbAFbvmuPowsVHyghB/k8KHQO0xPsyqKdwxA272HeSOyN356Kk+FspS55PvgS30Yb30rpXjRQ6E1Jib50HNb/SP5QZEq/DR77+wagPz0i6P2PTjecS6e6Tf0zC+RHRihoQ2uCn5NwRxaazIpFKlgAjyuPzl1BLC4xL+zOqi6xOQ0my2dw+boC9VPtAAkGS/TBTGmE+CKJLnVmrtLurLxpKw2d0UBEdITZEEXwTMXNQQcc1LNKDGGe0AsEcbK1FKzsQUIhPm5Z6DIE0k5bkFjejVc2FCoNQOeluYPD93HqrHXjTj0AMr/MBAHLmaXgnQSA2XnCC26U1zIsFVabW/xxHKINy3BR/Iz3ejQT68mmwC4ANhKWhvJxUacDrjcAy8/nhfVrKaD+SbD+DGMTFEHx797rxKs3CcR0kFsWwobsIQbISR+D0FdgP8oO2d+DD5q7d8L/gWt6hPEO+7QjlhbXAHNsJ6NwQIPKp5UR54txQ6VZo9eKrMuU9ZzEzKphHhzEp1m+LrpI7s4xcMAMeFiB8XdwOcDtTehzRS+yJgAvckYOWJ4Itz/dyGCyxfOtCxGrgxIW+px3fJwYhoXhP6Ze9OaYH5EvAHygofDxyxqguea4nfFvzco5zORpcc+MypUpLxp93XsPjAOtr4b1HxYI6ledAPqdPm5GfvaFPnQO9N5DAobPuQVpxEUD+M00F/fCnbCRc3shQEsXnBFidvwukX+XZrtleebun4TM2dqPRCvqPmrovrF/dYgxoADBC2AVGIU9Uj4vN27SmxbO3UXSDhYN6oblLyMBVe/rvpa9iIwGK0H9EstBstfOyxIJhO1AzH5pQXkBQGbxMM/jeunrEXwzfhSG5LbWCmVd4i7ctg7hsXAPPBO9s4g75SexCzIcEEPTzHmXjwvXVoGwzUJtW0p5NgcVTU6cBh5WqXDdh80/mKv0ZrztF5wAPoAv+nn/e+5nVRIJP7B/T0vfx3PsLZg6ELY2cbEZnkwaQadPo6N4yo2p1mY/iZ5g/0VM0XfkHkixRNrQW9DtEvWfJwFX7rWf2a/kmtsMp0mIodV9VYHubEQ5RRAUtKjfHd/F8g73NdWh793lXSkG8OLOdoKGm/Y3bc52nxnPYVsAfKZbiKFM+8z6kacjVBBwNoJnxapxOAIQgA4gzvublK/Kw9OxgsA9mcY0rSHPSdfwMKss+0ZvE3FVwxBgOLQR2Y+h4rX5SW878tOk/wdcv3/+hf6VRqJTYv9dKCYUjzwOgQ4Jvoe0IfKf6TYG5oTQ/scZ7aJc/EGRFpGPAfYMC5bNj0i/swH9WtFkoa4dyoxOO9zTNYIdFcrP7Y0Vsk+9Hz3WVkPu5TsTbMXp+yXYLgG4Av0YzaAL73kQSL9dAvQDSuArwmkKWS+xQ2Ce4xtLTMpkvtnRm1qf+22pJ5AOvJBSHjGjDvihfVToEl+PFeEv5Tnj8QSTnij+KVOqoot2Gl/Wsvgx3bhW32BtDn1w/cWAWS3IodAcDumzzE9/Koi90Q3w++czvN4f5/OWKKZOAN/t8k026jPkrxYlxyyDJ/qmVB2APvvmU4iydMUwI3xtRqaM3jIktAL3+JG9nXZYPXfDOCC6UHRtdwNMMtE6usribeKTeCYmQapfegqr+KSxgGJgn6VLqbfKIBPE89sUuFoUPAROCV1vz6cD38WLg69gqGLiHa0TbmBKrA3BGg78AUbB5Jwbmp1baxvh6SnRPoO1pwGRBtY4ngB6pgfFtgF2H1sARbTH36Qe131pp08DO6sf9/e+tey7hqnx5QVh+nPN5ht09TrN9p8NfQBrXAZOICZUh8tVB/iSiESO6hvLVDwhHh0OA5IAyklLi2yAX5YywrHXVT8TZwkzc5kKUpl5VTIGWIkttaHgLqwc1YlhGHBcAf19Vhh+XgasSsHUsAqz6ddLlsj6UQ6AbyxAgeVnqVEqsco0v40Cm226HVR5VvAmnRt6NicvPH3YrTu2yEiu48dZ5TinUYxwnQAnstUQGeVco6MFgaBG7sqeyt9C7yhuycTh5UUAQk1Ec068n0G7q86XIwkKlZ+KaaA/BVz9IRTQa2RF3yRg9FmCEwwlKkdzoXpGBFBXQiAQqqCYCwalY0uhZeQltkZFSxmU/pZpAOHhvjvSkIgIHfBY7uGOHcxJxkmCeQyoJepINA8beUxWHOKDq5kmjI15+4gO9qIHGpaJrkXUJ4eQMIVl5QmevgdAD/VoYDEgJbh/eItFMxLJEwPdoNh9nvjw84nRnW/I91sHYnFt6Dy00EMagEYxBU8AvVab4M2wSRwxyuh/hTv5+CDjVucx4uejBy1jun5f4g2cIUrVPMUqsifCuTR9vh8AOx+tBvovdt7+7BOS9K42jx5QPObL01NaW/zQExsXuw6ud6BFPocKQqDwRAQIyd+VGO+dcIu3tyiGVLQtVV/Hxgiqb7mIKqE7EftMZA1QnpRidvs8IjzUSQF4hf03GA2AIRABRukbFwDPPv/SBmWUDMC5EVpN/y8zOLQ8VyLYLOsSQz+jmWEGiZgf1peJsm/CBx7fDt1mGBj/gRm+iThoCX85X4A7U/RczZ+nMKVzs4QNNFcxCuqfxHM4//wMCn0A7vX/thRE/+x0AJrJEDnC5KYvfYxBIu+whipdGHG5BLvgUKTEVqf3NtyNqhl/MLiT83xGqhgv421Nhhocx4jmVpXdGV5gckOwOLXAmZc2EWJ6pP95qASVjvFFZa8yP48RmI6KWtiLUwYENHGO8CLup+jmOt3OAPO5ALy/BSD4ISU0EmZjd2yWf4L6oLA6Bfo2BfD/jKWJiwZnCWNpdvTnw5vzEF6d6CVLQc8q7FO6zSGawPaiVcE998Z//sYqK5mPgkCMkLitwyD+KOz0my3ECyqC/fT1fh9Iv/z8BT7H0L3vIv9rnyLwpQsuCIOSoPppGD4ZASE4yM/vuCVYDoWY5jA23RyNkf5hJQYrLZ6UYj7iifwg/pqBovL3ENkMjM7BBGl0wiExq8Dt2jZF+M5yDvV3P5trMGIKA4nyKUObBzBKGL94gDwIQdXYWDUp/Vp5jtiZ5c7gbuxBuGqtA+zxb73Yjb0x4I+cXsaffj2eJwRpIyTmjPb8ubJmxTp+Fzt05b2XwXWkfwpH+teX/EImAccg06E/xSL055fD+v3+oowfu8d/wYIW+gEk9x1iEubvIYzURTtYfHsQ0lGmMCajmmWZodKMHVakpXNq0NAxlBZosLCDaVOFbEqrrXruz2cFR6cnwCfh+uNZI06PadA9LDqHF79NKdVS64R+cGdVwTQcoWcld+GftCooQSwrBRZaw9479RRAr0YD6RRRvgOGpoLmKoUF2VuKmbiyarnwHyvyM2braQbWVTAGeyfY5o6VhP5wPh6Mq577i5JDi4NVWKrq8tiD/vTOQqI/cPU/Cw3qH6wNyQng/c/7+RPWz1yAvn7l6wjQJOA6l8c0cqRkzaIGNNn+7hMCBNqaOAJUjfW7rVUunouxMUsaTzaIhydgFUBfaBu61GbW39YmfK/pruMHMsE6DJSgnFtu6Fu1iSWG7iigWiu7q0Zl8WJDagAz3llPYtL9V5LquirDr2c5tQk0x/Frwt+lh30O4E66PTSxEHMAZi8jnoZ/rB4rjpaWZLCPI5gTLjK8agUmqHD+BiNQQTLCim5M9P8aTsxPCl4/Du7dLfR+WDROXz/zuvfpN50A+lPzuf5wNGp00+0e+Jg2iIPeQVEOiNRKxztbSeE7QA/auhB+Ef9Itwp8McAbfKv0uPwXL599tYXfDLv29Zqtdz5vcOlqGr5aL7WgmtBuLyBXwajMnytSh5iFTS4gF/pFzd8Vl4kPyG+oYmHgXCWGQT+MARJs/MxVC5IGo6mB2+XUxfvwTUExwNs2CAWJ2CQY+ctVvFI+Q5SlG2ZpsxHAY21sxuDf2fd+N0aysU9hMDDZHjyvoszQHqt/WIu3wUJz84/X7I+mgP506Zj+XFKIRQ+a+3K2GIDdvV3CEDqefVWWjLwKqW5FkMptzFwZkO0mRs/I/UPn+dwzypLo9Ak3WQdLcR6nrF3SBNiHi44F6O3IZV+/MFDKW+P/2QfdUDIZVInxjpGNeIl8ZsR3pYCWGCCgtMJlDaACvK9DQNlZqtupE8czHyR2MAE4ZnW/cX7t8mfBz/xwjNBriBayO5pPWqy8xr9AbXE0MPr7Ov0YRef3+vIW/motqXAUx9T9hSa4CEC0sD5ga/8CoHvD1b//naGfPW4+R9NU8AmCx/psf1WJjM1375nbiYyOKFGbFoAzcjunTMbASO86APH7xbKfYc7+jSCdfc5YlvisTpsCkEjF0Yp7pJYp++xCBfhVlPQe5AAjFUWKV1r7Q7DoUhLTHMBn0SY5IOUAX/vcGQWjHf8ivp+ecE+zduD0ofNQaC+L+qHXCtGsaRNCu4BcVcEc51MWjgCJeU+/JRlX9hNwFU+jj3eilnOd0B1yuJLsRnI3botQKQV2wTa6pXbzZwLXNwfnE04A/SP50P1OoolF8ubDDWpwrt5et9f11BNOvl7ryz5LsHXU4SEOLpJ+tFN/OzHKW8WH/5jmp9cH6yAkbfCWcXGgDY8uF+WDAa4wciXGde7qCIDxuJHrNlAd1sgGw1eFEM4yxNN/V4KclcEkPa9oIjjthyhJVgFbwd4HboZlrKU8rAaVArBkNgnhZg1NHoeG4v3Fey0rwDtSpx2H97bgPMhOAL7un18G1KqFX7NKG7Ud7OlxwSQd8xRb7A3fj9My/fP244cpIN9/uB/45/+oIPpmxX8eEhLAZvEBUzVjzH3115bNJsed5A5sIzDIH4B+zA/DUiL7lUogKHbuPQ3Fzyz3LovPMc/GhvVg97O0Bxf8L88ipXhxU+vGf2sGozOGkECp8pWGMN9pTeC6U2FtK4y1Fe30WVQzt3P60hJypi7vo1FE9D8rQ2GCOrzhTcv+WknyMGzZqYDeHfOF6KPhutx1Y73xHsNcuQceMpAx1BI9zF8nqf+DV79PCqLf7wnoD0ur6xd4GjbKUh+mEWygvkxupTmOB2xzqUScCO01e9oJj/Ll1F8hfOjmU25pmmQXgFzm6Nxda4+SBGdTQZhJ0P57VhaOARbz0SH8Ss1UZNqlFFHceY977IFQVw5O8R4E97NdxeSU5gn3Z9EvQ6PVGiqCeT2Xe1YZdRBhgxwRCvfvqNFdshFKngeWV4vfCmFpvBy8kyj/G9AxnVwOsUKtm9aURN5KbiGt5ovcXbqk38eA6O79uNl/CHD6A3wAn27W+qNy0xr9HEM5V7izgBzY7y6+QsUBgBp7swsXb/zkANFWlcv9XGDdNFCQ/hy1w0q6QHhVOZBjHTAUfebgmlW1X6+8G6TMWS48zIDzk8EYgyzCw+ve5juKnIhEgkC/vAbMWc9y25SqE7Q41IJKwpnawZfOL6C5eXbuFXzvU4I14zRrisFZFTQYFayQ874wPLWrxiQp1tSw4Qamjb37Rn0MDQartiNe2dv1Je+DtJuFX60ghdEYlOXfz1XK5ytXvm39fIIW0FvjXvtj/pvL6elu1fPC19vVl4FAQ+IsKwTP6cUWJK4XybKnJkGsC3rHhBLkY0EhPAgJCc0pO+J8CICI4ScHgRVRswCxV0LBwXC/Svyvxi4jgFCkDAkANc32FAA+379gXoptOVDPZhrgv4U/J+rjEpAnGI7lxvo5ItQCzqIVM8SajMUQaLVi6qByoKwOdZYwioH+6UhbauuLVRNZ9nXlHWy3zw2mAMv1S31EzUv2js2s90vT/7Ckcf9BLaD+Z/agfyo5uX/gDfvgqaVF/c2ePvQIuTnkerBNA25db/u9OuOAYnRJQ68DgUbp+LAUS2JDGEawULg4auA0thocQ6aCKF7mCqpvwiCvbPaY4HQWBWzkf6ajkBJmQYh65vlyt0kf6aUdcKe36B3uWZplaITZIxaT6UG8n0eMEwFtvCcLszL2yS3aqU//xNdcvwWV1lrDSE/Mh8u5LwhBVP5w7UpJkLVfyxP0K3aWHCy4/9DrJ08A/U77wX0+RivCy9KRBHKIRor+cg8GA+FqBPUF3UOZtBWgP7ovfR9sgdYH53Ml61amYlAwEXiAifJhaeZkf0kSiOYF+q8zjLhSYbkew0prVWnfyCb0Sg8FfOCoGYIPAHgXFhkbZQLMsuNyBo9xAAvm6aDFN6A2gTsmU9ZUBWJGWKD2vf9azI1ooN19l7YUd2UmqLAw5RpmAv5S8RgqLXDB/fPf9031i1LEQvN78dvf70eqT/EfvONZvz+8ztkbwmb7E7KUm+bADZG0IjlpWP8ZIQR8c6kjYbZCInSx9RIXZWuQoybtKsO7OpilH5jr8Ouix7Khzu2y0VjoD4Hr7PgACpEAciTkpvi5zdootHthoBm1YCuAGugKWuiUu/RMBzFvnzATyWgFMWFmKnnijTUPcLZYTNl4ON9LCygnrJLnwdBgGyz3pvAffaJXlBLKFy9Nuu8yiBOTJGU/egmzlVkNqD9+h4vcLmZZdir58CTbz7Einy8H3T+35tftP1gFAonPCpQ8/UhHVyz5KftGt/gi/L3mizRCk83c7HmkHcjdkFQwIa1aMsEjEAlunRUAfdod5hn6E3XQnug5JfWFAj5q2a1gHslacUIVi0KwQxZs+3b+Ko+V9xSIu8wAXgDu9aXdvfKF151AlqJwF90K8qFFtL0WCEGbfiZzL5dwYUFIV6iR4cw5C9MWLiI2zzpldwsFQbnGzxEUgAI4XeEf/GHqv+sVWPT7zWoN/XllkfvbWN/vFSYCsCnm1V0xYsPin4oC4PyddCxkB8LV6YNA7B1OeBDjHMOTZn+vhACAX44DmqIbJpzRrKuOVSAAFBHAXZZ7sZeQRaYiqMG8GEvnurmJCtvyooZjrYN0BS1iQKyv61cR+INkPV32rGrvzW/7ivU4GJ8C0aeiqDQnFLzv9yFWn17w27/QWOONuSo2ASfNYhULF04USv5WbqKHQWspiBgNaOQ8mW0e8Q0s/7vJ6v9tH0D/kI72Cxb5sGAnzABqcTTQSy5xcsM52LtzDehnKbt0dWkbbrHopP2wdFxnDD4I3wIdWAi+oPt5uOvKnBa+BA5n5LrH2MhwV9G11Kkenxju7T3f3BrXL+2bCvSNcsYIoGcwNIrUodXhiuixa5ixkn0GfwF9Oy0Wj7e4v3BetA/p1fJHKNKHSNUjcj1NrS5oIRmzsMxQ6YFxA/2BfW/45fzFt8DO/4f/X7s/AED6reFDv18hZdefTfv0+6NIJ9b/bYdEGnQfngFagGtH+xi/eaSKwTS2QoGhHSTbuovujkXj4geuFJifISh6mmm0Q5hvxrv+I7/oraxlVDDuQOgXgN4jXfQ2KlD+vljZl7vFBHkyCWL4j+lyDJB1pGUOfAYQxe8Ki3MQiybnns+h/QDwlwgr6HhwH8qJi/cOm3mDOQeMwqJYdB/CR628gJoxBWwHgH2+bfQhfezy/bHwcXo/mxLv9yWC9Qe7Afrn08d+wGvdHQcHzQ08UtMdbAbtEfCXvQfasyeEDuEcAO3PAOBaPoJSkgG2YUQJGenF8YDGZw3Qmc0+0KCc0FXs/XsZxhMEQbNGUDiAzt0BnL9AfrCsQlw+ZNH//0+IFjKuAdS0g97HwUwjVuHcO7RS5qDkJD4sPsQPGI+cnWyCnouAs/sQISodCkZF44XgKEFHq74W6cTToDggRszUrZp+3XAqwMxb36FcljofUFfrrfIH/ccooBfol36Q/nX/61OUxaYclG+FZVpT1HtvNbNV377kKMMsQPEVZgrkN0/zWcA4X3dSQBQfNFx2xP9YUIgB2AUUHsqbPnaNq2QEjqzcAlRMKsxQ8lsfnlUPV++wInQQYLDVKprD7P1g/20NhJSQK9ICYjhqcU75Bb4dGbro5iEaF9o3PC+aAHv4JBfS3b2sBHFjQmuIa+PdvRMruJ2FI66Ej//H3hnoxpKjUNT0/P8vNyt1ro7O2oomsp7XqdWr6HVVGcCVmswFA6Yp+mLUjsOFAP2OnrqY1NzWueF3956Te9e/3uC5+mtW1fj8dNUrAxmtV33d5xRKfRi7Xi9IY9QrtGKwxpfG1+dq1NdFhmuIH4kP24f4xfPi6cYY9YJeNbpGReTzEZWePCP5RWoMGEInH1IVZfNLyfseoWT6rmHOHh3mHjVRR3dV9WAoCimBQsm0pHKCpUelMEqjNNvA5HbOCqFhzjGuSqxjMpkHbIREN7ScwwDZF+6PXJ0kbiQMx7PjbrOaa7R2xGHHUGrjrpkQH1PsPypzO7jC6biCIUx6X9v537H2fwdG7oPpA5RvMIPCQb5gNeOvAjKD00ZuQ/sYlg1kvwbmg2EzhfTKVJA8UbCVRxvz/LYqo6MilmOIP3MkxBVNOeeaL97PVBgDBsLzUQa6i7UxOSFFI404Rn19AD5V5MfTcs+wH0gf3+fnZ6xnreThhi2w/4ZV6yGhf65hCEeHohSKBSe0D1MkUQhZWM23Ioz35+miNlyAf9R7OlLvKNRzZhXG+V9b+vTv9gU3wPO+bahHGdLfucg4ue0b2J9QU+68vX0AerYJ67oBYgAZBS9YUQrrbE8gIg0B+LbR4hzhzhyv4vfi7BUAj9SZX/+iTVKjO6zJaWdGgX6HtdERavmb/X2ElcicgV6YZTsw1WNNZoATn9GkyzaHQR+k1jApU6ScocnRGRXVdK7joUPGlWdmG4gIGPuN6zDC5FwSd2F+mlvNw1zHvY156/l7fffF90UY35/InP/CXwmwAPfyuTmvOM9IQBa5jBO9aUWWLEsoBnL+Qar4+j0SGmrFbmQGEgwimhRCRx2/FjcFrr++5HNnOwFns9DIaMPkv3CNyBKk0DXon8uWoSi2wVUy6EVGHfwloQKIM0Log1Hhe07u+jd/wjERA7BTXAibkSAReGvkJehOvCZ99MfbJmCC8wjrDMi/ze1I0AzxUStu/0r/h7CD7FkLsd2YqH7vG8/n/vLq4PprX3BfJ2AdZLWTDSKbqKvXy+M14hwTq4nkyA2hfCSjTrbAgSE/gGwDSixO3CbKGvVDpyohfCRkBbAlgWdkpxxArMxSb1Gdk/7Wfnp0u7Oqr7qdS08eoF2AC4/XB7jxkYRKBoE7sHJmNLYKeBHBHUeW3goIKyiERlorKXjkZwnOQ63wRB0LCcipoQX8+30gswjDhsI7/vgDQkD7Pu99H/+8QjjPLg8Nli+7zPaxy3Yg9OR7BxTOYQDYxQQN0wEvXjkEqY7Qa3HxHeqxwtx4zMLAOmdOEwm3HGdf99iFMDkNkFBRFb1RA+s5d61d9eykMI6ahksIL6Z8miEfJaoWAfArdjLdUIzVCAHTYHBG51h9z/H/CLJOeb+byThF1iNcRbP0KSDF1flV+3n87AM+LqSzL6eOzHdhhfXIRhzbDx9fvfjBMnwNu+aGcD7WwaljXfqjkYSJi6EBpuK6K9VL6Mh0GCEAmzk4hxEG5nFYBxXtbMFU3OApDPg1OrGccMwHXNI21ekS5+FLO8kGO2trCQA86ox+oDa32IFRNDdVy+2oIQKzePmyG7IR+Ob+MOiP5kraGYYlP7586xeHQPHRO3LTL/EHg+zccnEfLn74tHed5toPrVyLuN13Cm5GHj2uKlFwk0gOfrcxnMiJ8BuGgjB59I4WOTmLFMEijSbYM9WltqJAFVE+isXKGP05Ob4zmw67+GEC6o3xmd4HEf64+wHySp0m7MFZLNAA7FUIhBJw2t0yDN8pHQ0HhmEqFuISkO5aOzCt8R9uQHGh+RQfCtuUUiApEQIWJkTH75FEgyce5vAHp/vBk/1I0b7nfh+R9g3ApbLZW0GhCxkOD/58XAhrvHaqN8QYjKBzAibG+bkA37YjLID1XCaUmayqlTGYTsyWIVTaCtl/ZyTCXf2hSP9AWiJtI9GDgeVgquA32sBpDqdsKxnjd0bhDJTKauRePbUb3rWpkrA5071bvVahfl8xZGCeSkPLu+zM5fKgai9GqAyKcsf5swSoT51ovafdCVrIbGT7NuITd137G0C3j4T1jD0U+y/3Srb9gn7naYWXk8vujWEteGdnwH9HXUyP/YgqATb8ihqB0zNf9OmSEUxVO+iTe/v9xS2WLbYAoQXZiwVDcy6WDM0UxnhZko4iUHqt+VTYKHcsDdqtOoD3XLekZEQE5UA4PwzAIk2MJ+L06VVXjHjFENYMo0kKEITKw72ZEkOCRgWmEDgQQ9f1Mzd/3fdT67illZSvDweaUHLuv40NzP3sk0PfSQaM/grLGJEJEDEK5nPSooG4fmQo/ZE9scxqe/gxwY+EfaE6P1NBlmVQ3EiWz9cK4qPavVIjury+UmVQV1dXADrGwwlddHHu/KOMtKMnYqoAqg78VwbkgaNF/EbtMK1mQLzhpNhzGOxdx+Me/N8YAxS2qSbleXNLPanHfv7/uKlHFtYHkA3Bh24ert+8PNmWvftL3X9FVU70Ls51mYM747eR3PuQowGPvyNuhTXBfn1f5POqah5peKnB70FwpurV1TXHdsxbPZoB7IQNQmNHfISfaI1NxLQ/DGE8+LIVqGUzMJfuvQocg8TI6FSG+i76Pry7MBR8RNn73aMkBaEDztGuVYBiS+KADvrP4SVN7apOUR4Xs306Gmwoqf2o1sEEyMYzXCjIOV+EAP/eEwmUBcT+JCec+wDrIujeEmGYLcNQ/hmhsCzPIOGIoQ8o9mP156de1d2ZLCf4ur44Z4wvbqPuC04/76eR/tlBkL+4tJno0TExACMgTojIWWGJt5oIpVg1gRTbgxWLUVTgdXjXQqDu2XC48TJ8mqdjbxLG75HTNH1OSVXwZp6Om4hcABzmfUAO4GpS/nbmdkPJ0edZx3HXFSuvCY7xzKHNcR0Yy4EgCnj4MSM/LfpEkrHIOSyccOCTo1g2+qKG3z+K+OjC03HTILf/sQXnEwqQlmXEUsTY/MO/nxHfNIY5NdcA+NwsYu4RYR+fYdNw0b/ZUuz9aO+I9TQrYpiU/Pp50JgDfva2xRyIM58vL3xo+vBCL6Dz8f2ndw08UIO78GdnFhg/h/BzC77PhfkZcFwIaatCyp4+MZvcjUYdo1goIjzOBev3QDBEEN4GYnBAb4Y5MhNfuBk3nu5xXVUu/udw2McFpHPkJ8TGguCfG/dz2TYS6IGVU/jddTRjSUC/35iekFKQjy6ZD4JCmIIobzF6fWANBMOudWqDYSv03X8Qebg+kJc+hRV1Grl2mzScNvhQd57wduhp/zDQL2WjVJUG/ziXYP+VBycrbPK8jpg39Eap40PMaoskxm6ecKr6x4V3WQ+cigKB9F1tErPQ91mKjGnf/pei5YTd9gokwhO01yrgHa1y15mxnSKw4eBWdaJOLePOzx2nfT1vP172n7lDtSUR1Kwo+mOp1A22Y1v0N5DkeQmMuugXH3rXFyJrl7MahqcfTkGlZWX7Vr0G4fXZBnAyHQ5ZFOUEpAzPPruDi6i8YJ8bVE5qR0NoNROFncefG0CD/xgLvSC/JVS5rVssRzS5zpP6/locYPx4Lw4I8UePYbZg8EVmAt0RwTqByl4EhIGn6ObKUnMK12agaBrBfJ2sRCG080d+PxS+rf9+/uDAXFVPT4JfTqQ8v/014Dt751Vi4BPGYOUc6JdUxnK3wLrPIXj8I428OkhPCYVgtRWEjwmhGrkRCgNh/lLnn/BO77yZNu43O4GTU0BOCG74lpLxfg+MjquDDLNgtIfky9dI9U2we1T3YGxMZoF2QBljKgV4bGPegX3syIU17gM22T7TitTTg+bo3Bi//v0w9w8nTVUDZD+6HJch/KLYP+U/tgjO9kZaMkPjs2OvOSC3jUOOEHXT0Z4xcU5bewe8HMLxUtAeCAuVu7kRhA5Fg2gbMRsAAFWgSgTfoZk1EKRaIX6cJ1i+caAScnJsqRsOBtnBZZ0faTa23T/+HveTwBt5j0tpUjsg+ymBAyjPg/0as/F97IVz6XLy4L0J7Tt51MMMX/A+GQM/w1IT2jyCtu+GmwMG1iCyc9+/dJOaN0INp2kZ5jv2V+wvg7tVNkzz98WIwapgEVdPASINcQl7M1lrS0GmRnDeE0Zkab/v+p09t+dTegg+/6iLVT1oeFQ96P5reUziCGBV2zZA2DZgxn7+RQmi3HPjO7x9vPLVynivLiGe4u0x3bRimCG+DPWMFx2AclsA9fydwHPhf5ER5VHczmGtA+qBRkhLA1FugHKmaTTLFKDYI2YgxFNc4O5rkSHdN5bIF/7vuI8hiwfS/0ujWAcc3othHwZPVZGazb78o6zUerHwzDiszp0zrAPl7rqj0TXQj2IhMiNICYuN6rzwkODg+aPqm1JPUQj7MBn4V1//YGGgSkCNp17Eeni61QyorxwXbhzEwmEO/zNsEvoZd6A+837bbEIfzkHDcD9sfb89zPPSmRsa6jvCczLv95cL9yc92U8R+MWjD+AJygFo4bEhGue77OivzAZ91gDrMmC94x5z4mzwcPNQJ3rDUzjplTodf4c8WLm+olDCVNyGpjvDK0DtAfO7NkhXMhcxSSHSic3cKuZRXCcnPR6THsDKh37nx9H2B+a/H6uo5xfkPH+L8rVughsr7tm/Z3vxSgLpGWGQi2Kc3iQvFGpGNilgEaaeD2snUJj8NWBTWte4hy2xr/7hcR1ohJAyuEe5XfvCfzeXztHlbDJBonePKFA2gdA86rhhYYES8g3MxATI/17wuh+gR8+1vZ+ngeifb8TqbkHRganr19dN1YWJdo9WtMEAEdK8vRWwgRokSjtKePOTsdzRsowm9TSnD6eCMpOyaMnY3Dnh/Y5Ubpt+COqo6UcOD1GXDjtwyw9Rd3PmGXiWCEX4PdbWnAjZbY9IFI/u2ItwDy8nsCBMVSFtHHXxL/Mhk9azcr21YYsuNOB+svIN5g1nZKMy6o911nXMvaoUNHpNIZ2pLJ9bnyslnV5ucChpwNrDqwD+MYjmjkSXKMi1okJeQTSyLAJQgZeP5484fnw0x1YpUYwybkMh4+urfObIXNDRbOefkBQLg/NL/PsxH2RvIsOt9dPG49U51U/O1O93//97lKM9Tq9WcT9eNbphXrO2sgfhHmia7IBkjO5u+KbeELW2eI5kHrK6m5JTyAm9I702CQXcC+i1lYjbDZsNgSuEwqfoEGxG/HZuQhwdhs9HtJ7Yq1WIXKn4eFTJ36+ORNVDt8wdEN/vBHKin+iGci6OvMkN9ypg/CJnTJz+60SwH+6ij7WTuLYlOeezo8/z88FZDv6glnTe1cshAueFiBGR32/nvCgfAtfRBcBPwuFWtD+DFe65BDQEa2nE/x63Fh8XLMR+BW394i/I3Y9N7a+/HunRPGDFZtQXajO+WoFhtK9Sd2YMB4JhymQ2HgB+NQ/1L//PxAIFYisQW8D5tCkW4Y6FYcAmZq4OQs0UCxIPSd1RRn7r9F6w86X01xFt/2Fubl26f2wkgR+QTa17uaDaTuT+PdS4wF0n3YkNhlJoI4C8tENzCKT5GEkRu809U6NhLGrULrnHW7053VAtHJHNKQSkGWHyQc63cunHznOF4FTvaiei5oxr8rPbup+MvWCK6kzmvE69nB+M14U294/0mu9/49jVpcmBVrpw5MTZWd144zCSLZB2bUtwoL/mxMH3GYtueOj/QwJ4TE3iWGuEm9D8IFlcUEa5jr+GaIxGWe4Q5Ja40m4InvHDf6UH1tzf3D5gY9fG27iBgXUgcHxhffdwO7GPnifbqlyw69TeTFu/iNvPnd/A6IzkHtUmsOmXbwYA93d+B0DczeIWBgePMrY2lx6whJbh/Tf8oD1T96Fm14w9vjspIaD6HWWz9cSE9sbqj8GN8Qe+mRr7byl7eBMDEmTmZt7H2kW4ZdADUw51UJ8O+qFbSTPUDhoRq6GmPiyuwkHe350CtEPn6aUOnHjuFpP6Sbbv1p6eA++wLwHd7vvZYL3kfm6Z6/u5qQv6WblvyN7ev73tQDFKvMgHo3zT1hwCcstnGgCFrbtZhvz0Nfirg4nNO96DmblVOHg/icof6pm/mfvA9awQBY/xzwHzUD+2e3X+7defS5vUNHIv+1QXU98PaGTb3RTOVBeOvELs+aFhfpYF6RsUKlGkJf4ebbj65J+LNQqz7R3/aedOshAEYiCA+u9/aVeunZKiE+3Hhhkyp4pm0pzYL3xcoLEufVPzJw/PaU/qornd/+geDpcpfSMDNavuo5FBAcjtP0JS8spGDY/lzQPEq+mmQON4Z5BCk31tMIbHFy+Yn2anUO0U1sVNFwUc+zPrqPio4o7Kn+eLRvizw1xNJGqrGAyv7MQfUuG0mH4NOtgA7Our8mWLRZoTy47zm3GHXdZYiTmDIQjEbo8lANblheNYb1T66Br2CgrXdsSzHAvK+1hs+PmUII4TqBCCfQTGHcEr/IdWLhm9AAAAAElFTkSuQmCC";async function ge({name:l,renderer:t,values:e}){let i=null;const s=l in me;let r={};if(s){const n=Kn[l];r={...me[l],...e},l==="colorMapFilter"&&(r.colorMap=await m.Assets.load(qn)),l==="simpleLightmapFilter"&&(r.lightMap=await m.Assets.load(_n)),i=new n(r)}else{const n=pe(),c=Object.keys(n).find(g=>g.toLowerCase()===l.toLowerCase());if(!c)return console.warn(`Effect ${l} not found`),{filter:null,render(g){return null}};const{fragment:h,uniforms:d,label:f}=n[c],u=new m.GlProgram({vertex:Mt,fragment:h,name:`${f}-shader`}),p=new m.UniformGroup({uTime:{value:0,type:"f32"},...d});i=new m.Filter({glProgram:u,resources:{effectUniforms:p}})}const o=new m.Sprite,a=m.RenderTexture.create({width:t.width,height:t.height});return o.filters=[i],{filter:i,render({width:n,height:c,canvasTexture:h,progress:d,values:f}){(a.width!==n||a.height!==c)&&a.resize(n,c);const u=h instanceof m.RenderTexture?h:m.Texture.from(h);o.texture=u,o.width=n,o.height=c;const p={...r,...f};if(s)f&&Object.assign(i,p);else if(i.resources?.effectUniforms&&(i.resources.effectUniforms.uniforms.uTime=d,f))for(const[g,v]of Object.entries(f))i.resources.effectUniforms.uniforms[g]&&(i.resources.effectUniforms.uniforms[g]=v);return t.render({container:o,target:a,clear:!0}),a}}}class $n{pixiApp;effectCache=new Map;effectInputTexture=null;scaleX;scaleY;constructor(t,e,i=1,s=1){this.scaleX=i>0?i:1,this.scaleY=s>0?s:1,this.pixiApp=t,this.effectInputTexture=e?m.RenderTexture.create({width:t.renderer.width,height:t.renderer.height}):null}async processEffects(t){const{timestamp:e,sprites:i,spriteById:s,spriteIndexById:r,spriteRenderers:o,transitionSprites:a,clipsEffectContainer:n,clipsNormalContainer:c,postProcessContainer:h}=t;if(!this.effectInputTexture)return;const d=[];for(const f of i)if(f instanceof lt&&e>=f.display.from&&e<f.display.from+f.duration&&d.push({id:f.id,key:f.effectKey,startTime:f.display.from,duration:f.duration,zIndex:f.zIndex,values:f.values}),f.effects&&f.effects.length>0)for(const u of f.effects)e>=u.startTime&&e<u.startTime+u.duration&&d.push({...u,zIndex:f.zIndex});d.sort((f,u)=>f.zIndex-u.zIndex),h.removeChildren();for(const f of o.values()){const u=f.getRoot();u&&u.parent!==c&&(u.parent&&u.parent.removeChild(u),c.addChild(u))}if(d.length>0){const f=this.pixiApp.renderer.width,u=this.pixiApp.renderer.height,p=f/this.scaleX,g=u/this.scaleY;let v=null;const x=new Set;for(const w of d){const{key:T,startTime:y,duration:C,id:k,zIndex:O}=w,F=e-y,b=C>0?Math.min(Math.max(F/C,0),1):0,S=s.get(k),A=S!=null&&S instanceof lt;if(n.removeChildren(),v){const P=new m.Sprite(v);P.width=p,P.height=g,n.addChild(P)}const E=r.get(k)??-1;for(const P of i){if(x.has(P.id))continue;let R=!1;if(A){if(P.id===k)continue;const B=r.get(P.id)??-1;R=P.zIndex<O||P.zIndex===O&&B>E}else R=!!P.effects&&P.effects.some(B=>B.id===k);if(R){const B=o.get(P);if(B){const I=B.getRoot();I&&(I.parent&&I.parent.removeChild(I),n.addChild(I),x.add(P.id))}const W=a.get(P.id);W&&(W.parent&&W.parent.removeChild(W),n.addChild(W),x.add(P.id))}}if(n.children.length>0){let P=this.effectCache.get(k);if(!P)try{const R=await ge({name:T,renderer:this.pixiApp.renderer,values:w.values});R&&R.filter&&(P={filter:R.filter,render:R.render},this.effectCache.set(k,P))}catch(R){console.warn("Failed to create effect",T,R)}if(P){const{filter:R,render:B}=P;R.resources&&R.resources.effectUniforms&&(R.resources.effectUniforms.uniforms.uTime=b),n.visible=!0,this.pixiApp.renderer.render({container:n,target:this.effectInputTexture,clear:!0}),n.visible=!1,B&&(v=B({canvasTexture:this.effectInputTexture,progress:b,width:f,height:u}))}}}if(v){const w=new m.Sprite(v);w.width=p,w.height=g,h.addChild(w);for(const T of i){if(x.has(T.id)||T instanceof lt||T.expired)continue;const y=o.get(T);if(y){const C=y.getRoot();C&&C.visible&&(C.parent&&C.parent.removeChild(C),h.addChild(C))}}}}}cleanup(){this.effectInputTexture&&this.effectInputTexture.destroy(!0),this.effectCache.clear()}}function hi(l){const{pixiApp:t,sprites:e,aborter:i,scaleX:s,scaleY:r}=l,o=t!=null,a=new Map,n=o&&t?new Yn(t,s,r):null,c=o&&t?new $n(t,o,s,r):null;let h=null,d=null,f=null;o&&t!=null&&(h=new m.Container,d=new m.Container,f=new m.Container,d.scale.set(s,r),h.scale.set(s,r),f.scale.set(s,r),d.sortableChildren=!0,f.sortableChildren=!0,t.stage.addChild(d),t.stage.addChild(f),h.visible=!1,t.stage.addChild(h));const u=[...e].sort((w,T)=>w.zIndex-T.zIndex),p=new Map,g=new Map;for(let w=0;w<e.length;w++)p.set(e[w].id,e[w]),g.set(e[w].id,w);return{render:async w=>{const T=[];let y=!1,C=!1;const k=new Map,O=async(b,S)=>{if(k.has(b))return k.get(b);const A=await b.getFrame(S);return k.set(b,A),A};n&&n.resetFrame();const F=new Set;for(const b of u){if(i.aborted)break;if(b.display.to>0&&w>=b.display.to&&(b.expired=!0),w<b.display.from||b.expired){if(o&&t!=null){const N=a.get(b);N&&await N.updateFrame(null)}continue}const A=w-b.display.from,E=A*b.playbackRate;if(b.animate(E),o&&t!=null&&d!=null&&(b.type==="Text"||b.type==="Caption")){b.type==="Caption"&&typeof b.updateState=="function"&&b.updateState(A*b.playbackRate),typeof b.setRenderer=="function"&&b.setRenderer(t.renderer);let N=a.get(b);if(N==null&&(N=new ue(t,b,d),a.set(b,N)),F.has(b.id)){const H=N.getRoot();H&&(H.visible=!1),await N.updateFrame(null)}else{const H=await b.getTexture();if(H!=null){C=!0;const Y=N.getRoot();Y&&(Y.visible=!0),await N.updateFrame(H)}}N.updateTransforms(),T.push([]);const K=b.duration>0&&A>b.duration,G=b.display.to>0&&w>=b.display.to;if(K||G){b.main&&(y=!0),b.expired=!0;const H=N.getRoot();H&&(H.visible=!1)}continue}const{video:P,audio:R,done:B}=await O(b,A);if(R&&R.length>0&&(b.timing?.fadeIn||b.timing?.fadeOut)){const N=b.duration&&b.duration!==1/0?b.duration:b.display.to-b.display.from,V=R[0].length/L.sampleRate*1e6,K=A+V;Ri(R,K,N,L.sampleRate,b.timing?.fadeIn,b.timing?.fadeOut)}T.push(R);const W=b.type==="Video"||b.type==="Image",I=b.transition?b.transition.start:0,D=b.transition?b.transition.end:0,z=W&&b.transition&&w>=I&&w<D;if(o&&t!=null&&d!=null&&n!=null){if(b instanceof tt){const V=p.get(b.fromClipId??""),K=p.get(b.toClipId??"");if(V&&K&&await n.renderTransition({sprite:b,timestamp:w,fromClip:V,toClip:K,getFrameCached:O,clipsNormalContainer:d,clipsClaimedByTransition:F,onVideoState:()=>{C=!0}})){const H=a.get(V);if(H){const q=H.getRoot();q&&(q.visible=!1)}const Y=a.get(K);if(Y){const q=Y.getRoot();q&&(q.visible=!1)}continue}}let N=a.get(b);if(N==null&&P!=null&&(N=new ue(t,b,d),a.set(b,N)),N!=null){const V=N.getRoot(),K=F.has(b.id);P!=null&&!z&&!K?(C=!0,V&&(V.visible=!0),await N.updateFrame(P)):(V&&(V.visible=!1),await N.updateFrame(null)),N.updateTransforms()}}const U=b.duration>0&&A>b.duration,Z=b.display.to>0&&w>=b.display.to;if((U||Z||B)&&(b.main&&(y=!0),b.expired=!0,o)){const N=a.get(b);if(N!=null){const V=N.getRoot();V&&(V.visible=!1)}}}if(o&&t!=null&&h!=null&&d!=null&&f!=null&&c!=null){const b=new Map;for(const S of e)if(S instanceof tt){const A=n?.getTransitionSprite(S.id);A&&b.set(S.id,A)}await c.processEffects({timestamp:w,sprites:e,spriteById:p,spriteIndexById:g,spriteRenderers:a,transitionSprites:b,clipsEffectContainer:h,clipsNormalContainer:d,postProcessContainer:f})}return o&&t!=null&&t.render(),{audios:T,mainSprDone:y,hasVideo:C}},cleanup:()=>{n&&n.cleanup(),c&&c.cleanup(),h&&h.destroy({children:!0}),d&&d.destroy({children:!0}),f&&f.destroy({children:!0}),a.forEach(w=>{w.destroy()}),a.clear()}}}function ta(l,t=30){const e=l*L.channelCount,s=Math.ceil(L.sampleRate/t)*L.channelCount+e*2;let r=new Float32Array(Math.max(e*3,s)),o=0;const a=f=>{if(r.length<f){const u=new Float32Array(f);u.set(r.subarray(0,o),0),r=u}};let n=0;const c=l/L.sampleRate*1e6,h=new Float32Array(e),d=(f,u)=>{let p=0;const g=Math.floor(o/e),v=[];for(let T=0;T<g;T++)v.push(new AudioData({timestamp:n,numberOfChannels:L.channelCount,numberOfFrames:l,sampleRate:L.sampleRate,format:"f32",data:r.subarray(p,p+e)})),p+=e,n+=c;const x=o-p,w=Math.floor(x/L.channelCount);for(!u&&w>0&&(v.push(new AudioData({timestamp:n,numberOfChannels:L.channelCount,numberOfFrames:w,sampleRate:L.sampleRate,format:"f32",data:r.subarray(p,p+w*L.channelCount)})),p+=w*L.channelCount,n+=w/L.sampleRate*1e6),r.set(r.subarray(p,o),0),o-=p;f-n>c;)v.push(new AudioData({timestamp:n,numberOfChannels:L.channelCount,numberOfFrames:l,sampleRate:L.sampleRate,format:"f32",data:h})),n+=c;return v};return(f,u)=>{const p=u.length===0?0:Math.max(...u.map(v=>v[0]?.length??0)),g=p>0;g&&a(o+p*L.channelCount);for(let v=0;v<p;v++){let x=0,w=0;for(let T=0;T<u.length;T++){const y=u[T][0]?.[v]??0,C=u[T][1]?.[v]??y;x+=y,w+=C}r[o]=x,r[o+1]=w,o+=2}return d(f,g)}}function ea(l){try{return l.getContext("webgl2")??l.getContext("webgl")}catch{return null}}function ia(l){const{canvas:t,outputAudio:e,muxer:i,hasVideoTrack:s,timeSlice:r}=l;let o=0;const a=Math.floor(3*l.fps),n=s?ea(t):null,c=ta(1024,l.fps);return async(h,d,f)=>{if(e!==!1)for(const u of c(h,d))await i.encodeAudio(u);if(s&&f)try{n!=null&&!n.isContextLost()&&n.finish();const u=new VideoFrame(t,{duration:r,timestamp:h});await i.encodeVideo(u,{keyFrame:o%a===0}),o+=1}catch(u){console.warn("Failed to create VideoFrame from canvas, skipping frame:",u)}}}let sa=0;class ra extends ee{static async isSupported(t={}){return(self.OffscreenCanvas!=null&&self.VideoEncoder!=null&&self.VideoDecoder!=null&&self.VideoFrame!=null&&self.AudioEncoder!=null&&self.AudioDecoder!=null&&self.AudioData!=null&&((await self.VideoEncoder.isConfigSupported({codec:t.videoCodec??"avc1.42E032",width:t.width??1920,height:t.height??1080,bitrate:t.bitrate??7e6})).supported??!1)&&(await self.AudioEncoder.isConfigSupported({codec:(await Ue()).codec,sampleRate:L.sampleRate,numberOfChannels:L.channelCount})).supported)??!1}logger=Q.create(`id:${sa++},`);destroyed=!1;sprites=[];canvas;pixiApp=null;stopOutput=null;opts;resolvedAudio=void 0;explicitOpts;hasVideoTrack;jsonDimensions={width:0,height:0};constructor(t={}){super();const{width:e=0,height:i=0}=t;this.canvas=new OffscreenCanvas(e,i),this.opts=Object.assign({backgroundColor:"#000",width:0,height:0,format:"mp4",videoCodec:"avc1.42E032",audio:!0,audioCodec:"aac",audioSampleRate:48e3,bitrate:5e6,fps:30,metaDataTags:null},t),this.explicitOpts={...t},this.hasVideoTrack=e*i>0,Ue().catch(s=>{this.logger.warn("Failed to detect audio codec:",s)})}async initPixiApp(){const{width:t,height:e}=this.opts;if(this.pixiApp=new m.Application,await this.pixiApp.init({canvas:this.canvas,width:t,height:e,backgroundColor:0,antialias:!1,autoDensity:!1,resolution:1,preference:"webgl"}),this.pixiApp.renderer==null||this.pixiApp.stage==null)throw new Error("Pixi.js Application failed to initialize properly");try{const i=this.pixiApp;i.ticker&&typeof i.ticker.stop=="function"&&i.ticker.stop()}catch{}await this.resolveAudioEncoding()}async resolveAudioEncoding(){if(this.opts.audio===!1){this.resolvedAudio=void 0;return}this.resolvedAudio=await Pi(this.opts.audioCodec||L.codecType,this.opts.audioSampleRate||L.sampleRate,L.channelCount)}async addSprite(t,e={}){const i={rect:{x:t.left,y:t.top,w:t.width,h:t.height},display:{...t.display},duration:t.duration,playbackRate:t.playbackRate,zIndex:t.zIndex};this.logger.info("Compositor add clip",i);const s=await t.clone();this.pixiApp!=null&&this.pixiApp.renderer!=null&&typeof s.setRenderer=="function"&&s.setRenderer(this.pixiApp.renderer),this.logger.info("Compositor add clip ready"),this.sprites.push(Object.assign(s,{main:e.main??!1,expired:!1})),this.sprites.sort((r,o)=>r.zIndex-o.zIndex)}initMuxer(t){const{fps:e,width:i,height:s,videoCodec:r,bitrate:o,audio:a,metaDataTags:n,format:c,audioCodec:h,audioSampleRate:d}=this.opts,f=this.sprites.some(g=>g.width>0&&g.height>0),u=this.hasVideoTrack&&f;return et.recodemux({format:c||"mp4",video:u?{width:i,height:s,expectFPS:e,codec:r,bitrate:o,__unsafe_hardwareAcceleration__:this.opts.__unsafe_hardwareAcceleration__}:null,audio:a===!1||this.resolvedAudio===null?null:{codec:this.resolvedAudio?.codecType??(h||L.codecType),sampleRate:this.resolvedAudio?.sampleRate??(d||L.sampleRate),channelCount:L.channelCount},duration:t,metaDataTags:n})}output(t={}){if(this.sprites.length===0)throw Error("No sprite added");const e=this.sprites.find(c=>c.main),s=this.sprites.map(c=>c.display.to>0?c.display.to:c.display.from+c.duration).filter(c=>c!==1/0),r=t.maxTime??(e!=null?e.display.to>0?e.display.to:e.display.from+e.duration:s.length>0?Math.max(...s):0);if(r===1/0||r<=0)throw Error("Unable to determine the end time, please specify a main sprite, or limit the duration of Image, Audio");r===-1&&this.logger.warn("Unable to determine the end time, process value don't update"),this.logger.info(`start combinate video, maxTime:${r}`);const o=this.initMuxer(r),a=performance.now(),n=this.runEncoding(o,r,{onProgress:c=>{this.logger.debug("export:progress:",c),this.emit("export:progress",c)},onEnded:async()=>{await o.flush(),this.logger.info("===== output ended =====, cost:",performance.now()-a),this.emit("export:progress",1),this.destroy()},onError:c=>{this.emit("error",c),o.close(),this.destroy()}});return this.stopOutput=()=>{n(),o.close()},o.stream}destroy(){if(!this.destroyed&&(this.destroyed=!0,this.stopOutput?.(),this.off("export:progress"),this.off("error"),this.pixiApp!=null))try{const t=this.pixiApp;if(t.destroyed===!0){this.pixiApp=null;return}if(t.ticker&&typeof t.ticker.stop=="function")try{t.ticker.stop()}catch{}if(t.renderer!=null){const e=t.renderer.gl;if(e&&e.isContextLost()){this.pixiApp=null;return}this.pixiApp.destroy()}}catch(t){console.warn("Error while destroying Pixi application:",t)}finally{this.pixiApp=null}}runEncoding(t,e,{onProgress:i,onEnded:s,onError:r}){let o=0;const a={aborted:!1};let n=null,c=null;const h=async()=>{const{fps:u,backgroundColor:p,audio:g}=this.opts,v=Math.round(1e6/u),x=this.sprites.some(S=>S.width>0&&S.height>0),w=this.jsonDimensions.width||this.opts.width||1920,T=this.jsonDimensions.height||this.opts.height||1080,y=this.opts.width>0?this.opts.width/w:1,C=this.opts.height>0?this.opts.height/T:1;c=hi({pixiApp:this.pixiApp,sprites:this.sprites,aborter:a,scaleX:y,scaleY:C});const k=ia({muxer:t,canvas:this.canvas,outputAudio:g,hasVideoTrack:this.hasVideoTrack&&x,timeSlice:v,fps:u});let O=0;const F=4;let b=0;for(;;){if(n!=null)return;if(a.aborted||e!==-1&&O>e||this.sprites.length===0){d(),await s();return}o=O/e;const{audios:S,mainSprDone:A,hasVideo:E}=await c.render(O);if(A){d(),await s();return}if(a.aborted)return;this.hasVideoTrack&&E&&(O===0?(await new Promise(P=>setTimeout(P,50)),b=0):(b++,b>=F&&(await si(),b=0))),await k(O,S,E),O+=v,await Qs(t.getEncodeQueueSize)}},d=()=>{a.aborted||(a.aborted=!0,clearInterval(f),c?.cleanup(),this.sprites.forEach(u=>{u.destroy()}))};h().catch(u=>{n=u,this.logger.error(u),d(),r(u)});const f=setInterval(()=>{i(o)},500);return d}exportToJSON(){const t={};for(const i of this.sprites)t[i.id]=Lt(i,i.main);const e=[];return this.sprites.forEach(i=>{if(i.transition){const s=this.sprites.filter(r=>r.id!==i.id&&r.zIndex===i.zIndex&&r.display.from<i.display.from&&(r instanceof nt||r instanceof It)).sort((r,o)=>o.display.to-r.display.to)[0];s&&e.push({key:i.transition.name,duration:i.transition.duration,clips:[s.id,i.id]})}}),{clips:t,settings:{width:this.opts.width,height:this.opts.height,fps:this.opts.fps,backgroundColor:this.opts.backgroundColor,format:this.opts.format,videoCodec:this.opts.videoCodec,bitrate:this.opts.bitrate,audio:this.opts.audio,audioCodec:this.opts.audioCodec,audioSampleRate:this.opts.audioSampleRate,metaDataTags:this.opts.metaDataTags}}}async loadFromJSON(t){this.sprites.forEach(o=>{o.destroy()}),this.sprites=[];let e=!1;t.settings&&(t.settings.width!==void 0&&this.explicitOpts.width===void 0&&(this.opts.width!==t.settings.width&&(e=!0),this.opts.width=t.settings.width),t.settings.height!==void 0&&this.explicitOpts.height===void 0&&(this.opts.height!==t.settings.height&&(e=!0),this.opts.height=t.settings.height),e&&this.opts.width>0&&this.opts.height>0&&(this.canvas.width=this.opts.width,this.canvas.height=this.opts.height,this.pixiApp?.renderer&&this.pixiApp.renderer.resize(this.opts.width,this.opts.height)),t.settings.width&&t.settings.height&&(this.jsonDimensions={width:t.settings.width,height:t.settings.height}),t.settings.fps!==void 0&&this.explicitOpts.fps===void 0&&(this.opts.fps=t.settings.fps),t.settings.backgroundColor!==void 0&&this.explicitOpts.backgroundColor===void 0&&(this.opts.backgroundColor=t.settings.backgroundColor),t.settings.format!==void 0&&this.explicitOpts.format===void 0&&(this.opts.format=t.settings.format),t.settings.videoCodec!==void 0&&this.explicitOpts.videoCodec===void 0&&(this.opts.videoCodec=t.settings.videoCodec),t.settings.bitrate!==void 0&&this.explicitOpts.bitrate===void 0&&(this.opts.bitrate=t.settings.bitrate),t.settings.audio!==void 0&&this.explicitOpts.audio===void 0&&(this.opts.audio=t.settings.audio===!1?!1:void 0),t.settings.audioCodec!==void 0&&this.explicitOpts.audioCodec===void 0&&(this.opts.audioCodec=t.settings.audioCodec),t.settings.audioSampleRate!==void 0&&this.explicitOpts.audioSampleRate===void 0&&(this.opts.audioSampleRate=t.settings.audioSampleRate),t.settings.metaDataTags!==void 0&&this.explicitOpts.metaDataTags===void 0&&(this.opts.metaDataTags=t.settings.metaDataTags));const i=new Map,s=new Set;if(t.tracks){const o=t.tracks.length;t.tracks.forEach((a,n)=>{if(a.clipIds)for(const c of a.clipIds)i.set(c,(o-n)*10),a.muted&&s.add(c)})}const r=Object.values(t.clips??{});for(const o of r){const a=await xt(o);i.has(a.id)&&(a.zIndex=i.get(a.id)),s.has(a.id)&&(a.trackMuted=!0),await this.addSprite(a,{main:o.main||!1})}for(const o of this.sprites)if(o instanceof tt){const a=o.fromClipId?this.sprites.find(h=>h.id===o.fromClipId):null,n=o.toClipId?this.sprites.find(h=>h.id===o.toClipId):null;if(a&&n){const h=n.display.from,d=Math.max(0,h-o.duration/2),f=d+o.duration;o.display.from=d,o.display.to=f}const c={name:o.transitionKey,key:o.transitionKey,duration:o.duration,fromClipId:o.fromClipId,toClipId:o.toClipId,start:o.display.from,end:o.display.to};a&&(a.transition={...c}),n&&(n.transition={...c})}await this.resolveAudioEncoding()}async renderFrame(t,e){if(this.destroyed)throw new Error("Compositor has been destroyed.");if(this.pixiApp==null&&await this.initPixiApp(),this.pixiApp==null)throw new Error("Compositor Pixi application could not be initialised. Ensure width and height are greater than 0.");const i=t*1e3,s=this.jsonDimensions.width||this.opts.width||1920,r=this.jsonDimensions.height||this.opts.height||1080,o=hi({pixiApp:this.pixiApp,backgroundColor:this.opts.backgroundColor,sprites:this.sprites,aborter:{aborted:!1},scaleX:this.opts.width>0?this.opts.width/s:1,scaleY:this.opts.height>0?this.opts.height/r:1});let a;try{await o.render(i);const n=e?.transparent??!1,c=this.pixiApp.renderer.background.alpha;n&&(this.pixiApp.renderer.background.alpha=0);const h=m.RenderTexture.create({width:this.opts.width,height:this.opts.height});try{this.pixiApp.renderer.render({container:this.pixiApp.stage,target:h,clear:!0}),a=await this.pixiApp.renderer.extract.base64(h,"image/png",1)}finally{h.destroy(),n&&(this.pixiApp.renderer.background.alpha=c)}}finally{o.cleanup()}return a}async snapshot(t,e){const i=typeof t=="number"?e:t,s=typeof t=="number"?t:void 0;return this.renderFrame(s??0,i)}}class oa{core;studio;constructor(t,e){this.core=t,this.studio=e,this.init()}isSyncing=!1;disposed=!1;queue=Promise.resolve();generation=0;resyncQueued=!1;pendingSeek=null;seekRunning=!1;unsubscribers=[];async init(){if(await this.studio.ready,this.disposed)return;const t=(s,r)=>{this.core.on(s,r),this.unsubscribers.push(()=>this.core.off(s,r))},e=(s,r)=>{const o=this.studio.on(s,r);this.unsubscribers.push(typeof o=="function"?o:()=>this.studio.off(s,r))};t("timeupdate",s=>this.requestSeek(s)),t("play",()=>this.guarded(()=>this.studio.play())),t("pause",()=>this.guarded(()=>this.studio.pause())),e("currentTime",({currentTime:s})=>{if(this.studio.isPlaying&&!this.isSyncing){this.isSyncing=!0;try{this.core.seek(s)}finally{this.isSyncing=!1}}}),e("play",()=>this.guarded(()=>this.core.play())),e("pause",()=>this.guarded(()=>this.core.pause()));const i=s=>{if(!this.isSyncing){this.isSyncing=!0;try{const r=s.selected.map(a=>a.id),o=this.core.store.getState().selectedIds;JSON.stringify(r)!==JSON.stringify(o)&&this.core.store.getState().select(r)}finally{this.isSyncing=!1}}};e("selection:created",i),e("selection:updated",i),e("selection:cleared",()=>i({selected:[]})),t("change",s=>this.onCoreChange(s)),await this.requestResync()}guarded(t){if(!this.isSyncing){this.isSyncing=!0;try{t()}finally{this.isSyncing=!1}}}enqueue(t){const e=this.queue.then(async()=>{if(!this.disposed)try{await t()}catch(i){console.error("[StudioBridge] Failed to apply Core changes:",i)}});return this.queue=e,e}requestResync(){return this.generation+=1,this.resyncQueued?this.queue:(this.resyncQueued=!0,this.enqueue(async()=>{this.resyncQueued=!1,await this.syncInitialState()}))}requestSeek(t){this.pendingSeek=t,!this.seekRunning&&(this.seekRunning=!0,(async()=>{try{for(;this.pendingSeek!=null&&!this.disposed;){const e=this.pendingSeek;this.pendingSeek=null;const i=this.isSyncing;this.isSyncing=!0;try{await this.studio.transport.seek(e)}finally{this.isSyncing=i}}}finally{this.seekRunning=!1}})())}syncSelectionToStudio(t){const e=this.studio.selection.getSelection().map(i=>i.id);JSON.stringify(t)!==JSON.stringify(e)&&this.studio.selectClipsByIds(t)}onCoreChange(t){if(t.some(i=>i.path==="/")){this.requestResync();return}const e=this.generation;this.enqueue(async()=>{e===this.generation&&await this.handlePatches(t)})}async handlePatches(t){for(const e of t){const i=e.path.split("/").filter(Boolean);if(i[0]==="clips"){const s=i[1];e.op==="add"&&!i[2]?await this.handleAddClip(e.value):e.op==="remove"&&!i[2]?await this.handleRemoveClip(s):e.op==="update"&&await this.handleUpdateClip(s,i.slice(2),e.value)}if(i[0]==="tracks"&&await this.studio.setTracks(this.core.store.getState().tracks),i[0]==="settings"){const s=this.core.store.getState().settings;(this.studio.opts.width!==s.width||this.studio.opts.height!==s.height)&&this.studio.setSize(s.width,s.height),this.studio.updateFrame(this.core.store.getState().currentTime)}i[0]==="selectedIds"&&this.syncSelectionToStudio(this.core.store.getState().selectedIds)}}getTrackCaptionConfig(t){return this.core.store.getState().tracks.find(s=>s.clipIds.includes(t))?.config?.captions??void 0}buildClipContext(t){if(t.type!=="Caption")return;const e=this.getTrackCaptionConfig(t.id);return e?{captionConfig:e}:void 0}async handleAddClip(t){if(t.type==="Transition")await this.studio.addTransition(t.transitionKey||"none",t.duration,t.fromClipId,t.toClipId,t.id);else{const e=this.buildClipContext(t);await this.ensureFontForClip(t,e?.captionConfig);const i=await xt(t,e),s=this.findTrackIdForClip(t.id);await this.studio.addClip(i,{trackId:s})}}async handleRemoveClip(t){const e=this.studio.timeline.getClipById(t);e&&await this.studio.removeClip(e)}async handleUpdateClip(t,e,i){const s=this.studio.timeline.getClipById(t);if(s)if(e.length===0){const r=s.locked;this.syncClipProperties(s,i)&&(r!==s.locked&&this.studio.selection.selectedClips.has(s)&&this.studio.selection.recreateTransformer(),await this.studio.timeline.recalculateMaxDuration(),this.studio.updateFrame(this.studio.currentTime))}else{const r=e[0];let o=!1;if(r==="timing")if(e.length===1)i&&(i.display&&(s.display={...i.display}),i.trim&&(s.trim={...i.trim}),i.duration!==void 0&&(s.duration=i.duration),i.playbackRate!==void 0&&(s.playbackRate=i.playbackRate),i.fadeIn!==void 0?s.timing.fadeIn=i.fadeIn:delete s.timing.fadeIn,i.fadeOut!==void 0?s.timing.fadeOut=i.fadeOut:delete s.timing.fadeOut,o=!0);else{const a=e[1];a==="display"?(s.display={...i},o=!0):a==="trim"?(s.trim={...i},o=!0):a==="duration"?(s.duration=i,o=!0):a==="playbackRate"?(s.playbackRate=i,o=!0):a==="fadeIn"?(i!==void 0?s.timing.fadeIn=i:delete s.timing.fadeIn,o=!0):a==="fadeOut"&&(i!==void 0?s.timing.fadeOut=i:delete s.timing.fadeOut,o=!0)}else if(r==="display")(!s.display||s.display.from!==i.from||s.display.to!==i.to)&&(s.display={...i},o=!0);else if(r==="transform")if(e.length===1)i&&(i.x!==void 0&&s.left!==i.x&&(s.left=i.x,o=!0),i.y!==void 0&&s.top!==i.y&&(s.top=i.y,o=!0),i.width!==void 0&&s.width!==i.width&&(s.width=i.width,o=!0),i.height!==void 0&&s.height!==i.height&&(s.height=i.height,o=!0),i.angle!==void 0&&s.angle!==i.angle&&(s.angle=i.angle,o=!0),i.opacity!==void 0&&s.opacity!==i.opacity&&(s.opacity=i.opacity,o=!0),i.zIndex!==void 0&&s.zIndex!==i.zIndex&&(s.zIndex=i.zIndex,o=!0),i.flip!==void 0&&JSON.stringify(s.flip)!==JSON.stringify(i.flip)&&(s.flip=i.flip,o=!0));else{const a=e[1];a==="x"&&s.left!==i?(s.left=i,o=!0):a==="y"&&s.top!==i?(s.top=i,o=!0):a==="width"&&s.width!==i?(s.width=i,o=!0):a==="height"&&s.height!==i?(s.height=i,o=!0):a==="angle"&&s.angle!==i?(s.angle=i,o=!0):a==="opacity"&&s.opacity!==i?(s.opacity=i,o=!0):a==="zIndex"&&s.zIndex!==i?(s.zIndex=i,o=!0):a==="flip"&&JSON.stringify(s.flip)!==JSON.stringify(i)&&(s.flip=i,o=!0)}else{const a=s.locked;s[r]!==i&&(Object.assign(s,{[r]:i}),r==="locked"&&a!==i&&this.studio.selection.selectedClips.has(s)&&this.studio.selection.recreateTransformer(),o=!0)}o&&(await this.studio.timeline.recalculateMaxDuration(),this.studio.updateFrame(this.studio.currentTime))}}async syncInitialState(){this.isSyncing=!0;try{await this.studio.clear();const t=this.core.store.getState();this.studio.setSize(t.settings.width,t.settings.height);for(const e in t.clips)await this.handleAddClip(t.clips[e]);this.studio.setTracks(t.tracks),this.syncSelectionToStudio(t.selectedIds),this.studio.updateFrame(t.currentTime)}finally{this.isSyncing=!1}}findTrackIdForClip(t){return this.core.store.getState().tracks.find(e=>e.clipIds.includes(t))?.id}async ensureFontForClip(t,e){const i=t.style,s=i?.fontUrl||e?.style?.fontUrl||t.fontUrl,r=i?.fontFamily||e?.style?.fontFamily||t.fontFamily;if(!(!s||!r))try{await jt.addFont({name:r,url:s})}catch(o){console.warn(`[StudioBridge] Failed to pre-load font "${r}":`,o)}}syncClipProperties(t,e){let i=!1;const s=e.transform;s&&(s.x!==void 0&&Math.abs((t.left??0)-s.x)>=.01&&(t.left=s.x,i=!0),s.y!==void 0&&Math.abs((t.top??0)-s.y)>=.01&&(t.top=s.y,i=!0),s.width!==void 0&&Math.abs((t.width??0)-s.width)>=.01&&(t.width=s.width,i=!0),s.height!==void 0&&Math.abs((t.height??0)-s.height)>=.01&&(t.height=s.height,i=!0),s.angle!==void 0&&Math.abs((t.angle??0)-s.angle)>=.01&&(t.angle=s.angle,i=!0),s.opacity!==void 0&&Math.abs((t.opacity??1)-s.opacity)>=.01&&(t.opacity=s.opacity,i=!0),s.zIndex!==void 0&&t.zIndex!==s.zIndex&&(t.zIndex=s.zIndex,i=!0),s.flip!==void 0&&JSON.stringify(t.flip)!==JSON.stringify(s.flip)&&(t.flip=s.flip,i=!0)),["volume","text","words","style","chromaKey","colorAdjustment","animations","locked","muted","caption","textBoxStyle","wordsPerLine","videoWidth","videoHeight","fontUrl","mediaId","bottomOffset","transitionKey","effectKey","values"].forEach(a=>{let n=e[a];if(n===void 0&&(a==="locked"||a==="muted")&&(n=!1),n===void 0)return;const c=t[a];c!==n&&(typeof c=="number"&&typeof n=="number"&&Math.abs(c-n)<.01||(a==="style"||a==="values"||a==="caption")&&JSON.stringify(c)===JSON.stringify(n)||(Object.assign(t,{[a]:n}),i=!0))});const o=e.timing;if(o)o.display&&(!t.display||t.display.from!==o.display.from||t.display.to!==o.display.to)&&(t.display={...o.display},i=!0),o.trim&&(!t.trim||t.trim.from!==o.trim.from||t.trim.to!==o.trim.to)&&(t.trim={...o.trim},i=!0),o.duration!==void 0&&t.duration!==o.duration&&(t.duration=o.duration,i=!0),o.playbackRate!==void 0&&t.playbackRate!==o.playbackRate&&(t.playbackRate=o.playbackRate,i=!0),o.fadeIn!==void 0?JSON.stringify(t.timing.fadeIn)!==JSON.stringify(o.fadeIn)&&(t.timing.fadeIn=o.fadeIn,i=!0):t.timing.fadeIn!==void 0&&(delete t.timing.fadeIn,i=!0),o.fadeOut!==void 0?JSON.stringify(t.timing.fadeOut)!==JSON.stringify(o.fadeOut)&&(t.timing.fadeOut=o.fadeOut,i=!0):t.timing.fadeOut!==void 0&&(delete t.timing.fadeOut,i=!0);else{const a=e.display;a&&(!t.display||t.display.from!==a.from||t.display.to!==a.to)&&(t.display={...a},i=!0);const n=e.trim;n&&(!t.trim||t.trim.from!==n.from||t.trim.to!==n.to)&&(t.trim={...n},i=!0);const c=e.duration;c!==void 0&&t.duration!==c&&(t.duration=c,i=!0);const h=e.playbackRate;h!==void 0&&t.playbackRate!==h&&(t.playbackRate=h,i=!0)}return i}dispose(){this.disposed=!0,this.unsubscribers.forEach(t=>t()),this.unsubscribers=[]}}class na extends m.Graphics{constructor(){super(),this.eventMode="static",this.cursor="move"}draw(t,e=1){const s=1.5*e;this.clear(),this.setStrokeStyle({width:s,color:165063}).rect(t.x,t.y,t.width,t.height).stroke(),this.hitArea=t}}class rt extends m.Graphics{#t=!1;handle;cursor;callbacks;constructor(t,e,i){super(),this.handle=t,this.cursor=e,this.callbacks=i,this.eventMode="static",this.#a(),this.on("pointerdown",this.#i),this.on("globalpointermove",this.#o),this.on("pointerup",this.#d),this.on("pointerupoutside",this.#d)}#a(){this.clear();const t=165063;if(this.handle==="rot_tl")this.hitArea=new m.Rectangle(-22,-22,24,24);else if(this.handle==="rot_tr")this.hitArea=new m.Rectangle(-2,-22,24,24);else if(this.handle==="rot_bl")this.hitArea=new m.Rectangle(-22,-2,24,24);else if(this.handle==="rot_br")this.hitArea=new m.Rectangle(-2,-2,24,24);else if(this.handle==="rot")this.circle(0,0,8),this.fill({color:"#ffffff"}),this.stroke({width:1,color:13421772}),this.moveTo(0,-4),this.arc(0,0,4,-Math.PI/2,Math.PI,!1),this.stroke({width:1,color:0}),this.moveTo(0,-8),this.lineTo(-3,-5),this.lineTo(0,-2),this.stroke({width:1,color:0,cap:"round",join:"round"}),this.hitArea=new m.Circle(0,0,24);else if(["ml","mr","mt","mb"].includes(this.handle)){const e=this.handle==="ml"||this.handle==="mr",i=e?6:24,s=e?24:6;this.roundRect(-i/2,-s/2,i,s,3),this.fill({color:"#ffffff"}),this.stroke({width:1,color:t}),this.hitArea=new m.Rectangle(-10,-10,20,20)}else this.rect(-4,-4,8,8),this.fill({color:"#ffffff"}),this.stroke({width:1,color:t}),this.hitArea=new m.Rectangle(-10,-10,20,20)}#i=t=>{this.#t=!0,this.handle.startsWith("rot")||(this.cursor="grabbing"),this.callbacks.beginDrag(this.handle,t.global)};#o=t=>{this.#t&&this.callbacks.updateDrag(this.handle,t.global)};#d=t=>{this.#t&&(this.#t=!1,this.handle.startsWith("rot")||(this.cursor="pointer"),this.callbacks.endDrag())}}class Ht{constructor(t,e,i=1){this.artboardWidth=t,this.artboardHeight=e,this.scale=i}artboardWidth;artboardHeight;scale;static SNAP_THRESHOLD=5;updateContext(t,e,i){this.artboardWidth=t,this.artboardHeight=e,this.scale=i}snapMove(t,e){const i=[];let s=0,r=0;const o=Ht.SNAP_THRESHOLD/this.scale,a=[{value:this.artboardWidth/2,label:"center",boundsY:[0,this.artboardHeight]},{value:0,label:"start",boundsY:[0,this.artboardHeight]},{value:this.artboardWidth,label:"end",boundsY:[0,this.artboardHeight]}];if(e)for(const u of e)a.push({value:u.x,label:"other-start",boundsY:[u.y,u.y+u.height]},{value:u.x+u.width/2,label:"other-center",boundsY:[u.y,u.y+u.height]},{value:u.x+u.width,label:"other-end",boundsY:[u.y,u.y+u.height]});const n=[{value:t.x,type:"start"},{value:t.x+t.width/2,type:"center"},{value:t.x+t.width,type:"end"}];let c=!1;for(const u of a){if(c)break;for(const p of n){const g=u.value-p.value;if(Math.abs(g)<o){s=g,c=!0;const v=u.boundsY?u.boundsY[0]:0,x=u.boundsY?u.boundsY[1]:this.artboardHeight;i.push({type:"vertical",position:u.value,start:Math.min(v,t.y),end:Math.max(x,t.y+t.height)});break}}}const h=[{value:this.artboardHeight/2,label:"center",boundsX:[0,this.artboardWidth]},{value:0,label:"start",boundsX:[0,this.artboardWidth]},{value:this.artboardHeight,label:"end",boundsX:[0,this.artboardWidth]}];if(e)for(const u of e)h.push({value:u.y,label:"other-start",boundsX:[u.x,u.x+u.width]},{value:u.y+u.height/2,label:"other-center",boundsX:[u.x,u.x+u.width]},{value:u.y+u.height,label:"other-end",boundsX:[u.x,u.x+u.width]});const d=[{value:t.y,type:"start"},{value:t.y+t.height/2,type:"center"},{value:t.y+t.height,type:"end"}];let f=!1;for(const u of h){if(f)break;for(const p of d){const g=u.value-p.value;if(Math.abs(g)<o){r=g,f=!0;const v=u.boundsX?u.boundsX[0]:0,x=u.boundsX?u.boundsX[1]:this.artboardWidth;i.push({type:"horizontal",position:u.value,start:Math.min(v,t.x),end:Math.max(x,t.x+t.width)});break}}}return{dx:s,dy:r,guides:i}}snapResize(t,e,i,s){const r=t.clone(),o=[],a=Ht.SNAP_THRESHOLD/this.scale,n=[{value:0,label:"start",boundsY:[0,this.artboardHeight]},{value:this.artboardWidth/2,label:"center",boundsY:[0,this.artboardHeight]},{value:this.artboardWidth,label:"end",boundsY:[0,this.artboardHeight]}],c=[{value:0,label:"start",boundsX:[0,this.artboardWidth]},{value:this.artboardHeight/2,label:"center",boundsX:[0,this.artboardWidth]},{value:this.artboardHeight,label:"end",boundsX:[0,this.artboardWidth]}];if(s)for(const y of s)n.push({value:y.x,label:"other-start",boundsY:[y.y,y.y+y.height]},{value:y.x+y.width/2,label:"other-center",boundsY:[y.y,y.y+y.height]},{value:y.x+y.width,label:"other-end",boundsY:[y.y,y.y+y.height]}),c.push({value:y.y,label:"other-start",boundsX:[y.x,y.x+y.width]},{value:y.y+y.height/2,label:"other-center",boundsX:[y.x,y.x+y.width]},{value:y.y+y.height,label:"other-end",boundsX:[y.x,y.x+y.width]});const h=["tl","ml","bl"].includes(i),d=["tr","mr","br"].includes(i),f=["tl","mt","tr"].includes(i),u=["bl","mb","br"].includes(i),p=e.x,g=e.y,v=r.width*this.scale,x=r.height*this.scale,w=p+v,T=g+x;for(const y of n){if(h){const C=y.value-p;if(Math.abs(C)<a){const k=C/this.scale;r.x+=k,r.width-=k;const O=y.boundsY?y.boundsY[0]:0,F=y.boundsY?y.boundsY[1]:this.artboardHeight;o.push({type:"vertical",position:y.value,start:Math.min(O,g),end:Math.max(F,T)});break}}if(d){const C=y.value-w;if(Math.abs(C)<a){const k=C/this.scale;r.width+=k;const O=y.boundsY?y.boundsY[0]:0,F=y.boundsY?y.boundsY[1]:this.artboardHeight;o.push({type:"vertical",position:y.value,start:Math.min(O,g),end:Math.max(F,T)});break}}}for(const y of c){if(f){const C=y.value-g;if(Math.abs(C)<a){const k=C/this.scale;r.y+=k,r.height-=k;const O=y.boundsX?y.boundsX[0]:0,F=y.boundsX?y.boundsX[1]:this.artboardWidth;o.push({type:"horizontal",position:y.value,start:Math.min(O,p),end:Math.max(F,w)});break}}if(u){const C=y.value-T;if(Math.abs(C)<a){const k=C/this.scale;r.height+=k;const O=y.boundsX?y.boundsX[0]:0,F=y.boundsX?y.boundsX[1]:this.artboardWidth;o.push({type:"horizontal",position:y.value,start:Math.min(O,p),end:Math.max(F,w)});break}}}return{corrected:r,guides:o}}snapPoint(t){const e=Ht.SNAP_THRESHOLD/this.scale,i=[],s=t.clone(),r=[0,this.artboardWidth/2,this.artboardWidth];for(const a of r)if(Math.abs(a-t.x)<e){s.x=a,i.push({type:"vertical",position:a,start:0,end:this.artboardHeight});break}const o=[0,this.artboardHeight/2,this.artboardHeight];for(const a of o)if(Math.abs(a-t.y)<e){s.y=a,i.push({type:"horizontal",position:a,start:0,end:this.artboardWidth});break}return{p:s,guides:i}}}const di={delta:new m.Matrix,newLocal:new m.Matrix};class ui extends m.Container{group;wireframe=new na;selectionOutlines=new m.Graphics;isDragging=!1;lastPointer=new m.Point;activeHandle=null;#t;#a=new Map;#i=new m.Point;#o=0;#d=0;#s=new m.Rectangle;#r=new m.Point;#n=new m.Rectangle;#e=[new m.Point,new m.Point,new m.Point,new m.Point];#l=0;#c=0;#u=1;#f=1;#p;#m=new m.Graphics;#y=new m.Point;opts;constructor(t){super(),this.opts=t,this.group=t.group,this.eventMode="static",this.#p=new Ht(t.artboardWidth??1920,t.artboardHeight??1080),this.addChild(this.#m);const e={beginDrag:(i,s)=>this.#D(i,s),updateDrag:(i,s)=>this.#P(i,s),endDrag:()=>this.#h()};this.#t={tl:new rt("tl","nwse-resize",e),tr:new rt("tr","nesw-resize",e),bl:new rt("bl","nesw-resize",e),br:new rt("br","nwse-resize",e),ml:new rt("ml","ew-resize",e),mr:new rt("mr","ew-resize",e),mt:new rt("mt","ns-resize",e),mb:new rt("mb","ns-resize",e),rot_tl:new rt("rot_tl","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()}),rot_tr:new rt("rot_tr","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()}),rot_bl:new rt("rot_bl","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()}),rot_br:new rt("rot_br","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()})},this.addChild(this.selectionOutlines,this.wireframe,this.#t.rot_tl,this.#t.rot_tr,this.#t.rot_bl,this.#t.rot_br,this.#t.tl,this.#t.tr,this.#t.bl,this.#t.br,this.#t.ml,this.#t.mr,this.#t.mt,this.#t.mb),this.#R(),this.visible=!1,m.Ticker.shared.addOnce(()=>{this.showImmediate()})}#C=!1;showImmediate(){this.#C||this.destroyed||!this.parent||(this.#g(),this.visible=!0,this.#C=!0)}#R(){this.on("pointerdown",this.#M),this.on("pointerup",this.#T),this.on("pointerupoutside",this.#T),this.on("globalpointermove",this.#O)}#g(){if(this.group.length===1){const t=this.group[0];this.#o=t.rotation;const e=this.#x(t);let i,s;this.opts.clip?(i=this.opts.clip.width,s=this.opts.clip.height):(i=e.width,s=e.height);const r=t.toGlobal(new m.Point(0,0));this.#i.set(r.x,r.y),this.#n.copyFrom(new m.Rectangle(-i/2,-s/2,i,s))}else{let t=1/0,e=1/0,i=-1/0,s=-1/0;if(this.parent)for(const c of this.group){const h=this.#x(c);this.#e[0].set(h.x,h.y),this.#e[1].set(h.x+h.width,h.y),this.#e[2].set(h.x+h.width,h.y+h.height),this.#e[3].set(h.x,h.y+h.height);for(const d of this.#e)c.toGlobal(d,d),this.toLocal(d,void 0,d),t=Math.min(t,d.x),e=Math.min(e,d.y),i=Math.max(i,d.x),s=Math.max(s,d.y)}const r=i-t,o=s-e,a=t+r/2,n=e+o/2;if(this.#n.copyFrom(new m.Rectangle(-r/2,-o/2,r,o)),this.parent){const c=this.toGlobal(new m.Point(a,n));this.#i.set(c.x,c.y)}}this.#v()}#x(t){let e=null;const i=c=>{if(c.label==="MainSprite"&&c instanceof m.Sprite)return c;for(const h of c.children)if(h instanceof m.Container){const d=i(h);if(d)return d}return null};if(e=i(t),e){const c=e.getLocalBounds(),h=t.renderTexturePadding??0,d=h>0?new m.Rectangle(-(c.width-h*2)/2,-(c.height-h*2)/2,c.width-h*2,c.height-h*2):c,f=e.localTransform.clone(),u=f.apply(new m.Point(d.x,d.y)),p=f.apply(new m.Point(d.x+d.width,d.y)),g=f.apply(new m.Point(d.x+d.width,d.y+d.height)),v=f.apply(new m.Point(d.x,d.y+d.height)),x=Math.min(u.x,p.x,g.x,v.x),w=Math.max(u.x,p.x,g.x,v.x),T=Math.min(u.y,p.y,g.y,v.y),y=Math.max(u.y,p.y,g.y,v.y);return new m.Rectangle(x,T,w-x,y-T)}let s=1/0,r=1/0,o=-1/0,a=-1/0;const n=t.children.filter(c=>c.label!=="ShadowContainer"&&c.label!=="AnimationContainer");if(n.length===0&&t.children.length>0){const c=t.children.find(h=>h.label==="AnimationContainer");if(c){const h=c.getLocalBounds();return new m.Rectangle(h.minX,h.minY,h.maxX-h.minX,h.maxY-h.minY)}}for(const c of n){const h=c.getBounds(),d=t.toLocal(new m.Point(h.minX,h.minY)),f=t.toLocal(new m.Point(h.maxX,h.maxY));s=Math.min(s,d.x,f.x),r=Math.min(r,d.y,f.y),o=Math.max(o,d.x,f.x),a=Math.max(a,d.y,f.y)}if(s===1/0){const c=t.getLocalBounds();return new m.Rectangle(c.minX,c.minY,c.maxX-c.minX,c.maxY-c.minY)}return new m.Rectangle(s,r,o-s,a-r)}updateBounds(){this.#g()}#M=t=>{t.button===0&&(this.opts.locked||(this.#g(),this.#y.copyFrom(this.#i),this.isDragging=!0,this.lastPointer.copyFrom(t.global),this.cursor="grabbing"))};#T=()=>{this.isDragging&&this.#h(),this.cursor="default"};#O=t=>{if(!this.isDragging||this.activeHandle||!this.parent)return;const{moveDx:e,moveDy:i,newPivotWorld:s}=this.#E(t);for(const r of this.group)r.x+=e,r.y+=i;this.#i.copyFrom(s),this.lastPointer.copyFrom(t.global),this.#v(),this.emit("transforming")};#S(){const t=[];if(!this.parent)return t;const e=this.parent.children.find(o=>o.label==="ClipContainer");if(!e)return t;const i=e.children.find(o=>o.label==="ClipsNormal"),s=e.children.find(o=>o.label==="ClipsEffect"),r=[i,s].filter(Boolean);for(const o of r)for(const a of o.children){if(this.group.includes(a)||!a.visible)continue;const n=this.#x(a),c=this.parent.toLocal(new m.Point(n.x,n.y),a),h=this.parent.toLocal(new m.Point(n.x+n.width,n.y),a),d=this.parent.toLocal(new m.Point(n.x+n.width,n.y+n.height),a),f=this.parent.toLocal(new m.Point(n.x,n.y+n.height),a),u=Math.min(c.x,h.x,d.x,f.x),p=Math.max(c.x,h.x,d.x,f.x),g=Math.min(c.y,h.y,d.y,f.y),v=Math.max(c.y,h.y,d.y,f.y);t.push(new m.Rectangle(u,g,p-u,v-g))}return t}#E(t){const e=Math.abs(this.parent.worldTransform.a);this.#p.updateContext(this.opts.artboardWidth??1920,this.opts.artboardHeight??1080,e);const i=t.global.x-this.lastPointer.x,s=t.global.y-this.lastPointer.y;this.#y.x+=i,this.#y.y+=s;const r=this.parent.toLocal(this.#y),o=new m.Rectangle(r.x+this.#n.x,r.y+this.#n.y,this.#n.width,this.#n.height),a=this.#S(),{dx:n,dy:c,guides:h}=this.#p.snapMove(o,a);this.#A(h,e);const d=r.x+n,f=r.y+c,u=this.parent.toLocal(this.#i),p=d-u.x,g=f-u.y,v=this.parent.toGlobal(new m.Point(d,f));return{moveDx:p,moveDy:g,newPivotWorld:v}}#D(t,e){this.#g(),this.isDragging=!0,this.activeHandle=t,this.#a.clear();for(const i of this.group)this.#a.set(i,i.localTransform.clone());if(this.rotation=this.#o,this.#s.copyFrom(this.#n),this.#z(t),["ml","mr","mt","mb"].includes(t)){const i=this.#r,s=this.rotation,r=Math.cos(s),o=Math.sin(s),a=this.toLocal(e),n=a.x-i.x,c=a.y-i.y;t==="ml"||t==="mr"?(this.#l=n*r+c*o,this.#c=this.#s.width):(this.#l=-n*o+c*r,this.#c=this.#s.height)}}#P(t,e){this.#I(t,e)}async#I(t,e){const{proposed:i,sx:s,sy:r,pivotWorld:o}=await this.#B(t,e),a=this.opts.clip&&this.opts.clip.type==="Text",n=this.opts.clip&&this.opts.clip.type==="Caption";a||n?this.emit("textClipResize",{handle:t,newWidth:i.width,newHeight:i.height,pivotWorld:o,proposed:i,sx:s,sy:r}):this.#F(this.#L(o,this.#o,s,r)),this.#n.copyFrom(i),this.#v(),this.emit("transforming")}async#B(t,e){const i=this.#r,s=this.parent?Math.abs(this.parent.worldTransform.a):1,r=this.parent?this.parent.toLocal(e):e;let o;const a=this.localTransform,n=a.a*a.d-a.b*a.c;if(n!==0){const p=1/n,g=r.x-a.tx,v=r.y-a.ty,x=(a.d*g-a.b*v)*p,w=(-a.c*g+a.a*v)*p,T=new m.Point(x,w);o=this.#k(t,T,i)}else o=this.#k(t,this.toLocal(e),i);if(this.#p.updateContext(this.opts.artboardWidth??1920,this.opts.artboardHeight??1080,1),["tl","tr","bl","br","ml","mr","mt","mb"].includes(t)){const p=this.localTransform.apply(new m.Point(o.x,o.y)),g=this.#S(),{corrected:v,guides:x}=this.#p.snapResize(o,p,t,g);this.#A(x,s);const w=v.width/this.#s.width,T=v.height/this.#s.height,y=this.toGlobal(i);return{proposed:v,sx:w,sy:T,pivotWorld:y}}const d=o.width/this.#s.width,f=o.height/this.#s.height,u=this.toGlobal(i);return{proposed:o,sx:d,sy:f,pivotWorld:u}}#w(t){this.#g(),this.isDragging=!0,this.activeHandle="rot",this.#a.clear();for(const e of this.group)this.#a.set(e,e.localTransform.clone());this.#d=Math.atan2(t.y-this.#i.y,t.x-this.#i.x)}#b(t){const i=Math.atan2(t.y-this.#i.y,t.x-this.#i.x)-this.#d,s=this.#o+i;this.#F(this.#H(this.#i,i)),this.rotation=s,this.#v(s),this.emit("transforming")}#h(){this.isDragging=!1,this.#o=this.rotation,this.activeHandle=null,this.#m.clear(),this.#v(this.#o),this.emit("transformEnd")}#A(t,e){if(this.#m.clear(),!(!t.length||!this.parent)){this.#m.stroke({width:1/e,color:4774907});for(const i of t){let s,r;i.type==="vertical"?(s=new m.Point(i.position,i.start),r=new m.Point(i.position,i.end)):(s=new m.Point(i.start,i.position),r=new m.Point(i.end,i.position)),this.toLocal(s,this.parent,s),this.toLocal(r,this.parent,r),this.#m.moveTo(s.x,s.y).lineTo(r.x,r.y).stroke({width:1/e,color:4774907})}}}#v(t=this.#o){this.parent&&this.position.copyFrom(this.parent.toLocal(this.#i)),this.rotation=t;const i=1/((this.parent?Math.abs(this.parent.worldTransform.a):1)||1),s=this.#n;this.wireframe.draw(s,i);const r=s.x+s.width/2,o=s.y+s.height/2,n=this.opts.locked?[]:this.opts.clip?.getVisibleHandles?.()??["tl","tr","bl","br","ml","mr","mt","mb","rot"],c=[this.#t.tl,this.#t.tr,this.#t.bl,this.#t.br,this.#t.ml,this.#t.mr,this.#t.mt,this.#t.mb,this.#t.rot_tl,this.#t.rot_tr,this.#t.rot_bl,this.#t.rot_br];for(const f of c)f.scale.set(i);const h=n.includes("rot");this.#t.tl.visible=n.includes("tl"),this.#t.tr.visible=n.includes("tr"),this.#t.bl.visible=n.includes("bl"),this.#t.br.visible=n.includes("br"),this.#t.ml.visible=n.includes("ml"),this.#t.mr.visible=n.includes("mr"),this.#t.mt.visible=n.includes("mt"),this.#t.mb.visible=n.includes("mb"),this.#t.rot_tl.visible=h,this.#t.rot_tr.visible=h,this.#t.rot_bl.visible=h,this.#t.rot_br.visible=h,this.#t.tl.position.set(s.x,s.y),this.#t.tr.position.set(s.x+s.width,s.y),this.#t.bl.position.set(s.x,s.y+s.height),this.#t.br.position.set(s.x+s.width,s.y+s.height),this.#t.ml.position.set(s.x,o),this.#t.mr.position.set(s.x+s.width,o),this.#t.mt.position.set(r,s.y),this.#t.mb.position.set(r,s.y+s.height),this.#t.rot_tl.position.set(s.x,s.y),this.#t.rot_tr.position.set(s.x+s.width,s.y),this.#t.rot_bl.position.set(s.x,s.y+s.height),this.#t.rot_br.position.set(s.x+s.width,s.y+s.height);const d=(f,u)=>{const p=f-r,g=u-o,v=Math.atan2(p,-g),x=t+v,T=`<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
3325
+ `,Vn={radialSwipe:{label:"Radial Swipe",fragment:Zo}},qt={};function Yn(l,t){qt[l]=t}function Qn(l){delete qt[l]}function Dt(){return{...Tt.reduce((l,t)=>(l[t.name]={label:t.name,fragment:t.glsl,uniforms:t.defaultParams,previewDynamic:""},l),{}),...Vn,...qt}}Dt();function fi(){const l=Object.keys(qt);return Object.entries(Dt()).map(([t,e])=>{const i=Te.getTransitionByKey(t);return{key:t,label:i?.name??e.label,description:i?.description,category:i?.category,isCustom:l.includes(t)||(i?.isCustom??!1),previewStatic:e.previewStatic||`https://cdn.subgen.co/previews/static/transition_${t}_static.webp`,previewDynamic:e.previewDynamic||`https://cdn.subgen.co/previews/dynamic/transition_${t}_dynamic.webp`}})}const jn=fi();function me({name:l,renderer:t}){let e=Tt.find(z=>z.name===l);if(!e){const z=Dt(),V=Object.keys(z).find(_=>_.toLowerCase()===l.toLowerCase());V&&(e=z[V])}if(e||(e=Tt.find(z=>z.name.toLowerCase()===l.toLowerCase())),!e){const z=[l,l.toLowerCase(),l.charAt(0).toUpperCase()+l.slice(1).toLowerCase(),l.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,""),l.replace(/_/g,"")],V=Dt();for(const _ of z){if(e=Tt.find(Ct=>Ct.name.toLowerCase()===_.toLowerCase()),e)break;const nt=Object.keys(V).find(Ct=>Ct.toLowerCase()===_.toLowerCase());if(nt){e=V[nt];break}}}if(!e){const z=Tt.length,V=Tt.slice(0,5).map(Ct=>Ct.name).join(", "),_=Dt(),nt=Object.keys(_).slice(0,3).join(", ");throw console.error(`Transition not found: "${l}". Available in gl-transitions (${z} total):`,V+"..."),console.error("Available locally:",nt+"..."),new Error(`Transition "${l}" not found in gl-transitions library or local definitions`)}const i=new m.Sprite(m.Texture.WHITE),s=m.RenderTexture.create({width:t.width,height:t.height}),r=new m.ImageSource({}),o=new m.ImageSource({}),a=e.name==="displacement"||l.toLowerCase()==="displacement"||e.label==="displacement",n=a?new m.ImageSource({}):void 0;let c=null;if(a){c=document.createElement("canvas"),c.width=256,c.height=256;const z=c.getContext("2d");if(z){const V=z.createImageData(256,256);for(let _=0;_<V.data.length;_+=4){const nt=Math.random();V.data[_]=nt*255,V.data[_+1]=nt*255,V.data[_+2]=nt*255,V.data[_+3]=255}z.putImageData(V,0,0)}}let h=e.glsl||e.fragment;if(!h)throw new Error(`Transition "${l}" has no glsl or fragment code`);let d={...j.basics,...j.custom(e)};Object.entries(d).forEach(([,z])=>{z.type==="int<f32>"&&(z.type="i32",typeof z.value=="number"&&(z.value=Math.trunc(z.value))),z.type==="ivec2<f32>"&&(z.type="vec2<f32>")});const u=e.name==="GridFlip"||l.toLowerCase()==="gridflip"||e.label==="gridflip",f=e.name==="circle"||l.toLowerCase()==="circle"||e.label==="circle",p=e.name==="directional"||l.toLowerCase()==="directional"||e.label==="directional",g=e.name==="UndulatingBurnOut"||l.toLowerCase()==="undulatingburnout"||e.label==="undulatingBurnOut",v=e.name==="SquaresWire"||l.toLowerCase()==="squareswire"||e.label==="squaresWire",x=e.name==="rotate_scale_fade"||l.toLowerCase()==="rotatescalefade"||e.label==="rotateScaleFade",w=e.name==="RandomSquares"||l.toLowerCase()==="randomsquares"||e.label==="randomSquares",T=e.name==="polar_function"||l.toLowerCase()==="polar_function"||e.label==="polar_function",y=e.name==="pixelate"||l.toLowerCase()==="pixelate"||e.label==="pixelate",C=e.name==="perlin"||l.toLowerCase()==="perlin"||e.label==="perlin",k=e.name==="luma"||l.toLowerCase()==="luma"||e.label==="luma",O=e.name==="luminance_melt"||l.toLowerCase()==="luminance_melt"||l.toLowerCase()==="luminancemelt"||e.label==="luminance_melt",F=e.name==="hexagonalize"||l.toLowerCase()==="hexagonalize"||e.label==="hexagonalize",b=e.name==="heart"||l.toLowerCase()==="heart"||e.label==="heart",S=e.name==="displacement"||l.toLowerCase()==="displacement"||e.label==="displacement",A=e.name==="directionalwipe"||l.toLowerCase()==="directionalwipe"||l.toLowerCase()==="directional_wipe"||e.label==="directionalwipe",E=e.name==="directionalwarp"||l.toLowerCase()==="directionalwarp"||l.toLowerCase()==="directional_warp"||e.label==="directionalwarp",P=e.name==="crosshatch"||l.toLowerCase()==="crosshatch"||e.label==="crosshatch",R=e.name==="circleopen"||l.toLowerCase()==="circleopen"||l.toLowerCase()==="circle_open"||e.label==="circleopen",B=e.name==="cannabisleaf"||l.toLowerCase()==="cannabisleaf"||l.toLowerCase()==="cannabis_leaf"||e.label==="cannabisleaf",U=e.name==="StereoViewer"||l.toLowerCase()==="stereoviewer"||l.toLowerCase()==="stereo_viewer"||e.label==="StereoViewer",I=e.name==="GlitchDisplace"||l.toLowerCase()==="glitchDisplace"||e.label==="GlitchDisplace",D=e.name==="CrossZoom"||l.toLowerCase()==="crosszoom"||e.label==="CrossZoom",L=e.name==="CrazyParametricFun"||l.toLowerCase()==="crazyparametricfun"||e.label==="CrazyParametricFun",G=e.name==="BowTieHorizontal"||l.toLowerCase()==="bowtiehorizontal"||e.label==="BowTieHorizontal",J=e.name==="PolkaDotsCurtain"||l.toLowerCase()==="polkadotscurtain"||e.label==="PolkaDotsCurtain",N=e.name==="Pixelize"||l.toLowerCase()==="pixelize"||e.label==="Pixelize";u&&(h=Ko,d={...j.basics,...Xo}),f&&(h=qo,d={...j.basics,...di}),p&&(h=_o,d={...j.basics,...$o}),g&&(h=tn,d={...j.basics,...en}),v&&(h=sn,d={...j.basics,...rn}),x&&(h=on,d={...j.basics,...nn}),w&&(h=an,d={...j.basics,...ln}),T&&(h=cn,d={...j.basics,...hn}),y&&(h=li,d={...j.basics,...ci}),C&&(h=un,d={...j.basics,...pn}),k&&(h=mn,d={...j.basics,...gn}),O&&(h=vn,d={...j.basics,...yn}),F&&(h=xn,d={...j.basics,...wn}),b&&(h=bn,d={...j.basics,...Cn}),S&&(h=Tn,d={...j.basics,...Sn}),A&&(h=An,d={...j.basics,...kn}),E&&(h=Fn,d={...j.basics,...Rn}),P&&(h=Mn,d={...j.basics,...On}),R&&(h=En,d={...j.basics,...di}),B&&(h=Dn,d={...j.basics,...Pn}),U&&(h=In,d={...j.basics,...Bn}),I&&(h=Nn),D&&(h=zn,d={...j.basics,...Ln}),L&&(h=Hn,d={...j.basics,...Gn}),G&&(h=Un),J&&(h=Wn),N&&(h=dn,d={...j.basics,...fn});const W={from:r,to:o,uniforms:d};a&&n&&(W.displacementMap=n,c&&(n.resource=c,n.update()));const Z=new m.Filter({glProgram:new m.GlProgram({vertex:Qo,fragment:Jo(h)}),resources:W});i.filters=[Z];const ft={};for(const[z,V]of Object.entries(Z.resources.uniforms.uniforms))ft[z]=Array.isArray(V)?[...V]:V;let X=new Set;return{render({width:z,height:V,from:_,to:nt,progress:Ct,values:yi}){(i.width!==z||i.height!==V)&&(i.setSize({width:z,height:V}),s.resize(z,V));const xe=Z.resources.uniforms.uniforms,we=new Set;if(yi)for(const[et,at]of Object.entries(yi))et!=="progress"&&xe[et]!==void 0&&(xe[et]=at,we.add(et));for(const et of X)if(!we.has(et)&&et in ft){const at=ft[et];xe[et]=Array.isArray(at)?[...at]:at}if(X=we,_ instanceof m.Texture?Z.resources.from=_.source:(r.resource=_,r.update(),Z.resources.from=r),nt instanceof m.Texture?Z.resources.to=nt.source:(o.resource=nt,o.update(),Z.resources.to=o),a&&n&&c){if(c.width!==z||c.height!==V){c.width=z,c.height=V;const et=c.getContext("2d");if(et){const at=et.createImageData(z,V);for(let Pt=0;Pt<at.data.length;Pt+=4){const be=Math.random();at.data[Pt]=be*255,at.data[Pt+1]=be*255,at.data[Pt+2]=be*255,at.data[Pt+3]=255}et.putImageData(at,0,0)}}n.resource=c,n.update()}return Z.resources.uniforms.uniforms.progress=Ct,t.render({container:i,target:s,clear:!0,width:z,height:V}),s},destroy(){s.destroy(),i.destroy({children:!0})}}}function Jn(l){const{clip:t,tex:e,rootContainer:i,tempSprite:s,pooled:r,scaleX:o,scaleY:a}=l,n=t.style||{},{renderTransform:c}=t,h=(c?.mirror??0)>.5,d=c?.x??0,u=c?.y??0,f=c?.angle??0,p=c?.scale??1,g=c?.scaleX??1,v=c?.scaleY??1,x=c?.opacity??1,w=c?.blur??0,T=c?.brightness??1,y=e.width||1,C=e.height||1,k=t.type==="Caption",O=!k&&t.width&&t.width!==0?Math.abs(t.width)/y:1,F=!k&&t.height&&t.height!==0?Math.abs(t.height)/C:1,b=O*p*g*o,S=F*p*v*a;if(i.x=(t.center.x+d)*o,i.y=(t.center.y+u)*a,i.rotation=(t.flip==null?1:-1)*((t.angle+f)*Math.PI)/180,i.alpha=t.opacity*x,s.texture=e,h){const I=b,D=S,L=y*I,G=C*D;s.position.set(0,0),s.scale.set(I,D);const J=[[L,0,-I,D],[-L,0,-I,D],[0,G,I,-D],[0,-G,I,-D],[L,G,-I,-D],[-L,G,-I,-D],[L,-G,-I,-D],[-L,-G,-I,-D]];for(;r.mirrors.length<8;){const N=new m.Sprite;N.anchor.set(.5,.5),i.addChild(N),r.mirrors.push(N)}for(let N=0;N<8;N++){const[W,Z,ft,X]=J[N],z=r.mirrors[N];z.texture=e,z.visible=!0,z.position.set(W,Z),z.scale.set(ft,X)}if(t.flip?.x){s.scale.x=-I;for(let N=0;N<8;N++)r.mirrors[N].scale.x=-J[N][2]}if(t.flip?.y){s.scale.y=-D;for(let N=0;N<8;N++)r.mirrors[N].scale.y=-J[N][3]}}else{for(const I of r.mirrors)I.visible=!1;t.flip?.x?(s.scale.x=-b,s.scale.y=S):t.flip?.y?(s.scale.x=b,s.scale.y=-S):(s.scale.x=b,s.scale.y=S)}const A=[];if(w>0){const I=new m.BlurFilter;I.strength=w,I.quality=4,I.repeatEdgePixels=!0,A.push(I)}const E=fe(t.colorAdjustment);if(T!==1||E){const I=new m.ColorMatrixFilter;ue(I,t.colorAdjustment,T),A.push(I)}const P=Xt(t.colorAdjustment);for(let I=0;I<P.length;I++){const D=P[I],L=new m.UniformGroup({uTargetColor:{value:[1,1,0],type:"vec3<f32>"},uHueShift:{value:D.hue,type:"f32"},uSatShift:{value:D.saturation/100,type:"f32"},uLightShift:{value:D.lightness/100,type:"f32"},uTolerance:{value:.22,type:"f32"},uSoftness:{value:.12,type:"f32"}}),G=Bt(D.targetColor);G&&(L.uniforms.uTargetColor[0]=G.r/255,L.uniforms.uTargetColor[1]=G.g/255,L.uniforms.uTargetColor[2]=G.b/255);const J=new m.Filter({glProgram:new m.GlProgram({vertex:Et,fragment:de,name:`SelectiveHslShader_${I}`}),resources:{hslUniforms:L}});A.push(J)}if(t.chromaKey&&t.chromaKey.enabled){const I=new m.UniformGroup({uKeyColor:{value:[0,1,0],type:"vec3<f32>"},uSimilarity:{value:.1,type:"f32"},uSpill:{value:0,type:"f32"}}),D=Bt(t.chromaKey.color);D&&(I.uniforms.uKeyColor[0]=D.r/255,I.uniforms.uKeyColor[1]=D.g/255,I.uniforms.uKeyColor[2]=D.b/255),I.uniforms.uSimilarity=t.chromaKey.similarity,I.uniforms.uSpill=t.chromaKey.spill;const L=new m.Filter({glProgram:new m.GlProgram({vertex:Et,fragment:hi,name:"ChromaKeyShader"}),resources:{chromaUniforms:I}});A.push(L)}i.filters=A;const R=n.borderRadius||0;R>0?(r.maskGfx==null&&(r.maskGfx=new m.Graphics,s.addChild(r.maskGfx)),r.maskGfx.clear(),r.maskGfx.roundRect(-y/2,-C/2,y,C,Math.min(R,y/2,C/2)),r.maskGfx.fill({color:16777215,alpha:1}),s.mask=null,s.mask=r.maskGfx):r.maskGfx!=null&&(s.mask=null);const B=n.stroke;if(B&&B.width>0){r.strokeGfx==null&&(r.strokeGfx=new m.Graphics,s.addChild(r.strokeGfx)),r.strokeGfx.clear();const I=$(B.color)??16777215;let D=1;if(B.alignment!==void 0&&(typeof B.alignment=="number"?D=B.alignment:B.alignment==="center"||B.alignment==="middle"?D=.5:B.alignment==="inside"?D=0:B.alignment==="outside"&&(D=1)),r.strokeGfx.setStrokeStyle({width:B.width,color:I,alignment:D}),R>0){const L=Math.min(R,y/2,C/2);r.strokeGfx.roundRect(-y/2,-C/2,y,C,L)}else r.strokeGfx.rect(-y/2,-C/2,y,C);r.strokeGfx.stroke(),r.strokeGfx.visible=!0}else r.strokeGfx!=null&&(r.strokeGfx.visible=!1);const U=n.shadow;if(U&&(U.blur>0||(U.offsetX??0)!==0||(U.offsetY??0)!==0)){r.shadowGfx==null&&(r.shadowGfx=new m.Graphics,i.addChildAt(r.shadowGfx,0)),r.shadowGfx.clear();const I=$(U.color)??0,D=U.alpha??.5,L=U.offsetX??0,G=U.offsetY??0;if(R>0){const J=Math.min(R,y/2,C/2);r.shadowGfx.roundRect(-y/2+L,-C/2+G,y,C,J)}else r.shadowGfx.rect(-y/2+L,-C/2+G,y,C);r.shadowGfx.fill({color:I,alpha:D}),r.shadowGfx.visible=!0}else r.shadowGfx!=null&&(r.shadowGfx.visible=!1)}class Zn{pixiApp;scaleX;scaleY;transitionRenderers=new Map;transitionSprites=new Map;transFromTexture;transToTexture;transBgGraphics;transClipPool=new Map;constructor(t,e,i){this.pixiApp=t,this.scaleX=e,this.scaleY=i,this.transFromTexture=m.RenderTexture.create({width:t.renderer.width,height:t.renderer.height}),this.transToTexture=m.RenderTexture.create({width:t.renderer.width,height:t.renderer.height}),this.transBgGraphics=new m.Graphics().rect(0,0,t.renderer.width/e,t.renderer.height/i).fill({color:0})}resetFrame(){for(const t of this.transitionSprites.values())t.visible=!1}getTransitionSprite(t){return this.transitionSprites.get(t)}getTransClipObjects(t){let e=this.transClipPool.get(t);if(e==null){const i=new m.Container,s=new m.Sprite;s.anchor.set(.5,.5),i.addChild(s),e={root:i,mainSprite:s,mirrors:[],maskGfx:null,strokeGfx:null,shadowGfx:null},this.transClipPool.set(t,e)}return e}async getClipFrameAtTimestamp(t,e,i){const s=Math.max(0,Math.min(e-t.display.from,t.duration));t.animate(s*t.playbackRate);const{video:r}=await i(t,s);return r}renderClipToTransitionTexture(t,e,i){const s=e instanceof m.Texture,r=s?e:m.Texture.from(e),o=this.getTransClipObjects(t.id),{root:a,mainSprite:n}=o;Jn({clip:t,tex:r,rootContainer:a,tempSprite:n,pooled:o,scaleX:this.scaleX,scaleY:this.scaleY}),this.pixiApp.renderer.render({container:a,target:i,clear:!0}),s||r.destroy(!0)}async renderTransition(t){const{sprite:e,timestamp:i,fromClip:s,toClip:r,getFrameCached:o,clipsNormalContainer:a,clipsClaimedByTransition:n,onVideoState:c}=t,h=i-e.display.from;if(h>=e.duration){e.expired=!0;const T=this.transitionSprites.get(e.id);return T&&(T.visible=!1),!1}const d=await this.getClipFrameAtTimestamp(s,i,o),u=await this.getClipFrameAtTimestamp(r,i,o);if(!d||!u)return!1;const f=Math.min(Math.max(h/e.duration,0),1);this.renderClipToTransitionTexture(s,d,this.transFromTexture),this.renderClipToTransitionTexture(r,u,this.transToTexture);let p=this.transitionRenderers.get(e.id);p||(p=me({name:e.transitionKey,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(e.id,p));const g=p.render({width:this.pixiApp.renderer.width,height:this.pixiApp.renderer.height,from:this.transFromTexture,to:this.transToTexture,progress:f,values:e.values});let v=this.transitionSprites.get(e.id);v||(v=new m.Sprite,v.label=`TransitionSprite_${e.id}`,this.transitionSprites.set(e.id,v),a.addChild(v));const x=this.pixiApp.renderer.width/this.scaleX,w=this.pixiApp.renderer.height/this.scaleY;return v.texture=g,v.visible=!0,v.x=0,v.y=0,v.width=x,v.height=w,v.anchor.set(0,0),v.zIndex=e.zIndex,c(),n.add(s.id),n.add(r.id),!0}cleanup(){this.transFromTexture&&this.transFromTexture.destroy(!0),this.transToTexture&&this.transToTexture.destroy(!0),this.transBgGraphics&&this.transBgGraphics.destroy(!0);for(const t of this.transitionSprites.values())t.destroy();this.transitionSprites.clear(),this.transitionRenderers.clear();for(const t of this.transClipPool.values())t.root.destroy({children:!0});this.transClipPool.clear()}}const _t={};function Kn(l,t){_t[l]=t}function Xn(l){delete _t[l]}const qn={rotationMovement:{label:"Rotation Movement",fragment:Xs,uniforms:qs},sepia:{label:"Sepia",fragment:_s,uniforms:$s},glitch:{label:"Glitch",fragment:tr,uniforms:er},pixelate:{label:"Pixelate",fragment:li,uniforms:ci},rgbGlitch:{label:"RGB Glitch",fragment:ir,uniforms:sr},rgbShift:{label:"RGB Shift",fragment:rr,uniforms:or},halftone:{label:"Halftone",fragment:nr,uniforms:ar},sinewave:{label:"Sinewave",fragment:lr,uniforms:cr},shine:{label:"Shine",fragment:hr,uniforms:dr},blink:{label:"Blink",fragment:fr,uniforms:ur},spring:{label:"Spring",fragment:pr,uniforms:mr},duotone:{label:"Duotone",fragment:gr,uniforms:vr},tritone:{label:"Tritone",fragment:yr,uniforms:xr},hueShift:{label:"Hue Shift",fragment:wr,uniforms:br},warpTransition:{label:"Warp Transition",fragment:Cr,uniforms:Tr},slitScan:{label:"Slit Scan",fragment:Sr,uniforms:Ar},slitScanGlitch:{label:"Slit Scan Glitch",fragment:kr,uniforms:Fr},pixelateTransition:{label:"Pixelate Transition",fragment:Rr,uniforms:Mr},focusTransition:{label:"Focus Transition",fragment:Or,uniforms:Er},invert:{label:"Invert",fragment:Dr,uniforms:Pr},grayscale:{label:"Grayscale",fragment:Ir,uniforms:Br},vignette:{label:"Vignette",fragment:Nr,uniforms:zr},chromatic:{label:"Chromatic",fragment:Lr,uniforms:Hr},swirlMovement:{label:"Swirl Movement",fragment:Gr,uniforms:Ur},distort:{label:"Distort",fragment:Wr,uniforms:Vr},perspectiveSingle:{label:"Perspective Single",fragment:Yr,uniforms:Qr},distortSpin:{label:"Distort Spin",fragment:jr,uniforms:Jr},distortGrid:{label:"Distort Grid",fragment:Zr,uniforms:Kr},mirrorTile:{label:"Mirror Tile",fragment:Xr,uniforms:qr},flashLoop:{label:"Flash Loop",fragment:_r,uniforms:$r},filmStripPro:{label:"Film Strip Pro",fragment:to,uniforms:eo},inverseAperture:{label:"Inverse Aperture",fragment:io,uniforms:so},curtainOpen:{label:"Curtain Open",fragment:ro,uniforms:oo},curtainBlur:{label:"Curtain Blur",fragment:no,uniforms:ao},distortV2:{label:"Distort V2",fragment:lo,uniforms:co},neonFlash:{label:"Neon Flash",fragment:ho,uniforms:fo},waveDistort:{label:"Wave Distort",fragment:uo,uniforms:po},scaleMoveBlur:{label:"Scale Move Blur",fragment:mo,uniforms:go},paperBreakReveal:{label:"Paper Break Reveal",fragment:vo,uniforms:yo},laser:{label:"Laser",fragment:xo,uniforms:wo},wave:{label:"Wave",fragment:bo,uniforms:Co},sparks:{label:"Sparks",fragment:To,uniforms:So},tvScanlines:{label:"TV Scanlines",fragment:Ao,uniforms:ko},hdr:{label:"HDR",fragment:Fo,uniforms:Ro},blackFlash:{label:"Black Flash",fragment:Mo,uniforms:Oo},brightPulse:{label:"Bright Pulse",fragment:Eo,uniforms:Do},cameraMove:{label:"Camera Move",fragment:Po,uniforms:Io},hdrV2:{label:"HDR V2",fragment:Bo,uniforms:No},fastZoom:{label:"Fast Zoom",fragment:zo,uniforms:Lo},fadeIn:{label:"Fade In",fragment:Ho,uniforms:Go},fadeOut:{label:"Fade Out",fragment:Uo,uniforms:Wo}};function ge(){return{...qn,..._t}}function ui(){const l=Object.keys(_t);return Object.entries(ge()).map(([t,e])=>({key:t,label:e.label,isCustom:l.includes(t),previewStatic:e.previewStatic||`https://cdn.subgen.co/previews/effects/static/effect_${t}_static.webp`,previewDynamic:e.previewDynamic||`https://cdn.subgen.co/previews/effects/dynamic/effect_${t}_dynamic.webp`}))}const _n=ui(),$n={adjustmentFilter:Q.AdjustmentFilter,advancedBloomFilter:Q.AdvancedBloomFilter,backdropBlurFilter:Q.BackdropBlurFilter,bloomFilter:Q.BloomFilter,colorMapFilter:Q.ColorMapFilter,colorOverlayFilter:Q.ColorOverlayFilter,convolutionFilter:Q.ConvolutionFilter,dotFilter:Q.DotFilter,dropShadowFilter:Q.DropShadowFilter,glitchFilter:Q.GlitchFilter,glowFilter:Q.GlowFilter,godrayFilter:Q.GodrayFilter,grayscaleFilter:Q.GrayscaleFilter,hslAdjustmentFilter:Q.HslAdjustmentFilter,kawaseBlurFilter:Q.KawaseBlurFilter,motionBlurFilter:Q.MotionBlurFilter,oldFilmFilter:Q.OldFilmFilter,pixelateFilter:Q.PixelateFilter,radialBlurFilter:Q.RadialBlurFilter,reflectionFilter:Q.ReflectionFilter,rgbSplitFilter:Q.RGBSplitFilter,tiltShiftFilter:Q.TiltShiftFilter},ve={adjustmentFilter:{gamma:1.5,saturation:.5,contrast:1.2,brightness:1.5,red:1.5,green:1.5,blue:1.5,alpha:1},advancedBloomFilter:{threshold:.2,bloomScale:1,brightness:1,blur:20,quality:1},backdropBlurFilter:{blur:10,quality:4},bloomFilter:{kernelSize:5,quality:2,resolution:3,strength:{x:10,y:10}},colorMapFilter:{mix:1,nearest:!0},colorOverlayFilter:{color:"#ffffff",alpha:1},convolutionFilter:{width:3,height:3,matrix:[1,0,0,0,1,0,0,0,1]},dotFilter:{scale:1,angle:1,grayscale:!0},dropShadowFilter:{blur:1,quality:3,alpha:.5,offset:{x:4,y:4},color:"#000000",shadowOnly:!0},glitchFilter:{seed:.5,slices:10,offset:.1,direction:0,fillMode:0,red:{x:2,y:2},green:{x:10,y:-4},blue:{x:-10,y:4}},glowFilter:{distance:10,outerStrength:2,innerStrength:0,color:"#ffffff",quality:1,alpha:1,knockout:!1},godrayFilter:{time:0,gain:.6,lacunarity:2.75,alpha:1,parallel:!0,angle:30,center:{x:426,y:-100}},grayscaleFilter:{},hslAdjustmentFilter:{hue:100,saturation:1,lightness:0,colorize:!1,alpha:1},kawaseBlurFilter:{strength:4,quality:3,pixelSize:{x:1,y:1}},motionBlurFilter:{velocity:{x:40,y:40},kernelSize:5,offset:0},oldFilmFilter:{sepia:.3,noise:.3,noiseSize:1,scratch:.5,scratchDensity:.5,scratchWidth:1,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3},pixelateFilter:{size:10},radialBlurFilter:{angle:20,center:{x:0,y:0},radius:300,kernelSize:15},reflectionFilter:{mirror:!0,boundary:.5,amplitude:[20,50],waveLength:[30,100],alpha:[1,1],time:0},rgbSplitFilter:{red:{x:2,y:2},green:{x:10,y:-4},blue:{x:-10,y:4}},tiltShiftFilter:{blur:100,gradientBlur:600,start:{x:0,y:0},end:{x:853,y:414}}},ta={adjustmentFilter:{gamma:{min:0,max:5,step:.07},saturation:{min:0,max:5,step:.07},contrast:{min:0,max:5,step:.07},brightness:{min:0,max:5,step:.07},red:{min:0,max:5,step:.07},green:{min:0,max:5,step:.07},blue:{min:0,max:5,step:.07},alpha:{min:0,max:5,step:.07}},advancedBloomFilter:{threshold:{min:.1,max:.9,step:.009},bloomScale:{min:.5,max:1.5,step:.015},brightness:{min:.5,max:1.5,step:.015},blur:{min:0,max:20,step:.2},quality:{min:1,max:20,step:1}},backdropBlurFilter:{blur:{min:0,max:100,step:2.3},quality:{min:1,max:10,step:.1}},bloomFilter:{kernelSize:{min:0,max:15,step:1},quality:{min:0,max:10,step:1},resolution:{min:0,max:10,step:1},strength:{x:{min:0,max:20,step:.5},y:{min:0,max:20,step:.5}}},colorMapFilter:{mix:{min:0,max:1,step:.013}},colorOverlayFilter:{alpha:{min:0,max:1,step:.013}},convolutionFilter:{width:{min:0,max:500,step:1},height:{min:0,max:500,step:1},matrix:[{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01},{max:0,min:1,step:.01}]},dotFilter:{scale:{min:.3,max:1,step:.01},angle:{min:0,max:5,step:.01}},dropShadowFilter:{blur:{min:0,max:20,step:.5},quality:{min:1,max:20,step:1},alpha:{min:0,max:1,step:.013},offset:{x:{min:-50,max:50,step:2.5},y:{min:-50,max:50,step:2.5}}},glitchFilter:{seed:{min:0,max:1,step:.01},slices:{min:2,max:20,step:.01},offset:{min:-400,max:400,step:.1},direction:{min:-180,max:180,step:.1},red:{x:{min:-50,max:50,step:1},y:{min:-50,max:50,step:1}},green:{x:{min:-50,max:50,step:1},y:{min:-50,max:50,step:1}},blue:{x:{min:-50,max:50,step:1},y:{min:-50,max:50,step:1}}},glowFilter:{distance:{min:0,max:20,step:.013},outerStrength:{min:0,max:20,step:.013},innerStrength:{min:0,max:20,step:.013},quality:{min:0,max:1,step:.013},alpha:{min:0,max:1,step:.013}},godrayFilter:{time:{min:0,max:1,step:.013},gain:{min:0,max:1,step:.013},lacunarity:{min:0,max:5,step:.013},alpha:{min:0,max:1,step:.013},angle:{min:-60,max:60,step:.1},center:{x:{min:-100,max:960,step:14},y:{min:-1e3,max:-100,step:14}}},grayscaleFilter:{},hslAdjustmentFilter:{hue:{min:-180,max:180,step:.013},saturation:{min:-1,max:1,step:.013},lightness:{min:-1,max:1,step:.013},alpha:{min:0,max:1,step:.013}},kawaseBlurFilter:{strength:{min:0,max:20,step:.013},quality:{min:1,max:20,step:.013},pixelSize:{x:{min:0,max:10,step:.013},y:{min:0,max:10,step:.013}}},motionBlurFilter:{velocity:{x:{min:-90,max:90,step:.013},y:{min:-90,max:90,step:.013}},kernelSize:{min:0,max:25,step:3},offset:{min:-150,max:150,step:.1}},oldFilmFilter:{sepia:{min:0,max:1,step:.01},noise:{min:0,max:1,step:.01},noiseSize:{min:1,max:20,step:1},scratch:{min:-1,max:1,step:.01},scratchDensity:{min:0,max:1,step:.01},scratchWidth:{min:1,max:20,step:1},vignetting:{min:0,max:1,step:.01},vignettingAlpha:{min:0,max:1,step:.01},vignettingBlur:{min:0,max:1,step:.01}},pixelateFilter:{size:{min:4,max:40,step:.013}},radialBlurFilter:{angle:{min:-180,max:180,step:.1},center:{x:{min:0,max:2e3,step:.1},y:{min:0,max:2e3,step:.1}},radius:{min:-1,max:860,step:.1},kernelSize:{min:0,max:25,step:3}},reflectionFilter:{boundary:{min:0,max:1,step:.01},amplitude:[{min:0,max:50,step:.013},{min:0,max:50,step:.013}],waveLength:[{min:0,max:200,step:.013},{min:0,max:200,step:.013}],alpha:[{min:0,max:1,step:.01},{min:0,max:1,step:.01}],time:{min:0,max:20,step:.01}},rgbSplitFilter:{red:{x:{min:-20,max:20,step:.013},y:{min:-20,max:20,step:.013}},green:{x:{min:-20,max:20,step:.013},y:{min:-20,max:20,step:.013}},blue:{x:{min:-20,max:20,step:.013},y:{min:-20,max:20,step:.013}}},tiltShiftFilter:{blur:{min:0,max:200,step:.1},gradientBlur:{min:0,max:1e3,step:1},start:{x:{min:0,max:2e3,step:.1},y:{min:0,max:2e3,step:.1}},end:{x:{min:0,max:2e3,step:.1},y:{min:0,max:2e3,step:.1}}}},ea="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAAQCAIAAAB2sTYeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF6GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxOC0wMS0yM1QwMjo0NToyMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTgtMDEtMjNUMDQ6MzQ6NTUrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTgtMDEtMjNUMDQ6MzQ6NTUrMDg6MDAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDk0MTcyNTUtZDRlNS00YjRiLTlhNGUtYjVhOGQ4MjIzMDgzIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkQ2NDI4MEY0RjY2MjExRTdCOTdGOENCMTc0MEREQUYxIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6RDY0MjgwRjRGNjYyMTFFN0I5N0Y4Q0IxNzQwRERBRjEiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENjQyODBGMUY2NjIxMUU3Qjk3RjhDQjE3NDBEREFGMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENjQyODBGMkY2NjIxMUU3Qjk3RjhDQjE3NDBEREFGMSIvPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTQxNzI1NS1kNGU1LTRiNGItOWE0ZS1iNWE4ZDgyMjMwODMiIHN0RXZ0OndoZW49IjIwMTgtMDEtMjNUMDQ6MzQ6NTUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz51hjvPAAAUu0lEQVRogYXa648dd5oX8M+vqk6dW1/cbXe7Hd+SOL52fIkvncsk2SwZRoM0I8QiVgjBCiHBSxDafwFerMQ7VghegIS0aHeE0CAYwTIww04SPEwymcQza09uTuIkdtqXbruvp/v0qVO8qKru0207PDq2+pz61q9+l+9zrSfYkieY4Vtc4AjjNIibQpMGw+BDYTv+Rc5zbBNvC1DIIP45XuUST7Hn0fjxANmQhZFq/EuD89mJfyVI2Zi08Iwvxyy/pnvhm8b/w+LrAS764ohrk9YvWT6iM67T0H0I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",ia="data:image/png;base64,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";async function ye({name:l,renderer:t,values:e}){let i=null;const s=l in ve;let r={};if(s){const n=$n[l];r={...ve[l],...e},l==="colorMapFilter"&&(r.colorMap=await m.Assets.load(ea)),l==="simpleLightmapFilter"&&(r.lightMap=await m.Assets.load(ia)),i=new n(r)}else{const n=ge(),c=Object.keys(n).find(g=>g.toLowerCase()===l.toLowerCase());if(!c)return console.warn(`Effect ${l} not found`),{filter:null,render(g){return null}};const{fragment:h,uniforms:d,label:u}=n[c],f=new m.GlProgram({vertex:Et,fragment:h,name:`${u}-shader`}),p=new m.UniformGroup({uTime:{value:0,type:"f32"},...d});i=new m.Filter({glProgram:f,resources:{effectUniforms:p}})}const o=new m.Sprite,a=m.RenderTexture.create({width:t.width,height:t.height});return o.filters=[i],{filter:i,render({width:n,height:c,canvasTexture:h,progress:d,values:u}){(a.width!==n||a.height!==c)&&a.resize(n,c);const f=h instanceof m.RenderTexture?h:m.Texture.from(h);o.texture=f,o.width=n,o.height=c;const p={...r,...u};if(s)u&&Object.assign(i,p);else if(i.resources?.effectUniforms&&(i.resources.effectUniforms.uniforms.uTime=d,u))for(const[g,v]of Object.entries(u))i.resources.effectUniforms.uniforms[g]&&(i.resources.effectUniforms.uniforms[g]=v);return t.render({container:o,target:a,clear:!0}),a}}}class sa{pixiApp;effectCache=new Map;effectInputTexture=null;scaleX;scaleY;constructor(t,e,i=1,s=1){this.scaleX=i>0?i:1,this.scaleY=s>0?s:1,this.pixiApp=t,this.effectInputTexture=e?m.RenderTexture.create({width:t.renderer.width,height:t.renderer.height}):null}async processEffects(t){const{timestamp:e,sprites:i,spriteById:s,spriteIndexById:r,spriteRenderers:o,transitionSprites:a,clipsEffectContainer:n,clipsNormalContainer:c,postProcessContainer:h}=t;if(!this.effectInputTexture)return;const d=[];for(const u of i)if(u instanceof dt&&e>=u.display.from&&e<u.display.from+u.duration&&d.push({id:u.id,key:u.effectKey,startTime:u.display.from,duration:u.duration,zIndex:u.zIndex,values:u.values}),u.effects&&u.effects.length>0)for(const f of u.effects)e>=f.startTime&&e<f.startTime+f.duration&&d.push({...f,zIndex:u.zIndex});d.sort((u,f)=>u.zIndex-f.zIndex),h.removeChildren();for(const u of o.values()){const f=u.getRoot();f&&f.parent!==c&&(f.parent&&f.parent.removeChild(f),c.addChild(f))}if(d.length>0){const u=this.pixiApp.renderer.width,f=this.pixiApp.renderer.height,p=u/this.scaleX,g=f/this.scaleY;let v=null;const x=new Set;for(const w of d){const{key:T,startTime:y,duration:C,id:k,zIndex:O}=w,F=e-y,b=C>0?Math.min(Math.max(F/C,0),1):0,S=s.get(k),A=S!=null&&S instanceof dt;if(n.removeChildren(),v){const P=new m.Sprite(v);P.width=p,P.height=g,n.addChild(P)}const E=r.get(k)??-1;for(const P of i){if(x.has(P.id))continue;let R=!1;if(A){if(P.id===k)continue;const B=r.get(P.id)??-1;R=P.zIndex<O||P.zIndex===O&&B>E}else R=!!P.effects&&P.effects.some(B=>B.id===k);if(R){const B=o.get(P);if(B){const I=B.getRoot();I&&(I.parent&&I.parent.removeChild(I),n.addChild(I),x.add(P.id))}const U=a.get(P.id);U&&(U.parent&&U.parent.removeChild(U),n.addChild(U),x.add(P.id))}}if(n.children.length>0){let P=this.effectCache.get(k);if(!P)try{const R=await ye({name:T,renderer:this.pixiApp.renderer,values:w.values});R&&R.filter&&(P={filter:R.filter,render:R.render},this.effectCache.set(k,P))}catch(R){console.warn("Failed to create effect",T,R)}if(P){const{filter:R,render:B}=P;R.resources&&R.resources.effectUniforms&&(R.resources.effectUniforms.uniforms.uTime=b),n.visible=!0,this.pixiApp.renderer.render({container:n,target:this.effectInputTexture,clear:!0}),n.visible=!1,B&&(v=B({canvasTexture:this.effectInputTexture,progress:b,width:u,height:f}))}}}if(v){const w=new m.Sprite(v);w.width=p,w.height=g,h.addChild(w);for(const T of i){if(x.has(T.id)||T instanceof dt||T.expired)continue;const y=o.get(T);if(y){const C=y.getRoot();C&&C.visible&&(C.parent&&C.parent.removeChild(C),h.addChild(C))}}}}}cleanup(){this.effectInputTexture&&this.effectInputTexture.destroy(!0),this.effectCache.clear()}}function pi(l){const{pixiApp:t,sprites:e,aborter:i,scaleX:s,scaleY:r}=l,o=t!=null,a=new Map,n=o&&t?new Zn(t,s,r):null,c=o&&t?new sa(t,o,s,r):null;let h=null,d=null,u=null;o&&t!=null&&(h=new m.Container,d=new m.Container,u=new m.Container,d.scale.set(s,r),h.scale.set(s,r),u.scale.set(s,r),d.sortableChildren=!0,u.sortableChildren=!0,t.stage.addChild(d),t.stage.addChild(u),h.visible=!1,t.stage.addChild(h));const f=[...e].sort((w,T)=>w.zIndex-T.zIndex),p=new Map,g=new Map;for(let w=0;w<e.length;w++)p.set(e[w].id,e[w]),g.set(e[w].id,w);return{render:async w=>{const T=[];let y=!1,C=!1;const k=new Map,O=async(b,S)=>{if(k.has(b))return k.get(b);const A=await b.getFrame(S);return k.set(b,A),A};n&&n.resetFrame();const F=new Set;for(const b of f){if(i.aborted)break;if(b.display.to>0&&w>=b.display.to&&(b.expired=!0),w<b.display.from||b.expired){if(o&&t!=null){const N=a.get(b);N&&await N.updateFrame(null)}continue}const A=w-b.display.from,E=A*b.playbackRate;if(b.animate(E),o&&t!=null&&d!=null&&(b.type==="Text"||b.type==="Caption")){b.type==="Caption"&&typeof b.updateState=="function"&&b.updateState(A*b.playbackRate),typeof b.setRenderer=="function"&&b.setRenderer(t.renderer);let N=a.get(b);if(N==null&&(N=new pe(t,b,d),a.set(b,N)),F.has(b.id)){const X=N.getRoot();X&&(X.visible=!1),await N.updateFrame(null)}else{const X=await b.getTexture();if(X!=null){C=!0;const z=N.getRoot();z&&(z.visible=!0),await N.updateFrame(X)}}N.updateTransforms(),T.push([]);const Z=b.duration>0&&A>b.duration,ft=b.display.to>0&&w>=b.display.to;if(Z||ft){b.main&&(y=!0),b.expired=!0;const X=N.getRoot();X&&(X.visible=!1)}continue}const{video:P,audio:R,done:B}=await O(b,A);if(R&&R.length>0&&(b.timing?.fadeIn||b.timing?.fadeOut)){const N=b.duration&&b.duration!==1/0?b.duration:b.display.to-b.display.from,W=R[0].length/H.sampleRate*1e6,Z=A+W;Di(R,Z,N,H.sampleRate,b.timing?.fadeIn,b.timing?.fadeOut)}T.push(R);const U=b.type==="Video"||b.type==="Image",I=b.transition?b.transition.start:0,D=b.transition?b.transition.end:0,L=U&&b.transition&&w>=I&&w<D;if(o&&t!=null&&d!=null&&n!=null){if(b instanceof tt){const W=p.get(b.fromClipId??""),Z=p.get(b.toClipId??"");if(W&&Z&&await n.renderTransition({sprite:b,timestamp:w,fromClip:W,toClip:Z,getFrameCached:O,clipsNormalContainer:d,clipsClaimedByTransition:F,onVideoState:()=>{C=!0}})){const X=a.get(W);if(X){const V=X.getRoot();V&&(V.visible=!1)}const z=a.get(Z);if(z){const V=z.getRoot();V&&(V.visible=!1)}continue}}let N=a.get(b);if(N==null&&P!=null&&(N=new pe(t,b,d),a.set(b,N)),N!=null){const W=N.getRoot(),Z=F.has(b.id);P!=null&&!L&&!Z?(C=!0,W&&(W.visible=!0),await N.updateFrame(P)):(W&&(W.visible=!1),await N.updateFrame(null)),N.updateTransforms()}}const G=b.duration>0&&A>b.duration,J=b.display.to>0&&w>=b.display.to;if((G||J||B)&&(b.main&&(y=!0),b.expired=!0,o)){const N=a.get(b);if(N!=null){const W=N.getRoot();W&&(W.visible=!1)}}}if(o&&t!=null&&h!=null&&d!=null&&u!=null&&c!=null){const b=new Map;for(const S of e)if(S instanceof tt){const A=n?.getTransitionSprite(S.id);A&&b.set(S.id,A)}await c.processEffects({timestamp:w,sprites:e,spriteById:p,spriteIndexById:g,spriteRenderers:a,transitionSprites:b,clipsEffectContainer:h,clipsNormalContainer:d,postProcessContainer:u})}return o&&t!=null&&t.render(),{audios:T,mainSprDone:y,hasVideo:C}},cleanup:()=>{n&&n.cleanup(),c&&c.cleanup(),h&&h.destroy({children:!0}),d&&d.destroy({children:!0}),u&&u.destroy({children:!0}),a.forEach(w=>{w.destroy()}),a.clear()}}}function ra(l,t=30){const e=l*H.channelCount,s=Math.ceil(H.sampleRate/t)*H.channelCount+e*2;let r=new Float32Array(Math.max(e*3,s)),o=0;const a=u=>{if(r.length<u){const f=new Float32Array(u);f.set(r.subarray(0,o),0),r=f}};let n=0;const c=l/H.sampleRate*1e6,h=new Float32Array(e),d=(u,f)=>{let p=0;const g=Math.floor(o/e),v=[];for(let T=0;T<g;T++)v.push(new AudioData({timestamp:n,numberOfChannels:H.channelCount,numberOfFrames:l,sampleRate:H.sampleRate,format:"f32",data:r.subarray(p,p+e)})),p+=e,n+=c;const x=o-p,w=Math.floor(x/H.channelCount);for(!f&&w>0&&(v.push(new AudioData({timestamp:n,numberOfChannels:H.channelCount,numberOfFrames:w,sampleRate:H.sampleRate,format:"f32",data:r.subarray(p,p+w*H.channelCount)})),p+=w*H.channelCount,n+=w/H.sampleRate*1e6),r.set(r.subarray(p,o),0),o-=p;u-n>c;)v.push(new AudioData({timestamp:n,numberOfChannels:H.channelCount,numberOfFrames:l,sampleRate:H.sampleRate,format:"f32",data:h})),n+=c;return v};return(u,f)=>{const p=f.length===0?0:Math.max(...f.map(v=>v[0]?.length??0)),g=p>0;g&&a(o+p*H.channelCount);for(let v=0;v<p;v++){let x=0,w=0;for(let T=0;T<f.length;T++){const y=f[T][0]?.[v]??0,C=f[T][1]?.[v]??y;x+=y,w+=C}r[o]=x,r[o+1]=w,o+=2}return d(u,g)}}function oa(l){try{return l.getContext("webgl2")??l.getContext("webgl")}catch{return null}}function na(l){const{canvas:t,outputAudio:e,muxer:i,hasVideoTrack:s,timeSlice:r}=l;let o=0;const a=Math.floor(3*l.fps),n=s?oa(t):null,c=ra(1024,l.fps);return async(h,d,u)=>{if(e!==!1)for(const f of c(h,d))await i.encodeAudio(f);if(s&&u)try{n!=null&&!n.isContextLost()&&n.finish();const f=new VideoFrame(t,{duration:r,timestamp:h});await i.encodeVideo(f,{keyFrame:o%a===0}),o+=1}catch(f){console.warn("Failed to create VideoFrame from canvas, skipping frame:",f)}}}let aa=0;class la extends se{static async isSupported(t={}){return(self.OffscreenCanvas!=null&&self.VideoEncoder!=null&&self.VideoDecoder!=null&&self.VideoFrame!=null&&self.AudioEncoder!=null&&self.AudioDecoder!=null&&self.AudioData!=null&&((await self.VideoEncoder.isConfigSupported({codec:t.videoCodec??"avc1.42E032",width:t.width??1920,height:t.height??1080,bitrate:t.bitrate??7e6})).supported??!1)&&(await self.AudioEncoder.isConfigSupported({codec:(await Qe()).codec,sampleRate:H.sampleRate,numberOfChannels:H.channelCount})).supported)??!1}logger=Y.create(`id:${aa++},`);destroyed=!1;sprites=[];canvas;pixiApp=null;stopOutput=null;opts;resolvedAudio=void 0;explicitOpts;hasVideoTrack;jsonDimensions={width:0,height:0};constructor(t={}){super();const{width:e=0,height:i=0}=t;this.canvas=new OffscreenCanvas(e,i),this.opts=Object.assign({backgroundColor:"#000",width:0,height:0,format:"mp4",videoCodec:"avc1.42E032",audio:!0,audioCodec:"aac",audioSampleRate:48e3,bitrate:5e6,fps:30,metaDataTags:null},t),this.explicitOpts={...t},this.hasVideoTrack=e*i>0,Qe().catch(s=>{this.logger.warn("Failed to detect audio codec:",s)})}async initPixiApp(){const{width:t,height:e}=this.opts;if(this.pixiApp=new m.Application,await this.pixiApp.init({canvas:this.canvas,width:t,height:e,backgroundColor:0,antialias:!1,autoDensity:!1,resolution:1,preference:"webgl"}),this.pixiApp.renderer==null||this.pixiApp.stage==null)throw new Error("Pixi.js Application failed to initialize properly");try{const i=this.pixiApp;i.ticker&&typeof i.ticker.stop=="function"&&i.ticker.stop()}catch{}await this.resolveAudioEncoding()}async resolveAudioEncoding(){if(this.opts.audio===!1){this.resolvedAudio=void 0;return}this.resolvedAudio=await zi(this.opts.audioCodec||H.codecType,this.opts.audioSampleRate||H.sampleRate,H.channelCount)}async addSprite(t,e={}){const i={rect:{x:t.left,y:t.top,w:t.width,h:t.height},display:{...t.display},duration:t.duration,playbackRate:t.playbackRate,zIndex:t.zIndex};this.logger.info("Compositor add clip",i);const s=await t.clone();this.pixiApp!=null&&this.pixiApp.renderer!=null&&typeof s.setRenderer=="function"&&s.setRenderer(this.pixiApp.renderer),this.logger.info("Compositor add clip ready"),this.sprites.push(Object.assign(s,{main:e.main??!1,expired:!1})),this.sprites.sort((r,o)=>r.zIndex-o.zIndex)}initMuxer(t){const{fps:e,width:i,height:s,videoCodec:r,bitrate:o,audio:a,metaDataTags:n,format:c,audioCodec:h,audioSampleRate:d}=this.opts,u=this.sprites.some(g=>g.width>0&&g.height>0),f=this.hasVideoTrack&&u;return it.recodemux({format:c||"mp4",video:f?{width:i,height:s,expectFPS:e,codec:r,bitrate:o,__unsafe_hardwareAcceleration__:this.opts.__unsafe_hardwareAcceleration__}:null,audio:a===!1||this.resolvedAudio===null?null:{codec:this.resolvedAudio?.codecType??(h||H.codecType),sampleRate:this.resolvedAudio?.sampleRate??(d||H.sampleRate),channelCount:H.channelCount},duration:t,metaDataTags:n})}output(t={}){if(this.sprites.length===0)throw Error("No sprite added");const e=this.sprites.find(c=>c.main),s=this.sprites.map(c=>c.display.to>0?c.display.to:c.display.from+c.duration).filter(c=>c!==1/0),r=t.maxTime??(e!=null?e.display.to>0?e.display.to:e.display.from+e.duration:s.length>0?Math.max(...s):0);if(r===1/0||r<=0)throw Error("Unable to determine the end time, please specify a main sprite, or limit the duration of Image, Audio");r===-1&&this.logger.warn("Unable to determine the end time, process value don't update"),this.logger.info(`start combinate video, maxTime:${r}`);const o=this.initMuxer(r),a=performance.now(),n=this.runEncoding(o,r,{onProgress:c=>{this.logger.debug("export:progress:",c),this.emit("export:progress",c)},onEnded:async()=>{await o.flush(),this.logger.info("===== output ended =====, cost:",performance.now()-a),this.emit("export:progress",1),this.destroy()},onError:c=>{this.emit("error",c),o.close(),this.destroy()}});return this.stopOutput=()=>{n(),o.close()},o.stream}destroy(){if(!this.destroyed&&(this.destroyed=!0,this.stopOutput?.(),this.off("export:progress"),this.off("error"),this.pixiApp!=null))try{const t=this.pixiApp;if(t.destroyed===!0){this.pixiApp=null;return}if(t.ticker&&typeof t.ticker.stop=="function")try{t.ticker.stop()}catch{}if(t.renderer!=null){const e=t.renderer.gl;if(e&&e.isContextLost()){this.pixiApp=null;return}this.pixiApp.destroy()}}catch(t){console.warn("Error while destroying Pixi application:",t)}finally{this.pixiApp=null}}runEncoding(t,e,{onProgress:i,onEnded:s,onError:r}){let o=0;const a={aborted:!1};let n=null,c=null;const h=async()=>{const{fps:f,backgroundColor:p,audio:g}=this.opts,v=Math.round(1e6/f),x=this.sprites.some(S=>S.width>0&&S.height>0),w=this.jsonDimensions.width||this.opts.width||1920,T=this.jsonDimensions.height||this.opts.height||1080,y=this.opts.width>0?this.opts.width/w:1,C=this.opts.height>0?this.opts.height/T:1;c=pi({pixiApp:this.pixiApp,sprites:this.sprites,aborter:a,scaleX:y,scaleY:C});const k=na({muxer:t,canvas:this.canvas,outputAudio:g,hasVideoTrack:this.hasVideoTrack&&x,timeSlice:v,fps:f});let O=0;const F=4;let b=0;for(;;){if(n!=null)return;if(a.aborted||e!==-1&&O>e||this.sprites.length===0){d(),await s();return}o=O/e;const{audios:S,mainSprDone:A,hasVideo:E}=await c.render(O);if(A){d(),await s();return}if(a.aborted)return;this.hasVideoTrack&&E&&(O===0?(await new Promise(P=>setTimeout(P,50)),b=0):(b++,b>=F&&(await ai(),b=0))),await k(O,S,E),O+=v,await Ks(t.getEncodeQueueSize)}},d=()=>{a.aborted||(a.aborted=!0,clearInterval(u),c?.cleanup(),this.sprites.forEach(f=>{f.destroy()}))};h().catch(f=>{n=f,this.logger.error(f),d(),r(f)});const u=setInterval(()=>{i(o)},500);return d}exportToJSON(){const t={};for(const i of this.sprites)t[i.id]=Gt(i,i.main);const e=[];return this.sprites.forEach(i=>{if(i.transition){const s=this.sprites.filter(r=>r.id!==i.id&&r.zIndex===i.zIndex&&r.display.from<i.display.from&&(r instanceof ct||r instanceof Nt)).sort((r,o)=>o.display.to-r.display.to)[0];s&&e.push({key:i.transition.name,duration:i.transition.duration,clips:[s.id,i.id]})}}),{clips:t,settings:{width:this.opts.width,height:this.opts.height,fps:this.opts.fps,backgroundColor:this.opts.backgroundColor,format:this.opts.format,videoCodec:this.opts.videoCodec,bitrate:this.opts.bitrate,audio:this.opts.audio,audioCodec:this.opts.audioCodec,audioSampleRate:this.opts.audioSampleRate,metaDataTags:this.opts.metaDataTags}}}async loadFromJSON(t){this.sprites.forEach(o=>{o.destroy()}),this.sprites=[];let e=!1;t.settings&&(t.settings.width!==void 0&&this.explicitOpts.width===void 0&&(this.opts.width!==t.settings.width&&(e=!0),this.opts.width=t.settings.width),t.settings.height!==void 0&&this.explicitOpts.height===void 0&&(this.opts.height!==t.settings.height&&(e=!0),this.opts.height=t.settings.height),e&&this.opts.width>0&&this.opts.height>0&&(this.canvas.width=this.opts.width,this.canvas.height=this.opts.height,this.pixiApp?.renderer&&this.pixiApp.renderer.resize(this.opts.width,this.opts.height)),t.settings.width&&t.settings.height&&(this.jsonDimensions={width:t.settings.width,height:t.settings.height}),t.settings.fps!==void 0&&this.explicitOpts.fps===void 0&&(this.opts.fps=t.settings.fps),t.settings.backgroundColor!==void 0&&this.explicitOpts.backgroundColor===void 0&&(this.opts.backgroundColor=t.settings.backgroundColor),t.settings.format!==void 0&&this.explicitOpts.format===void 0&&(this.opts.format=t.settings.format),t.settings.videoCodec!==void 0&&this.explicitOpts.videoCodec===void 0&&(this.opts.videoCodec=t.settings.videoCodec),t.settings.bitrate!==void 0&&this.explicitOpts.bitrate===void 0&&(this.opts.bitrate=t.settings.bitrate),t.settings.audio!==void 0&&this.explicitOpts.audio===void 0&&(this.opts.audio=t.settings.audio===!1?!1:void 0),t.settings.audioCodec!==void 0&&this.explicitOpts.audioCodec===void 0&&(this.opts.audioCodec=t.settings.audioCodec),t.settings.audioSampleRate!==void 0&&this.explicitOpts.audioSampleRate===void 0&&(this.opts.audioSampleRate=t.settings.audioSampleRate),t.settings.metaDataTags!==void 0&&this.explicitOpts.metaDataTags===void 0&&(this.opts.metaDataTags=t.settings.metaDataTags));const i=new Map,s=new Set;if(t.tracks){const o=t.tracks.length;t.tracks.forEach((a,n)=>{if(a.clipIds)for(const c of a.clipIds)i.set(c,(o-n)*10),a.muted&&s.add(c)})}const r=Object.values(t.clips??{});for(const o of r){const a=await bt(o);i.has(a.id)&&(a.zIndex=i.get(a.id)),s.has(a.id)&&(a.trackMuted=!0),await this.addSprite(a,{main:o.main||!1})}for(const o of this.sprites)if(o instanceof tt){const a=o.fromClipId?this.sprites.find(h=>h.id===o.fromClipId):null,n=o.toClipId?this.sprites.find(h=>h.id===o.toClipId):null;if(a&&n){const h=n.display.from,d=Math.max(0,h-o.duration/2),u=d+o.duration;o.display.from=d,o.display.to=u}const c={name:o.transitionKey,key:o.transitionKey,duration:o.duration,fromClipId:o.fromClipId,toClipId:o.toClipId,start:o.display.from,end:o.display.to};a&&(a.transition={...c}),n&&(n.transition={...c})}await this.resolveAudioEncoding()}async renderFrame(t,e){if(this.destroyed)throw new Error("Compositor has been destroyed.");if(this.pixiApp==null&&await this.initPixiApp(),this.pixiApp==null)throw new Error("Compositor Pixi application could not be initialised. Ensure width and height are greater than 0.");const i=t*1e3,s=this.jsonDimensions.width||this.opts.width||1920,r=this.jsonDimensions.height||this.opts.height||1080,o=pi({pixiApp:this.pixiApp,backgroundColor:this.opts.backgroundColor,sprites:this.sprites,aborter:{aborted:!1},scaleX:this.opts.width>0?this.opts.width/s:1,scaleY:this.opts.height>0?this.opts.height/r:1});let a;try{await o.render(i);const n=e?.transparent??!1,c=this.pixiApp.renderer.background.alpha;n&&(this.pixiApp.renderer.background.alpha=0);const h=m.RenderTexture.create({width:this.opts.width,height:this.opts.height});try{this.pixiApp.renderer.render({container:this.pixiApp.stage,target:h,clear:!0}),a=await this.pixiApp.renderer.extract.base64(h,"image/png",1)}finally{h.destroy(),n&&(this.pixiApp.renderer.background.alpha=c)}}finally{o.cleanup()}return a}async snapshot(t,e){const i=typeof t=="number"?e:t,s=typeof t=="number"?t:void 0;return this.renderFrame(s??0,i)}}class ca{core;studio;constructor(t,e){this.core=t,this.studio=e,this.init()}isSyncing=!1;disposed=!1;queue=Promise.resolve();generation=0;resyncQueued=!1;pendingSeek=null;seekRunning=!1;unsubscribers=[];async init(){if(await this.studio.ready,this.disposed)return;const t=(s,r)=>{this.core.on(s,r),this.unsubscribers.push(()=>this.core.off(s,r))},e=(s,r)=>{const o=this.studio.on(s,r);this.unsubscribers.push(typeof o=="function"?o:()=>this.studio.off(s,r))};t("timeupdate",s=>this.requestSeek(s)),t("play",()=>this.guarded(()=>this.studio.play())),t("pause",()=>this.guarded(()=>this.studio.pause())),e("currentTime",({currentTime:s})=>{if(this.studio.isPlaying&&!this.isSyncing){this.isSyncing=!0;try{this.core.seek(s)}finally{this.isSyncing=!1}}}),e("play",()=>this.guarded(()=>this.core.play())),e("pause",()=>this.guarded(()=>this.core.pause()));const i=s=>{if(!this.isSyncing){this.isSyncing=!0;try{const r=s.selected.map(a=>a.id),o=this.core.store.getState().selectedIds;JSON.stringify(r)!==JSON.stringify(o)&&this.core.store.getState().select(r)}finally{this.isSyncing=!1}}};e("selection:created",i),e("selection:updated",i),e("selection:cleared",()=>i({selected:[]})),t("change",s=>this.onCoreChange(s)),await this.requestResync()}guarded(t){if(!this.isSyncing){this.isSyncing=!0;try{t()}finally{this.isSyncing=!1}}}enqueue(t){const e=this.queue.then(async()=>{if(!this.disposed)try{await t()}catch(i){console.error("[StudioBridge] Failed to apply Core changes:",i)}});return this.queue=e,e}requestResync(){return this.generation+=1,this.resyncQueued?this.queue:(this.resyncQueued=!0,this.enqueue(async()=>{this.resyncQueued=!1,await this.syncInitialState()}))}requestSeek(t){this.pendingSeek=t,!this.seekRunning&&(this.seekRunning=!0,(async()=>{try{for(;this.pendingSeek!=null&&!this.disposed;){const e=this.pendingSeek;this.pendingSeek=null;const i=this.isSyncing;this.isSyncing=!0;try{await this.studio.transport.seek(e)}finally{this.isSyncing=i}}}finally{this.seekRunning=!1}})())}syncSelectionToStudio(t){const e=this.studio.selection.getSelection().map(i=>i.id);JSON.stringify(t)!==JSON.stringify(e)&&this.studio.selectClipsByIds(t)}onCoreChange(t){if(t.some(i=>i.path==="/")){this.requestResync();return}const e=this.generation;this.enqueue(async()=>{e===this.generation&&await this.handlePatches(t)})}async handlePatches(t){for(const e of t){const i=e.path.split("/").filter(Boolean);if(i[0]==="clips"){const s=i[1];e.op==="add"&&!i[2]?await this.addClipSafely(e.value):e.op==="remove"&&!i[2]?await this.handleRemoveClip(s):e.op==="update"&&await this.handleUpdateClip(s,i.slice(2),e.value)}if(i[0]==="tracks"&&await this.studio.setTracks(this.core.store.getState().tracks),i[0]==="settings"){const s=this.core.store.getState().settings;(this.studio.opts.width!==s.width||this.studio.opts.height!==s.height)&&this.studio.setSize(s.width,s.height),this.studio.updateFrame(this.core.store.getState().currentTime)}i[0]==="selectedIds"&&this.syncSelectionToStudio(this.core.store.getState().selectedIds)}}getTrackCaptionConfig(t){return this.core.store.getState().tracks.find(s=>s.clipIds.includes(t))?.config?.captions??void 0}buildClipContext(t){if(t.type!=="Caption")return;const e=this.getTrackCaptionConfig(t.id);return e?{captionConfig:e}:void 0}async addClipSafely(t){try{await this.handleAddClip(t)}catch(e){console.warn(`[StudioBridge] Skipped clip ${t?.id} (${t?.type}): could not load`,e)}}async handleAddClip(t){if(t.type==="Transition")await this.studio.addTransition(t.transitionKey||"none",t.duration,t.fromClipId,t.toClipId,t.id);else{const e=this.buildClipContext(t);await this.ensureFontForClip(t,e?.captionConfig);const i=await bt(t,e),s=this.findTrackIdForClip(t.id);await this.studio.addClip(i,{trackId:s})}}async handleRemoveClip(t){const e=this.studio.timeline.getClipById(t);e&&await this.studio.removeClip(e)}async handleUpdateClip(t,e,i){const s=this.studio.timeline.getClipById(t);if(s)if(e.length===0){const r=s.locked;this.syncClipProperties(s,i)&&(r!==s.locked&&this.studio.selection.selectedClips.has(s)&&this.studio.selection.recreateTransformer(),await this.studio.timeline.recalculateMaxDuration(),this.studio.updateFrame(this.studio.currentTime))}else{const r=e[0];let o=!1;if(r==="timing")if(e.length===1)i&&(i.display&&(s.display={...i.display}),i.trim&&(s.trim={...i.trim}),i.duration!==void 0&&(s.duration=i.duration),i.playbackRate!==void 0&&(s.playbackRate=i.playbackRate),i.fadeIn!==void 0?s.timing.fadeIn=i.fadeIn:delete s.timing.fadeIn,i.fadeOut!==void 0?s.timing.fadeOut=i.fadeOut:delete s.timing.fadeOut,o=!0);else{const a=e[1];a==="display"?(s.display={...i},o=!0):a==="trim"?(s.trim={...i},o=!0):a==="duration"?(s.duration=i,o=!0):a==="playbackRate"?(s.playbackRate=i,o=!0):a==="fadeIn"?(i!==void 0?s.timing.fadeIn=i:delete s.timing.fadeIn,o=!0):a==="fadeOut"&&(i!==void 0?s.timing.fadeOut=i:delete s.timing.fadeOut,o=!0)}else if(r==="display")(!s.display||s.display.from!==i.from||s.display.to!==i.to)&&(s.display={...i},o=!0);else if(r==="transform")if(e.length===1)i&&(i.x!==void 0&&s.left!==i.x&&(s.left=i.x,o=!0),i.y!==void 0&&s.top!==i.y&&(s.top=i.y,o=!0),i.width!==void 0&&s.width!==i.width&&(s.width=i.width,o=!0),i.height!==void 0&&s.height!==i.height&&(s.height=i.height,o=!0),i.angle!==void 0&&s.angle!==i.angle&&(s.angle=i.angle,o=!0),i.opacity!==void 0&&s.opacity!==i.opacity&&(s.opacity=i.opacity,o=!0),i.zIndex!==void 0&&s.zIndex!==i.zIndex&&(s.zIndex=i.zIndex,o=!0),i.flip!==void 0&&JSON.stringify(s.flip)!==JSON.stringify(i.flip)&&(s.flip=i.flip,o=!0));else{const a=e[1];a==="x"&&s.left!==i?(s.left=i,o=!0):a==="y"&&s.top!==i?(s.top=i,o=!0):a==="width"&&s.width!==i?(s.width=i,o=!0):a==="height"&&s.height!==i?(s.height=i,o=!0):a==="angle"&&s.angle!==i?(s.angle=i,o=!0):a==="opacity"&&s.opacity!==i?(s.opacity=i,o=!0):a==="zIndex"&&s.zIndex!==i?(s.zIndex=i,o=!0):a==="flip"&&JSON.stringify(s.flip)!==JSON.stringify(i)&&(s.flip=i,o=!0)}else{const a=s.locked;s[r]!==i&&(Object.assign(s,{[r]:i}),r==="locked"&&a!==i&&this.studio.selection.selectedClips.has(s)&&this.studio.selection.recreateTransformer(),o=!0)}o&&(await this.studio.timeline.recalculateMaxDuration(),this.studio.updateFrame(this.studio.currentTime))}}async syncInitialState(){this.isSyncing=!0;try{await this.studio.clear();const t=this.core.store.getState();this.studio.setSize(t.settings.width,t.settings.height);for(const e in t.clips)await this.addClipSafely(t.clips[e]);this.studio.setTracks(t.tracks),this.syncSelectionToStudio(t.selectedIds),this.studio.updateFrame(t.currentTime)}finally{this.isSyncing=!1}}findTrackIdForClip(t){return this.core.store.getState().tracks.find(e=>e.clipIds.includes(t))?.id}async ensureFontForClip(t,e){const i=t.style,s=i?.fontUrl||e?.style?.fontUrl||t.fontUrl,r=i?.fontFamily||e?.style?.fontFamily||t.fontFamily;if(!(!s||!r))try{await Zt.addFont({name:r,url:s})}catch(o){console.warn(`[StudioBridge] Failed to pre-load font "${r}":`,o)}}syncClipProperties(t,e){let i=!1;const s=e.transform;s&&(s.x!==void 0&&Math.abs((t.left??0)-s.x)>=.01&&(t.left=s.x,i=!0),s.y!==void 0&&Math.abs((t.top??0)-s.y)>=.01&&(t.top=s.y,i=!0),s.width!==void 0&&Math.abs((t.width??0)-s.width)>=.01&&(t.width=s.width,i=!0),s.height!==void 0&&Math.abs((t.height??0)-s.height)>=.01&&(t.height=s.height,i=!0),s.angle!==void 0&&Math.abs((t.angle??0)-s.angle)>=.01&&(t.angle=s.angle,i=!0),s.opacity!==void 0&&Math.abs((t.opacity??1)-s.opacity)>=.01&&(t.opacity=s.opacity,i=!0),s.zIndex!==void 0&&t.zIndex!==s.zIndex&&(t.zIndex=s.zIndex,i=!0),s.flip!==void 0&&JSON.stringify(t.flip)!==JSON.stringify(s.flip)&&(t.flip=s.flip,i=!0)),["volume","text","words","style","chromaKey","colorAdjustment","animations","locked","muted","caption","textBoxStyle","wordsPerLine","videoWidth","videoHeight","fontUrl","mediaId","bottomOffset","transitionKey","effectKey","values"].forEach(a=>{let n=e[a];if(n===void 0&&(a==="locked"||a==="muted")&&(n=!1),n===void 0)return;const c=t[a];c!==n&&(typeof c=="number"&&typeof n=="number"&&Math.abs(c-n)<.01||(a==="style"||a==="values"||a==="caption")&&JSON.stringify(c)===JSON.stringify(n)||(Object.assign(t,{[a]:n}),i=!0))});const o=e.timing;if(o)o.display&&(!t.display||t.display.from!==o.display.from||t.display.to!==o.display.to)&&(t.display={...o.display},i=!0),o.trim&&(!t.trim||t.trim.from!==o.trim.from||t.trim.to!==o.trim.to)&&(t.trim={...o.trim},i=!0),o.duration!==void 0&&t.duration!==o.duration&&(t.duration=o.duration,i=!0),o.playbackRate!==void 0&&t.playbackRate!==o.playbackRate&&(t.playbackRate=o.playbackRate,i=!0),o.fadeIn!==void 0?JSON.stringify(t.timing.fadeIn)!==JSON.stringify(o.fadeIn)&&(t.timing.fadeIn=o.fadeIn,i=!0):t.timing.fadeIn!==void 0&&(delete t.timing.fadeIn,i=!0),o.fadeOut!==void 0?JSON.stringify(t.timing.fadeOut)!==JSON.stringify(o.fadeOut)&&(t.timing.fadeOut=o.fadeOut,i=!0):t.timing.fadeOut!==void 0&&(delete t.timing.fadeOut,i=!0);else{const a=e.display;a&&(!t.display||t.display.from!==a.from||t.display.to!==a.to)&&(t.display={...a},i=!0);const n=e.trim;n&&(!t.trim||t.trim.from!==n.from||t.trim.to!==n.to)&&(t.trim={...n},i=!0);const c=e.duration;c!==void 0&&t.duration!==c&&(t.duration=c,i=!0);const h=e.playbackRate;h!==void 0&&t.playbackRate!==h&&(t.playbackRate=h,i=!0)}return i}dispose(){this.disposed=!0,this.unsubscribers.forEach(t=>t()),this.unsubscribers=[]}}class ha extends m.Graphics{constructor(){super(),this.eventMode="static",this.cursor="move"}draw(t,e=1){const s=1.5*e;this.clear(),this.setStrokeStyle({width:s,color:165063}).rect(t.x,t.y,t.width,t.height).stroke(),this.hitArea=t}}class ot extends m.Graphics{#t=!1;handle;cursor;callbacks;constructor(t,e,i){super(),this.handle=t,this.cursor=e,this.callbacks=i,this.eventMode="static",this.#a(),this.on("pointerdown",this.#i),this.on("globalpointermove",this.#o),this.on("pointerup",this.#d),this.on("pointerupoutside",this.#d)}#a(){this.clear();const t=165063;if(this.handle==="rot_tl")this.hitArea=new m.Rectangle(-22,-22,24,24);else if(this.handle==="rot_tr")this.hitArea=new m.Rectangle(-2,-22,24,24);else if(this.handle==="rot_bl")this.hitArea=new m.Rectangle(-22,-2,24,24);else if(this.handle==="rot_br")this.hitArea=new m.Rectangle(-2,-2,24,24);else if(this.handle==="rot")this.circle(0,0,8),this.fill({color:"#ffffff"}),this.stroke({width:1,color:13421772}),this.moveTo(0,-4),this.arc(0,0,4,-Math.PI/2,Math.PI,!1),this.stroke({width:1,color:0}),this.moveTo(0,-8),this.lineTo(-3,-5),this.lineTo(0,-2),this.stroke({width:1,color:0,cap:"round",join:"round"}),this.hitArea=new m.Circle(0,0,24);else if(["ml","mr","mt","mb"].includes(this.handle)){const e=this.handle==="ml"||this.handle==="mr",i=e?6:24,s=e?24:6;this.roundRect(-i/2,-s/2,i,s,3),this.fill({color:"#ffffff"}),this.stroke({width:1,color:t}),this.hitArea=new m.Rectangle(-10,-10,20,20)}else this.rect(-4,-4,8,8),this.fill({color:"#ffffff"}),this.stroke({width:1,color:t}),this.hitArea=new m.Rectangle(-10,-10,20,20)}#i=t=>{this.#t=!0,this.handle.startsWith("rot")||(this.cursor="grabbing"),this.callbacks.beginDrag(this.handle,t.global)};#o=t=>{this.#t&&this.callbacks.updateDrag(this.handle,t.global)};#d=t=>{this.#t&&(this.#t=!1,this.handle.startsWith("rot")||(this.cursor="pointer"),this.callbacks.endDrag())}}class Ut{constructor(t,e,i=1){this.artboardWidth=t,this.artboardHeight=e,this.scale=i}artboardWidth;artboardHeight;scale;static SNAP_THRESHOLD=5;updateContext(t,e,i){this.artboardWidth=t,this.artboardHeight=e,this.scale=i}snapMove(t,e){const i=[];let s=0,r=0;const o=Ut.SNAP_THRESHOLD/this.scale,a=[{value:this.artboardWidth/2,label:"center",boundsY:[0,this.artboardHeight]},{value:0,label:"start",boundsY:[0,this.artboardHeight]},{value:this.artboardWidth,label:"end",boundsY:[0,this.artboardHeight]}];if(e)for(const f of e)a.push({value:f.x,label:"other-start",boundsY:[f.y,f.y+f.height]},{value:f.x+f.width/2,label:"other-center",boundsY:[f.y,f.y+f.height]},{value:f.x+f.width,label:"other-end",boundsY:[f.y,f.y+f.height]});const n=[{value:t.x,type:"start"},{value:t.x+t.width/2,type:"center"},{value:t.x+t.width,type:"end"}];let c=!1;for(const f of a){if(c)break;for(const p of n){const g=f.value-p.value;if(Math.abs(g)<o){s=g,c=!0;const v=f.boundsY?f.boundsY[0]:0,x=f.boundsY?f.boundsY[1]:this.artboardHeight;i.push({type:"vertical",position:f.value,start:Math.min(v,t.y),end:Math.max(x,t.y+t.height)});break}}}const h=[{value:this.artboardHeight/2,label:"center",boundsX:[0,this.artboardWidth]},{value:0,label:"start",boundsX:[0,this.artboardWidth]},{value:this.artboardHeight,label:"end",boundsX:[0,this.artboardWidth]}];if(e)for(const f of e)h.push({value:f.y,label:"other-start",boundsX:[f.x,f.x+f.width]},{value:f.y+f.height/2,label:"other-center",boundsX:[f.x,f.x+f.width]},{value:f.y+f.height,label:"other-end",boundsX:[f.x,f.x+f.width]});const d=[{value:t.y,type:"start"},{value:t.y+t.height/2,type:"center"},{value:t.y+t.height,type:"end"}];let u=!1;for(const f of h){if(u)break;for(const p of d){const g=f.value-p.value;if(Math.abs(g)<o){r=g,u=!0;const v=f.boundsX?f.boundsX[0]:0,x=f.boundsX?f.boundsX[1]:this.artboardWidth;i.push({type:"horizontal",position:f.value,start:Math.min(v,t.x),end:Math.max(x,t.x+t.width)});break}}}return{dx:s,dy:r,guides:i}}snapResize(t,e,i,s){const r=t.clone(),o=[],a=Ut.SNAP_THRESHOLD/this.scale,n=[{value:0,label:"start",boundsY:[0,this.artboardHeight]},{value:this.artboardWidth/2,label:"center",boundsY:[0,this.artboardHeight]},{value:this.artboardWidth,label:"end",boundsY:[0,this.artboardHeight]}],c=[{value:0,label:"start",boundsX:[0,this.artboardWidth]},{value:this.artboardHeight/2,label:"center",boundsX:[0,this.artboardWidth]},{value:this.artboardHeight,label:"end",boundsX:[0,this.artboardWidth]}];if(s)for(const y of s)n.push({value:y.x,label:"other-start",boundsY:[y.y,y.y+y.height]},{value:y.x+y.width/2,label:"other-center",boundsY:[y.y,y.y+y.height]},{value:y.x+y.width,label:"other-end",boundsY:[y.y,y.y+y.height]}),c.push({value:y.y,label:"other-start",boundsX:[y.x,y.x+y.width]},{value:y.y+y.height/2,label:"other-center",boundsX:[y.x,y.x+y.width]},{value:y.y+y.height,label:"other-end",boundsX:[y.x,y.x+y.width]});const h=["tl","ml","bl"].includes(i),d=["tr","mr","br"].includes(i),u=["tl","mt","tr"].includes(i),f=["bl","mb","br"].includes(i),p=e.x,g=e.y,v=r.width*this.scale,x=r.height*this.scale,w=p+v,T=g+x;for(const y of n){if(h){const C=y.value-p;if(Math.abs(C)<a){const k=C/this.scale;r.x+=k,r.width-=k;const O=y.boundsY?y.boundsY[0]:0,F=y.boundsY?y.boundsY[1]:this.artboardHeight;o.push({type:"vertical",position:y.value,start:Math.min(O,g),end:Math.max(F,T)});break}}if(d){const C=y.value-w;if(Math.abs(C)<a){const k=C/this.scale;r.width+=k;const O=y.boundsY?y.boundsY[0]:0,F=y.boundsY?y.boundsY[1]:this.artboardHeight;o.push({type:"vertical",position:y.value,start:Math.min(O,g),end:Math.max(F,T)});break}}}for(const y of c){if(u){const C=y.value-g;if(Math.abs(C)<a){const k=C/this.scale;r.y+=k,r.height-=k;const O=y.boundsX?y.boundsX[0]:0,F=y.boundsX?y.boundsX[1]:this.artboardWidth;o.push({type:"horizontal",position:y.value,start:Math.min(O,p),end:Math.max(F,w)});break}}if(f){const C=y.value-T;if(Math.abs(C)<a){const k=C/this.scale;r.height+=k;const O=y.boundsX?y.boundsX[0]:0,F=y.boundsX?y.boundsX[1]:this.artboardWidth;o.push({type:"horizontal",position:y.value,start:Math.min(O,p),end:Math.max(F,w)});break}}}return{corrected:r,guides:o}}snapPoint(t){const e=Ut.SNAP_THRESHOLD/this.scale,i=[],s=t.clone(),r=[0,this.artboardWidth/2,this.artboardWidth];for(const a of r)if(Math.abs(a-t.x)<e){s.x=a,i.push({type:"vertical",position:a,start:0,end:this.artboardHeight});break}const o=[0,this.artboardHeight/2,this.artboardHeight];for(const a of o)if(Math.abs(a-t.y)<e){s.y=a,i.push({type:"horizontal",position:a,start:0,end:this.artboardWidth});break}return{p:s,guides:i}}}const mi={delta:new m.Matrix,newLocal:new m.Matrix};class gi extends m.Container{group;wireframe=new ha;selectionOutlines=new m.Graphics;isDragging=!1;lastPointer=new m.Point;activeHandle=null;#t;#a=new Map;#i=new m.Point;#o=0;#d=0;#s=new m.Rectangle;#r=new m.Point;#n=new m.Rectangle;#e=[new m.Point,new m.Point,new m.Point,new m.Point];#l=0;#c=0;#f=1;#u=1;#p;#m=new m.Graphics;#y=new m.Point;opts;constructor(t){super(),this.opts=t,this.group=t.group,this.eventMode="static",this.#p=new Ut(t.artboardWidth??1920,t.artboardHeight??1080),this.addChild(this.#m);const e={beginDrag:(i,s)=>this.#D(i,s),updateDrag:(i,s)=>this.#P(i,s),endDrag:()=>this.#h()};this.#t={tl:new ot("tl","nwse-resize",e),tr:new ot("tr","nesw-resize",e),bl:new ot("bl","nesw-resize",e),br:new ot("br","nwse-resize",e),ml:new ot("ml","ew-resize",e),mr:new ot("mr","ew-resize",e),mt:new ot("mt","ns-resize",e),mb:new ot("mb","ns-resize",e),rot_tl:new ot("rot_tl","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()}),rot_tr:new ot("rot_tr","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()}),rot_bl:new ot("rot_bl","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()}),rot_br:new ot("rot_br","crosshair",{beginDrag:(i,s)=>this.#w(s),updateDrag:(i,s)=>this.#b(s),endDrag:()=>this.#h()})},this.addChild(this.selectionOutlines,this.wireframe,this.#t.rot_tl,this.#t.rot_tr,this.#t.rot_bl,this.#t.rot_br,this.#t.tl,this.#t.tr,this.#t.bl,this.#t.br,this.#t.ml,this.#t.mr,this.#t.mt,this.#t.mb),this.#R(),this.visible=!1,m.Ticker.shared.addOnce(()=>{this.showImmediate()})}#C=!1;showImmediate(){this.#C||this.destroyed||!this.parent||(this.#g(),this.visible=!0,this.#C=!0)}#R(){this.on("pointerdown",this.#M),this.on("pointerup",this.#T),this.on("pointerupoutside",this.#T),this.on("globalpointermove",this.#O)}#g(){if(this.group.length===1){const t=this.group[0];this.#o=t.rotation;const e=this.#x(t);let i,s;this.opts.clip?(i=this.opts.clip.width,s=this.opts.clip.height):(i=e.width,s=e.height);const r=t.toGlobal(new m.Point(0,0));this.#i.set(r.x,r.y),this.#n.copyFrom(new m.Rectangle(-i/2,-s/2,i,s))}else{let t=1/0,e=1/0,i=-1/0,s=-1/0;if(this.parent)for(const c of this.group){const h=this.#x(c);this.#e[0].set(h.x,h.y),this.#e[1].set(h.x+h.width,h.y),this.#e[2].set(h.x+h.width,h.y+h.height),this.#e[3].set(h.x,h.y+h.height);for(const d of this.#e)c.toGlobal(d,d),this.toLocal(d,void 0,d),t=Math.min(t,d.x),e=Math.min(e,d.y),i=Math.max(i,d.x),s=Math.max(s,d.y)}const r=i-t,o=s-e,a=t+r/2,n=e+o/2;if(this.#n.copyFrom(new m.Rectangle(-r/2,-o/2,r,o)),this.parent){const c=this.toGlobal(new m.Point(a,n));this.#i.set(c.x,c.y)}}this.#v()}#x(t){let e=null;const i=c=>{if(c.label==="MainSprite"&&c instanceof m.Sprite)return c;for(const h of c.children)if(h instanceof m.Container){const d=i(h);if(d)return d}return null};if(e=i(t),e){const c=e.getLocalBounds(),h=t.renderTexturePadding??0,d=h>0?new m.Rectangle(-(c.width-h*2)/2,-(c.height-h*2)/2,c.width-h*2,c.height-h*2):c,u=e.localTransform.clone(),f=u.apply(new m.Point(d.x,d.y)),p=u.apply(new m.Point(d.x+d.width,d.y)),g=u.apply(new m.Point(d.x+d.width,d.y+d.height)),v=u.apply(new m.Point(d.x,d.y+d.height)),x=Math.min(f.x,p.x,g.x,v.x),w=Math.max(f.x,p.x,g.x,v.x),T=Math.min(f.y,p.y,g.y,v.y),y=Math.max(f.y,p.y,g.y,v.y);return new m.Rectangle(x,T,w-x,y-T)}let s=1/0,r=1/0,o=-1/0,a=-1/0;const n=t.children.filter(c=>c.label!=="ShadowContainer"&&c.label!=="AnimationContainer");if(n.length===0&&t.children.length>0){const c=t.children.find(h=>h.label==="AnimationContainer");if(c){const h=c.getLocalBounds();return new m.Rectangle(h.minX,h.minY,h.maxX-h.minX,h.maxY-h.minY)}}for(const c of n){const h=c.getBounds(),d=t.toLocal(new m.Point(h.minX,h.minY)),u=t.toLocal(new m.Point(h.maxX,h.maxY));s=Math.min(s,d.x,u.x),r=Math.min(r,d.y,u.y),o=Math.max(o,d.x,u.x),a=Math.max(a,d.y,u.y)}if(s===1/0){const c=t.getLocalBounds();return new m.Rectangle(c.minX,c.minY,c.maxX-c.minX,c.maxY-c.minY)}return new m.Rectangle(s,r,o-s,a-r)}updateBounds(){this.#g()}#M=t=>{t.button===0&&(this.opts.locked||(this.#g(),this.#y.copyFrom(this.#i),this.isDragging=!0,this.lastPointer.copyFrom(t.global),this.cursor="grabbing"))};#T=()=>{this.isDragging&&this.#h(),this.cursor="default"};#O=t=>{if(!this.isDragging||this.activeHandle||!this.parent)return;const{moveDx:e,moveDy:i,newPivotWorld:s}=this.#E(t);for(const r of this.group)r.x+=e,r.y+=i;this.#i.copyFrom(s),this.lastPointer.copyFrom(t.global),this.#v(),this.emit("transforming")};#S(){const t=[];if(!this.parent)return t;const e=this.parent.children.find(o=>o.label==="ClipContainer");if(!e)return t;const i=e.children.find(o=>o.label==="ClipsNormal"),s=e.children.find(o=>o.label==="ClipsEffect"),r=[i,s].filter(Boolean);for(const o of r)for(const a of o.children){if(this.group.includes(a)||!a.visible)continue;const n=this.#x(a),c=this.parent.toLocal(new m.Point(n.x,n.y),a),h=this.parent.toLocal(new m.Point(n.x+n.width,n.y),a),d=this.parent.toLocal(new m.Point(n.x+n.width,n.y+n.height),a),u=this.parent.toLocal(new m.Point(n.x,n.y+n.height),a),f=Math.min(c.x,h.x,d.x,u.x),p=Math.max(c.x,h.x,d.x,u.x),g=Math.min(c.y,h.y,d.y,u.y),v=Math.max(c.y,h.y,d.y,u.y);t.push(new m.Rectangle(f,g,p-f,v-g))}return t}#E(t){const e=Math.abs(this.parent.worldTransform.a);this.#p.updateContext(this.opts.artboardWidth??1920,this.opts.artboardHeight??1080,e);const i=t.global.x-this.lastPointer.x,s=t.global.y-this.lastPointer.y;this.#y.x+=i,this.#y.y+=s;const r=this.parent.toLocal(this.#y),o=new m.Rectangle(r.x+this.#n.x,r.y+this.#n.y,this.#n.width,this.#n.height),a=this.#S(),{dx:n,dy:c,guides:h}=this.#p.snapMove(o,a);this.#A(h,e);const d=r.x+n,u=r.y+c,f=this.parent.toLocal(this.#i),p=d-f.x,g=u-f.y,v=this.parent.toGlobal(new m.Point(d,u));return{moveDx:p,moveDy:g,newPivotWorld:v}}#D(t,e){this.#g(),this.isDragging=!0,this.activeHandle=t,this.#a.clear();for(const i of this.group)this.#a.set(i,i.localTransform.clone());if(this.rotation=this.#o,this.#s.copyFrom(this.#n),this.#z(t),["ml","mr","mt","mb"].includes(t)){const i=this.#r,s=this.rotation,r=Math.cos(s),o=Math.sin(s),a=this.toLocal(e),n=a.x-i.x,c=a.y-i.y;t==="ml"||t==="mr"?(this.#l=n*r+c*o,this.#c=this.#s.width):(this.#l=-n*o+c*r,this.#c=this.#s.height)}}#P(t,e){this.#I(t,e)}async#I(t,e){const{proposed:i,sx:s,sy:r,pivotWorld:o}=await this.#B(t,e),a=this.opts.clip&&this.opts.clip.type==="Text",n=this.opts.clip&&this.opts.clip.type==="Caption";a||n?this.emit("textClipResize",{handle:t,newWidth:i.width,newHeight:i.height,pivotWorld:o,proposed:i,sx:s,sy:r}):this.#F(this.#L(o,this.#o,s,r)),this.#n.copyFrom(i),this.#v(),this.emit("transforming")}async#B(t,e){const i=this.#r,s=this.parent?Math.abs(this.parent.worldTransform.a):1,r=this.parent?this.parent.toLocal(e):e;let o;const a=this.localTransform,n=a.a*a.d-a.b*a.c;if(n!==0){const p=1/n,g=r.x-a.tx,v=r.y-a.ty,x=(a.d*g-a.b*v)*p,w=(-a.c*g+a.a*v)*p,T=new m.Point(x,w);o=this.#k(t,T,i)}else o=this.#k(t,this.toLocal(e),i);if(this.#p.updateContext(this.opts.artboardWidth??1920,this.opts.artboardHeight??1080,1),["tl","tr","bl","br","ml","mr","mt","mb"].includes(t)){const p=this.localTransform.apply(new m.Point(o.x,o.y)),g=this.#S(),{corrected:v,guides:x}=this.#p.snapResize(o,p,t,g);this.#A(x,s);const w=v.width/this.#s.width,T=v.height/this.#s.height,y=this.toGlobal(i);return{proposed:v,sx:w,sy:T,pivotWorld:y}}const d=o.width/this.#s.width,u=o.height/this.#s.height,f=this.toGlobal(i);return{proposed:o,sx:d,sy:u,pivotWorld:f}}#w(t){this.#g(),this.isDragging=!0,this.activeHandle="rot",this.#a.clear();for(const e of this.group)this.#a.set(e,e.localTransform.clone());this.#d=Math.atan2(t.y-this.#i.y,t.x-this.#i.x)}#b(t){const i=Math.atan2(t.y-this.#i.y,t.x-this.#i.x)-this.#d,s=this.#o+i;this.#F(this.#H(this.#i,i)),this.rotation=s,this.#v(s),this.emit("transforming")}#h(){this.isDragging=!1,this.#o=this.rotation,this.activeHandle=null,this.#m.clear(),this.#v(this.#o),this.emit("transformEnd")}#A(t,e){if(this.#m.clear(),!(!t.length||!this.parent)){this.#m.stroke({width:1/e,color:4774907});for(const i of t){let s,r;i.type==="vertical"?(s=new m.Point(i.position,i.start),r=new m.Point(i.position,i.end)):(s=new m.Point(i.start,i.position),r=new m.Point(i.end,i.position)),this.toLocal(s,this.parent,s),this.toLocal(r,this.parent,r),this.#m.moveTo(s.x,s.y).lineTo(r.x,r.y).stroke({width:1/e,color:4774907})}}}#v(t=this.#o){this.parent&&this.position.copyFrom(this.parent.toLocal(this.#i)),this.rotation=t;const i=1/((this.parent?Math.abs(this.parent.worldTransform.a):1)||1),s=this.#n;this.wireframe.draw(s,i);const r=s.x+s.width/2,o=s.y+s.height/2,n=this.opts.locked?[]:this.opts.clip?.getVisibleHandles?.()??["tl","tr","bl","br","ml","mr","mt","mb","rot"],c=[this.#t.tl,this.#t.tr,this.#t.bl,this.#t.br,this.#t.ml,this.#t.mr,this.#t.mt,this.#t.mb,this.#t.rot_tl,this.#t.rot_tr,this.#t.rot_bl,this.#t.rot_br];for(const u of c)u.scale.set(i);const h=n.includes("rot");this.#t.tl.visible=n.includes("tl"),this.#t.tr.visible=n.includes("tr"),this.#t.bl.visible=n.includes("bl"),this.#t.br.visible=n.includes("br"),this.#t.ml.visible=n.includes("ml"),this.#t.mr.visible=n.includes("mr"),this.#t.mt.visible=n.includes("mt"),this.#t.mb.visible=n.includes("mb"),this.#t.rot_tl.visible=h,this.#t.rot_tr.visible=h,this.#t.rot_bl.visible=h,this.#t.rot_br.visible=h,this.#t.tl.position.set(s.x,s.y),this.#t.tr.position.set(s.x+s.width,s.y),this.#t.bl.position.set(s.x,s.y+s.height),this.#t.br.position.set(s.x+s.width,s.y+s.height),this.#t.ml.position.set(s.x,o),this.#t.mr.position.set(s.x+s.width,o),this.#t.mt.position.set(r,s.y),this.#t.mb.position.set(r,s.y+s.height),this.#t.rot_tl.position.set(s.x,s.y),this.#t.rot_tr.position.set(s.x+s.width,s.y),this.#t.rot_bl.position.set(s.x,s.y+s.height),this.#t.rot_br.position.set(s.x+s.width,s.y+s.height);const d=(u,f)=>{const p=u-r,g=f-o,v=Math.atan2(p,-g),x=t+v,T=`<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
3326
3326
  <g transform="rotate(${Math.round(x*180/Math.PI)-90} 16 16)">
3327
3327
  <path d="M 24 10 A 10 10 0 0 1 24 22" fill="none" stroke="white" stroke-width="4" stroke-linecap="round"/>
3328
3328
  <path d="M 20 10 L 24 10 L 24 6" fill="none" stroke="white" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
@@ -3331,5 +3331,5 @@ vec4 transition(vec2 uv) {
3331
3331
  <path d="M 20 10 L 24 10 L 24 6" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
3332
3332
  <path d="M 24 26 L 24 22 L 20 22" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
3333
3333
  </g>
3334
- </svg>`;return`url('data:image/svg+xml;utf8,${encodeURIComponent(T).replace(/'/g,"%27").replace(/"/g,"%22")}') 16 16, auto`};this.#t.rot_tl.cursor=d(s.x,s.y),this.#t.rot_tr.cursor=d(s.x+s.width,s.y),this.#t.rot_bl.cursor=d(s.x,s.y+s.height),this.#t.rot_br.cursor=d(s.x+s.width,s.y+s.height),this.#N(i)}#N(t){if(this.selectionOutlines.clear(),this.group.length<=1||!this.parent)return;const e={width:1*t,color:43775,alpha:1};for(const i of this.group){const s=this.#x(i);this.#e[0].set(s.x,s.y),this.#e[1].set(s.x+s.width,s.y),this.#e[2].set(s.x+s.width,s.y+s.height),this.#e[3].set(s.x,s.y+s.height);for(const r of this.#e)i.toGlobal(r,r),this.toLocal(r,void 0,r);this.selectionOutlines.moveTo(this.#e[0].x,this.#e[0].y).lineTo(this.#e[1].x,this.#e[1].y).lineTo(this.#e[2].x,this.#e[2].y).lineTo(this.#e[3].x,this.#e[3].y).closePath().stroke(e)}}#z(t){const e=this.#s;if(this.opts.centeredScaling){this.#r.set(e.x+e.width/2,e.y+e.height/2);return}t==="tl"?this.#r.set(e.x+e.width,e.y+e.height):t==="tr"?this.#r.set(e.x,e.y+e.height):t==="bl"?this.#r.set(e.x+e.width,e.y):t==="br"?this.#r.set(e.x,e.y):t==="ml"?this.#r.set(e.x+e.width,e.y+e.height/2):t==="mr"?this.#r.set(e.x,e.y+e.height/2):t==="mt"?this.#r.set(e.x+e.width/2,e.y+e.height):t==="mb"&&this.#r.set(e.x+e.width/2,e.y)}#k(t,e,i){let s=!1;if(this.opts.clip&&(this.opts.clip.type==="Image"||this.opts.clip.type==="Video")&&(s=!0),this.opts.centeredScaling){let g=Math.abs(e.x-i.x)*2,v=Math.abs(e.y-i.y)*2;if(s){const x=this.#s.width,w=this.#s.height,T=x/w;g/x>v/w?v=g/T:g=v*T}return g=Math.max(this.#u,g),v=Math.max(this.#f,v),new m.Rectangle(i.x-g/2,i.y-v/2,g,v)}if(["tl","tr","bl","br"].includes(t)){let g=Math.abs(e.x-i.x),v=Math.abs(e.y-i.y);if(s){const x=this.#s.width,w=this.#s.height,T=x/w;g/x>v/w?v=g/T:g=v*T}if(g=Math.max(this.#u,g),v=Math.max(this.#f,v),t==="tl")return new m.Rectangle(i.x-g,i.y-v,g,v);if(t==="tr")return new m.Rectangle(i.x,i.y-v,g,v);if(t==="bl")return new m.Rectangle(i.x-g,i.y,g,v);if(t==="br")return new m.Rectangle(i.x,i.y,g,v)}const r=this.#s,o=this.rotation,a=Math.cos(o),n=Math.sin(o),c=(i.x-r.x)/r.width,h=(i.y-r.y)/r.height,d=e.x-i.x,f=e.y-i.y,u=d*a+f*n,p=-d*n+f*a;if(t==="ml"){const g=this.#l-u,v=Math.max(this.#u,this.#c+g),x=i.x-v*c,w=i.y-r.height*h;return new m.Rectangle(x,w,v,r.height)}if(t==="mr"){const g=u-this.#l,v=Math.max(this.#u,this.#c+g),x=i.x-v*c,w=i.y-r.height*h;return new m.Rectangle(x,w,v,r.height)}if(t==="mt"){const g=this.#l-p,v=Math.max(this.#f,this.#c+g),x=i.x-r.width*c,w=i.y-v*h;return new m.Rectangle(x,w,r.width,v)}if(t==="mb"){const g=p-this.#l,v=Math.max(this.#f,this.#c+g),x=i.x-r.width*c,w=i.y-v*h;return new m.Rectangle(x,w,r.width,v)}return new m.Rectangle(i.x,i.y,this.#u,this.#f)}#L(t,e,i,s){return di.delta.identity().translate(-t.x,-t.y).rotate(-e).scale(i,s).rotate(e).translate(t.x,t.y)}#H(t,e){return di.delta.identity().translate(-t.x,-t.y).rotate(e).translate(t.x,t.y)}#F(t){for(const e of this.group){const i=this.#a.get(e),s=e.parent;if(!i||!s)continue;const r=s.worldTransform.clone().invert(),o=s.worldTransform.clone().append(i),a=t.clone().append(o),n=r.clone().append(a);e.setFromMatrix(n)}}}class aa{constructor(t){this.studio=t}studio;selectedClips=new Set;activeTransformer=null;interactiveClips=new Set;getSelection(){return Array.from(this.selectedClips)}selectionGraphics=null;isDragSelecting=!1;dragSelectionStart=new m.Point;isUpdatingTextRealtime=!1;textClipResizedWidth=null;textClipResizeHandle=null;textClipResizedSx=null;textClipResizedSy=null;lastPointerDownTime=0;lastPointerDownClip=null;init(t,e){this.selectionGraphics=new m.Graphics,this.selectionGraphics.visible=!1,this.selectionGraphics.zIndex=1e3,e.addChild(this.selectionGraphics),t.stage.eventMode="static",t.stage.hitArea=t.screen,t.stage.on("pointerdown",i=>this.onStagePointerDown(i)),t.stage.on("globalpointermove",i=>this.onStagePointerMove(i)),t.stage.on("pointerup",()=>this.onStagePointerUp()),t.stage.on("pointerupoutside",()=>this.onStagePointerUp())}onStagePointerDown(t){t.target===this.studio.pixiApp?.stage&&(t.shiftKey||this.deselectClip(),this.isDragSelecting=!0,this.studio.artboard?.toLocal(t.global,void 0,this.dragSelectionStart),this.selectionGraphics&&(this.selectionGraphics.clear(),this.selectionGraphics.visible=!0))}onStagePointerMove(t){if(this.isDragSelecting&&this.selectionGraphics&&this.studio.artboard){const e=this.studio.artboard.toLocal(t.global),i=Math.min(this.dragSelectionStart.x,e.x),s=Math.min(this.dragSelectionStart.y,e.y),r=Math.abs(e.x-this.dragSelectionStart.x),o=Math.abs(e.y-this.dragSelectionStart.y);this.selectionGraphics.clear(),this.selectionGraphics.rect(i,s,r,o).fill({color:703971,alpha:.3}),this.selectionGraphics.rect(i,s,r,o).stroke({width:2,color:703971});const a=this.selectionGraphics.getBounds(),n=new m.Rectangle(a.x,a.y,a.width,a.height);if(n.width>2||n.height>2){const c=this.getIntersectingClips(n);this.updatePreviewSelection(c)}else this.selectedClips.size===0&&this.destroyTransformer();this.studio.pixiApp?.render()}}onStagePointerUp(){if(this.isDragSelecting&&this.selectionGraphics&&this.studio.artboard){const t=this.selectionGraphics.getBounds(),e=new m.Rectangle(t.x,t.y,t.width,t.height);if(e.width>2||e.height>2){const i=this.getIntersectingClips(e);if(i.length>0){for(const s of i)this.selectedClips.add(s);this.recreateTransformer(),this.studio.emit("selection:created",{selected:Array.from(this.selectedClips)})}else this.selectedClips.size===0&&this.destroyTransformer()}else this.selectedClips.size===0&&this.destroyTransformer();this.selectionGraphics.clear(),this.selectionGraphics.visible=!1,this.isDragSelecting=!1,this.studio.pixiApp?.render()}}getIntersectingClips(t){const e=[];for(const i of this.studio.clips){const s=this.studio.spriteRenderers.get(i);if(!s)continue;const r=s.getRoot();if(!r||!r.visible)continue;const o=r.getBounds();t.x<o.x+o.width&&t.x+t.width>o.x&&t.y<o.y+o.height&&t.y+t.height>o.y&&e.push(i)}return e}updatePreviewSelection(t){if(t.length===0){this.selectedClips.size===0?this.destroyTransformer():this.recreateTransformer();return}const e=new Set(t),i=[];let s=null;for(const r of e){const o=this.studio.spriteRenderers.get(r);if(o==null)continue;const a=o.getRoot();a!=null&&(i.push(a),e.size===1&&(s=r))}if(i.length===0){this.selectedClips.size===0&&this.destroyTransformer();return}this.activeTransformer?(this.activeTransformer.group=i,this.activeTransformer.opts.group=i,this.activeTransformer.opts.clip=s,this.activeTransformer.updateBounds(),this.activeTransformer.showImmediate()):(this.activeTransformer=new ui({group:i,clip:s,artboardWidth:this.studio.opts.width,artboardHeight:this.studio.opts.height}),this.studio.artboard?.addChild(this.activeTransformer),this.activeTransformer.showImmediate()),this.studio.pixiApp?.render()}refreshClipHitArea(t){const e=this.studio.spriteRenderers.get(t);if(e==null)return;const i=e.getRoot();i!=null&&(i.hitArea=new m.Rectangle(-t.width/2,-t.height/2,t.width,t.height))}setupSpriteInteractivity(t){if(this.interactiveClips.has(t))return;const e=this.studio.spriteRenderers.get(t);if(e==null)return;const i=e.getRoot();i!=null&&(i.eventMode="static",i.cursor="pointer",this.refreshClipHitArea(t),i.on("pointerdown",s=>{const r=Date.now(),o=this.getTopmostClipAtPoint(s.global);o===t&&o===this.lastPointerDownClip&&r-this.lastPointerDownTime<350&&(o.type==="Text"||o.type==="Caption")&&this.studio.emit("clip:dblclick",{clip:o}),this.lastPointerDownTime=r,this.lastPointerDownClip=o,o&&this.selectClip(o,s.shiftKey)}),this.interactiveClips.add(t))}getTopmostClipAtPoint(t){if(!this.studio.pixiApp)return null;let e=null,i=-1/0;for(const s of this.interactiveClips){const r=this.studio.spriteRenderers.get(s);if(!r)continue;const o=r.getRoot();if(!o||!o.visible)continue;const a=o.toLocal(t),n=s.width/2,c=s.height/2;a.x>=-n&&a.x<=n&&a.y>=-c&&a.y<=c&&s.zIndex>i&&(i=s.zIndex,e=s)}return e}selectClip(t,e=!1){if(!(this.studio.destroyed||this.studio.pixiApp==null)){if(e||this.deselectClip(),e&&this.selectedClips.has(t)){this.selectedClips.delete(t),this.recreateTransformer(),this.studio.emit("selection:updated",{selected:Array.from(this.selectedClips)}),this.studio.pixiApp?.render();return}this.selectedClips.add(t),this.recreateTransformer(),e?this.studio.emit("selection:updated",{selected:Array.from(this.selectedClips)}):this.studio.emit("selection:created",{selected:Array.from(this.selectedClips)}),this.studio.pixiApp?.render()}}selectClipsByIds(t){const e=this.studio.clips.filter(i=>t.includes(i.id));this.setSelection(e)}setSelection(t){if(!(this.studio.destroyed||this.studio.pixiApp==null)&&!(this.selectedClips.size===t.length&&t.every(e=>this.selectedClips.has(e)))){for(const e of this.selectedClips)this.syncSpriteToClipProperties(e);this.destroyTransformer(),this.selectedClips.clear();for(const e of t)this.selectedClips.add(e);this.selectedClips.size>0?(this.createTransformer(),this.studio.emit("selection:updated",{selected:Array.from(this.selectedClips)})):this.studio.emit("selection:cleared",{deselected:[]}),this.studio.pixiApp?.render()}}deselectClip(){if(this.selectedClips.size>0)for(const e of this.selectedClips)this.syncSpriteToClipProperties(e);this.destroyTransformer();const t=Array.from(this.selectedClips);this.selectedClips.clear(),t.length>0&&this.studio.emit("selection:cleared",{deselected:t}),this.studio.pixiApp?.render()}async move(t,e){if(this.selectedClips.size===0)return;const i=[];for(const s of this.selectedClips)i.push({id:s.id,updates:{left:(s.left??0)+t,top:(s.top??0)+e}});await this.studio.updateClips(i),this.activeTransformer&&this.activeTransformer.updateBounds()}clear(){this.deselectClip(),this.interactiveClips.clear()}recreateTransformer(){this.destroyTransformer(),this.selectedClips.size>0&&this.createTransformer()}destroyTransformer(){this.activeTransformer!=null&&(this.activeTransformer.parent!=null&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null)}createTransformer(){if(this.studio.destroyed||this.studio.artboard==null||this.selectedClips.size===0)return;const t=[];let e=null;for(const r of this.selectedClips){const o=this.studio.spriteRenderers.get(r);if(o==null)continue;const a=o.getRoot();a!=null&&(t.push(a),this.selectedClips.size===1&&(e=r))}if(t.length===0){console.warn("Cannot create transformer: no sprites found");return}const i=e?.locked??!1;this.activeTransformer=new ui({group:t,clip:e,artboardWidth:this.studio.opts.width,artboardHeight:this.studio.opts.height,locked:i});let s=null;this.activeTransformer.on("transforming",()=>{s===null&&(s=requestAnimationFrame(()=>{s=null,this.syncSelectedClipsTransformsRealtime();for(const r of this.selectedClips){const o=this.studio.spriteRenderers.get(r);if(!o)continue;const a=o.getRoot();if(!a)continue;const c=(r.flip?.x||r.flip?.y?-1:1)*a.angle;this.studio.emit("clip:transforming",{clip:r,ephemeral:{left:r.left,top:r.top,width:r.width,height:r.height,angle:c,scaleX:a.scale.x,scaleY:a.scale.y}})}this.studio.pixiApp?.render()}))}),this.activeTransformer.on("textClipResize",r=>{this.textClipResizedWidth=r.newWidth,this.textClipResizeHandle=r.handle,this.textClipResizedSx=r.sx,this.textClipResizedSy=r.sy;const o=this.selectedClips.size===1?Array.from(this.selectedClips)[0]:null;if(o instanceof at&&this.textClipResizedWidth!==null){const a=o.updateLayoutForWidth(this.textClipResizedWidth);r.proposed&&a.height!==r.proposed.height&&(r.proposed.height=a.height)}}),this.activeTransformer.on("transformEnd",async()=>{s!==null&&(cancelAnimationFrame(s),s=null);const r=this.studio.opts.core;if(r){const o=[];for(const a of this.selectedClips){const n=this.studio.spriteRenderers.get(a);if(!n)continue;const c=n.getRoot(),h=n.getSprite();if(!c||!h||!h.texture)continue;const d=a.renderTexturePadding??0,f=h.texture.width-d*2,u=h.texture.height-d*2,p=Math.abs(c.scale.x*h.scale.x)*f,g=Math.abs(c.scale.y*h.scale.y)*u,v={left:c.x-p/2,top:c.y-g/2,width:p,height:g,angle:(a.flip?.x||a.flip?.y?-1:1)*c.angle};(a.type==="Text"||a.type==="Caption")&&this.textClipResizedWidth!==null&&(v.width=this.textClipResizedWidth),o.push({id:a.id,updates:v})}o.length>0&&r.execute({id:qt.nanoid(),type:"clip.update",payload:o.length===1?o[0]:o})}else await this.syncSelectedClipsTransforms();for(const o of this.selectedClips)this.studio.emit("clip:updated",{clip:o});this.studio.emit("transform:end",{transformer:this.activeTransformer})}),this.activeTransformer.on("pointerdown",r=>{if(r.button!==0||(this.studio.emit("transform:start",{transformer:this.activeTransformer}),this.activeTransformer?.activeHandle!==null))return;const o=this.getTopmostClipAtPoint(r.global),a=Date.now();o&&o===this.lastPointerDownClip&&a-this.lastPointerDownTime<350&&(o.type==="Text"||o.type==="Caption")&&this.studio.emit("clip:dblclick",{clip:o}),this.lastPointerDownTime=a,this.lastPointerDownClip=o,o&&!this.selectedClips.has(o)&&(this.selectClip(o,r.shiftKey),r.stopPropagation())}),this.studio.artboard.addChild(this.activeTransformer),this.activeTransformer.showImmediate(),this.studio.pixiApp?.render()}async syncSelectedClipsTransformsRealtime(){if(this.selectedClips.size===0||this.activeTransformer==null)return;const t=this.activeTransformer.activeHandle;if(t===null){for(const e of this.selectedClips){const i=this.studio.spriteRenderers.get(e);if(i==null)continue;const s=i.getRoot(),r=i.getSprite();if(s==null||r==null||r.texture==null)continue;const o=e.renderTexturePadding??0,a=r.texture.width-o*2,n=r.texture.height-o*2,c=Math.abs(s.scale.x*r.scale.x)*a,h=Math.abs(s.scale.y*r.scale.y)*n;e.left=s.x-c/2,e.top=s.y-h/2}return}if(t==="mr"||t==="ml"){if(this.isUpdatingTextRealtime)return;this.isUpdatingTextRealtime=!0;try{for(const e of this.selectedClips){if(!(e instanceof at))continue;const i=this.studio.spriteRenderers.get(e);if(i==null)continue;const s=i.getRoot(),r=i.getSprite();if(s==null||r==null||r.texture==null)continue;const o=Math.abs(s.scale.x*r.scale.x);if(o===1)continue;const a=e.left,n=e.top,c=e.width,h=e.renderTexturePadding??0,d=r.texture.width-h*2,f=o*d;await e.updateStyle({wordWrap:!0,wordWrapWidth:f});const u=await e.getTexture();u&&(await i.updateFrame(u),r.scale.set(1,1),s.scale.set(1,1),t==="ml"?e.left=a+c-e.width:e.left=a,e.top=n,s.x=e.left+e.width/2,s.y=e.top+e.height/2,this.activeTransformer.updateBounds(),this.refreshClipHitArea(e))}}finally{this.isUpdatingTextRealtime=!1}}}async syncSelectedClipsTransforms(){if(!(this.selectedClips.size===0||this.activeTransformer==null)){for(const t of this.selectedClips){const e=this.studio.spriteRenderers.get(t);if(e==null)continue;const i=e.getRoot(),s=e.getSprite();if(i==null||s==null||s.texture==null)continue;const r=t.renderTexturePadding??0,o=s.texture.width-r*2,a=s.texture.height-r*2,n=Math.abs(i.scale.x*s.scale.x)*o,c=Math.abs(i.scale.y*s.scale.y)*a,h=(t instanceof at||t instanceof mt)&&this.textClipResizedWidth!==null?this.textClipResizedWidth:n,d=t.width,u=(t.style?.fontSize??16)*Math.max(this.textClipResizedSx||1,this.textClipResizedSy||1);let p=i.x;if((t instanceof at||t instanceof mt)&&this.textClipResizedWidth!==null){const v={wordWrap:!0,wordWrapWidth:h};this.textClipResizeHandle==="mr"?(p=t.left+h/2,i.x=p):this.textClipResizeHandle==="ml"?(p=t.left+h/2-(h-d),i.x=p):["br","tr"].includes(this.textClipResizeHandle)?(p=t.left+h/2,v.fontSize=u):["bl","tl"].includes(this.textClipResizeHandle)&&(p=t.left+h/2-(h-d),v.fontSize=u),await t.updateStyle(v);const x=await t.getTexture();if(x){await e.updateFrame(x),t.width=h;const w=t.renderTexturePadding??0;t.height=x.height-w*2,this.textClipResizedWidth=null,t.left=p-t.width/2,t.top=i.y-t.height/2,s.scale.set(1,1),i.scale.set(1,1)}}else{const v=n,x=c;t.left=i.x-v/2,t.top=i.y-x/2,t.width=v,t.height=x;const w=t.flip?.x||t.flip?.y?-1:1;t.angle=w*i.angle}}this.activeTransformer!=null&&this.activeTransformer.updateBounds();for(const t of this.selectedClips){const e=this.studio.spriteRenderers.get(t);e?.updateTransforms(),this.refreshClipHitArea(t)}}}syncSpriteToClipProperties(t){const e=this.studio.spriteRenderers.get(t);if(e!=null){const i=e.getRoot(),s=e.getSprite();if(i!=null&&s!=null&&s.texture!=null){const r=t.renderTexturePadding??0,o=s.texture.width-r*2,a=s.texture.height-r*2,n=Math.abs(i.scale.x*s.scale.x)*o,c=Math.abs(i.scale.y*s.scale.y)*a,h=n,d=c,f=i.x-h/2,u=i.y-d/2;t.left=f,t.top=u,t.width=h,t.height=d;const p=t.flip?.x||t.flip?.y?-1:1;t.angle=p*i.angle,e.updateTransforms(),this.studio.emit("clip:updated",{clip:t})}}}async deleteSelected(){return this.studio.deleteSelected()}}class la{constructor(t){this.studio=t}studio;isPlaying=!1;currentTime=0;maxDuration=0;playStartTime=0;playStartTimestamp=0;rafId=null;playbackElements=new Map;setMaxDuration(t){this.maxDuration=t}async play(){if(!(this.isPlaying||this.studio.destroyed)){if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){console.warn("Cannot play: invalid duration",this.maxDuration);return}this.isPlaying||(this.isPlaying=!0),this.playStartTime=this.currentTime,this.playStartTimestamp=performance.now(),this.renderLoop(),this.studio.emit("play",{isPlaying:!0})}}pause(){this.isPlaying=!1,this.rafId!=null&&(cancelAnimationFrame(this.rafId),this.rafId=null);for(const[t,{element:e}]of this.playbackElements.entries())this.isPlaybackCapable(t)&&t.pause(e);this.studio.emit("pause",{isPlaying:!1})}async stop(){this.pause(),await this.seek(0)}async seek(t){if(this.studio.destroyed)return;const e=this.isPlaying;this.playStartTime=Math.max(0,Math.min(t,this.maxDuration)),this.playStartTimestamp=performance.now(),this.currentTime=this.playStartTime;for(const[i,{element:s}]of this.playbackElements.entries()){if(!(this.currentTime>=i.display.from&&(i.display.to===0||this.currentTime<=i.display.to))){this.isPlaybackCapable(i)&&i.pause(s);continue}const o=(this.currentTime-i.display.from)/1e6;if(this.isPlaybackCapable(i)){const a=this.currentTime,n=s;n.__pendingRender=()=>{this.currentTime===a&&this.studio.updateFrame(a)},await i.seek(s,o)}}await this.studio.updateFrame(this.currentTime),this.studio.emit("currentTime",{currentTime:this.currentTime}),e&&(this.isPlaying=!0)}async frameNext(){const e=1e6/(this.studio.opts.fps||30),i=Math.min(this.currentTime+e,this.maxDuration);await this.seek(i)}async framePrev(){const e=1e6/(this.studio.opts.fps||30),i=Math.max(0,this.currentTime-e);await this.seek(i)}async renderLoop(){if(!this.isPlaying||this.studio.destroyed||this.studio.pixiApp==null)return;if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){this.pause();return}const t=async()=>{if(!this.isPlaying||this.studio.destroyed||this.studio.pixiApp==null)return;if(this.currentTime>=this.maxDuration){this.currentTime=this.maxDuration,this.pause();return}const i=(performance.now()-this.playStartTimestamp)*1e3;this.currentTime=Math.min(this.playStartTime+i,this.maxDuration),this.studio.emit("currentTime",{currentTime:this.currentTime});try{await this.studio.updateFrame(this.currentTime)}catch(s){console.warn("Error updating frame:",s)}this.isPlaying&&(this.rafId=requestAnimationFrame(t))};t()}isPlaybackCapable(t){return"play"in t&&"pause"in t&&"seek"in t}}class ca{constructor(t){this.studio=t}studio;tracks=[];clips=[];getTrackById(t){return this.tracks.find(e=>e.id===t)}getClipById(t){return this.clips.find(e=>e.id===t)}findTrackIdByClipId(t){for(const e of this.tracks)if(e.clipIds.includes(t))return e.id}getTrackIndex(t){return this.tracks.findIndex(e=>e.id===t)}addTrack(t,e){const i={id:t.id||`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,name:t.name,type:t.type,clipIds:[]};return typeof e=="number"?this.tracks.splice(e,0,i):this.tracks.unshift(i),this.studio.emit("track:added",{track:i,index:e??0}),this.studio.emit("track:order-changed",{tracks:this.tracks}),i}async removeTrack(t){const e=this.tracks.findIndex(r=>r.id===t);if(e===-1)return;const s=[...this.tracks[e].clipIds];for(const r of s)await this.removeClipById(r);this.tracks.splice(e,1),this.studio.emit("track:removed",{trackId:t}),this.studio.emit("track:order-changed",{tracks:this.tracks})}async moveTrack(t,e){const i=this.tracks.findIndex(r=>r.id===t);if(i===-1)return;const s=this.tracks[i];this.tracks.splice(i,1),this.tracks.splice(e,0,s),this.studio.emit("track:order-changed",{tracks:this.tracks}),await this.studio.updateFrame(this.studio.currentTime)}async setTrackOrder(t){const e=[],i=new Map(this.tracks.map(s=>[s.id,s]));for(const s of t){const r=i.get(s);r&&e.push(r)}e.length!==this.tracks.length&&console.warn("[Studio] setTrackOrder: invalid track IDs provided, order not updated fully"),this.tracks=e,this.studio.emit("track:order-changed",{tracks:this.tracks}),await this.studio.updateFrame(this.studio.currentTime)}async addTransition(t,e=2e6,i,s,r){if(this.studio.destroyed)return;let o=null,a=null;if(i&&s&&(o=this.getClipById(i)??null,a=this.getClipById(s)??null),!o||!a){console.warn("[Studio] Invalid fromClipId or toClipId",{fromClipId:i,toClipId:s});return}await Promise.all([o.ready,a.ready]);const n=e,c=a.display.from-n/2,h=c+n,d={key:t,name:t,duration:n,fromClipId:o.id,toClipId:a.id,start:Math.max(0,c),end:h},f=this.findTrackIdByClipId(a.id);if(f){const g=this.tracks.find(v=>v.id===f);if(g){const v=g.clipIds.map(x=>this.getClipById(x)).filter(x=>{if(!x||x.type!=="Transition")return!1;const w=x;return w.fromClipId===o.id&&w.toClipId===a.id});for(const x of v)await this.removeClip(x)}}const u=`${o.id}_${a.id}`;this.studio.transitionRenderers.has(u)&&(this.studio.transitionRenderers.get(u)?.destroy(),this.studio.transitionRenderers.delete(u)),o.transition={...d},a.transition={...d};const p=new tt(t);r&&(p.id=r),p.duration=n,p.fromClipId=Math.max(0,c)===0?null:o.id,p.toClipId=a.id,p.fromClipId===null&&o&&(p.fromClipId=o.id),p.display.from=Math.max(0,c),p.display.to=h,await this.addClip(p,{trackId:f}),this.studio.seek(this.studio.currentTime)}async addClip(t,e){const i=Array.isArray(t)?t:[t];if(i.length===0)return;const{trackId:s,audioSource:r}=this.normalizeAddClipOptions(e);if(this.studio.destroyed)return;if(this.studio.pixiApp==null)throw new Error("Failed to initialize Pixi.js Application");const o=i.filter(n=>!this.getClipById(n.id)),a=[];for(const n of o)await this.prepareClipForTimeline(n,s),a.push(n);await this.recalculateMaxDuration();for(const n of a)await this.setupClipVisuals(n,r);await this.studio.updateFrame(this.studio.currentTime),this.emitAddClipEvents(a,s)}normalizeAddClipOptions(t){let e,i;if(t&&(typeof t=="string"||t instanceof File||t instanceof Blob))e=t;else if(typeof t=="object"&&t!==null&&!("size"in t)){const s=t;e=s.audioSource,i=s.trackId}return{trackId:i,audioSource:e}}async prepareClipForTimeline(t,e){t.id||(t.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`),this.getClipById(t.id)||this.clips.push(t),this.addClipToTrack(t,e);const i=async()=>{await this.studio.updateFrame(this.studio.currentTime);const s=this.studio.selection;s.activeTransformer!=null&&s.selectedClips.has(t)&&typeof s.activeTransformer.updateBounds=="function"&&s.activeTransformer.updateBounds(),s.refreshClipHitArea(t)};t.on("propsChange",i),this.studio.clipListeners.set(t,i),this.studio.pixiApp!=null&&typeof t.setRenderer=="function"&&t.setRenderer(this.studio.pixiApp.renderer),await t.ready}addClipToTrack(t,e){if(e){const i=this.tracks.find(s=>s.id===e);if(i)i.clipIds.includes(t.id)||i.clipIds.push(t.id);else{const s={id:e,name:`Track ${this.tracks.length+1}`,type:t.type,clipIds:[t.id]};this.tracks.unshift(s),this.studio.emit("track:added",{track:s,index:0}),this.studio.emit("track:order-changed",{tracks:this.tracks})}}else{const s={id:`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,name:`Track ${this.tracks.length+1}`,type:t.type,clipIds:[t.id]};this.tracks.unshift(s),this.studio.emit("track:added",{track:s,index:0}),this.studio.emit("track:order-changed",{tracks:this.tracks})}}async setupClipVisuals(t,e){const i=this.studio.spriteRenderers.get(t);if(i){const s=this.studio.clipsNormalContainer,r=i.getRoot();r&&!r.parent&&s.addChild(r)}else{const s=await t.ready;if(s.width>0&&s.height>0){const r=this.studio.clipsNormalContainer,o=t.type==="Video"&&this.isPlaybackCapable(t);if(!o||o&&t.tickInterceptor!=null){const a=new ue(this.studio.pixiApp,t,r);this.studio.spriteRenderers.set(t,a)}}}await this.setupPlaybackForClip(t,e),this.studio.opts.interactivity&&this.studio.selection.setupSpriteInteractivity(t)}emitAddClipEvents(t,e){if(t.length!==0)if(t.length===1){const i=t[0],s=e||this.tracks.find(r=>r.clipIds.includes(i.id))?.id||"";this.studio.emit("clip:added",{clip:i,trackId:s})}else this.studio.emit("clips:added",{clips:t,trackId:e})}async removeClip(t,e={permanent:!0}){const{permanent:i}=e;if(t.locked)return;const s=this.clips.findIndex(h=>h===t);if(s===-1)return;if(t instanceof tt){if(t.fromClipId){const h=this.getClipById(t.fromClipId);h&&"transition"in h&&delete h.transition}if(t.toClipId){const h=this.getClipById(t.toClipId);h&&"transition"in h&&delete h.transition}}this.studio.selection.selectedClips.has(t)&&this.studio.selection.deselectClip(),this.clips.splice(s,1);const r=[];for(const h of this.tracks){const d=h.clipIds.indexOf(t.id);d!==-1&&(h.clipIds.splice(d,1),r.push(h.id))}this.reconcileTracks(),this.studio.selection.interactiveClips.delete(t);const o=this.studio.clipListeners.get(t);o&&(t.off("propsChange",o),this.studio.clipListeners.delete(t));const a=this.studio.spriteRenderers.get(t);if(a!=null)if(i)a.destroy(),this.studio.spriteRenderers.delete(t);else{const h=a.getRoot();h&&h.parent&&h.parent.removeChild(h)}const n=this.studio.transport.playbackElements.get(t);n!=null&&(this.isPlaybackCapable(t)&&t.pause(n.element),this.studio.transport.playbackElements.delete(t),i&&this.isPlaybackCapable(t)&&t.cleanupPlayback(n.element,n.objectUrl));const c=this.studio.videoSprites.get(t);c!=null&&this.studio.pixiApp!=null&&(c.parent&&c.parent.removeChild(c),i&&(c.destroy(),this.studio.videoSprites.delete(t))),await this.recalculateMaxDuration(),this.studio.emit("clip:removed",{clipId:t.id})}async removeClips(t,e={permanent:!0}){if(t.length!==0){for(const i of t){if(i.locked)continue;const s=this.clips.findIndex(c=>c===i);if(s===-1)continue;if(i instanceof tt){if(i.fromClipId){const c=this.getClipById(i.fromClipId);c&&"transition"in c&&delete c.transition}if(i.toClipId){const c=this.getClipById(i.toClipId);c&&"transition"in c&&delete c.transition}}this.studio.selection.selectedClips.has(i)&&this.studio.selection.deselectClip(),this.clips.splice(s,1);for(const c of this.tracks){const h=c.clipIds.indexOf(i.id);h!==-1&&c.clipIds.splice(h,1)}this.studio.selection.interactiveClips.delete(i);const r=this.studio.clipListeners.get(i);r&&(i.off("propsChange",r),this.studio.clipListeners.delete(i));const o=this.studio.spriteRenderers.get(i);if(o!=null)if(e.permanent)o.destroy(),this.studio.spriteRenderers.delete(i);else{const c=o.getRoot();c&&c.parent&&c.parent.removeChild(c)}const a=this.studio.transport.playbackElements.get(i);a!=null&&(this.isPlaybackCapable(i)&&i.pause(a.element),this.studio.transport.playbackElements.delete(i),e.permanent&&this.isPlaybackCapable(i)&&i.cleanupPlayback(a.element,a.objectUrl));const n=this.studio.videoSprites.get(i);n!=null&&this.studio.pixiApp!=null&&(n.parent&&n.parent.removeChild(n),e.permanent&&(n.destroy(),this.studio.videoSprites.delete(i)))}for(let i=this.tracks.length-1;i>=0;i--)if(this.tracks[i].clipIds.length===0){const s=this.tracks[i].id;this.tracks.splice(i,1),this.studio.emit("track:removed",{trackId:s})}await this.recalculateMaxDuration(),this.studio.emit("clips:removed",{clipIds:t.map(i=>i.id)})}}async removeClipById(t){const e=this.clips.find(i=>i.id===t);e&&await this.removeClip(e)}async updateClip(t,e){const i=this.clips.find(s=>s.id===t);i&&(i.locked&&!("locked"in e)||(i.locked&&"locked"in e&&(Object.keys(e).length===1||(e={locked:e.locked})),await this.applyClipUpdate(i,e),await this.recalculateMaxDuration(),await this.studio.updateFrame(this.studio.currentTime),this.updateTransformer(i),this.studio.emit("clip:updated",{clip:i})))}async updateClips(t){const e=[];for(const{id:i,updates:s}of t){const r=this.clips.find(o=>o.id===i);r&&(await this.applyClipUpdate(r,s),e.push(r))}if(e.length!==0){await this.recalculateMaxDuration(),await this.studio.updateFrame(this.studio.currentTime);for(const i of e)this.updateTransformer(i),this.studio.emit("clip:updated",{clip:i})}}async replaceClipsBySource(t,e){const i=this.clips.filter(s=>s.src===t);if(i.length!==0){this.studio.suspendRendering();for(const s of i){if(!this.clips.includes(s))continue;const r=this.findTrackIdByClipId(s.id);if(!r)continue;const o=this.getTrackById(r);if(!o)continue;const a=await e(s),n=async()=>{await this.studio.updateFrame(this.studio.currentTime),this.updateTransformer(a)};a.on("propsChange",n),this.studio.clipListeners.set(a,n),this.studio.pixiApp!=null&&typeof a.setRenderer=="function"&&a.setRenderer(this.studio.pixiApp.renderer),await a.ready;const c=this.clips.indexOf(s);c!==-1&&(this.clips[c]=a);const h=o.clipIds.indexOf(s.id);h!==-1&&(o.clipIds[h]=a.id),await this.setupClipVisuals(a);const d=this.studio.spriteRenderers.get(s);d&&(d.destroy(),this.studio.spriteRenderers.delete(s));const f=this.studio.videoSprites.get(s);f&&(f.parent&&f.parent.removeChild(f),f.destroy(),this.studio.videoSprites.delete(s));const u=this.studio.clipListeners.get(s);u&&(s.off("propsChange",u),this.studio.clipListeners.delete(s)),this.studio.selection.selectedClips.has(s)&&(this.studio.selection.selectedClips.delete(s),this.studio.selection.selectedClips.add(a)),this.studio.emit("clip:replaced",{oldClip:s,newClip:a,trackId:r})}await this.recalculateMaxDuration(),this.studio.resumeRendering(),await this.studio.updateFrame(this.studio.currentTime)}}async applyClipUpdate(t,e){if(t.type==="Text"||t.type==="Caption"){const i=t;typeof i.updateStyle=="function"&&await i.updateStyle(e),"style"in e&&delete e.style}if(Object.assign(t,e),e.display&&!e.duration?t.duration=e.display.to-e.display.from:e.duration&&(!e.display||!e.display.to)&&(t.display||(t.display={from:0,to:e.duration}),t.display.to=t.display.from+e.duration),e.display&&e.duration){const i=e.display.to-e.display.from;i!==e.duration&&(t.duration=i)}else t.display&&(t.display.to=t.display.from+t.duration)}updateTransformer(t){const e=this.studio.selection;e.selectedClips.has(t)&&e.activeTransformer&&e.activeTransformer.updateBounds()}exportToJSON(){this.reconcileTracks();const t={};for(const s of this.clips)t[s.id]=Lt(s,!1);const e=this.tracks.map(s=>({id:s.id,name:s.name,type:s.type,clipIds:[...s.clipIds]})),i=[];return this.clips.forEach(s=>{if(s.transition){const r=this.tracks.find(o=>o.clipIds.includes(s.id));if(r){const o=r.clipIds.indexOf(s.id);if(o>0){const a=r.clipIds[o-1];i.push({key:s.transition.name,duration:s.transition.duration,clips:[a,s.id]})}}}}),{tracks:e,clips:t,settings:{width:this.studio.opts.width,height:this.studio.opts.height,fps:this.studio.opts.fps,backgroundColor:this.studio.opts.backgroundColor}}}async loadFromJSON(t){if(await this.clear(),t.settings){const s=t.settings.width&&t.settings.width!==this.studio.opts.width||t.settings.height&&t.settings.height!==this.studio.opts.height;if(t.settings.width&&(this.studio.opts.width=t.settings.width),t.settings.height&&(this.studio.opts.height=t.settings.height),t.settings.fps&&(this.studio.opts.fps=t.settings.fps),t.settings.backgroundColor&&(this.studio.opts.backgroundColor=t.settings.backgroundColor),s&&this.studio.pixiApp!=null){const r=this.studio.opts.width,o=this.studio.opts.height;this.studio.pixiApp.renderer.resize(r,o),this.studio.opts.canvas&&(this.studio.opts.canvas.width=r,this.studio.opts.canvas.height=o)}}const e=[],i=Object.values(t.clips??{});if(i.length>0){await this.ensureFontsForClips(i);const s=i.map(a=>a.src).filter(a=>a&&a.trim()!=="");this.studio.resourceManager.preload(s);const r=new Map;if(t.tracks){for(const a of t.tracks)if(a.clipIds)for(const n of a.clipIds)r.set(n,a.id)}if(t.tracks)for(const a of t.tracks)this.tracks.push({id:a.id,name:a.name,type:a.type,clipIds:[]});for(const a of i)e.push((async()=>{try{let n=a.id?r.get(a.id):void 0;if(a.type==="Transition"){const h=a,d=h.toClipId||h.fromClipId;d&&(n=r.get(d))}if(a.type!=="Text"&&a.type!=="Caption"&&a.type!=="Effect"&&a.type!=="Transition"&&(!a.src||a.src.trim()===""))return console.warn(`Skipping clip ${a.type} with empty source`,a),{clip:null};const c=await xt(a);return(c.type==="Video"||c.type==="Image")&&(!a.transform?.width||!a.transform?.height)&&this.studio.opts.width&&this.studio.opts.height&&(typeof c.scaleToFit=="function"&&await c.scaleToFit(this.studio.opts.width,this.studio.opts.height),typeof c.centerInScene=="function"&&c.centerInScene(this.studio.opts.width,this.studio.opts.height)),{clip:c,intendedTrackId:n}}catch(n){return console.error(`Failed to load clip ${a.id||"unknown"}:`,n),{clip:null}}})());const o=await Promise.all(e);for(const{clip:a,intendedTrackId:n}of o)a&&(a.id||(a.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`),this.clips.push(a),this.addClipToTrack(a,n))}this.studio.pixiApp&&this.clips.forEach(s=>{const r=async()=>{await this.studio.updateFrame(this.studio.currentTime);const o=this.studio.selection;o.activeTransformer!=null&&o.selectedClips.has(s)&&typeof o.activeTransformer.updateBounds=="function"&&o.activeTransformer.updateBounds()};s.on("propsChange",r),this.studio.clipListeners.set(s,r),typeof s.setRenderer=="function"&&s.setRenderer(this.studio.pixiApp.renderer),(async()=>{try{await s.ready,await this.setupClipVisuals(s),await this.studio.updateFrame(this.studio.currentTime)}catch(o){console.warn(`[Studio] Failed to setup visuals for clip ${s.id}:`,o)}})()});for(const s of this.clips){const r=s.effects;if(Array.isArray(r))for(const o of r)this.studio.globalEffects.has(o.id)||this.studio.globalEffects.set(o.id,{id:o.id,key:o.key,startTime:o.startTime,duration:o.duration})}for(const s of this.clips)if(s instanceof tt){const r={name:s.transitionKey,key:s.transitionKey,duration:s.duration,fromClipId:s.fromClipId,toClipId:s.toClipId,start:s.display.from,end:s.display.to};if(s.fromClipId){const o=this.getClipById(s.fromClipId);o&&(o.transition={...r})}if(s.toClipId){const o=this.getClipById(s.toClipId);o&&(o.transition={...r})}}await this.recalculateMaxDuration();try{await this.studio.updateFrame(this.studio.currentTime)}catch(s){console.error("[Studio] Failed to update initial frame:",s)}this.studio.emit("studio:restored",{clips:this.clips,tracks:this.tracks,settings:this.studio.opts})}async deleteSelected(){const t=this.studio.selection.selectedClips,e=Array.from(t);if(e.length!==0)for(const i of e)await this.removeClip(i)}async duplicateSelected(){const t=this.studio.selection.selectedClips,e=Array.from(t).filter(s=>!s.locked);if(e.length===0)return;const i=[];for(const s of e){const r=this.findTrackIdByClipId(s.id);if(!r)continue;const o=this.tracks.find(d=>d.id===r);if(!o)continue;const a=Lt(s,!1),n=await xt(a);n.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const c=`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,h=`${o.name} (Copy)`;this.addTrack({id:c,name:h,type:o.type}),await this.addClip(n,{trackId:c}),i.push(n.id)}i.length>0&&this.studio.selection.selectClipsByIds(i)}async splitSelected(t){if(this.studio.opts.core){this.studio.opts.core.clip.split(t);return}const e=Array.from(this.studio.selection.selectedClips);if(e.length!==1){console.warn("[Studio] Split requires exactly one selected clip");return}const i=e[0];if(i.locked){console.warn("[Studio] Cannot split a locked clip");return}const s=t??this.studio.currentTime;if(s<=i.display.from||i.display.to>0&&s>=i.display.to){console.warn("[Studio] Split time is outside clip bounds");return}const r=Lt(i,!1),o=s-i.display.from,a=i.playbackRate||1,n=o*a,c={duration:o,display:{from:i.display.from,to:s}};i.trim&&(c.trim={from:i.trim.from,to:i.trim.from+n}),await this.updateClip(i.id,c);const h={...r};h.timing||(h.timing={});const d=r.timing?.display?.to??0,f=r.timing?.display?.from??0,u=r.timing?.duration??i.duration,p=d>0?d:f+u;h.timing.display={from:s,to:p},h.timing.duration=u-o,h.timing.trim&&(h.timing.trim={from:h.timing.trim.from+n,to:h.timing.trim.to});const g=await xt(h);g.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const v=this.findTrackIdByClipId(i.id);v&&(await this.addClip(g,{trackId:v}),this.studio.selection.selectClipsByIds([g.id]))}async trimSelected(t){const e=Array.from(this.studio.selection.selectedClips);if(e.length!==1){console.warn("[Studio] Trim requires exactly one selected clip");return}const i=e[0];if(i.locked){console.warn("[Studio] Cannot trim a locked clip");return}const s=t*1e6,r=i.playbackRate||1,o=s*r;if(s>=i.duration){console.warn("[Studio] Trim amount exceeds clip duration");return}const a=i.duration-s,n=i.display.from+s,c=i.display.to,h={duration:a,display:{from:n,to:c}};if(i.trim)h.trim={from:i.trim.from+o,to:i.trim.to};else{const d=i.sourceDuration||i.duration;h.trim={from:o,to:d}}await this.updateClip(i.id,h)}async updateSelected(t){const e=Array.from(this.studio.selection.selectedClips);if(e.length!==0)for(const i of e)await this.updateClip(i.id,t)}async setTracks(t){const e=JSON.parse(JSON.stringify(this.tracks));this.tracks=JSON.parse(JSON.stringify(t)),this.reconcileTracks(),this.tracks.length===0&&this.clips.length>0&&(this.tracks=e,this.reconcileTracks()),await this.recalculateMaxDuration(),this.studio.isRestoring||this.studio.emit("track:order-changed",{tracks:this.tracks}),await this.studio.updateFrame(this.studio.currentTime)}reconcileTracks(){const t=new Set(this.clips.map(e=>e.id));for(let e=this.tracks.length-1;e>=0;e--){const i=this.tracks[e],s=i.clipIds.filter(r=>t.has(r));s.length!==i.clipIds.length&&(i.clipIds=s),i.clipIds.length===0&&(this.tracks.splice(e,1),this.studio.isRestoring||this.studio.emit("track:removed",{trackId:i.id}))}this.tracks.length===0&&!this.studio.isRestoring&&this.studio.emit("track:order-changed",{tracks:this.tracks})}async ensureFontsForClips(t){const e=new Map;for(const i of t){if(i.type==="Text"){const s=i.style?.fontUrl||i.fontUrl;s&&e.set(s,{name:i.style?.fontFamily||i.fontFamily||"CustomFont",url:s})}if(i.type==="Caption"){const s=i.style?.fontUrl||i.fontUrl;s&&e.set(s,{name:i.style?.fontFamily||i.fontFamily||"CustomFont",url:s})}}if(e.size>0)try{await jt.loadFonts(Array.from(e.values()))}catch(i){console.warn("Failed to load some fonts:",i)}}async recalculateMaxDuration(){let t=0;for(const e of this.clips){e.display.to===0&&e.duration!==1/0&&!isNaN(e.duration)&&e.duration>0;const i=e.duration>0?e.duration:0;if(i===1/0)continue;const s=e.display.to>0?e.display.to:e.display.from+i;s>t&&(t=s)}this.studio.maxDuration=t}async setupPlaybackForClip(t,e){if(this.studio.pixiApp!=null&&this.isPlaybackCapable(t))try{const i=t;if(t.type==="Audio"&&e&&typeof e!="string"){const o=URL.createObjectURL(e);t.src=o}const{element:s,objectUrl:r}=await i.createPlaybackElement();if(t.type==="Video"){const o=m.Texture.from(s),a=new m.Sprite(o);a.visible=!1,this.studio.clipsNormalContainer&&this.studio.clipsNormalContainer.addChild(a),this.studio.videoSprites.set(t,a)}this.studio.transport.playbackElements.set(t,{element:s,objectUrl:r})}catch(i){console.warn(`Failed to setup playback for ${t.constructor.name}`,i)}}isPlaybackCapable(t){return"createPlaybackElement"in t&&"play"in t&&"pause"in t&&"seek"in t&&"syncPlayback"in t&&"cleanupPlayback"in t}async clear(){this.studio.selection.deselectClip(),this.studio.selection.interactiveClips.clear();for(const[t,e]of this.studio.clipListeners)t.off("propsChange",e);this.studio.clipListeners.clear(),this.studio.globalEffects.clear(),this.studio.effectFilters.clear(),this.studio.transitionRenderers.forEach(t=>t.destroy()),this.studio.transitionRenderers.clear(),this.studio.transitionSprites.forEach(t=>{t.parent&&t.parent.removeChild(t),t.destroy()}),this.studio.transitionSprites.clear(),this.studio.spriteRenderers.forEach(t=>t.destroy()),this.studio.spriteRenderers.clear();for(const[t,e]of this.studio.transport.playbackElements)this.isPlaybackCapable(t)&&t.cleanupPlayback(e.element,e.objectUrl);this.studio.transport.playbackElements.clear();for(const t of this.studio.videoSprites.values())t.destroy();this.studio.videoSprites.clear(),this.tracks=[],this.clips=[],this.studio.maxDuration=0,this.studio.currentTime=0,this.studio.emit("reset")}async rippleDelete(t,e){if(t>=e)return;const i=e-t,s=[...this.clips];for(const r of s){const o=r.display.from,a=r.display.to;if(!(a<=t)){if(o>=e){await this.updateClip(r.id,{display:{from:r.display.from-i,to:r.display.to-i}});continue}if(o>=t&&a<=e){await this.removeClip(r);continue}if(o<t&&a>e){const n=await r.clone();n.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const c=t,h=t+(a-e),d=r.trim.from+(e-o)*r.playbackRate,f=r.trim.to,u=this.tracks.find(p=>p.clipIds.includes(r.id));u&&(await this.addClip(n,{trackId:u.id}),await this.updateClip(n.id,{display:{from:c,to:h},trim:{from:d,to:f}})),await this.updateClip(r.id,{display:{from:r.display.from,to:t},trim:{from:r.trim.from,to:r.trim.from+(t-o)*r.playbackRate}});continue}if(o<t&&a<=e){await this.updateClip(r.id,{display:{from:r.display.from,to:t},trim:{from:r.trim.from,to:r.trim.from+(t-o)*r.playbackRate}});continue}if(o>=t&&a>e){await this.updateClip(r.id,{display:{from:t,to:t+(a-e)},trim:{from:r.trim.from+(e-o)*r.playbackRate,to:r.trim.to}});continue}}}await this.recalculateMaxDuration(),await this.studio.updateFrame(this.studio.currentTime)}}class ha{past=[];future=[];lastState=null;maxSize;constructor(t={}){this.maxSize=t.maxSize||50}projectToHistoryState(t){const e={},i=JSON.parse(JSON.stringify(t.tracks||[]));for(const[s,r]of Object.entries(t.clips??{}))e[s]=JSON.parse(JSON.stringify(r));return{clips:e,tracks:i,settings:JSON.parse(JSON.stringify(t.settings||{}))}}init(t){this.lastState=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),this.past=[],this.future=[]}push(t){if(!this.lastState){this.init(t);return}const e=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),i=gi(this.lastState,e);i.length!==0&&(this.past.push(i),this.past.length>this.maxSize&&this.past.shift(),this.future=[],this.lastState=e)}undo(t){const e=this.past.pop();if(!e)return null;const i=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),s=this.applyPatches(i,e,!0);return this.future.push(e),this.lastState=s,{patches:e,state:s}}redo(t){const e=this.future.pop();if(!e)return null;const i=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),s=this.applyPatches(i,e,!1);return this.past.push(e),this.lastState=s,{patches:e,state:s}}applyPatches(t,e,i){const s=JSON.parse(JSON.stringify(t)),r=i?[...e].reverse():e;for(const o of r){const{type:a,path:n}=o,c=o.value,h=o.oldValue;let d=s,f=!1;for(let p=0;p<n.length-1;p++){if(d[n[p]]===void 0||d[n[p]]===null){f=!0;break}d=d[n[p]]}if(f)continue;const u=n[n.length-1];if(i)switch(a){case"CREATE":Array.isArray(d)?d.splice(u,1):delete d[u];break;case"REMOVE":d[u]=h&&typeof h=="object"?JSON.parse(JSON.stringify(h)):h;break;case"CHANGE":d[u]=h&&typeof h=="object"?JSON.parse(JSON.stringify(h)):h;break}else switch(a){case"CREATE":d[u]=c&&typeof c=="object"?JSON.parse(JSON.stringify(c)):c;break;case"REMOVE":Array.isArray(d)?d.splice(u,1):delete d[u];break;case"CHANGE":d[u]=c&&typeof c=="object"?JSON.parse(JSON.stringify(c)):c;break}}return s}canUndo(){return this.past.length>0}canRedo(){return this.future.length>0}}class fi extends ee{selection;transport;timeline;history;resourceManager;pixiApp=null;get tracks(){return this.timeline.tracks}get clips(){return this.timeline.clips}spriteRenderers=new Map;artboard=null;clipContainer=null;artboardMask=null;artboardBg=null;get activeTransformer(){return this.selection.activeTransformer}set activeTransformer(t){this.selection.activeTransformer=t}get selectedClips(){return this.selection.selectedClips}set selectedClips(t){this.selection.selectedClips=t}get interactiveClips(){return this.selection.interactiveClips}set interactiveClips(t){this.selection.interactiveClips=t}get playbackElements(){return this.transport.playbackElements}videoSprites=new Map;clipListeners=new Map;get isPlaying(){return this.transport.isPlaying}set isPlaying(t){this.transport.isPlaying=t}get currentTime(){return this.transport.currentTime}set currentTime(t){this.transport.currentTime=t}get maxDuration(){return this.transport.maxDuration}set maxDuration(t){this.transport.maxDuration=t}opts;destroyed=!1;renderingSuspended=!1;frameToken=0;historyPaused=!1;processingHistory=!1;isRestoring=!1;historyGroupDepth=0;clipCache=new Map;_isUpdatingLayout=!1;bridge=null;_zoomLevel=1;_panOffset={x:0,y:0};_baseScale=1;_allowZoom=!1;_allowPan=!1;_isPanning=!1;_isSpaceDown=!1;_lastPointerPos={x:0,y:0};_boundOnWheel=null;_boundOnPointerDown=null;_boundOnPointerMove=null;_boundOnPointerUp=null;_boundOnKeyDown=null;_boundOnKeyUp=null;globalEffects=new Map;activeGlobalEffects=[];currentGlobalEffectSprite=null;effectFilters=new Map;transitionRenderers=new Map;transitionSprites=new Map;transFromTexture=null;transToTexture=null;transBgGraphics=null;clipsNormalContainer=null;clipsEffectContainer=null;videoTextureCache=new WeakMap;lastFromFrame=null;lastToFrame=null;hexToNumber(t){const e=t.startsWith("#")?t.slice(1):t;return parseInt(e,16)}ready;constructor(t){super(),this.opts={fps:30,backgroundColor:"#000000",artboardColor:"#000000",interactivity:!0,spacing:0,allowZoom:!1,allowPan:!1,previewScale:1,...t},this._allowZoom=!!this.opts.allowZoom,this._allowPan=!!this.opts.allowPan,this.selection=new aa(this),this.transport=new la(this),this.timeline=new ca(this),this.history=new ha,this.resourceManager=new yt,this.ready=this.initPixiApp().then(()=>{this.history.init(this.exportToJSON()),this._initViewportEvents()}),this.on("clip:added",e=>this.handleTimelineChange(e)),this.on("clips:added",e=>this.handleTimelineChange(e)),this.on("clip:replaced",e=>this.handleTimelineChange({clip:e.newClip})),this.on("studio:restored",e=>{e.clips.forEach(i=>this.attachClipEvents(i)),this.handleTimelineChange()}),this.on("clip:removed",this.handleClipRemoved),this.on("clips:removed",this.handleClipsRemoved),this.on("clip:updated",this.handleTimelineChange),this.on("track:removed",()=>this.handleTimelineChange()),this.on("track:added",()=>this.handleTimelineChange()),this.opts.core&&(this.bridge=new oa(this.opts.core,this))}attachClipEvents(t){if(this.clipListeners.has(t))return;const e=()=>{this.updateFrame(this.currentTime)};t.on("request-render",e),this.clipListeners.set(t,e)}handleTimelineChange=t=>{t?.clip&&this.attachClipEvents(t.clip),t?.clips&&t.clips.forEach(e=>this.attachClipEvents(e)),this.updateFrame(this.currentTime),this.saveHistory()};saveHistory(){this.historyPaused||this.processingHistory||(this.history.push(this.exportToJSON()),this.emit("history:changed",{canUndo:this.history.canUndo(),canRedo:this.history.canRedo()}))}beginHistoryGroup(){this.processingHistory||this.isRestoring||(this.historyGroupDepth++,this.historyPaused=!0)}endHistoryGroup(){this.processingHistory||this.isRestoring||(this.historyGroupDepth=Math.max(0,this.historyGroupDepth-1),this.historyGroupDepth===0&&(this.historyPaused=!1,this.saveHistory()))}setPath(t,e,i){let s=t;for(let r=0;r<e.length-1;r++){const o=e[r];s[o]||(s[o]=typeof e[r+1]=="number"?[]:{}),s=s[o]}s[e[e.length-1]]=i}async applyHistoryPatches(t,e,i){const s=new Map,r=new Map,o=new Set;for(const a of t){const{type:n,path:c}=a,h=a.value,d=a.oldValue;if(c[0]==="clips"){const f=c[1];i?n==="CREATE"?o.add(f):n==="REMOVE"?r.set(f,d):n==="CHANGE"&&(s.has(f)||s.set(f,{}),this.setPath(s.get(f),c.slice(2),d)):n==="CREATE"?r.set(f,h):n==="REMOVE"?o.add(f):n==="CHANGE"&&(s.has(f)||s.set(f,{}),this.setPath(s.get(f),c.slice(2),h))}else c[0]==="settings"&&(i?this.setPath(this.opts,c.slice(1),d):this.setPath(this.opts,c.slice(1),h))}for(const a of o){const n=this.timeline.getClipById(a);n&&await this.removeClip(n)}for(const[a,n]of r){let c=this.clipCache.get(a);c||(c=await xt(n),this.clipCache.set(a,c),this.attachClipEvents(c));let h;for(const d of e.tracks)if(d.clipIds.includes(a)){h=d.id;break}await this.addClip(c,{trackId:h})}for(const[a,n]of s)await this.updateClip(a,n);this.timeline.setTracks(e.tracks),this.emit("studio:restored",{clips:this.clips,tracks:this.tracks,settings:this.opts})}async undo(){if(!(!this.history.canUndo()||this.processingHistory)){this.processingHistory=!0,this.isRestoring=!0,this.historyPaused=!0;try{const t=this.history.undo(this.exportToJSON());t&&await this.applyHistoryPatches(t.patches,t.state,!0),this.emit("history:changed",{canUndo:this.history.canUndo(),canRedo:this.history.canRedo()})}finally{this.historyPaused=!1,this.isRestoring=!1,this.processingHistory=!1}}}async redo(){if(!(!this.history.canRedo()||this.processingHistory)){this.processingHistory=!0,this.isRestoring=!0,this.historyPaused=!0;try{const t=this.history.redo(this.exportToJSON());t&&await this.applyHistoryPatches(t.patches,t.state,!1),this.emit("history:changed",{canUndo:this.history.canUndo(),canRedo:this.history.canRedo()})}finally{this.historyPaused=!1,this.isRestoring=!1,this.processingHistory=!1}}}cleanupClipVisuals=t=>{for(const[r,o]of this.spriteRenderers)if(r.id===t){const a=o.getRoot();a&&a.parent&&a.parent.removeChild(a),o.destroy(),this.spriteRenderers.delete(r);break}const e=this.transitionSprites.get(t);e&&(e.parent&&e.parent.removeChild(e),e.destroy(),this.transitionSprites.delete(t)),this.transitionRenderers.get(t)&&this.transitionRenderers.delete(t);for(const[r,o]of this.videoSprites)if(r.id===t){o.parent&&o.parent.removeChild(o),o.destroy(),this.videoSprites.delete(r);break}const s=this.timeline.getClipById(t);if(s){const r=this.clipListeners.get(s);r&&(s.off("request-render",r),this.clipListeners.delete(s))}};handleClipRemoved=({clipId:t})=>{this.cleanupClipVisuals(t),this.updateFrame(this.currentTime),this.saveHistory()};handleClipsRemoved=({clipIds:t})=>{for(const e of t)this.cleanupClipVisuals(e);this.updateFrame(this.currentTime),this.saveHistory()};async initPixiApp(){if(this.destroyed)return;const t=this.opts.canvas||document.createElement("canvas");t.width=this.opts.width,t.height=this.opts.height;const e=new m.Application,i=t.parentElement||window;await e.init({canvas:t,resizeTo:i,backgroundColor:this.hexToNumber(this.opts.backgroundColor),antialias:!0,resolution:(window.devicePixelRatio||1)*this.opts.previewScale,autoDensity:!0,autoStart:!1}),this.pixiApp=e,e.renderer.background.color=this.hexToNumber(this.opts.backgroundColor),e.render(),e.stage.eventMode="static",e.stage.hitArea=e.screen,this.artboard=new m.Container,this.artboard.label="ArtboardRoot",e.stage.addChild(this.artboard),this.selection.init(e,this.artboard),this.artboardBg=new m.Graphics,this.artboardBg.rect(0,0,this.opts.width,this.opts.height).fill({color:this.hexToNumber(this.opts.artboardColor)}),this.artboard.addChild(this.artboardBg),this.clipContainer=new m.Container,this.clipContainer.label="ClipContainer",this.artboard.addChild(this.clipContainer),this.artboardMask=new m.Graphics,this.artboardMask.rect(0,0,this.opts.width,this.opts.height).fill({color:16777215}),this.clipContainer.addChild(this.artboardMask),this.clipContainer.mask=this.artboardMask,this.clipsEffectContainer=new m.Container,this.clipsEffectContainer.label="ClipsEffect",this.clipsEffectContainer.visible=!1,this.clipsEffectContainer.zIndex=1,this.clipsEffectContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsEffectContainer),this.clipsNormalContainer=new m.Container,this.clipsNormalContainer.label="ClipsNormal",this.clipsNormalContainer.zIndex=10,this.clipsNormalContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsNormalContainer),this.recreateTransitionTextures(),this.transBgGraphics=new m.Graphics,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:0,alpha:0}),this.clipContainer.sortableChildren=!0,this.updateArtboardLayout(),e.renderer.on("resize",()=>{this.handleResize()})}getOptions(){return this.opts}setSize(t,e){this.updateDimensions(t,e)}setPreviewScale(t){this.opts.previewScale=Math.max(.1,Math.min(1,t)),this.pixiApp&&(this.pixiApp.renderer.resolution=(window.devicePixelRatio||1)*this.opts.previewScale,this.pixiApp.resize()),this.recreateTransitionTextures(),this.updateArtboardLayout(),this.updateFrame(this.currentTime)}recreateTransitionTextures(){this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transFromTexture=m.RenderTexture.create({width:this.opts.width,height:this.opts.height,resolution:this.opts.previewScale}),this.transToTexture=m.RenderTexture.create({width:this.opts.width,height:this.opts.height,resolution:this.opts.previewScale})}setBackgroundColor(t){this.opts.backgroundColor=t;const e=this.hexToNumber(t);this.pixiApp&&(this.pixiApp.renderer.background.color=e,this.pixiApp.render()),this.updateFrame(this.currentTime)}setArtboardColor(t){this.opts.artboardColor=t;const e=this.hexToNumber(t);this.artboardBg&&this.artboardBg.clear().rect(0,0,this.opts.width,this.opts.height).fill({color:e}),this.pixiApp&&this.pixiApp.render(),this.updateFrame(this.currentTime)}updateDimensions(t,e){this.opts.width=t,this.opts.height=e,this.artboardBg&&this.artboardBg.clear().rect(0,0,t,e).fill({color:this.hexToNumber(this.opts.artboardColor)}),this.artboardMask&&this.artboardMask.clear().rect(0,0,t,e).fill({color:16777215}),this.recreateTransitionTextures(),this.transBgGraphics&&this.transBgGraphics.clear().rect(0,0,t,e).fill({color:0,alpha:0}),this.updateArtboardLayout(),this.updateFrame(this.currentTime)}handleResize=()=>{this.destroyed||!this.pixiApp||this._isUpdatingLayout||this.updateArtboardLayout()};updateArtboardLayout(t={}){if(!(!this.pixiApp||!this.artboard||this._isUpdatingLayout)){this._isUpdatingLayout=!0;try{t.skipResize||this.pixiApp.resize();const i=this.pixiApp.canvas.parentElement,s=i?i.getBoundingClientRect().width:this.pixiApp.screen.width,r=i?i.getBoundingClientRect().height:this.pixiApp.screen.height,o=this.opts.width,a=this.opts.height,n=this.opts.spacing||0,c=Math.max(0,s-n*2),h=Math.max(0,r-n*2),d=c/o,f=h/a,u=Math.min(d,f);this._baseScale=u;const p=u*this._zoomLevel;this.artboard.scale.set(p),this.artboard.x=(s-o*p)/2+this._panOffset.x,this.artboard.y=(r-a*p)/2+this._panOffset.y,this.pixiApp.render(),this.emit("viewport:changed",{zoomLevel:this._zoomLevel,panOffset:{...this._panOffset}})}finally{this._isUpdatingLayout=!1}}}get zoomLevel(){return this._zoomLevel}get baseScale(){return this._baseScale}setZoom(t,e,i){if(!this.pixiApp||!this.artboard)return;const s=this._zoomLevel,r=Math.min(10,Math.max(.1,t));if(s!==r){if(e!==void 0&&i!==void 0){const a=this.pixiApp.canvas.parentElement,n=a?a.getBoundingClientRect().width:this.pixiApp.screen.width,c=a?a.getBoundingClientRect().height:this.pixiApp.screen.height,h=this._baseScale,d=h*s,f=h*r,u=this.opts.width,p=this.opts.height,g=(n-u*d)/2+this._panOffset.x,v=(c-p*d)/2+this._panOffset.y,x=e-g,w=i-v,T=f/d,y=e-x*T,C=i-w*T;this._panOffset.x=y-(n-u*f)/2,this._panOffset.y=C-(c-p*f)/2}this._zoomLevel=r,this.updateArtboardLayout({skipResize:!0})}}pan(t,e){this._panOffset.x+=t,this._panOffset.y+=e,this.updateArtboardLayout({skipResize:!0})}resetView(){this._zoomLevel=1,this._panOffset={x:0,y:0},this.updateArtboardLayout()}setAllowZoom(t){this._allowZoom=t}setAllowPan(t){this._allowPan=t}_initViewportEvents(){if(!this.pixiApp)return;const t=this.pixiApp.canvas;this._boundOnWheel=e=>{if(!this._allowZoom&&!this._allowPan)return;e.preventDefault();const i=Math.abs(e.deltaY)>0&&Math.abs(e.deltaY)<100&&Math.floor(e.deltaY)!==Math.ceil(e.deltaY);if(e.ctrlKey||e.metaKey){if(!this._allowZoom)return;const s=t.getBoundingClientRect(),r=e.clientX-s.left,o=e.clientY-s.top,n=Math.pow(i?.992:.996,e.deltaY),c=this._zoomLevel*n;this.setZoom(c,r,o)}else{if(!this._allowPan)return;let s=e.deltaX,r=e.deltaY;e.deltaMode===1?(s*=25,r*=25):e.deltaMode===2&&(s*=400,r*=400),this.pan(-s,-r)}},this._boundOnPointerDown=e=>{this._allowPan&&(e.button===1||e.button===0&&this._isSpaceDown)&&(this._isPanning=!0,this._lastPointerPos={x:e.clientX,y:e.clientY},t.setPointerCapture(e.pointerId),t.style.cursor="grabbing",e.preventDefault())},this._boundOnPointerMove=e=>{if(!this._isPanning)return;const i=e.clientX-this._lastPointerPos.x,s=e.clientY-this._lastPointerPos.y;this._lastPointerPos={x:e.clientX,y:e.clientY},this.pan(i,s)},this._boundOnPointerUp=e=>{this._isPanning&&(this._isPanning=!1,t.style.cursor=this._isSpaceDown?"grab":"")},this._boundOnKeyDown=e=>{if(this._allowPan&&e.code==="Space"&&!e.repeat){const i=document.activeElement?.tagName;if(i==="INPUT"||i==="TEXTAREA")return;this._isSpaceDown=!0,t.style.cursor="grab",e.preventDefault()}},this._boundOnKeyUp=e=>{e.code==="Space"&&(this._isSpaceDown=!1,this._isPanning||(t.style.cursor=""))},t.addEventListener("wheel",this._boundOnWheel,{passive:!1}),t.addEventListener("pointerdown",this._boundOnPointerDown),window.addEventListener("pointermove",this._boundOnPointerMove),window.addEventListener("pointerup",this._boundOnPointerUp),window.addEventListener("pointercancel",this._boundOnPointerUp),window.addEventListener("keydown",this._boundOnKeyDown),window.addEventListener("keyup",this._boundOnKeyUp)}_destroyViewportEvents(){const t=this.pixiApp?.canvas;t&&this._boundOnWheel&&t.removeEventListener("wheel",this._boundOnWheel),t&&this._boundOnPointerDown&&t.removeEventListener("pointerdown",this._boundOnPointerDown),this._boundOnPointerMove&&window.removeEventListener("pointermove",this._boundOnPointerMove),this._boundOnPointerUp&&(window.removeEventListener("pointerup",this._boundOnPointerUp),window.removeEventListener("pointercancel",this._boundOnPointerUp)),this._boundOnKeyDown&&window.removeEventListener("keydown",this._boundOnKeyDown),this._boundOnKeyUp&&window.removeEventListener("keyup",this._boundOnKeyUp)}getCanvas(){if(this.opts.canvas)return this.opts.canvas;if(this.pixiApp?.canvas)return this.pixiApp.canvas;throw new Error("Canvas not initialized yet. Wait for initPixiApp to complete.")}async addTransition(t,e=2e6,i,s,r){return this.timeline.addTransition(t,e,i,s,r)}findTrackIdByClipId(t){return this.timeline.findTrackIdByClipId(t)}async addClip(t,e){const i=Array.isArray(t)?t:[t];i.forEach(s=>this.clipCache.set(s.id,s)),this.beginHistoryGroup();try{const s=await this.timeline.addClip(t,e);return i.forEach(r=>this.attachClipEvents(r)),s}finally{this.endHistoryGroup()}}addTrack(t,e){return this.timeline.addTrack(t,e)}async setTracks(t){if(this.isRestoring)return;const e=new Set(this.timeline.clips.map(i=>i.id));if(!(t.length===0&&e.size>0)&&!(t.length>0&&e.size>0&&!t.some(s=>s.clipIds.some(r=>e.has(r)))))return this.timeline.setTracks(t)}async moveTrack(t,e){return this.timeline.moveTrack(t,e)}async setTrackOrder(t){return this.timeline.setTrackOrder(t)}async removeTrack(t){return this.timeline.removeTrack(t)}getClipById(t){return this.timeline.getClipById(t)}async updateClip(t,e){return this.timeline.updateClip(t,e)}async centerClip(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=(this.opts.width-e.width)/2,s=(this.opts.height-e.height)/2;if(this.getClipById(e.id))return this.updateClip(e.id,{left:i,top:s});e.left=i,e.top=s}async centerClipH(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=(this.opts.width-e.width)/2;if(this.getClipById(e.id))return this.updateClip(e.id,{left:i});e.left=i}async centerClipV(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=(this.opts.height-e.height)/2;if(this.getClipById(e.id))return this.updateClip(e.id,{top:i});e.top=i}async scaleToFit(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=await e.ready,{width:s,height:r}=i;if(s===0||r===0)return;const o=Math.min(this.opts.width/s,this.opts.height/r),a=s*o,n=r*o;if(this.getClipById(e.id))return this.updateClip(e.id,{width:a,height:n});e.width=a,e.height=n}async scaleToCover(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=await e.ready,{width:s,height:r}=i;if(s===0||r===0)return;const o=Math.max(this.opts.width/s,this.opts.height/r),a=s*o,n=r*o;if(this.getClipById(e.id))return this.updateClip(e.id,{width:a,height:n});e.width=a,e.height=n}async updateClips(t){this.suspendRendering(),await this.timeline.updateClips(t),this.resumeRendering(),this.updateFrame(this.currentTime)}suspendRendering(){this.renderingSuspended=!0}resumeRendering(){this.renderingSuspended=!1}getTracks(){return this.timeline.tracks}getClip(t){return this.timeline.getClipById(t)}findClip(t){return this.timeline.getClipById(t)}setupSpriteInteractivity(t){this.selection.setupSpriteInteractivity(t)}async removeClip(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e){console.warn("[Studio] removeClip: Clip not found",t);return}this.beginHistoryGroup();try{return this.clipCache.set(e.id,e),this.timeline.removeClip(e,{permanent:!this.processingHistory})}finally{this.endHistoryGroup()}}async removeClips(t){this.beginHistoryGroup();try{return t.forEach(e=>this.clipCache.set(e.id,e)),this.timeline.removeClips(t,{permanent:!this.processingHistory})}finally{this.endHistoryGroup()}}async removeClipById(t){const e=this.timeline.getClipById(t);if(e)return this.removeClip(e)}async removeClipsById(t){const e=t.map(i=>this.timeline.getClipById(i)).filter(Boolean);return this.removeClips(e)}async deleteSelected(){const t=this.selection.selectedClips;if(t.size!==0){this.beginHistoryGroup();try{await this.removeClips(Array.from(t))}finally{this.endHistoryGroup()}}}async duplicateSelected(){this.beginHistoryGroup();try{return await this.timeline.duplicateSelected()}finally{this.endHistoryGroup()}}async splitSelected(t){this.beginHistoryGroup();try{return await this.timeline.splitSelected(t)}finally{this.endHistoryGroup()}}async trimSelected(t){return this.timeline.trimSelected(t)}async updateSelected(t){return this.timeline.updateSelected(t)}async clear(){await this.timeline.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null),this.transitionRenderers.forEach(t=>t.destroy()),this.transitionRenderers.clear(),this.transitionSprites.forEach(t=>t.destroy()),this.transitionSprites.clear(),this.emit("reset")}async play(){return this.transport.play()}pause(){this.transport.pause()}async stop(){return this.transport.stop()}async seek(t){return this.transport.seek(t)}async frameNext(){return this.transport.frameNext()}async framePrev(){return this.transport.framePrev()}async renderFrame(t,e){if(await this.ready,!this.pixiApp||!this.artboard)throw new Error("Studio is not initialized yet. Wait for studio.ready before calling renderFrame().");const i=t*1e3;await this.updateFrame(i);const s=this.artboard.scale.clone(),r=this.artboard.x,o=this.artboard.y;this.artboard.scale.set(1),this.artboard.x=0,this.artboard.y=0;const a=e?.transparent??!1;a&&this.artboardBg&&(this.artboardBg.visible=!1);const n=m.RenderTexture.create({width:this.opts.width,height:this.opts.height}),c=this.pixiApp.renderer.background.alpha;a&&(this.pixiApp.renderer.background.alpha=0);let h;try{this.pixiApp.renderer.render({container:this.artboard,target:n,clear:!0}),h=await this.pixiApp.renderer.extract.base64(n,"image/png",1)}finally{n.destroy(),a&&(this.pixiApp.renderer.background.alpha=c),a&&this.artboardBg&&(this.artboardBg.visible=!0),this.artboard.scale.set(s.x,s.y),this.artboard.x=r,this.artboard.y=o,this.pixiApp.render()}return h}async snapshot(t,e){const i=typeof t=="number"?e:t,s=typeof t=="number"?t:void 0;return this.renderFrame(s??this.currentTime/1e3,i)}getCurrentTime(){return this.transport.currentTime}getMaxDuration(){return this.transport.maxDuration}getIsPlaying(){return this.transport.isPlaying}getSelectedClips(){return Array.from(this.selectedClips)}getVideoTexture(t){let e=this.videoTextureCache.get(t);return e||(e=m.Texture.from(t),this.videoTextureCache.set(t,e)),e}isPlaybackCapable(t){return"createPlaybackElement"in t&&"play"in t&&"pause"in t&&"seek"in t&&"syncPlayback"in t&&"cleanupPlayback"in t}async updateFrame(t){if(this.destroyed||this.pixiApp==null||this.renderingSuspended)return;const e=++this.frameToken;this.updateActiveGlobalEffect(t);const i=new Set,s=new Set,r=new Set,o=this.tracks.length;for(const n of this.clips){const c=this.getTrackIndex(n.id);if(c!==-1){const h=(o-c)*10;n.zIndex=h;const d=this.spriteRenderers.get(n);if(d){const u=d.getRoot();u&&(u.zIndex=h)}const f=this.videoSprites.get(n);f&&(f.zIndex=h)}}const a=[...this.clips].sort((n,c)=>n.zIndex-c.zIndex);for(const n of a){const c=n.type==="Video"||n.type==="Image";let h=n.transition?.start??0,d=n.transition?.end??0;if(n.transition&&(n.transition.fromClipId||n.transition.toClipId)){const T=n.transition.fromClipId?this.getClipById(n.transition.fromClipId):null,y=n.transition.toClipId?this.getClipById(n.transition.toClipId):null;if(y){const C=n.transition.duration??2e6;h=Math.max(0,y.display.from-C/2),d=h+C}else if(T){const C=n.transition.duration??2e6;h=Math.max(0,T.display.to-C/2),d=h+C}}const f=c&&n.transition&&t>=h&&t<d;if(!f&&t<n.display.from){const T=this.spriteRenderers.get(n);T!=null&&await T.updateFrame(null);const y=this.videoSprites.get(n);y!=null&&(y.visible=!1);const C=this.playbackElements.get(n);C!=null&&this.isPlaybackCapable(n)&&n.pause(C.element);continue}if(!f&&n.display.to>0&&t>n.display.to){const T=this.spriteRenderers.get(n);T!=null&&await T.updateFrame(null);const y=this.videoSprites.get(n);y!=null&&(y.visible=!1);const C=this.playbackElements.get(n);C!=null&&this.isPlaybackCapable(n)&&n.pause(C.element);continue}const u=t-n.display.from,p=u*n.playbackRate;n.animate(p);const g=await n.ready,v=n.duration||g.duration;if(!f&&v>0&&u>v){const T=this.spriteRenderers.get(n);T!=null&&await T.updateFrame(null);const y=this.videoSprites.get(n);y!=null&&(y.visible=!1);const C=this.playbackElements.get(n);C!=null&&this.isPlaybackCapable(n)&&n.pause(C.element);continue}const x=this.playbackElements.get(n);if(x!=null&&this.isPlaybackCapable(n)){const T=u/1e6;if(n.trackMuted=this.tracks.find(y=>y.clipIds.includes(n.id))?.muted??!1,n.syncPlayback(x.element,this.isPlaying,T),n.type==="Video"&&this.isPlaybackCapable(n)){const y=this.videoSprites.get(n);if(y!=null){const C=(n.duration||n.meta.duration)/1e6;if(this.spriteRenderers.has(n))y.visible=!1;else if(y.visible=!f&&!r.has(n.id)&&T>=0&&T<C,y.visible&&Go(n,y),!f)continue}}else continue}if(f){const T=n?.transition?.fromClipId,y=n?.transition?.toClipId,C=`${T}_${y}`;if(s.has(C)){const S=this.spriteRenderers.get(n);S?.getRoot()&&(S.getRoot().visible=!1);const A=this.videoSprites.get(n);A&&(A.visible=!1);continue}s.add(C),(!this.transFromTexture||!this.transToTexture)&&this.recreateTransitionTextures(),this.transBgGraphics||(this.transBgGraphics=new m.Graphics,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:0,alpha:0}));const k=T?this.getClipById(T):null,O=y?this.getClipById(y):null;let F=null,b=null;if(k){const S=Math.max(0,t-k.display.from),{video:A}=await k.getFrame(S);A instanceof HTMLVideoElement?F=this.getVideoTexture(A):F=A,F&&(this.lastFromFrame=F)}if(O){const S=Math.max(0,t-O.display.from),{video:A}=await O.getFrame(S);A instanceof HTMLVideoElement?b=this.getVideoTexture(A):b=A,b&&(this.lastToFrame=b)}if(F||(F=this.lastFromFrame),b||(b=this.lastToFrame),!F||!b)continue;if(F&&b&&this.pixiApp&&this.transFromTexture&&this.transToTexture){const S=(t-h)/n?.transition?.duration;k&&F&&this.renderClipToTransitionTexture(k,F,this.transFromTexture),O&&b&&this.renderClipToTransitionTexture(O,b,this.transToTexture);let A=this.transitionRenderers.get(C);if(!A)try{A=fe({name:n?.transition?.name,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(C,A)}catch(E){console.error("[Studio] Failed to create transition renderer:",E)}if(A){const E=this.clips.find(I=>I instanceof tt&&I.fromClipId===T&&I.toClipId===y),P=A.render({width:this.opts.width,height:this.opts.height,from:this.transFromTexture,to:this.transToTexture,progress:S,values:E?.values});let R=this.transitionSprites.get(n.id);R||(R=new m.Sprite,R.label=`TransitionSprite_${n.id}`,this.transitionSprites.set(n.id,R),this.clipsNormalContainer&&this.clipsNormalContainer.addChild(R)),R.texture=P,R.visible=!0,R.x=0,R.y=0,R.width=this.opts.width,R.height=this.opts.height,R.anchor.set(0,0),R.zIndex=n.zIndex,i.add(n.id);const B=this.spriteRenderers.get(n);B?.getRoot()&&(B.getRoot().visible=!1);const W=this.videoSprites.get(n);if(W&&(W.visible=!1),k){const I=this.spriteRenderers.get(k);I?.getRoot()&&(I.getRoot().visible=!1);const D=this.videoSprites.get(k);D&&(D.visible=!1),r.add(k.id)}if(O){const I=this.spriteRenderers.get(O);I?.getRoot()&&(I.getRoot().visible=!1);const D=this.videoSprites.get(O);D&&(D.visible=!1),r.add(O.id)}continue}}}const w=this.spriteRenderers.get(n);if(w!=null){if(r.has(n.id)){const C=w.getRoot();C&&(C.visible=!1);const k=this.videoSprites.get(n);k&&(k.visible=!1);continue}const T=this.selectedClips.has(n);if(n.type!=="Text"&&n.type!=="Caption"&&typeof n.getTexture=="function"&&n.getTexture()!=null){const C=n.getTexture();if(C!=null){await w.updateFrame(C),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n);continue}}if(n.type==="Text"){const C=n;this.pixiApp?.renderer&&typeof C.setRenderer=="function"&&C.setRenderer(this.pixiApp.renderer);const k=await C.getTexture();if(k!=null){await w.updateFrame(k),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n);continue}}if(n.type==="Caption"){n.updateState(u);const C=n;this.pixiApp?.renderer&&typeof C.setRenderer=="function"&&C.setRenderer(this.pixiApp.renderer);const k=await C.getTexture();if(k!=null){await w.updateFrame(k),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n);continue}}if(n.type==="Shape"){const C=n;this.pixiApp?.renderer&&typeof C.setRenderer=="function"&&C.setRenderer(this.pixiApp.renderer)}const{video:y}=await n.getFrame(u);if(e!==this.frameToken)return;await w.updateFrame(y),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n)}}if(this.activeGlobalEffects.length>0&&this.clipsNormalContainer&&this.clipsEffectContainer){for(const n of this.clips)this.moveClipToEffectContainer(n,!1);this.clipsNormalContainer.visible=!0,await this.applyGlobalEffects(t)}else if(this.clipsNormalContainer){for(const n of this.clips)this.moveClipToEffectContainer(n,!1);this.clipsNormalContainer.visible=!0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null)}for(const[n,c]of this.transitionSprites.entries())i.has(n)||(c.visible=!1);this.pixiApp!=null&&this.pixiApp.render()}moveClipToEffectContainer(t,e=!0){if(!this.clipsNormalContainer||!this.clipsEffectContainer)return;const i=e?this.clipsEffectContainer:this.clipsNormalContainer,s=this.spriteRenderers.get(t);if(s){const a=s.getRoot();if(a&&a.parent!==i){try{a.parent&&a.parent.removeChild&&a.parent.removeChild(a)}catch(n){console.warn("moveClipToEffectContainer: could not remove root from parent",n)}i.addChild(a)}}const r=this.transitionSprites.get(t.id);if(r&&r.parent!==i){try{r.parent&&r.parent.removeChild&&r.parent.removeChild(r)}catch(a){console.warn("moveClipToEffectContainer: could not remove transSprite from parent",a)}i.addChild(r)}const o=this.videoSprites.get(t);if(o&&o.parent!==i){try{o.parent&&o.parent.removeChild&&o.parent.removeChild(o)}catch(a){console.warn("moveClipToEffectContainer: could not remove videoSprite from parent",a)}i.addChild(o)}}applyGlobalEffect(t,e,i){const s=e.id||`${t}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,r={id:s,key:t,startTime:e.startTime,duration:e.duration??1e6};for(const o of i)o instanceof It&&o.addEffect(r),o instanceof nt&&o.addEffect(r),o instanceof at&&o.addEffect(r),o instanceof mt&&o.addEffect(r);return this.globalEffects.set(s,r),s}getTrackIndex(t){return this.tracks.findIndex(e=>e.clipIds.includes(t))}async getTransitionFromFrame(t,e){let i=null;if(t.transition?.prevClipId&&(i=this.clips.find(a=>a.id===t.transition.prevClipId)||null),i||(i=this.getPreviousClipOnTrack(t)),!i)return null;const s=i.duration>0?i.duration:0,r=Math.max(0,Math.min(e-i.display.from,s)),{video:o}=await i.getFrame(r);return o}getPreviousClipOnTrack(t){const e=this.getTrackIndex(t.id);return e===-1?null:this.clips.filter(i=>i.id!==t.id&&this.getTrackIndex(i.id)===e&&i.display.from<t.display.from&&(i instanceof nt||i instanceof It)).sort((i,s)=>s.display.to-i.display.to)[0]||null}renderClipToTransitionTexture(t,e,i){if(!this.pixiApp)return;const s=t.style||{},{renderTransform:r}=t,o=(r?.mirror??0)>.5,a=e instanceof m.Texture?e:m.Texture.from(e),n=r?.x??0,c=r?.y??0,h=r?.angle??0,d=r?.scale??1,f=r?.opacity??1,u=r?.blur??0,p=r?.brightness??1,g=a.width||1,v=a.height||1,x=t.type==="Caption",w=!x&&t.width&&t.width!==0?Math.abs(t.width)/g:1,T=!x&&t.height&&t.height!==0?Math.abs(t.height)/v:1,y=new m.Container;y.x=t.center.x+n,y.y=t.center.y+c,y.rotation=(t.flip?.x||t.flip?.y?-1:1)*((t.angle+h)*Math.PI)/180,y.alpha=t.opacity*f;const C=new m.Sprite(a);C.anchor.set(.5,.5);let k=[];if(o){const D=w*d,z=T*d,U=g*D,Z=v*z;C.position.set(0,0),C.scale.set(D,z);const N=[[U,0,-D,z],[-U,0,-D,z],[0,Z,D,-z],[0,-Z,D,-z],[U,Z,-D,-z],[-U,Z,-D,-z],[U,-Z,-D,-z],[-U,-Z,-D,-z]];for(const[V,K,G,H]of N){const Y=new m.Sprite(a);Y.anchor.set(.5,.5),Y.position.set(V,K),Y.scale.set(G,H),k.push(Y)}if(t.flip?.x){C.scale.x=-D;for(let V=0;V<8;V++)k[V].scale.x=-N[V][2]}if(t.flip?.y){C.scale.y=-z;for(let V=0;V<8;V++)k[V].scale.y=-N[V][3]}y.addChild(C);for(const V of k)y.addChild(V)}else C.scale.x=t.flip?.x?-w*d:w*d,C.scale.y=t.flip?.y?-T*d:T*d,y.addChild(C);const O=[];if(u>0){const D=new m.BlurFilter;D.strength=u,D.quality=4,D.repeatEdgePixels=!0,O.push(D)}const F=he(t.colorAdjustment);if(p!==1||F){const D=new m.ColorMatrixFilter;de(D,t.colorAdjustment,p),O.push(D)}const b=Zt(t.colorAdjustment);for(let D=0;D<b.length;D++){const z=b[D],U=new m.UniformGroup({uTargetColor:{value:[1,1,0],type:"vec3<f32>"},uHueShift:{value:z.hue,type:"f32"},uSatShift:{value:z.saturation/100,type:"f32"},uLightShift:{value:z.lightness/100,type:"f32"},uTolerance:{value:.22,type:"f32"},uSoftness:{value:.12,type:"f32"}}),Z=Pt(z.targetColor);Z&&(U.uniforms.uTargetColor[0]=Z.r/255,U.uniforms.uTargetColor[1]=Z.g/255,U.uniforms.uTargetColor[2]=Z.b/255);const N=new m.Filter({glProgram:new m.GlProgram({vertex:Mt,fragment:ce,name:`SelectiveHslShader_${D}`}),resources:{hslUniforms:U}});O.push(N)}y.filters=O;const S=Math.abs(t.width??0)*d,A=Math.abs(t.height??0)*d,E=s.borderRadius||0;let P=null;E>0&&(P=new m.Graphics,P.roundRect(-S/2,-A/2,S,A,Math.min(E,S/2,A/2)),P.fill({color:16777215,alpha:1}),y.addChild(P),C.mask=null,C.mask=P);const R=s.stroke;let B=null;if(R&&R.width>0){B=new m.Graphics;const D=$(R.color)??16777215;let z=1;if(R.alignment!==void 0&&(typeof R.alignment=="number"?z=R.alignment:R.alignment==="center"||R.alignment==="middle"?z=.5:R.alignment==="inside"?z=0:R.alignment==="outside"&&(z=1)),B.setStrokeStyle({width:R.width,color:D,alignment:z}),E>0){const U=Math.min(E,S/2,A/2);B.roundRect(-S/2,-A/2,S,A,U)}else B.rect(-S/2,-A/2,S,A);B.stroke(),y.addChild(B)}const W=s.shadow;let I=null;if(W&&(W.blur>0||(W.offsetX??0)!==0||(W.offsetY??0)!==0)){I=new m.Graphics;const D=$(W.color)??0,z=W.alpha??.5,U=W.offsetX??0,Z=W.offsetY??0;if(E>0){const N=Math.min(E,S/2,A/2);I.roundRect(-S/2+U,-A/2+Z,S,A,N)}else I.rect(-S/2+U,-A/2+Z,S,A);I.fill({color:D,alpha:z}),y.addChildAt(I,0)}this.pixiApp.renderer.render({container:y,target:i,clear:!0}),e instanceof m.Texture||C.texture.destroy(!0),P&&P.destroy(),B&&B.destroy(),I&&I.destroy();for(const D of k)D.destroy();C.destroy(),y.destroy()}removeGlobalEffect(t){this.globalEffects.delete(t)}clearGlobalEffects(){this.globalEffects.clear()}updateActiveGlobalEffect(t){const e=[];for(const i of this.clips)if(i instanceof lt){const s=i.duration>0?i.duration:i.display.to-i.display.from;t>=i.display.from&&(i.display.to===0||t<i.display.to)&&t<i.display.from+s&&e.push({id:i.id,key:i.effectKey,startTime:i.display.from,duration:s,trackIndex:this.getTrackIndex(i.id),values:i.values})}for(const i of this.globalEffects.values()){const s=i.startTime+i.duration;t>=i.startTime&&t<s&&e.push({id:i.id,key:i.key,startTime:i.startTime,duration:i.duration,trackIndex:-1})}this.activeGlobalEffects=e.sort((i,s)=>(s.trackIndex??-1)-(i.trackIndex??-1))}async applyGlobalEffects(t){if(this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null),this.activeGlobalEffects.length===0||!this.pixiApp||!this.clipContainer||!this.clipsNormalContainer||!this.clipsEffectContainer)return;const e=this.opts.width,i=this.opts.height;let s=null,r=new Set;const o=[];for(const n of this.activeGlobalEffects){const{key:c,startTime:h,duration:d,trackIndex:f,values:u}=n,p=t-h,g=Math.min(Math.max(p/d,0),1);if(g<0||g>=1)continue;if(this.clipsEffectContainer.visible=!0,this.clipsEffectContainer.removeChildren(),s){const y=new m.Sprite(s);y.label="PrevEffectResult",y.width=e,y.height=i,this.clipsEffectContainer.addChild(y)}const v=f??-1;for(const y of this.clips){if(r.has(y.id))continue;const C=this.getTrackIndex(y.id);!(y instanceof lt)&&(v===-1||C>v)&&(this.moveClipToEffectContainer(y,!0),r.add(y.id))}let x=this.effectFilters.get(c);if(!x)try{if(x=await ge({name:c,renderer:this.pixiApp.renderer,values:u}),x)this.effectFilters.set(c,x);else continue}catch(y){console.error(y);continue}const w=m.RenderTexture.create({width:e,height:i,resolution:this.opts.previewScale});o.push(w),this.pixiApp.renderer.render({container:this.clipsEffectContainer,target:w,clear:!0});const T=x.render({canvasTexture:w,progress:g,width:e,height:i,values:u});this.clipsEffectContainer.visible=!1,s=T}const a=s;if(a&&!o.includes(a)&&!a.destroyed&&a._source){const n=new m.Sprite(a);n.x=0,n.y=0,n.width=e,n.height=i,n.scale.set(1),n.zIndex=5,this.clipContainer.addChild(n),this.currentGlobalEffectSprite=n}for(const n of o)n!==a&&!n.destroyed&&n.destroy(!0)}destroy(){if(!this.destroyed){this._destroyViewportEvents(),window.removeEventListener("resize",this.handleResize),this.bridge&&(this.bridge.dispose(),this.bridge=null),this.destroyed=!0,this.stop(),this.clear(),this.transitionRenderers.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null);for(const t of this.transitionSprites.values())t.destroy();this.transitionSprites.clear(),this.pixiApp&&(this.pixiApp.destroy(!0,{children:!0,texture:!0}),this.pixiApp=null)}}selectClip(t,e=!1){this.selection.selectClip(t,e)}setSelection(t){this.selection.setSelection(t)}selectClipsByIds(t){this.selection.selectClipsByIds(t)}deselectClip(){this.selection.deselectClip()}async lockClip(t,e){const i=this.timeline.getClipById(t);i&&(await this.timeline.updateClip(t,{locked:e}),this.emit("clip:lock-changed",{clip:i,locked:e}),this.selection.selectedClips.has(i)&&this.selection.recreateTransformer(),await this.updateFrame(this.currentTime))}exportToJSON(){return this.timeline.exportToJSON()}async loadFromJSON(t){return this.timeline.loadFromJSON(t)}}M.ANIMATABLE_PROPERTIES=$i,M.AngleWipeAnimation=Le,M.AssetManager=Yt,M.Audio=ut,M.Backdrop=zt,M.BlockRevealAnimation=Ie,M.Caption=mt,M.CenterExpandAnimation=ze,M.CircleRevealAnimation=Be,M.ClipRegistry=st,M.Compositor=ra,M.DEFAULT_AUDIO_CONF=L,M.EdgeCropAnimation=Ge,M.Effect=lt,M.FontManager=pt,M.GL_EFFECT_OPTIONS=Zn,M.GL_TRANSITION_OPTIONS=Wn,M.GsapAnimation=Ee,M.Image=It,M.KeyframeAnimation=Fe,M.Log=Q,M.MP4Clip=nt,M.MediaCache=We,M.PixiEngine=fi,M.Placeholder=Bt,M.RectExpandAnimation=Ne,M.ResourceManager=yt,M.ResourceStatus=Qe,M.ShapeClip=Nt,M.StarRevealAnimation=He,M.Studio=fi,M.Text=at,M.Transition=tt,M.VALUES_FILTER_SPECIAL=me,M.VALUES_FILTER_SPECIAL_LIMITS=Xn,M.Video=nt,M.WipeAnimation=De,M.animationRegistry=Vt,M.clipToJSON=Lt,M.createChromakey=Yi,M.createSlowMo=ke,M.easings=Wt,M.fastConcatMP4=ei,M.fixFMP4Duration=zs,M.fontManager=jt,M.getAllEffects=pe,M.getAllTransitions=Ot,M.getAnimatedKeys=Me,M.getEasing=At,M.getEffectOptions=ci,M.getPixiProperty=Oe,M.getTransitionOptions=li,M.hasPixiProp=Re,M.jsonToClip=xt,M.makeEffect=ge,M.makeTransition=fe,M.mediaCache=Qt,M.mixinMP4AndAudio=Us,M.pixiProps=ie,M.prepareVars=ft,M.registerCustomEffect=Qn,M.registerCustomTransition=Gn,M.renderTxt2ImgBitmap=qi,M.resolveValue=dt,M.resolveVars=kt,M.unregisterCustomEffect=jn,M.unregisterCustomTransition=Un,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})}));
3334
+ </svg>`;return`url('data:image/svg+xml;utf8,${encodeURIComponent(T).replace(/'/g,"%27").replace(/"/g,"%22")}') 16 16, auto`};this.#t.rot_tl.cursor=d(s.x,s.y),this.#t.rot_tr.cursor=d(s.x+s.width,s.y),this.#t.rot_bl.cursor=d(s.x,s.y+s.height),this.#t.rot_br.cursor=d(s.x+s.width,s.y+s.height),this.#N(i)}#N(t){if(this.selectionOutlines.clear(),this.group.length<=1||!this.parent)return;const e={width:1*t,color:43775,alpha:1};for(const i of this.group){const s=this.#x(i);this.#e[0].set(s.x,s.y),this.#e[1].set(s.x+s.width,s.y),this.#e[2].set(s.x+s.width,s.y+s.height),this.#e[3].set(s.x,s.y+s.height);for(const r of this.#e)i.toGlobal(r,r),this.toLocal(r,void 0,r);this.selectionOutlines.moveTo(this.#e[0].x,this.#e[0].y).lineTo(this.#e[1].x,this.#e[1].y).lineTo(this.#e[2].x,this.#e[2].y).lineTo(this.#e[3].x,this.#e[3].y).closePath().stroke(e)}}#z(t){const e=this.#s;if(this.opts.centeredScaling){this.#r.set(e.x+e.width/2,e.y+e.height/2);return}t==="tl"?this.#r.set(e.x+e.width,e.y+e.height):t==="tr"?this.#r.set(e.x,e.y+e.height):t==="bl"?this.#r.set(e.x+e.width,e.y):t==="br"?this.#r.set(e.x,e.y):t==="ml"?this.#r.set(e.x+e.width,e.y+e.height/2):t==="mr"?this.#r.set(e.x,e.y+e.height/2):t==="mt"?this.#r.set(e.x+e.width/2,e.y+e.height):t==="mb"&&this.#r.set(e.x+e.width/2,e.y)}#k(t,e,i){let s=!1;if(this.opts.clip&&(this.opts.clip.type==="Image"||this.opts.clip.type==="Video")&&(s=!0),this.opts.centeredScaling){let g=Math.abs(e.x-i.x)*2,v=Math.abs(e.y-i.y)*2;if(s){const x=this.#s.width,w=this.#s.height,T=x/w;g/x>v/w?v=g/T:g=v*T}return g=Math.max(this.#f,g),v=Math.max(this.#u,v),new m.Rectangle(i.x-g/2,i.y-v/2,g,v)}if(["tl","tr","bl","br"].includes(t)){let g=Math.abs(e.x-i.x),v=Math.abs(e.y-i.y);if(s){const x=this.#s.width,w=this.#s.height,T=x/w;g/x>v/w?v=g/T:g=v*T}if(g=Math.max(this.#f,g),v=Math.max(this.#u,v),t==="tl")return new m.Rectangle(i.x-g,i.y-v,g,v);if(t==="tr")return new m.Rectangle(i.x,i.y-v,g,v);if(t==="bl")return new m.Rectangle(i.x-g,i.y,g,v);if(t==="br")return new m.Rectangle(i.x,i.y,g,v)}const r=this.#s,o=this.rotation,a=Math.cos(o),n=Math.sin(o),c=(i.x-r.x)/r.width,h=(i.y-r.y)/r.height,d=e.x-i.x,u=e.y-i.y,f=d*a+u*n,p=-d*n+u*a;if(t==="ml"){const g=this.#l-f,v=Math.max(this.#f,this.#c+g),x=i.x-v*c,w=i.y-r.height*h;return new m.Rectangle(x,w,v,r.height)}if(t==="mr"){const g=f-this.#l,v=Math.max(this.#f,this.#c+g),x=i.x-v*c,w=i.y-r.height*h;return new m.Rectangle(x,w,v,r.height)}if(t==="mt"){const g=this.#l-p,v=Math.max(this.#u,this.#c+g),x=i.x-r.width*c,w=i.y-v*h;return new m.Rectangle(x,w,r.width,v)}if(t==="mb"){const g=p-this.#l,v=Math.max(this.#u,this.#c+g),x=i.x-r.width*c,w=i.y-v*h;return new m.Rectangle(x,w,r.width,v)}return new m.Rectangle(i.x,i.y,this.#f,this.#u)}#L(t,e,i,s){return mi.delta.identity().translate(-t.x,-t.y).rotate(-e).scale(i,s).rotate(e).translate(t.x,t.y)}#H(t,e){return mi.delta.identity().translate(-t.x,-t.y).rotate(e).translate(t.x,t.y)}#F(t){for(const e of this.group){const i=this.#a.get(e),s=e.parent;if(!i||!s)continue;const r=s.worldTransform.clone().invert(),o=s.worldTransform.clone().append(i),a=t.clone().append(o),n=r.clone().append(a);e.setFromMatrix(n)}}}class da{constructor(t){this.studio=t}studio;selectedClips=new Set;activeTransformer=null;interactiveClips=new Set;getSelection(){return Array.from(this.selectedClips)}selectionGraphics=null;isDragSelecting=!1;dragSelectionStart=new m.Point;isUpdatingTextRealtime=!1;textClipResizedWidth=null;textClipResizeHandle=null;textClipResizedSx=null;textClipResizedSy=null;lastPointerDownTime=0;lastPointerDownClip=null;init(t,e){this.selectionGraphics=new m.Graphics,this.selectionGraphics.visible=!1,this.selectionGraphics.zIndex=1e3,e.addChild(this.selectionGraphics),t.stage.eventMode="static",t.stage.hitArea=t.screen,t.stage.on("pointerdown",i=>this.onStagePointerDown(i)),t.stage.on("globalpointermove",i=>this.onStagePointerMove(i)),t.stage.on("pointerup",()=>this.onStagePointerUp()),t.stage.on("pointerupoutside",()=>this.onStagePointerUp())}onStagePointerDown(t){t.target===this.studio.pixiApp?.stage&&(t.shiftKey||this.deselectClip(),this.isDragSelecting=!0,this.studio.artboard?.toLocal(t.global,void 0,this.dragSelectionStart),this.selectionGraphics&&(this.selectionGraphics.clear(),this.selectionGraphics.visible=!0))}onStagePointerMove(t){if(this.isDragSelecting&&this.selectionGraphics&&this.studio.artboard){const e=this.studio.artboard.toLocal(t.global),i=Math.min(this.dragSelectionStart.x,e.x),s=Math.min(this.dragSelectionStart.y,e.y),r=Math.abs(e.x-this.dragSelectionStart.x),o=Math.abs(e.y-this.dragSelectionStart.y);this.selectionGraphics.clear(),this.selectionGraphics.rect(i,s,r,o).fill({color:703971,alpha:.3}),this.selectionGraphics.rect(i,s,r,o).stroke({width:2,color:703971});const a=this.selectionGraphics.getBounds(),n=new m.Rectangle(a.x,a.y,a.width,a.height);if(n.width>2||n.height>2){const c=this.getIntersectingClips(n);this.updatePreviewSelection(c)}else this.selectedClips.size===0&&this.destroyTransformer();this.studio.pixiApp?.render()}}onStagePointerUp(){if(this.isDragSelecting&&this.selectionGraphics&&this.studio.artboard){const t=this.selectionGraphics.getBounds(),e=new m.Rectangle(t.x,t.y,t.width,t.height);if(e.width>2||e.height>2){const i=this.getIntersectingClips(e);if(i.length>0){for(const s of i)this.selectedClips.add(s);this.recreateTransformer(),this.studio.emit("selection:created",{selected:Array.from(this.selectedClips)})}else this.selectedClips.size===0&&this.destroyTransformer()}else this.selectedClips.size===0&&this.destroyTransformer();this.selectionGraphics.clear(),this.selectionGraphics.visible=!1,this.isDragSelecting=!1,this.studio.pixiApp?.render()}}getIntersectingClips(t){const e=[];for(const i of this.studio.clips){const s=this.studio.spriteRenderers.get(i);if(!s)continue;const r=s.getRoot();if(!r||!r.visible)continue;const o=r.getBounds();t.x<o.x+o.width&&t.x+t.width>o.x&&t.y<o.y+o.height&&t.y+t.height>o.y&&e.push(i)}return e}updatePreviewSelection(t){if(t.length===0){this.selectedClips.size===0?this.destroyTransformer():this.recreateTransformer();return}const e=new Set(t),i=[];let s=null;for(const r of e){const o=this.studio.spriteRenderers.get(r);if(o==null)continue;const a=o.getRoot();a!=null&&(i.push(a),e.size===1&&(s=r))}if(i.length===0){this.selectedClips.size===0&&this.destroyTransformer();return}this.activeTransformer?(this.activeTransformer.group=i,this.activeTransformer.opts.group=i,this.activeTransformer.opts.clip=s,this.activeTransformer.updateBounds(),this.activeTransformer.showImmediate()):(this.activeTransformer=new gi({group:i,clip:s,artboardWidth:this.studio.opts.width,artboardHeight:this.studio.opts.height}),this.studio.artboard?.addChild(this.activeTransformer),this.activeTransformer.showImmediate()),this.studio.pixiApp?.render()}refreshClipHitArea(t){const e=this.studio.spriteRenderers.get(t);if(e==null)return;const i=e.getRoot();i!=null&&(i.hitArea=new m.Rectangle(-t.width/2,-t.height/2,t.width,t.height))}setupSpriteInteractivity(t){if(this.interactiveClips.has(t))return;const e=this.studio.spriteRenderers.get(t);if(e==null)return;const i=e.getRoot();i!=null&&(i.eventMode="static",i.cursor="pointer",this.refreshClipHitArea(t),i.on("pointerdown",s=>{const r=Date.now(),o=this.getTopmostClipAtPoint(s.global);o===t&&o===this.lastPointerDownClip&&r-this.lastPointerDownTime<350&&(o.type==="Text"||o.type==="Caption")&&this.studio.emit("clip:dblclick",{clip:o}),this.lastPointerDownTime=r,this.lastPointerDownClip=o,o&&this.selectClip(o,s.shiftKey)}),this.interactiveClips.add(t))}getTopmostClipAtPoint(t){if(!this.studio.pixiApp)return null;let e=null,i=-1/0;for(const s of this.interactiveClips){const r=this.studio.spriteRenderers.get(s);if(!r)continue;const o=r.getRoot();if(!o||!o.visible)continue;const a=o.toLocal(t),n=s.width/2,c=s.height/2;a.x>=-n&&a.x<=n&&a.y>=-c&&a.y<=c&&s.zIndex>i&&(i=s.zIndex,e=s)}return e}selectClip(t,e=!1){if(!(this.studio.destroyed||this.studio.pixiApp==null)){if(e||this.deselectClip(),e&&this.selectedClips.has(t)){this.selectedClips.delete(t),this.recreateTransformer(),this.studio.emit("selection:updated",{selected:Array.from(this.selectedClips)}),this.studio.pixiApp?.render();return}this.selectedClips.add(t),this.recreateTransformer(),e?this.studio.emit("selection:updated",{selected:Array.from(this.selectedClips)}):this.studio.emit("selection:created",{selected:Array.from(this.selectedClips)}),this.studio.pixiApp?.render()}}selectClipsByIds(t){const e=this.studio.clips.filter(i=>t.includes(i.id));this.setSelection(e)}setSelection(t){if(!(this.studio.destroyed||this.studio.pixiApp==null)&&!(this.selectedClips.size===t.length&&t.every(e=>this.selectedClips.has(e)))){for(const e of this.selectedClips)this.syncSpriteToClipProperties(e);this.destroyTransformer(),this.selectedClips.clear();for(const e of t)this.selectedClips.add(e);this.selectedClips.size>0?(this.createTransformer(),this.studio.emit("selection:updated",{selected:Array.from(this.selectedClips)})):this.studio.emit("selection:cleared",{deselected:[]}),this.studio.pixiApp?.render()}}deselectClip(){if(this.selectedClips.size>0)for(const e of this.selectedClips)this.syncSpriteToClipProperties(e);this.destroyTransformer();const t=Array.from(this.selectedClips);this.selectedClips.clear(),t.length>0&&this.studio.emit("selection:cleared",{deselected:t}),this.studio.pixiApp?.render()}async move(t,e){if(this.selectedClips.size===0)return;const i=[];for(const s of this.selectedClips)i.push({id:s.id,updates:{left:(s.left??0)+t,top:(s.top??0)+e}});await this.studio.updateClips(i),this.activeTransformer&&this.activeTransformer.updateBounds()}clear(){this.deselectClip(),this.interactiveClips.clear()}recreateTransformer(){this.destroyTransformer(),this.selectedClips.size>0&&this.createTransformer()}destroyTransformer(){this.activeTransformer!=null&&(this.activeTransformer.parent!=null&&this.activeTransformer.parent.removeChild(this.activeTransformer),this.activeTransformer.destroy(),this.activeTransformer=null)}createTransformer(){if(this.studio.destroyed||this.studio.artboard==null||this.selectedClips.size===0)return;const t=[];let e=null;for(const r of this.selectedClips){const o=this.studio.spriteRenderers.get(r);if(o==null)continue;const a=o.getRoot();a!=null&&(t.push(a),this.selectedClips.size===1&&(e=r))}if(t.length===0){console.warn("Cannot create transformer: no sprites found");return}const i=e?.locked??!1;this.activeTransformer=new gi({group:t,clip:e,artboardWidth:this.studio.opts.width,artboardHeight:this.studio.opts.height,locked:i});let s=null;this.activeTransformer.on("transforming",()=>{s===null&&(s=requestAnimationFrame(()=>{s=null,this.syncSelectedClipsTransformsRealtime();for(const r of this.selectedClips){const o=this.studio.spriteRenderers.get(r);if(!o)continue;const a=o.getRoot();if(!a)continue;const c=(r.flip?.x||r.flip?.y?-1:1)*a.angle;this.studio.emit("clip:transforming",{clip:r,ephemeral:{left:r.left,top:r.top,width:r.width,height:r.height,angle:c,scaleX:a.scale.x,scaleY:a.scale.y}})}this.studio.pixiApp?.render()}))}),this.activeTransformer.on("textClipResize",r=>{this.textClipResizedWidth=r.newWidth,this.textClipResizeHandle=r.handle,this.textClipResizedSx=r.sx,this.textClipResizedSy=r.sy;const o=this.selectedClips.size===1?Array.from(this.selectedClips)[0]:null;if(o instanceof ht&&this.textClipResizedWidth!==null){const a=o.updateLayoutForWidth(this.textClipResizedWidth);r.proposed&&a.height!==r.proposed.height&&(r.proposed.height=a.height)}}),this.activeTransformer.on("transformEnd",async()=>{s!==null&&(cancelAnimationFrame(s),s=null);const r=this.studio.opts.core;if(r){const o=[];for(const a of this.selectedClips){const n=this.studio.spriteRenderers.get(a);if(!n)continue;const c=n.getRoot(),h=n.getSprite();if(!c||!h||!h.texture)continue;const d=a.renderTexturePadding??0,u=h.texture.width-d*2,f=h.texture.height-d*2,p=Math.abs(c.scale.x*h.scale.x)*u,g=Math.abs(c.scale.y*h.scale.y)*f,v={left:c.x-p/2,top:c.y-g/2,width:p,height:g,angle:(a.flip?.x||a.flip?.y?-1:1)*c.angle};(a.type==="Text"||a.type==="Caption")&&this.textClipResizedWidth!==null&&(v.width=this.textClipResizedWidth),o.push({id:a.id,updates:v})}o.length>0&&r.execute({id:$t.nanoid(),type:"clip.update",payload:o.length===1?o[0]:o})}else await this.syncSelectedClipsTransforms();for(const o of this.selectedClips)this.studio.emit("clip:updated",{clip:o});this.studio.emit("transform:end",{transformer:this.activeTransformer})}),this.activeTransformer.on("pointerdown",r=>{if(r.button!==0||(this.studio.emit("transform:start",{transformer:this.activeTransformer}),this.activeTransformer?.activeHandle!==null))return;const o=this.getTopmostClipAtPoint(r.global),a=Date.now();o&&o===this.lastPointerDownClip&&a-this.lastPointerDownTime<350&&(o.type==="Text"||o.type==="Caption")&&this.studio.emit("clip:dblclick",{clip:o}),this.lastPointerDownTime=a,this.lastPointerDownClip=o,o&&!this.selectedClips.has(o)&&(this.selectClip(o,r.shiftKey),r.stopPropagation())}),this.studio.artboard.addChild(this.activeTransformer),this.activeTransformer.showImmediate(),this.studio.pixiApp?.render()}async syncSelectedClipsTransformsRealtime(){if(this.selectedClips.size===0||this.activeTransformer==null)return;const t=this.activeTransformer.activeHandle;if(t===null){for(const e of this.selectedClips){const i=this.studio.spriteRenderers.get(e);if(i==null)continue;const s=i.getRoot(),r=i.getSprite();if(s==null||r==null||r.texture==null)continue;const o=e.renderTexturePadding??0,a=r.texture.width-o*2,n=r.texture.height-o*2,c=Math.abs(s.scale.x*r.scale.x)*a,h=Math.abs(s.scale.y*r.scale.y)*n;e.left=s.x-c/2,e.top=s.y-h/2}return}if(t==="mr"||t==="ml"){if(this.isUpdatingTextRealtime)return;this.isUpdatingTextRealtime=!0;try{for(const e of this.selectedClips){if(!(e instanceof ht))continue;const i=this.studio.spriteRenderers.get(e);if(i==null)continue;const s=i.getRoot(),r=i.getSprite();if(s==null||r==null||r.texture==null)continue;const o=Math.abs(s.scale.x*r.scale.x);if(o===1)continue;const a=e.left,n=e.top,c=e.width,h=e.renderTexturePadding??0,d=r.texture.width-h*2,u=o*d;await e.updateStyle({wordWrap:!0,wordWrapWidth:u});const f=await e.getTexture();f&&(await i.updateFrame(f),r.scale.set(1,1),s.scale.set(1,1),t==="ml"?e.left=a+c-e.width:e.left=a,e.top=n,s.x=e.left+e.width/2,s.y=e.top+e.height/2,this.activeTransformer.updateBounds(),this.refreshClipHitArea(e))}}finally{this.isUpdatingTextRealtime=!1}}}async syncSelectedClipsTransforms(){if(!(this.selectedClips.size===0||this.activeTransformer==null)){for(const t of this.selectedClips){const e=this.studio.spriteRenderers.get(t);if(e==null)continue;const i=e.getRoot(),s=e.getSprite();if(i==null||s==null||s.texture==null)continue;const r=t.renderTexturePadding??0,o=s.texture.width-r*2,a=s.texture.height-r*2,n=Math.abs(i.scale.x*s.scale.x)*o,c=Math.abs(i.scale.y*s.scale.y)*a,h=(t instanceof ht||t instanceof yt)&&this.textClipResizedWidth!==null?this.textClipResizedWidth:n,d=t.width,f=(t.style?.fontSize??16)*Math.max(this.textClipResizedSx||1,this.textClipResizedSy||1);let p=i.x;if((t instanceof ht||t instanceof yt)&&this.textClipResizedWidth!==null){const v={wordWrap:!0,wordWrapWidth:h};this.textClipResizeHandle==="mr"?(p=t.left+h/2,i.x=p):this.textClipResizeHandle==="ml"?(p=t.left+h/2-(h-d),i.x=p):["br","tr"].includes(this.textClipResizeHandle)?(p=t.left+h/2,v.fontSize=f):["bl","tl"].includes(this.textClipResizeHandle)&&(p=t.left+h/2-(h-d),v.fontSize=f),await t.updateStyle(v);const x=await t.getTexture();if(x){await e.updateFrame(x),t.width=h;const w=t.renderTexturePadding??0;t.height=x.height-w*2,this.textClipResizedWidth=null,t.left=p-t.width/2,t.top=i.y-t.height/2,s.scale.set(1,1),i.scale.set(1,1)}}else{const v=n,x=c;t.left=i.x-v/2,t.top=i.y-x/2,t.width=v,t.height=x;const w=t.flip?.x||t.flip?.y?-1:1;t.angle=w*i.angle}}this.activeTransformer!=null&&this.activeTransformer.updateBounds();for(const t of this.selectedClips){const e=this.studio.spriteRenderers.get(t);e?.updateTransforms(),this.refreshClipHitArea(t)}}}syncSpriteToClipProperties(t){const e=this.studio.spriteRenderers.get(t);if(e!=null){const i=e.getRoot(),s=e.getSprite();if(i!=null&&s!=null&&s.texture!=null){const r=t.renderTexturePadding??0,o=s.texture.width-r*2,a=s.texture.height-r*2,n=Math.abs(i.scale.x*s.scale.x)*o,c=Math.abs(i.scale.y*s.scale.y)*a,h=n,d=c,u=i.x-h/2,f=i.y-d/2;t.left=u,t.top=f,t.width=h,t.height=d;const p=t.flip?.x||t.flip?.y?-1:1;t.angle=p*i.angle,e.updateTransforms(),this.studio.emit("clip:updated",{clip:t})}}}async deleteSelected(){return this.studio.deleteSelected()}}class fa{constructor(t){this.studio=t}studio;isPlaying=!1;currentTime=0;maxDuration=0;playStartTime=0;playStartTimestamp=0;rafId=null;playbackElements=new Map;setMaxDuration(t){this.maxDuration=t}async play(){if(!(this.isPlaying||this.studio.destroyed)){if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){console.warn("Cannot play: invalid duration",this.maxDuration);return}this.isPlaying||(this.isPlaying=!0),this.playStartTime=this.currentTime,this.playStartTimestamp=performance.now(),this.renderLoop(),this.studio.emit("play",{isPlaying:!0})}}pause(){this.isPlaying=!1,this.rafId!=null&&(cancelAnimationFrame(this.rafId),this.rafId=null);for(const[t,{element:e}]of this.playbackElements.entries())this.isPlaybackCapable(t)&&t.pause(e);this.studio.emit("pause",{isPlaying:!1})}async stop(){this.pause(),await this.seek(0)}async seek(t){if(this.studio.destroyed)return;const e=this.isPlaying;this.playStartTime=Math.max(0,Math.min(t,this.maxDuration)),this.playStartTimestamp=performance.now(),this.currentTime=this.playStartTime;for(const[i,{element:s}]of this.playbackElements.entries()){if(!(this.currentTime>=i.display.from&&(i.display.to===0||this.currentTime<=i.display.to))){this.isPlaybackCapable(i)&&i.pause(s);continue}const o=(this.currentTime-i.display.from)/1e6;if(this.isPlaybackCapable(i)){const a=this.currentTime,n=s;n.__pendingRender=()=>{this.currentTime===a&&this.studio.updateFrame(a)},await i.seek(s,o)}}await this.studio.updateFrame(this.currentTime),this.studio.emit("currentTime",{currentTime:this.currentTime}),e&&(this.isPlaying=!0)}async frameNext(){const e=1e6/(this.studio.opts.fps||30),i=Math.min(this.currentTime+e,this.maxDuration);await this.seek(i)}async framePrev(){const e=1e6/(this.studio.opts.fps||30),i=Math.max(0,this.currentTime-e);await this.seek(i)}async renderLoop(){if(!this.isPlaying||this.studio.destroyed||this.studio.pixiApp==null)return;if(this.maxDuration<=0||this.maxDuration===1/0||isNaN(this.maxDuration)){this.pause();return}const t=async()=>{if(!this.isPlaying||this.studio.destroyed||this.studio.pixiApp==null)return;if(this.currentTime>=this.maxDuration){this.currentTime=this.maxDuration,this.pause();return}const i=(performance.now()-this.playStartTimestamp)*1e3;this.currentTime=Math.min(this.playStartTime+i,this.maxDuration),this.studio.emit("currentTime",{currentTime:this.currentTime});try{await this.studio.updateFrame(this.currentTime)}catch(s){console.warn("Error updating frame:",s)}this.isPlaying&&(this.rafId=requestAnimationFrame(t))};t()}isPlaybackCapable(t){return"play"in t&&"pause"in t&&"seek"in t}}class ua{constructor(t){this.studio=t}studio;tracks=[];clips=[];getTrackById(t){return this.tracks.find(e=>e.id===t)}getClipById(t){return this.clips.find(e=>e.id===t)}findTrackIdByClipId(t){for(const e of this.tracks)if(e.clipIds.includes(t))return e.id}getTrackIndex(t){return this.tracks.findIndex(e=>e.id===t)}addTrack(t,e){const i={id:t.id||`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,name:t.name,type:t.type,clipIds:[]};return typeof e=="number"?this.tracks.splice(e,0,i):this.tracks.unshift(i),this.studio.emit("track:added",{track:i,index:e??0}),this.studio.emit("track:order-changed",{tracks:this.tracks}),i}async removeTrack(t){const e=this.tracks.findIndex(r=>r.id===t);if(e===-1)return;const s=[...this.tracks[e].clipIds];for(const r of s)await this.removeClipById(r);this.tracks.splice(e,1),this.studio.emit("track:removed",{trackId:t}),this.studio.emit("track:order-changed",{tracks:this.tracks})}async moveTrack(t,e){const i=this.tracks.findIndex(r=>r.id===t);if(i===-1)return;const s=this.tracks[i];this.tracks.splice(i,1),this.tracks.splice(e,0,s),this.studio.emit("track:order-changed",{tracks:this.tracks}),await this.studio.updateFrame(this.studio.currentTime)}async setTrackOrder(t){const e=[],i=new Map(this.tracks.map(s=>[s.id,s]));for(const s of t){const r=i.get(s);r&&e.push(r)}e.length!==this.tracks.length&&console.warn("[Studio] setTrackOrder: invalid track IDs provided, order not updated fully"),this.tracks=e,this.studio.emit("track:order-changed",{tracks:this.tracks}),await this.studio.updateFrame(this.studio.currentTime)}async addTransition(t,e=2e6,i,s,r){if(this.studio.destroyed)return;let o=null,a=null;if(i&&s&&(o=this.getClipById(i)??null,a=this.getClipById(s)??null),!o||!a){console.warn("[Studio] Invalid fromClipId or toClipId",{fromClipId:i,toClipId:s});return}await Promise.all([o.ready,a.ready]);const n=e,c=a.display.from-n/2,h=c+n,d={key:t,name:t,duration:n,fromClipId:o.id,toClipId:a.id,start:Math.max(0,c),end:h},u=this.findTrackIdByClipId(a.id);if(u){const g=this.tracks.find(v=>v.id===u);if(g){const v=g.clipIds.map(x=>this.getClipById(x)).filter(x=>{if(!x||x.type!=="Transition")return!1;const w=x;return w.fromClipId===o.id&&w.toClipId===a.id});for(const x of v)await this.removeClip(x)}}const f=`${o.id}_${a.id}`;this.studio.transitionRenderers.has(f)&&(this.studio.transitionRenderers.get(f)?.destroy(),this.studio.transitionRenderers.delete(f)),o.transition={...d},a.transition={...d};const p=new tt(t);r&&(p.id=r),p.duration=n,p.fromClipId=Math.max(0,c)===0?null:o.id,p.toClipId=a.id,p.fromClipId===null&&o&&(p.fromClipId=o.id),p.display.from=Math.max(0,c),p.display.to=h,await this.addClip(p,{trackId:u}),this.studio.seek(this.studio.currentTime)}async addClip(t,e){const i=Array.isArray(t)?t:[t];if(i.length===0)return;const{trackId:s,audioSource:r}=this.normalizeAddClipOptions(e);if(this.studio.destroyed)return;if(this.studio.pixiApp==null)throw new Error("Failed to initialize Pixi.js Application");const o=i.filter(n=>!this.getClipById(n.id)),a=[];for(const n of o)await this.prepareClipForTimeline(n,s),a.push(n);await this.recalculateMaxDuration();for(const n of a)await this.setupClipVisuals(n,r);await this.studio.updateFrame(this.studio.currentTime),this.emitAddClipEvents(a,s)}normalizeAddClipOptions(t){let e,i;if(t&&(typeof t=="string"||t instanceof File||t instanceof Blob))e=t;else if(typeof t=="object"&&t!==null&&!("size"in t)){const s=t;e=s.audioSource,i=s.trackId}return{trackId:i,audioSource:e}}async prepareClipForTimeline(t,e){t.id||(t.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`),this.getClipById(t.id)||this.clips.push(t),this.addClipToTrack(t,e);const i=async()=>{await this.studio.updateFrame(this.studio.currentTime);const s=this.studio.selection;s.activeTransformer!=null&&s.selectedClips.has(t)&&typeof s.activeTransformer.updateBounds=="function"&&s.activeTransformer.updateBounds(),s.refreshClipHitArea(t)};t.on("propsChange",i),this.studio.clipListeners.set(t,i),this.studio.pixiApp!=null&&typeof t.setRenderer=="function"&&t.setRenderer(this.studio.pixiApp.renderer),await t.ready}addClipToTrack(t,e){if(e){const i=this.tracks.find(s=>s.id===e);if(i)i.clipIds.includes(t.id)||i.clipIds.push(t.id);else{const s={id:e,name:`Track ${this.tracks.length+1}`,type:t.type,clipIds:[t.id]};this.tracks.unshift(s),this.studio.emit("track:added",{track:s,index:0}),this.studio.emit("track:order-changed",{tracks:this.tracks})}}else{const s={id:`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,name:`Track ${this.tracks.length+1}`,type:t.type,clipIds:[t.id]};this.tracks.unshift(s),this.studio.emit("track:added",{track:s,index:0}),this.studio.emit("track:order-changed",{tracks:this.tracks})}}async setupClipVisuals(t,e){const i=this.studio.spriteRenderers.get(t);if(i){const s=this.studio.clipsNormalContainer,r=i.getRoot();r&&!r.parent&&s.addChild(r)}else{const s=await t.ready;if(s.width>0&&s.height>0){const r=this.studio.clipsNormalContainer,o=t.type==="Video"&&this.isPlaybackCapable(t);if(!o||o&&t.tickInterceptor!=null){const a=new pe(this.studio.pixiApp,t,r);this.studio.spriteRenderers.set(t,a)}}}await this.setupPlaybackForClip(t,e),this.studio.opts.interactivity&&this.studio.selection.setupSpriteInteractivity(t)}emitAddClipEvents(t,e){if(t.length!==0)if(t.length===1){const i=t[0],s=e||this.tracks.find(r=>r.clipIds.includes(i.id))?.id||"";this.studio.emit("clip:added",{clip:i,trackId:s})}else this.studio.emit("clips:added",{clips:t,trackId:e})}async removeClip(t,e={permanent:!0}){const{permanent:i}=e;if(t.locked)return;const s=this.clips.findIndex(h=>h===t);if(s===-1)return;if(t instanceof tt){if(t.fromClipId){const h=this.getClipById(t.fromClipId);h&&"transition"in h&&delete h.transition}if(t.toClipId){const h=this.getClipById(t.toClipId);h&&"transition"in h&&delete h.transition}}this.studio.selection.selectedClips.has(t)&&this.studio.selection.deselectClip(),this.clips.splice(s,1);const r=[];for(const h of this.tracks){const d=h.clipIds.indexOf(t.id);d!==-1&&(h.clipIds.splice(d,1),r.push(h.id))}this.reconcileTracks(),this.studio.selection.interactiveClips.delete(t);const o=this.studio.clipListeners.get(t);o&&(t.off("propsChange",o),this.studio.clipListeners.delete(t));const a=this.studio.spriteRenderers.get(t);if(a!=null)if(i)a.destroy(),this.studio.spriteRenderers.delete(t);else{const h=a.getRoot();h&&h.parent&&h.parent.removeChild(h)}const n=this.studio.transport.playbackElements.get(t);n!=null&&(this.isPlaybackCapable(t)&&t.pause(n.element),this.studio.transport.playbackElements.delete(t),i&&this.isPlaybackCapable(t)&&t.cleanupPlayback(n.element,n.objectUrl));const c=this.studio.videoSprites.get(t);c!=null&&this.studio.pixiApp!=null&&(c.parent&&c.parent.removeChild(c),i&&(c.destroy(),this.studio.videoSprites.delete(t))),await this.recalculateMaxDuration(),this.studio.emit("clip:removed",{clipId:t.id})}async removeClips(t,e={permanent:!0}){if(t.length!==0){for(const i of t){if(i.locked)continue;const s=this.clips.findIndex(c=>c===i);if(s===-1)continue;if(i instanceof tt){if(i.fromClipId){const c=this.getClipById(i.fromClipId);c&&"transition"in c&&delete c.transition}if(i.toClipId){const c=this.getClipById(i.toClipId);c&&"transition"in c&&delete c.transition}}this.studio.selection.selectedClips.has(i)&&this.studio.selection.deselectClip(),this.clips.splice(s,1);for(const c of this.tracks){const h=c.clipIds.indexOf(i.id);h!==-1&&c.clipIds.splice(h,1)}this.studio.selection.interactiveClips.delete(i);const r=this.studio.clipListeners.get(i);r&&(i.off("propsChange",r),this.studio.clipListeners.delete(i));const o=this.studio.spriteRenderers.get(i);if(o!=null)if(e.permanent)o.destroy(),this.studio.spriteRenderers.delete(i);else{const c=o.getRoot();c&&c.parent&&c.parent.removeChild(c)}const a=this.studio.transport.playbackElements.get(i);a!=null&&(this.isPlaybackCapable(i)&&i.pause(a.element),this.studio.transport.playbackElements.delete(i),e.permanent&&this.isPlaybackCapable(i)&&i.cleanupPlayback(a.element,a.objectUrl));const n=this.studio.videoSprites.get(i);n!=null&&this.studio.pixiApp!=null&&(n.parent&&n.parent.removeChild(n),e.permanent&&(n.destroy(),this.studio.videoSprites.delete(i)))}for(let i=this.tracks.length-1;i>=0;i--)if(this.tracks[i].clipIds.length===0){const s=this.tracks[i].id;this.tracks.splice(i,1),this.studio.emit("track:removed",{trackId:s})}await this.recalculateMaxDuration(),this.studio.emit("clips:removed",{clipIds:t.map(i=>i.id)})}}async removeClipById(t){const e=this.clips.find(i=>i.id===t);e&&await this.removeClip(e)}async updateClip(t,e){const i=this.clips.find(s=>s.id===t);i&&(i.locked&&!("locked"in e)||(i.locked&&"locked"in e&&(Object.keys(e).length===1||(e={locked:e.locked})),await this.applyClipUpdate(i,e),await this.recalculateMaxDuration(),await this.studio.updateFrame(this.studio.currentTime),this.updateTransformer(i),this.studio.emit("clip:updated",{clip:i})))}async updateClips(t){const e=[];for(const{id:i,updates:s}of t){const r=this.clips.find(o=>o.id===i);r&&(await this.applyClipUpdate(r,s),e.push(r))}if(e.length!==0){await this.recalculateMaxDuration(),await this.studio.updateFrame(this.studio.currentTime);for(const i of e)this.updateTransformer(i),this.studio.emit("clip:updated",{clip:i})}}async replaceClipsBySource(t,e){const i=this.clips.filter(s=>s.src===t);if(i.length!==0){this.studio.suspendRendering();for(const s of i){if(!this.clips.includes(s))continue;const r=this.findTrackIdByClipId(s.id);if(!r)continue;const o=this.getTrackById(r);if(!o)continue;const a=await e(s),n=async()=>{await this.studio.updateFrame(this.studio.currentTime),this.updateTransformer(a)};a.on("propsChange",n),this.studio.clipListeners.set(a,n),this.studio.pixiApp!=null&&typeof a.setRenderer=="function"&&a.setRenderer(this.studio.pixiApp.renderer),await a.ready;const c=this.clips.indexOf(s);c!==-1&&(this.clips[c]=a);const h=o.clipIds.indexOf(s.id);h!==-1&&(o.clipIds[h]=a.id),await this.setupClipVisuals(a);const d=this.studio.spriteRenderers.get(s);d&&(d.destroy(),this.studio.spriteRenderers.delete(s));const u=this.studio.videoSprites.get(s);u&&(u.parent&&u.parent.removeChild(u),u.destroy(),this.studio.videoSprites.delete(s));const f=this.studio.clipListeners.get(s);f&&(s.off("propsChange",f),this.studio.clipListeners.delete(s)),this.studio.selection.selectedClips.has(s)&&(this.studio.selection.selectedClips.delete(s),this.studio.selection.selectedClips.add(a)),this.studio.emit("clip:replaced",{oldClip:s,newClip:a,trackId:r})}await this.recalculateMaxDuration(),this.studio.resumeRendering(),await this.studio.updateFrame(this.studio.currentTime)}}async applyClipUpdate(t,e){if(t.type==="Text"||t.type==="Caption"){const i=t;typeof i.updateStyle=="function"&&await i.updateStyle(e),"style"in e&&delete e.style}if(Object.assign(t,e),e.display&&!e.duration?t.duration=e.display.to-e.display.from:e.duration&&(!e.display||!e.display.to)&&(t.display||(t.display={from:0,to:e.duration}),t.display.to=t.display.from+e.duration),e.display&&e.duration){const i=e.display.to-e.display.from;i!==e.duration&&(t.duration=i)}else t.display&&(t.display.to=t.display.from+t.duration)}updateTransformer(t){const e=this.studio.selection;e.selectedClips.has(t)&&e.activeTransformer&&e.activeTransformer.updateBounds()}exportToJSON(){this.reconcileTracks();const t={};for(const s of this.clips)t[s.id]=Gt(s,!1);const e=this.tracks.map(s=>({id:s.id,name:s.name,type:s.type,clipIds:[...s.clipIds]})),i=[];return this.clips.forEach(s=>{if(s.transition){const r=this.tracks.find(o=>o.clipIds.includes(s.id));if(r){const o=r.clipIds.indexOf(s.id);if(o>0){const a=r.clipIds[o-1];i.push({key:s.transition.name,duration:s.transition.duration,clips:[a,s.id]})}}}}),{tracks:e,clips:t,settings:{width:this.studio.opts.width,height:this.studio.opts.height,fps:this.studio.opts.fps,backgroundColor:this.studio.opts.backgroundColor}}}async loadFromJSON(t){if(await this.clear(),t.settings){const s=t.settings.width&&t.settings.width!==this.studio.opts.width||t.settings.height&&t.settings.height!==this.studio.opts.height;if(t.settings.width&&(this.studio.opts.width=t.settings.width),t.settings.height&&(this.studio.opts.height=t.settings.height),t.settings.fps&&(this.studio.opts.fps=t.settings.fps),t.settings.backgroundColor&&(this.studio.opts.backgroundColor=t.settings.backgroundColor),s&&this.studio.pixiApp!=null){const r=this.studio.opts.width,o=this.studio.opts.height;this.studio.pixiApp.renderer.resize(r,o),this.studio.opts.canvas&&(this.studio.opts.canvas.width=r,this.studio.opts.canvas.height=o)}}const e=[],i=Object.values(t.clips??{});if(i.length>0){await this.ensureFontsForClips(i);const s=i.map(a=>a.src).filter(a=>a&&a.trim()!=="");this.studio.resourceManager.preload(s);const r=new Map;if(t.tracks){for(const a of t.tracks)if(a.clipIds)for(const n of a.clipIds)r.set(n,a.id)}if(t.tracks)for(const a of t.tracks)this.tracks.push({id:a.id,name:a.name,type:a.type,clipIds:[]});for(const a of i)e.push((async()=>{try{let n=a.id?r.get(a.id):void 0;if(a.type==="Transition"){const h=a,d=h.toClipId||h.fromClipId;d&&(n=r.get(d))}if(a.type!=="Text"&&a.type!=="Caption"&&a.type!=="Effect"&&a.type!=="Transition"&&(!a.src||a.src.trim()===""))return console.warn(`Skipping clip ${a.type} with empty source`,a),{clip:null};const c=await bt(a);return(c.type==="Video"||c.type==="Image")&&(!a.transform?.width||!a.transform?.height)&&this.studio.opts.width&&this.studio.opts.height&&(typeof c.scaleToFit=="function"&&await c.scaleToFit(this.studio.opts.width,this.studio.opts.height),typeof c.centerInScene=="function"&&c.centerInScene(this.studio.opts.width,this.studio.opts.height)),{clip:c,intendedTrackId:n}}catch(n){return console.error(`Failed to load clip ${a.id||"unknown"}:`,n),{clip:null}}})());const o=await Promise.all(e);for(const{clip:a,intendedTrackId:n}of o)a&&(a.id||(a.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`),this.clips.push(a),this.addClipToTrack(a,n))}this.studio.pixiApp&&this.clips.forEach(s=>{const r=async()=>{await this.studio.updateFrame(this.studio.currentTime);const o=this.studio.selection;o.activeTransformer!=null&&o.selectedClips.has(s)&&typeof o.activeTransformer.updateBounds=="function"&&o.activeTransformer.updateBounds()};s.on("propsChange",r),this.studio.clipListeners.set(s,r),typeof s.setRenderer=="function"&&s.setRenderer(this.studio.pixiApp.renderer),(async()=>{try{await s.ready,await this.setupClipVisuals(s),await this.studio.updateFrame(this.studio.currentTime)}catch(o){console.warn(`[Studio] Failed to setup visuals for clip ${s.id}:`,o)}})()});for(const s of this.clips){const r=s.effects;if(Array.isArray(r))for(const o of r)this.studio.globalEffects.has(o.id)||this.studio.globalEffects.set(o.id,{id:o.id,key:o.key,startTime:o.startTime,duration:o.duration})}for(const s of this.clips)if(s instanceof tt){const r={name:s.transitionKey,key:s.transitionKey,duration:s.duration,fromClipId:s.fromClipId,toClipId:s.toClipId,start:s.display.from,end:s.display.to};if(s.fromClipId){const o=this.getClipById(s.fromClipId);o&&(o.transition={...r})}if(s.toClipId){const o=this.getClipById(s.toClipId);o&&(o.transition={...r})}}await this.recalculateMaxDuration();try{await this.studio.updateFrame(this.studio.currentTime)}catch(s){console.error("[Studio] Failed to update initial frame:",s)}this.studio.emit("studio:restored",{clips:this.clips,tracks:this.tracks,settings:this.studio.opts})}async deleteSelected(){const t=this.studio.selection.selectedClips,e=Array.from(t);if(e.length!==0)for(const i of e)await this.removeClip(i)}async duplicateSelected(){const t=this.studio.selection.selectedClips,e=Array.from(t).filter(s=>!s.locked);if(e.length===0)return;const i=[];for(const s of e){const r=this.findTrackIdByClipId(s.id);if(!r)continue;const o=this.tracks.find(d=>d.id===r);if(!o)continue;const a=Gt(s,!1),n=await bt(a);n.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const c=`track_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,h=`${o.name} (Copy)`;this.addTrack({id:c,name:h,type:o.type}),await this.addClip(n,{trackId:c}),i.push(n.id)}i.length>0&&this.studio.selection.selectClipsByIds(i)}async splitSelected(t){if(this.studio.opts.core){this.studio.opts.core.clip.split(t);return}const e=Array.from(this.studio.selection.selectedClips);if(e.length!==1){console.warn("[Studio] Split requires exactly one selected clip");return}const i=e[0];if(i.locked){console.warn("[Studio] Cannot split a locked clip");return}const s=t??this.studio.currentTime;if(s<=i.display.from||i.display.to>0&&s>=i.display.to){console.warn("[Studio] Split time is outside clip bounds");return}const r=Gt(i,!1),o=s-i.display.from,a=i.playbackRate||1,n=o*a,c={duration:o,display:{from:i.display.from,to:s}};i.trim&&(c.trim={from:i.trim.from,to:i.trim.from+n}),await this.updateClip(i.id,c);const h={...r};h.timing||(h.timing={});const d=r.timing?.display?.to??0,u=r.timing?.display?.from??0,f=r.timing?.duration??i.duration,p=d>0?d:u+f;h.timing.display={from:s,to:p},h.timing.duration=f-o,h.timing.trim&&(h.timing.trim={from:h.timing.trim.from+n,to:h.timing.trim.to});const g=await bt(h);g.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const v=this.findTrackIdByClipId(i.id);v&&(await this.addClip(g,{trackId:v}),this.studio.selection.selectClipsByIds([g.id]))}async trimSelected(t){const e=Array.from(this.studio.selection.selectedClips);if(e.length!==1){console.warn("[Studio] Trim requires exactly one selected clip");return}const i=e[0];if(i.locked){console.warn("[Studio] Cannot trim a locked clip");return}const s=t*1e6,r=i.playbackRate||1,o=s*r;if(s>=i.duration){console.warn("[Studio] Trim amount exceeds clip duration");return}const a=i.duration-s,n=i.display.from+s,c=i.display.to,h={duration:a,display:{from:n,to:c}};if(i.trim)h.trim={from:i.trim.from+o,to:i.trim.to};else{const d=i.sourceDuration||i.duration;h.trim={from:o,to:d}}await this.updateClip(i.id,h)}async updateSelected(t){const e=Array.from(this.studio.selection.selectedClips);if(e.length!==0)for(const i of e)await this.updateClip(i.id,t)}async setTracks(t){const e=JSON.parse(JSON.stringify(this.tracks));this.tracks=JSON.parse(JSON.stringify(t)),this.reconcileTracks(),this.tracks.length===0&&this.clips.length>0&&(this.tracks=e,this.reconcileTracks()),await this.recalculateMaxDuration(),this.studio.isRestoring||this.studio.emit("track:order-changed",{tracks:this.tracks}),await this.studio.updateFrame(this.studio.currentTime)}reconcileTracks(){const t=new Set(this.clips.map(e=>e.id));for(let e=this.tracks.length-1;e>=0;e--){const i=this.tracks[e],s=i.clipIds.filter(r=>t.has(r));s.length!==i.clipIds.length&&(i.clipIds=s),i.clipIds.length===0&&(this.tracks.splice(e,1),this.studio.isRestoring||this.studio.emit("track:removed",{trackId:i.id}))}this.tracks.length===0&&!this.studio.isRestoring&&this.studio.emit("track:order-changed",{tracks:this.tracks})}async ensureFontsForClips(t){const e=new Map;for(const i of t){if(i.type==="Text"){const s=i.style?.fontUrl||i.fontUrl;s&&e.set(s,{name:i.style?.fontFamily||i.fontFamily||"CustomFont",url:s})}if(i.type==="Caption"){const s=i.style?.fontUrl||i.fontUrl;s&&e.set(s,{name:i.style?.fontFamily||i.fontFamily||"CustomFont",url:s})}}if(e.size>0)try{await Zt.loadFonts(Array.from(e.values()))}catch(i){console.warn("Failed to load some fonts:",i)}}async recalculateMaxDuration(){let t=0;for(const e of this.clips){e.display.to===0&&e.duration!==1/0&&!isNaN(e.duration)&&e.duration>0;const i=e.duration>0?e.duration:0;if(i===1/0)continue;const s=e.display.to>0?e.display.to:e.display.from+i;s>t&&(t=s)}this.studio.maxDuration=t}async setupPlaybackForClip(t,e){if(this.studio.pixiApp!=null&&this.isPlaybackCapable(t))try{const i=t;if(t.type==="Audio"&&e&&typeof e!="string"){const o=URL.createObjectURL(e);t.src=o}const{element:s,objectUrl:r}=await i.createPlaybackElement();if(t.type==="Video"){const o=m.Texture.from(s),a=new m.Sprite(o);a.visible=!1,this.studio.clipsNormalContainer&&this.studio.clipsNormalContainer.addChild(a),this.studio.videoSprites.set(t,a)}this.studio.transport.playbackElements.set(t,{element:s,objectUrl:r})}catch(i){console.warn(`Failed to setup playback for ${t.constructor.name}`,i)}}isPlaybackCapable(t){return"createPlaybackElement"in t&&"play"in t&&"pause"in t&&"seek"in t&&"syncPlayback"in t&&"cleanupPlayback"in t}async clear(){this.studio.selection.deselectClip(),this.studio.selection.interactiveClips.clear();for(const[t,e]of this.studio.clipListeners)t.off("propsChange",e);this.studio.clipListeners.clear(),this.studio.globalEffects.clear(),this.studio.effectFilters.clear(),this.studio.transitionRenderers.forEach(t=>t.destroy()),this.studio.transitionRenderers.clear(),this.studio.transitionSprites.forEach(t=>{t.parent&&t.parent.removeChild(t),t.destroy()}),this.studio.transitionSprites.clear(),this.studio.spriteRenderers.forEach(t=>t.destroy()),this.studio.spriteRenderers.clear();for(const[t,e]of this.studio.transport.playbackElements)this.isPlaybackCapable(t)&&t.cleanupPlayback(e.element,e.objectUrl);this.studio.transport.playbackElements.clear();for(const t of this.studio.videoSprites.values())t.destroy();this.studio.videoSprites.clear(),this.tracks=[],this.clips=[],this.studio.maxDuration=0,this.studio.currentTime=0,this.studio.emit("reset")}async rippleDelete(t,e){if(t>=e)return;const i=e-t,s=[...this.clips];for(const r of s){const o=r.display.from,a=r.display.to;if(!(a<=t)){if(o>=e){await this.updateClip(r.id,{display:{from:r.display.from-i,to:r.display.to-i}});continue}if(o>=t&&a<=e){await this.removeClip(r);continue}if(o<t&&a>e){const n=await r.clone();n.id=`clip_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;const c=t,h=t+(a-e),d=r.trim.from+(e-o)*r.playbackRate,u=r.trim.to,f=this.tracks.find(p=>p.clipIds.includes(r.id));f&&(await this.addClip(n,{trackId:f.id}),await this.updateClip(n.id,{display:{from:c,to:h},trim:{from:d,to:u}})),await this.updateClip(r.id,{display:{from:r.display.from,to:t},trim:{from:r.trim.from,to:r.trim.from+(t-o)*r.playbackRate}});continue}if(o<t&&a<=e){await this.updateClip(r.id,{display:{from:r.display.from,to:t},trim:{from:r.trim.from,to:r.trim.from+(t-o)*r.playbackRate}});continue}if(o>=t&&a>e){await this.updateClip(r.id,{display:{from:t,to:t+(a-e)},trim:{from:r.trim.from+(e-o)*r.playbackRate,to:r.trim.to}});continue}}}await this.recalculateMaxDuration(),await this.studio.updateFrame(this.studio.currentTime)}}class pa{past=[];future=[];lastState=null;maxSize;constructor(t={}){this.maxSize=t.maxSize||50}projectToHistoryState(t){const e={},i=JSON.parse(JSON.stringify(t.tracks||[]));for(const[s,r]of Object.entries(t.clips??{}))e[s]=JSON.parse(JSON.stringify(r));return{clips:e,tracks:i,settings:JSON.parse(JSON.stringify(t.settings||{}))}}init(t){this.lastState=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),this.past=[],this.future=[]}push(t){if(!this.lastState){this.init(t);return}const e=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),i=wi(this.lastState,e);i.length!==0&&(this.past.push(i),this.past.length>this.maxSize&&this.past.shift(),this.future=[],this.lastState=e)}undo(t){const e=this.past.pop();if(!e)return null;const i=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),s=this.applyPatches(i,e,!0);return this.future.push(e),this.lastState=s,{patches:e,state:s}}redo(t){const e=this.future.pop();if(!e)return null;const i=this.projectToHistoryState(JSON.parse(JSON.stringify(t))),s=this.applyPatches(i,e,!1);return this.past.push(e),this.lastState=s,{patches:e,state:s}}applyPatches(t,e,i){const s=JSON.parse(JSON.stringify(t)),r=i?[...e].reverse():e;for(const o of r){const{type:a,path:n}=o,c=o.value,h=o.oldValue;let d=s,u=!1;for(let p=0;p<n.length-1;p++){if(d[n[p]]===void 0||d[n[p]]===null){u=!0;break}d=d[n[p]]}if(u)continue;const f=n[n.length-1];if(i)switch(a){case"CREATE":Array.isArray(d)?d.splice(f,1):delete d[f];break;case"REMOVE":d[f]=h&&typeof h=="object"?JSON.parse(JSON.stringify(h)):h;break;case"CHANGE":d[f]=h&&typeof h=="object"?JSON.parse(JSON.stringify(h)):h;break}else switch(a){case"CREATE":d[f]=c&&typeof c=="object"?JSON.parse(JSON.stringify(c)):c;break;case"REMOVE":Array.isArray(d)?d.splice(f,1):delete d[f];break;case"CHANGE":d[f]=c&&typeof c=="object"?JSON.parse(JSON.stringify(c)):c;break}}return s}canUndo(){return this.past.length>0}canRedo(){return this.future.length>0}}class vi extends se{selection;transport;timeline;history;resourceManager;pixiApp=null;get tracks(){return this.timeline.tracks}get clips(){return this.timeline.clips}spriteRenderers=new Map;artboard=null;clipContainer=null;artboardMask=null;artboardBg=null;get activeTransformer(){return this.selection.activeTransformer}set activeTransformer(t){this.selection.activeTransformer=t}get selectedClips(){return this.selection.selectedClips}set selectedClips(t){this.selection.selectedClips=t}get interactiveClips(){return this.selection.interactiveClips}set interactiveClips(t){this.selection.interactiveClips=t}get playbackElements(){return this.transport.playbackElements}videoSprites=new Map;clipListeners=new Map;get isPlaying(){return this.transport.isPlaying}set isPlaying(t){this.transport.isPlaying=t}get currentTime(){return this.transport.currentTime}set currentTime(t){this.transport.currentTime=t}get maxDuration(){return this.transport.maxDuration}set maxDuration(t){this.transport.maxDuration=t}opts;destroyed=!1;renderingSuspended=!1;frameToken=0;historyPaused=!1;processingHistory=!1;isRestoring=!1;historyGroupDepth=0;clipCache=new Map;_isUpdatingLayout=!1;bridge=null;_zoomLevel=1;_panOffset={x:0,y:0};_baseScale=1;_allowZoom=!1;_allowPan=!1;_isPanning=!1;_isSpaceDown=!1;_lastPointerPos={x:0,y:0};_boundOnWheel=null;_boundOnPointerDown=null;_boundOnPointerMove=null;_boundOnPointerUp=null;_boundOnKeyDown=null;_boundOnKeyUp=null;globalEffects=new Map;activeGlobalEffects=[];currentGlobalEffectSprite=null;effectFilters=new Map;transitionRenderers=new Map;transitionSprites=new Map;transFromTexture=null;transToTexture=null;transBgGraphics=null;clipsNormalContainer=null;clipsEffectContainer=null;videoTextureCache=new WeakMap;lastFromFrame=null;lastToFrame=null;hexToNumber(t){const e=t.startsWith("#")?t.slice(1):t;return parseInt(e,16)}ready;constructor(t){super(),this.opts={fps:30,backgroundColor:"#000000",artboardColor:"#000000",interactivity:!0,spacing:0,allowZoom:!1,allowPan:!1,previewScale:1,...t},this._allowZoom=!!this.opts.allowZoom,this._allowPan=!!this.opts.allowPan,this.selection=new da(this),this.transport=new fa(this),this.timeline=new ua(this),this.history=new pa,this.resourceManager=new wt,this.ready=this.initPixiApp().then(()=>{this.history.init(this.exportToJSON()),this._initViewportEvents()}),this.on("clip:added",e=>this.handleTimelineChange(e)),this.on("clips:added",e=>this.handleTimelineChange(e)),this.on("clip:replaced",e=>this.handleTimelineChange({clip:e.newClip})),this.on("studio:restored",e=>{e.clips.forEach(i=>this.attachClipEvents(i)),this.handleTimelineChange()}),this.on("clip:removed",this.handleClipRemoved),this.on("clips:removed",this.handleClipsRemoved),this.on("clip:updated",this.handleTimelineChange),this.on("track:removed",()=>this.handleTimelineChange()),this.on("track:added",()=>this.handleTimelineChange()),this.opts.core&&(this.bridge=new ca(this.opts.core,this))}attachClipEvents(t){if(this.clipListeners.has(t))return;const e=()=>{this.updateFrame(this.currentTime)};t.on("request-render",e),this.clipListeners.set(t,e)}handleTimelineChange=t=>{t?.clip&&this.attachClipEvents(t.clip),t?.clips&&t.clips.forEach(e=>this.attachClipEvents(e)),this.updateFrame(this.currentTime),this.saveHistory()};saveHistory(){this.historyPaused||this.processingHistory||(this.history.push(this.exportToJSON()),this.emit("history:changed",{canUndo:this.history.canUndo(),canRedo:this.history.canRedo()}))}beginHistoryGroup(){this.processingHistory||this.isRestoring||(this.historyGroupDepth++,this.historyPaused=!0)}endHistoryGroup(){this.processingHistory||this.isRestoring||(this.historyGroupDepth=Math.max(0,this.historyGroupDepth-1),this.historyGroupDepth===0&&(this.historyPaused=!1,this.saveHistory()))}setPath(t,e,i){let s=t;for(let r=0;r<e.length-1;r++){const o=e[r];s[o]||(s[o]=typeof e[r+1]=="number"?[]:{}),s=s[o]}s[e[e.length-1]]=i}async applyHistoryPatches(t,e,i){const s=new Map,r=new Map,o=new Set;for(const a of t){const{type:n,path:c}=a,h=a.value,d=a.oldValue;if(c[0]==="clips"){const u=c[1];i?n==="CREATE"?o.add(u):n==="REMOVE"?r.set(u,d):n==="CHANGE"&&(s.has(u)||s.set(u,{}),this.setPath(s.get(u),c.slice(2),d)):n==="CREATE"?r.set(u,h):n==="REMOVE"?o.add(u):n==="CHANGE"&&(s.has(u)||s.set(u,{}),this.setPath(s.get(u),c.slice(2),h))}else c[0]==="settings"&&(i?this.setPath(this.opts,c.slice(1),d):this.setPath(this.opts,c.slice(1),h))}for(const a of o){const n=this.timeline.getClipById(a);n&&await this.removeClip(n)}for(const[a,n]of r){let c=this.clipCache.get(a);c||(c=await bt(n),this.clipCache.set(a,c),this.attachClipEvents(c));let h;for(const d of e.tracks)if(d.clipIds.includes(a)){h=d.id;break}await this.addClip(c,{trackId:h})}for(const[a,n]of s)await this.updateClip(a,n);this.timeline.setTracks(e.tracks),this.emit("studio:restored",{clips:this.clips,tracks:this.tracks,settings:this.opts})}async undo(){if(!(!this.history.canUndo()||this.processingHistory)){this.processingHistory=!0,this.isRestoring=!0,this.historyPaused=!0;try{const t=this.history.undo(this.exportToJSON());t&&await this.applyHistoryPatches(t.patches,t.state,!0),this.emit("history:changed",{canUndo:this.history.canUndo(),canRedo:this.history.canRedo()})}finally{this.historyPaused=!1,this.isRestoring=!1,this.processingHistory=!1}}}async redo(){if(!(!this.history.canRedo()||this.processingHistory)){this.processingHistory=!0,this.isRestoring=!0,this.historyPaused=!0;try{const t=this.history.redo(this.exportToJSON());t&&await this.applyHistoryPatches(t.patches,t.state,!1),this.emit("history:changed",{canUndo:this.history.canUndo(),canRedo:this.history.canRedo()})}finally{this.historyPaused=!1,this.isRestoring=!1,this.processingHistory=!1}}}cleanupClipVisuals=t=>{for(const[r,o]of this.spriteRenderers)if(r.id===t){const a=o.getRoot();a&&a.parent&&a.parent.removeChild(a),o.destroy(),this.spriteRenderers.delete(r);break}const e=this.transitionSprites.get(t);e&&(e.parent&&e.parent.removeChild(e),e.destroy(),this.transitionSprites.delete(t)),this.transitionRenderers.get(t)&&this.transitionRenderers.delete(t);for(const[r,o]of this.videoSprites)if(r.id===t){o.parent&&o.parent.removeChild(o),o.destroy(),this.videoSprites.delete(r);break}const s=this.timeline.getClipById(t);if(s){const r=this.clipListeners.get(s);r&&(s.off("request-render",r),this.clipListeners.delete(s))}};handleClipRemoved=({clipId:t})=>{this.cleanupClipVisuals(t),this.updateFrame(this.currentTime),this.saveHistory()};handleClipsRemoved=({clipIds:t})=>{for(const e of t)this.cleanupClipVisuals(e);this.updateFrame(this.currentTime),this.saveHistory()};async initPixiApp(){if(this.destroyed)return;const t=this.opts.canvas||document.createElement("canvas");t.width=this.opts.width,t.height=this.opts.height;const e=new m.Application,i=t.parentElement||window;await e.init({canvas:t,resizeTo:i,backgroundColor:this.hexToNumber(this.opts.backgroundColor),antialias:!0,resolution:(window.devicePixelRatio||1)*this.opts.previewScale,autoDensity:!0,autoStart:!1}),this.pixiApp=e,e.renderer.background.color=this.hexToNumber(this.opts.backgroundColor),e.render(),e.stage.eventMode="static",e.stage.hitArea=e.screen,this.artboard=new m.Container,this.artboard.label="ArtboardRoot",e.stage.addChild(this.artboard),this.selection.init(e,this.artboard),this.artboardBg=new m.Graphics,this.artboardBg.rect(0,0,this.opts.width,this.opts.height).fill({color:this.hexToNumber(this.opts.artboardColor)}),this.artboard.addChild(this.artboardBg),this.clipContainer=new m.Container,this.clipContainer.label="ClipContainer",this.artboard.addChild(this.clipContainer),this.artboardMask=new m.Graphics,this.artboardMask.rect(0,0,this.opts.width,this.opts.height).fill({color:16777215}),this.clipContainer.addChild(this.artboardMask),this.clipContainer.mask=this.artboardMask,this.clipsEffectContainer=new m.Container,this.clipsEffectContainer.label="ClipsEffect",this.clipsEffectContainer.visible=!1,this.clipsEffectContainer.zIndex=1,this.clipsEffectContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsEffectContainer),this.clipsNormalContainer=new m.Container,this.clipsNormalContainer.label="ClipsNormal",this.clipsNormalContainer.zIndex=10,this.clipsNormalContainer.sortableChildren=!0,this.clipContainer.addChild(this.clipsNormalContainer),this.recreateTransitionTextures(),this.transBgGraphics=new m.Graphics,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:0,alpha:0}),this.clipContainer.sortableChildren=!0,this.updateArtboardLayout(),e.renderer.on("resize",()=>{this.handleResize()})}getOptions(){return this.opts}setSize(t,e){this.updateDimensions(t,e)}setPreviewScale(t){this.opts.previewScale=Math.max(.1,Math.min(1,t)),this.pixiApp&&(this.pixiApp.renderer.resolution=(window.devicePixelRatio||1)*this.opts.previewScale,this.pixiApp.resize()),this.recreateTransitionTextures(),this.updateArtboardLayout(),this.updateFrame(this.currentTime)}recreateTransitionTextures(){this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transFromTexture=m.RenderTexture.create({width:this.opts.width,height:this.opts.height,resolution:this.opts.previewScale}),this.transToTexture=m.RenderTexture.create({width:this.opts.width,height:this.opts.height,resolution:this.opts.previewScale})}setBackgroundColor(t){this.opts.backgroundColor=t;const e=this.hexToNumber(t);this.pixiApp&&(this.pixiApp.renderer.background.color=e,this.pixiApp.render()),this.updateFrame(this.currentTime)}setArtboardColor(t){this.opts.artboardColor=t;const e=this.hexToNumber(t);this.artboardBg&&this.artboardBg.clear().rect(0,0,this.opts.width,this.opts.height).fill({color:e}),this.pixiApp&&this.pixiApp.render(),this.updateFrame(this.currentTime)}updateDimensions(t,e){this.opts.width=t,this.opts.height=e,this.artboardBg&&this.artboardBg.clear().rect(0,0,t,e).fill({color:this.hexToNumber(this.opts.artboardColor)}),this.artboardMask&&this.artboardMask.clear().rect(0,0,t,e).fill({color:16777215}),this.recreateTransitionTextures(),this.transBgGraphics&&this.transBgGraphics.clear().rect(0,0,t,e).fill({color:0,alpha:0}),this.updateArtboardLayout(),this.updateFrame(this.currentTime)}handleResize=()=>{this.destroyed||!this.pixiApp||this._isUpdatingLayout||this.updateArtboardLayout()};updateArtboardLayout(t={}){if(!(!this.pixiApp||!this.artboard||this._isUpdatingLayout)){this._isUpdatingLayout=!0;try{t.skipResize||this.pixiApp.resize();const i=this.pixiApp.canvas.parentElement,s=i?i.getBoundingClientRect().width:this.pixiApp.screen.width,r=i?i.getBoundingClientRect().height:this.pixiApp.screen.height,o=this.opts.width,a=this.opts.height,n=this.opts.spacing||0,c=Math.max(0,s-n*2),h=Math.max(0,r-n*2),d=c/o,u=h/a,f=Math.min(d,u);this._baseScale=f;const p=f*this._zoomLevel;this.artboard.scale.set(p),this.artboard.x=(s-o*p)/2+this._panOffset.x,this.artboard.y=(r-a*p)/2+this._panOffset.y,this.pixiApp.render(),this.emit("viewport:changed",{zoomLevel:this._zoomLevel,panOffset:{...this._panOffset}})}finally{this._isUpdatingLayout=!1}}}get zoomLevel(){return this._zoomLevel}get baseScale(){return this._baseScale}setZoom(t,e,i){if(!this.pixiApp||!this.artboard)return;const s=this._zoomLevel,r=Math.min(10,Math.max(.1,t));if(s!==r){if(e!==void 0&&i!==void 0){const a=this.pixiApp.canvas.parentElement,n=a?a.getBoundingClientRect().width:this.pixiApp.screen.width,c=a?a.getBoundingClientRect().height:this.pixiApp.screen.height,h=this._baseScale,d=h*s,u=h*r,f=this.opts.width,p=this.opts.height,g=(n-f*d)/2+this._panOffset.x,v=(c-p*d)/2+this._panOffset.y,x=e-g,w=i-v,T=u/d,y=e-x*T,C=i-w*T;this._panOffset.x=y-(n-f*u)/2,this._panOffset.y=C-(c-p*u)/2}this._zoomLevel=r,this.updateArtboardLayout({skipResize:!0})}}pan(t,e){this._panOffset.x+=t,this._panOffset.y+=e,this.updateArtboardLayout({skipResize:!0})}resetView(){this._zoomLevel=1,this._panOffset={x:0,y:0},this.updateArtboardLayout()}setAllowZoom(t){this._allowZoom=t}setAllowPan(t){this._allowPan=t}_initViewportEvents(){if(!this.pixiApp)return;const t=this.pixiApp.canvas;this._boundOnWheel=e=>{if(!this._allowZoom&&!this._allowPan)return;e.preventDefault();const i=Math.abs(e.deltaY)>0&&Math.abs(e.deltaY)<100&&Math.floor(e.deltaY)!==Math.ceil(e.deltaY);if(e.ctrlKey||e.metaKey){if(!this._allowZoom)return;const s=t.getBoundingClientRect(),r=e.clientX-s.left,o=e.clientY-s.top,n=Math.pow(i?.992:.996,e.deltaY),c=this._zoomLevel*n;this.setZoom(c,r,o)}else{if(!this._allowPan)return;let s=e.deltaX,r=e.deltaY;e.deltaMode===1?(s*=25,r*=25):e.deltaMode===2&&(s*=400,r*=400),this.pan(-s,-r)}},this._boundOnPointerDown=e=>{this._allowPan&&(e.button===1||e.button===0&&this._isSpaceDown)&&(this._isPanning=!0,this._lastPointerPos={x:e.clientX,y:e.clientY},t.setPointerCapture(e.pointerId),t.style.cursor="grabbing",e.preventDefault())},this._boundOnPointerMove=e=>{if(!this._isPanning)return;const i=e.clientX-this._lastPointerPos.x,s=e.clientY-this._lastPointerPos.y;this._lastPointerPos={x:e.clientX,y:e.clientY},this.pan(i,s)},this._boundOnPointerUp=e=>{this._isPanning&&(this._isPanning=!1,t.style.cursor=this._isSpaceDown?"grab":"")},this._boundOnKeyDown=e=>{if(this._allowPan&&e.code==="Space"&&!e.repeat){const i=document.activeElement?.tagName;if(i==="INPUT"||i==="TEXTAREA")return;this._isSpaceDown=!0,t.style.cursor="grab",e.preventDefault()}},this._boundOnKeyUp=e=>{e.code==="Space"&&(this._isSpaceDown=!1,this._isPanning||(t.style.cursor=""))},t.addEventListener("wheel",this._boundOnWheel,{passive:!1}),t.addEventListener("pointerdown",this._boundOnPointerDown),window.addEventListener("pointermove",this._boundOnPointerMove),window.addEventListener("pointerup",this._boundOnPointerUp),window.addEventListener("pointercancel",this._boundOnPointerUp),window.addEventListener("keydown",this._boundOnKeyDown),window.addEventListener("keyup",this._boundOnKeyUp)}_destroyViewportEvents(){const t=this.pixiApp?.canvas;t&&this._boundOnWheel&&t.removeEventListener("wheel",this._boundOnWheel),t&&this._boundOnPointerDown&&t.removeEventListener("pointerdown",this._boundOnPointerDown),this._boundOnPointerMove&&window.removeEventListener("pointermove",this._boundOnPointerMove),this._boundOnPointerUp&&(window.removeEventListener("pointerup",this._boundOnPointerUp),window.removeEventListener("pointercancel",this._boundOnPointerUp)),this._boundOnKeyDown&&window.removeEventListener("keydown",this._boundOnKeyDown),this._boundOnKeyUp&&window.removeEventListener("keyup",this._boundOnKeyUp)}getCanvas(){if(this.opts.canvas)return this.opts.canvas;if(this.pixiApp?.canvas)return this.pixiApp.canvas;throw new Error("Canvas not initialized yet. Wait for initPixiApp to complete.")}async addTransition(t,e=2e6,i,s,r){return this.timeline.addTransition(t,e,i,s,r)}findTrackIdByClipId(t){return this.timeline.findTrackIdByClipId(t)}async addClip(t,e){const i=Array.isArray(t)?t:[t];i.forEach(s=>this.clipCache.set(s.id,s)),this.beginHistoryGroup();try{const s=await this.timeline.addClip(t,e);return i.forEach(r=>this.attachClipEvents(r)),s}finally{this.endHistoryGroup()}}addTrack(t,e){return this.timeline.addTrack(t,e)}async setTracks(t){if(this.isRestoring)return;const e=new Set(this.timeline.clips.map(i=>i.id));if(!(t.length===0&&e.size>0)&&!(t.length>0&&e.size>0&&!t.some(s=>s.clipIds.some(r=>e.has(r)))))return this.timeline.setTracks(t)}async moveTrack(t,e){return this.timeline.moveTrack(t,e)}async setTrackOrder(t){return this.timeline.setTrackOrder(t)}async removeTrack(t){return this.timeline.removeTrack(t)}getClipById(t){return this.timeline.getClipById(t)}async updateClip(t,e){return this.timeline.updateClip(t,e)}async centerClip(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=(this.opts.width-e.width)/2,s=(this.opts.height-e.height)/2;if(this.getClipById(e.id))return this.updateClip(e.id,{left:i,top:s});e.left=i,e.top=s}async centerClipH(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=(this.opts.width-e.width)/2;if(this.getClipById(e.id))return this.updateClip(e.id,{left:i});e.left=i}async centerClipV(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=(this.opts.height-e.height)/2;if(this.getClipById(e.id))return this.updateClip(e.id,{top:i});e.top=i}async scaleToFit(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=await e.ready,{width:s,height:r}=i;if(s===0||r===0)return;const o=Math.min(this.opts.width/s,this.opts.height/r),a=s*o,n=r*o;if(this.getClipById(e.id))return this.updateClip(e.id,{width:a,height:n});e.width=a,e.height=n}async scaleToCover(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e)return;const i=await e.ready,{width:s,height:r}=i;if(s===0||r===0)return;const o=Math.max(this.opts.width/s,this.opts.height/r),a=s*o,n=r*o;if(this.getClipById(e.id))return this.updateClip(e.id,{width:a,height:n});e.width=a,e.height=n}async updateClips(t){this.suspendRendering(),await this.timeline.updateClips(t),this.resumeRendering(),this.updateFrame(this.currentTime)}suspendRendering(){this.renderingSuspended=!0}resumeRendering(){this.renderingSuspended=!1}getTracks(){return this.timeline.tracks}getClip(t){return this.timeline.getClipById(t)}findClip(t){return this.timeline.getClipById(t)}setupSpriteInteractivity(t){this.selection.setupSpriteInteractivity(t)}async removeClip(t){const e=typeof t=="string"?this.getClipById(t):t;if(!e){console.warn("[Studio] removeClip: Clip not found",t);return}this.beginHistoryGroup();try{return this.clipCache.set(e.id,e),this.timeline.removeClip(e,{permanent:!this.processingHistory})}finally{this.endHistoryGroup()}}async removeClips(t){this.beginHistoryGroup();try{return t.forEach(e=>this.clipCache.set(e.id,e)),this.timeline.removeClips(t,{permanent:!this.processingHistory})}finally{this.endHistoryGroup()}}async removeClipById(t){const e=this.timeline.getClipById(t);if(e)return this.removeClip(e)}async removeClipsById(t){const e=t.map(i=>this.timeline.getClipById(i)).filter(Boolean);return this.removeClips(e)}async deleteSelected(){const t=this.selection.selectedClips;if(t.size!==0){this.beginHistoryGroup();try{await this.removeClips(Array.from(t))}finally{this.endHistoryGroup()}}}async duplicateSelected(){this.beginHistoryGroup();try{return await this.timeline.duplicateSelected()}finally{this.endHistoryGroup()}}async splitSelected(t){this.beginHistoryGroup();try{return await this.timeline.splitSelected(t)}finally{this.endHistoryGroup()}}async trimSelected(t){return this.timeline.trimSelected(t)}async updateSelected(t){return this.timeline.updateSelected(t)}async clear(){await this.timeline.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null),this.transitionRenderers.forEach(t=>t.destroy()),this.transitionRenderers.clear(),this.transitionSprites.forEach(t=>t.destroy()),this.transitionSprites.clear(),this.emit("reset")}async play(){return this.transport.play()}pause(){this.transport.pause()}async stop(){return this.transport.stop()}async seek(t){return this.transport.seek(t)}async frameNext(){return this.transport.frameNext()}async framePrev(){return this.transport.framePrev()}async renderFrame(t,e){if(await this.ready,!this.pixiApp||!this.artboard)throw new Error("Studio is not initialized yet. Wait for studio.ready before calling renderFrame().");const i=t*1e3;await this.updateFrame(i);const s=this.artboard.scale.clone(),r=this.artboard.x,o=this.artboard.y;this.artboard.scale.set(1),this.artboard.x=0,this.artboard.y=0;const a=e?.transparent??!1;a&&this.artboardBg&&(this.artboardBg.visible=!1);const n=m.RenderTexture.create({width:this.opts.width,height:this.opts.height}),c=this.pixiApp.renderer.background.alpha;a&&(this.pixiApp.renderer.background.alpha=0);let h;try{this.pixiApp.renderer.render({container:this.artboard,target:n,clear:!0}),h=await this.pixiApp.renderer.extract.base64(n,"image/png",1)}finally{n.destroy(),a&&(this.pixiApp.renderer.background.alpha=c),a&&this.artboardBg&&(this.artboardBg.visible=!0),this.artboard.scale.set(s.x,s.y),this.artboard.x=r,this.artboard.y=o,this.pixiApp.render()}return h}async snapshot(t,e){const i=typeof t=="number"?e:t,s=typeof t=="number"?t:void 0;return this.renderFrame(s??this.currentTime/1e3,i)}getCurrentTime(){return this.transport.currentTime}getMaxDuration(){return this.transport.maxDuration}getIsPlaying(){return this.transport.isPlaying}getSelectedClips(){return Array.from(this.selectedClips)}getVideoTexture(t){let e=this.videoTextureCache.get(t);return e||(e=m.Texture.from(t),this.videoTextureCache.set(t,e)),e}isPlaybackCapable(t){return"createPlaybackElement"in t&&"play"in t&&"pause"in t&&"seek"in t&&"syncPlayback"in t&&"cleanupPlayback"in t}async updateFrame(t){if(this.destroyed||this.pixiApp==null||this.renderingSuspended)return;const e=++this.frameToken;this.updateActiveGlobalEffect(t);const i=new Set,s=new Set,r=new Set,o=this.tracks.length;for(const n of this.clips){const c=this.getTrackIndex(n.id);if(c!==-1){const h=(o-c)*10;n.zIndex=h;const d=this.spriteRenderers.get(n);if(d){const f=d.getRoot();f&&(f.zIndex=h)}const u=this.videoSprites.get(n);u&&(u.zIndex=h)}}const a=[...this.clips].sort((n,c)=>n.zIndex-c.zIndex);for(const n of a){const c=n.type==="Video"||n.type==="Image";let h=n.transition?.start??0,d=n.transition?.end??0;if(n.transition&&(n.transition.fromClipId||n.transition.toClipId)){const T=n.transition.fromClipId?this.getClipById(n.transition.fromClipId):null,y=n.transition.toClipId?this.getClipById(n.transition.toClipId):null;if(y){const C=n.transition.duration??2e6;h=Math.max(0,y.display.from-C/2),d=h+C}else if(T){const C=n.transition.duration??2e6;h=Math.max(0,T.display.to-C/2),d=h+C}}const u=c&&n.transition&&t>=h&&t<d;if(!u&&t<n.display.from){const T=this.spriteRenderers.get(n);T!=null&&await T.updateFrame(null);const y=this.videoSprites.get(n);y!=null&&(y.visible=!1);const C=this.playbackElements.get(n);C!=null&&this.isPlaybackCapable(n)&&n.pause(C.element);continue}if(!u&&n.display.to>0&&t>n.display.to){const T=this.spriteRenderers.get(n);T!=null&&await T.updateFrame(null);const y=this.videoSprites.get(n);y!=null&&(y.visible=!1);const C=this.playbackElements.get(n);C!=null&&this.isPlaybackCapable(n)&&n.pause(C.element);continue}const f=t-n.display.from,p=f*n.playbackRate;n.animate(p);const g=await n.ready,v=n.duration||g.duration;if(!u&&v>0&&f>v){const T=this.spriteRenderers.get(n);T!=null&&await T.updateFrame(null);const y=this.videoSprites.get(n);y!=null&&(y.visible=!1);const C=this.playbackElements.get(n);C!=null&&this.isPlaybackCapable(n)&&n.pause(C.element);continue}const x=this.playbackElements.get(n);if(x!=null&&this.isPlaybackCapable(n)){const T=f/1e6;if(n.trackMuted=this.tracks.find(y=>y.clipIds.includes(n.id))?.muted??!1,n.syncPlayback(x.element,this.isPlaying,T),n.type==="Video"&&this.isPlaybackCapable(n)){const y=this.videoSprites.get(n);if(y!=null){const C=(n.duration||n.meta.duration)/1e6;if(this.spriteRenderers.has(n))y.visible=!1;else if(y.visible=!u&&!r.has(n.id)&&T>=0&&T<C,y.visible&&Yo(n,y),!u)continue}}else continue}if(u){const T=n?.transition?.fromClipId,y=n?.transition?.toClipId,C=`${T}_${y}`;if(s.has(C)){const S=this.spriteRenderers.get(n);S?.getRoot()&&(S.getRoot().visible=!1);const A=this.videoSprites.get(n);A&&(A.visible=!1);continue}s.add(C),(!this.transFromTexture||!this.transToTexture)&&this.recreateTransitionTextures(),this.transBgGraphics||(this.transBgGraphics=new m.Graphics,this.transBgGraphics.rect(0,0,this.opts.width,this.opts.height).fill({color:0,alpha:0}));const k=T?this.getClipById(T):null,O=y?this.getClipById(y):null;let F=null,b=null;if(k){const S=Math.max(0,t-k.display.from),{video:A}=await k.getFrame(S);A instanceof HTMLVideoElement?F=this.getVideoTexture(A):F=A,F&&(this.lastFromFrame=F)}if(O){const S=Math.max(0,t-O.display.from),{video:A}=await O.getFrame(S);A instanceof HTMLVideoElement?b=this.getVideoTexture(A):b=A,b&&(this.lastToFrame=b)}if(F||(F=this.lastFromFrame),b||(b=this.lastToFrame),!F||!b)continue;if(F&&b&&this.pixiApp&&this.transFromTexture&&this.transToTexture){const S=(t-h)/n?.transition?.duration;k&&F&&this.renderClipToTransitionTexture(k,F,this.transFromTexture),O&&b&&this.renderClipToTransitionTexture(O,b,this.transToTexture);let A=this.transitionRenderers.get(C);if(!A)try{A=me({name:n?.transition?.name,renderer:this.pixiApp.renderer}),this.transitionRenderers.set(C,A)}catch(E){console.error("[Studio] Failed to create transition renderer:",E)}if(A){const E=this.clips.find(I=>I instanceof tt&&I.fromClipId===T&&I.toClipId===y),P=A.render({width:this.opts.width,height:this.opts.height,from:this.transFromTexture,to:this.transToTexture,progress:S,values:E?.values});let R=this.transitionSprites.get(n.id);R||(R=new m.Sprite,R.label=`TransitionSprite_${n.id}`,this.transitionSprites.set(n.id,R),this.clipsNormalContainer&&this.clipsNormalContainer.addChild(R)),R.texture=P,R.visible=!0,R.x=0,R.y=0,R.width=this.opts.width,R.height=this.opts.height,R.anchor.set(0,0),R.zIndex=n.zIndex,i.add(n.id);const B=this.spriteRenderers.get(n);B?.getRoot()&&(B.getRoot().visible=!1);const U=this.videoSprites.get(n);if(U&&(U.visible=!1),k){const I=this.spriteRenderers.get(k);I?.getRoot()&&(I.getRoot().visible=!1);const D=this.videoSprites.get(k);D&&(D.visible=!1),r.add(k.id)}if(O){const I=this.spriteRenderers.get(O);I?.getRoot()&&(I.getRoot().visible=!1);const D=this.videoSprites.get(O);D&&(D.visible=!1),r.add(O.id)}continue}}}const w=this.spriteRenderers.get(n);if(w!=null){if(r.has(n.id)){const C=w.getRoot();C&&(C.visible=!1);const k=this.videoSprites.get(n);k&&(k.visible=!1);continue}const T=this.selectedClips.has(n);if(n.type!=="Text"&&n.type!=="Caption"&&typeof n.getTexture=="function"&&n.getTexture()!=null){const C=n.getTexture();if(C!=null){await w.updateFrame(C),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n);continue}}if(n.type==="Text"){const C=n;this.pixiApp?.renderer&&typeof C.setRenderer=="function"&&C.setRenderer(this.pixiApp.renderer);const k=await C.getTexture();if(k!=null){await w.updateFrame(k),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n);continue}}if(n.type==="Caption"){n.updateState(f);const C=n;this.pixiApp?.renderer&&typeof C.setRenderer=="function"&&C.setRenderer(this.pixiApp.renderer);const k=await C.getTexture();if(k!=null){await w.updateFrame(k),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n);continue}}if(n.type==="Shape"){const C=n;this.pixiApp?.renderer&&typeof C.setRenderer=="function"&&C.setRenderer(this.pixiApp.renderer)}const{video:y}=await n.getFrame(f);if(e!==this.frameToken)return;await w.updateFrame(y),T||w.updateTransforms(),this.opts.interactivity&&this.selection.setupSpriteInteractivity(n)}}if(this.activeGlobalEffects.length>0&&this.clipsNormalContainer&&this.clipsEffectContainer){for(const n of this.clips)this.moveClipToEffectContainer(n,!1);this.clipsNormalContainer.visible=!0,await this.applyGlobalEffects(t)}else if(this.clipsNormalContainer){for(const n of this.clips)this.moveClipToEffectContainer(n,!1);this.clipsNormalContainer.visible=!0,this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null)}for(const[n,c]of this.transitionSprites.entries())i.has(n)||(c.visible=!1);this.pixiApp!=null&&this.pixiApp.render()}moveClipToEffectContainer(t,e=!0){if(!this.clipsNormalContainer||!this.clipsEffectContainer)return;const i=e?this.clipsEffectContainer:this.clipsNormalContainer,s=this.spriteRenderers.get(t);if(s){const a=s.getRoot();if(a&&a.parent!==i){try{a.parent&&a.parent.removeChild&&a.parent.removeChild(a)}catch(n){console.warn("moveClipToEffectContainer: could not remove root from parent",n)}i.addChild(a)}}const r=this.transitionSprites.get(t.id);if(r&&r.parent!==i){try{r.parent&&r.parent.removeChild&&r.parent.removeChild(r)}catch(a){console.warn("moveClipToEffectContainer: could not remove transSprite from parent",a)}i.addChild(r)}const o=this.videoSprites.get(t);if(o&&o.parent!==i){try{o.parent&&o.parent.removeChild&&o.parent.removeChild(o)}catch(a){console.warn("moveClipToEffectContainer: could not remove videoSprite from parent",a)}i.addChild(o)}}applyGlobalEffect(t,e,i){const s=e.id||`${t}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,r={id:s,key:t,startTime:e.startTime,duration:e.duration??1e6};for(const o of i)o instanceof Nt&&o.addEffect(r),o instanceof ct&&o.addEffect(r),o instanceof ht&&o.addEffect(r),o instanceof yt&&o.addEffect(r);return this.globalEffects.set(s,r),s}getTrackIndex(t){return this.tracks.findIndex(e=>e.clipIds.includes(t))}async getTransitionFromFrame(t,e){let i=null;if(t.transition?.prevClipId&&(i=this.clips.find(a=>a.id===t.transition.prevClipId)||null),i||(i=this.getPreviousClipOnTrack(t)),!i)return null;const s=i.duration>0?i.duration:0,r=Math.max(0,Math.min(e-i.display.from,s)),{video:o}=await i.getFrame(r);return o}getPreviousClipOnTrack(t){const e=this.getTrackIndex(t.id);return e===-1?null:this.clips.filter(i=>i.id!==t.id&&this.getTrackIndex(i.id)===e&&i.display.from<t.display.from&&(i instanceof ct||i instanceof Nt)).sort((i,s)=>s.display.to-i.display.to)[0]||null}renderClipToTransitionTexture(t,e,i){if(!this.pixiApp)return;const s=t.style||{},{renderTransform:r}=t,o=(r?.mirror??0)>.5,a=e instanceof m.Texture?e:m.Texture.from(e),n=r?.x??0,c=r?.y??0,h=r?.angle??0,d=r?.scale??1,u=r?.opacity??1,f=r?.blur??0,p=r?.brightness??1,g=a.width||1,v=a.height||1,x=t.type==="Caption",w=!x&&t.width&&t.width!==0?Math.abs(t.width)/g:1,T=!x&&t.height&&t.height!==0?Math.abs(t.height)/v:1,y=new m.Container;y.x=t.center.x+n,y.y=t.center.y+c,y.rotation=(t.flip?.x||t.flip?.y?-1:1)*((t.angle+h)*Math.PI)/180,y.alpha=t.opacity*u;const C=new m.Sprite(a);C.anchor.set(.5,.5);let k=[];if(o){const D=w*d,L=T*d,G=g*D,J=v*L;C.position.set(0,0),C.scale.set(D,L);const N=[[G,0,-D,L],[-G,0,-D,L],[0,J,D,-L],[0,-J,D,-L],[G,J,-D,-L],[-G,J,-D,-L],[G,-J,-D,-L],[-G,-J,-D,-L]];for(const[W,Z,ft,X]of N){const z=new m.Sprite(a);z.anchor.set(.5,.5),z.position.set(W,Z),z.scale.set(ft,X),k.push(z)}if(t.flip?.x){C.scale.x=-D;for(let W=0;W<8;W++)k[W].scale.x=-N[W][2]}if(t.flip?.y){C.scale.y=-L;for(let W=0;W<8;W++)k[W].scale.y=-N[W][3]}y.addChild(C);for(const W of k)y.addChild(W)}else C.scale.x=t.flip?.x?-w*d:w*d,C.scale.y=t.flip?.y?-T*d:T*d,y.addChild(C);const O=[];if(f>0){const D=new m.BlurFilter;D.strength=f,D.quality=4,D.repeatEdgePixels=!0,O.push(D)}const F=fe(t.colorAdjustment);if(p!==1||F){const D=new m.ColorMatrixFilter;ue(D,t.colorAdjustment,p),O.push(D)}const b=Xt(t.colorAdjustment);for(let D=0;D<b.length;D++){const L=b[D],G=new m.UniformGroup({uTargetColor:{value:[1,1,0],type:"vec3<f32>"},uHueShift:{value:L.hue,type:"f32"},uSatShift:{value:L.saturation/100,type:"f32"},uLightShift:{value:L.lightness/100,type:"f32"},uTolerance:{value:.22,type:"f32"},uSoftness:{value:.12,type:"f32"}}),J=Bt(L.targetColor);J&&(G.uniforms.uTargetColor[0]=J.r/255,G.uniforms.uTargetColor[1]=J.g/255,G.uniforms.uTargetColor[2]=J.b/255);const N=new m.Filter({glProgram:new m.GlProgram({vertex:Et,fragment:de,name:`SelectiveHslShader_${D}`}),resources:{hslUniforms:G}});O.push(N)}y.filters=O;const S=Math.abs(t.width??0)*d,A=Math.abs(t.height??0)*d,E=s.borderRadius||0;let P=null;E>0&&(P=new m.Graphics,P.roundRect(-S/2,-A/2,S,A,Math.min(E,S/2,A/2)),P.fill({color:16777215,alpha:1}),y.addChild(P),C.mask=null,C.mask=P);const R=s.stroke;let B=null;if(R&&R.width>0){B=new m.Graphics;const D=$(R.color)??16777215;let L=1;if(R.alignment!==void 0&&(typeof R.alignment=="number"?L=R.alignment:R.alignment==="center"||R.alignment==="middle"?L=.5:R.alignment==="inside"?L=0:R.alignment==="outside"&&(L=1)),B.setStrokeStyle({width:R.width,color:D,alignment:L}),E>0){const G=Math.min(E,S/2,A/2);B.roundRect(-S/2,-A/2,S,A,G)}else B.rect(-S/2,-A/2,S,A);B.stroke(),y.addChild(B)}const U=s.shadow;let I=null;if(U&&(U.blur>0||(U.offsetX??0)!==0||(U.offsetY??0)!==0)){I=new m.Graphics;const D=$(U.color)??0,L=U.alpha??.5,G=U.offsetX??0,J=U.offsetY??0;if(E>0){const N=Math.min(E,S/2,A/2);I.roundRect(-S/2+G,-A/2+J,S,A,N)}else I.rect(-S/2+G,-A/2+J,S,A);I.fill({color:D,alpha:L}),y.addChildAt(I,0)}this.pixiApp.renderer.render({container:y,target:i,clear:!0}),e instanceof m.Texture||C.texture.destroy(!0),P&&P.destroy(),B&&B.destroy(),I&&I.destroy();for(const D of k)D.destroy();C.destroy(),y.destroy()}removeGlobalEffect(t){this.globalEffects.delete(t)}clearGlobalEffects(){this.globalEffects.clear()}updateActiveGlobalEffect(t){const e=[];for(const i of this.clips)if(i instanceof dt){const s=i.duration>0?i.duration:i.display.to-i.display.from;t>=i.display.from&&(i.display.to===0||t<i.display.to)&&t<i.display.from+s&&e.push({id:i.id,key:i.effectKey,startTime:i.display.from,duration:s,trackIndex:this.getTrackIndex(i.id),values:i.values})}for(const i of this.globalEffects.values()){const s=i.startTime+i.duration;t>=i.startTime&&t<s&&e.push({id:i.id,key:i.key,startTime:i.startTime,duration:i.duration,trackIndex:-1})}this.activeGlobalEffects=e.sort((i,s)=>(s.trackIndex??-1)-(i.trackIndex??-1))}async applyGlobalEffects(t){if(this.currentGlobalEffectSprite&&(this.currentGlobalEffectSprite.parent&&this.currentGlobalEffectSprite.parent.removeChild(this.currentGlobalEffectSprite),this.currentGlobalEffectSprite.destroy(),this.currentGlobalEffectSprite=null),this.activeGlobalEffects.length===0||!this.pixiApp||!this.clipContainer||!this.clipsNormalContainer||!this.clipsEffectContainer)return;const e=this.opts.width,i=this.opts.height;let s=null,r=new Set;const o=[];for(const n of this.activeGlobalEffects){const{key:c,startTime:h,duration:d,trackIndex:u,values:f}=n,p=t-h,g=Math.min(Math.max(p/d,0),1);if(g<0||g>=1)continue;if(this.clipsEffectContainer.visible=!0,this.clipsEffectContainer.removeChildren(),s){const y=new m.Sprite(s);y.label="PrevEffectResult",y.width=e,y.height=i,this.clipsEffectContainer.addChild(y)}const v=u??-1;for(const y of this.clips){if(r.has(y.id))continue;const C=this.getTrackIndex(y.id);!(y instanceof dt)&&(v===-1||C>v)&&(this.moveClipToEffectContainer(y,!0),r.add(y.id))}let x=this.effectFilters.get(c);if(!x)try{if(x=await ye({name:c,renderer:this.pixiApp.renderer,values:f}),x)this.effectFilters.set(c,x);else continue}catch(y){console.error(y);continue}const w=m.RenderTexture.create({width:e,height:i,resolution:this.opts.previewScale});o.push(w),this.pixiApp.renderer.render({container:this.clipsEffectContainer,target:w,clear:!0});const T=x.render({canvasTexture:w,progress:g,width:e,height:i,values:f});this.clipsEffectContainer.visible=!1,s=T}const a=s;if(a&&!o.includes(a)&&!a.destroyed&&a._source){const n=new m.Sprite(a);n.x=0,n.y=0,n.width=e,n.height=i,n.scale.set(1),n.zIndex=5,this.clipContainer.addChild(n),this.currentGlobalEffectSprite=n}for(const n of o)n!==a&&!n.destroyed&&n.destroy(!0)}destroy(){if(!this.destroyed){this._destroyViewportEvents(),window.removeEventListener("resize",this.handleResize),this.bridge&&(this.bridge.dispose(),this.bridge=null),this.destroyed=!0,this.stop(),this.clear(),this.transitionRenderers.clear(),this.transFromTexture&&(this.transFromTexture.destroy(!0),this.transFromTexture=null),this.transToTexture&&(this.transToTexture.destroy(!0),this.transToTexture=null),this.transBgGraphics&&(this.transBgGraphics.destroy(!0),this.transBgGraphics=null);for(const t of this.transitionSprites.values())t.destroy();this.transitionSprites.clear(),this.pixiApp&&(this.pixiApp.destroy(!0,{children:!0,texture:!0}),this.pixiApp=null)}}selectClip(t,e=!1){this.selection.selectClip(t,e)}setSelection(t){this.selection.setSelection(t)}selectClipsByIds(t){this.selection.selectClipsByIds(t)}deselectClip(){this.selection.deselectClip()}async lockClip(t,e){const i=this.timeline.getClipById(t);i&&(await this.timeline.updateClip(t,{locked:e}),this.emit("clip:lock-changed",{clip:i,locked:e}),this.selection.selectedClips.has(i)&&this.selection.recreateTransformer(),await this.updateFrame(this.currentTime))}exportToJSON(){return this.timeline.exportToJSON()}async loadFromJSON(t){return this.timeline.loadFromJSON(t)}}M.ANIMATABLE_PROPERTIES=ss,M.AngleWipeAnimation=We,M.AssetManager=jt,M.Audio=mt,M.Backdrop=Ht,M.BlockRevealAnimation=Le,M.Caption=yt,M.CenterExpandAnimation=Ue,M.CircleRevealAnimation=He,M.ClipRegistry=rt,M.Compositor=la,M.DEFAULT_AUDIO_CONF=H,M.EdgeCropAnimation=Ye,M.Effect=dt,M.FontManager=vt,M.GL_EFFECT_OPTIONS=_n,M.GL_TRANSITION_OPTIONS=jn,M.GsapAnimation=Be,M.Image=Nt,M.KeyframeAnimation=Ee,M.Log=Y,M.MP4Clip=ct,M.MediaCache=je,M.PixiEngine=vi,M.Placeholder=zt,M.RectExpandAnimation=Ge,M.ResourceManager=wt,M.ResourceStatus=Ke,M.ShapeClip=Lt,M.StarRevealAnimation=Ve,M.Studio=vi,M.Text=ht,M.Transition=tt,M.VALUES_FILTER_SPECIAL=ve,M.VALUES_FILTER_SPECIAL_LIMITS=ta,M.Video=ct,M.WipeAnimation=Ne,M.animationRegistry=Qt,M.clipToJSON=Gt,M.createChromakey=Zi,M.createSlowMo=Oe,M.easings=Yt,M.fastConcatMP4=oi,M.fixFMP4Duration=Us,M.fontManager=Zt,M.getAllEffects=ge,M.getAllTransitions=Dt,M.getAnimatedKeys=Pe,M.getEasing=Ft,M.getEffectOptions=ui,M.getPixiProperty=Ie,M.getTransitionOptions=fi,M.hasPixiProp=De,M.jsonToClip=bt,M.makeEffect=ye,M.makeTransition=me,M.mediaCache=Jt,M.mixinMP4AndAudio=Qs,M.pixiProps=re,M.prepareVars=gt,M.registerCustomEffect=Kn,M.registerCustomTransition=Yn,M.renderTxt2ImgBitmap=es,M.resolveValue=pt,M.resolveVars=Rt,M.unregisterCustomEffect=Xn,M.unregisterCustomTransition=Qn,Object.defineProperty(M,Symbol.toStringTag,{value:"Module"})}));
3335
3335
  //# sourceMappingURL=index.umd.cjs.map